From 7bbed2da5aa6aa0ace1d0327d19bc205753254bd Mon Sep 17 00:00:00 2001 From: Florin Tobler Date: Fri, 3 Dec 2021 20:18:07 +0100 Subject: [PATCH] space exploration extension --- space-exploration-extension/data.lua | 40 +- .../.documentation/global.txt | 364 ++ .../.documentation/tiles.txt | 44 + .../space-exploration/README.md | 6 + .../space-exploration/changelog.txt | 3759 +++++++++++ .../control/collision-mask-util-control.lua | 67 + .../data/collision-mask-util-extended.lua | 184 + .../space-exploration/control.lua | 2070 ++++++ .../space-exploration/data-final-fixes.lua | 174 + .../space-exploration/data-updates.lua | 22 + .../space-exploration/data.lua | 352 ++ .../space-exploration/data_util.lua | 1077 ++++ .../space-exploration/info.json | 100 + .../space-exploration/licence.txt | 21 + .../space-exploration/locale/cs/strings.cfg | 1905 ++++++ .../space-exploration/locale/de/strings.cfg | 964 +++ .../space-exploration/locale/en/strings.cfg | 2243 +++++++ .../locale/es-ES/strings.cfg | 964 +++ .../space-exploration/locale/fr/strings.cfg | 2112 +++++++ .../space-exploration/locale/hw/strings.cfg | 823 +++ .../space-exploration/locale/it/strings.cfg | 967 +++ .../space-exploration/locale/ja/strings.cfg | 967 +++ .../space-exploration/locale/ko/strings.cfg | 2111 +++++++ .../space-exploration/locale/pl/strings.cfg | 2073 ++++++ .../space-exploration/locale/ru/strings.cfg | 2234 +++++++ .../locale/zh-CN/strings.cfg | 2234 +++++++ .../space-exploration/lua-style.cfg | 3 + .../migrations/space-exploration.0.1.146.json | 10 + .../migrations/space-exploration.0.1.64.json | 6 + .../migrations/space-exploration.0.1.8.json | 8 + .../migrations/space-exploration.0.2.5.json | 14 + .../migrations/space-exploration.0.2.7.lua | 8 + .../migrations/space-exploration.0.3.126.lua | 16 + .../migrations/space-exploration.0.3.13.json | 6 + .../migrations/space-exploration.0.3.130.json | 20 + .../migrations/space-exploration.0.3.21.json | 53 + .../migrations/space-exploration.0.3.32.json | 22 + .../migrations/space-exploration.0.5.1.json | 12 + .../migrations/space-exploration0.0.3.45.json | 10 + .../prototypes/phase-1/categories.lua | 100 + .../phase-1/combined/antimatter-reactor.lua | 1052 ++++ .../phase-1/combined/arcosphere.lua | 358 ++ .../phase-1/combined/big-heat-exchanger.lua | 974 +++ .../phase-1/combined/big-turbine.lua | 564 ++ .../phase-1/combined/delivery-cannon.lua | 956 +++ .../phase-1/combined/electric-boiler.lua | 396 ++ .../phase-1/combined/energy-transmitter.lua | 2323 +++++++ .../phase-1/combined/interburbulator.lua | 466 ++ .../phase-1/combined/iridium-piledriver.lua | 219 + .../phase-1/combined/lifesupport.lua | 169 + .../phase-1/combined/linked-container.lua | 103 + .../prototypes/phase-1/combined/nexus.lua | 325 + .../prototypes/phase-1/combined/pipe.lua | 1043 +++ .../prototypes/phase-1/combined/probe.lua | 990 +++ .../prototypes/phase-1/combined/rail.lua | 73 + .../phase-1/combined/spaceship-clamps.lua | 283 + .../phase-1/combined/transport-belt.lua | 516 ++ .../phase-1/combined/weapon-bio.lua | 1531 +++++ .../phase-1/compatibility/qol_research.lua | 4 + .../prototypes/phase-1/damage-types.lua | 23 + .../prototypes/phase-1/decorative/crater.lua | 72 + .../phase-1/decorative/rocks-base.lua | 3477 ++++++++++ .../prototypes/phase-1/decorative/rocks.lua | 80 + .../prototypes/phase-1/entity/ancient.lua | 339 + .../entity/astrometric-gravimetric.lua | 356 ++ .../phase-1/entity/cargo-rocket.lua | 423 ++ .../phase-1/entity/condenser-turbine.lua | 403 ++ .../prototypes/phase-1/entity/core-miner.lua | 195 + .../entity/decontamination-lifesupport.lua | 399 ++ .../phase-1/entity/dimensional-anchor.lua | 197 + .../prototypes/phase-1/entity/entity.lua | 429 ++ .../prototypes/phase-1/entity/explosion.lua | 216 + .../phase-1/entity/fluid-burner-generator.lua | 149 + .../phase-1/entity/fuel-refinery.lua | 145 + .../prototypes/phase-1/entity/gate.lua | 1690 +++++ .../phase-1/entity/genetics-laboratory.lua | 164 + .../phase-1/entity/growth-facility.lua | 245 + .../phase-1/entity/laser-radi-thermo.lua | 481 ++ .../prototypes/phase-1/entity/light.lua | 44 + .../phase-1/entity/meteor-defence.lua | 453 ++ .../prototypes/phase-1/entity/meteor.lua | 358 ++ .../phase-1/entity/particle-acc-col-fab.lua | 483 ++ .../prototypes/phase-1/entity/pylons.lua | 865 +++ .../phase-1/entity/recycle-mechanical.lua | 483 ++ .../phase-1/entity/resource-autoplace.lua | 372 ++ .../prototypes/phase-1/entity/resources.lua | 533 ++ .../phase-1/entity/rocket-fragments.lua | 399 ++ .../phase-1/entity/rocket-landing-pad.lua | 64 + .../phase-1/entity/rocket-launch-pad.lua | 992 +++ .../prototypes/phase-1/entity/scaffold.lua | 328 + .../phase-1/entity/space-biochemical.lua | 242 + .../phase-1/entity/space-capsule.lua | 98 + .../phase-1/entity/space-electromagnetics.lua | 276 + .../phase-1/entity/space-hypercooler.lua | 148 + .../phase-1/entity/space-manufactory.lua | 326 + .../phase-1/entity/space-plasma-generator.lua | 224 + .../phase-1/entity/space-radiator.lua | 141 + .../phase-1/entity/space-science-lab.lua | 227 + .../phase-1/entity/space-supercomputer.lua | 672 ++ .../phase-1/entity/spaceship-obstacles.lua | 353 ++ .../prototypes/phase-1/entity/spaceship.lua | 1106 ++++ .../prototypes/phase-1/entity/starmap.lua | 235 + .../phase-1/entity/supercharger.lua | 170 + .../prototypes/phase-1/entity/telescopes.lua | 714 +++ .../prototypes/phase-1/entity/wide-beacon.lua | 253 + .../prototypes/phase-1/fluid/fluid.lua | 354 ++ .../prototypes/phase-1/input.lua | 195 + .../prototypes/phase-1/item-groups.lua | 427 ++ .../prototypes/phase-1/item/armor.lua | 190 + .../prototypes/phase-1/item/cargo-rocket.lua | 50 + .../phase-1/item/condenser-turbine.lua | 15 + .../prototypes/phase-1/item/core-miner.lua | 14 + .../prototypes/phase-1/item/equipment.lua | 388 ++ .../prototypes/phase-1/item/gate.lua | 17 + .../prototypes/phase-1/item/items.lua | 1270 ++++ .../prototypes/phase-1/item/medpack.lua | 198 + .../phase-1/item/meteor-defence.lua | 101 + .../prototypes/phase-1/item/platforms.lua | 54 + .../prototypes/phase-1/item/resources.lua | 582 ++ .../phase-1/item/rocket-landing-pad.lua | 13 + .../phase-1/item/rocket-launch-pad.lua | 33 + .../prototypes/phase-1/item/science-pack.lua | 689 ++ .../prototypes/phase-1/item/spaceship.lua | 111 + .../prototypes/phase-1/item/structures.lua | 482 ++ .../prototypes/phase-1/item/utility.lua | 29 + .../phase-1/item/weapon-cryogun.lua | 489 ++ .../prototypes/phase-1/item/weapon-plague.lua | 323 + .../phase-1/item/weapon-railgun.lua | 104 + .../prototypes/phase-1/item/weapon-tesla.lua | 315 + .../recipe/astrometrics-laboratory.lua | 98 + .../phase-1/recipe/biochemical-laboratory.lua | 296 + .../phase-1/recipe/cargo-rocket.lua | 127 + .../phase-1/recipe/condenser-turbine.lua | 66 + .../prototypes/phase-1/recipe/core-miner.lua | 24 + .../recipe/decontamination-facility.lua | 178 + .../recipe/electromagnetics-laboratory.lua | 259 + .../prototypes/phase-1/recipe/gate.lua | 44 + .../phase-1/recipe/genetics-laboratory.lua | 111 + .../recipe/gravimetrics-laboratory.lua | 308 + .../phase-1/recipe/growth-facility.lua | 147 + .../prototypes/phase-1/recipe/hypercooler.lua | 116 + .../phase-1/recipe/laser-laboratory.lua | 174 + .../phase-1/recipe/lifesupport-facility.lua | 101 + .../phase-1/recipe/manufacturing.lua | 421 ++ .../phase-1/recipe/material-fabricator.lua | 357 ++ .../phase-1/recipe/mechanical-laboratory.lua | 251 + .../prototypes/phase-1/recipe/medpack.lua | 85 + .../prototypes/phase-1/recipe/observation.lua | 142 + .../phase-1/recipe/particle-accelerator.lua | 72 + .../phase-1/recipe/particle-collider.lua | 245 + .../phase-1/recipe/plasma-generator.lua | 50 + .../prototypes/phase-1/recipe/platforms.lua | 51 + .../phase-1/recipe/radiation-laboratory.lua | 79 + .../prototypes/phase-1/recipe/radiator.lua | 55 + .../prototypes/phase-1/recipe/recipe.lua | 728 +++ .../phase-1/recipe/recycling-facility.lua | 185 + .../prototypes/phase-1/recipe/resources.lua | 934 +++ .../phase-1/recipe/rocket-landing-pad.lua | 32 + .../phase-1/recipe/rocket-launch-pad.lua | 63 + .../prototypes/phase-1/recipe/science-lab.lua | 32 + .../prototypes/phase-1/recipe/science.lua | 601 ++ .../prototypes/phase-1/recipe/spaceship.lua | 188 + .../phase-1/recipe/spectrometry-facility.lua | 36 + .../prototypes/phase-1/recipe/structures.lua | 1002 +++ .../phase-1/recipe/supercomputing.lua | 1325 ++++ .../recipe/thermodynamics-laboratory.lua | 206 + .../prototypes/phase-1/shortcut.lua | 109 + .../prototypes/phase-1/signal.lua | 237 + .../prototypes/phase-1/sound.lua | 113 + .../prototypes/phase-1/styles.lua | 592 ++ .../phase-1/technology/bio-upgrades.lua | 46 + .../phase-1/technology/technology.lua | 5564 +++++++++++++++++ .../prototypes/phase-1/tile/asteroid.lua | 293 + .../prototypes/phase-1/tile/plating.lua | 366 ++ .../prototypes/phase-1/tile/regolith.lua | 37 + .../prototypes/phase-1/tile/scaffold.lua | 139 + .../prototypes/phase-1/tile/space.lua | 44 + .../prototypes/phase-1/tile/spaceship.lua | 102 + .../phase-1/tile/tile-transitions-static.lua | 996 +++ .../prototypes/phase-1/utility-sprites.lua | 22 + .../prototypes/phase-2/capsules.lua | 216 + .../phase-2/compatibility/general.lua | 47 + .../compatibility/krastorio2/krastorio2.lua | 25 + .../compatibility/krastorio2/matter.lua | 133 + .../compatibility/krastorio2/recipes.lua | 93 + .../compatibility/krastorio2/resources.lua | 43 + .../prototypes/phase-2/generic-recycling.lua | 170 + .../phase-2/linked-containers-old.lua | 90 + .../prototypes/phase-2/modules.lua | 1331 ++++ .../prototypes/phase-2/recipe-update.lua | 169 + .../prototypes/phase-3/character.lua | 9 + .../prototypes/phase-3/collision-common.lua | 52 + .../phase-3/compatibility/angels.lua | 34 + .../phase-3/compatibility/notnotmelon.lua | 5 + .../prototypes/phase-3/core-fragments.lua | 332 + .../prototypes/phase-3/delivery-cannon.lua | 126 + .../prototypes/phase-3/electric-boiling.lua | 99 + .../phase-3/energy-shield-equipment.lua | 115 + .../prototypes/phase-3/incompatibility.lua | 22 + .../prototypes/phase-3/interior-divider.lua | 14 + .../prototypes/phase-3/noise-programs.lua | 248 + .../prototypes/phase-3/recipe.lua | 217 + .../prototypes/phase-3/resources.lua | 100 + .../prototypes/phase-3/ruin-remnants.lua | 180 + .../prototypes/phase-3/ruins.lua | 310 + .../prototypes/phase-3/space-collision.lua | 233 + .../phase-3/technology-procedural.lua | 176 + .../prototypes/phase-3/technology.lua | 184 + .../phase-multi/item-group-assign.lua | 110 + .../prototypes/phase-multi/no-recycle.lua | 48 + .../resource_autoplace_overrides.lua | 476 ++ .../space-exploration/scripts/ancient.lua | 2476 ++++++++ .../space-exploration/scripts/arco.lua | 161 + .../space-exploration/scripts/beacon.lua | 151 + .../space-exploration/scripts/big-turbine.lua | 99 + .../space-exploration/scripts/capsule.lua | 311 + .../scripts/compatibility/abandoned-ruins.lua | 14 + .../scripts/compatibility/entity-move.lua | 126 + .../scripts/compatibility/miniloaders.lua | 16 + .../space-exploration/scripts/composites.lua | 98 + .../scripts/condenser-turbine.lua | 99 + .../space-exploration/scripts/core-miner.lua | 199 + .../scripts/delivery-cannon-gui.lua | 379 ++ .../scripts/delivery-cannon.lua | 602 ++ .../scripts/dimensional-anchor.lua | 112 + .../scripts/energy-beam-defence.lua | 232 + .../scripts/energy-beam-gui.lua | 396 ++ .../space-exploration/scripts/energy-beam.lua | 952 +++ .../space-exploration/scripts/essential.lua | 262 + .../space-exploration/scripts/event.lua | 58 + .../space-exploration/scripts/informatron.lua | 387 ++ .../scripts/interburbulator.lua | 830 +++ .../scripts/landingpad-gui.lua | 223 + .../space-exploration/scripts/landingpad.lua | 367 ++ .../scripts/launchpad-gui.lua | 424 ++ .../space-exploration/scripts/launchpad.lua | 1582 +++++ .../space-exploration/scripts/lifesupport.lua | 412 ++ .../scripts/linked-container.lua | 162 + .../space-exploration/scripts/location.lua | 148 + .../space-exploration/scripts/log.lua | 66 + .../space-exploration/scripts/map-view.lua | 1738 +++++ .../space-exploration/scripts/medpack.lua | 46 + .../space-exploration/scripts/meteor.lua | 859 +++ .../space-exploration/scripts/migrate.lua | 850 +++ .../space-exploration/scripts/nexus.lua | 206 + .../space-exploration/scripts/pin.lua | 1250 ++++ .../space-exploration/scripts/profiler.lua | 170 + .../scripts/remote-interface.lua | 468 ++ .../space-exploration/scripts/remote-view.lua | 1026 +++ .../space-exploration/scripts/respawn.lua | 523 ++ .../space-exploration/scripts/ruin.lua | 476 ++ .../scripts/ruins/arty40.lua | 130 + .../scripts/ruins/galaxy-ship.lua | 124 + .../ruins/interburbulator-platform.lua | 88 + .../scripts/ruins/persepolis.lua | 150 + .../scripts/ruins/satellite.lua | 92 + .../space-exploration/scripts/sha2.lua | 241 + .../space-exploration/scripts/solar-flare.lua | 394 ++ .../space-exploration/scripts/spaceship.lua | 3719 +++++++++++ .../scripts/universe-raw.lua | 931 +++ .../space-exploration/scripts/universe.lua | 2073 ++++++ .../space-exploration/scripts/util.lua | 782 +++ .../space-exploration/scripts/weapon.lua | 278 + .../space-exploration/scripts/zone.lua | 2022 ++++++ .../space-exploration/scripts/zonelist.lua | 1332 ++++ .../space-exploration/settings.lua | 230 + .../space-exploration/shared.lua | 8 + .../sound/canister-breath.ogg | Bin 0 -> 29109 bytes .../space-exploration/sound/gate-button.ogg | Bin 0 -> 22894 bytes .../space-exploration/sound/gate-lock.ogg | Bin 0 -> 80401 bytes .../sound/gate-power-down.ogg | Bin 0 -> 61015 bytes .../space-exploration/sound/gate-power-on.ogg | Bin 0 -> 94345 bytes .../space-exploration/sound/gate-power-up.ogg | Bin 0 -> 85722 bytes .../space-exploration/sound/gate-turning.ogg | Bin 0 -> 58027 bytes .../space-exploration/sound/meteor-woosh.ogg | Bin 0 -> 122680 bytes .../space-exploration/sound/railgun.ogg | Bin 0 -> 11177 bytes .../sound/spaceship-woosh.ogg | Bin 0 -> 44163 bytes .../space-exploration/sound/tesla-gunshot.ogg | Bin 0 -> 33897 bytes .../space-exploration/stdlib/area/area.lua | 243 + .../space-exploration/stdlib/area/chunk.lua | 108 + .../stdlib/area/position.lua | 205 + .../space-exploration/stdlib/area/tile.lua | 121 + .../space-exploration/stdlib/color/color.lua | 14 + .../stdlib/color/defines.lua | 38 + .../stdlib/config/config.lua | 180 + .../space-exploration/stdlib/core.lua | 20 + .../space-exploration/stdlib/data/data.lua | 63 + .../stdlib/data/protohelpers.lua | 199 + .../space-exploration/stdlib/data/recipe.lua | 118 + .../stdlib/debug/console.lua | 63 + .../space-exploration/stdlib/debug/debug.lua | 27 + .../stdlib/debug/quickstart.lua | 79 + .../stdlib/entity/entity.lua | 154 + .../stdlib/entity/inventory.lua | 41 + .../space-exploration/stdlib/event/event.lua | 128 + .../space-exploration/stdlib/event/time.lua | 76 + .../space-exploration/stdlib/force.lua | 46 + .../space-exploration/stdlib/game.lua | 67 + .../space-exploration/stdlib/gui/gui.lua | 144 + .../space-exploration/stdlib/log/logger.lua | 100 + .../space-exploration/stdlib/player.lua | 50 + .../space-exploration/stdlib/string.lua | 80 + .../space-exploration/stdlib/surface.lua | 102 + .../space-exploration/stdlib/table.lua | 312 + .../space-exploration/stdlib/time.lua | 31 + .../stdlib/trains/trains.lua | 228 + .../space-exploration/stdlib/utils/list.lua | 51 + .../space-exploration/stdlib/utils/queue.lua | 80 + .../space-exploration/stdlib/utils/utils.lua | 267 + .../space-exploration/thumbnail.png | Bin 0 -> 13728 bytes .../prototypes/phase-3/delivery-cannon.lua | 2 +- 311 files changed, 125210 insertions(+), 28 deletions(-) create mode 100644 space-exploration_0.5.58/space-exploration/.documentation/global.txt create mode 100644 space-exploration_0.5.58/space-exploration/.documentation/tiles.txt create mode 100644 space-exploration_0.5.58/space-exploration/README.md create mode 100644 space-exploration_0.5.58/space-exploration/changelog.txt create mode 100644 space-exploration_0.5.58/space-exploration/collision-mask-util-extended/control/collision-mask-util-control.lua create mode 100644 space-exploration_0.5.58/space-exploration/collision-mask-util-extended/data/collision-mask-util-extended.lua create mode 100644 space-exploration_0.5.58/space-exploration/control.lua create mode 100644 space-exploration_0.5.58/space-exploration/data-final-fixes.lua create mode 100644 space-exploration_0.5.58/space-exploration/data-updates.lua create mode 100644 space-exploration_0.5.58/space-exploration/data.lua create mode 100644 space-exploration_0.5.58/space-exploration/data_util.lua create mode 100644 space-exploration_0.5.58/space-exploration/info.json create mode 100644 space-exploration_0.5.58/space-exploration/licence.txt create mode 100644 space-exploration_0.5.58/space-exploration/locale/cs/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/locale/de/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/locale/en/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/locale/es-ES/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/locale/fr/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/locale/hw/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/locale/it/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/locale/ja/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/locale/ko/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/locale/pl/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/locale/ru/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/locale/zh-CN/strings.cfg create mode 100644 space-exploration_0.5.58/space-exploration/lua-style.cfg create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.146.json create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.64.json create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.8.json create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.2.5.json create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.2.7.lua create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.126.lua create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.13.json create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.130.json create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.21.json create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.32.json create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.5.1.json create mode 100644 space-exploration_0.5.58/space-exploration/migrations/space-exploration0.0.3.45.json create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/categories.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/antimatter-reactor.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/arcosphere.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/big-heat-exchanger.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/big-turbine.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/delivery-cannon.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/electric-boiler.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/energy-transmitter.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/interburbulator.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/iridium-piledriver.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/lifesupport.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/linked-container.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/nexus.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/pipe.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/probe.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/rail.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/spaceship-clamps.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/transport-belt.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/weapon-bio.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/compatibility/qol_research.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/damage-types.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/crater.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/rocks-base.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/rocks.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/ancient.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/astrometric-gravimetric.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/cargo-rocket.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/condenser-turbine.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/core-miner.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/decontamination-lifesupport.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/dimensional-anchor.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/entity.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/explosion.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/fluid-burner-generator.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/fuel-refinery.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/gate.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/genetics-laboratory.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/growth-facility.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/laser-radi-thermo.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/light.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/meteor-defence.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/meteor.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/particle-acc-col-fab.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/pylons.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/recycle-mechanical.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/resource-autoplace.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/resources.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-fragments.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-landing-pad.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-launch-pad.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/scaffold.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-biochemical.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-capsule.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-electromagnetics.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-hypercooler.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-manufactory.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-plasma-generator.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-radiator.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-science-lab.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-supercomputer.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/spaceship-obstacles.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/spaceship.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/starmap.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/supercharger.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/telescopes.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/wide-beacon.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/fluid/fluid.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/input.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item-groups.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/armor.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/cargo-rocket.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/condenser-turbine.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/core-miner.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/equipment.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/gate.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/items.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/medpack.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/meteor-defence.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/platforms.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/resources.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/rocket-landing-pad.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/rocket-launch-pad.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/science-pack.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/spaceship.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/structures.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/utility.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-cryogun.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-plague.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-railgun.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-tesla.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/astrometrics-laboratory.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/biochemical-laboratory.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/cargo-rocket.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/condenser-turbine.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/core-miner.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/decontamination-facility.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/electromagnetics-laboratory.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/gate.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/genetics-laboratory.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/gravimetrics-laboratory.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/growth-facility.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/hypercooler.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/laser-laboratory.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/lifesupport-facility.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/manufacturing.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/material-fabricator.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/mechanical-laboratory.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/medpack.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/observation.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/particle-accelerator.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/particle-collider.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/plasma-generator.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/platforms.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/radiation-laboratory.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/radiator.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/recipe.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/recycling-facility.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/resources.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/rocket-landing-pad.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/rocket-launch-pad.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/science-lab.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/science.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/spaceship.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/spectrometry-facility.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/structures.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/supercomputing.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/thermodynamics-laboratory.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/shortcut.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/signal.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/sound.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/styles.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/technology/bio-upgrades.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/technology/technology.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/asteroid.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/plating.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/regolith.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/scaffold.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/space.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/spaceship.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/tile-transitions-static.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-1/utility-sprites.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-2/capsules.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/general.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/krastorio2.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/matter.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/recipes.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/resources.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-2/generic-recycling.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-2/linked-containers-old.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-2/modules.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-2/recipe-update.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/character.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/collision-common.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/compatibility/angels.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/compatibility/notnotmelon.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/core-fragments.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/delivery-cannon.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/electric-boiling.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/energy-shield-equipment.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/incompatibility.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/interior-divider.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/noise-programs.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/recipe.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/resources.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/ruin-remnants.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/ruins.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/space-collision.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/technology-procedural.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-3/technology.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-multi/item-group-assign.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/phase-multi/no-recycle.lua create mode 100644 space-exploration_0.5.58/space-exploration/prototypes/resource_autoplace_overrides.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/ancient.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/arco.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/beacon.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/big-turbine.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/capsule.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/compatibility/abandoned-ruins.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/compatibility/entity-move.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/compatibility/miniloaders.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/composites.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/condenser-turbine.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/core-miner.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/delivery-cannon-gui.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/delivery-cannon.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/dimensional-anchor.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/energy-beam-defence.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/energy-beam-gui.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/energy-beam.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/essential.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/event.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/informatron.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/interburbulator.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/landingpad-gui.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/landingpad.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/launchpad-gui.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/launchpad.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/lifesupport.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/linked-container.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/location.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/log.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/map-view.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/medpack.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/meteor.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/migrate.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/nexus.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/pin.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/profiler.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/remote-interface.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/remote-view.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/respawn.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/ruin.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/ruins/arty40.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/ruins/galaxy-ship.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/ruins/interburbulator-platform.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/ruins/persepolis.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/ruins/satellite.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/sha2.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/solar-flare.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/spaceship.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/universe-raw.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/universe.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/util.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/weapon.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/zone.lua create mode 100644 space-exploration_0.5.58/space-exploration/scripts/zonelist.lua create mode 100644 space-exploration_0.5.58/space-exploration/settings.lua create mode 100644 space-exploration_0.5.58/space-exploration/shared.lua create mode 100644 space-exploration_0.5.58/space-exploration/sound/canister-breath.ogg create mode 100644 space-exploration_0.5.58/space-exploration/sound/gate-button.ogg create mode 100644 space-exploration_0.5.58/space-exploration/sound/gate-lock.ogg create mode 100644 space-exploration_0.5.58/space-exploration/sound/gate-power-down.ogg create mode 100644 space-exploration_0.5.58/space-exploration/sound/gate-power-on.ogg create mode 100644 space-exploration_0.5.58/space-exploration/sound/gate-power-up.ogg create mode 100644 space-exploration_0.5.58/space-exploration/sound/gate-turning.ogg create mode 100644 space-exploration_0.5.58/space-exploration/sound/meteor-woosh.ogg create mode 100644 space-exploration_0.5.58/space-exploration/sound/railgun.ogg create mode 100644 space-exploration_0.5.58/space-exploration/sound/spaceship-woosh.ogg create mode 100644 space-exploration_0.5.58/space-exploration/sound/tesla-gunshot.ogg create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/area/area.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/area/chunk.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/area/position.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/area/tile.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/color/color.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/color/defines.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/config/config.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/core.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/data/data.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/data/protohelpers.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/data/recipe.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/debug/console.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/debug/debug.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/debug/quickstart.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/entity/entity.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/entity/inventory.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/event/event.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/event/time.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/force.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/game.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/gui/gui.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/log/logger.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/player.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/string.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/surface.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/table.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/time.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/trains/trains.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/utils/list.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/utils/queue.lua create mode 100644 space-exploration_0.5.58/space-exploration/stdlib/utils/utils.lua create mode 100644 space-exploration_0.5.58/space-exploration/thumbnail.png diff --git a/space-exploration-extension/data.lua b/space-exploration-extension/data.lua index 96eff5a..18085e2 100644 --- a/space-exploration-extension/data.lua +++ b/space-exploration-extension/data.lua @@ -50,8 +50,7 @@ data:extend({ { "copper-cable", 32 }, { "copper-plate", 5 }, { "glass", 5 }, - { "explosives", 10 }, - { "plastic-bar", 5 }, + { "explosives", 5 }, { "electronic-circuit", 3 }, }, requester_paste_multiplier = 1, @@ -64,10 +63,9 @@ data:extend({ enabled = true, energy_required = 10, ingredients = { --60 - { "explosives", 12 }, { "copper-cable", 7 }, { "copper-plate", 4 }, - { "plastic-bar", 17 }, + { "plastic-bar", 5 }, { "steel-plate", 1 }, { "iron-stick", 10 }, }, @@ -84,10 +82,8 @@ data:extend({ { "copper-cable", 10 }, { "steel-plate", 2 }, { "iron-plate", 4 }, - { "copper-plate", 14 }, - { "glass", 10 }, + { "glass", 5 }, { "stone-brick", 1 }, - { "iron-stick", 1 }, }, requester_paste_multiplier = 1, always_show_made_in = false, @@ -100,11 +96,9 @@ data:extend({ energy_required = 10, ingredients = { --60 { "steel-plate", 3 }, - { "iron-plate", 5 }, { "iron-gear-wheel", 5 }, - { "se-heat-shielding", 2 }, - { "explosives", 11 }, - { "glass", 5 }, + { "se-heat-shielding", 1 }, + { "explosives", 5 }, { "grenade", 1 }, }, requester_paste_multiplier = 1, @@ -117,9 +111,8 @@ data:extend({ enabled = true, energy_required = 10, ingredients = { --67 - { "uranium-238", 13 }, + { "uranium-238", 3 }, { "steel-plate", 3 }, - { "copper-plate", 10 }, { "copper-cable", 10 }, { "iron-gear-wheel", 2 }, { "iron-stick", 2 }, @@ -134,12 +127,10 @@ data:extend({ enabled = true, energy_required = 10, ingredients = { - { "concrete", 13 }, + { "concrete", 3 }, { "steel-plate", 2 }, { "iron-stick", 2 }, { "coal", 5 }, - { "plastic-bar", 4 }, - { "sulfur", 6 }, }, requester_paste_multiplier = 1, always_show_made_in = false, @@ -151,15 +142,10 @@ data:extend({ enabled = true, energy_required = 10, ingredients = { --60 - { "steel-plate", 2 }, { "iron-stick", 1 }, - { "iron-gear-wheel", 3 }, - { "iron-plate", 3 }, + { "iron-gear-wheel", 4 }, { "coal", 6 }, - { "plastic-bar", 6 }, - { "sulfur", 10 }, - { "explosives", 7 }, - { "land-mine", 3 }, + { "explosives", 3 }, { "empty-barrel", 1 }, }, requester_paste_multiplier = 1, @@ -172,11 +158,11 @@ data:extend({ enabled = true, energy_required = 10, ingredients = { --60 - { "copper-cable", 22 }, + { "copper-cable", 10 }, { "copper-plate", 5 }, - { "glass", 4 }, - { "stone-tablet", 4 }, - { "sand", 25 }, + { "glass", 2 }, + { "stone-tablet", 2 }, + { "sand", 10 }, }, requester_paste_multiplier = 1, always_show_made_in = false, diff --git a/space-exploration_0.5.58/space-exploration/.documentation/global.txt b/space-exploration_0.5.58/space-exploration/.documentation/global.txt new file mode 100644 index 0000000..79bac7b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/.documentation/global.txt @@ -0,0 +1,364 @@ +-- Zones have an inheritace chain: + Zone -- anomaly, asteroid-field, asteroid-belt, orbit + Zone:Body -- star planet or moon + Zone:Body:Star -- stellar_position, children, asteroid_belts, star_gravity_well, orbit, has no own surface (uses orbit) + Zone:Body:Planet -- star_gravity_well, planet_gravity_well, children, orbit + Zone:Body:Moon -- star_gravity_well, planet_gravity_well, orbit + Zone:BlackHole -- has no stellar position. Loophole: equal distance to all stars + Zone:AsteroidBelt -- star_gravity_well + Zone:AsteroidField -- stellar_position + +-- Locations specify a point in the world: +Location { + index = int, -- zone index or spaceship index or star zone index + position = {x,y} -- position in the zone + type = "spaceship" or "zone" or "interstellar" or "system" -- the type of location this is + name = string -- a nice name for this location +} + + +global { + seed = nauvis.map_gen_settings.seed, + version=3112, -- for on_configuration_changed phase migration code. Is more flexible than the normal system. + tick_task_next_id = int, + tick_tasks = dictionary{ + -- tick tacks are objects that have per-tick functionality for systems that are not usually per-tick systems. + -- used for animations, solar flares, rocket launches and landings, special weapon fx, etc. + -- for example, the tesla gun spawns a tick task when it fires, the arcs of electrivity are genrated per frame until the effect ends. + tick_task_id = { + id = tick_task_next_id, + type = "keyword determines secondary function call or removeal" + valid = true, -- needs to stay valid or be removed + otherdata... + } + }, + astronomical = dictionary{ -- the structured map of the universe. + stars = array { + 1 = Zone:Body:Star { + type = "star", + name = "body_name", + index = zone_index, + star_gravity_well = float, -- how far in star gravity well + surface_index = nil or surface_index, + orbit = Zone:Orbit{ + type = "orbit", + name = "body_name" .. " Orbit", + controls = {control_name = {frequency, scale, richness}}, -- resource controls + parent = Star, + surface_index = nil or surface_index, + }, + children = array{ + 1 = Zone:AsteroidBelt{ + type = "asteroid-belt", + name = star.name .. " Asteroid Belt ".. 1, + controls = {control_name = {frequency, scale, richness}}, -- resource controls + index = zone_index, + parent = Star, + star_gravity_well = float, -- how far in star gravity well + }, + 2 = Zone:Body:Planet { + type = "planet", + name = "body_name", + index = zone_index, + radius_multiplier = 0.2 to 1, + radius = 2000 to 10000, + parent = Star, + star_gravity_well = float, -- how far in star gravity well + planet_gravity_well = float, -- how far in planet gravity well + controls = {control_name = {frequency, scale, richness}}, -- climate and resource controls + resources = {primary resource}, + fragment_name = "se-core-fragment-iron-ore", + tags = {"water_none"}, -- climate generation tags + biome_replacements = { + {replace={"all-dirt", "all-sand", "all-volcanic"}, with="sand-red"}, + {replace={"all-vegetation", "all-frozen"}, with="vegetation-red"} + }, + tile_replacements = { + ["tile-a"] = "tile-b", + }, + core_miners = array( + 1 = CoreMinerStruct{} + ), + glyph = glyph, + vault_pyramid = LuaEntity, + surface_index = nil or surface_index, + orbit = Zone:Orbit{ + type = "orbit", + name = "body_name" .. " Orbit", + controls = {control_name = {frequency, scale, richness}}, -- resource controls + parent = Planet, + surface_index = nil or surface_index, + }, + children = array { + 1 = Zone:Body:Moon{ + type = "moon", + name = "body_name", + index = zone_index, + radius_multiplier = 0.2 to 1, + radius = 5000 to 400, (can't be more than 50% of planet size) + star_gravity_well = float, -- how far in star gravity well + planet_gravity_well = float, -- how far in planet gravity well + star_gravity_well = float, -- how far in star gravity well + planet_gravity_well = float, -- how far in planet gravity well + controls = {control_name = {frequency, scale, richness}}, -- climate and resource controls + resources = {primary resource}, + fragment_name = "se-core-fragment-iron-ore", + tags = {"water_none"}, -- climate generation tags + biome_replacements = { + {replace={"all-dirt", "all-sand", "all-volcanic"}, with="sand-red"}, + {replace={"all-vegetation", "all-frozen"}, with="vegetation-red"} + }, + tile_replacements = { + ["tile-a"] = "tile-b", + }, + parent = Planet, + core_miners = array( + 1 = CoreMinerStruct{} + ), + surface_index = nil or surface_index, + orbit = Zone:Orbit{ + type = "orbit", + name = "body_name" .. " Orbit", + controls = {control_name = {frequency, scale, richness}}, -- resource controls + parent = Moon, + surface_index = nil or surface_index, + }, + } + } + } + }, + }, + }, + black_hole = Zone:BlackHole{ -- only 1 of these, not in the 2d layer, equal disance in 3rd layer + type = "anomaly", + index = zone_index, -- 3 + name = "Foenestra" -- window, loophole, Hole, breach, opening + surface_index = nil or surface_index, + }, + space_zones = array{ + 1 = Zone:AsteroidField{ + type = "asteroid-field", + name = "zone-name", + index = zone_index, + controls = {control_name = {frequency, scale, richness}}, -- resource controls + stellar_position = {x = x, y = y}, + surface_index = nil or surface_index, + } + }, + zones_by_name -- this gets moved out of stellar cluster after formation + }, -- end stellar cluster + zone_index = array{ + 1 = Zone{ ... allzones by their zone_index = zone.index } + }, + zones_by_name = array{ + name = Zone { Zone(deep space), Star, Planet, or Moon, Orbit } + }, + zones_by_surface = array{ -- links a surface index to a zone + surface_index = Zone { Zone(deep space), Star, Planet, or Moon, Orbit } + }, + zones_alphabetised = array{ + + }, + zones_by_resource_options = array{ + homeworld = {}, + planet = {}, -- and moons, not homeworlds + anomaly = {}, + ["asteroid-belt"] = {}, + ["asteroid-field"] = {}, + orbit = {}, -- any orbit type or star + }, + spaceships = array{ + 1 = Spaceship{ + index = i, + name = "Unique Name", + force_name, + console = LuaEntity or nil, -- can only be nil if in own space + space_distortion = 0-1 + stellar_position = {x = x, y = y}, + star_gravity_well = float, + planet_gravity_well = float, + zone_index = -- landed zone, + near = {type = "zone" / "spaceship", index = int}, or nil. -- at location ready to land + destination = {type = "zone" / "spaceship", index = int}, or nil. + own_surface_index =, + known_tiles = {} + check_tiles, + pending_tiles, + is_landing + is_launching + is_stopped + console + + } + }, + glyph_vaults = array{ + 1 (glyph id) = vaults { + zone_id = { + glyph = int, + zone_index = int, + surface_index = int, -- only exists if surface is made. + } + } + }, + playerdata = array{ + player_index = PlayerData{ + zero_velocity = true, optional, used to zero velocity on the next tick (after teleportation) + velocity = {x = 0, y = 0}, + last_postition = {x = 0, y = 0}, -- position last tick + postition = {x = 0, y = 0}, -- current position + set_postition = {x = 0, y = 0}, -- the position as set by script, deviation from it means that the player caused movement, used for thrust in zero-G + opened = nil or Entity, + opened_gui_type = nil or GuiType(int), + remote_view_active = nil or true, + remote_view_zone_name = nil or Zone Name, + character = LuaEntity, -- store link while in remote view + saved_swaps = dictionary{ -- saved locations for quick swapping in remote view + saved_swap_id = { + signal = SignalID -- the icon + location_reference = Location -- the location that this swap is + } + id = int -- the next available unique index to assign to a newly created saved location + } + saved_hotkeys = dictionary{ -- what saved location each quick swap hotkey goes to + hotkey_dropdown_index -> saved_swap_id -- maps the index in the hotkey dropdown to the saved_swap_id it swaps to + } + quick_swap_opened_item_name -- what quick swap is being viewed in the editing modal + quick_swap_selected_hotkey -- what hotkey index is set in the editing modal dropdown + } + }, + chart_tag_buffer array{ -- array of chart_tag_definitions that add map markers when the area has been charted (marker fails if not charted) + chart_tag_next_id = chart_tag_definition { + surface_name (optional) + force_name + position + surface = LuaSurface + icon_type (item/virtual) + icon_name + text + chart_range (optional) + } + }, + chart_tag_next_id = int, + rocket_launch_pads = array{ + unit_number = RocketLaunchPad{} + }, + rocket_landing_pads = array{ + unit_number = RocketLandingPad{} + }, + forces = dictionary{ + force_name = { + force_name = string, + zones_discovered_count = 1, -- planets and moons discovered + zones_discovered = dictionary{ + zone_index = { + [455]={ -- Note: orbits are not discovered, the parent zone is. + discovered_at=16798383 + }, + [457]={ + discovered_at=16798383 + }, + } + }, + satellites_launched = count by silo mk1, + cargo_rockets_launched =- count of launches, + cargo_rockets_crashed = count of launches that crashed, + rocket_landing_pad_names = dictionary { + rocket_landing_pad_name = array{ + unit_number = RocketLandingPad{ + type = name_rocket_landing_pad + valid = true, + force_name -- string + unit_number -- uint + name -- string + container -- primary entity + inbound_rocket -- bool + zone = Zone{}, -- the zone occupied + } + } + } + zone_assets = dictionary{ + zone_index = dictionary{ + rocket_launch_pad_names = dictionary { -- is it really necessary to have these named? + rocket_launch_pad_name = array{ + unit_number = RocketLaunchPad { + type = name_rocket_launch_pad + valid = true, + force_name -- string + unit_number -- uint + name -- string + container -- container primary entity + section_input -- vehicle entity nullable + tank -- storage tank entity + silo -- rocket silo entity + combinator -- combinator entity + seats[] -- entity + settings -- speaker + rocket_sections -- unit + crew_capsules -- unit + lua_fuel -- float - additional fuel otherwise fuel tank would need to be huge. + required_fuel -- cached for ui + total_fuel -- cached for ui, lua_fuel + tank fuel + launch_status -- int: -1 when not ready, ticks up while launching so things can be timed + zone = Zone{}, -- the zone occupied + destination = nil or Destination{ -- make deepcopy safe + type = "zone" or "landing-pad", + zone = Zone, + landing_pad_name = "Pad Name" -- "landing-pad" type only + } -- as above + launching_to_destination = nil + or LockedDestination{ + type = "zone" or "landing-pad", + zone = Zone, + position = {x=x,y=y} -- set once launch is locked and there is no landing pad + landing_pad_name = "Landing Pad Name", -- optional, sets attempt to land at a landing pad with this name in the target zone + landing_pad = LandingPad{}, -- set once launch is locked to a landing pad + } + launch_trigger -- string: none / fuel_full / cargo_full / signal + } + } + }, + rocket_landing_pad_names = dictionary { + rocket_landing_pad_name = array{ + unit_number = RocketLandingPad{ + type = name_rocket_landing_pad + valid = true, + force_name -- string + unit_number -- uint + name -- string + container -- primary entity + inbound_rocket -- bool + zone = Zone{}, -- the zone occupied + } + } + } + } + } + nauvis_satellite = Position, + zone_priorities = { + zone_index = priority(int) + }, + first_entered_vault = Zone, + homeworld_index = zone_index, + + } + }, + space_capsule_launches = array { + vehicle.unit_number = { + force_name = vehicle.force.name, + unit_number = vehicle.unit_number, + vehicle = vehicle, + shadow = shadow, + light = light, + start_position = vehicle.position, + launch_progress = 1, + destination_zone = target_zone, + destination_position = find_zone_landing_position(target_zone), + passengers = passenger_indexes, + } + }, + resources_and_controls = { + -- saves settings related to surface and resource generation. + -- If settings change between save/load then parts of + + } +} diff --git a/space-exploration_0.5.58/space-exploration/.documentation/tiles.txt b/space-exploration_0.5.58/space-exploration/.documentation/tiles.txt new file mode 100644 index 0000000..fa2a5a0 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/.documentation/tiles.txt @@ -0,0 +1,44 @@ +Converting from map_gen_setting:planet_size:frequency to planet radius: +planet_size ranges from 17% min, 100% default, 600% max (0.17, 1, 6) +percent_of_max = (6 + log(percent_of_max/6, 2)) / 6 +percent_of_max converts: +17% -> 14% +100% -> 50% +600% -> 100% + +planet_radius = percent_of_max * max_planet_size +max_planet_size is 10000 +17% -> 1431 +100% -> 5000 +600% -> 10000 + +final formulas for scale: +planet_radius = 10000 / 6 * (6 + log(planet_size/6, 2)) + +planet_size = 6 * 2 ^ (planet_radius / 10000 * 6 - 6) + +actual impementations use frequency: +planet_radius = 10000 / 6 * (6 + log(1/planet_frequency/6, 2)) + +planet_frequency = 1 / 6 / 2 ^ (planet_radius * 6 / 10000 - 6) + + +Planets: + Plant tile generation follows rules set by other mods + At a certain radius the planet-size setting kicks in and tiles spawn as out-of-map + This makes circular planets. + Planets have altered map-gen settings for climate: temperature, moisture, aux + +Space: + The planet-size setting should be set to something extremely large so out-of-tile are unlikely to be reached + Space tiles spawn with extreme influence were planet-size is set to a normally unreachable setting (100) + All non-space tiles must have an upper limit on their influence less than space tiles. + + Natural space tiles are: + Space + Asteroid + + Artificial space tiles are: + Space Platform Scaffold + Space Platform Plating + Spaceship floor (has own layer) diff --git a/space-exploration_0.5.58/space-exploration/README.md b/space-exploration_0.5.58/space-exploration/README.md new file mode 100644 index 0000000..9bea461 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/README.md @@ -0,0 +1,6 @@ +# space-exploration +Factorio Space Exploration + +This is **NOT** an open source project, please check the licence file. + +If you would like to contribute please contact Earendel on Discord first: https://discord.gg/ymjUVMv diff --git a/space-exploration_0.5.58/space-exploration/changelog.txt b/space-exploration_0.5.58/space-exploration/changelog.txt new file mode 100644 index 0000000..b9dd0c9 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/changelog.txt @@ -0,0 +1,3759 @@ +--------------------------------------------------------------------------------------------------- +Version: 0.5.58 +Date: 07. 06. 2021 + Changes: + - Update for graphics mod being split into multiple parts. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.57 +Date: 06. 06. 2021 + Bugfixes: + - Fix crash when placing a delivery cannon. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.56 +Date: 06. 06. 2021 + Changes: + - Copy/pasting settings on an Energy Transmitter now copies the destination and mode. + - Energy Transmitters retain destination and mode when blueprinted. + - Energy Transmitter GUI moved from the left of the screen to the entity window in the screen center. + - Energy Transmitter GUI now shows a preview of the destination (disabled with the same setting as other previews) + - Map view for stars and interstellar space has a background now. + + Bugfixes: + - Fixed dramatic UPS slowdown if energy beamer set to auto-glaive could not find a structure to target. + - High Temperature Turbine fan now spins while operating. + - Entity previews will not cut off parts of SE buildings for (almost) all buildings. + - Fixed a problem with arcopshere returns. + - Fixed a crash if an arcopshere processing machine had all recipes removed. + + Locale: + - Capitalization is now consistent with vanilla factorio for english locale (thanks Flood). + + Compatibility: + - Remote view now allows all types of spidertron remotes to be made for free. + - Compatibility with Space Factorissimo. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.55 +Date: 21. 05. 2021 + Bugfixes: + - Fixed crash if copy-pasting cannon settings from a cannon that had no coordinate set. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.54 +Date: 21. 05. 2021 + Bugfixes: + - Fixed crash if delivery cannon entity was destroyed while the gui was open. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.53 +Date: 21. 05. 2021 + Changes: + - Improved clarity in spaceship informatron page for automated usage. + - Copy/pasting settings on a Delivery Cannon now copies the destination in addition to recipe. + - Delivery Cannons retain destinations when blueprinted. + - Delivery Cannon GUI moved from the left of the screen to the entity window in the screen center. + - Delivery Cannon GUI now shows a preview of the destination (disabled with the same setting as other previews) + - Copy/pasting settings on a Rocket Landing Pad now copies the name. + - Rocket Landing Pads retain names when blueprinted. + - Rocket Landing Pad GUI moved from the left of the screen to the entity window in the screen center. + - Rocket Landing Pad GUI now has a dropdown for names. + - Migrated an older approach to settings copy/paste. This will cause your game to display that `se-...-settings` entities were removed. This is expected behavior. + + Bugfixes: + - Fixed an issue where a certain endgame chest could be placed on spaceships that were in-transit. + - Fixed an issue where delivery cannon capsule creation was being counted as resource consumption in production stats. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.52 +Date: 10. 05. 2021 + Bugfixes: + - Fixed an issue where the Universe Explorer GUI wasn't closeable + + Changes: + - UPS improvement when scouting for a spaceship anchor spot. + + Locale: + - Fixed various typos. + - Updated Chinese translation thanks to Ph.X. + - Updated Russian translation thanks to Shadow_Man. + - Updated French translation thanks to Heinarc and Bev. + - Updated Korean translation thanks to PolarZero. + + Scripting: + - Remote interface for navigation satellite functions (start, stop, is_active, is_unlocked). + +--------------------------------------------------------------------------------------------------- +Version: 0.5.51 +Date: 08. 05. 2021 + Changes: + - Medpacks can now heal friends (Requires Space Exploration Postprocess 0.5.13+). + + Bugfixes: + - Fixed that shield projector walls wouldn't block units or characters. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.50 +Date: 07. 05. 2021 + Bugfixes: + - Fixed error in satellite view location history when a spaceship was destroyed. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.49 +Date: 05. 05. 2021 + Changes: + - Moved spaceship pins to a special row for all spaceships. + - Rocket debris now does meteor damage instead of explosion damage. + - Cargo pods are now immune to meteor damage. + + Bugfixes: + - Fixed error is using the pins hotkey when no pins are set. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.48 +Date: 04. 05. 2021 + Bugfixes: + - GUI elements relying on gui.screen will no longer be cleared when the Universe Explorer is opened. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.47 +Date: 04. 05. 2021 + Changes: + - Added Previous and Next buttons for navigating history of satellite view locations. Also added keyboard shortcuts. + - "Currently viewing" zone path icons are now clickable. + - "Currently viewing" zone path now always includes orbit but highlights the planet if the planet is being viewed. + - Added Navigation satellite 'pinned' locations that you can jump to with keyboard shortcuts. + - You now start the game with a biter capsule, so you have a friend to help defend you at the start of the game. + + Bugfixes: + - Fixed zone discovery UI buttons changing size after click. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.46 +Date: 01. 05. 2021 + Bugfixes: + - Fixed zone discovery UI error from missing style. + - Fixed zone discovery UI buttons changing size after click. + + Compatibility: + - Fix for deadlock's burner lamp. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.45 +Date: 30. 04. 2021 + Changes: + - You can no longer enter satellite mode while in editor mode (because you die). + - Reduced ingot to plate crafting time from 15s to 8s. + - Removed material science as a requirement of Spaceships, updated recipes to match. + - Spaceship floor now requires heat shielding instead of space platform plating. + - Added iridium delivery cannon capsule. + + Bugfixes: + - Fixed problem loading if default map gen was removed. + - Fixed some composite icon sizes in map view. + - Fixed CME text wrapping. + - Fixed a problem with tile placement if the tile placement kills you. + - Many recipes are now excluded from recipe "total raw" calculations. + + Compatibility: + - Marked "UnlimitedProductivity" as incompatible because it won't work with Space Exploration's modules and zone-based productivity system. You can remove the "UnlimitedProductivity" line from info.json if you don't care about that but don't report any bugs that result. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.44 +Date: 16. 04. 2021 + Bugfixes: + - Fixed problem with automated enemy target selection. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.43 +Date: 12. 04. 2021 + Bugfixes: + - Mining productivity levels 11 onward now correctly use Biological Science Pack 4 instead of Biological Science Pack 1. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.42 +Date: 07. 04. 2021 + Compatibility: + - Stopped PickerDollied from breaking some entities. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.41 +Date: 05. 04. 2021 + Bugfixes: + - Fixed a secret thing wouldn't power up properly after energy input limit was reduced. + + Compatibility: + - Landfill won't collide with resources is water also doesn't (for mods with water resources). + + Locale: + - Updated Russian translation thanks to Shadow_Man. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.40 +Date: 01. 04. 2021 + Changes: + - Added new planet or moon: Mirage. + - Added resource icons to new game autoplace control names. + - Reduced energy usage of a secret thing. + + Bugfixes: + - Fixed spawner description. + - Fixed exploit with boarding spaceships. + + Locale: + - Updated Russian translation thanks to Shadow_Man. + - Updated French translation thanks to Heinarc. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.39 +Date: 14. 03. 2021 + Changes: + - Data card formatting 1 now uses cool thermofluid instead of cold. This means that it can be used as soon as the recipe is researched (cold thermofluid was still locked). + - Data card formatting 2 now uses cold thermofluid instead of supercooled. + - CMEs now target the end of the sunrise phase of the day of the surface they target, snapped to the next minute. Existing timers are not affected. + + Bugfixes: + - Fixed a problem with the remote interface for get_player_character. + - Fixed CMEs could target surfaces they shouldn't. + - Fixed wong spaceship status message, could claim to be exiting a star gravity well when it was entering it. + - Fixed that spaceships would completely ignore container stress for their mass estimate. It was supposed to be whichever stress value was higher. It is now 75% the original intended value, and 25% the old value (so compact container ships still have some advantage). + + Locale: + - Updated Russian translation thanks to Shadow_Man. + - Updated Korean translation thanks to PolarZero. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.38 +Date: 12. 03. 2021 + Changes: + - Postprocess is now added as a dependency with no forced load order (thanks to base game update). + +--------------------------------------------------------------------------------------------------- +Version: 0.5.37 +Date: 18. 02. 2021 + Bugfixes: + - Fixed equipment background color. + - Fixed rename landing pad button tooltip. + - Fixed non-character players being left in spaceship surfaces during deletion and ending up back on Nauvis. + - Updated tech util code for expanded technology specification format. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.36 +Date: 12. 02. 2021 + Compatibility: + - Krastorio 2: Updates for changes in K2 icon sizes. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.35 +Date: 10. 02. 2021 + Changes: + - Added new planet or moon: Katalos. + - Reduce uranium from generic core fragment by 50%. + + Bugfixes: + - Fixed some hidden techs were not hidden. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.34 +Date: 05. 02. 2021 + Changes: + - Cargo rocket landing pads now have an additional 10 inventory slots to prevent rocket parts deleting cargo if the landing pad fills up completely. + + Compatibility: + - Updated minimum version requirements for mod dependencies. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.33 +Date: 27. 01. 2021 + Changes: + - Spaceship: Negative speed signal now means stop. + - Updated cargo rocket silo specification for new graphic. + + Bugfixes: + - Fixed related underground belt for space belts. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.32 +Date: 21. 01. 2021 + Bugfixes: + - Fixed version number comparison was using string comparison instead of number comparison. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.31 +Date: 21. 01. 2021 + Changes: + - Condenser turbine and high temperature turbine both have inputs filtered to steam only. + - Default plague timeout is now 5 minutes. + + Bugfixes: + - Fixed multiplayer setup script not respecting seed matching setting. + - Fixed issue with spidertron leg function interfering with other mods. + - Fixed crash is a surface is deleted while special weapon scripts are running on the surface. + - Fixed a prolem with spaceship travel time estimation. + - Detatched characters should now keep their player color (multiplayer non-player 1). + + Compatibility: + - Spider leg fix for Klonan. + + Locale: + - Updated fr & zh-CH translations. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.30 +Date: 30. 12. 2020 + Changes: + - Spaceship landing is not blocked by "deconstructible-tile-proxy" entities. + + Bugfixes: + - Fixed spaceship error from previous version. + - Fixed initial reported CME power being incorrect. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.29 +Date: 28. 12. 2020 + Changes: + - Rockets landing at landing pads don't output 0-10 cargo pods anymore (you still get 20+ cargo rocket sections). + + Bugfixes: + - Fixed NAN exception related to 0 spaceship speed in some situations. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.28 +Date: 24. 12. 2020 + Changes: + - Mod option to enable/disable pylon chargin points is now set to disabled by default. + + Compatibility: + - Industrial Revolution 2 is marked as incompatible. Reason: Fails to load with both mods installed. Proper mod compatibility is planned for later. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.27 +Date: 23. 12. 2020 + Changes: + - Material fabricator has built-in modules. It is 10 times faster but uses more energy. Tech and recipe have changed. + - Added glow effects for supercomputer 4 and some science pack icons. + + Bugfixes: + - Fixed High temperature turbine being less efficienct than stated. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.26 +Date: 17. 12. 2020 + Bugfixes: + - Fixed that some surface trim safety measures were not working. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.25 +Date: 17. 12. 2020 + Bugfixes: + - Fixed debug code left in printing "revived" whenever a pylon sub-entity was restored from a ghost. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.24 +Date: 16. 12. 2020 + Changes: + - Auto glaive will switch off if all enemies are removed and give an alert with the emitter location. + - Reduced spaceship floor walking speed. (Less likely to phase through walls with exoskeletons.) + - Tweaked solar forumula to reduce interstellar light. + - A secret thing now has an alternate graphics version. + - Added a few fast belts to early game space platform. + - Moved some material fabricator recipes to other machines. + - Removed normal pipe from space structure recipes. + - Removed assembling machine 2 from space assembling machine recipe. + + Compatibility: + - Structures that are actually cars are not blocked from space if their "effectivity" is 0. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.23 +Date: 13. 12. 2020 + Bugfixes: + - Fixed construction pylons couldn't be deconstructed by hand. + - Fixed addon pylon had outdate collision mask setting. + + Compatibility: + - Vulcanite smelting icons for other mod resources. + + Scripting: + - Added remote interface get_surface_type. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.22 +Date: 11. 12. 2020 + Changes: + - Construction pylons can now have blueprinted wire connections. + - Radar construction pylons now have a 4x4 logistic area, mainly for storage or buffer chests. + + Bugfixes: + - Moved material fabrication back in the tech tree to where you can actually use the recipes. + - Fixed error when trying to enter spoiler. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.21 +Date: 10. 12. 2020 + Changes: + - Spaceship console now outputs the A signal when anchored. The number is the zone id. + - Added beacons InformaTron page. + - Reduced or removed water loops in certain resource processing recipes. + + Bugfixes: + - Fixed changelog parse error. + - Fixed player falling out of capsule during rocket landing. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.20 +Date: 08. 12. 2020 + Changes: + - Updated Vulcanite map colour based on recent hue shift in the graphics mod. + - Added symbol to arcosphere icons. + - Added mini vulcanite icon to smelting-with-vulcanite recipes. + - Respawning now preserves inventory filters for character main, ammo, and weapon inventories. + + Bugfixes: + - Fixed that zone search was not working for delivery cannon UI. + - Fixed crash in spaceship launch code if an entity bacome invalid during the loop processing (spider leg). + +--------------------------------------------------------------------------------------------------- +Version: 0.5.19 +Date: 08. 12. 2020 + Changes: + - Added a spaceship filter to Universe explorer. + + Bugfixes: + - Fixed shpaceships not being assigned priority updates if the value was typed in. + - Fixed crash when launching a spaceship capsule due to the factorio rocket sound being shorter and the sound entity becoming invalid before the launch sequence ends. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.18 +Date: 07. 12. 2020 + Compatibility: + - Fixed spaceship asteroid spawning with Combat Mechanics Overhaul. + - Added remote interfaces for zone_get_surface and zone_get_make_surface. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.17 +Date: 06. 12. 2020 + Changes: + - You can now blueprint spaceship console output connections. + + Bugfixes: + - Fixed spaceship swapped structure fluid connections (grounded/spaced versions). + + Locale: + - Updated french translation thanks to Heinarc. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.16 +Date: 04. 12. 2020 + Bugfixes: + - Fixed error in Informatron display for CME warning peak power. + + Compatibility: + - Updated vehicle collision mask changes. It should be better for flying vehicles. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.15 +Date: 04. 12. 2020 + Changes: + - Collision util update: Added a new named collision mask for car-type vehicles and shuffled more collision mask layers around. This hopefully avoids some oversized train wagon issues. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.14 +Date: 03. 12. 2020 + Bugfixes: + - Fixed typo in Arcolink storage code causing crash on load. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.13 +Date: 03. 12. 2020 + Bugfixes: + - Fixed problem with Arcolink storage code handling events with invalid entities. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.12 +Date: 03. 12. 2020 + Changes: + - Changed to an extended collision mask util system that allows additional named layers and pass-through to the control phase. + - Increased tree collision boxes but the player won't collide with them. + + Bugfixes: + - Fixed problem with Arcolink storage displayed ID after movement. + - Fixed the you couldn't walk over pipes anymore. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.11 +Date: 02. 12. 2020 + Bugfixes: + - Fixed some problems with ruin generation in relation to how tiles are now stored in blueprints. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.10 +Date: 01. 12. 2020 + Changes: + - Experimental feature: Added Arcolink storage. Containers that are linked across space. + - Barrel to steel recycling cannot be done by hand anymore. + - Medpack moved from capsule "subgroup" to "tool". + - Trim surface now tells you the number of chunks removed. + - Added per-player option to disable the "Satellite discovered nothing message." + - Rocket science now needs a "satellite telemetry" from launching a satellite instead of consuming space platform. + - Updated Satellites informatron page. + - CME warning now show expected preak power. + - Made asteroid tile map color darker contrast more with space rails. + + Bugfixes: + - Fixed another "render_layer" requires string issue. + - Fixed scaling issue with core fragment icons. + + Compatibility: + - Marked "SpaceMod" as incompatible to avoid confusion. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.9 +Date: 30. 11. 2020 + Bugfixes: + - Fixed error in new scrapping recipe name and tech assignment. + - Fixed error with a certain space ruin spawning correctly. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.8 +Date: 29. 11. 2020 + Changes: + - Added surface scan update alerts so you don't accidently leave scans running.. + - Added some generic recycling recipes for items the become obsolete (substations, etc). + - Added new landfill recipes. + + Bugfixes: + - Fixed that a NPC would repeatedly say that "freeplay" mode had been unlocked when it already was. + - Fixed a 'ruin' running out of power. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.7 +Date: 29. 11. 2020 + Bugfixes: + - Fixed collision layer mismatch on control phase. + - Fixed losing first logistic slot setting on death. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.6 +Date: 28. 11. 2020 + Changes: + - Updated some collision layer logic. + - You can now drop items on to space transport belt. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.5 +Date: 26. 11. 2020 + Bugfixes: + - Fixed crash on zone priority change (another number in textfield issue). + +--------------------------------------------------------------------------------------------------- +Version: 0.5.4 +Date: 25. 11. 2020 + Bugfixes: + - Forced all (found) instances of all numbers assigned to textfields to strigns first to avoid new Factorio 1.1 error. + - Fixed issues with spaceship console display. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.3 +Date: 25. 11. 2020 + Bugfixes: + - Fixed overhead buttons having broken styling by the Factorio 1.1 update. + - Fixed error on death. + - Fixed error when trying to anchor (you may need top close and open the console to click the button). + - Fixed rocket fuel from water tech icon scaling. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.2 +Date: 25. 11. 2020 + Bugfixes: + - Fixed crash on starmaps and universe explorer due to API changes. + +--------------------------------------------------------------------------------------------------- +Version: 0.5.1 +Date: 24. 11. 2020 + Info: + - Updated for Factorio 1.1. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.51 +Date: 22. 11. 2020 + Bugfixes: + - Fixed deep space transport belt recipe returning 0 belts. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.50 +Date: 22. 11. 2020 + Changes: + - Added Delivery Cannon button to show the structure. + + Bugfixes: + - Fixed issues with placing delivery cannons in moon orbit and certain other locations. + - Fixed issue trimming surface with secret structures. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.49 +Date: 20. 11. 2020 + Changes: + - Added Delivery Cannons Informatron page. + - Added Arcospheres Informatron page. + + Compatibility: + - AbandonedRuins: Fixed issue with previous update. + - Incompatible with Factorio Extended & Factorio Extended. Reason: Community suggestion (balance and different game direction). Can be bypassed by removing "! FactorioExtended-Core" and "! FactorioExtended-Plus-Core" from info.json (not recommended, you won't get any support for issues). + +--------------------------------------------------------------------------------------------------- +Version: 0.4.48 +Date: 19. 11. 2020 + Changes: + - Important: Changed universe resource alloation to ignore resource-locked worlds from the distribution quotas. On existing games it may cause roughly 1% of planets or moons to change their primary resource but the changes won't take effect unless something else changes reosurces in the future and triggers the resource distribution code. You can use the following command to force the changes now, this is advisable if you have not settled many worlds. + - /c remote.call("space-exploration", "rebuild_universe_resource_assignments", {}) + - Logging out of multiplayer now exits satellite mode and puts you back in your character. + - Ghost entities no longer prevent surface deletion. + - Reduced wood growth returned water to 125 from 250. + + Bugfixes: + - Fixed issue with star and asteroid belt distribution code moving the whole universe down by about 200 interstellar units. + - Fixed that after the ruins update multiplayer new planet starts could overlap ruins. + - Fixed that particle collider and material fabricator had wrong glow colours. + + Compatibility: + - AbandonedRuins: Excluded more surfaces by name. + + Locale: + - Updated zh-Cn translation. + - Updated pl translation. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.47 +Date: 10. 11. 2020 + Bugfixes: + - Fixed that spaceship speed control from signals stopped working. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.46 +Date: 10. 11. 2020 + Bugfixes: + - Fixed issue with previous update, spaceships losing track of engines. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.45 +Date: 09. 11. 2020 + Bugfixes: + - Fixed issue if spaceship engine is removed/invalid while flying. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.44 +Date: 07. 11. 2020 + Changes: + - Spaceship engines now get a thrust boost if they have empty space behind them. + + Compatibility: + - Krastorio 2: Singularity reactor now applies structural stress to spaceships. + + Locale: + - Fixed some typos. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.43 +Date: 04. 11. 2020 + Changes: + - Changed some code related to teleporting a character not attached to a player to a different surface. + - Added exploration journal entries for players that have met the victory conditions (requires completion after this update). + - Recycling scrap is faster. + + Bugfixes: + - Fixed crash in WDC auto-bombardment code. + - Fixed other zones inheriting Nauvis width/height (fix will not affect already generated surfaces). + +--------------------------------------------------------------------------------------------------- +Version: 0.4.42 +Date: 03. 11. 2020 + Changes: + - Added Trim Surface button (use with caution). + + Bugfixes: + - Fixed crash if satellite-mode inventory was changed while a non-entity inventory was opened. + - Fixed issue if tiles became invalid during spaceship integrity check. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.41 +Date: 31. 10. 2020 + Changes: + - Moved steam to water recipe to electric boiler tech (pre-rocket science). + - Moved water ice to water to cryonite processing tech (pre-rocket science). + + Bugfixes: + - Fixed issue opening secret console. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.40 +Date: 27. 10. 2020 + Changes: + - Added automaic Weapons Delivery Cannon retargeting option. + + Bugfixes: + - Fixed duplicate tile refund issue. + - Fixed a performance issue with the final catch-all step of glaive target finding on large fully-explored planets (20000ms down to 200ms in tests). + +--------------------------------------------------------------------------------------------------- +Version: 0.4.39 +Date: 27. 10. 2020 + Bugfixes: + - Hotfix for interior tiles spawning on planet surfaces. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.38 +Date: 26. 10. 2020 + Bugfixes: + - Hotfix for satellite mode issue. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.37 +Date: 26. 10. 2020 + Changes: + - Flying bots won't stop spaceship landings. + + Bugfixes: + - Fixed crash when winning a minigame but inventory was full. + + Compatibility: + - Support for "spidertron-remote-waypoint" and "spidertron-remote-patrol" in satellite mode. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.36 +Date: 24. 10. 2020 + Info: + - Ruins update + + Changes: + - A new system for ruins and other sites found on planets surfaces. The new system can support non-blueprintable items, terrain modification, scripted updates, new exploration mechanics, and new capture mechanics. + - 3 ruins have been added in this update. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.35 +Date: 23. 10. 2020 + Changes: + - Most specialist science pack recipe yields have been increased, but they now require some of the associated resource manufactured items. + + Bugfixes: + - Fixed crash with scripts setting tiles. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.34 +Date: 23. 10. 2020 + Changes: + - Updated Informatron page for cargo rockets. + - Increased significant data from simulation. + - Added 7-length long junction pipe. + - Added 15-length long straight pipe. + - Reduced long pipe craft time. + - Moved Naquium heat pipe to naquium processing temporarily. + - Added polished data substrate via chemical gel recipe. + - Delivery cannons now lose their target coordinates when you change the target zone. This means that when you start to choose a target you default to the last-viewed location for the new surface instead of a coordinate relative to the previous surface. + - Fixed neural supercomputers not upgrading to the higher tier using the upgrade planner. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.33 +Date: 19. 10. 2020 + Changes: + - Increased core miner resistances (vs meteors in particular). + - Decreased delivery cannon chest explosion resistance from 99% to 75%. + + Bugfixes: + - Fixed crash if energy beam switches surfaces while active and in auto mode. + - Fixed spaceships dropping of the solar system map if their destination is another spaceship. + + Compatibility: + - Fixed ruins from the AbandonedRuins appearing is certain zones. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.32 +Date: 17. 10. 2020 + Changes: + - Increased insight returned from higher tier recipes. + - Reduce naquium cost of cubes. + - Reduce vitalic acid cost of naquim plate. + + Bugfixes: + - Fixed crash if cargo pod become invalid during landing/disassembly sequence. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.31 +Date: 15. 10. 2020 + Bugfixes: + - Fixed problem with arcosphere collection record assignment. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.30 +Date: 14. 10. 2020 + Changes: + - Superchargers now have a setting for individual charging port rates, defaulting to 90 MW per port (charges a vanilla robot to full in one tick). + + Bugfixes: + - Fixed crash if someone had a specific permission group, they entered sat-nav mode, their previous permission group was deleted, then they exited sat-nav mode. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.29 +Date: 09. 10. 2020 + Bugfixes: + - Fixed crash if opening the universe explorer after a detatched character became invalid. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.28 +Date: 09. 10. 2020 + Changes: + - Added weapons delivery cannon Plague rocket recipe. + - Simplified weapons delivery cannon Atomic bomb recipe. + + Bugfixes: + - Fixed issue with meteor timers. + - Fixed issue where the technology screen could be forced over the spaceship anchor mode and trap you in the technology screen. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.27 +Date: 08. 10. 2020 + Bugfixes: + - Fix occasional crash when spaceship takes off/lands while a shield projector barrier was invalid. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.26 +Date: 07. 10. 2020 + Changes: + - Improved spaceships and shield projectors UPS performance + - Spaceships can't land on non-neutral entities. + - Condenser turbines can now accept multiple temperatures. + - Meteors have zone-specific timers instead of a universal timer. + + Bugfixes: + - Fix for arcopshere polarisation. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.25 +Date: 04. 10. 2020 + Locale: + - Fixed Earnded -> Earned + + Changes: + - Updated recommended mod list in Informatron to match the wiki. + - Added section about experimental status to Informatron. + + Compatibility: + - Removed the incompatibility flag for fluid-memory-storage and deep-storage-unit (previous issue should be resolved by an upcoming change in those mods, memory element should also appear later in the tech tree). + +--------------------------------------------------------------------------------------------------- +Version: 0.4.24 +Date: 04. 10. 2020 + Changes: + - Renamed laboratories to facilities (except the space lab). + - Added a new climate tag for universe generation. + - Added planet Vorlon for new universes. + + Bugfixes: + - Added a secondary failsafe to some secret code. + + Compatibility: + - Marked fluid-memory-storage and deep-storage-unit as incompatible due to cloning bug and other spaceship issues. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.23 +Date: 02. 10. 2020 + Bugfixes: + - Fixed crash from delivery cannon being built by bots. + - Fixed missing locale for mode toggle change. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.22 +Date: 02. 10. 2020 + Changes: + - Scanning via satellite now works differently. It doesn't request a large area and let the factorio internal buffer work through it anymore. Instead it uses an scripted search cursor and custom search patern with mod options to control scan speed. The search buffer lets it skip through already scanned tiles. The chart buffer lets it scan more chunks in parallel. + + Bugfixes: + - Fixed issue if rocket launched with modded items and the mod was removed before landing. + - Fixed advanced neural gel recipe returning an extra card. + - Fixed typo, orgianic is not a word. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.21 +Date: 01. 10. 2020 + Changes: + - Nexus now ramps up to the final power level as speed increases. + + Bugfixes: + - Fixes nexus phantom power draw after landing the spaceship (part of the composite entity was left behind). + - Fixed issue with condenser turbine and big turbine internal storage tanks (part of the composite entity). + +--------------------------------------------------------------------------------------------------- +Version: 0.4.20 +Date: 30. 09. 2020 + Changes: + - When a spaceship launches/lands all inserters and pump are paused for 1 tick. This avoids Factorio's issue with cloned circuit networks not having signals for 1 tick. (The same fix can't be used for transport belts without some weird hacks.) + + Bugfixes: + - Fixed that homeworlds overwriting waterless planets still had waterless planet restrictions. + - Fixed error on CME if there was a deleted force in the game. + - Shield projector shields triggered damaged entity alerts. + - Fixed Nexus Dimension Drive recipe was not displaying the recipe name properly. + + Compatibility: + - Miniloaders: Added a fix for miniloaders after area cloning command (spaceship surface change). + +--------------------------------------------------------------------------------------------------- +Version: 0.4.19 +Date: 29. 09. 2020 + Changes: + - Buffed accumulators. + - Reduced Nexus critical speed back to 250 and Distortion Drive power draw to 8GW. + - Reduced Factory Spaceship tech cost. + - Glacier ammo on moving spaceship now slides backwards. + - Glacier ammo does not use the generic slowdown sticker anymore (uses an invisible version instead). + - Increased default meteor max interval to 30 minutes. + - Added some naquium processors to a secret thing. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.18 +Date: 28. 09. 2020 + Changes: + - Added Universe Explorer text explaining resource estimates and tile requirements. + + Bugfixes: + - Fixed crash if someone died with an inventory filter, logged out of multiplayer, the mod that created the item for the filtered slot was removed, then the player logged back in and respawned. + - Fixed issue with multiplayer multi-planet start: starting mini-resource-patches were not spawning properly. + - Fixed crash from delivery cannon on secret surface. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.17 +Date: 27. 09. 2020 + Changes: + - Arcosphere collection now benefits from collection from different asteroid fields. + + Bugfixes: + - Fixed crash if space capsule shadow got unexpectedly deleted. + - Fixed issue with multiplayer multi-planet start system not overwriting the original planet's seed fully (so may have responded to changes in resource settings, or additional homeworlds being added, changing the resource distribution differently from nauvis). + +--------------------------------------------------------------------------------------------------- +Version: 0.4.16 +Date: 27. 09. 2020 + Bugfixes: + - Fixed problem with earlier migration code. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.15 +Date: 25. 09. 2020 + Bugfixes: + - Fixed some DSS science and catalogue crafting times. + - Fixed condenser turbine process icon size. + - Fixed issue with multiplayer multi-planet test code. + + Compatibility: + - Added match_nauvis_seed as a flag for the test multiplayer multi-planet code: /c remote.call("space-exploration", "setup_multiplayer_test", { force_name = "player-2", players = {game.player}, match_nauvis_seed = false}) + +--------------------------------------------------------------------------------------------------- +Version: 0.4.14 +Date: 25. 09. 2020 + Changes: + - Changed arcosphere polarisation to not give a random number of results. + + Bugfixes: + - Fixed issue with cargo rocket silo destination list. + - Fixed wrong prototype type check in delivery cannon code (only affected mod compatibility). + - Updated remaining icon changes to include the mipmaps specification. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.13 +Date: 25. 09. 2020 + Changes: + - Added 2 additional arcosphere recipes folding recipes. + + Bugfixes: + - Fixed issue with getting detination list for cargo rocket silo with no destination. + - Fixed some issues with merging forces. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.12 +Date: 24. 09. 2020 + Changes: + - AAI Signal Transmission is now required. This was requested a lot, if you don't want it just edit the info.json file. + - Moved fluid isothermic generator earlier in the tech tree. + - Spaceship streamlining is easier, especially for smaller ships. + + Bugfixes: + - Fixed typo in delivery cannon code (only affected mod compatibility). + +--------------------------------------------------------------------------------------------------- +Version: 0.4.11 +Date: 22. 09. 2020 + Changes: + - Increased output slots of space probe silo.. + - Items that stack to 1 are now perfectly safe in rockets. + + Bugfixes: + - Fixed problem with migration script from v0.3 to v0.4 relating to factory spaceship techs. + - Fixed the DSS1 returned neural gel and other packs did not require it at all. + - Fixed DSS catalogues required wrong temperature of thermofluid. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.10 +Date: 22. 09. 2020 + Changes: + - Added a warning if a space probe is launched from the wrong location. + + Bugfixes: + - Fixed that antimatter spaceship engine and booster still required naquium procesor. + + Locale: + - Removed duplicate key from Polish translation. + + Compatibility: + - Added remote interface for get_on_player_respawned_event. on_player_respawned returns the player index after the player has been given a fresh character on the proper surface. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.9 +Date: 21. 09. 2020 + Bugfixes: + - Fixed that you could enter interstellar map mode any time you did not have a character attached. + - Fixed some spaceship event were not triggering when placing entities. + - Fixed CMEs could target star surface directly (should only be solar orbit). + - Fixed overhead buttons would not appear immediately. + + Locale: + - Removed duplicate key from zh-CN translation. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.8 +Date: 20. 09. 2020 + Bugfixes: + - Fixes issue loading in low-resolution mode. + - Fixed issue with certain v3 techs being locked on transition to v4. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.7 +Date: 19. 09. 2020 + Changes: + - Added solar system map and updated interstellar map (thanks to contributions from wladekb). + - Deep space zones now have a minimum distance between them. + - Moons are now more evenly distributed in the planet gravity well. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.6 +Date: 17. 09. 2020 + Changes: + - Increased space probe rocket cost. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.5 +Date: 17. 09. 2020 + Changes: + - Added space probe rocket silo. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.4 +Date: 15. 09. 2020 + Bugfixes: + - Fixed some inconsistencies with the tech tree. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.3 +Date: 14. 09. 2020 + Bugfixes: + - Fixed some inconsistencies with the tech tree and recipes. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.2 +Date: 13. 09. 2020 + Changes: + - Decreased cost of nanomaterial (result count from 10 to 16). + - Decreased vitalic acid cost of naquium powder from 10 to 5. + - Added basic streamline description to spaceships Informatron page. + - Fixed some broken image links in Informatron. + - Added migration code to change Universal Catalogue to Deep Space Catalogue 1. + - Added added migration code to preserve factory spaceship levels up to level 4. + +--------------------------------------------------------------------------------------------------- +Version: 0.4.1 +Date: 12. 09. 2020 + Info: + - The DSS Update (Deep Space Science overhaul) + + Changes: + - There is now a Spaceship Victory Condition. Build a high speed spaceship and power a special device to win the game. + - There are now 4 tiers of Deep space science. Most useful stuff is unlocked in tiers 1 and 2, but tier 4 is required for the spaceship victory. + - Added some new and unique ways to make data. + - The final tier of energy science requires sending probes into stars. + - The final tier of astronomic science requires sending probes around asteroid belts. + - Some data can only be generated on a moving spaceship. + - Arcospheres can be collected from the interstellar void with diminishing returns. They are never consumed and only act as catalysts, but are difficult to cycle. + - Many deep space science level recipes have been rebalanced. + - Spaceships now have a streamline mechanic (you may have noticed that this area of space has a lot of rocks), so cut those corners off your box ships for some extra speed. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.140 +Date: 20. 09. 2020 + Bugfixes: + - Fixes error if assigning a player to the neutral force. + + Compatibility: + - Fixed issue placing transport drones road on Nauvis. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.139 +Date: 19. 09. 2020 + Bugfixes: + - Fixes issue preventing space platform placement. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.138 +Date: 19. 09. 2020 + Bugfixes: + - Fixes that small starting resource patches could generate an error if trying to place an entity with a resource value above 0 but less than 1. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.137 +Date: 19. 09. 2020 + Bugfixes: + - Fixed issue where personal roboport active status would get reset by spaceship landing. + - Fixed electric boiler water pass-though. + + Compatibility: + - Fixed Transport Drones mod would let you place land in space. + - Fixed crash if a mod remove some of the starting resource eneities from the game. + + Locale: + - Fixed duplicate keys in Czech locale. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.136 +Date: 16. 09. 2020 + Bugfixes: + - Fixed K2 atmospheric condensers crashing on placement on zones that do not have zone tags (ex. Nauvis). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.135 +Date: 16. 09. 2020 + Changes: + - Added electric boiler active heat / lighting effects. + - Internal force data now tracks whether or not a force has had players. This is used for CME events and prevents timers from being reset by players switching forces in single player. + + Compatibility: + - Prevents K2 atmospheric condensers on planets/moons with no water/atmosphere (I know you should need lifesupport on these planets but that is coming later). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.134 +Date: 16. 09. 2020 + Bugfixes: + - Fixed that delivery cannons could not target moon orbits. + - Fixed electric boiler was restricted to land by type change. + - Reduced mixed core fragment (from Nauvis) vulcanite yeild in line with other resources. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.133 +Date: 15. 09. 2020 + Changes: + - Removed Beryllium from planet and moon orbits. This will trigger the "resources have changed" warning but don't worry about that. + - Added some small starting resource patches that have a guaranteed resource value and are close together. These patches are scripted so won't appear on the pre-game preview, and can be disabled with a mod setting. + - Changed core mining output to be proportional to planet size. For an average Nauvis this means roughly double the fragments. + - Mixed core fragment (from Nauvis) has reduced vaues for most resources (-50%). + - Removed setting for electric boiler. + - Electric boiler is now a crafting machine and you can choose the steam temperature (or evaporate away water). + - Added a logging system for some secret stuff. + + Bugfixes: + - Fixed issue with spaceship distance output stuck at -3. + - Fixed issue where spaceship with signals to land on a deleted surfaces would cause the deleted surfaces to respawn. + - Dying now plays the game lost sound from vanilla (was missing due to the respawn mechanic). + + Compatibility: + - se_allow_in_space now works for containers. + - Marked ModMash as incompatible due to crashes. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.132 +Date: 12. 09. 2020 + Bugfixes: + - Fixed a spacehip crash if an entity became invalid mid-script. + - Fixed a spacehip crash if the destination surface was deleted while checking for docking clamps. + + Locale: + - Czech translations thansk to xXmirechekXx. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.131 +Date: 07. 09. 2020 + Changes: + - Optimised some on_configuration_changed code it is around 428x faster now. + + Bugfixes: + - Reduced popping sound when looping secret structure's audio. + - Fixed that jetpack could get disabled after entering and exiting a rocket silo without launching. If you can't use jetpack it will fix itself after you ride a rocket, or use the command: /c remote.call("jetpack", "unblock_jetpack", {character=game.player.character}) + +--------------------------------------------------------------------------------------------------- +Version: 0.3.130 +Date: 06. 09. 2020 + Changes: + - Preliminary support for the merge_forces command. + + Bugfixes: + - Deleted leftover permission groups from previous versions. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.129 +Date: 06. 09. 2020 + Bugfixes: + - Fixed permission states of players that may be stuck with satellite permissions while not in satellite mode. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.128 +Date: 06. 09. 2020 + Bugfixes: + - Satellite mode no longer forgets prior permissions mistakenly. If you have used satellite view in 0.3.127, please check over permissions. If you're unsure, just run the command "/c game.player.permission_group = nil" when outside of nav view. -ACTingKris + +--------------------------------------------------------------------------------------------------- +Version: 0.3.127 +Date: 06. 09. 2020 + Changes: + - Satellite mode now inherits the player's existing permissions group, clones the settings, then applies additional restrictions. When the mode ends the player is set back to the previous permissions group. + + Bugfixes: + - Fixed that you couldn't stay in a cargo rocket silo during launch if the entrance was on empty space. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.126 +Date: 04. 09. 2020 + Changes: + - Updated Space Exploration map gen settings preset: Larger starting area, reduced evolution. + + Bugfixes: + - Fixed issue boarding one spaceship from another. + - Fixed Calidus (and other homeworld systems) skipping asteroid field 2 (this won't fix existing saves as changing the name can cause issues). + - Fixed issues with legacy tech trees after configuration changes (Note: It is not recommended to add SE to existing games). + - Fixed that Umbrellas on the same surface would not share the load. + + Locale: + - Several spelling and grammar fixes and improvements (by ACTingKris). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.125 +Date: 31. 08. 2020 + Bugfixes: + - Fixed crash when checking for defence against delivery cannon projectiles but a defence was invalid. + - Fixed invalid gps tag surface name for rocket crash on Nauvis. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.124 +Date: 29. 08. 2020 + Changes: + - Forces added by other mods that don't have any players (e.g. K2 radiation force) won't have their own Coronal Mass Ejection timers. + - Corpses (includes scorch mark entities) do not block tile deconstruction orders. + - Random landing pad and random spaceship respawn options have been replaced with closest landing pad and closest spaceship respawn options (by ACTingKris). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.123 +Date: 27. 08. 2020 + Changes: + - Reduced meteor defence power draw. + - Added Iridium Piledriver recipe to Weapons delivery cannon. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.122 +Date: 25. 08. 2020 + Bugfixes: + - Fixed missing passive draw from meteor defences. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.121 +Date: 25. 08. 2020 + Changes: + - Deconstruction of tiles is canceled if an entity over it would be destroyed. + + Bugfixes: + - Fixed incorrect Coronal mass ejection power requirement in space. + - If a surface is deleted then any player last-looked locations are cleared (in case the surface ID is used for something else). + - Fixed that meteor defences power supply area was reduced in the previous update. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.120 +Date: 25. 08. 2020 + Changes: + - Added overchage mode to point defence, 'rotate' them to enable a low idle power draw, high recharge mode. Warning - Causes base brownouts while recharging. Energy per shot unchanged. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.119 +Date: 23. 08. 2020 + Bugfixes: + - Fixed issuse with Coronal mass ejection zone selection code. + + Locale: + - Fixed some typos. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.118 +Date: 23. 08. 2020 + Bugfixes: + - Fixed issue with new CME formula not returning a value. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.117 +Date: 23. 08. 2020 + Changes: + - Coronal mass ejection cannot target deep space zones. + - Reduced Coronal mass ejection strength in space (does not get the 5x solar power boost so is similar to the strength on the planet below). + - Increased minimum Coronal mass ejection timer when updating existing games. + - Updated locale to state that only one umbrella is needed per surface vs Coronal mass ejections. + + Bugfixes: + - Fixed that Weapons delivery cannon could not be placed in space. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.116 +Date: 23. 08. 2020 + Bugfixes: + - Fixed that the live update of Coronal mass ejection warning would not be given an expected energy value and default to the locale substitution index (3). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.115 +Date: 23. 08. 2020 + Bugfixes: + - Fixed crash on energy beaming informatron page. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.114 +Date: 23. 08. 2020 + Changes: + - Added Energy beaming, can be used as a weapon across surfaces, or to beam power. + - Added Coronal mass ejections a dangerous new threat that is rare and has early warnings. + - Added Umbrella: Energy beam defence, to defend against energy beam weapons and coronal mass ejections. + - Added Weapons delivery cannons, can fire nukes at surfaces. + - Delivery cannons now have an off switch. + - Meteor defences now shoot down enemy delivery capsules. + - Space accumulators can now used on the ground, renamed based on material. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.113 +Date: 21. 08. 2020 + Changes: + - Added alternate processing unit recipe using holmium cable (by ACTingKris). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.112 +Date: 16. 08. 2020 + Bugfixes: + - Fixed issue with migration code where landed spaceships could cause areas of space to appear on land. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.111 +Date: 16. 08. 2020 + Changes: + - Players are now put back into vehicle they were in before a shaceship changed surfaces. + - Trains now remember automatic/manual state when changing surfaces via spaceship. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.110 +Date: 15. 08. 2020 + Changes: + - Moved processed fuels into the same area. + - Spidertron can now be deployed from cargo rockets. + + Bugfixes: + - Fixed crash when spaceship tries to update console signals but console was destroyed. + - Added cleanup code to fix broken tiles on surfaces. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.109 +Date: 15. 08. 2020 + Changes: + - Players are now ejected from vehicles if they are on a spaceship when it changes surfaces (prevents loss of character). + - Spaceship now takes fuel more evenly from booster tanks. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.108 +Date: 14. 08. 2020 + Changes: + - Allowed Spidetron remote from satellite view. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.107 +Date: 14. 08. 2020 + Changes: + - Allowed Spidertron in space. + - Increased turret damage vs spaceship obstacles, increase spaceship obstacle hp, decreased spaceship obstacle resistances. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.106 +Date: 14. 08. 2020 + Changes: + - Spidertron update. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.105 +Date: 10. 08. 2020 + Changes: + - Rocket crashes now provide a gps tag. + - Meteor alert gps tags now include the surface. + - Altered meteor random landing so that it has a chance to hit bases that are constructed a long way from the surface origin. + + Bugfixes: + - Fixed that mining naquium heat pipe retuned normal heat pipe. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.104 +Date: 09. 08. 2020 + Bugfixes: + - Hotfix for rocket crash code. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.103 +Date: 09. 08. 2020 + Changes: + - Spaceship floor ghost is now automatically placed if spaceship floor is removed by asteroid collisions. + + Bugfixes: + - Fixed most situations where composite entities (Condenser turbine) would get broken due to spaceship floor removal (asteroid damage). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.102 +Date: 09. 08. 2020 + Locale: + - Added Polish translation. + + Bugfixes: + - Fixed that beacon overload caused a crash. + - Off-course rockets now track cargo pods as consumed. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.101 +Date: 06. 08. 2020 + Bugfixes: + - Fixed that if a beacon overloaded entity was enabled by another mod it could get a 2nd permanent overload icon. + - Fixed missing prerequisite on thruster suit 4: self seling gel. + + Compatibility: + - Orbital ion cannon remote can now be used from satellite mode. + - Fixed incompatibility with mods using different tech complexity format. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.100 +Date: 29. 07. 2020 + Bugfixes: + - Fixed issue with previosu migration code. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.99 +Date: 29. 07. 2020 + Bugfixes: + - Fixed remaining issues left in game saves resulting from a previous issue. Some saves may have secret content re-shuffled. This is not a problem unless you have additional notes outside the game, in which case they may not match you game save anymore. If a shuffle took place the text will be "Migrate.v0_3_99" in your log file. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.98 +Date: 28. 07. 2020 + Bugfixes: + - Fixed issue with mapping some secret things to some other secret things. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.97 +Date: 27. 07. 2020 + Changes: + - Decreased radar pylon update scan frequency (improves UPS). + - Added mod option to remove charging points from construction pylons. This helps control bot charging behaviour, but you may need to add other charging options along long distance routes. + + Bugfixes: + - Fixed that cargo rocket silos were not properly resetting the sections and capsules consumed. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.96 +Date: 26. 07. 2020 + Changes: + - Reduced the number of situations where beacon overload affects other modded entities (e.g. transport drone structures). + - Spaceship console output now updates immediatly after a manual destination change via the UI. + - Added next-upgade definitions for Space Solar Panels and Wide Area Beacons. (Thanks to Mylon) + - Improved Cargo rocket part tracking. (Thanks to Mylon) + + Locale: + - Changed all instances of Bio Sludge to Biosludge. + + Scripting: + - Added an interface call for on_entity_activated after beacon overload is stopped so other mods can disable the entity for other reasons. + + Bugfixes: + - Fixed spaceship clamps not being deconstructible. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.95 +Date: 20. 07. 2020 + Changes: + - Reduced width of Universe Explorer (zonelist). + - Beacons won't overload entities that can't benefit from beacons (e.g. steel furnace). + + Bugfixes: + - Fixed missing description on spaceship clamp item. + - Fixed pylon internal roboport connection distance (64 to 32 tiles). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.94 +Date: 18. 07. 2020 + Changes: + - Changed auto-scanning routine for planets and moons (better fits the circle instead of scanning a square). + + Bugfixes: + - Fixed problem with discovering some moons which could cause no zones to be discovered by a satellite even when there were moons left to discover. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.93 +Date: 15. 07. 2020 + Changes: + - Conditionally changed the plague sticker graphic for furutre Factorio update (would otherwise break when the update hits). + + Bugfixes: + - Fixed GPS tag behaviour for when satellite is still locked. + - Removed hidden flags from railgun. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.92 +Date: 13. 07. 2020 + Changes: + - Lifesupport Informatron page. + - Naquim tessaract now requires nano material. + + Bugfixes: + - Fixed that some recipes required nano material but did not have the tech as a prerequisite. + - Fix for jetpack while flying around moving spaceship. + - Fixed some material fusion card return rates. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.91 +Date: 10. 07. 2020 + Changes: + - If satellite mode is unlocked, clicking a GPS tag activates nav-view at the specified location. (Cannot work for damage alerts due to engine limitation - no event is fired.) + - Added potential planet/moon Marquardt. + + Bugfixes: + - Fixed spaceship solar power transition to interstellar space. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.90 +Date: 09. 07. 2020 + Scripting: + - Added remote interfaces for: lock_player_respawn_location, unlock_player_respawn_location, get_known_zones. + + Bugfixes: + - Fixed Astrobionic Simulation took 90 seconds instead of 120 like the other tier 3 simulations. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.89 +Date: 07. 07. 2020 + Changes: + - Cargo rocket silos with variable destinations now display safety percentages as "Variable" instead of worst-case values. + + Bugfixes: + - Fixed issue with cargo rocket item loss. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.88 +Date: 07. 07. 2020 + Changes: + - The first meteor of the game had a timer reduction, this has been removed (was 7.5 minutes, now up to 15). + + Bugfixes: + - Removed debug code from Core miner (sorry about that). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.87 +Date: 30. 06. 2020 + Changes: + - Particle stream recipe now requires 5 sand, yield increased from 100 to 200. + - Material fabrication loss of data card recuced from 5% to 1%. + - Changed addon power pole collision layer to layer-13 (same as walls block spitters) projectile collision. This means that they can be placed on more entities, but not directly on walls or certain tiles or entities modified by other mods. + + Compatibility: + - Ruin remnant entities now support modded entities with the .icons format. + - Krastorio 2: Removed Imersium and Mineral water from generic core fragment. + - Krastorio 2: Added ability to get matter from sand. + + Bugfixes: + - Fixed issue with core miners being revived by bots not mining (existing broken entities need to be replaced). + - Fixed error when trying to board another spaceship. + - Fix for low-solar surfaces having solar multiplier that was lower than intended. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.86 +Date: 29. 06. 2020 + Bugfixes: + - Fixed bug with low-solar space zones having 0 solar dut to incorrect time of day. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.85 +Date: 27. 06. 2020 + Changes: + - Planet size now has a slight negative impact on the solar value of a surface. + + Bugfixes: + - Fixed some inaccurate solar % display values. + - Fixed potential issue with respawn code and logistic slots. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.84 +Date: 22. 06. 2020 + Bugfixes: + - Fixed some iridium moons having an invalid climate tag (moisture_very_low should be moisture_low). Surfaces already settled won't be corrected, the effect on gameplay is not significant. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.83 +Date: 22. 06. 2020 + Changes: + - Added mod setting for deep space belt speed. + - Alternate medpack 1 recipe uses only resources that can be automated. + + Bugfixes: + - Fixed updaetd factorio beacon not displaying contained modules in alt mode. + - Fixed that starting satellite would always spawn in Nauvis orbit for multiplayer multi-planet setting. + - Fixed issue deleting a surface when a player was viewing the surface via satelliate: that player was sent back to Nauvis instead of their homeworld. + - Fixed error placing tiles in editor mode. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.82 +Date: 17. 06. 2020 + Changes: + - Placed tiles should (normally) not remove resources anymore. There will be the usual excpetions for water-based resources + landfill, etc. + + Bugfixes: + - Fixed some code where the Universe Explorer was able to find the default or previously selected zone for the sidepanel. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.81 +Date: 16. 06. 2020 + Bugfixes: + - Added missing locale for cryogun attack modifiers. + - Fixed issue with setting up multiplayer homeworld. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.80 +Date: 15. 06. 2020 + Changes: + - Railgun has incresed damage, decresed cooldown, and reduced movement penalty. + + Bugfixes: + - Fixed multiplayer homeworlds not inheriting the nauvis planet radius setting (map gen should have been correct though). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.79 +Date: 12. 06. 2020 + Changes: + - Improved reliability of spaceship console returned signals. + - Spaceship console now returns distance of -1 if arrived but not anchored, -2 if anchored at the destination, or -3 if no destinationis set. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.78 +Date: 11. 06. 2020 + Bugfixes: + - Fixed issues with spaceship clamps checking the wrong tiles. + - Fixed universe explorer close button stipped working. + + Changes: + - Spaceship clamps now flash red the problem tiles if they cannot be placed. + - Spaceship asteroids are more resistant to personal laser defense. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.77 +Date: 10. 06. 2020 + Changes: + - Added filters to Universe Explorer (can exclude planet and moon orbits for example). + - Added a basic display for planet climate tags (WIP). + - Added alert icon to machines with beacon overload. + + Bugfixes: + - If doing multiplanet multiplayer, you now respawn on the correct planet. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.76 +Date: 09. 06. 2020 + Changes: + - Cargo rocket silo can now move items with data (blueprints, equipment, etc) without clearing internal data. + - Optimisation: Updated some code to use Factorio built-in events instead of virtual events for player opened and selected. (Built-in events were's available when oiginal code was written). + - Optimisation: Updated cargo rocket silo code to use some new inventory functions. + + Bugfixes: + - Fixed a crash on spaces/grounded entity swap. + - Fixed incorrect module tier 2 and 3 crafting times. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.75 +Date: 09. 06. 2020 + Bugfixes: + - Fixed invalid image link in Informatron. + + Changes: + - Decreased cost of naquium cube (1 catalogue per 16 cubes instead of per 4). + - Decreased cost of deep space science pack (produces 10 packs instead of 4). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.74 +Date: 08. 06. 2020 + Bugfixes: + - Fixed a crash with lifesupport gui when on an unknown surface. + - Issue with Nauvis having climate tags on some saves that prevents waterfill. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.73 +Date: 04. 06. 2020 + Changes: + - Increased base density of uranium, copper, stone, and coal. + - Added more functions for multi-planet start multiplayer. There is an experimental test function in scripts/remote-interface.lua (setup_multiplayer_test). + - Added upgrade planner path from Thermal radiator 1 to 2. + + Compatibility: + - Added some more Krastorio2 compatibility features (delivery cannon recipes, recpe changes, resource settings, core fragment yeields). There is still a lot of work to do on the tech tree especially in regard to removing optimization science from certain techs to move them back up the tech tree. + - If a mod adds radiation damage then thruster suits now have some resistnace to it. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.72 +Date: 04. 06. 2020 + Bugfixes: + - Fixed that medpack still needed logistic science pack. + + Compatibility: + - Added code to log the mods list, if other mods have the same code the list will be logged only once. If other mods also elog the mods list it is encouraged to read and write the logged_mods_once flag so it won't get logged multiple times. Other mod makers can copy the collowing line: + - if not logged_mods_once then logged_mods_once = true log("Log mods once: "..serpent.block(mods)) end + +--------------------------------------------------------------------------------------------------- +Version: 0.3.71 +Date: 03. 06. 2020 + Changes: + - Moved space lab module icons down. + - Updated code to check if a tech has an ingredient (thanks to walter). + - Added some code to prevent infinite water sources on planets that are specifically waterless (e.g. volcano worlds) + + Compatibility: + - Altered some code so that if some important entities on planets are destroyed due to tile changes under them (waterfill) it won't crash or break saved data. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.70 +Date: 03. 06. 2020 + Changes: + - Changed the basic medpack recipes. + + Bugfixes: + - Fixed an ingredient in the expensive version of space pipe. + - Fixed a tech unlock problem. + + Compatibility: + - Made Krastorio2's Imersite a non-homeworld resource. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.69 +Date: 01. 06. 2020 + Bugfixes: + - Fixed problem with a game-breaking test item being left in a blueprint. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.68 +Date: 01. 06. 2020 + Bugfixes: + - Fixed problem with a game-breaking test item being left in a blueprint. + - Fixed error when mods add a multi-level tech without a number suffix. + - Fixed error on launching a rocket where the launch pad would be left with exactly 0 fuel. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.67 +Date: 31. 05. 2020 + Compatibility: + - Marked some bobs mods as compatible (testers reported they work without additional compatibility code needed). + + Locale: + - Added Chinese translation thanks to Frost. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.66 +Date: 29. 05. 2020 + Changes: + - Increased base density of stone (only affects new chunks). + - Added more Close [X] buttons to various GUIs. + - Renamed Space solar panel to Flat solar panel, can now be placed on planets. + - Added mod setting to disable the zone preview window. (Note: If you are having FPS issues when it is open they may be due to debug overlays displaying in the window.) + + Bugfixes: + - Material catalogue 4 requires electrical shielding instead of explosive shielding data. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.65 +Date: 27. 05. 2020 + Compatibility: + - Better compatibility with quality of life research mod. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.64 +Date: 26. 05. 2020 + Info: + - Updates for Factorio 0.18.27 + + Changes: + - Increased the cargo rocket silo fluid box (so fluid can be loaded faster). + - Delivery cannon deals double damage when "delivering" explosives. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.63 +Date: 23. 05. 2020 + Bugfixes: + - Fixed migration issue for new cliff settings. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.62 +Date: 23. 05. 2020 + Changes: + - Planets now have cliff settings. + - Non-homeworld planets now have a small starting area even if Nauvis had a large starting area. + - Space zones now have no starting area. + - Added a new default space science behaviour: Replace: replaces space science pack with rocket science pack. + + Bugfixes: + - Fixed an issue with small moon resource frequency compensation not being applied to resources if the resources were reset by the addition or removal of new resource types. + + Compatibility: + - Krastorio 2 now not marked as incompatible, there are still compatibility improvements to make but the main game-breaking issues have been resolved. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.61 +Date: 18. 05. 2020 + Changes: + - Buffed medpacks now that you can have enough health to make use of larger heals. + - Added chance of uranium ore to meteors. + - Bio upgrade strength 5 now gives an inventory bonus of 10. + - Cargo rocket silo was outputting a rocket item when completed, but that item was supposed to be a hidden internal one. That has been fixed, so the silo now outputs the signal from the virtual signals tab. If you used that items as a combinator condition you should update the combinators. + - Switched to the mine_entity function for the invalid entity build cancel script to preserve the entity's item data (vehicle grids). + + Bugfixes: + - Fixed stated number or module slots in beacon description. + - Fixed crash on placing a core miner of the core fragment type had not been initialised properly. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.60 +Date: 18. 05. 2020 + Bugfixes: + - Fixed space platform plating recipe. + - Fixed crashes related to being in editor mode and trying to use tesla gun, pheromone darts, or lifesupport. + - Fixed crash if the spaceship boarding UI is open and the target spaceship becomes invalid. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.59 +Date: 18. 05. 2020 + Changes: + - Added bio gun. + - Added bloatburst ammo. + - Added pheromone dart. + - Added Bio upgrade: Constitution. Increases character health. + - Added Bio upgrade: Strength. Increases inventory slots. + - Added Bio upgrade: Agility. Increases movement speed. + - Added Bio upgrade: Dexterity. Increases character crafting speed. + - Added Bio upgrade: Intelligence. Increases lab productivity. + - Changed the way that light is calculated for surfaces. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.58 +Date: 17. 05. 2020 + Bugfixes: + - Fixed no lab input for rocket science. + - Fixed crash on launch first satellite if space science was set to be removed. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.57 +Date: 16. 05. 2020 + Changes: + - Added collision to addon power poles so that can't stack on top of each other. They should still be able to attach to most buildings. + - Space science, if not altered by another mod, can either by removed completely or have a fallback recipe as a mod option. You should select the option you want before loading an existing game as removal will remove the existing packs. + - Added mod option to never show lifesupport GUI. + - Mylon's meteor changes: defences get credited kills, meteor defence ammo consumption statistics. + + Bugfixes: + - Fixed that rocket science was needed to unlock rocket science. + - Fixed supercharge collision to not be 2x2. + - Fixed spaceship console output entity not being removed. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.56 +Date: 15. 05. 2020 + Changes: + - Added productivity to some ground recipes that were lacking it. + - Added sulfuric acid to vitalic acid recipe. + - Added vulcanite brick recipe to the vulcanite processing tech. + - Added vulcanite glass recipe (and added to vulcanite processing tech). + - To avoid conflicts with other mods, the rocket science pack is now not based on the space science pack. The space science pack is now called optimisation science pack and is used for the same things as the vanilla space science pack, but other mods are free to use it for different things. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.55 +Date: 14. 05. 2020 + Changes: + - Changed Vulcanite iron/copper smelting recipes again (buff). + - Added vulcanite brick recipe. + - Reduced vulcanite from Nauvis core fragment. + - Moved power armor and early equipment closer to vanilla positions in tech tree. + - Added new planet/moon: Tarn. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.54 +Date: 14. 05. 2020 + Changes: + - Increased base uranium spots per km2 from 1.5 to 2 (only affects new chunks). + - Reduced Vulcanite from omni fragment. + - Increased Vulcanite requirement for Vulcanite smelting of iron and copper. + - Shield projectors are now 4x4 entities and have a greater range. + - Added spaceship clamps, required for spaceship automatic landing. + - Added spaceship automation, you control target speed, set destination, trigger launch, and trigger landing that matches 2 specific clamps (See Informatron). + - Spaceship console are now 4x4 entities. + - The changes to spaceships may cause existing spaceships to lose existing settings and wire connections. + + Bugfixes: + - Fixed wide area beacon 2 not being placeable in space. + - Fixed incorrect space manufactory research time. + - Fixed collision issue with gravimetric lab. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.53 +Date: 12. 05. 2020 + Changes: + - Removed naquim ore from resource discovery preferences. + - Added scrap and contaminated scrap to delivery cannon list. + - Added length indicator to long pipe icons. + - Added core fragments to delivery cannon list. + - Improved ordering of delivery cannon recipes. + - Added productivity to alternate low density structure and heat shield recipes (there may be others that still need to be updated). + - Changed multipliers on procedural tech changes so deep space science addition makes the tech cheaper (values subject to further changes). + + Bugfixes: + - Fixed typos in Informatron for spaceships and navigation satellite. + - Fixed that switching to flying mode would cause fast healing. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.52 +Date: 10. 05. 2020 + Changes: + - Fixed recycling recipe categories so that are available again. + - Fixed decompression resistance data recipe icon. + - Crushed cryonite and vulcanite are now more compressed (for transport). + + Bugfixes: + - Fixed low solar issue. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.51 +Date: 10. 05. 2020 + Changes: + - Removed always_show_made_in from more crafting recipes. + - Iridium heat shielding recipe is now better. + - Beryllium LDS recipe is now worse. + + Compatibility: + - Marked the main overhaul mods as incompatible in preparation for public testing. If you want to use those mods just edit info.json but I won't be dealing with any compatibility issues from them for at least a few weeks. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.50 +Date: 09. 05. 2020 + Changes: + - Made some compatibility code more robust. + - Removed always_show_made_in from standard crating recipes. + - Zone tooltip pre surface generation now factors in the body size frequency compensation. + - Reduced scrap from locomotive (to not be resource positive). + - Changed the basic biosludge loop so biomass is cheaper and the process is a bit more efficient. + - Tier 1 bio science recipes are cheaper (mostly due to returned by-products). + - Added alternate multispectral mirror recipe (should probably have its own tech). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.49 +Date: 08. 05. 2020 + Changes: + - Added some angles & bobs compatability code. + + Bugfixes: + - Fixed beacons overload issue, may need to replace the affected machines 1 last time. + - Fixed wide are beacon 2 not being unlocked by the tech. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.48 +Date: 08. 05. 2020 + Changes: + - Increased modules slots in basic beacons. + - Decreased transmission efficiency of wide area beacons (back to 50%). + - Increased modules slots of wide area beacons. + - Krastorio is temporarily marked as incompatible but the intention is to fix the issues asap. You should not play on an earlier version of Space Exploration either because the problems permanently affect your progression. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.47 +Date: 08. 05. 2020 + Changes: + - Increased uranium frequency by 50%. + - Delivery cannon can fire plastic bar, sand, glass, low density structure, heat shielding, and explosives. + - Decreased delivery cannon damage (in the future it will be increased if sending explosives). + - Added flags info to Universe Explorer: Has visited in person, has landing pad, etc. + - Reduced Pulveriser crafting time. + - Increased delivery cannon chest size from 10 to 40. + - Resource patches are a bit more cohesive. + - Added unit capsules. + + Bugfixes: + - Fixed that you couldn't select no resource preference for zone discovery. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.46 +Date: 06. 05. 2020 + Changes: + - Exaggerated the differences between cooling recipes. + - Added wide area beacon 2, 75% transmission effect. + - Spaceship cannot land on certain special things. + - Satellite launch now gives you an astronomic science pack. + - Launching a satellite, or completing a discovery tech, should print a message if nothing is found. + + Bugfixes: + - Fixed inventory getting cleared when changing surface in satellite mode. + - Fixed some broken locales. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.45 +Date: 05. 05. 2020 + Changes: + - Added some missing locales. + - Changed alternate thermal radiating recipes, there is now a version faster then default, and one more efficient than default. + - Added new planet/moons: Horaerratum, Ketobar. + + Bugfixes: + - Fixed effectivity module 9 needing wrong catalogue type. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.44 +Date: 03. 05. 2020 + Changes: + - Made starting resource less clustered but a lot more reliable (less likely to overlap). + - Reduced the limitations on which surfaces can be deleted. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.43 +Date: 02. 05. 2020 + Changes: + - Changed supercooled temperature back to -273 (to workaround a suspected base game issue). + - Space solar panel 1 no longer requires energy science or holmium products. + - Core mining no longer requires laser tech. + - Updated the starting satellite. + - Added new planet/moons: Xiada, Drakkett. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.42 +Date: 02. 05. 2020 + Changes: + - Added new planet/moons: Trelos, Sparky. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.41 +Date: 02. 05. 2020 + Bugfixes: + - Fixed Delivery Cannon could not be placed in space. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.40 +Date: 01. 05. 2020 + Changes: + - Added Delivery Cannon. + + Bugfixes: + - Fixed problem recycling mod compatibility. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.39 +Date: 27. 04. 2020 + Changes: + - Adjusted mining and crafting times related to new resources. + - Added matter/resource settings for K2 compatibility. + - Updated Space Exploration map gen preset to excluded non-homeworld resources (thanks to Bilbo). + - Increased cost of biosludge from vitamelange. + - Change Universe generation so that there are some guaranteed planet and moon types in homeworld systems. These are also applied to existing systems. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.38 +Date: 27. 04. 2020 + Changes: + - Changes some of the messages relating to launching satellites. + - Updated some Informatron text relating to space sciences. + - Changed a most of the specialist science recipes so resource costs are more consistent, most of the changers are increasing or decreasing probabilities or return rates. + - Decreased cost of Advanced neural gel. + - Added a patreon support message (hopefully not intrusive). + - Spaced/Grounded versions of entities don't appear in crafting tooltips anymore. + + Bugfixes: + - Fixed missing locale for Thermal radiating. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.37 +Date: 25. 04. 2020 + Scripting: + - Moved resource settings into data.lua and made the settings available so that other mods can control their own resources and override others. + + Bugfixes: + - Fixed an issue loading the universe if a vanilla resource had been removed. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.36 +Date: 25. 04. 2020 + Changes: + - Fixed some specialist science recipes using the wrong resource. + - Increased material fabricator crafting speed by 4x. + + Scripting: + - Added a remote interface for other mods to read the zone index. (Needed for multiplayer PVP homeworld generation.) + +--------------------------------------------------------------------------------------------------- +Version: 0.3.35 +Date: 24. 04. 2020 + Changes: + - Matter fabricator can't benefit from effectivity. + - Reduced material cost of antimatter production by 50%. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.34 +Date: 23. 04. 2020 + Changes: + - Added recipe to make water ice with cryonite. + - Added recipe to make water from steam. + - Tweaked resource autoplace settings to make starting resources more reliable. + + Bugfixes: + - Fixed condenser turbine accepting low temperature steam. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.33 +Date: 22. 04. 2020 + Changes: + - Changed the procedural tech update system to use multiple tiers of specialist science. + - Added a system for other mods to add exclusion from the procedural tech system so they can be updated manually as part of mod compatibility code. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.32 +Date: 20. 04. 2020 + Changes: + - Added a system for other mods to specify crafting machines that are valid for space. + - Split crafting machines in the production tabs into rows by role (chemistry, assembling, telescopes, etc). + - Material fabricator is now the source of antimatter. It uses more energy as a result. + - Antimatter production is now 10x faster by using the material fabricator. + - Swapped particle collider and material fabricator graphics (as material fabricator is now the antimatter producer). + - Added some additional material fabrication recipes for other materials. They are not worthwhile unless you are stuck in space and have no other options. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.31 +Date: 20. 04. 2020 + Changes: + - Removed space tab. + - Added Science tab. + - Added Resources tab. + - Renamed Intermediate Products tab to Manufacturing. + - Renamed Combat tab to Equipment & Combat. + - Moved recipes to appropriate tabs. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.30 +Date: 18. 04. 2020 + Changes: + - Added Addon power poles, that don't collide with other entities. + - Reduced module costs. + - Distance now affects rocket survivability and cargo loss. Stats are show on the rocket silo side panel. + - Moved pure science recipes to their own tab. + - Tweaked high temperature heat exchanger/turbine/condenser turbine ratios. + - Implemented zone discovery research and resource preference UI. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.29 +Date: 16. 04. 2020 + Changes: + - Added a large high temperature heat exchanger. + - Added a large high temperature turbine generator. + - Changed long heat pipe and long space pipe lengths. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.28 +Date: 09. 04. 2020 + Changes: + - New icons for data cards. + - Catalogues now use an icon that indicated 4 grouped cards, and all are made of 4 data cards. Insight recipes adjected accordingly. + - Specialist space science packs now use the old catalogue canister-style graphics. + - Specialist space science packs are now tiered so there is more of a steady progression, you can't jump straight from T1 to T4. + - Early bio science is cheaper based on Prdfndr's suggestions. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.27 +Date: 05. 04. 2020 + Bugfixes: + - Fixed error caused when trying to fix an invalid resource generation control. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.26 +Date: 05. 04. 2020 + Bugfixes: + - Fixed error loading deep space belt graphics in low resolution. + - Fixed deep space belts mining into normal space belts. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.25 +Date: 05. 04. 2020 + Changes: + - Huge changes to resource distribution. The new system essentially ignores the game's current state and generates a procedural distribution. There will be a big changes in resources shifting to this system, but things will be less affected by resource changes in the future, especially if mods that change resources are added and/or removed multiple types. + - Cryonite hypercooling 2x faster. + - Tweaked shield generator mechanics for smoother power curves. + + Bugfixes: + - Fixed that rotatable long heat pipes blocked player. + - Fixed condenser turbines sub-entities getting reversed. + - Fixed bots would try to repair shields. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.24 +Date: 04. 04. 2020 + Changes: + - Gave long space pipe extra connection points. + - Long naquium heat pipe is now one rotatable entity. + + Bugfixes: + - Fixed locale issue. + - Fixed deep space belts not placeable in space. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.23 +Date: 03. 04. 2020 + Changes: + - Increased average resource values for non-homeworlds. + - Reduced shield projector passive draw to 2MW. + - Fixed shields on spaceships. + - Added deep space transport belts. + - Reverted thermofluid kelvin changes. + - Minor balance changes to bio and material tier 2 recipes. + - Added Cryonite slush recipe for hypercooling. + - Added radiator 2. + - Added a WIP interface to help with finding zones with the resources you want. + - Can now place pylons in empty space. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.22 +Date: 02. 04. 2020 + Changes: + - Changed basic beacon module slots to 4. + - Added Shield Projector. + - Added Naquium heat pipe which is a huge improvement over normal heat pipes, plus additional extended horizontal and vertical versions that are even better for longer heat transfers. + - Update to ruins code thanks to LEitK. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.21 +Date: 28. 03. 2020 + Changes: + - Changed space science recipe to require vulcanite blocks. + - Increased vulcanite in core fragments + - Reduce number of core fragments required per pulverising cycle from 20 to 16. + - Increased vulcanite blocks for rocket fuel to 8 + - Reduced vulcanite smelting bonus to +50% + - Reduced number of satellite rocket parts to 50. + - Decreased satellite cost. + - Removed experimental material prototype and recipes that used it. + - Moved nanomaterial to just before deep space science and now requires the 4 specialist sciences + - Material science recipes adjusted to use iridium products (still need balancing). + - Gravimetrics lab is not required for Astro science until T2, recipes are otherwise the same. + - Changed timespace anomaly experiment to not require energy science cards. + - Moved the conductivity and superconductivity data to energy science. + - Superconductive cable no longer requires material science, just needs energy science, holmium and cryonite. + - Reduced iridium stack sizes, it is very dense. + - Increases beryllium stack sizes, it is very light. + - Renamed orbital data to machine learning data. + - Machine learning data is now used for T4 modules. + - Electromagnetic field data is not pert of T1 energy science. + + Bugfixes: + - Fixed space science needing 36 data cards. + - Fixed crash when launching to first discovered space platform. + - Fixed crash related to jetpack character interaction. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.20 +Date: 26. 03. 2020 + Bugfixes: + - Fixed spaceships wouldn't provide lifesupport on plague planets. + - Fixed a rounding error. + - Changed the way some of the tech triggers work. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.19 +Date: 24. 03. 2020 + Changes: + - Updated the space science recipe again. Now requires a small amount of vulcanite, supercomputing and simple thermofluid infrastructure. + - Reorganised the tech tree so a few techs are now before space science (radiator, supercomputer, manufactory). + - Increased beryllium processing speed in chemical labs. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.18 +Date: 22. 03. 2020 + Changes: + - One moon of Nauvis is guaranteed to be biter-free (only affects new games). + - Changed the fragile bio items stack sizes from 1 to 5. + - Changed Naquium end-products stack size to 1. + - Changed thermofluid names/description to use Kelvin (based on suggestions), not sure if it is easier or harder to understand. + - Increased energy shield equipment power efficiency. + - Updated energy shield recipes with new items. + - Landfill and space platform now collide with resources. If resources are regenerated they won't spawn on these areas. + - Entities that can't be placed on spaceships are now blocked based on "layer-15" instead of "resource-layer". This solves some issue but may cause new mod incompatibilities. + + Bugfixes: + - Fixed a crash related to surface transition and jetpack. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.17 +Date: 17. 03. 2020 + Changes: + - Changes for Factorio 0.18.13 + - 4x more beryllium hydroxide from beryllium sulfate + - Reduced beryllium plates required for observation frames. + - Changed all canister stack sizes from 20 to 50 + - Increased antimatter per antimatter canister by 2x. + - Plagued planets/moons now require lifesupport. + - Added Pylon, Pylon Substation, Construction Pylon, and Radar Construction Pylon. + - Added Supercharger. + + Modding: + - Other mods can now change core fragment resource values and fragment type generation. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.15 +Date: 12. 03. 2020 + Changes: + - Updated some specialist science data recipes to use associated resource products. + - Increased speed of genetics and growth facility. + - Added space accumulators tier 2. + + Bugfixes: + - Fixed anchoring spaceship while jetpacking. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.14 +Date: 11. 03. 2020 + Bugfixes: + - Fixed cryogun error. + - Added cryogun locale. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.13 +Date: 11. 03. 2020 + Changes: + - Added cryogun. + - Added a 3rd tier of space solar panels. + - Changed most space science research unit times to 60s. + - Spaceships now output their speed as an S signal, or -1 if stopped. + - Changed spaceship flight dynamics to have slower acceleration / deceleration (easier to control speed). + + Bugfixes: + - Fixed that space assembling machine could be placed on planets. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.12 +Date: 10. 03. 2020 + Changes: + - Restricted secondary resource to not be allowed higher than 90% of the primary resource. + - If as part of universe generation a resource with climate restrictions is assigned to an unsuitable climate then the planet is altered to fit the climate requirements. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.11 +Date: 09. 03. 2020 + Bugfixes: + - Fixed issue where updating from an old game save, some old zones had assigned surface control settings that were different from the zone climate tags and ended up with incorrect resource assignments. The fix forces climate tags to override existing settings but may cause any regenerated surfaces to have different climates than before. + - Fixed glyph order issue. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.10 +Date: 07. 03. 2020 + Changes: + - Thruster suit movement code moved into a new mod: Jetpack (required). + - Fixed thruster suit 1 recipe. + - Reduced energy shield power requirements. + + Bugfixes: + - Fixed lifesupport error when making a blueprint. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.9 +Date: 05. 03. 2020 + Changes: + - Changed the way that the lifesupport UI appears, and added a close button. + - Corrected some lifesupport tooltips. + - Increased deep space solar panel efficiency. + - Removed lifesupport canisters from all thruster suit tiers. + - Washing vulcanite yields steam. + - Changed max zone priority to 999. + - Naquium ingot requires Naquium powder. + + Bugfixes: + - Fixed a couple of lifesupport issues relating to remote view and spaceship landing. + - Fixed crash if loading the game without the hr graphics mod. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.8 +Date: 04. 03. 2020 + Changes: + - Added lifesupport equipment. + - Lifesupport canisters are now consumed while in space. The UI still needs to be improved. In the future some planets will also need lifesupport. + - Changed part of a secret process (also needs some further UI improvements). + +--------------------------------------------------------------------------------------------------- +Version: 0.3.7 +Date: 03. 03. 2020 + Changes: + - Beacons no longer require utility, space, and energy science packs to research, but can't stack modifiers. + - A new wide area beacon has been added with a 32x32 tile area, 10 module slots. It can be used in space or on the ground but requires energy science to research. + + Bugfixes: + - Fixed that zone surface index was not being cleared when zone surfaces were deleted. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.6 +Date: 02. 03. 2020 + Changes: + - Updated Holmium, Iridium, & Naquium processing. + - Changed Railgun and Tesla gun recipes and tech tree position. + - Added more detail to Universe Explorer resource bars. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.5 +Date: 01. 03. 2020 + Changes: + - Fixed an issue with a secret thing's power draw. + - Fixed a crash if you go into space without a space suit. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.4 +Date: 29. 02. 2020 + Changes: + - Changed beryllium processing. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.3 +Date: 29. 02. 2020 + Changes: + - Fixed some errors relating to secret content, including one that accidently traps you. + - Added the ability to automatically scan a surface, and stop active scans. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.2 +Date: 28. 02. 2020 + Changes: + - Fixed secret things spawning. + - Fixed planet/moon climate tags not being added. + - Added temporary debug text to see climate tags below delete surface button. + - Fixed climate-based resources not attaching to some zone properly. + - Fixed issues related to surface fixing in the migration script (needs to load from a pre 3.x version to work). + - Fixed some missing locales and typos. + +--------------------------------------------------------------------------------------------------- +Version: 0.3.1 +Date: 26. 02. 2020 + Info: + - Major update focussed on new resources, tech tree changes, and some end-game exploration puzzle solving. + + Changes: + - Informatron is now required. + - AAI Industry is required (again). + - Removed nauvis resource slider limitations. + - New resources: Beryllium, Holmium, Iridium, Naquium, Vitamelange, Cryonite, and Vulcanite. + - Resource distribution change: universe resource balance rules and new surface resource noise expressions. Many surface resources will be regenerated as a result. + - Some recipes changed to use the new resources. + - Core fragment processor change to Pulveriser. + - Space science pack recipe changed, now made in space. + - Added Informatron pages (Press I). + - Reduced base healing rate. + - Characters spawn with a medpack. + - Navigation satellite view has a more minimalistic window. + - Added a new Universe Explorer UI, that lets you view lots of zone more easily, and see resource balance before generating the surface. + - Added some other secret stuff for exploration. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.14 +Date: 05. 04. 2020 + Bugfixes: + - Fixed issue with meteor defence structures not being destroyed properly. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.13 +Date: 04. 04. 2020 + Bugfixes: + - Fixed crash with launching rocket with player to random empty space with no floor. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.12 +Date: 28. 03. 2020 + Bugfixes: + - Fixed exploit allowing teleportation via spaceships. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.11 +Date: 25. 03. 2020 + Bugfixes: + - Fixed issue with angels bio processing icon. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.10 +Date: 07. 03. 2020 + Info: + - Changes for Factorio 0.18.13 + + Bugfixes: + - Fixed an issue with space capsule and jetpack interaction. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.9 +Date: 07. 03. 2020 + Bugfixes: + - Fixed a crash relating to space capsule sounds being unexpectedly destroyed, thanks to Telkine2018. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.8 +Date: 06. 03. 2020 + Changes: + - Update for jetpack mod. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.7 +Date: 02. 03. 2020 + Changes: + - Core miner has better orientation preservation in blueprints and can be pipetted. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.6 +Date: 20. 02. 2020 + Info: + - Updated for Factorio 0.18.8. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.5 +Date: 28. 01. 2020 + Info: + - Updated for Factorio 0.18.4. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.4 +Date: 31. 01. 2020 + Bugfixes: + - Fixed multilayered icons that combined 32px and 64px icons. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.3 +Date: 31. 01. 2020 + Bugfixes: + - Spaceship hotfix. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.2 +Date: 28. 01. 2020 + Bugfixes: + - 0.18 bug, when landing a spaceship, players on the spaceship lose their body. + + Scripting: + - Added remote interface (by request) for "cancel_entity_creation". Can remove an entity, put the item back in the player or drop to ground, and display flying text. + +--------------------------------------------------------------------------------------------------- +Version: 0.2.1 +Date: 28. 01. 2020 + Info: + - Updated for Factorio 0.18. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.149 +Date: 24. 11. 2019 + Changes: + - Added a collision layer to all rails to add support for cargo ships and similar mods (requires postprocess mod to be updated too). + - Added some development tools for contributors. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.148 +Date: 20. 11. 2019 + Bugfixes: + - Put space rails into their own fast replace group so they don't conflict with other mods that add rails. + + Locale: + - Added translation for Japanese by iicyan. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.147 +Date: 27. 10. 2019 + Changes: + - Reduced nutrient vat recipe from 10s to 5s. + + Locale: + - Updated translation for Russian by EternalDragon. + - Added translation for Italian by Firestorm. + + Bugfixes: + - Fixed wrong icon for part of the condenser turbine entities. + - Fix for rare case where some tiles around launched spaceships are 'out-of-map' tiles and can't be built on or flown over. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.146 +Date: 22. 10. 2019 + Bugfixes: + - Corrected typo on item name quantumn to quantum. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.145 +Date: 16. 10. 2019 + Bugfixes: + - Potential bug fix for script error on rocket launch with invalid rocket silo. + - Fix for script error when landing with a capsule but the light got destroyed somehow. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.144 +Date: 11. 10. 2019 + Bugfixes: + - Fixed issue where cutting composite entities in "/editor" mode could leave partial remnants of the building. This may also help with some other issues relating to script-based entity deletion. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.143 +Date: 08. 10. 2019 + Changes: + - Reduced meteor point defence power draw while charged by 50%. + - Added an "Are you sure?" warning for respawning. + + Bugfixes: + - Fixed an issue with using a specific combination of navigation view and respawning. + - Made new productivity module limitations match existing productivity module limitations if those were changed by other mods (added modded recipes). + +--------------------------------------------------------------------------------------------------- +Version: 0.1.142 +Date: 20. 09. 2019 + Scripting: + - Added commands to assign other planets as homeworlds making them match nauvis in terms of size, resources, and core mining. This is the first step towards supporting multiplayer with different planet starts. + + Changes: + - Increased space biochemical lab crafting speed from 2 to 3. + - Increased space growth facility to crafting speed from 1 to 2. + - Increased space genetics facility to crafting speed from 1 to 2. + - Increased space decontamination facility to crafting speed from 1 to 2. + - Reduced nutrient gel vat recipe time from 10s to 5s. + - Reduce all thermofluid heat radiating recipe times by 33%. + - Reduced data card formatting time by 50%. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.141 +Date: 12. 09. 2019 + Changes: + - Significant specimen recipe now returns 2/7/1 significant/experimental/waste instead of 1/8/1. + + Bugfixes: + - Fixed crash on robot placing invalid tile. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.140 +Date: 08. 09. 2019 + Changes: + - Cargo Rocket Silo output signals are updated immediately upon launch (previously there could be a 1s delay if launched via a trigger). + - Added a working light to Space Manufactory. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.139 +Date: 04. 09. 2019 + Bugfixes: + - Found a workaround for condenser turbines sometimes stopping working in certain orientations after switching surfaces with a spaceship. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.138 +Date: 04. 09. 2019 + Changes: + - Updates antimatter reactor prototype to match Factorio nuclear reactor changes (relating to heap pipe glow). + +--------------------------------------------------------------------------------------------------- +Version: 0.1.137 +Date: 29. 08. 2019 + Bugfixes: + - Fixed issue with command to change existing resource values, eg: /c remote.call("space-exploration", "multiply_nauvis_resource", {surface = game.player.surface, resource_name = "uranium-ore", multiplier=2}) + +--------------------------------------------------------------------------------------------------- +Version: 0.1.136 +Date: 21. 08. 2019 + Changes: + - Cargo rocket silo adds item consumption data to production statistics. + + Bugfixes: + - Fixed issue with uranium settings on repeated mod configuration changes. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.135 +Date: 19. 08. 2019 + Changes: + - Added zone radius to zone tooltip. + + Bugfixes: + - Fixed issue with boarding spaceships. + - Fixed issue with capsule trying to land in ungenerated chunks. + - Fixed that asteroid fields were not considered for closest zone calculation. + - Added code to handle surfaces left after uninstalling and reinstalling the mod. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.134 +Date: 11. 08. 2019 + Changes: + - Most space fluids are now 'compressed': All recipes involving the fluids have fluid values approximately divided by 10. Where this would cause significant rounding error other approaches are taken. In general this means pipe throughput is less of an issue in space. You may want to adjust fluid conditions and remove storage tanks. + - Telescope recipes don't destroy thermofluid anymore. + - Reduced output count of observation frame recipe. + - Added recipe to scrap cargo pods. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.133 +Date: 08. 08. 2019 + Bugfixes: + - Hotfix: Factorio 0.17.63 changes fluid boxes which broke condenser turbines. + + Changes: + - Krastorio resources "imersite" and "menarite" are excluded from asteroids as part of a compatibility request. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.132 +Date: 04. 08. 2019 + Bugfixes: + - Fixed landing pad script error if landing pad was unexpectedly deconstructed. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.131 +Date: 02. 08. 2019 + Changes: + - Decreased core mining energy cost from 80MW to 50MW. + - Decreased core fragment processing cycle time from 50 to 20 and core fragments per processing cycle from 50 to 20. + - Decreased specialised core fragment return of mixed resource core fragment per cycle from 10 to 5. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.130 +Date: 01. 08. 2019 + Bugfixes: + - Hotfix: Migration function name was not updated properly and caused crash on update. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.129 +Date: 30. 07. 2019 + Changes: + - Doubled brightness and solar output in close solar orbit. + + Bugfixes: + - Added some code to prevent assembling machine related load errors when some other mod was installed. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.128 +Date: 29. 07. 2019 + Changes: + - Improved Tier 4 insight recipes, they require blank data cards and output more insights. + - Improved dark energy data success chance. + + Scripting: + - Added remote interface "multiply_nauvis_resource" that can be used to revert parts of recent resource changes. It should not be used unless you are sure the available resources on nauvis are insufficient to set up a few moon mining bases. /c remote.call("space-exploration", "multiply_nauvis_resource", {resource_name = "iron-ore", multiplier=0.9}) + +--------------------------------------------------------------------------------------------------- +Version: 0.1.127 +Date: 26. 07. 2019 + Scripting: + - Added remote interface "get_player_character" to get the character from a player, even if they are detached from the character. + + Changes: + - Data card and gamma ray detectors recipes now require copper plate. + - Data card advanced circuit requirement reduced. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.126 +Date: 26. 07. 2019 + Bugfixes: + - Hotfix: Previous update accidently optimised away resource spawning in space surfaces. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.125 +Date: 25. 07. 2019 + Changes: + - Increased Cargo rocket capacity from 400 to 500. + - Increased Landing pad capacity from 500 to 600. + - Decreased all cargo rocket fuel requirements by 20%. + - Reduced rocket part recovery research from +5% to +4% per level. + - Increased base rocket part recovery by 20%. + - Reduce Nauvis resource overabundance, no effect on default or low resource settings. + - Uranium is now a rare resource on Nauvis surface (Core mining is not affected). + - Huge improvement to space terrain generation speed. + - Small improvement to planet and moon surface terrain generation speed. + - Launching spaceships requires less of a UPS spike (due to terrain generation). + - Added migration code to update existing surface settings (required to for terrain generation speed improvements to affect existing surfaces). + +--------------------------------------------------------------------------------------------------- +Version: 0.1.124 +Date: 24. 07. 2019 + Changes: + - Specialised core fragments now return 10 generic core fragments instead of 5, meaning more resource variety from core mining. + - Core mining speed increased by 50%. + - Changed rocket part recovery formula to be less influenced by RNG, an improvement for high research levels that can hit the max 100% return value. + - Decreased level 1 and level 2 data card reformatting times. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.123 +Date: 23. 07. 2019 + Changes: + - Updated science pack icons to 64x64px + + Bugfixes: + - Fixed spaceship UI displaying time to destination at current speed but using the max speed value. + - Reverted some changes that blocked bobs pumps from space. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.122 +Date: 22. 07. 2019 + Changes: + - Increased railgun dart damage from 100 to 200. + - Increased tesla gun ammo dart damage from 20 to 25. + - Changed Thruster Suit MK3 grid from 13x13 to 14x12. + - Decreases observation frame recipe output from 100 to 50. + - Decreased space mirror cost. + - Removed single-spectral astrometric analysis recipes. + - Rescaled outputs of multispectral astrometric analysis recipes. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.121 +Date: 20. 07. 2019 + Changes: + - Reduced deep space science pack cost. + - Halved genetics lab recipe times. + - Increased biochemical lab crafting speed. + - Decreased power output of Fluid Isothermal Generator. + + Bugfixes: + - Removed leftover debugging code. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.120 +Date: 17. 07. 2019 + Changes: + - Allowed productivity for material testing pack if made on the ground. + - Decreased uranium yield from core mining. + - Decreased water yield from core mining. + - Increased core mining speed. + - Altered some procedural collision settings, this will hopefully prevent things like water wells. + + Bugfixes: + - Added some checks around getting force data for invalid player forces (enemy, neutral). + +--------------------------------------------------------------------------------------------------- +Version: 0.1.119 +Date: 14. 07. 2019 + Bugfixes: + - Fixed error when riding a space capsule launched from a spaceship and it gets destroyed before landing. + + Locale: + - Updated translations for German, Spanish, and Korean. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.118 +Date: 10. 07. 2019 + Changes: + - Core miners won't emit their efficiency text on game load if the value has not changed. + - Energy weapons research requires energy science packs instead of material science packs. + - If a rocket aiming for a landing pad crashes, the space capsule will always thrust to the target pad (and won't need to be manually deconstructed). + - Increased nuke cost. (Was initially forgotten from changelog.) + + Bugfixes: + - Fixed rocket reusability research stating it is multiplicative. It is not multiplicative, it is an additive 5% (i.e. roughly 5) to the number of cargo rocket sections you can get back per level. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.117 +Date: 8. 07. 2019 + Changes: + - Players spawning to a surface without a position specified now default to their force's spawn default spawn position instead of the world origin. + + Bugfixes: + - Fixed problem with new forces setup. + - Fixed problem with space capsule landing with an invalid passenger. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.116 +Date: 7. 07. 2019 + Bugfixes: + - Fixed problem with code that with rocket silo prerequisites unlock code. + - Fixed subatomic data recipe returning too many data cards. + - Fixed the multiple spaceships on the same surface with intersecting bounding boxes were considering overlapping tiles of the other ship as their own tiles for integrity stress calculation. + + Changes: + - Fluid resources from the Geothermal mod can now be infinite (thanks to SlippyCheeze). + + Locale: + - Added missing string for railgun shooting speed. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.115 +Date: 5. 07. 2019 + Bugfixes: + - Fixed error with required fuel signal output if required fuel is unknown. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.114 +Date: 4. 07. 2019 + Changes: + - Cargo rocket silo now outputs signals: E for empty slots, F for full slots, L for Liquid rocket fuel required, and 'Cargo Rocket' if the rocket is complete (i.e. 1 capsule and 100 rocket sections). + - Made the key text in the 'postprocess mod is not installed' error message more obvious. + + Bugfixes: + - Fixed that satellite view couldn't ghost-place rails. + - Fixed that not all levels of cargo safety and cargo reusability were applying fully. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.113 +Date: 2. 07. 2019 + Bugfixes: + - Forced space accumulators to not have a fast replace group for cases where one was added to accumulators by another mod. + - Fixed issue relating to universe resources updating. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.112 +Date: 1. 07. 2019 + Bugfixes: + - Fixed that nutrient gel from methane recipe could not be unlocked. + - Fixed multiple issues relating to Factorio 0.17.53 collision/upgrade rules. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.111 +Date: 30. 06. 2019 + Changes: + - Changed damage type of meteors, certain entity types can now have meteor-specific resistances (train rails now have 99.75% meteor resistance). + + Locale: + - Spaceship UIs can now be translated (70+ new strings added). + +--------------------------------------------------------------------------------------------------- +Version: 0.1.110 +Date: 30. 06. 2019 + Changes: + - Added a 2nd bar to spaceship integrity stress so you can see structural vs container stress. + + Bugfixes: + - Fixed issue relating to boarding a spaceship from a spaceship that you are not in. + + Locale: + - Added missing locale for railgun damage bonus. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.109 +Date: 30. 06. 2019 + Changes: + - Doubled thermodynamics lab effective smelting speed. + - Thermofluid base cooling time reduced from 8 to 6. + + Locale: + - Spanish translation updates thanks to Abarel. + - French translation updates thanks to TheKoopa and Dae. + - Hebrew translation updates thanks to Multytint + - German translation updates thanks to Moertschi + +--------------------------------------------------------------------------------------------------- +Version: 0.1.108 +Date: 29. 06. 2019 + Changes: + - Characters in a moving cargo rocket or space capsule are indestructible. + + Bugfixes: + - Fixed electric boiler south orientation sprite offset. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.107 +Date: 28. 06. 2019 + Features: + - Added 6 new tiers of modules up to tier 9. The modules are balanced around being used together, efficiency becomes an important part of negating excessive power usage. Thanks to Ironic Toblerone for assistance with initial prototyping. + + Changes: + - Techs for module tiers 1-3 have been redistributed back to their vanilla positions. + - Increased thermal radiator module slots from 1 to 2. + - Added cargo rocket silo launch trigger for cargo full OR green signal. + + Bugfixes: + - Fixed crash caused by remote-landing a spaceship via satellite, exiting satellite mode while still scouting for anchor placement, then exiting landing mode. + - Fixed that starmap has a day/night cycle. + + Scripting: + - Added remote interface: get_zone_icon requires data.zone_index. + - Added remote interface: get_zone_is_solid requires data.zone_index. + - Added remote interface: get_zone_is_space requires data.zone_index. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.106 +Date: 28. 06. 2019 + Changes: + - Increased planet upper limit for random resource range from +300% size/richness to +400% size/richness. + + Bugfixes: + - Fixed that space belts were using express belt icons in some interfaces. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.105 +Date: 27. 06. 2019 + Changes: + - Renamed Space science pack to Rocket science pack. This is mainly because many people call the in-space sciences "space science" so the terminology was getting confusing. + + Locale: + - Korean translation thanks to PolarZero. + + Bugfixes: + - Made sure space pipe does not have an upgrade if the express transport belt had been modified with one by another mod. (Bobs logistics compatibility) + +--------------------------------------------------------------------------------------------------- +Version: 0.1.104 + Changes: + - Space pipe and space belt are no longer the same fast-replace-groups as the ground versions because it allowed an exploit to have ground versions in space. + + Bugfixes: + - Fixed issue relating to placing space tiles on invalid surfaces with bots. + + Locale: + - Spanish translation thanks to Abarel. + - French translation thanks to TheKoopa and Dae. + - Hebrew translation thanks to Multytint + +--------------------------------------------------------------------------------------------------- +Version: 0.1.103 + Features: + - Added electric boiler, prototype code thanks to Ironic Toblerone. + + Bugfixes: + - Fixed issue with meteor defence if an entity becomes invalid. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.102 + Bugfixes: + - Fixed incorrect collision box on meteor defence facility that prevented automatic ammo insertion. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.101 + Changes: + - Meteor point defence now shows the protected area on the map and while placing the entity. + - Meteor point defence and Meteor defence facilities now only accept the correct ammo type. + - Meteor point defence and Meteor defence facilities now show a no ammo alert when charged but out of ammo. + + Bugfixes: + - Fixed issue caused by deconstructing a spaceship during transit. + + Locale: + - German translation thanks to Moertschi. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.100 + Changes: + - There is now a mod setting to set the space pipe fluid capacity between 50 and 200, default is 100. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.99 + Changes: + - Increased space pipe capacity to 200. + - Increased antimatter booster tank capacity from 20k to 50k. + + Bugfixes: + - Fixed issue with planet resource system that prevented bobs lithia water from spawning. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.98 + Changes: + - Corpse markers are removed when the corpse is removed. + - Two-part simulation techs require hypercooling 2 tech. + - Increased particle collider power consumption. + - Decreased most particle collider recipe times. + + Bugfixes: + - Fixed issues relating to dying while in satellite mode. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.97 + Changes: + - Fixed error relating to rocket passengers dying during transit. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.96 + Changes: + - Tesla gun is properly affected by energy weapons damage upgrades. + - Railgun is affected by bullet weapons damage upgrades. + - Increased railgun range from 24 to 100. + - Spaceship integrity stress from cargo now includes vehicle inventories and storage tanks. + - Base spaceship integrity increased from +200 to +300. + - Spaceship integrity 7 tech removed. + - Updated entity pollution format to latest spec. + - Reduced concrete cost of nanomaterial testing recipe. + - Railgun is now affected by bullet damage and shooting speed tech. + + Bugfixes: + - Fixed some collision settings that allowed some structures to be placed in empty space. + - Fixed crash in case where capsule shadow gets destroyed during landing sequence. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.95 + Bugfixes: + - Forced Nauvis to not list a primary resource. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.94 + Bugfixes: + - If the radar tech is disabled in the game state it is re-enabled for all forces. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.93 + Changes: + - Disabled rail being upgradeable because it was preventing the ability to hand-place rail intersections. + - Cargo rocket sections can't be packed/unpacked by hand due to base game issue return incorrect number of items. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.92 + Changes: + - Space rail can now be placed on empty space. + - Enabled the vanilla radar technology. it exists in vanilla but is disabled but that was causing problems. + + Bugfixes: + - Fixed problem with low numbers of core miners on a planet not outputting the expected resources per second. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.91 + Changes: + - The first meteor in a meteor shower does not have a random offset if relative to the meteor shower. + + Bugfixes: + - Fixed crash when player is killed during rocket landing sequence. + - Fixed when player died and had logistic requests or inventory filters, then the mod for that filter item was removed before the player respawned. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.90 + Changes: + - Fixed crash when spaceship takes damage at the location of a character but the character is invalid. + - Fixed crash when trying to respawn at a destroyed landing pad. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.89 + Changes: + - Internal restructuring of landing pad data storage. + - Cargo rockets can now be sent to landing pads without specifying a specific destination, the silo is fuelled up to the highest destination fuel cost but a random available landing pad is chosen on launch. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.88 + Changes: + - Allowed bobs pumps in space. + - Added plamsa canister emptying recipe. + - Added recipe to make nutrient gel with methane instead of coal. + + Bugfixes: + - Fixed crash on script deletion of landing pad while GUI was open. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.87 + Changes: + - Increased deep space science pack recipe output count. + - Reduced biomass recipe contaminated water and contaminated biosludge byproducts from 500 to 400. + + Bugfixes: + - Fixed issue with higher levels of rocket survivability research having a reduced effect, + - Fixed crash when respawning character has less request slots than deceased character. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.86 + Changes: + - Planets and moons now have different day/night cycles. + - Decreased crafting time for data card components. + - Decreased genetics recipe times. + - Allowed angels silos in space. + - Added unlock for methane conversion to angels refining version. + + Bugfixes: + - Fixed that high tier material catalogues required cold instead of supercooled thermofluid. + - Fixed condenser turbines getting stuck at 99% filled due to base game rounding problem. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.85 + Changes: + - Decreased core miner pollution by 50%. + - Decreased genetics recipe times. + - Added a conversion from space exploration methane gas to angels methane gas. + - Added angels crushing crafting category to mechanical laboratory. + + Bugfixes: + - Fixed that containers outside of a spaceship but inside the spaceship bounding box affected integrity stress. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.84 + Bugfixes: + - Hotfix for error on rocket crash. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.83 + Changes: + - Added "currently viewing" text to the satellite UI. + - If landing with a capsule at a random location, if there is no valid spot in range of the first attempt it will try a place nearer to the planet origin. + - If the cargo rocket silo storage tank is removed it is automatically replaced. + - Changed rounding of displayed cargo pods lost, actual item loss is unaffected. + - Spaceships structure stress is influenced by container slot capacity. Each slot is 0.5 stress but this is not added to the existing stress, the higher value is used. The starting spaceship is limited to the same slot equivalent of the cargo rocket. Spaceship integrity research increases the amount you can carry. If you have a spaceship filled with chests it is recommended that you land the spaceship before updating. + - Added recipe to pack and unpack stacks of cargo rocket sections so they are easier to deliver to other planets via rocket. + - Increased RTG 1 power output. + - Renamed fluid burner generator to fluid isothermic generator as it is designed to burn rocket fuel to power spaceships and shouldn't sound like a simple burner entity. + - Added incompatibility with train tunnels mod, it needs to respect connecting surface restrictions to be compatible (e.g: no interstellar tunnels). + +--------------------------------------------------------------------------------------------------- +Version: 0.1.82 + Changes: + - Changed spaceship integrity check pulse to once every 10 minutes. + - You must launch a satellite before launching a cargo rocket. + - Space platform plating requires material science. + - Space rail requires energy science. + - Fluid burner generator requires energy science. + - Cargo rocket silos nearly full with fuel load fuel faster. + - Added unlock for bio processing recipe for methane gas to crude oil. + - Doubled thermodynamics lab crafting speed and doubled thermodynamics recipes duration (thermodynamics recipes are effectively unchanged but smelting is twice as fast). + +--------------------------------------------------------------------------------------------------- +Version: 0.1.81 + Changes: + - Updated code relating to resources being added/removed mid game. + - Added water ice as a space-only resource. + - Added water ice to water recipe. + - Added methane ice as a space-only resource. + - Added methane ice to methane gas recipe. + - Added bio processing recipe for methane gas to crude oil. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.80 + Bugfixes: + - Fixed problem with auto-space-collision settings affecting cargo rocket silo sub-entities. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.79 + Changes: + - Moved space solar panel to energy science. + + Bugfixes: + - Fixed initial spaceship tech integrity description value. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.78 + Bugfixes: + - Fixed crash if space capsule was destroyed while landing. + - Fixed wire shortcuts mod and satellite view causing wire dropping. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.77 + Changes: + - Decreased thruster suit 2 tech cost. + - Rocket silos can't be placed on spaceships. + - Increases effective growth facility speed by recipes using increased batch sizes. + + Bugfixes: + - Fixed that some material fabricator recipes would consume too much thermofluid. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.76 + Changes: + - Reduced space mirror lubricant requirement. + - Reduced heat shielding sulfur requirement. + - Allowed pipe valve entities from other mods in space. + + Bugfixes: + - Fixed science pack recipes generating extra junk data. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.75 + Changes: + - Update to automatic space collision. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.74 + Changes: + - When switching surfaces via satellite your last position is remembered. + - Reduced tech costs for rocket upgrades. + - Reduced fluid burner generator output from 5MW to 4MW + +--------------------------------------------------------------------------------------------------- +Version: 0.1.73 + Changes: + - Reduced gravity wave data craft time. + - Adjusted imaged observation frame crafting times. + - Allowed ghost-placing landfill from satellite. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.72 + Bugfixes: + - Fixed particle collider probability recipes. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.71 + Changes: + - Updated data catalogue tech costs. + + Bugfixes: + - Fixed that mining an antimatter booster would return a rocket booster. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.70 + Changes: + - Reduced core mining drill energy cost to 80MW. + - Added more tiers of mining productivity and artillery techs so that science packs can be added more gradually. + - Moved plague rocket further back in the tech tree. + - Increased plague rocket recipe cost. + - Rough data storage substrate can use productivity if made on a planet. + + Bugfixes: + - Bio catalogue 4 requires decompression resistance data instead of decompression data + - Remove spaces from ru locale. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.69 + Bugfixes: + - Fixed script error in satellite uplink interface if button gets removed unexpectedly. + - Fixed that character could get disassociated from player when landing a spaceship in satellite view. + - Fixed that sometimes a satellite could launch and not discover anything when there are still things to discover. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.68 + Changes: + - Added a max runtime for the plague. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.67 + Changes: + - Added inventory to space capsule + - Added space capsule scrapping and empty barrel reprocessing. + + Bugfixes: + - Fixed error in satellite uplink code. + - When using the wire shortcuts mod, does not spill wires to the ground if in satellite mode. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.66 + Bugfixes: + - Fixed error in migration code. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.65 + Changes: + - Improved support for entities being built via script. + + Bugfixes: + - Fixed that planet enemy setting weren't applied properly. + - Removed biters from planets with 0% lifesigns. + - Corrected factory spaceship description from +200 to +500. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.64 + Locale: + - Russian translation by EternalDragon. + + Changes: + - Changed internal name of factory spaceship tech to match display name. + - Updated factory spaceship tech bonus integrity to +500. + - Changes required for updated thermofluid icons. + - Updated thermofluid recipe names and descriptions. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.63 + Bugfixes: + - Fixed the cargo full trigger would not fire sometimes. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.62 + Bugfixes: + - Fixed error in spaceship integrity check code. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.61 + Changes: + - Improved ability to use special tools from satellite uplink mode, such as artillery remote and upgrade planner. + + Bugfixes: + - Changing recipes while in satellite uplink mode drops items and incompatible modules to ground for deconstruction instead of putting them in an unrecoverable inventory. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.60 + Bugfixes: + - Requires higher version of robot attrition due to updated remote interface. + + Changes: + - Print meteor alerts to console option now includes a location link. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.59 + Features: + - Surfaces now have special robot attrition factors visible through the satellite uplink button tooltips. + + Changes: + - Increased space science pack cost. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.58 + Changes: + - Decreased cargo rocket section cost (roughly -25%). + - Decreased astronomic, material, energy, and biological science pack cost (roughly -45%). + - Landed cargo pods are automatically marked for deconstruction. + + Bugfixes: + - Fixed that no-spacesuit warning would print for players entering a rocket that had a valid space suit. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.57 + Changes: + - Increased space belt cost to be closer to blue belt. + + Bugfixes: + - Fixed space assembling machine could use productivity modules. + - Fixed issue with rail selection priory priority. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.56 + Bugfixes: + - Fixed crafting time on rocket fuel from water recipe. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.55 + Changes: + - Recycling machine can be crafted normally (not only be space manufactory). + + Bugfixes: + - Fixed that some techs hand science packs as ingredients that were not tech prerequisites (progression is unaffected, the tech tree is just clearer). + +--------------------------------------------------------------------------------------------------- +Version: 0.1.54 + Bugfixes: + - Fixed that a debug print line was left in a released version. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.53 + Changes: + - Biomechanical resistance data and bio combustion resistance data require experimental specimens not significant specimens. + + Bugfixes: + - Fixed the normal rail could be placed in space. + - Fixed that core miner could not be rotated after reloading the game. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.52 + Bugfixes: + - Fixed cargo rocket silo combinator icons too big. + - Fixed cargo rocket launch manual override not working. + - Fixed cargo rocket launch trigger green signal when rocket cargo full not working. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.51 + Changes: + - Player cannot craft lifesupport recipes anymore (many of them required fluid and weren't hand craftable anyway). + + Bugfixes: + - Set fuel refinery to require stone bricks not concrete. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.50 + Changes: + - When a cargo rocket silo is deconstructed items are generated for the space capsule and rocket sections that were consumed. Rocket fuel is still lost, but can be pumped out first. + - Added corpse markers. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.49 + Changes: + - Reduced space science requirement for robot speed research. + - Allowed productivity for Space Science Pack recipe. + + Bugfixes: + - Fixed that MK4 and MK5 energy shield recipes required themselves. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.48 + Changes: + - Added more specific status messages to launchpad GUI. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.47 + Bugfixes: + - Fixed cargo rocket silo signal output sending incorrect (higher) fuel value. + - Fixed cargo rocket silo siphoning the last 0.1% of required fuel very slowly. + - Reverted change to belts that prevented items from being dropped on them. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.46 + Features: + - Added 5 tiers of Adaptive armour. Fills a similar role to energy shields with lower power requirements but much slower regeneration. Not as good for sustained combat or skirmishing but has lower tech requirements. + - Added 6 tiers (4 new tiers) of Energy shield equipment. Energy shields charge quickly but are power hungry. Higher tier versions will be difficult to use effectively until the personal antimatter reactor equipment is added. + + Changes: + - Code changes required to have hr graphics in a separate mod that is not a required mod. + - Added cargo rocket silo launch event thanks to MFerrari. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.45 + Features: + - Added Fuel Refinery structure and technology. + - Added Rocket fuel from water recipe. + + Changes: + - Added empty barrel scrapping recipe. + - Solid fuel recipes and rocket fuel recipes are now part of fuel refining, this will break you existing solid fuel setups. + - Fuel refining recipes have had their crafting times have been reduced to 1/4, the fuel refinery is effectively 4 times faster but keeps a crafting speed of 1 to keep tooltips simple. + + Bugfixes: + - Fixed a problem with spaceship launch sequence when integrity stress exceeded maximum. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.44 + Changes: + - Added some optimizations to cargo rocket silo and landing pad GUIS. + - Removed space science prerequisite from power armor mk2. + + Bugfixes: + - Switched Fluid Burner Generators graphics back to SR (fixed) versions. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.43 + Bugfixes: + - Quick fix: Normal resolution Fluid Burner Generator sprites didn't process correctly, switching to hr Fluid Burner Generators graphics for all resolutions as a temporary workaround. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.42 + Features: + - Added Antimatter Reactors. Antimatter can be manufactured where there is abundant energy (like a star), and used to power somewhere energy poor (like deep space). + - Added Fluid Burner Generators. Can burn fluid with an energy value to generate electricity. Simple and compact but lacks the energy efficiency of steam setups. Allows spaceships to burn rocket fuel for power. + + Changes: + - Renamed supercomputer MK2 and MK3 to Quantum supercomputer and Neural supercomputer. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.41 + Changes: + - There are now 4 tiers of medpack. + - Added player respawn event call to respawn function. + - Reduced stack size of meteor defence 50 -> 20, and meteor point defence ammo 100->50. You may want to rescue the items before updating, or spawn them in if you lost out. + - Meteor point defence does not require explosives. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.40 + Changes: + - Meteors that fall in water don't leave remnants. + - Inventory filters, logistic request slots, and auto-trash filters are saved on death so your successor is created with the same settings. + + Bugfixes: + - Fixed meteor alert having completely wrong structure totals. + + Locale: + - Added string for se-core-miner-drill + +--------------------------------------------------------------------------------------------------- +Version: 0.1.39 + Changes: + - Supercomputers can now be upgraded in place. + + Bugfixes: + - Added missing unlock for bio combustion data. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.38 + Changes: + - Changed planet core mining to use a different method that does not require continuous updates via script. They are now like electric mining drills and output in the same way. You may need to remove inserters and add belts to collect the fragments. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.37 + Bugfixes: + - Fixed meteor point defence being unplaceable in space. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.36 + Bugfixes: + - Fixed collision problem with spaceship doors. + - Fixed 2 spaceship script errors. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.35 + Features: + - Added meter point defence radius visualisation on entity open and entity hover (can't add while placing the item unfortunately). + - Added spaceship launch / landing sound effects. + + Changes: + - Reduced satellite accumulator and solar panel cost + - Reduced space capsule accumulator and solar panel cost + +--------------------------------------------------------------------------------------------------- +Version: 0.1.34 + Features: + - Added Meteor point defence, a cheaper more basic meteor defence option. Has limited range, but can fire 4 times and has a much lower power requirement. + - Added custom meteor event sound. + - Added a custom alert for meteors so it does not make the annoying sound that happens when something gets printed to the console. + - Added a per-player setting for meteor alerts to be printed to the console (so you can look back later to see stats, but you get the annoying noise), off by default. + + Changes: + - Space science is now required on average 1 tech later in many tech lines. + - Rocket silo research is now cheaper and faster. + - Meteor defence installation accuracy reduced to 80%. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.33 + Bugfixes: + - Improved the on/off flicker of space science labs but it is still not perfect. The graphics still need to be redone to remove the flicker completely, but the graphics need to be updated anyway to remove the pipes. + - Fixed that cargo pods couldn't be placed in space, and therefore would be destroyed by the game engine if the tile under them was changed while in space. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.32 + Bugfixes: + - Fixed supercomputer in SR using HR graphics that got cut off. + + Changes: + - Reduced electric furnace heat shield requirement. + - Increased default meteor interval to 20 minutes. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.31 + Features: + - Fixed that higher tier thruster suits would display unarmoured character. + - Fixed angels barreling pump could not be placed space. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.30 + Features: + - Thruster suit tiers, includes different spacewalking thrust per suit + - RTG equipment to bridge the long wait for fusion reactor equipment. + + Locale: + - Added zh-CN translation by Frost. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.29 + Info: + - IMPORTANT: Compatibility patches and a few other things are being moved to a separate mod (space-exploration-postprocess). It is required, but I can't list it as a dependency. Please make sure you install it when updating (assuming you read changelogs). + - Moved all graphics to a separate package (also required but I can list it as a dependency without causing a dependency loop). This is to allow people to download code updates without repeatedly downloading 200MB of images. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.28 + Bugfixes: + - Fixed that particle accelerator had become impossible to research after shuffling some things around. + + Changes: + - Steam is no longer considered a raw ingredient for water. + + Modding: + - Bobs modules and nanobots are excluded from auto-science-pack additions. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.27 + Changes: + - Increased minimum random planet size. + - If additional fluid resources are added by mods the omni core fragment is restricted to 4 fluids, water is removed first. + + Scripting: + - Updated remote interface: begin_meteor_shower. Can now specify number of data.meteors along with data.entity or (data.zone_name and data.position) + - Added remote interface: get_zone_from_name requires data.zone_name + - Added remote interface: get_zone_from_surface_index requires data.surface_index + - Added remote interface: get_zone_from_zone_index requires data.zone_index note: this allows you to traverse the zone tree + +--------------------------------------------------------------------------------------------------- +Version: 0.1.26 + Bugfixes: + - Fixes that the cargo rocket silo and landing pad got blocked from space by a collision change. + - Fixes that sometimes Nauvis would get assigned a core fragment other than Omni. + - Fixes that spaceship launch would consume incorrect fuel. + - Fixes Spaceship console required stone instead of glass. (A leftover from the early attempt to remove AAI). + +--------------------------------------------------------------------------------------------------- +Version: 0.1.25 + Bugfixes: + - Fixed that meteors showers get stuck in pairs instead of the chances: 50% 1, 25% 2, 12.5% 3, 6.25% 4, etc... + +--------------------------------------------------------------------------------------------------- +Version: 0.1.24 + Bugfixes: + - Fixed meteors keep landing close to player. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.23 + Bugfixes: + - Fixed meteor defence ammo couldn't be inserted automatically. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.22 + Features: + - Added meteor defence. + + Changes: + - Increased stone resource generation. + - Allowed productivity for heat shielding + +--------------------------------------------------------------------------------------------------- +Version: 0.1.21 + Bugfixes: + - Fixed that lifesupport facility required space-assembling-machine. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.20 + Bugfixes: + - Potentially fixed a desync with spaceships. More testing required. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.19 + Bugfixes: + - Fixed that glass and sand recipes weren't unlockable. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.18 + Bugfixes: + - Fixed that sometimes the spaceship landing position was incorrectly offset. + - Fixed an exploit what allowed you to place space platform anywhere. + - Fixed the core mining could not be researched. + + Changes: + - Increased meteor selection priority. + - Meteors and rocket fragments now count as rocks as far as the deconstruction planner is concerned. + + Graphics: + - Improves space rail alignment and endings. + - Updated astrometric and gravimetric lab pipe connections. + + Locale: + - Added missing tech names and descriptions. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.17 + Bugfixes: + - Fixed technology loop after bobs mods changed space science to require radars-4. + + Changes: + - The space capsule return launch will now take you to a random friendly landing pad if there is one at the destination. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.16 + Bugfixes: + - Prevents Angel's fish from spawning in space. + - Fixed that entering a space capsule around a star would cause a crash. + + Graphics: + - Improved supercomputer pipe connection graphics. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.15 + Bugfixes: + - Fixed that a mod adding and removing a force on the same tick would cause a crash. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.14 + Changes: + - Increased the size of the Biological Laboratory, it needed new graphics for the all pipe connections. + - Removed AAI Industry as a dependency BUT some parts of the mod had to be copied in to Space Exploration, and it is still strongly recommended to play with that mod installed. + + Bugfixes: + - Fixed that support for Reverse Factory could break if mod load order changed. + - Fixed an incompatibility with bobs power. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.13 + Bugfixes: + - Fixed crash on renaming spaceships. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.12 + Graphics: + - Fixed pipe connections for Growth Facility + + Changes: + - Moved heat shielding in the tech tree. + - Added support for Simple Silicon. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.11 + Bugfixes: + - Fixed crash on changing resources by changing loaded mods + + Changes: + - Added more event handling for script-created entities. + - Added some more unique planet settings. + - Added support for Reverse Factory. + +--------------------------------------------------------------------------------------------------- +Version: 0.1.10 + Bugfixes: + - Fixed crash on clicking the uplink back button. + + Changes: + - Swapped rocket fuel solid->liquid production order so it will fit more easily with other mods recipe changes. + - Better angels petrochem support. diff --git a/space-exploration_0.5.58/space-exploration/collision-mask-util-extended/control/collision-mask-util-control.lua b/space-exploration_0.5.58/space-exploration/collision-mask-util-extended/control/collision-mask-util-control.lua new file mode 100644 index 0000000..9dd31dd --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/collision-mask-util-extended/control/collision-mask-util-control.lua @@ -0,0 +1,67 @@ +-- File Licence: You can copy and distribute this file regardless of the mod's general licence. This licence exception does not affect other files of this mod. +local collision_mask_util_extended = {} + +-- see collision_mask_util_extended_extended.lua for full instructions. +--[[ +-- Example usage + +local collision_mask_util_extended = require("collision-mask-util-control") +function check_collision_layers() + collision_mask_util_extended.named_collision_mask_integrity_check() + local flying_layer = collision_mask_util_extended.get_named_collision_mask("flying-layer") +end + +script.on_init(check_collision_layers) +script.on_configuration_changed(check_collision_layers) + +function find_flying_entities(surface) + local flying_layer = collision_mask_util_extended.get_named_collision_mask("flying-layer") + return surface.find_entities_filtered{collision_mask={flying_layer}} +end +]] + +function collision_mask_util_extended.get_named_collision_mask(mask_name) + local prototype = game.entity_prototypes["collision-mask-"..mask_name] + if prototype then + local layer + for mask_name, collides in pairs(prototype.collision_mask) do + if layer then + error("\n\n\nA reserved collision mask object "..mask_name.." has been compromised by 1 or more of your installed mods. Object must have only 1 collision mask.\n\n") + else + layer = mask_name + end + end + if not layer then + error("\n\n\nA reserved collision mask object "..mask_name.." has been compromised by 1 or more of your installed mods. Object is missing collision_mask.\n\n") + end + return layer + else + error("\n\n\nA reserved collision mask object "..mask_name.." has been removed.\n\n") + end +end + +function collision_mask_util_extended.named_collision_mask_integrity_check() + -- This function will check that collision mask marker objects have 1 collision mask + -- Run this on the events: on_init and on_configuration_changed + -- It will not detect collision mask marker objects that have been removed from the game + -- However: collision_mask_util_extended.get_named_collision_mask(mask_name) will + local prototypes = game.get_filtered_entity_prototypes({{filter = "type", type = "arrow"}}) + for _, prototype in pairs(prototypes) do + if string.find(prototype.name, "collision-mask-") then + local layer + for mask_name, collides in pairs(prototype.collision_mask) do + if layer then + error("\n\n\nA reserved collision mask object "..mask_name.." has been compromised by 1 or more of your installed mods. Object must have only 1 collision mask.\n\n") + else + layer = mask_name + end + end + if not layer then + error("\n\n\nA reserved collision mask object "..mask_name.." has been compromised by 1 or more of your installed mods. Object is missing collision_mask.\n\n") + end + end + end + +end + +return collision_mask_util_extended diff --git a/space-exploration_0.5.58/space-exploration/collision-mask-util-extended/data/collision-mask-util-extended.lua b/space-exploration_0.5.58/space-exploration/collision-mask-util-extended/data/collision-mask-util-extended.lua new file mode 100644 index 0000000..a48e3bd --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/collision-mask-util-extended/data/collision-mask-util-extended.lua @@ -0,0 +1,184 @@ +-- File Licence: You can copy and distribute this file regardless of the mod's general licence. This licence exception does not affect other files of this mod. +local collision_mask_util_extended = require("__core__/lualib/collision-mask-util") + +--[[ + +Named collision masks allow a collision mask to be passed to the control phase. +The arrow object used to stor the mask is accessible under: game.entity_prototypes["collision-mask-flying-layer"] +The layer used is therefore: game.entity_prototypes["collision-mask-flying-layer"].collision_mask .. something + +-------------------------------------------------------------------------------- +-- INSTRUCTIONS +-------------------------------------------------------------------------------- + +-- flying-layer example: +-- data phase ------------------------------------------------------------------ +(data.lua data-updates.lua data-final-fixes.lua etc) get/make a layer: + +-- load the modified util +local collision_mask_util_extended = require("collision-mask-util-extended") + +-- get a collision layer by name, if the name is not assigned to a layer it will assign one +local flying_layer = collision_mask_util_extended.get_make_named_collision_mask("flying-layer") + +-- control phase --------------------------------------------------------------- +(conrtol.lua) Note: most mods don't need to know collision layers in control code. +local collision_mask_util_extended = require("collision-mask-util-control") + +-- Example usage +local flying_layer = collision_mask_util_extended.get_named_collision_mask("flying-layer") +local entities = surface.find_entities_filtered{collision_mask={flying_layer}} + +-------------------------------------------------------------------------------- +-- Additional named layers +-------------------------------------------------------------------------------- +"flying-layer" +-- local collision_mask_flying_layer = get_make_named_collision_mask("flying-layer") +Flying vehicles, units, and characters. +It is useful to also set the mask "not-colliding-with-itself" to prefent air-air collisions. +The mask can also be added to interior walls that are full height so can't be flown over. + +"projectile-layer" +-- local collision_mask_projectile_layer = get_make_named_collision_mask("projectile-layer") +Projectiles. The the projectile should have the layers or most things it can hit (flying-layer). +Walls and shields can also use this layer to block the projectile. +Note: Projectiles use hit_collision_mask not collision_mask. force_condition = "not-friend" means it won't hit your stuff. +Note: Streams can't collide. + +"vehicle-layer" +-- local collision_mask_vehicle_layer = get_make_named_collision_mask("vehicle-layer") +Car type vehicles and things that collide with them. Allows separation of vehicle-layer and player-layer in certain situations. Add to cars, trees, pipes + +"space-tile" +-- local collision_mask_space_tile = get_make_named_collision_mask("space-tile") +All tiles in space zones (orbit/asteroid fields) including empty space and space platform. + +"empty-space-tile" +-- local collision_mask_empty_space_tile = get_make_named_collision_mask("empty-space-tile") +tiles in space without flooring. +Different from void becuase there is no grravity and stuff can float there. + +"interior-tile" +-- local collision_mask_interior_tile = get_make_named_collision_mask("interior-tile") +Tiles that represent interior spaces and don't have sky, like underground, factory building interiors, etc. +Rocket silos, artillery, telescopes, and space elevators may not be appropriate here. + +"moving-tile" +-- local collision_mask_moving_tile = get_make_named_collision_mask("moving-tile") +Tiles that might change surface, such as spaceship tiles or warp structures. + +"void-tile" +-- local collision_mask_void_tile = get_make_named_collision_mask("void-tile") +Tiles where there is a drop in to the ground (so you can't walk over or build on) but you can fly/jump over. + +]] +local collision_flags = +{ + "consider-tile-transitions", + "not-colliding-with-itself", + "colliding-with-tiles-only" +} +collision_mask_util_extended.collision_flags = table.deepcopy(collision_flags) + +collision_mask_util_extended.vanilla_named_collision_masks = { + ["ground-tile"] = "ground-tile", + ["water-tile"] = "water-tile", + ["resource-layer"] = "resource-layer", + ["doodad-layer"] = "doodad-layer", + ["floor-layer"] = "floor-layer", + ["item-layer"] = "item-layer", + ["ghost-layer"] = "ghost-layer", + ["object-layer"] = "object-layer", + ["player-layer"] = "player-layer", + ["train-layer"] = "train-layer", + ["rail-layer"] = "rail-layer", + ["transport-belt-layer"] = "transport-belt-layer" +} + +-- fix issue reported in F1.1.5 +collision_mask_util_extended.get_default_mask_vanilla = collision_mask_util_extended.get_default_mask +collision_mask_util_extended.get_default_mask = function (type) + if type == "unit" then + return {"player-layer", "train-layer", "not-colliding-with-itself"} + else + return collision_mask_util_extended.get_default_mask_vanilla(type) + end +end + +_named_collision_masks = _named_collision_masks or table.deepcopy(collision_mask_util_extended.vanilla_named_collision_masks) -- do not modify directly +named_collision_masks = table.deepcopy(_named_collision_masks) -- readonly +collision_mask_util_extended.named_collision_masks = named_collision_masks +-- tracks mod layers only. format: named_collision_masks[mask_name] == "layer-"..x + +function collision_mask_util_extended.get_named_collision_mask(mask_name) + return _named_collision_masks[mask_name] +end + +function collision_mask_util_extended.get_make_named_collision_mask(mask_name) + local layer = collision_mask_util_extended.get_named_collision_mask(mask_name) + if not layer then + layer = collision_mask_util_extended.get_first_unused_layer() + log("Named collision layer ["..mask_name .."] set to layer ["..layer.."]") + data:extend({ + { + type = "arrow", + name = "collision-mask-"..mask_name, + collision_mask = {layer}, + flags = {"placeable-off-grid", "not-on-map"}, + circle_picture = { filename = "__core__/graphics/empty.png", priority = "low", width = 1, height = 1}, + arrow_picture = { filename = "__core__/graphics/empty.png", priority = "low", width = 1, height = 1} + } + }) + end + _named_collision_masks[mask_name] = layer + named_collision_masks = table.deepcopy(_named_collision_masks) -- readonly + collision_mask_util_extended.named_collision_masks = named_collision_masks + return layer +end + +function collision_mask_util_extended.named_collision_mask_integrity_check() + -- This function will check that collision mask marker objects have 1 collision mask + for mask_name, layer_name in pairs(_named_collision_masks) do + if not collision_mask_util_extended.vanilla_named_collision_masks[mask_name] then + local mask_bearer = data.raw.arrow["collision-mask-"..mask_name] + local layer + if mask_bearer then + if mask_bearer.collision_mask then + for i, mask in pairs(mask_bearer.collision_mask) do + if i == 1 then + if mask == "not-colliding-with-itself" + or mask == "consider-tile-transitions" + or mask == "colliding-with-tiles-only" then + error("\n\n\nA reserved collision mask object "..mask_name.." has been compromised by 1 or more of your installed mods. Collision mask must be a collision layer, not a collision option.\n\n") + end + layer = mask + else + error("\n\n\nA reserved collision mask object "..mask_name.." has been compromised by 1 or more of your installed mods. Object must have only 1 collision mask.\n\n") + end + end + else + error("\n\n\nA reserved collision mask object "..mask_name.." has been compromised by 1 or more of your installed mods. Object is missing collision_mask.\n\n") + end + else + error("\n\n\nA reserved collision mask object "..mask_name.." has been removed.\n\n") + end + end + end +end + +function collision_mask_util_extended.is_mask_empty(mask) + for _, layer in pairs(mask) do + local is_flag = false + for _, option in pairs(collision_flags) do + if layer == option then + is_flag = true + end + end + if not is_flag then + return false + end + end + return true +end + +return collision_mask_util_extended diff --git a/space-exploration_0.5.58/space-exploration/control.lua b/space-exploration_0.5.58/space-exploration/control.lua new file mode 100644 index 0000000..6a3ed54 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/control.lua @@ -0,0 +1,2070 @@ +require("stdlib/table") +require("stdlib/string") +mod_gui = require("__core__/lualib/mod-gui") +collision_mask_util_extended = require("__space-exploration__/collision-mask-util-extended/control/collision-mask-util-control") + +version = 0005056 -- 0.5.056 +local mod_display_name = "Space Exploration" +is_debug_mode = false + +Util = require("scripts/util") util = Util +sha2 = require('scripts/sha2') +Essential = require('scripts/essential') + +Log = require('scripts/log') +Event = require('scripts/event') +Profiler = require( 'scripts/profiler') + +Shared = require("shared") +UniverseRaw = require("scripts/universe-raw") +Universe = require("scripts/universe") +Location = require('scripts/location') +Pin = require('scripts/pin') +RemoteView = require('scripts/remote-view') +MapView = require( 'scripts/map-view') +Respawn = require('scripts/respawn') +LaunchpadGUI = require('scripts/launchpad-gui') +Launchpad = require('scripts/launchpad') +LandingpadGUI = require('scripts/landingpad-gui') +Landingpad = require('scripts/landingpad') +Capsule = require('scripts/capsule') +Zone = require('scripts/zone') +Zonelist = require('scripts/zonelist') +Weapon = require('scripts/weapon') +Medpack = require('scripts/medpack') +Spaceship = require('scripts/spaceship') +Coreminer = require('scripts/core-miner') +CondenserTurbine = require('scripts/condenser-turbine') +BigTurbine = require('scripts/big-turbine') +Meteor = require('scripts/meteor') +Beacon = require('scripts/beacon') +Lifesupport = require('scripts/lifesupport') +DeliveryCannonGUI = require('scripts/delivery-cannon-gui') +DeliveryCannon = require('scripts/delivery-cannon') +Composites = require('scripts/composites') +EnergyBeamGUI = require('scripts/energy-beam-gui.lua') +EnergyBeam = require('scripts/energy-beam') +EnergyBeamDefence = require('scripts/energy-beam-defence') +SolarFlare = require('scripts/solar-flare') +Nexus = require('scripts/nexus') +Arco = require('scripts/arco') +Interburbulator = require('scripts/interburbulator') +LinkedContainer = require('scripts/linked-container') + +Ancient = require('scripts/ancient') +DAnchor = require('scripts/dimensional-anchor') +Ruin = require('scripts/ruin') + +Informatron = require('scripts/informatron') + +require('scripts/compatibility/miniloaders') +EntityMove = require('scripts/compatibility/entity-move') +AbandonedRuins = require('scripts/compatibility/abandoned-ruins') + +Migrate = require('scripts/migrate') + +sp_tile_scaffold = mod_prefix.."space-platform-scaffold" +sp_tile_plate = mod_prefix.."space-platform-plating" +name_space_tile = mod_prefix.."space" +name_out_of_map_tile = "out-of-map" +space_tiles = { + name_space_tile +} +name_asteroid_tile = mod_prefix.."asteroid" + +tiles_allowed_in_space = { + name_out_of_map_tile, + name_space_tile, + name_asteroid_tile, + sp_tile_scaffold, + sp_tile_plate, + mod_prefix .. "spaceship-floor", + "transport-drone-road", + "transport-drone-proxy-tile", +} + +name_fluid_rocket_fuel = mod_prefix.."liquid-rocket-fuel" +name_thermofluid_hot = mod_prefix.."space-coolant-hot" +name_thermofluid_supercooled = mod_prefix.."space-coolant-supercooled" +name_suffix_spaced = "-spaced" +name_suffix_grounded = "-grounded" + +name_thruster_suits = { + mod_prefix.."thruster-suit", + mod_prefix.."thruster-suit-2", + mod_prefix.."thruster-suit-3", + mod_prefix.."thruster-suit-4", +} +base_space_thrust = 1 +thruster_suit_thrust = { + [mod_prefix.."thruster-suit"] = 2, + [mod_prefix.."thruster-suit-2"] = 3, + [mod_prefix.."thruster-suit-3"] = 4, + [mod_prefix.."thruster-suit-4"] = 5, +} + +first_starting_item_stacks = { + {name = mod_prefix.."medpack", count = 5}, + {name = mod_prefix.."capsule-big-biter", count = 1}, +} +starting_item_stacks = { + {name = mod_prefix.."medpack", count = 1} +} + +suffocation_interval = 120 + +collision_player = mod_prefix.."collision-player" +collision_player_not_space = mod_prefix.."collision-player-not-space" +collision_rocket_destination_surface = mod_prefix.."collision-rocket-destination-surface" +collision_rocket_destination_orbit = mod_prefix.."collision-rocket-destination-orbital" + + +function get_make_playerdata(player) + global.playerdata = global.playerdata or {} + global.playerdata[player.index] = global.playerdata[player.index] or {} + return global.playerdata[player.index] +end + +function player_set_dropdown_values(player, key, values) + local playerdata = get_make_playerdata(player) + playerdata.dropdown_values = playerdata.dropdown_values or {} + playerdata.dropdown_values[key] = values +end + +function player_get_dropdown_value(player, key, index) + local playerdata = get_make_playerdata(player) + if playerdata.dropdown_values and playerdata.dropdown_values[key] then + return playerdata.dropdown_values[key][index] + end +end + +function player_clear_dropdown_values(player, key) + local playerdata = get_make_playerdata(player) + if playerdata.dropdown_values then playerdata.dropdown_values[key] = nil end +end + +function player_clear_all_dropdown_values(player) + local playerdata = get_make_playerdata(player) + playerdata.dropdown_values = nil +end + +function player_get_character(player) + if player.character then return player.character end + local playerdata = get_make_playerdata(player) + if playerdata.character then + if playerdata.character.valid then + return playerdata.character + else + playerdata.character = nil + end + end +end + +-- creation must contain position +-- returns entity, position +function create_non_colliding(surface, creation, radius, precision) + radius = radius or 32 + precision = precision or 1 + local try_pos = creation.position + local safe_pos = surface.find_non_colliding_position(creation.name, try_pos, radius, 1)or try_pos + creation.position = safe_pos + return surface.create_entity(creation), safe_pos +end + +-- returns entity, position +function teleport_non_colliding(entity, position, radius, precision) + if entity then + radius = radius or 32 + precision = precision or 1 + local try_pos = position + local safe_pos = entity.surface.find_non_colliding_position(entity.name, try_pos, radius, 1) or try_pos + entity.teleport(safe_pos) + return entity, safe_pos + end +end + +function teleport_non_colliding_player(player, position, surface, radius, precision) + surface = surface or player.surface + radius = radius or 32 + precision = precision or 1 + local try_pos = position + local safe_pos = surface.find_non_colliding_position(player.character.name, try_pos, radius, 1) or try_pos + player.teleport(safe_pos, surface) + return player, safe_pos +end + +function teleport_character_to_surface(character, surface, position) + local try_pos = position + local safe_pos = surface.find_non_colliding_position(character.name, try_pos, 32, 1) or try_pos + if surface == character.surface then + -- easy + character.teleport(safe_pos) + return character, safe_pos + end + local zone = Zone.from_surface(surface) + if zone then + Zone.discover(character.force.name, zone) + end + if character.player then + -- use the player to do it + local player = character.player + player.teleport(safe_pos, surface) -- surface change breaks character reference + local playerdata = get_make_playerdata(player) + playerdata.last_position = nil + playerdata.set_postition = nil + playerdata.velocity = nil + return player.character, safe_pos + end + + -- attach a player to do it + for player_index, playerdata in pairs(global.playerdata) do + local player = game.players[player_index] + if player and player.connected then + if RemoteView.is_active(player) and playerdata.character and playerdata.character == character then + local player_pos = player.position + local player_surface = player.surface + player.teleport(playerdata.character.position, playerdata.character.surface) + player.set_controller{type = defines.controllers.character, character = playerdata.character} + player.teleport(safe_pos, surface) -- surface change breaks character reference + playerdata.character = player.character + player.set_controller{type = defines.controllers.ghost} + --player.set_controller{type = defines.controllers.spectator} + player.teleport(player_pos, player_surface) + playerdata.last_position = nil + playerdata.set_postition = nil + playerdata.velocity = nil + Log.trace("character moved by reassociation") + return playerdata.character, safe_pos + end + end + end + + -- clone the character and destroy the original + -- what could possibly go wrong? + surface.clone_entities{ + entities = {character}, + destination_offset = util.vectors_delta(character.position, safe_pos), + destination_surface = surface, + destination_force = character.force, + snap_to_grid = false + } + local candidate = surface.find_entity(character.name, safe_pos) + if candidate and candidate.player == nil + and candidate.color.r == character.color.r + and candidate.color.g == character.color.g + and candidate.color.b == character.color.b then + candidate.teleport(safe_pos) + for player_index, playerdata in pairs(global.playerdata) do + if playerdata.character and playerdata.character == character then + playerdata.character = candidate + end + end + character.destroy() + Log.trace("character moved by cloning") + return clone, safe_pos + end + local candidates = surface.find_entities_filtered{ + type = character.type, + name = character.name, + force = character.force + } + for _, candidate in pairs(candidates) do + if candidate.player == nil + and candidate.color.r == character.color.r + and candidate.color.g == character.color.g + and candidate.color.b == character.color.b then + candidate.teleport(safe_pos) + + for player_index, playerdata in pairs(global.playerdata) do + if playerdata.character and playerdata.character == character then + playerdata.character = candidate + end + end + character.destroy() + Log.trace("character moved by cloning") + return clone, safe_pos + end + end + + Log.trace("character move by cloning but failed") + -- failed + return nil, safe_pos +end + +function surface_set_area_tiles(data) + -- data.surface + -- data.name (tile type) + -- data.area + if not (data.surface and data.name and data.area) then return end + + local tiles = {} + for y = data.area.left_top.y, data.area.right_bottom.y, 1 do + for x = data.area.left_top.x, data.area.right_bottom.x, 1 do + table.insert(tiles, { + name = data.name, + position = {x = x, y = y}}) + end + end + data.surface.set_tiles(tiles, true) +end + +function surface_set_space_tiles(data) + -- data.surface + -- data.area + if not (data.surface and data.area) then return end + + local tiles = {} + for y = data.area.left_top.y, data.area.right_bottom.y, 1 do + for x = data.area.left_top.x, data.area.right_bottom.x, 1 do + table.insert(tiles, { + name = name_space_tile, + position = {x = x, y = y}}) + end + end + data.surface.set_tiles(tiles, true) +end + +function position_2d_array_add(array, position) + if not array[position.y] then array[position.y] = {} end + if not array[position.y][position.x] then array[position.y][position.x] = position end +end + +function position_2d_array_add_range(array, position, range) + for y = position.y - range, position.y + range, 1 do + for x = position.x - range, position.x + range, 1 do + position_2d_array_add(array, {x = x, y = y}) + end + end +end + +function tile_is_space(tile) + for _, name in pairs(space_tiles) do + if tile.name == name then return true end + end + return false +end + +function tile_is_space_platform(tile) + return tile.name == sp_tile_plate or tile.name == sp_tile_scaffold +end + +function tile_is_space_platform(tile) + return tile.name == sp_tile_plate or tile.name == sp_tile_scaffold +end + + +--[[function on_player_created(event) + --local player = game.players[event.player_index] + --TODO: capsule crash sequence +end +Event.addListener(defines.events.on_player_created, on_player_created)]]-- + +function close_own_guis(player) + -- NOTE: don't close remote view gui here + Capsule.gui_close(player) + Spaceship.gui_close(player) + --player_clear_all_dropdown_values(player) +end + + +--[[ + tag: { + surface_name (optional) + force_name + position + icon_type (item/virtual) + icon_name + text + chart_range (optional) + } +]] +function chart_tag_buffer_add(tag) + local surface = tag.surface + local force_name = tag.force_name + local force = game.forces[force_name] + local range = tag.chart_range or Zone.discovery_scan_radius + + force.chart(surface, util.position_to_area(tag.position, range)) + + global.chart_tag_buffer = global.chart_tag_buffer or {} + global.chart_tag_next_id = (global.chart_tag_next_id or 0) + 1 + global.chart_tag_buffer[global.chart_tag_next_id] = tag +end + +function process_chart_tag_buffer() + if global.chart_tag_buffer then + local tags_remaining = 0 + for _, tag in pairs(global.chart_tag_buffer) do + local surface = tag.surface + local force_name = tag.force_name + local force = game.forces[force_name] + if force then + local chart_tag = force.add_chart_tag(surface, { + icon = {type = tag.icon_type, name = tag.icon_name}, + position = tag.position, + text = tag.text + }) + if chart_tag then + global.chart_tag_buffer[_] = nil + else + tags_remaining = tags_remaining + 1 + end + else + global.chart_tag_buffer[_] = nil + end + end + if tags_remaining == 0 then + -- cleanup + global.chart_tag_buffer = nil + global.chart_tag_next_id = nil + end + end +end + +function player_capture_selected(player) + local playerdata = get_make_playerdata(player) + if playerdata.capture_text and rendering.is_valid(playerdata.capture_text) then + rendering.destroy(playerdata.capture_text) + end + local entity = player.selected + if entity and (entity.force.name == "capture" or entity.force.name == "conquest") and entity.type ~= "wall" then + local range = 1 + local box = entity.bounding_box + local pos = player.position + if player.character and pos.x > box.left_top.x - range + and pos.x < box.right_bottom.x + range + and pos.y > box.left_top.y - range + and pos.y < box.right_bottom.y + range then + local blocker = entity.surface.find_nearest_enemy{position=entity.position, max_distance=32, force=player.force} + if blocker then + entity.surface.create_entity{ + name = "flying-text", + position = entity.position, + text = {"space-exploration.capture-blocked"}, + render_player_index = player.index, + } + else + entity.force = player.force + local zone = Zone.from_surface(entity.surface) + if zone then + local inventory = entity.get_inventory(defines.inventory.chest) + if inventory then + for _, item_name in pairs(Ruin.track_loot_items) do + local count = inventory.get_item_count(item_name) + if count > 0 then + zone.looted_items = zone.looted_items or {} + zone.looted_items[item_name] = (zone.looted_items[item_name] or 0) + count + end + end + end + end + end + else + if not Util.table_contains( + {"turret", "ammo-turret", "electric-turret", "fluid-turret", "artillery-turret", + "combat-robot", "logistic-robot", "construction-robot", + "wall", "gate"}, entity.type) then + playerdata.capture_text = rendering.draw_text{ + text = {"space-exploration.touch-to-capture"}, + surface = entity.surface, + target = entity, + target_offset = {0, -0.5}, + players={player}, + color={r=0.8,g=0.8,b=0.8,a=0.8}, + alignment="center", + scale = (1 + box.right_bottom.x-box.left_top.x)/3, + } + end + end + end +end + +function on_selected_entity_changed(event) + local player = game.players[event.player_index] + player_capture_selected(player) +end +Event.addListener(defines.events.on_selected_entity_changed, on_selected_entity_changed) + + +function get_selected_index(array, current) + local i = 0 + for _, item in ipairs(array) do + i = i + 1 + if item == current then return i end + end +end + +function get_dropdown_string(element, relevant_value) + if not relevant_value then relevant_value = 1 end + if element.selected_index and element.items[element.selected_index] then + local selected = element.items[element.selected_index] + if type(selected) == "string" then + return selected + elseif type(selected) == "table" and selected[relevant_value] then + return selected[relevant_value] + end + end +end + +function selected_name_from_dropdown_preset(element, preset) + -- options eg: destination_type_options + + local selected_string = get_dropdown_string(element) + for _, option in pairs(preset) do + if type(option.display) == "string" then + if option.display == selected_string then + return option.name + end + elseif type(option.display) == "table" and option.display[1] == selected_string then + return option.name + end + end +end + +function dropdown_from_preset(preset, current) + -- options eg: destination_type_options + local selected_index + local list = {} + for _, option in pairs(preset) do + table.insert(list, option.display) + if option.name == current then selected_index = #list end + end + return list, selected_index +end + +function count_inventory_slots_used(inv) + return #inv - inv.count_empty_stacks() +end + +function gui_element_or_parent(element, name) + if not element then return end + if element.name == name then + return element + elseif element.parent then + return gui_element_or_parent(element.parent, name) + end +end + +function on_tick_player(player) + + local playerdata = get_make_playerdata(player) + + --on_tick_player_gui(player) + + -- save position + playerdata.surface_positions = playerdata.surface_positions or {} + playerdata.surface_positions[player.surface.index] = player.position +end + +function on_surface_deleted(event) + if global.playerdata then + for _, playerdata in pairs(global.playerdata) do + if playerdata.surface_positions then + playerdata.surface_positions[event.surface_index] = nil + end + end + end + Zone.rebuild_surface_index() +end +Event.addListener(defines.events.on_surface_deleted, on_surface_deleted) + + +function on_marked_for_deconstruction(event) + if event.entity and event.entity.valid and event.entity.type == "deconstructible-tile-proxy" then + local position = event.entity.position + local area = Util.tile_to_area(position) + local surface = event.entity.surface + local tile_under = surface.get_hidden_tile(position) + if tile_under then + local tile_proto = game.tile_prototypes[tile_under] + local collision_mask = {} + for name, blocks in pairs(tile_proto.collision_mask) do + if blocks then table.insert(collision_mask, name) end + end + local blocking_entities = 0 + for _, entity in pairs(event.entity.surface.find_entities_filtered{area = area, collision_mask = collision_mask}) do + if entity.type ~= "deconstructible-tile-proxy" and entity.type ~= "corpse" then + blocking_entities = blocking_entities + 1 + end + end + if blocking_entities > 0 then + event.entity.destroy() + --[[surface.create_entity{ + name = "flying-text", + position = position, + text = "Blocked", + render_player_index = event.player_index, + }]] + end + end + end +end +Event.addListener(defines.events.on_marked_for_deconstruction, on_marked_for_deconstruction) + +function is_character_passenger(character) + if character and character.vehicle then return true end + if global.tick_tasks then + for _, tick_task in pairs(global.tick_tasks) do + if tick_task.passengers then + for _, passenger in pairs(tick_task.passengers) do + if passenger == character then + return true + end + end + end + end + end + return false +end + +function on_player_changed_position(event) + local player = game.players[event.player_index] + if not player.character then return end + local playerdata = get_make_playerdata(player) + player_capture_selected(player) + local zone = Zone.from_surface(player.surface) + if zone then + if player.vehicle and player.vehicle.type == "spider-vehicle" then + local tile = player.surface.get_tile(player.vehicle.position) + if tile.name == "interior-divider" then + playerdata.interior_divider_collisions = (playerdata.interior_divider_collisions or 0) + 1 + local max_health = player.vehicle.prototype.max_health + player.vehicle.health = math.min(max_health - max_health * playerdata.interior_divider_collisions / 10, player.vehicle.health - player.vehicle.health / 10) + if player.vehicle.health <= 1 then + player.vehicle.die() + playerdata.interior_divider_collisions = nil + teleport_non_colliding_player(player, player.position) + end + end + end + -- track visited + if not playerdata.visited_zone then playerdata.visited_zone = {} end + if zone.type ~= "spaceship" and not playerdata.visited_zone[zone.index] then playerdata.visited_zone[zone.index] = game.tick end + + if (not playerdata.has_entered_anomaly) and zone.type == "anomaly" and player.character then + playerdata.has_entered_anomaly = true + player.print({"space-exploration.galaxy_ship_authenticated"}) + for _, entity in pairs(player.surface.find_entities_filtered{force="ignore"}) do + entity.force = "friendly" + end + player.force.chart(player.surface, util.position_to_area(Ancient.galaxy_ship_default_position, 2)) + player.force.chart_all(player.surface) + end + if zone.vault_pyramid_position then + if (not player.vehicle) then + if not (zone.vault_pyramid and zone.vault_pyramid.valid) then + -- make the pyramid again. + Ancient.make_vault_exterior(zone) + end + -- check if touching the pyramid + local x_test = Ancient.pyramid_width/2 + local y_test = Ancient.pyramid_height/2 + local buffer = 1 + if player.position.x < zone.vault_pyramid_position.x + x_test + buffer + and player.position.x > zone.vault_pyramid_position.x - x_test - buffer + and player.position.y < zone.vault_pyramid_position.y + y_test + buffer + and player.position.y > zone.vault_pyramid_position.y - y_test - buffer then + if (not string.find(player.character.name, "jetpack", 1, true)) and (not is_character_passenger(player.character)) then + Ancient.make_vault_interior(zone) + local vault = global.glyph_vaults[zone.glyph][zone.index] + local vault_surface = game.surfaces[vault.surface_index] + player.teleport({0, Ancient.cartouche_path_end-2}, vault_surface) + local corpses = vault_surface.find_entities_filtered{type="corpse"} + for _, corpse in pairs(corpses) do corpse.destroy() end + if not playerdata.first_entered_vault then + playerdata.first_entered_vault = zone + end + end + end + end + end + else -- no zone + local vault = Ancient.vault_from_surface(player.surface) + if vault then + -- check if on the entrance/exit section + if player.position.x <=4 and player.position.x >= -4 and player.position.y > Ancient.cartouche_path_end -1 and player.position.y < Ancient.cartouche_path_end +1 then + local zone = Zone.from_zone_index(vault.zone_index) + local zone_surface = Zone.get_make_surface(zone) + local pos = table.deepcopy(zone.vault_pyramid_position) or {x = 0, y = 0} + pos.y = pos.y + Ancient.pyramid_height/2 + 1 + teleport_character_to_surface(player.character, zone_surface, pos) + end + end + end +end +Event.addListener(defines.events.on_player_changed_position, on_player_changed_position) + + +function on_trigger_created_entity(event) + if event.entity and event.entity.valid and event.entity.name == mod_prefix.."trigger-movable-debris" then + -- meteor and rocket fragments + + local surface = event.entity.surface + local deconstruct = false + for force in pairs(game.forces) do + local networks = surface.find_logistic_networks_by_construction_area(event.entity.position, force) + if networks and #networks > 0 then + for _, network in pairs(networks) do + if network.storages and #network.storages > 1 then + local entities = surface.find_entities_filtered{position = event.entity.position, type = "simple-entity"} + for _, entity in pairs(entities) do + entity.order_deconstruction(force) + deconstruct = true + end + end + end + end + end + if not deconstruct then + local tile = surface.get_tile(event.entity.position.x, event.entity.position.y) + local meteors = surface.find_entities_filtered{ type = "simple-entity", area = Util.position_to_area(event.entity.position, 1) } + for _, meteor in pairs(meteors) do + if string.find(meteor.name, "meteor", 1, true) then + if tile.collides_with("player-layer") then + meteor.destroy() + else + --[[ + local size = math.random() < 0.5 and "crater2-medium" or "crater1-large" + surface.create_decoratives{ + check_collision = true, + decoratives={ + { + name=size, + position = event.entity.position, + amount = 1 + } + } + } + ]]-- + end + end + end + end + end +end +Event.addListener(defines.events.on_trigger_created_entity, on_trigger_created_entity) + +function cancel_entity_creation(entity, player_index, message) + -- put an item back in the inventory or drop to ground + -- display flying text + local player + if player_index then + player = game.players[player_index] + end + local inserted = 0 + local item_to_place = entity.prototype.items_to_place_this[1] + local surface = entity.surface + local position = entity.position + if player then + if player.mine_entity(entity, false) then + inserted = 1 + elseif item_to_place and item_to_place.name then + inserted = player.insert{name = item_to_place.name, count = 1} + end + -- play entity cannot build sound + player.play_sound{ + path = "utility/cannot_build", + volume_modifier = 1.0 + } + end + if inserted == 0 and item_to_place and item_to_place.name then + surface.create_entity{ + name = "item-on-ground", + position = position, + stack = {name = item_to_place.name, count = 1} + } + end + surface.create_entity{ + name = "flying-text", + position = position, + text = message, + render_player_index = player_index, + } + if entity and entity.valid then + entity.destroy() + end +end + +function cancel_tile_placement(surface, tile, old_tiles, player_index, message) + -- put an item back in the inventory or drop to ground + -- display flying text + local player + if player_index then + player = game.players[player_index] + if player.controller_type == defines.controllers.editor then + -- tile placement could be allowed for testing but it will create errors further down the line so this should not be enabled. + -- e.g: + -- space platform on a spaceship surface will break cause errors. + -- water and/or land in space will cause entity problems. + -- space surfaces on planets will cause entity problems and maybe errors. + end + end + local set_tiles = {} + for i, old_tile in pairs(old_tiles) do + if tile.items_to_place_this and tile.items_to_place_this[1] then + local inserted = 0 + if player then + inserted = player.insert{name = tile.items_to_place_this[1].name, count = 1} + end + if inserted == 0 then + surface.create_entity{ + name = "item-on-ground", + position = old_tile.position, + --["item-entity"] = {name = tile.items_to_place_this[1].name, count = 1} + stack = {name = tile.items_to_place_this[1].name, count = 1} + } + end + end + if i == 1 then + surface.create_entity{ + name = "flying-text", + position = old_tile.position, + text = message, + render_player_index = player_index, + } + end + local hidden = surface.get_hidden_tile(old_tile.position) + table.insert(set_tiles, {name = hidden or old_tile.old_tile.name, position = old_tile.position}) + end + surface.set_tiles(set_tiles) +end + +function swap_structure(entity, prototype_name) + local surface = entity.surface + local recipe = entity.get_recipe() + local clone = surface.create_entity{ + name = prototype_name, + position = entity.position, + force = entity.force, + direction = entity.direction, + recipe = recipe and recipe.name + } + clone.operable = entity.operable + clone.active = entity.active + clone.destructible = entity.destructible + clone.rotatable = entity.rotatable + local inventories = {} + for _, inv_type in pairs({ + defines.inventory.fuel, + defines.inventory.burnt_result, + defines.inventory.furnace_source, + defines.inventory.furnace_result, + defines.inventory.furnace_modules, + defines.inventory.assembling_machine_input, + defines.inventory.assembling_machine_output, + defines.inventory.assembling_machine_modules + }) do + inventories[inv_type] = inv_type -- no duplicate indexes + end + for _, inv_type in pairs(inventories) do + local inv_a = entity.get_inventory(inv_type) + local inv_b = clone.get_inventory(inv_type) + if inv_a and inv_b then + util.move_inventory_items(inv_a, inv_b) + end + end + entity.destroy() + clone.teleport(clone.position) -- reconnect pipes + return clone +end + +function is_surface_space(surface) + local zone = Zone.from_surface(surface) + if zone and Zone.is_space(zone) then + return true + elseif surface and surface.name and string.starts(surface.name, "Space Factory") then -- Space Factorissimo compatibility + return true + end + return false +end + +function on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if (not entity) or entity.type == "entity-ghost" or entity.type == "tile-ghost" then return end + + if entity.type ~= "deconstructible-tile-proxy" and entity.type ~= "car" and entity.type ~= "spider-vehicle" then + local area = entity.bounding_box + local surface = entity.surface + local proxies = surface.find_entities_filtered{area = area, type = "deconstructible-tile-proxy"} + for _, proxy in pairs(proxies) do + proxy.destroy() + end + end + + if is_surface_space(entity.surface) then + if (entity.type == "car") + and (not string.find(entity.name, mod_prefix.."space", 1, true)) + and entity.prototype.effectivity > 0 then + return cancel_entity_creation(entity, event.player_index, {"space-exploration.construction-denied-vehicle-in-space"}) + end + if game.entity_prototypes[entity.name..name_suffix_spaced] then + -- replace with spaced + return swap_structure(entity, entity.name..name_suffix_spaced) + end + if string.find(entity.name, name_suffix_grounded, 1, true) then + -- replace with non-grounded + return swap_structure(entity, util.replace(entity.name, name_suffix_grounded, "")) + end + if entity.type == "offshore-pump" then + return cancel_entity_creation(entity, event.player_index, {"space-exploration.construction-denied"}) + end + else -- not space + if string.find(entity.name, name_suffix_spaced, 1, true) then + -- replace with non-spaced + return swap_structure(entity, util.replace(entity.name, name_suffix_spaced, "")) + end + if game.entity_prototypes[entity.name..name_suffix_grounded] then + -- replace with grounded + return swap_structure(entity, entity.name..name_suffix_grounded) + end + if zone and entity.name == "kr-atmospheric-condenser" and (not zone.is_homeworld) and zone.tags and util.table_contains(zone.tags, "water_none") then + return cancel_entity_creation(entity, event.player_index, {"space-exploration.construction-denied-no-water"}) + end + if zone and entity.type == "offshore-pump" and (not zone.is_homeworld) and zone.tags and util.table_contains(zone.tags, "water_none") then + if entity.prototype.fluid == "water" then -- there is no water on this planet, send via rocket, cannon, or ship + return cancel_entity_creation(entity, event.player_index, {"space-exploration.construction-denied-no-water"}) + end + end + end + +end +Event.addListener(defines.events.on_robot_built_entity, on_entity_created) +Event.addListener(defines.events.on_built_entity, on_entity_created) +Event.addListener(defines.events.script_raised_built, on_entity_created) +Event.addListener(defines.events.script_raised_revive, on_entity_created) + +--[[ +When the player kills themself by placing water under themselves, the on_built_tile event does not fire. +Instead we listen to the on_player_died event, and replace any nearby water tiles with some non-water tile next to it. +]] +function on_pre_player_died(event) + local player = game.players[event.player_index] + local zone = Zone.from_surface(player.surface) + if (not zone) or Zone.is_solid(zone) then -- treat as land + if zone and (not zone.is_homeworld) and (zone.tags and (util.table_contains(zone.tags, "water_none"))) then + -- water should not be here + local area = {left_top = {player.position.x - 20, player.position.y - 20}, right_bottom = {player.position.x + 20, player.position.y + 20}} + local tick_task = new_tick_task("remove-water") + tick_task.delay_until = game.tick + 1 + tick_task.surface = player.surface + tick_task.area = area + tick_task.position = player.position + end + end +end +Event.addListener(defines.events.on_pre_player_died, on_pre_player_died) + +function remove_water_tiles(surface, area, position) + local bad_tiles = {} + local good_tile_name + for _, tile in pairs(surface.find_tiles_filtered({ + area = area + })) do + if string.find(tile.name, "water", 1, true) then + table.insert(bad_tiles, tile) + else + good_tile_name = tile.name + end + end + if not good_tile_name then -- if we cant find a tile type to replace the water with use landfill as a default + good_tile_name = "landfill" + end + if #bad_tiles > 0 then + -- there is no water on this planet, send via rocket, cannon, or ship + surface.create_entity({ + name = "flying-text", + position = position, + text = {"space-exploration.construction-denied-no-water"} + }) + local tiles = {} + for _, tile in pairs(bad_tiles) do + table.insert(tiles, { + name = good_tile_name, + position = tile.position + }) + end + surface.set_tiles(tiles) + end +end + +function on_built_tile(event) + if not event.surface_index then return end + local surface = game.surfaces[event.surface_index] + if not surface then return end + local player + local tile = event.tile -- top left tile + local old_tiles = event.tiles -- all tiles over a large square + local stack = event.stack -- used to create, may be empty + + for _, old_tile in pairs(old_tiles) do + if old_tile.old_tile.name == "interior-divider" then + if tile.name == "transport-drone-proxy-tile" then return error("Invalid map state") end + return cancel_tile_placement(surface, tile, old_tiles, event.player_index, {"space-exploration.construction-denied"}) + end + end + --tile_is_space(tile) + local zone = Zone.from_surface(surface) + -- temp due to issue with transport drones script + if tile.name == "transport-drone-proxy-tile" then return end + + if (not zone) or Zone.is_solid(zone) then -- treat as land + if Util.table_contains(tiles_allowed_in_space, tile.name) and tile.name ~= name_out_of_map_tile and tile.name ~= "transport-drone-road" and tile.name ~= "transport-drone-proxy-tile" then + if not (zone and Util.table_contains(Spaceship.names_spaceship_floors, tile.name)) then + return cancel_tile_placement(surface, tile, old_tiles, event.player_index, {"space-exploration.construction-denied"}) + end + elseif string.find(tile.name, "water", 1, true) then + if zone and (not zone.is_homeworld) and (zone.tags and (util.table_contains(zone.tags, "water_none"))) then + -- should not be here + return cancel_tile_placement(surface, tile, old_tiles, event.player_index, {"space-exploration.construction-denied-no-water"}) + end + end + else -- treat as space + if zone.type == "spaceship" and (not Util.table_contains(Spaceship.names_spaceship_floors, tile.name)) then + return cancel_tile_placement(surface, tile, old_tiles, event.player_index, {"space-exploration.construction-denied"}) + elseif not Util.table_contains(tiles_allowed_in_space, tile.name) then + return cancel_tile_placement(surface, tile, old_tiles, event.player_index, {"space-exploration.construction-denied"}) + end + end +end +Event.addListener(defines.events.on_player_built_tile, on_built_tile) +Event.addListener(defines.events.on_robot_built_tile, on_built_tile) + +function on_script_raised_set_tiles(event) + if not event.surface_index then return end + local surface = game.surfaces[event.surface_index] + if not surface then return end + + local zone = Zone.from_surface(surface) + local set_tiles = {} + for _, tile in pairs(event.tiles) do + if (not zone) or Zone.is_solid(zone) then -- treat as land + if Util.table_contains(tiles_allowed_in_space, tile.name) and tile.name ~= "transport-drone-road" and tile.name ~= "transport-drone-proxy-tile" then + if not (zone and Util.table_contains(Spaceship.names_spaceship_floors, tile.name)) then + table.insert(set_tiles, {name="mineral-black-dirt-1", position=tile.position}) + end + elseif string.find(tile.name, "water", 1, true) then + if zone and (not zone.is_homeworld) and (zone.tags and (util.table_contains(zone.tags, "water_none"))) then + -- should not be here + table.insert(set_tiles, {name="mineral-black-dirt-1", position=tile.position}) + end + end + else -- treat as space + if zone.type == "spaceship" and (not Util.table_contains(Spaceship.names_spaceship_floors, tile.name)) then + table.insert(set_tiles, {name=name_space_tile, position=tile.position}) + elseif not Util.table_contains(tiles_allowed_in_space, tile.name) then + table.insert(set_tiles, {name=name_space_tile, position=tile.position}) + end + end + end + if #set_tiles > 0 then + surface.set_tiles(set_tiles, true) -- DO NOT raise an event or it might cause a loop + end +end +Event.addListener(defines.events.script_raised_set_tiles, on_script_raised_set_tiles) + +function spiral_next(input) + local x = input.x + local y = input.y + local output = table.deepcopy(input) + if x > y and x >= -y then + output.y = y + 1 + elseif -y >= -x and -y > x then + output.x = x + 1 + elseif -x > y and -x > -y then + output.y = y - 1 + elseif y >= -x and y > x then + output.x = x - 1 + else + output.x = x - 1 + end + return output +end + +function zigzag_next(input, y_limit) + local x = input.x + local y = input.y + local output = table.deepcopy(input) + if y > -y_limit then + output.y = y - 1 + elseif x >= 0 then + output.x = -x - 1 + output.y = y_limit + else + output.x = -x + output.y = y_limit + end + return output +end + +function chart_position(force, surface, position) + force.chart(surface, { + { + x = position.x*32, + y = position.y*32 + }, + { + x = (position.x+0.5)*32, -- +1 actually scanes 4 chunks + y = (position.y+0.5)*32 -- +1 actually scanes 4 chunks + } + }) +end +function process_force_scanning(forcedata, force) + if forcedata.is_scanning and forcedata.scanning_zone then + local y_limit = nil + if forcedata.scanning_zone.type == "asteroid-belt" or forcedata.scanning_zone.type == "orbit" then + y_limit = 8 -- changes spiral pattern to different method + if not forcedata.scanning_cursor then + forcedata.scanning_cursor = {x=0,y=16} + end + else + if not forcedata.scanning_cursor then + forcedata.scanning_cursor = {x=0,y=0} + end + end + local surface = Zone.get_surface(forcedata.scanning_zone) + if not surface then + forcedata.is_scanning = nil + forcedata.scanning_zone = nil + forcedata.scanning_cursor = nil + return + end + if forcedata.scanning_zone.radius and -- exit if out of bounds + ((math.abs(forcedata.scanning_cursor.x) - 1.5)*32 > forcedata.scanning_zone.radius + or (math.abs(forcedata.scanning_cursor.y) - 1.5)*32 > forcedata.scanning_zone.radius) then + forcedata.is_scanning = nil + forcedata.scanning_zone = nil + forcedata.scanning_cursor = nil + return + end + local search_budget = settings.global["se-scan-search-budget"].value -- 1000 + local searched = 0 + local chart_budget = settings.global["se-scan-chart-budget"].value -- 10 + local charted = 0 + local cursor = table.deepcopy(forcedata.scanning_cursor) + while searched < search_budget and charted < chart_budget do + searched = searched + 1 + if (not forcedata.scanning_zone.radius) or (Util.vector_length(cursor) - 1.5)*32 < forcedata.scanning_zone.radius then + if force.is_chunk_charted(surface, cursor) then + forcedata.scanning_cursor = cursor + else + charted = charted + 1 + chart_position(force, surface, cursor) + end + else -- outside radius + if charted == 0 then -- skip ahead + forcedata.scanning_cursor = cursor + end + end + if y_limit then + cursor = zigzag_next(cursor, y_limit) + else + cursor = spiral_next(cursor) + end + end + + if settings.global["se-scan-alert-interval"].value > 0 then + if game.tick % (60 * settings.global["se-scan-alert-interval"].value) == 0 then + force.print({"space-exploration.scan-progress-update", forcedata.scanning_zone.name, cursor.x, cursor.y}) + end + end + + end +end + +function process_forces_scanning() + for force_name, forcedata in pairs(global.forces) do + local force = game.forces[force_name] + if not force then + global.forces[force_name] = nil + else + process_force_scanning(forcedata, force) + end + end +end + +function on_tick() + + process_chart_tag_buffer() + + if game.tick % 60 == 0 then -- varaible rate + process_forces_scanning() + end + + for _, player in pairs(game.connected_players) do + on_tick_player(player) + end + + for _, tick_task in pairs(global.tick_tasks) do + if (not tick_task.delay_until) or game.tick >= tick_task.delay_until then + if tick_task.type == "chain-beam" then + Weapon.chain_beam(tick_task) + elseif tick_task.type == "plague-tick" then + Weapon.plague_tick(tick_task) + elseif tick_task.type == "cryogun-unfreeze" then + Weapon.cryogun_unfreeze(tick_task) + elseif tick_task.type == "bind-corpse" then + Respawn.tick_task_bind_corpse(tick_task) + elseif tick_task.type == "launchpad-journey" then + Launchpad.tick_journey(tick_task) + elseif tick_task.type == "grow_energy_tree" then + EnergyBeam.grow_energy_tree(tick_task) + elseif tick_task.type == "solar-flare" then + SolarFlare.tick_flare(tick_task) + elseif tick_task.type == "force-message" then + if tick_task.force_name then + local force = game.forces[tick_task.force_name] + if force then + force.print(tick_task.message) + end + end + tick_task.valid = false + elseif tick_task.type == "remove-water" then + remove_water_tiles(tick_task.surface, tick_task.area, tick_task.position) + tick_task.valid = false + else + tick_task.valid = false + end + if not tick_task.valid then + global.tick_tasks[tick_task.id] = nil + end + end + end + +end +Event.addListener(defines.events.on_tick, on_tick) + +function new_tick_task(type) + global.next_tick_task_id = global.next_tick_task_id or 1 + local new_tick_task = { + id = global.next_tick_task_id, + valid = true, + type = type + } + global.tick_tasks[new_tick_task.id] = new_tick_task + global.next_tick_task_id = global.next_tick_task_id + 1 + return new_tick_task +end + +function on_entity_damaged (event) + if event.entity and event.entity.valid and event.entity.name ~= "shield-projector-barrier" then + if event.entity.health < 0 and event.entity.active == false then + event.entity.destroy() + end + end +end +Event.addListener(defines.events.on_entity_damaged, on_entity_damaged) + +function build_satellite(force_name) + Log.debug_log("build_satellite: " .. force_name) + local home_zone = Zone.get_force_home_zone(force_name) + if not home_zone then home_zone = Zone.get_default() end + local zone = home_zone.orbit + local surface = Zone.get_make_surface(zone) + local satellite_position = Zone.find_zone_landing_position(zone, { + x = (-0.5+math.random()) * 256, + y = (-0.5+math.random()) * 64}) + + surface.request_to_generate_chunks(satellite_position, 2) + surface.force_generate_chunk_requests() -- must be generated to place + + Ruin.build({ + ruin_name = "satellite", + surface_index = surface.index, + position = satellite_position, + force_name_override = force_name + }) + local range = Zone.discovery_scan_radius + game.forces[force_name].chart(surface, { + {satellite_position.x - range, satellite_position.y - range}, + {satellite_position.x + range, satellite_position.y + range} + }) + game.forces[force_name].print({"space-exploration.satellite-discovered-platform", zone.name}) + chart_tag_buffer_add({ + force_name = force_name, + surface = Zone.get_make_surface(zone), + position = satellite_position, + icon_type = "item", + icon_name = "satellite", + text = "Space Platform", + chart_range = Zone.discovery_scan_radius, + }) + global.forces[force_name].nauvis_satellite = satellite_position +end + + +function on_satellite_launched(force_name, surface) + Log.debug_log("on_satellite_launched: " .. force_name) + local starting_zone = Zone.from_surface(surface) + if not starting_zone then + return game.forces[force_name].print("Satellite error: Invalid launch location.") + end + global.forces[force_name] = global.forces[force_name] or {} + global.forces[force_name].satellites_launched = (global.forces[force_name].satellites_launched or 0) + 1 + + -- discovery options are: + -- discover the satellite (always on 1st launch) either in orbit or deadsapce + -- discover a planet or moon (always on 1st - 5rd launches), 90% chance after + -- if nothing else discovered, discover an asteroid in deadpsace + + local dicovered_something = false + if global.forces[force_name].satellites_launched == 1 then + -- nauvis satellite station + + build_satellite(force_name) + Zone.discover_next_satellite(force_name, "The Satellite", starting_zone) + dicovered_something = true + game.forces[force_name].print({"space-exploration.satellite-view-unlocked"}) + --elseif global.forces[force_name].satellites_launched < 6 + -- or math.random() < 0.9 then + else + dicovered_something = Zone.discover_next_satellite(force_name, "Satellite", starting_zone) + if not dicovered_something then + for _, player in pairs(game.forces[force_name].connected_players) do + if player.surface.index == surface.index then + if settings.get_player_settings(player)["se-print-satellite-discovered-nothing"].value then + player.print({"space-exploration.satellite-discovered-nothing"}) + end + end + end + end + end + +end + + +function on_rocket_launched(event) + game.set_game_state{game_finished=false, player_won=false, can_continue=true} + if event.rocket and event.rocket.valid then + if event.rocket.get_item_count("satellite") > 0 then + on_satellite_launched(event.rocket.force.name, event.rocket.surface) + end + end +end +Event.addListener(defines.events.on_rocket_launched, on_rocket_launched) + +function on_rocket_launch_ordered(event) + if event.rocket and event.rocket.valid then + local zone = Zone.from_surface(event.rocket.surface) + if event.rocket.get_item_count(mod_prefix.."star-probe") > 0 then + if not (zone and zone.type == "orbit" and zone.parent.type == "star") then + event.rocket.remove_item({name=mod_prefix.."star-probe", count=1}) + local tick_task = new_tick_task("force-message") + tick_task.force_name = event.rocket.force.name + tick_task.message = {"space-exploration.probe_invalid_launch_star"} + tick_task.delay_until = game.tick + 750 --5s + end + elseif event.rocket.get_item_count(mod_prefix.."belt-probe") > 0 then + if not (zone and zone.type == "asteroid-belt") then + event.rocket.remove_item({name=mod_prefix.."belt-probe", count=1}) + game.print(event.rocket.get_item_count(mod_prefix.."belt-probe")) + local tick_task = new_tick_task("force-message") + tick_task.force_name = event.rocket.force.name + tick_task.message = {"space-exploration.probe_invalid_launch_belt"} + tick_task.delay_until = game.tick + 750 --5s + end + elseif event.rocket.get_item_count(mod_prefix.."void-probe") > 0 then + if not (zone and zone.type == "asteroid-field") then + event.rocket.remove_item({name=mod_prefix.."void-probe", count=1}) + local tick_task = new_tick_task("force-message") + tick_task.force_name = event.rocket.force.name + tick_task.message = {"space-exploration.probe_invalid_launch_field"} + tick_task.delay_until = game.tick + 750 --5s + end + end + end +end +Event.addListener(defines.events.on_rocket_launch_ordered, on_rocket_launch_ordered) + +function setup_force(force) + if is_system_force(force.name) then return end + + local force_name = force.name + if global.forces[force_name] then return end + Log.debug_log("setup_force: "..force_name) + global.forces = global.forces or {} + global.forces[force_name] = { + force_name = force_name, + zones_discovered_count = 0, -- planets and moons discovered + zones_discovered = {}, -- name = ForceZoneData{discovered_at = tick discovered, marker = map marker} + satellites_launched = 0, + cargo_rockets_launched = 0, + cargo_rockets_crashed = 0, + zone_assets = {}, -- zone_index > (rocket_launch_pad_names/ rocket_landing_pad_names) + zone_priorities = {} + } + local homeworld = Zone.from_name("Nauvis") + global.forces[force_name].homeworld_index = homeworld.index + Zone.discover(force_name, homeworld) + Zone.discover(force_name, homeworld.parent) + for _, zone in pairs(global.zone_index) do + if zone.is_homeworld then + global.forces[force_name].zone_priorities[zone.index] = global.forces[force_name].zone_priorities[zone.index] or 1 + end + end + + local friendly = game.forces["friendly"] + if friendly then + friendly.set_friend(force, true) + force.set_friend(friendly, true) + end + + local ignore = game.forces["ignore"] + if ignore then + ignore.set_cease_fire(force, true) + force.set_cease_fire(ignore, true) + end + + local capture = game.forces["capture"] + if capture then + capture.set_cease_fire(force, true) + force.set_cease_fire(capture, true) + end +end + +function allied_forces(force) + local allied_forces = {} + for _, oforce in pairs(game.forces) do + if oforce.name == force.name or force.get_friend(oforce) then + table.insert(allied_forces, oforce.name) + end + end + return allied_forces +end + +function ceasefire_forces(force) + local ceasefire_forces = {} + for _, oforce in pairs(game.forces) do + if oforce.name == force.name or force.get_cease_fire(oforce) then + table.insert(ceasefire_forces, oforce.name) + end + end + return ceasefire_forces +end + +function enemy_forces(force) + local enemy_forces = {} + for _, oforce in pairs(game.forces) do + if oforce ~= force and not force.get_cease_fire(oforce) then + if (not is_system_force(oforce.name)) or oforce.name == "enemy" or oforce.name == "conquest" then + table.insert(enemy_forces, oforce.name) + end + end + end + return enemy_forces +end + +function find_enemy(force, surface, position) + local enemy_forces = enemy_forces(force) + + for _, radius in pairs({8,32,256,1024}) do + local enemies = surface.find_entities_filtered{ + force = enemy_forces, + type = {"unit-spawner", "turret"}, + position = position, + radius = radius + } + if enemies and #enemies > 0 then return enemies[math.random(#enemies)] end + end + + local enemy = surface.find_nearest_enemy{position=position, max_distance=20000, force=force} + if enemy then return enemy end + + -- final try, anything enemy anywhere + local enemies = surface.find_entities_filtered{ force = enemy_forces, type = { + -- taken from https://wiki.factorio.com/Prototype/EntityWithHealth + "accumulator", "artillery-turret", "beacon", "boiler", "burner-generator", "character", + "arithmetic-combinator", "decider-combinator", "constant-combinator", "container", + "logistic-container", "infinity-container", "assembling-machine", "rocket-silo", + "furnace", "electric-energy-interface", "electric-pole", "unit-spawner", + --"fish", + "combat-robot", "construction-robot", "logistic-robot", "gate", "generator", + "heat-interface", "heat-pipe", "inserter", "lab", "lamp", "land-mine", "linked-container", + "market", "mining-drill", "offshore-pump", "pipe", "infinity-pipe", "pipe-to-ground", + "player-port", "power-switch", "programmable-speaker", "pump", "radar", "curved-rail", + "straight-rail", "rail-chain-signal", "rail-signal", "reactor", "roboport", + --"simple-entity", + "simple-entity-with-owner", "simple-entity-with-force", "solar-panel", + --"spider-leg", + "storage-tank", "train-stop", "linked-belt", "loader-1x1", "loader", "splitter", + "transport-belt", "underground-belt", "tree", "turret", "ammo-turret", "electric-turret", + "fluid-turret", "unit", "car", "artillery-wagon", "cargo-wagon", "fluid-wagon", + "locomotive", "spider-vehicle", "wall" + } } + if enemies and #enemies > 0 then + enemy = enemies[math.random(#enemies)] + if enemy.destructible then + return enemy + end + end + + for _, enemy in pairs(enemies) do + if enemy.destructible then + return enemy + end + end + + return false +end + +--/c remote.call("space-exploration", "set_force_homeworld", {zone_name = "Arendel", force_name = "player-2", spawn_position = {x = 0, y = 0}, reset_discoveries = true}) +function set_force_homeworld(data) + local zone = Zone.from_name(data.zone_name) + if not zone then return game.print("No zone found") end + if not zone.is_homeworld then return game.print("Zone must be a homeworld") end + + local force = game.forces[data.force_name] + if not force then return game.print("No force found") end + + local force_data = global.forces[data.force_name] + if not force_data then return game.print("No force data found") end + + force_data.homeworld_index = zone.index + Zone.get_make_surface(zone) -- make sure the surface exists + force.set_spawn_position(data.spawn_position or {x = 0, y = 0}, zone.surface_index) + + if data.reset_discoveries then + force_reset_discoveries(data.force_name) + end +end + +function force_reset_discoveries(force_name) + local force_data = global.forces[force_name] + if not force_data then return end + game.print("Reset discoveries for force: " .. force_name) + force_data.zones_discovered_count = 0 + force_data.zones_discovered = {} + force_data.satellites_launched = 0 + force_data.zone_priorities = {} + local homeworld = Zone.from_name("Nauvis") + if force_data.homeworld_index then + homeworld = Zone.from_zone_index(force_data.homeworld_index) + end + Zone.discover(force_name, homeworld) + Zone.discover(force_name, homeworld.parent) + for _, zone in pairs(global.zone_index) do + if zone.is_homeworld then + global.forces[force_name].zone_priorities[zone.index] = global.forces[force_name].zone_priorities[zone.index] or 1 + end + end +end + +function is_system_force(force_name) + return force_name == "enemy" + or force_name == "neutral" + or force_name == "capture" + or force_name == "conquest" + or force_name == "ignore" + or force_name == "friendly" +end + +function setup_util_forces() + + if not game.forces["conquest"] then + game.create_force("conquest") -- will shoot at the player, does not show icons, cannot be deconstructed. Has capture mechanic but active entities must be destroyed. + end + local conquest = game.forces["conquest"] + conquest.ai_controllable = true + + if not game.forces["ignore"] then + game.create_force("ignore") -- won't shoot at the player, does not show icons, cannot be deconstructed. + end + local ignore = game.forces["ignore"] + for _, force in pairs(game.forces) do + ignore.set_cease_fire(force, true) + force.set_cease_fire(ignore, true) + end + + if not game.forces["capture"] then + game.create_force("capture") -- won't shoot at the player, does not show icons, cannot be deconstructed. Has capture mechanic. + end + local capture = game.forces["capture"] + for _, force in pairs(game.forces) do + capture.set_cease_fire(force, true) + force.set_cease_fire(capture, true) + end + + if not game.forces["friendly"] then + game.create_force("friendly") -- acts like a player entity, displays power icons, can be deconstructured by player + end + local friendly = game.forces["friendly"] + for _, force in pairs(game.forces) do + friendly.set_friend(force, true) + force.set_friend(friendly, true) + end + + local enemy = game.forces["enemy"] + enemy.set_friend(conquest, true) + conquest.set_friend(enemy, true) + + capture.set_friend(conquest, true) + conquest.set_friend(capture, true) + capture.set_friend(ignore, true) + ignore.set_friend(capture, true) + capture.set_friend(enemy, true) + enemy.set_friend(capture, true) + + ignore.set_friend(conquest, true) + conquest.set_friend(ignore, true) + ignore.set_friend(enemy, true) + enemy.set_friend(ignore, true) +end + +function on_force_created(event) + setup_force(event.force) +end +Event.addListener(defines.events.on_force_created, on_force_created) + +function setup_collision_layers() + + collision_mask_util_extended.named_collision_mask_integrity_check() -- detect non-1 mask entities + + global.named_collision_masks = {} + + -- a full-height wall that you cannot fly though, such as the wall of an underground tunnel. + global.named_collision_masks.flying_layer = collision_mask_util_extended.get_named_collision_mask("flying-layer") + -- things that should block projectiles + global.named_collision_masks.projectile_collision_layer = collision_mask_util_extended.get_named_collision_mask("projectile-layer") + -- empty space only + global.named_collision_masks.empty_space_collision_layer = collision_mask_util_extended.get_named_collision_mask("empty-space-tile") + -- All space tiles have this + global.named_collision_masks.space_collision_layer = collision_mask_util_extended.get_named_collision_mask("space-tile") + -- Spaceship tiles move around + global.named_collision_masks.spaceship_collision_layer = collision_mask_util_extended.get_named_collision_mask("moving-tile") + +end + +function on_configuration_changed() + + setup_collision_layers() + + Essential.enable_critical_techs() -- needed after bad mod removal + + AbandonedRuins.exclude_surfaces() + + Migrate.migrations() + + local zone = Zone.from_name("Nauvis") + zone.fragment_name = "se-core-fragment-omni" + zone.surface_index = 1 + zone.inflated = true + + if global.astronomical then + global.universe = global.astronomical + global.astronomical = nil + end + + global.tick_tasks = global.tick_tasks or {} + + if global.forces then + for force_name in pairs(global.forces) do + local forcedata = global.forces[force_name] + forcedata.force_name = force_name + if (not forcedata.homeworld_index) and not is_system_force(force_name) then + forcedata.homeworld_index = zone.index + end + end + end + + for _, force in pairs(game.forces) do + force.reset_recipes() + if force.technologies["radar"] then + force.technologies["radar"].enabled = true + end + end + + -- enable any recipes that should be unlocked. + -- mainly required for entity-update-externals as a migration file won't work + for _, force in pairs(game.forces) do + for _, tech in pairs(force.technologies) do + if tech.researched then + for _, effect in pairs(tech.effects) do + if effect.type == "unlock-recipe" and force.recipes[effect.recipe] then + force.recipes[effect.recipe].enabled = true + end + end + end + end + end + + -- stop game from ending on launch and tracking of launches + local interface_name = "silo_script" + if remote.interfaces[interface_name] then + if remote.interfaces[interface_name]["set_finish_on_launch"] then + remote.call(interface_name, "set_finish_on_launch", false) + end + if remote.interfaces[interface_name]["set_show_launched_without_satellite"] then + remote.call(interface_name, "set_show_launched_without_satellite", false) + end + if remote.interfaces[interface_name]["remove_tracked_item"] then + remote.call(interface_name, "remove_tracked_item", "satellite") + end + end + + if global.next_meteor_shower and + global.next_meteor_shower > game.tick + 60 * 60 * settings.global["se-meteor-interval"].value then + global.next_meteor_shower = game.tick + math.random() * 60 * 60 * settings.global["se-meteor-interval"].value + end + + Zone.zones_fix_all_tiles() + + Universe.load_resource_data() + + local zone = Zone.from_name("Nauvis") + zone.fragment_name = "se-core-fragment-omni" + zone.surface_index = 1 + zone.inflated = true + zone.resources = {} + zone.ticks_per_day = 25000 + + Coreminer.equalise_all() + + global.cache_travel_delta_v = nil + + if game.technology_prototypes[mod_prefix.."linked-container"] then + for _, force in pairs(game.forces) do + force.technologies[mod_prefix.."teleportation"].enabled = true + end + end + + game.print({"space-exploration.please-consider-patreon"}) + +end +Event.addListener("on_configuration_changed", on_configuration_changed, true) + + +function on_init() + -- When creating a new game, script.on_init() will be called on each mod that has a control.lua file. + -- When loading a save game and the mod did not exist in that save game script.on_init() is called. + + global.version = version + + setup_collision_layers() + + Essential.enable_critical_techs() -- needed after bad mod removal + + -- Astronomical first + global.seed = game.surfaces[1].map_gen_settings.seed + global.next_tick_task_id = 1 + global.tick_tasks = {} + + AbandonedRuins.exclude_surfaces() + + setup_util_forces() + + Universe.build() + + local zone = Zone.from_name("Nauvis") + zone.fragment_name = "se-core-fragment-omni" + zone.surface_index = 1 + zone.inflated = true + zone.resources = {} + zone.ticks_per_day = 25000 + game.surfaces[1].solar_power_multiplier = Zone.solar_multiplier + Zone.set_solar_and_daytime(zone) + local surface = game.surfaces[1] + for resource_name, resource_setting in pairs(global.resources_and_controls.resource_settings) do + surface.regenerate_entity(resource_name) + end + if settings.startup[mod_prefix.."spawn-small-resources"].value then + Zone.spawn_small_resources(surface) + end + + global.zones_by_surface[zone.surface_index] = zone + if game.surfaces[1].map_gen_settings.autoplace_controls["planet-size"] then + -- planet_radius = 10000 / 6 * (6 + log(1/planet_frequency/6, 2)) + -- planet_frequency = 1 / 6 / 2 ^ (planet_radius * 6 / 10000 - 6) + --zone.radius = 10000 / 6 * game.surfaces[1].map_gen_settings.autoplace_controls["planet-size"].frequency + zone.radius = 10000 / 6 * (6 + util.math_log(1/game.surfaces[1].map_gen_settings.autoplace_controls["planet-size"].frequency/6, 2)) + Log.trace(zone.radius) + else + zone.radius = 10000 / 6 * (6 + util.math_log(1/1/6, 2)) + end + + if Log.debug_big_logs then + Log.log_universe_simplified() + Log.log_universe() + end + + -- Other stuff second + global.playerdata = global.playerdata or {} + global.forces = global.forces or {} + + for _, force in pairs(game.forces) do + setup_force(force) + force.reset_recipes() + + -- enable any recipes that should be unlocked. + -- mainly required for entity-update-externals as a migration file won't work + for _, tech in pairs(force.technologies) do + if tech.researched then + for _, effect in pairs(tech.effects) do + if effect.type == "unlock-recipe" and force.recipes[effect.recipe] then + force.recipes[effect.recipe].enabled = true + end + end + end + end + + for tech in pairs(force.technologies['rocket-silo'].prerequisites) do + force.technologies[tech].enabled = true + end + end + + if remote.interfaces["freeplay"] and remote.interfaces["freeplay"]["set_created_items"] and remote.interfaces["freeplay"]["get_created_items"] then + local stacks = remote.call("freeplay", "get_created_items") + for _, starting_item_stack in pairs(first_starting_item_stacks) do + stacks[starting_item_stack.name] = starting_item_stack.count + end + remote.call("freeplay", "set_created_items", stacks) + end + + +end +Event.addListener("on_init", on_init, true) + +function on_player_spawned(event) + local player = game.players[event.player_index] + if player and player.character then + for _, item_stack in pairs(starting_item_stacks) do + player.insert(item_stack) + end + end + local forcedata = global.forces[player.force.name] + if forcedata then + forcedata.has_players = true + end + update_overhead_buttons(player) +end +Event.addListener(defines.events.on_player_respawned, on_player_spawned) + +function on_player_changed_force(event) + local player = game.players[event.player_index] + setup_force(player.force) + local forcedata = global.forces[player.force.name] + if forcedata then + forcedata.has_players = true + end +end +Event.addListener(defines.events.on_player_changed_force, on_player_changed_force) + +function on_player_created(event) + local player = game.players[event.player_index] + if player and player.connected then + player.print({"space-exploration.please-consider-patreon"}) + end + if not player.get_quick_bar_slot(10) then + player.set_quick_bar_slot(10, mod_prefix.."medpack") + end + on_player_spawned(event) +end +Event.addListener(defines.events.on_player_created, on_player_created) + +function on_player_joined_game(event) + local player = game.players[event.player_index] + if player and player.connected then + player.print({"space-exploration.please-consider-patreon"}) + end + local forcedata = global.forces[player.force.name] + if forcedata then + forcedata.has_players = true + end + update_overhead_buttons(player) +end +Event.addListener(defines.events.on_player_joined_game, on_player_joined_game) + +function update_overhead_buttons(player) + -- Fix for Factorio 1.1 + local button_flow = mod_gui.get_button_flow(player) + if button_flow["informatron_overhead"] then + local caption = button_flow["informatron_overhead"].caption + local tooltip = button_flow["informatron_overhead"].tooltip + local sprite = button_flow["informatron_overhead"].sprite + button_flow["informatron_overhead"].destroy() + button_flow.add{type="sprite-button", name="informatron_overhead", sprite = sprite, tooltip = tooltip} + end + + if button_flow[RemoteView.name_button_overhead_satellite] then button_flow[RemoteView.name_button_overhead_satellite].destroy() end + RemoteView.update_overhead_button(player.index) + + if button_flow[MapView.name_button_overhead_interstellar] then button_flow[MapView.name_button_overhead_interstellar].destroy() end + MapView.update_overhead_button(player.index) + + if button_flow[Zonelist.name_button_overhead_explorer] then button_flow[Zonelist.name_button_overhead_explorer].destroy() end + Zonelist.update_overhead_button(player.index) +end + +function on_pre_player_left_game(event) + local player = game.players[event.player_index] + if player then + RemoteView.stop(player) + end +end +Event.addListener(defines.events.on_pre_player_left_game, on_pre_player_left_game) + +function on_forces_merged(event) + -- merge in all of an old force to a new force + -- add things like launch counts + -- merge things like zone assets + -- use a single value for things like satellite position + local source_forcedata = global.forces[event.source_name] + local destination_forcedata = global.forces[event.destination.name] + if source_forcedata and destination_forcedata then + -- zones_discovered + if source_forcedata.zones_discovered then + destination_forcedata.zones_discovered = destination_forcedata.zones_discovered or {} + for a, b in pairs(source_forcedata.zones_discovered) do + if not destination_forcedata.zones_discovered[a] then + destination_forcedata.zones_discovered[a] = b + end + end + destination_forcedata.zones_discovered_count = table_size(destination_forcedata.zones_discovered) + end + --zone_priorities + if source_forcedata.zone_priorities then + destination_forcedata.zone_priorities = destination_forcedata.zone_priorities or {} + for a, b in pairs(source_forcedata.zone_priorities) do + if not destination_forcedata.zone_priorities[a] then + destination_forcedata.zone_priorities[a] = b + else + destination_forcedata.zone_priorities[a] = math.max(destination_forcedata.zone_priorities[a], b) + end + end + end + --satellites_launched + if source_forcedata.satellites_launched then + destination_forcedata.satellites_launched = (destination_forcedata.satellites_launched or 0) + source_forcedata.satellites_launched + end + --cargo_rockets_launched + if source_forcedata.cargo_rockets_launched then + destination_forcedata.cargo_rockets_launched = (destination_forcedata.cargo_rockets_launched or 0) + source_forcedata.cargo_rockets_launched + end + --cargo_rockets_crashed + if source_forcedata.cargo_rockets_crashed then + destination_forcedata.cargo_rockets_crashed = (destination_forcedata.cargo_rockets_crashed or 0) + source_forcedata.cargo_rockets_crashed + end + --first_discovered_vault + if source_forcedata.first_discovered_vault and not destination_forcedata.first_discovered_vault then + destination_forcedata.first_discovered_vault = source_forcedata.first_discovered_vault + end + --first_entered_vault + if source_forcedata.first_entered_vault and not destination_forcedata.first_entered_vault then + destination_forcedata.first_entered_vault = source_forcedata.first_entered_vault + end + --nauvis_satellite + if source_forcedata.nauvis_satellite and not destination_forcedata.nauvis_satellite then + destination_forcedata.nauvis_satellite = source_forcedata.nauvis_satellite + end + --solar_flare + if source_forcedata.solar_flare and not destination_forcedata.solar_flare then + destination_forcedata.solar_flare = source_forcedata.solar_flare + end + + --arcospheres + if source_forcedata.arcosphere_collectors_launched then + destination_forcedata.arcosphere_collectors_launched = (destination_forcedata.arcosphere_collectors_launched or 0) + source_forcedata.arcosphere_collectors_launched + end + if source_forcedata.arcospheres_collected then + destination_forcedata.arcospheres_collected = (destination_forcedata.arcospheres_collected or 0) + source_forcedata.arcospheres_collected + end + + local single_depth_tables = { + "chart_tag_buffer", + "tick_tasks", + "gravimetrics_labs", + "space_capsule_launches", + "delivery_cannons", + "rocket_landing_pads", + "rocket_launch_pads", + "spaceships", + "nexus" + } + for _, table_name in pairs(single_depth_tables) do + if global[table_name] then + for _, thing in pairs(global[table_name]) do + if thing.force_name == event.source_name then + thing.force_name = event.destination.name + end + end + end + end + + -- Zones + for _, zone in pairs(global.zone_index) do + local single_depth_tables = { + "energy_transmitters", + } + for _, table_name in pairs(single_depth_tables) do + if source_forcedata.zone_assets[table_name] then + for _, thing in pairs(global[table_name]) do + if thing.force_name == event.source_name then + thing.force_name = event.destination.name + end + end + end + end + end + + --zone_assets + if source_forcedata.zone_assets then + + local single_depth_tables = { + "energy_beam_defence", + } + for _, table_name in pairs(single_depth_tables) do + if source_forcedata.zone_assets[table_name] then + for _, thing in pairs(global[table_name]) do + if thing.force_name == event.source_name then + thing.force_name = event.destination.name + end + end + end + end + + destination_forcedata.zone_assets = destination_forcedata.zone_assets or {} + for a, b in pairs(source_forcedata.zone_assets) do + if not destination_forcedata.zone_assets[a] then + destination_forcedata.zone_assets[a] = b + else + for table_name, subtable in pairs(b) do + if not destination_forcedata.zone_assets[a][table_name] then + destination_forcedata.zone_assets[a][table_name] = subtable + elseif table_name == "rocket_launch_pad_names" or table_name == "rocket_landing_pad_names" then + for name, structs in pairs(subtable) do + destination_forcedata.zone_assets[a][table_name][name] = destination_forcedata.zone_assets[a][table_name][name] or {} + for unit_number, struct in pairs(structs) do + destination_forcedata.zone_assets[a][table_name][name][unit_number] = struct + end + end + end + end + end + end + destination_forcedata.zones_discovered_count = table_size(destination_forcedata.zones_discovered) + end + --zone_assets + if source_forcedata.rocket_landing_pad_names then + if not destination_forcedata.rocket_landing_pad_names then + destination_forcedata.rocket_landing_pad_names = source_forcedata.rocket_landing_pad_names + else + for name, structs in pairs(source_forcedata.rocket_landing_pad_names) do + destination_forcedata.rocket_landing_pad_names[name] = destination_forcedata.rocket_landing_pad_names[name] or {} + for unit_number, struct in pairs(structs) do + destination_forcedata.rocket_landing_pad_names[name][unit_number] = struct + end + end + end + end + end +end +Event.addListener(defines.events.on_forces_merged, on_forces_merged) + +require('scripts/remote-interface') + +--log( serpent.block( data.raw["projectile"], {comment = false, numformat = '%1.8g' } ) ) +-- /c Log.trace(serpent.block( game.surfaces.nauvis.map_gen_settings.autoplace_controls, {comment = false, numformat = '%1.8g' })) diff --git a/space-exploration_0.5.58/space-exploration/data-final-fixes.lua b/space-exploration_0.5.58/space-exploration/data-final-fixes.lua new file mode 100644 index 0000000..53bda75 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/data-final-fixes.lua @@ -0,0 +1,174 @@ +local data_util = require("data_util") + +collision_mask_util_extended = require("collision-mask-util-extended/data/collision-mask-util-extended") + +require("prototypes/phase-multi/no-recycle") + +require("prototypes/phase-3/recipe") + +require("prototypes/phase-3/technology") +require("prototypes/phase-3/technology-procedural") + +require("prototypes/phase-3/noise-programs") + +require("prototypes/phase-3/collision-common") +require("prototypes/phase-3/space-collision") + +require("prototypes/phase-3/ruin-remnants") +require("prototypes/phase-3/ruins") + +require("prototypes/phase-3/resources") + +require("prototypes/phase-3/core-fragments") + +require("prototypes/phase-3/incompatibility") + +require("prototypes/phase-3/compatibility/angels") +require("prototypes/phase-3/compatibility/notnotmelon") + +require("prototypes/phase-3/character") + +require("prototypes/phase-3/energy-shield-equipment") + +require("prototypes/phase-3/electric-boiling") + +require("prototypes/phase-3/delivery-cannon") + +require("prototypes/phase-3/interior-divider") + +require("prototypes/phase-multi/item-group-assign") + +--require("prototypes/phase-3/compatibility") + +data.raw["heat-pipe"]["heat-pipe"].heat_buffer.max_transfer = "2GW" + +for _, fish in pairs(data.raw.fish) do + if not fish.healing_per_tick then fish.healing_per_tick = 0.01 end + fish.resistances = data_util.resistances_max(fish.resistances, {{type = "meteor", percent = 100}, {type = "fire", percent = 100}}) +end + + +for _, tree in pairs(data.raw.tree) do + tree.trigger_target_mask = tree.trigger_target_mask or {} + table.insert(tree.trigger_target_mask, "flammable") + table.insert(tree.trigger_target_mask, "tree") +end + + +-- undo some alien biomes changes, impotant for asteroid decals +data.raw.tile["se-space"].layer = 0 +data.raw.tile["se-space"].pollution_absorption_per_second = 0.1 +data.raw.tile["se-asteroid"].layer = 5 + +data.raw.tile["out-of-map"].pollution_absorption_per_second = 0.1 + +local function find_orphaned_recipes() + local all_recipes = {} + for _, recipe in pairs(data.raw.recipe) do + if (recipe.enabled == false) or + (recipe.normal and recipe.normal.enabled == false) or + (recipe.expensive and recipe.expensive.enabled == false) then + all_recipes[recipe.name] = true + end + end + for _, tech in pairs(data.raw.technology) do + if tech.effects then + for _, effect in pairs(tech.effects) do + if effect.type == "unlock-recipe" and effect.recipe then + all_recipes[effect.recipe] = nil + end + end + end + end + for recipe_name, valid in pairs(all_recipes) do + log("Orphaned recipe: " .. recipe_name) + end +end + + +-- stop rails from being destroyed by meteors and sky beams +for _, rail_type in pairs({"rail-signal", "rail-chain-signal"}) do + for _, rail in pairs(data.raw[rail_type]) do + rail.resistances = data_util.resistances_max(rail.resistances, {{type = "meteor", percent = 99.9}, {type = "fire", percent = 100}, {type = "laser", percent = 99}, {type = "explosion", percent = 80}}) + end +end +for _, rail_type in pairs({"straight-rail", "curved-rail"}) do + for _, rail in pairs(data.raw[rail_type]) do + rail.selection_priority = 1 + rail.resistances = data_util.resistances_max(rail.resistances, {{type = "meteor", percent = 99.9}, {type = "fire", percent = 100}, {type = "laser", percent = 99}, {type = "explosion", percent = 90}}) + rail.max_health = rail.max_health * 4 + end +end +for _, type in pairs({"locomotive", "cargo-wagon", "fluid-wagon"}) do + for _, prototype in pairs(data.raw[type]) do + prototype.selection_priority = 51 + end +end + +-- satellite +data.raw["god-controller"]["default"].item_pickup_distance = 0 +data.raw["god-controller"]["default"].loot_pickup_distance = 0 +data.raw["god-controller"]["default"].mining_speed = 0.0000001 -- required to remove ghosts but not mine entities. +data.raw["god-controller"]["default"].movement_speed = 1 + +-- dead +data.raw["spectator-controller"]["default"].movement_speed = 1 + +-- this won't work, the furnace recipes are hidden +if data.raw["recipe-category"]["recycle"] then + table.insert(data.raw["assembling-machine"][data_util.mod_prefix .. "recycling-facility"].crafting_categories, "recycle") +end +if data.raw["recipe-category"]["recycle-with-fluids"] then + table.insert(data.raw["assembling-machine"][data_util.mod_prefix .. "recycling-facility"].crafting_categories, "recycle-with-fluids") +end + +for i=4,9 do + data.raw.module["productivity-module-" .. i].limitation = data.raw.module["productivity-module-3"].limitation +end + + +data.raw["map-gen-presets"].default["space-exploration"] = { + --name = "space-exploration", + order = "a", + basic_settings = { + autoplace_controls = { + hot = {size = 0.5}, + cold = {size = 0.5}, + ["se-beryllium-ore"] = {frequency = 0, richness = -1, size = 0}, + ["se-cryonite"] = {frequency = 0, richness = -1, size = 0}, + ["se-holmium-ore"] = {frequency = 0, richness = -1, size = 0}, + ["se-iridium-ore"] = {frequency = 0, richness = -1, size = 0}, + ["se-methane-ice"] = {frequency = 0, richness = -1, size = 0}, + ["se-naquium-ore"] = {frequency = 0, richness = -1, size = 0}, + ["se-vitamelange"] = {frequency = 0, richness = -1, size = 0}, + ["se-vulcanite"] = {frequency = 0, richness = -1, size = 0}, + ["se-water-ice"] = {frequency = 0, richness = -1, size = 0} + }, + property_expression_names = { + ["control-setting:water"] = 1.5, + ["control-setting:moisture:bias"] = 0.05, + ["control-setting:aux:bias"] = -0.35 + }, + starting_area = 2, + }, + advanced_settings = { + enemy_evolution = + { + time_factor = 0.000001, + destroy_factor = 0.001, + pollution_factor = 0.0000005 + }, + pollution = + { + ageing = 0.5, + enemy_attack_pollution_consumption_modifier = 0.5 + }, + }, +} +if data.raw["map-gen-presets"].default and data.raw["map-gen-presets"].default.default then + data.raw["map-gen-presets"].default.default.order = "a-a" +end + +--find_orphaned_recipes() + +--log( serpent.block( data.raw["assembling-machine"][data_util.mod_prefix .. "spaceship-clamp"], {comment = false, numformat = '%1.8g' } ) ) diff --git a/space-exploration_0.5.58/space-exploration/data-updates.lua b/space-exploration_0.5.58/space-exploration/data-updates.lua new file mode 100644 index 0000000..086aa9a --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/data-updates.lua @@ -0,0 +1,22 @@ +local data_util = require("data_util") + +require("prototypes/phase-multi/no-recycle") + +require("prototypes/phase-2/recipe-update") +require("prototypes/phase-2/generic-recycling") + +require("prototypes/phase-2/modules") + +require("prototypes/phase-2/capsules") + +require("prototypes/phase-2/compatibility/general") +require("prototypes/phase-2/compatibility/krastorio2/krastorio2") + +-- this is where space science pack goes now in SE, but other mods are more free to change it than when it was a critical mid-game pack. +data_util.tech_add_prerequisites("space-science-pack", {data_util.mod_prefix .. "processing-cryonite", "production-science-pack", "uranium-processing",}) +data_util.tech_add_ingredients("space-science-pack", {"production-science-pack"}, true) + +-- Give burner lamp space collision, because it's a one line fix and getting it done here is easier than trying to get it done in the owner's mod +if data.raw["assembling-machine"]["deadlock-copper-lamp"] then + data.raw["assembling-machine"]["deadlock-copper-lamp"].se_allow_in_space = true +end diff --git a/space-exploration_0.5.58/space-exploration/data.lua b/space-exploration_0.5.58/space-exploration/data.lua new file mode 100644 index 0000000..111ed1c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/data.lua @@ -0,0 +1,352 @@ +is_debug_mode = false +debug_log = is_debug_mode and log or function()end + +-- COLLISION MASKS +-- We need to be able to refer to these layers in control.lua so getting a sequential layer from the collision mask util is not ideal +-- remember to update control.lua setup_collision_layers() + -- global scope +collision_mask_util_extended = require("collision-mask-util-extended/data/collision-mask-util-extended") + +-- a full-height wall that you cannot fly though, such as the wall of an underground tunnel. +flying_collision_layer = collision_mask_util_extended.get_make_named_collision_mask("flying-layer") + +-- things that should block projectiles +projectile_collision_layer = collision_mask_util_extended.get_make_named_collision_mask("projectile-layer") + +-- Cars, trees, pipes +vehicle_collision_layer = collision_mask_util_extended.get_make_named_collision_mask("vehicle-layer") + +-- empty space only +empty_space_collision_layer = collision_mask_util_extended.get_make_named_collision_mask("empty-space-tile") + +-- All space tiles have this +space_collision_layer = collision_mask_util_extended.get_make_named_collision_mask("space-tile") + +-- Spaceship tiles move around +spaceship_collision_layer = collision_mask_util_extended.get_make_named_collision_mask("moving-tile") + + +rocket_capacity = 500 +local min_postprocess_version = "0.5.6" +local data_util = require("data_util") +if not logged_mods_once then logged_mods_once = true log("Log mods once: "..serpent.block(mods)) end +--log(serpent.block( mods, {comment = false, numformat = '%1.8g' } )) + +-- SURFACE RESOURCE VALUES ------------------------------------------------------------- +se_resources = se_resources or {} +se_resources["iron-ore"] = se_resources["iron-ore"] or { order = "c-a", base_density = 14, starting_rq_factor_multiplier = 1.5} +se_resources["copper-ore"] = se_resources["copper-ore"] or {order = "c-b", base_density = 12, starting_rq_factor_multiplier = 1.5} +se_resources["stone"] = se_resources["stone"] or {order = "c-c", base_density = 12, starting_rq_factor_multiplier = 1.5} +se_resources["coal"] = se_resources["coal"] or {order = "c-e", base_density = 9, starting_rq_factor_multiplier = 1.5,} +se_resources["uranium-ore"] = se_resources["uranium-ore"] or { + order = "c-d", + has_starting_area_placement = false, + base_density = 1, + base_spots_per_km2 = 2, + random_spot_size_minimum = 2, + random_spot_size_maximum = 4, +} +se_resources["crude-oil"] = se_resources["crude-oil"] or { + order = "e-a", + has_starting_area_placement = false, + base_density = 8, + base_spots_per_km2 = 2, + random_probability = 1/48, + random_spot_size_minimum = 1, + random_spot_size_maximum = 1, -- don't randomize spot size + additional_richness = 220000, -- this increases the total everywhere, so base_density needs to be decreased to compensate + regular_rq_factor_multiplier = 1, + starting_rq_factor_multiplier = 1.5, +} +se_resources[data_util.mod_prefix.."vulcanite"] = se_resources[data_util.mod_prefix.."vulcanite"] or { order = "b-v", base_density = 10, base_spots_per_km2 = 5 } +se_resources[data_util.mod_prefix.."cryonite"] = se_resources[data_util.mod_prefix.."cryonite"] or { order = "b-c", base_density = 10, base_spots_per_km2 = 5 } +se_resources[data_util.mod_prefix.."vitamelange"] = se_resources[data_util.mod_prefix.."vitamelange"] or { order = "a-a", base_density = 10 } +se_resources[data_util.mod_prefix.."iridium-ore"] = se_resources[data_util.mod_prefix.."iridium-ore"] or { order = "a-b" } +se_resources[data_util.mod_prefix.."holmium-ore"] = se_resources[data_util.mod_prefix.."holmium-ore"] or { order = "a-b" } +se_resources[data_util.mod_prefix.."beryllium-ore"] = se_resources[data_util.mod_prefix.."beryllium-ore"] or { order = "a-b" } +se_resources[data_util.mod_prefix.."naquium-ore"] = se_resources[data_util.mod_prefix.."naquium-ore"] or { order = "a-a", base_density = 1 } +se_resources[data_util.mod_prefix.."water-ice"] = se_resources[data_util.mod_prefix.."water-ice"] or { order = "f-a" } +se_resources[data_util.mod_prefix.."methane-ice"] = se_resources[data_util.mod_prefix.."methane-ice"] or { order = "f-b" } + +-- CORE FRAGMENT RESOURCE VALUES ------------------------------------------------------------- +-- allows other mods to alter core fragment resources +se_core_fragment_resources = se_core_fragment_resources or {} +se_core_fragment_resources["water"] = se_core_fragment_resources["water"] or { multiplier = 0, omni_multiplier = 0.1} +se_core_fragment_resources["crude-oil"] = se_core_fragment_resources["crude-oil"] or { multiplier = 1, omni_multiplier = 0.1} +se_core_fragment_resources["stone"] = se_core_fragment_resources["stone"] or { multiplier = 1, omni_multiplier = 0.5} +se_core_fragment_resources["iron-ore"] = se_core_fragment_resources["iron-ore"] or { multiplier = 1.2, omni_multiplier = 0.6} +se_core_fragment_resources["copper-ore"] = se_core_fragment_resources["copper-ore"] or { multiplier = 1, omni_multiplier = 0.5} +se_core_fragment_resources["coal"] = se_core_fragment_resources["coal"] or { multiplier = 1, omni_multiplier = 0.5} +se_core_fragment_resources["uranium-ore"] = se_core_fragment_resources["uranium-ore"] or { multiplier = 0.2, omni_multiplier = 0.005} + +-- Depreciated, don't do this. Add se_allow_in_space =true to the prototype directly instead. -------------------------------------------------------------- +se_allow_in_space = se_allow_in_space or {} +se_allow_in_space[data_util.mod_prefix.."lifesupport-facility"] = true +se_allow_in_space[data_util.mod_prefix.."recycling-facility"] = true +se_allow_in_space[data_util.mod_prefix.."delivery-cannon"] = true + +-- EXCLUDE FROM PROCEDURAL TECHNOLOGY INGREDIENT FUNCTIONS --------------------- +-- These techs won't have science packs dynamically added. +-- If additional technologies are specified your mod should add the appropriate specialist science packs for that stage of the game +se_prodecural_tech_exclusions = se_prodecural_tech_exclusions or {} +table.insert(se_prodecural_tech_exclusions, "productivity-module") +table.insert(se_prodecural_tech_exclusions, "speed-module") +table.insert(se_prodecural_tech_exclusions, "effectivity-module") +table.insert(se_prodecural_tech_exclusions, "nano-speed") +table.insert(se_prodecural_tech_exclusions, "nano-range") +table.insert(se_prodecural_tech_exclusions, "mining-productivity") + +-- DELIVERY CANNON: Should ONLY deliver homogenous resources, nothing manufactured. +-- defaults to stack size for items +se_delivery_cannon_recipes = se_delivery_cannon_recipes or {} +se_delivery_cannon_recipes["water"] = {name="water-barrel"} +se_delivery_cannon_recipes["crude-oil"] = {name="crude-oil-barrel"} +se_delivery_cannon_recipes["heavy-oil"] = {name="heavy-oil-barrel"} +se_delivery_cannon_recipes["light-oil"] = {name="light-oil-barrel"} +se_delivery_cannon_recipes["petroleum-gas"] = {name="petroleum-gas-barrel"} +se_delivery_cannon_recipes["lubricant"] = {name="lubricant-barrel"} +se_delivery_cannon_recipes["sulfuric-acid"] = {name="sulfuric-acid-barrel"} + +se_delivery_cannon_recipes["iron-ore"] = {name="iron-ore"} +se_delivery_cannon_recipes["iron-plate"] = {name="iron-plate"} +se_delivery_cannon_recipes["copper-ore"] = {name="copper-ore"} +se_delivery_cannon_recipes["copper-plate"] = {name="copper-plate"} +se_delivery_cannon_recipes["uranium-ore"] = {name="uranium-ore"} +se_delivery_cannon_recipes["uranium-238"] = {name="uranium-238"} +se_delivery_cannon_recipes["uranium-235"] = {name="uranium-235"} +se_delivery_cannon_recipes["steel-plate"] = {name="steel-plate"} +se_delivery_cannon_recipes["stone"] = {name="stone"} +se_delivery_cannon_recipes["stone-brick"] = {name="stone-brick"} +se_delivery_cannon_recipes["coal"] = {name="coal"} +se_delivery_cannon_recipes["concrete"] = {name="concrete"} +se_delivery_cannon_recipes["plastic-bar"] = {name="plastic-bar"} +se_delivery_cannon_recipes["sulfur"] = {name="sulfur"} +se_delivery_cannon_recipes["wood"] = {name="wood"} +se_delivery_cannon_recipes["fish"] = {name="fish"} +se_delivery_cannon_recipes["rocket-fuel"] = {name="rocket-fuel"} +se_delivery_cannon_recipes["solid-fuel"] = {name="solid-fuel"} +se_delivery_cannon_recipes["processed-fuel"] = {name="processed-fuel"} +se_delivery_cannon_recipes["sand"] = {name="sand"} +se_delivery_cannon_recipes["glass"] = {name="glass"} +se_delivery_cannon_recipes["explosives"] = {name="explosives"} +se_delivery_cannon_recipes["low-density-structure"] = {name="low-density-structure"} +se_delivery_cannon_recipes[data_util.mod_prefix.."heat-shielding"] = {name=data_util.mod_prefix.."heat-shielding"} +se_delivery_cannon_recipes[data_util.mod_prefix.."scrap"] = {name=data_util.mod_prefix.."scrap"} +se_delivery_cannon_recipes[data_util.mod_prefix.."contaminated-scrap"] = {name=data_util.mod_prefix.."contaminated-scrap"} + +se_delivery_cannon_recipes[data_util.mod_prefix.."water-ice"] = {name=data_util.mod_prefix.."water-ice"} +se_delivery_cannon_recipes[data_util.mod_prefix.."methane-ice"] = {name=data_util.mod_prefix.."methane-ice"} +se_delivery_cannon_recipes[data_util.mod_prefix.."beryllium-ore"] = {name=data_util.mod_prefix.."beryllium-ore"} +se_delivery_cannon_recipes[data_util.mod_prefix.."beryllium-ingot"] = {name=data_util.mod_prefix.."beryllium-ingot"} +se_delivery_cannon_recipes[data_util.mod_prefix.."iridium-ore"] = {name=data_util.mod_prefix.."iridium-ore"} +se_delivery_cannon_recipes[data_util.mod_prefix.."iridium-ingot"] = {name=data_util.mod_prefix.."iridium-ingot"} +se_delivery_cannon_recipes[data_util.mod_prefix.."holmium-ore"] = {name=data_util.mod_prefix.."holmium-ore"} +se_delivery_cannon_recipes[data_util.mod_prefix.."holmium-ingot"] = {name=data_util.mod_prefix.."holmium-ingot"} +se_delivery_cannon_recipes[data_util.mod_prefix.."naquium-ore"] = {name=data_util.mod_prefix.."naquium-ore"} +se_delivery_cannon_recipes[data_util.mod_prefix.."naquium-ingot"] = {name=data_util.mod_prefix.."naquium-ingot"} +se_delivery_cannon_recipes[data_util.mod_prefix.."vitamelange"] = {name=data_util.mod_prefix.."vitamelange"} +se_delivery_cannon_recipes[data_util.mod_prefix.."vitamelange-spice"] = {name=data_util.mod_prefix.."vitamelange-spice"} +se_delivery_cannon_recipes[data_util.mod_prefix.."cryonite"] = {name=data_util.mod_prefix.."cryonite"} +se_delivery_cannon_recipes[data_util.mod_prefix.."cryonite-rod"] = {name=data_util.mod_prefix.."cryonite-rod"} +se_delivery_cannon_recipes[data_util.mod_prefix.."vulcanite"] = {name=data_util.mod_prefix.."vulcanite"} +se_delivery_cannon_recipes[data_util.mod_prefix.."vulcanite-block"] = {name=data_util.mod_prefix.."vulcanite-block"} + +se_delivery_cannon_ammo_recipes = se_delivery_cannon_ammo_recipes or {} +se_delivery_cannon_ammo_recipes["atomic-bomb"] = { + type = "ammo", + name="atomic-bomb", + amount = 1, + ingredients = { + { "atomic-bomb", 1}, + { data_util.mod_prefix .. "delivery-cannon-weapon-capsule", 1 } + } +} +se_delivery_cannon_ammo_recipes[data_util.mod_prefix.."plague-bomb"] = { + type = "ammo", + name=data_util.mod_prefix.."plague-bomb", + amount = 1, + ingredients = { + { data_util.mod_prefix .. "plague-bomb", 1}, + { data_util.mod_prefix .. "delivery-cannon-weapon-capsule", 1 } + } +} + +if not mods["space-exploration-postprocess"] then + local message = "\n\n---------------------------------------------------------------------------------------------------" + message = message .. "\n\nPlease install the Space Exploration Postprocess mod." + message = message .. " \n\nYou have the Space Exploration mod installed but not the Space Exploration Postprocess mod. Both are required." + message = message .. " \n\nUnfortunately the postprocess mod can't be listed as a dependency without creating a dependancy loop, sorry for the inconvenience. " + message = message .. " \nTo install the postprocess mod you can disable Space Exploration using the 'disable listed mods' button below and reload the game," + message = message .. " \ndownload Space Exploration Postprocess mod using the in-game interface, then enable both mods. \nAlternatively you can download the postprocess mod directly here:" + message = message .. " \nhttps://mods.factorio.com/mod/space-exploration-postprocess/downloads " + message = message .. "\n\n---------------------------------------------------------------------------------------------------" + error(message) +end +if not data_util.dot_string_greater_than(mods["space-exploration-postprocess"], min_postprocess_version, true) then + local message = "\n\n---------------------------------------------------------------------------------------------------" + message = message .. "\n\nPlease update the Space Exploration Postprocess mod." + message = message .. "\nMinimum version: " .. min_postprocess_version + message = message .. "\n\n---------------------------------------------------------------------------------------------------" + error(message) +end + +resource_autoplace = require("prototypes/resource_autoplace_overrides") -- load the updated functions + +require("prototypes/phase-1/input") +require("prototypes/phase-1/shortcut") + +require("prototypes/phase-1/utility-sprites.lua") + +require("prototypes/phase-1/item/utility") +require("prototypes/phase-1/item/science-pack") + +require("prototypes/phase-1/damage-types") +require("prototypes/phase-1/categories") +require("prototypes/phase-1/item-groups") +require("prototypes/phase-1/signal") +require("prototypes/phase-1/sound") +require("prototypes/phase-1/styles") +--require("prototypes/phase-1/space-structures") + +require("prototypes/phase-1/item/armor") +require("prototypes/phase-1/item/cargo-rocket") +require("prototypes/phase-1/item/condenser-turbine") +require("prototypes/phase-1/item/core-miner") +require("prototypes/phase-1/item/items") +require("prototypes/phase-1/item/gate") +require("prototypes/phase-1/item/meteor-defence") +require("prototypes/phase-1/item/platforms") +require("prototypes/phase-1/item/resources") +require("prototypes/phase-1/item/rocket-landing-pad") +require("prototypes/phase-1/item/rocket-launch-pad") +require("prototypes/phase-1/item/spaceship") +require("prototypes/phase-1/item/structures") +require("prototypes/phase-1/item/medpack") + +require("prototypes/phase-1/item/weapon-tesla") +require("prototypes/phase-1/item/weapon-cryogun") +require("prototypes/phase-1/item/weapon-plague") +require("prototypes/phase-1/item/weapon-railgun") + +require("prototypes/phase-1/item/equipment") + +require("prototypes/phase-1/fluid/fluid") + +require("prototypes/phase-1/recipe/recipe") +require("prototypes/phase-1/recipe/structures") +require("prototypes/phase-1/recipe/astrometrics-laboratory") +require("prototypes/phase-1/recipe/biochemical-laboratory") +require("prototypes/phase-1/recipe/cargo-rocket") +require("prototypes/phase-1/recipe/condenser-turbine") +require("prototypes/phase-1/recipe/core-miner") +require("prototypes/phase-1/recipe/decontamination-facility") +require("prototypes/phase-1/recipe/electromagnetics-laboratory") +require("prototypes/phase-1/recipe/material-fabricator") +require("prototypes/phase-1/recipe/gate") +require("prototypes/phase-1/recipe/genetics-laboratory") +require("prototypes/phase-1/recipe/gravimetrics-laboratory") +require("prototypes/phase-1/recipe/growth-facility") +require("prototypes/phase-1/recipe/hypercooler") +require("prototypes/phase-1/recipe/laser-laboratory") +require("prototypes/phase-1/recipe/lifesupport-facility") +require("prototypes/phase-1/recipe/manufacturing") +require("prototypes/phase-1/recipe/mechanical-laboratory") +require("prototypes/phase-1/recipe/observation") +require("prototypes/phase-1/recipe/particle-accelerator") +require("prototypes/phase-1/recipe/particle-collider") +require("prototypes/phase-1/recipe/plasma-generator") +require("prototypes/phase-1/recipe/platforms") +require("prototypes/phase-1/recipe/resources") +require("prototypes/phase-1/recipe/radiation-laboratory") +require("prototypes/phase-1/recipe/radiator") +require("prototypes/phase-1/recipe/recycling-facility") +require("prototypes/phase-1/recipe/rocket-landing-pad") +require("prototypes/phase-1/recipe/rocket-launch-pad") +require("prototypes/phase-1/recipe/science-lab") +require("prototypes/phase-1/recipe/science") +require("prototypes/phase-1/recipe/supercomputing") +require("prototypes/phase-1/recipe/thermodynamics-laboratory") +require("prototypes/phase-1/recipe/spaceship") +require("prototypes/phase-1/recipe/medpack") + +require("prototypes/phase-1/decorative/crater") +require("prototypes/phase-1/decorative/rocks") + +require("prototypes/phase-1/entity/entity") -- must be first +require("prototypes/phase-1/entity/astrometric-gravimetric") +require("prototypes/phase-1/entity/wide-beacon") +require("prototypes/phase-1/entity/cargo-rocket") +require("prototypes/phase-1/entity/condenser-turbine") +require("prototypes/phase-1/entity/core-miner") +require("prototypes/phase-1/entity/decontamination-lifesupport") +require("prototypes/phase-1/entity/dimensional-anchor") +require("prototypes/phase-1/entity/explosion") +require("prototypes/phase-1/entity/fluid-burner-generator") +require("prototypes/phase-1/entity/fuel-refinery") +require("prototypes/phase-1/entity/gate") +require("prototypes/phase-1/entity/genetics-laboratory") +require("prototypes/phase-1/entity/growth-facility") +require("prototypes/phase-1/entity/laser-radi-thermo") +require("prototypes/phase-1/entity/light") +require("prototypes/phase-1/entity/meteor") +require("prototypes/phase-1/entity/meteor-defence") +require("prototypes/phase-1/entity/recycle-mechanical") +require("prototypes/phase-1/entity/resources") +require("prototypes/phase-1/entity/rocket-fragments") +require("prototypes/phase-1/entity/rocket-landing-pad") +require("prototypes/phase-1/entity/rocket-launch-pad") +require("prototypes/phase-1/entity/particle-acc-col-fab") +require("prototypes/phase-1/entity/pylons") +require("prototypes/phase-1/entity/scaffold") +require("prototypes/phase-1/entity/space-biochemical") +require("prototypes/phase-1/entity/space-capsule") +require("prototypes/phase-1/entity/space-electromagnetics") +require("prototypes/phase-1/entity/space-hypercooler") +require("prototypes/phase-1/entity/space-manufactory") +require("prototypes/phase-1/entity/space-plasma-generator") +require("prototypes/phase-1/entity/space-radiator") +require("prototypes/phase-1/entity/space-supercomputer") +require("prototypes/phase-1/entity/space-science-lab") +require("prototypes/phase-1/entity/spaceship") +require("prototypes/phase-1/entity/spaceship-obstacles") +require("prototypes/phase-1/entity/starmap") +require("prototypes/phase-1/entity/supercharger") +require("prototypes/phase-1/entity/telescopes") +require("prototypes/phase-1/entity/ancient") + +require("prototypes/phase-1/technology/technology") +require("prototypes/phase-1/technology/bio-upgrades") + +require("prototypes/phase-1/combined/arcosphere") +require("prototypes/phase-1/combined/antimatter-reactor") +require("prototypes/phase-1/combined/big-heat-exchanger") +require("prototypes/phase-1/combined/big-turbine") +require("prototypes/phase-1/combined/delivery-cannon") +require("prototypes/phase-1/combined/electric-boiler") +require("prototypes/phase-1/combined/energy-transmitter") +require("prototypes/phase-1/combined/iridium-piledriver") +require("prototypes/phase-1/combined/interburbulator") +require("prototypes/phase-1/combined/lifesupport") +require("prototypes/phase-1/combined/nexus") +require("prototypes/phase-1/combined/pipe") +require("prototypes/phase-1/combined/probe") +require("prototypes/phase-1/combined/rail") +--require("prototypes/phase-1/combined/shield-projector") +require("prototypes/phase-1/combined/transport-belt") +require("prototypes/phase-1/combined/spaceship-clamps") +require("prototypes/phase-1/combined/weapon-bio") +require("prototypes/phase-1/combined/linked-container") + + +require("prototypes/phase-1/tile/space") +require("prototypes/phase-1/tile/regolith") +require("prototypes/phase-1/tile/asteroid") +require("prototypes/phase-1/tile/scaffold") +require("prototypes/phase-1/tile/plating") +require("prototypes/phase-1/tile/spaceship") + +require("prototypes/phase-1/compatibility/qol_research.lua") + +require("prototypes/phase-multi/item-group-assign") + +--log( serpent.block( data.raw["tile"], {comment = false, numformat = '%1.8g' } ) ) diff --git a/space-exploration_0.5.58/space-exploration/data_util.lua b/space-exploration_0.5.58/space-exploration/data_util.lua new file mode 100644 index 0000000..5051ed6 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/data_util.lua @@ -0,0 +1,1077 @@ +local data_util = {} + +data_util.mod_prefix = "se-" -- update strings.cfg + +data_util.liquid_rocket_fuel_per_solid = 50 + +data_util.console_tint = {r=0, g=0.3, b=1} +data_util.console_alt_tint = {r=1,g=0.5,b=0} + +data_util.coolant_temperature = { + supercooled = -273, + cold = -100, + normal = -10, + hot = 25 +} + +data_util.obs_types = { + ["visible"] = {"visible", 12, 0.98}, + ["infrared"] = {"infrared", 10, 0.85}, + ["uv"] = {"uv", 10, 0.9}, + ["microwave"] = {"microwave", 8, 0.75}, + ["xray"] = {"xray", 4, 0.85}, + ["radio"] = {"radio", 6, 0.6}, + ["gammaray"] = {"gammaray", 3, 0.85}, +} + +data_util.char_to_multiplier = { + m = 0.001, + c = 0.01, + d = 0.1, + h = 100, + k = 1000, + K = 1000, + M = 1000000, + G = 1000000000, + T = 1000000000000, + P = 1000000000000000, +} + + +function data_util.string_to_number (str) + str = ""..str + local number_string = "" + local last_char = nil + for i = 1, #str do + local c = str:sub(i,i) + if c == "." or tonumber(c) ~= nil then + number_string = number_string .. c + else + last_char = c + break + end + end + local number = tonumber(number_string) + if number and last_char and data_util.char_to_multiplier[last_char] then + return number * data_util.char_to_multiplier[last_char] + end + return number +end + +function data_util.string_to_simple_int(str) + str = ""..str + local number_string = "" + for i = 1, #str do + local c = str:sub(i,i) + if tonumber(c) ~= nil then + number_string = number_string .. c + end + end + local number = tonumber(number_string) + return number +end + +function data_util.string_split (str, sep) + if sep == nil then + sep = "%s" + end + local t={} + for str in string.gmatch(str, "([^"..sep.."]+)") do + table.insert(t, str) + end + return t +end + +function data_util.string_join (str_table, sep) + local str = "" + for _, str_part in pairs(str_table) do + if str ~= "" then + str = str .. sep + end + str = str .. str_part + end + return str +end + +function data_util.dot_string_less_than(a, b, allow_equal) + if allow_equal and a == b then return true end + local a_parts = data_util.string_split(a, ".") + local b_parts = data_util.string_split(b, ".") + for i = 1, #a_parts do + if tonumber(a_parts[i]) < tonumber(b_parts[i]) then + return true + elseif a_parts[i] ~= b_parts[i] then + return false + end + end + return false +end + +function data_util.dot_string_greater_than(a, b, allow_equal) + if allow_equal and a == b then return true end + local a_parts = data_util.string_split(a, ".") + local b_parts = data_util.string_split(b, ".") + for i = 1, #a_parts do + if tonumber(a_parts[i]) > tonumber(b_parts[i]) then + return true + elseif a_parts[i] ~= b_parts[i] then + return false + end + end + return false +end + +function data_util.remove_number_suffix(str) + local parts = data_util.string_split (str, "-") + local int = data_util.string_to_simple_int(parts[#parts]) + if int and int.."" == parts[#parts] then + -- last part was a number + parts[#parts] = nil + return data_util.string_join(parts, "-") + end + return str +end + +function data_util.replace (str, what, with) + what = string.gsub(what, "[%(%)%.%+%-%*%?%[%]%^%$%%]", "%%%1") -- escape pattern + with = string.gsub(with, "[%%]", "%%%%") -- escape replacement + return string.gsub(str, what, with) +end + + +function data_util.remove_from_table(list, item) + local index = 0 + for _,_item in ipairs(list) do + if item == _item then + index = _ + break + end + end + if index > 0 then + table.remove(list, index) + end +end + +function data_util.table_contains(table, check) + for k,v in pairs(table) do if v == check then return true end end + return false +end + +-- return {name = name, amount = amount::float} +function data_util.collapse_product(product) + if product[1] and type(product[1]) == "string" then + if product[2] then + return {name = product[1], amount = product[2]} + else + return {name = product[1], amount = 1} + end + end + if product.name then + local collapsed = {name = product.name, amount = product.amount, type = product.type} + if product.amount_min and product.amount_max then + collapsed.amount = (product.amount_min + product.amount_max) / 2 * (product.probability or 1) + end + return collapsed + end +end + +-- return {name = name, amount = amount::float} +function data_util.collapse_products(products) + local combined = {} + for _, product in pairs(products) do + local collapsed = data_util.collapse_product(product) + if collapsed then + if combined[collapsed.name] then + combined[collapsed.name].amount = combined[collapsed.name].amount + collapsed.amount + else + combined[collapsed.name] = collapsed + end + end + end + return combined +end + +function data_util.result_to_results(recipe_section) + -- transform result style definition to full results definition for a given prototype section + -- recipe_section is either the recipe prrototype, recipe.normal, or recipe.difficult + if not recipe_section.result then return end + local result_count = recipe_section.result_count or 1 + if type(recipe_section.result) == "string" then + recipe_section.results = {{type="item", name= recipe_section.result, amount = result_count}} + elseif recipe_section.result.name then + recipe_section.results = {recipe_section.result} + elseif recipe_section.result[1] then + result_count = recipe_section.result[2] or result_count + recipe_section.results = {{type="item", name= recipe_section.result[1], amount = result_count}} + end + recipe_section.result = nil +end + + +function data_util.get_ingredients_tables(recipe) + local tables = {} + if recipe.ingredients then table.insert(tables, recipe.ingredients) end + if recipe.normal and recipe.normal.ingredients then table.insert(tables, recipe.normal.ingredients) end + if recipe.expensive and recipe.expensive.ingredients then table.insert(tables, recipe.expensive.ingredients) end + return tables +end + +function data_util.conditional_modify(prototype) + -- pass in a partial prototype that includes .type and .name + -- overwrite sections of the raw prototype with the new one + if data.raw[prototype.type] and data.raw[prototype.type][prototype.name] then + local raw = data.raw[prototype.type][prototype.name] + + -- update to new spec + if not raw.normal then + raw.normal = { + enabled = raw.enabled, + energy_required = raw.energy_required, + requester_paste_multiplier = raw.requester_paste_multiplier, + hidden = raw.hidden, + ingredients = raw.ingredients, + results = raw.results, + result = raw.result, + result_count = raw.result_count, + } + raw.enabled = nil + raw.energy_required = nil + raw.requester_paste_multiplier = nil + raw.hidden = nil + raw.ingredients = nil + raw.results = nil + raw.result = nil + raw.result_count = nil + end + if not raw.expensive then + raw.expensive = table.deepcopy(raw.normal) + end + if not raw.normal.results and raw.normal.result then + data_util.result_to_results(raw.normal) + end + if not raw.expensive.results and raw.expensive.result then + data_util.result_to_results(raw.expensive) + end + + for key, property in pairs(prototype) do + if key == "ingredients" then + raw.normal.ingredients = property + raw.expensive.ingredients = property + elseif key ~= "normal" and key ~= "expensive" then + raw[key] = property + end + end + + if prototype.normal then + for key, property in pairs(prototype.normal) do + raw.normal[key] = property + end + end + + if prototype.expensive then + for key, property in pairs(prototype.expensive) do + raw.expensive[key] = property + end + end + + end +end + +function data_util.disable_recipe(recipe_name) + data_util.conditional_modify({ + type = "recipe", + name = recipe_name, + enabled = false, + normal = { + enabled = false + }, + expensive = { + enabled = false + } + }) +end + +function data_util.remove_recipe_from_effects(effects, recipe) + local index = 0 + for _,_item in ipairs(effects) do + if _item.type == "unlock-recipe" and _item.recipe == recipe then + index = _ + break + end + end + if index > 0 then + table.remove(effects, index) + end +end + +function data_util.remove_ingredient_sub(recipe, name) + for i = #recipe.ingredients, 1, -1 do + if recipe.ingredients[i] then + for _, value in pairs(recipe.ingredients[i]) do + if value == name then + table.remove(recipe.ingredients, i) + end + end + end + end +end + +function data_util.add_ingredient_sub(recipe, name, amount) + local found = false + for i = #recipe.ingredients, 1, -1 do + if recipe.ingredients[i] then + for _, value in pairs(recipe.ingredients[i]) do + if value == name then + found = true + recipe.ingredients[i] = {type="item", name=name, amount=amount} + break + end + end + end + end + if not found then + table.insert(recipe.ingredients, {type="item", name=name, amount=amount}) + end +end + +function data_util.replace_or_add_ingredient_sub(recipe, old, new, amount) + -- old can be nil to just add + if old then + data_util.remove_ingredient_sub(recipe, old) + end + data_util.add_ingredient_sub(recipe, new, amount) +end + +function data_util.replace_or_add_ingredient(recipe, old, new, amount) + if type(recipe) == "string" then recipe = data.raw.recipe[recipe] end + if not recipe then return end + if recipe.ingredients then + data_util.replace_or_add_ingredient_sub(recipe, old, new, amount) + end + if recipe.normal and recipe.normal.ingredients then + data_util.replace_or_add_ingredient_sub(recipe.normal, old, new, amount) + end + if recipe.expensive and recipe.expensive.ingredients then + data_util.replace_or_add_ingredient_sub(recipe.expensive, old, new, amount) + end +end + +function data_util.recipe_require_tech(recipe_name, tech_name) + if data.raw.recipe[recipe_name] and data.raw.technology[tech_name] then + data_util.disable_recipe(recipe_name) + for _, tech in pairs(data.raw.technology) do + if tech.effects then + data_util.remove_recipe_from_effects(tech.effects, recipe_name) + end + end + local already = false + data.raw.technology[tech_name].effects = data.raw.technology[tech_name].effects or {} + for _, effect in pairs(data.raw.technology[tech_name].effects) do + if effect.type == "unlock-recipe" and effect.recipe == recipe_name then + already = true + break + end + end + if not already then + table.insert(data.raw.technology[tech_name].effects, { type = "unlock-recipe", recipe = recipe_name}) + end + end +end + +function data_util.tech_split_at_level(tech_name, level) + -- skip if it exists + if data.raw.technology[tech_name.."-"..level] then return end + local last_tech = data.raw.technology[tech_name] + for i = 1, level - 1 do + if data.raw.technology[tech_name.."-"..i] then + last_tech = data.raw.technology[tech_name.."-"..i] + end + end + if last_tech then + local new_tech = table.deepcopy(last_tech) + last_tech.max_level = level - 1 + new_tech.name = tech_name.."-"..level + new_tech.prerequisites = {last_tech.name} + data:extend({new_tech}) + -- make the chain linear + local last_level = new_tech.max_level or level + if last_level ~= "infinite" then + local next_level = last_level + 1 + if data.raw.technology[tech_name.."-"..next_level] then + local next_tech = data.raw.technology[tech_name.."-"..next_level] + for i, prereq in pairs(next_tech.prerequisites) do + if prereq == last_tech.name then + debug_log("Changing tech "..next_tech.name .." prerequisite from " .. last_tech.name.." to "..new_tech.name) + next_tech.prerequisites[i] = new_tech.name + end + end + end + end + return new_tech + end +end + +function data_util.tech_split_at_levels(tech_name, levels) + local techs = {} + for _, level in pairs(levels) do + local tech = data_util.tech_split_at_level(tech_name, level) + if tech then table.insert(techs, tech) end + end + return techs +end + + +function data_util.tech_split_levels(tech_name, max_split_level) + if not max_split_level then max_split_level = 9 end + local max_level = 1 + local prev_tech_template + local prev_tech_name + local techs = {} + local last_i = 0 + for i = 1, max_split_level do + -- prep prerequisites + local prerequisites = {} + local tech_template + + -- load best template + if data.raw.technology[tech_name.."-"..i] then + tech_template = data.raw.technology[tech_name.."-"..i] + if tech_template.prerequisites then + prerequisites = tech_template.prerequisites + end + tech_template.prerequisites = nil + end + if not tech_template then + if prev_tech_template and (max_level == "infinite" or i <= max_level) then + tech_template = prev_tech_template + end + end + + if not tech_template then return end + prev_tech_template = tech_template + last_i = i + + -- link the chain + if prev_tech_name and not data_util.table_contains(prerequisites, prev_tech_name)then + table.insert(prerequisites, prev_tech_name) + end + + -- establish maximum + if max_level ~= "infinite" then + if tech_template.max_level then + if tech_template.max_level == "infinite" then + max_level = "infinite" + elseif tech_template.max_level > max_level then + max_level = tech_template.max_level + end + end + end + + local new_tech = table.deepcopy(tech_template) + new_tech.name = tech_name.."-"..i + new_tech.prerequisites = prerequisites + new_tech.max_level = nil + data:extend({new_tech}) + + prev_tech_name = new_tech.name + table.insert(techs, new_tech) + end + if max_level == "infinite" then + data.raw.technology[tech_name.."-"..last_i].max_level = max_level + else + data.raw.technology[tech_name.."-"..last_i].max_level = math.max(last_i, max_level) + end + return techs +end + +function data_util.tech_lock_recipes(tech_name, recipe_names) + if not data.raw.technology[tech_name] then return end + if type(recipe_names) == "string" then recipe_names = {recipe_names} end + for _, recipe_name in pairs(recipe_names) do + if data.raw.recipe[recipe_name] then + data_util.recipe_require_tech(recipe_name, tech_name) + end + end +end + +function data_util.tech_find_parent_names_cascade(names, prototype_name, cascade) + if not (data.raw.technology[prototype_name] and data.raw.technology[prototype_name].prerequisites) then return end + if data.raw.technology[prototype_name].prerequisites then + for _, prerequisite in pairs(data.raw.technology[prototype_name].prerequisites) do + if not names[prerequisite] then + names[prerequisite] = prerequisite + if cascade then + data_util.tech_find_parent_names_cascade(names, prerequisite, cascade) + end + end + end + end + return names +end + +function data_util.tech_find_parent_names(prototype_name, cascade) + return data_util.tech_find_parent_names_cascade({}, prototype_name, cascade) +end + +function data_util.tech_find_child_names(prototype_name) + local names = {} + for _, tech in pairs(data.raw.technology) do + if tech.prerequisites then + for _, prerequisite in pairs(tech.prerequisites) do + if prerequisite == prototype_name then + table.insert(names, tech.name) + end + end + end + end + return names +end + +function data_util.tech_add_prerequisites(prototype_name, prerequisites) + local prototype = data.raw.technology[prototype_name] + if not prototype then return end + for _, new_prerequisite in pairs(prerequisites) do + local found = false + if prototype.prerequisites then + for _, old_prerequisite in pairs(prototype.prerequisites) do + if old_prerequisite == new_prerequisite then + found = true break + end + end + end + if not found then + prototype.prerequisites = prototype.prerequisites or {} + table.insert(prototype.prerequisites, new_prerequisite) + end + end +end + +function data_util.tech_remove_prerequisites (prototype_name, prerequisites) + local prototype = data.raw.technology[prototype_name] + if not prototype then return end + for _, new_prerequisite in pairs(prerequisites) do + if prototype.prerequisites then + for i = #prototype.prerequisites, 1, -1 do + if prototype.prerequisites[i] == new_prerequisite then + table.remove(prototype.prerequisites, i) + end + end + end + end +end +--[[ +function util.tech_remove_prerequisites (prototype_name, prerequisites) + local prototype = data.raw.technology[prototype_name] + if not prototype then return end + for _, new_prerequisite in pairs(prerequisites) do + for _, old_prerequisite in pairs(prototype.prerequisites) do + if old_prerequisite == new_prerequisite then + prototype.prerequisites[_] = nil + end + end + end +end]]-- + +function data_util.tech_has_ingredient (prototype_name, pack) + local prototype = data.raw.technology[prototype_name] + if prototype then + for _, ingredient in pairs(prototype.unit.ingredients) do + if ingredient[1] == pack or ingredient.name == pack then + return true + end + end + end + return false +end + +function data_util.tech_remove_ingredients_recursive (prototype_name, packs) + if not data.raw.technology[prototype_name] then return end + local names = data_util.tech_find_parent_names(prototype_name, true) + table.insert(names, prototype_name) + + for _, name in pairs(names) do + local prototype = data.raw.technology[name] + if prototype then + for _, pack in pairs(packs) do + for i = #prototype.unit.ingredients, 1, -1 do + if prototype.unit.ingredients[i] and + (prototype.unit.ingredients[i][1] and prototype.unit.ingredients[i][1] == pack + or prototype.unit.ingredients[i].name and prototype.unit.ingredients[i].name == pack) then -- added handling for full format + table.remove(prototype.unit.ingredients, i) + end + end + end + end + end +end + +function data_util.tech_remove_ingredients (prototype_name, packs) + local prototype = data.raw.technology[prototype_name] + if prototype then + for _, pack in pairs(packs) do + for i = #prototype.unit.ingredients, 1, -1 do + if prototype.unit.ingredients[i] and + (prototype.unit.ingredients[i][1] and prototype.unit.ingredients[i][1] == pack + or prototype.unit.ingredients[i].name and prototype.unit.ingredients[i].name == pack) then -- added handling for full format + table.remove(prototype.unit.ingredients, i) + end + end + end + end +end + +function data_util.tech_remove_effects(prototype_name, effects) + --log("tech_remove_effects") + local prototype = data.raw.technology[prototype_name] + if not data.raw.technology[prototype_name] then return end + for _, new_effect in pairs(effects) do + --log("new effect: " .. new_effect.type .. " " .. new_effect.recipe) + for _, old_effect in pairs(prototype.effects) do + --log("old effect: " .. old_effect.type .. " " .. old_effect.recipe) + local match = true + for new_key, new_var in pairs(new_effect) do + if old_effect[new_key] ~= new_var then + --log("compare fails") + match = false break + end + end + if match then + -- log("compare pass") + prototype.effects[_] = nil + end + end + end +end + +-- cascade applies to children too +function data_util.tech_add_ingredients(prototype_name, ingredients, cascade, allow_multiple_specialist, allow_multiple_deep) + --log("tech_add_ingredients: " .. prototype_name) + local prototype = data.raw.technology[prototype_name] + if not prototype then return end + local added = false + for _, new_ingredient in pairs(ingredients) do + local found = false + local specialist_pack = nil + if string.find(new_ingredient, data_util.mod_prefix .. "astronomic-science-pack", 1, true) then + specialist_pack = data_util.mod_prefix .. "astronomic-science-pack" + elseif string.find(new_ingredient, data_util.mod_prefix .. "energy-science-pack", 1, true) then + specialist_pack = data_util.mod_prefix .. "energy-science-pack" + elseif string.find(new_ingredient, data_util.mod_prefix .. "material-science-pack", 1, true) then + specialist_pack = data_util.mod_prefix .. "material-science-pack" + elseif string.find(new_ingredient, data_util.mod_prefix .. "biological-science-pack", 1, true) then + specialist_pack = data_util.mod_prefix .. "biological-science-pack" + end + local deep_pack = nil + if string.find(new_ingredient, data_util.mod_prefix .. "deep-space-science-pack", 1, true) then + deep_pack = data_util.mod_prefix .. "deep-space-science-pack" + end + if specialist_pack and not allow_multiple_specialist then + for _, old_ingredient in pairs(prototype.unit.ingredients) do + if string.find(old_ingredient[1] or old_ingredient.name, specialist_pack, 1, true) then -- added haldling for full format + old_ingredient[1] = new_ingredient + found = true break + end + end + else + if deep_pack and not allow_multiple_deep then + for _, old_ingredient in pairs(prototype.unit.ingredients) do + if string.find(old_ingredient[1] or old_ingredient.name, deep_pack, 1, true) then -- added haldling for full format + old_ingredient[1] = new_ingredient + found = true break + end + end + else + for _, old_ingredient in pairs(prototype.unit.ingredients) do + if old_ingredient[1] and old_ingredient[1] == new_ingredient or old_ingredient.name and old_ingredient.name == new_ingredient then -- added haldling for full format + found = true break + end + end + end + end + if not found then + table.insert(prototype.unit.ingredients, {new_ingredient, 1}) + added = true + end + end + if added and cascade then + local child_techs = data_util.tech_find_child_names(prototype_name) + for _, tech in pairs(child_techs) do + data_util.tech_add_ingredients(tech, ingredients, cascade) + end + end +end + +-- cascade applies to children too +function data_util.tech_add_ingredients_with_prerequisites (prototype_name, ingredients) + -- assumes that ingredient and tech are same name + --log("tech_add_ingredients: " .. prototype_name) + local prototype = data.raw.technology[prototype_name] + if not prototype then return end + for _, ingredient in pairs(ingredients) do + if not data_util.tech_has_ingredient(prototype_name, ingredient) then + data_util.tech_add_prerequisites(prototype_name, {ingredient}) + data_util.tech_add_ingredients(prototype_name, {ingredient}, true) + end + end +end + +function data_util.disallow_productivity(recipe_name) + for _, prototype in pairs(data.raw["module"]) do + if prototype.limitation and string.find(prototype.name, "productivity", 1, true) then + for i = #prototype.limitation, 1, -1 do + if prototype.limitation[i] == recipe_name then + table.remove(prototype.limitation, i) + end + end + end + end +end + +function data_util.allow_productivity(recipe_names) + if type(recipe_names) == "string" then + recipe_names = {recipe_names} + end + for _, recipe_name in pairs(recipe_names) do + if data.raw.recipe[recipe_name] then + for _, prototype in pairs(data.raw["module"]) do + if prototype.limitation and string.find(prototype.name, "productivity", 1, true) then + table.insert(prototype.limitation, recipe_name) + end + end + end + end +end + +function data_util.replace_filenames_recursive(subject, what, with) + if not subject then return end + if subject.filename then + subject.filename = data_util.replace(subject.filename, what, with) + end + for _, sub in pairs(subject) do + if (type(sub) == "table") then + data_util.replace_filenames_recursive(sub, what, with) + end + end +end + +function data_util.tint_recursive(subject, tint) + if not subject then return end + if subject.filename then + subject.tint = tint + end + for _, sub in pairs(subject) do + if (type(sub) == "table") then + data_util.tint_recursive(sub, tint) + end + end +end + +function data_util.blend_mode_recursive(subject, blend_mode) + if not subject then return end + if subject.filename then + subject.blend_mode = blend_mode + end + for _, sub in pairs(subject) do + if (type(sub) == "table") then + data_util.blend_mode_recursive(sub, blend_mode) + end + end +end + +function data_util.shift_recursive(subject, shift) + if not subject then return end + if subject.filename then + subject.shift = shift + end + for _, sub in pairs(subject) do + if (type(sub) == "table") then + data_util.shift_recursive(sub, shift) + end + end +end + +function data_util.replace_sr_with_half_hr(subject) + if not subject then return end + if subject.hr_version then + subject.width = math.floor(subject.hr_version.width/2) + subject.height = math.floor(subject.hr_version.height/2) + if subject.hr_version.x then subject.x = math.floor(subject.hr_version.x/2) end + if subject.hr_version.y then subject.y = math.floor(subject.hr_version.y/2) end + end + for _, sub in pairs(subject) do + if (type(sub) == "table") then + data_util.replace_sr_with_half_hr(sub) + end + end +end + +function data_util.shift_sprite(sprite, shift) + local shifted_sprite = table.deepcopy(sprite) + shifted_sprite.shift = shift + if shifted_sprite.hr_version then + shifted_sprite.hr_version.shift = shift + end + return shifted_sprite +end + +function data_util.make_recipe(proto) + --name is prefixed with data_util.mod_prefix + --energy required deafults to 10 + local name = proto.name + if proto.is_data then name = name .. "-data" end + local def = { + type = "recipe", + name = name, + category = proto.category or nil, + enabled = proto.enabled == true, + energy_required = proto.energy_required or 10, + ingredients = proto.ingredients, + results = proto.results or { { name = name, amount = 1 } }, + icon = proto.icon or nil, + icons = proto.icons or nil, + icon_size = proto.icon_size or 32, + crafting_machine_tint = proto.crafting_machine_tint or nil, + main_product = proto.main_product or nil, + allow_as_intermediate = proto.allow_as_intermediate, + subgroup = proto.subgroup or nil, + order = proto.order or nil, + localised_name = proto.localised_name, + localised_description = proto.localised_description, + always_show_products = true, + always_show_made_in = true, + } + + if (not def.main_product) and #def.results == 1 then + local p_name = def.results[1].name or def.results[1][1] + local p_type = def.results[1].type or "item" + local prod = data.raw[p_type][p_name] + if p_type == "item" and not prod then + p_type = "capsule" + prod = data.raw[p_type][p_name] + end + if prod then + def.main_product = prod.name + end + end + if not (def.icon or def.icons) then + local p_name = def.results[1].name or def.results[1][1] + local p_type = def.results[1].type or "item" + local prod = data.raw[p_type][p_name] + if p_type == "item" and not prod then + p_type = "capsule" + prod = data.raw[p_type][p_name] + end + if prod then + --log("recipe " .. name .. " icon " .. p_type .. "." .. p_name) + if prod.icon then + def.icon = prod.icon + def.icon_size = prod.icon_size + elseif prod.icons then + def.icons = prod.icons + else + --log("recipe " .. name .. " error: items has no icon(s)") + end + elseif p_type and p_name then + --log("recipe " .. name .. " can't find: " .. p_type .. "." .. p_name) + else + --log("recipe " .. name .. " error") + end + end + data:extend({def}) +end + + +function data_util.icon_stack_shift(original_shift, scale, offset) + if original_shift or added_shift then + local shift = original_shift and table.deepcopy(original_shift) or {0,0} + shift[1] = shift[1] * scale + shift[2] = shift[2] * scale + if offset then + shift[1] = shift[1] + offset[1] * 32 + shift[2] = shift[2] + offset[2] * 32 + end + return shift + end +end + +function data_util.multiply_tables(a, b) + if a and b then + local keys = {} + for k,v in pairs(a) do + keys[k]=k + end + for k,v in pairs(b) do + keys[k]=k + end + local mult = {} + for k, v in paits(keys) do + mult[k] = (a[k] or 1) * (b[k] or 1) + end + return mult + end + return a or b +end + +function data_util.add_icons_to_stack(existing_stack, icons_properties) + local stack = existing_stack or {{ icon = "__space-exploration-graphics__/graphics/blank.png", scale = 1, icon_size = 32 }} + for _, icon_properties in pairs(icons_properties) do + if icon_properties.icon then + data_util.add_icon_to_stack(stack, icon_properties.icon, icon_properties.properties) + end + end + return stack +end + +function data_util.add_icon_to_stack(existing_stack, icon_or_prototype, properties) + + -- properties.scale, properties.offset (0-1), tint? + -- assume base layer is 32, as this is forced in all use cases + local stack = existing_stack or {{ icon = "__space-exploration-graphics__/graphics/blank.png", scale = 1, icon_size = 32 }} + + local scale = properties and properties.scale or 1 + local offset = properties and properties.offset -- note, this is in a 0-1 scale, not pixels, ends up being multiplied by 32 + local tint = properties and properties.tint + local default_size = icon_or_prototype.icon_size or 64 -- this can still set the icon_size for icons not just icon + local icons = {} + + if icon_or_prototype.icons then + icons = icon_or_prototype.icons + elseif icon_or_prototype.icon then + table.insert(icons, { + icon = icon_or_prototype.icon, + icon_size = icon_or_prototype.icon_size or 64, + }) + elseif icon_or_prototype[1] and icon_or_prototype[1].icon then + -- format was {{icon = ...}} + icons = icon_or_prototype + end + + for _, icon in pairs(icons) do + if icon.icon then + local icon_size = icon.icon_size or default_size + table.insert(stack, { + icon=icon.icon, + icon_size=icon_size, + scale=(icon.scale or 1) * scale * 32 / icon_size, + shift= data_util.icon_stack_shift(icon.shift, scale, offset), + tint= data_util.multiply_tables(icon.tint, tint) + }) + end + end + return stack +end + +function data_util.transition_icons(icon_from, icon_to) + if icon_to.icon then -- single 'to' icon format + return { + { icon = "__space-exploration-graphics__/graphics/blank.png", scale = 0.5, shift = {0, 0}, icon_size = 64 }, -- to lock scale + { icon = icon_from.icon, scale = 0.33 * 64 / icon_from.icon_size, shift = {8, -8}, icon_size = icon_from.icon_size }, + { icon = icon_to.icon, scale = 0.33 * 64 / icon_to.icon_size, shift = {-8, 8}, icon_size = icon_to.icon_size }, + { icon = "__space-exploration-graphics__/graphics/icons/transition-arrow.png", scale = 0.5, shift = {0, 0}, icon_size = 64 }, -- to overlay + } + else -- multiple 'to' icons + local icons = { + { icon = "__space-exploration-graphics__/graphics/blank.png", scale = 0.5, shift = {0, 0}, icon_size = 64 }, -- to lock scale + { icon = icon_from.icon, scale = 0.33 * 64 / icon_from.icon_size, shift = {8, -8}, icon_size = icon_from.icon_size }, + } + for _, icon_and_size in pairs(icon_to) do + table.insert(icons, { icon = icon_and_size.icon, scale = 0.25 * 64 / icon_and_size.icon_size, shift = {-12 + (_-1) * 8, 12}, icon_size = icon_and_size.icon_size }) + end + table.insert(icons, { icon = "__space-exploration-graphics__/graphics/icons/transition-arrow.png", scale = 0.5, shift = {0, 0}, icon_size = 64 }) + return icons + end +end + +function data_util.auto_sr_hr(hr_version) + local sr_version = table.deepcopy(hr_version) + if not hr_version.scale then + hr_version.scale = 0.5 + end + if not hr_version.priority then + hr_version.priority = "extra-high" + end + sr_version.scale = (hr_version.scale or 0.5) * 2 + sr_version.width = math.floor(hr_version.width/2) + sr_version.height = math.floor(hr_version.height/2) + if hr_version.x then + sr_version.x = math.floor(hr_version.x/2) + end + if hr_version.y then + sr_version.y = math.floor(hr_version.y/2) + end + sr_version.filename = data_util.replace(sr_version.filename, "/hr/", "/sr/") + sr_version.filename = data_util.replace(sr_version.filename, "/hr-", "/") + sr_version.hr_version = hr_version + return sr_version +end + +function data_util.collision_description(prototype) + local disallowed = {} + --if data_util.table_contains(prototype.collision_mask, "water-tile") then + -- table.insert(disallowed, {"space-exploration.collision_mask_water"}) + --end + if not prototype.collision_mask then return end + if data_util.table_contains(prototype.collision_mask, "ground-tile") then + table.insert(disallowed, {"space-exploration.collision_mask_land"}) + end + if data_util.table_contains(prototype.collision_mask, space_collision_layer) then + table.insert(disallowed, {"space-exploration.collision_mask_space_platform"}) + end + if data_util.table_contains(prototype.collision_mask, spaceship_collision_layer) or data_util.table_contains(prototype.collision_mask, space_collision_layer) then + table.insert(disallowed, {"space-exploration.collision_mask_spaceship"}) + end + if #disallowed > 0 then + local disallowed_locale = nil + for _, disallow in pairs(disallowed) do + if disallowed_locale == nil then + disallowed_locale = disallow + log(prototype.name .. " " .. disallow[1]) + else + disallowed_locale = {"space-exploration.comma_separate", disallowed_locale, disallow} + end + end + prototype.localised_description = {"space-exploration.placement_restriction_line", disallowed_locale, prototype.localised_description or {"entity-description."..prototype.name}} + end +end + +function data_util.auto_box(x, y, inset, shift, top_extension) + inset = inset or 0 + shift = shift or {0,0} + top_extension = top_extension or 0 + return {{-x/2+inset+shift[1], -y/2+inset+shift[2]-top_extension},{x/2-inset+shift[1], y/2-inset+shift[2]}} +end + +function data_util.resistances_max(resistances, add_resistances) + local r = table.deepcopy(resistances or {}) + for _, add_resistance in pairs(add_resistances) do + local found = false + for _, resistance in pairs(r) do + if resistance.type == add_resistance.type then + found = true + resistance.percent = math.max(resistance.percent or 0, add_resistances.percent or 0) + resistance.amount = math.max(resistance.amount or 0, add_resistances.amount or 0) + end + end + if not found then + table.insert(r, {type = add_resistance.type, amount = add_resistance.amount, percent = add_resistance.percent}) + end + end + return r +end + +function data_util.extend_style(base_name, new_name, styles) + local base_style = data.raw["gui-style"]["default"][base_name] + local prototype = {type = base_style.type, parent = base_name} + data_util.apply_styles(prototype, styles) + data.raw["gui-style"]["default"][new_name] = prototype + return prototype +end + +function data_util.apply_styles(prototype, styles) + for k, v in pairs(styles) do + prototype[k] = v + end + return prototype +end + +return data_util diff --git a/space-exploration_0.5.58/space-exploration/info.json b/space-exploration_0.5.58/space-exploration/info.json new file mode 100644 index 0000000..7550083 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/info.json @@ -0,0 +1,100 @@ +{ + "name": "space-exploration", + "version": "0.5.58", + "title": "Space Exploration (Experimental)", + "author": "Earendel", + "dependencies": [ + "base >= 1.1.27", + "aai-industry >= 0.5.3", + "alien-biomes >= 0.6.4", + "jetpack >= 0.2.6", + "robot_attrition >= 0.5.9", + "shield-projector >= 0.1.1", + "space-exploration-graphics >= 0.5.9", + "space-exploration-graphics-2 >= 0.1.1", + "space-exploration-graphics-3 >= 0.1.1", + "space-exploration-graphics-4 >= 0.1.1", + "space-exploration-graphics-5 >= 0.1.1", + "~ space-exploration-postprocess >= 0.5.11", + "informatron >= 0.2.1", + "aai-signal-transmission >= 0.4.1", + + "? space-exploration-hr-graphics >= 0.5.1", + "? aai-containers >= 0.2.7", + "? bullet-trails >= 0.6.1", + "? grappling-gun >= 0.3.1", + "? combat-mechanics-overhaul >= 0.6.15", + "? equipment-gantry >= 0.1.1", + + "! angelsindustries", + "! angelspetrochem", + "! angelsrefining", + "! angelssmelting", + + "! bobelectronics", + "! bobores", + "! bobplates", + "! bobpower", + "! bobrevamp", + "! bobtech", + "! bobvehicleequipment", + "! bobwarfare", + + "! Yuoki", + + "! pycoalprocessing", + "! pyindustry", + "! pyhightech", + + "! ab_logisticscenter", + "! angelsinfiniteores", + "! BasicSeaBlock", + "! BitersBegone", + "! BitersBegoneUpdated", + "! bobmodules", + "! bulkteleport", + "! dangOreus", + "! dark-matter-replicators", + "! dark-matter-replicators-0_17-port", + "! DeepMine", + "! endlessresources", + "! Explosive Excavation", + "! FactorioExtended-Core", + "! FactorioExtended-Plus-Core", + "! IndustrialRevolution", + "! IndustrialRevolution2", + "! inf_res", + "! infinite-resources-depletion", + "! ItemTeleportation", + "! LandfillPainting", + "! modmash", + "! MoreScience", + "! MoreSciencePacks", + "! omnimatter", + "! OnlyReds", + "! PersonalTeleporter", + "! pickerextended", + "! pickerinventorytools", + "! PlacePump", + "! PumpAnywhere", + "! PyBlock", + "! railgun_revival", + "! rso-mod", + "! SeaBlock", + "! SchallMachineScaling", + "! SchallOreConversion", + "! sonaxaton-infinite-resources", + "! SpaceMod", + "! TagToTeleport", + "! TeamCoop", + "! Teleportation_Redux", + "! traintunnels", + "! Unlimited-Resources", + "! UnlimitedProductivity", + "! vtk-deep-core-mining", + "! warptorio" + ], + "description": "Build Cargo Rockets to launch stuff into space. Ride a rocket into space yourself and start spacewalking. Build an orbital space platform to develop difficult data-driven space science. Build a spaceship tile by tile, fly it from a planet surface to other planets, moon, asteroid belts, and more. Space Exploration Postprocess is required (can't be a dependency, long explanation). Not recommended to play with non-dependency mods while in experimental phase.", + "factorio_version": "1.1", + "homepage": "https://spaceexploration.miraheze.org/wiki/Main_Page" +} diff --git a/space-exploration_0.5.58/space-exploration/licence.txt b/space-exploration_0.5.58/space-exploration/licence.txt new file mode 100644 index 0000000..021a358 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/licence.txt @@ -0,0 +1,21 @@ +FMLDOL +Factorio Mod Limited Distribution Only Licence +https://docs.google.com/document/d/1z-6hZQekEHOu1Pk4z-V5LuwlHnveFLJGTjVAtjYHwMU +This software is provided without warranty and the software author/license owner cannot be held liable for damages. + +Commercial Use: +No. +You are not allowed to make money off this mod or any of the contained assets. +You are allowed to feature the mods in other media, such as Twitch or YouTube. It would be nice if you mentioned Earendel's Patreon https://www.patreon.com/earendel when featuring the mod but this in not a requirement. + +Modification: +Restricted. +You may make alterations for your own private personal use only. +You are not allowed to distribute any content from the mod, or anything altered or derived from this mod with the following exception: +You may post partial modified sections of this mod in Earendel's discord https://discord.gg/ymjUVMv for the purpose of providing bug fixes or enhancements + +Distribution: +You cannot distribute any content of the mod separate from the complete mod package. +You can distribute the complete and unmodified mod package with the following conditions: +The mod must not be modified. (Packaging the mod into a larger zip file does not count as modification. It can be used in mod set packs.) +You must disclose the source by providing a link to the mod on the mod portal https://mods.factorio.com, a link to the Earendel's discord https://discord.gg/ymjUVMv for bug reporting and discussion, and a link to Earendel's Patreon https://www.patreon.com/earendel to support further development. diff --git a/space-exploration_0.5.58/space-exploration/locale/cs/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/cs/strings.cfg new file mode 100644 index 0000000..2eed33e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/cs/strings.cfg @@ -0,0 +1,1905 @@ +spaceship-integrity100=+100 strukturální integrity vesmírné lodi +spaceship-integrity300=+300 strukturální integrity vesmírné lodi +spaceship-integrity500=+500 strukturální integrity vesmírné lodi +arcosphere-discovery=Sebrat arkosféru z hlubokého mezihvězdného prostoru +core-mining-productivity-5=+5% produktivity těžby jádra +se-zone-discovery-random=Spustí náhodné objevení zóny v okamžiku vyzkoumání. +se-zone-discovery-targeted=Spustí objevení zóny s důrazem na suroviny v okamžiku vyzkoumání. +se-zone-discovery-deep=Spustí objevení zóny v hlubokém vesmíru v okamžiku vyzkoumání. +unlock-spaceship-victory=Odemyká výherní podmínku: Let vesmírnou lodí s integritou vyšší než 3000 a Nexusem v módu distorčního pohonu při rychlosti 250 po dobu 60 sekund v mezihvězdném prostoru. + +[mod-name] +space-exploration=Space Exploration + +[mod-description] +space-exploration=Postav nákladní raketu a pošli svých šest švestek do vesmíru. Nastup si do rakety a prolétni se "tam nahoře". Postav na orbitě vesmírnou stanici a vrhni se do náročného, daty poháněného vesmírného výzkumu. Postav vesmírnou loď kousíček po kousíčku, a doleť s její pomocí na jiné planety, měsíce, pásy asteroidů, a na mnoho dalších míst. Velmi doporučujeme hrát s modifikací AAI Industry. Space Exploration Postprocess je nutný ke spuštění modifikace (nelze ho uvést jako závislý mód, dlouhý příběh). Nedoporučujeme hrát bez modifikací, na kterých je SE závislá, alespoň dokud je modifikace v experimentální fázi. + +[space-exploration] +space-exploration=Space Exploration +menu_space-exploration=Space Exploration +title_space-exploration=Space Exploration +name=Name +rename-something=Rename __1__ +trigger-none=None (Manual) +trigger-fuel-full=Vypustit při plné palivové nádrži +trigger-cargo-full=Vypustit při plném nákladovém prostoru +trigger-fuel-full-signal=Vypustit na zelený signál při plné palivové nádrži +trigger-cargo-full-signal=Vypustit na zelený signál při plném nákladovém prostoru +trigger-cargo-full-or-signal=Vypustit na zelený signál nebo při plném nákladovém prostoru +destination-type-zone=Přibližná poloha +destination-type-landing-pad=Přistávací plocha pro náklad +button-launch=Vypustit +button-launch-disabled=Vypustit (Zakázáno) +destination-crash-warning=Varování: Vyberte přistávací plochu pro náklad ke snížení pravděpodobnosti havárie +recipe-to=__1__ na __2__ +recipe-from=__1__ z __2__ +simple-a-b=__1____2__ +simple-a-b-space=__1__ __2__ +simple-a-b-comma=__1__, __2__ +simple-a-b-break=__1__\n__2__ +remote-view=Uplink navigačního satelitu [__CONTROL__se-remote-view__] +remote-view-window-title=[img=virtual-signal/se-remote-view] Navigační satelit [__CONTROL__se-remote-view__] +interstellar-map=Mezihvězdná mapa +interstellar-space=Mezihvězdný prostor +planetary-system=Systém __1__ +remote-view-currently-viewing=Aktuálně zobrazeno: +remote-view-instruction=Vyšlete více satelitů k objevení většího množství hvězd, planet, měsíců, a dalších zón. +exit-remote-view=Opustit uplink navigačního satelitu [__CONTROL__se-remote-view__] +open-zonelist=Otevřít mapu vesmíru +remote-view-spaceships=__1__ vesmírných lodí +remote-view-spaceships-anchored=__1__ zakotvených vesmírných lodí +remote-view-clamps=__1__ svorek vesmírných lodí +remote-view-show-hide-resources=Zobrazit/skrýt suroviny +remote-view-show-hide-stats=Zobrazit/skrýt statistiky +remote-view-show-hide-anchor-info=Zobrazit/skrýt informace o kotvě +zonelist-window-title=[img=virtual-signal/se-planet-orbit] Mapa vesmíru [__CONTROL__se-universe-explorer__] +priority-icon=[img=virtual-signal/se-accolade] +priority-tooltip=Priorita (k vyfiltrování důležitých zón od těch irelevantních) +delete-zone-button=[img=virtual-signal/se-remove] Odstranit povrch +delete-zone-button-tooltip=Některé povrchy nemohou být odstraněny. +delete-zone-button-no-surface-tooltip=Povrch neexistuje. +scan-zone-button=[img=item/satellite] Skenovat povrch +scan-zone-button-tooltip=Varování: Hra může být v průběhu skenování zpomalena. Skenování může být kdykoli zastaveno. +scan-zone-button-disabled-tooltip=Ke skenování povrchu musíte vyslat satelit. +stop-scan-zone-button=[img=item/satellite] Zastavit veškeré skenování +stop-scan-zone-button-tooltip=Zastaví veškeré skenovací procesy na všech površích. +remote-view-requires-satellite=K používání uplinku navigačního satelitu byste nejdříve museli mít navigační satelit. +satellite-discovered-platform=[color=cyan]Satelit objevil orbitální vesmírnou stanici.[/color]. Otevřete [img=virtual-signal/se-planet-orbit] Mapu vesmíru [__CONTROL__se-universe-explorer__], vyberte __1__, a stiskněte Zobrazit povrch. Mohlo by tam být hodně užitečných věcí. +satellite-view-unlocked=Odemkli jste [color=cyan][img=virtual-signal/se-remote-view] Uplink navigačního satelitu[/color]. To umožňuje zobrazit povrch celé planety, a dalších míst, které jste objevili. Stiskněte [color=green][__CONTROL__se-remote-view__][/color] k aktivaci, nebo použijte tlačítko vedle vašeho "hotbaru". +source-discovered-zone=[color=cyan]__1__ objevil novou __2__: [/color][img=__3__] [color=white]__4__[/color]. Objevené lokace mohou být zobrazeny v [img=virtual-signal/se-planet-orbit] Mapě vesmíru [__CONTROL__se-universe-explorer__]. +discovered-zone=[color=cyan]Byla objevená nová __1__: [img=__2__] [/color][color=white]__3__[/color]. +discovered-anomaly-additional=Byl zjištěn neznámý objekt v [img=virtual-signal/se-anomaly] anomálii. Váš [img=virtual-signal/informatron] Průzkumný deník [__CONTROL__informatron__] byl aktualizován. +satellite-discovered-nothing=Byl vypuštěn nový satelit, ale nenašel nic nového. Více k objevení může být kolem jiných hvězd. +tech-discovered-nothing=Teleskopy nenašly v blízkosti hvězd nic nového. Více k objevení může být v hlubokém vesmíru. +tech-deep-discovered-nothing=Teleskopy nenašly v hlubokém vesmíru nic nového. +galaxy_ship_authenticated=[img=virtual-signal/se-spaceship] Opuštěná vesmírná loď: [color=cyan] Biosignatura ověřena. Přístupový kód ke vzduchovému uzávěru je 2236067964. Odesílám nouzový záložní protokol. [/color] Váš [img=virtual-signal/informatron] Průzkumný deník [__CONTROL__informatron__] byl aktualizován. +space-capsule=Vesmírná kapsle +player-died=__1__ zemřel +launch-suit-warning=Abyste se vyhnuli udušení, prosím zvažte použití skafandru a uložení nádob podpory života do vašeho inventáře. +suffocating-warning=Dusíte se. Dostaňte se do vesmírné kapsle nebo si nasaďte skafandr s nádobami podpory života v inventáři. +rocket_survivability_fail=Nákladní raketa utrpěla při cestě poškození a je mimo kurz. Doporučujeme dodatečný výzkum odolnosti raket a bezpečnosti nákladu. +respawn-if-stranded=Pokud uvíznete, můžete použít zkratku pro znovuzrození [__CONTROL__se-respawn__]. +respawn-options-title=Místo znovuzrození +respawn-button-homeworld=[img=virtual-signal/se-planet] Domovská planeta +respawn-button-landing-pad=[img=item/se-rocket-landing-pad] Náhodná přistávací plocha +respawn-button-spaceship=[img=virtual-signal/se-spaceship] Náhodná vesmírná loď +respawn-confirm-title=Jste si jisti se svým znovuzrozením? +respawn-confirm-yes=[img=virtual-signal/se-death] Znovuzrodit +respawn-confirm-no=Zrušit +search-list=Vyhledat +clear-search=Zrušit +filter-list=Filtr +clear-filter=Zrušit filtr +attrition-type-radiation=Radiace +attrition-type-wind=Vítr +attrition-type-spacial-distortion=Prostorové zakřivení +zonelist-view-surface=Zobrazit povrch +zonelist-heading-hierarchy=Hierarchie +zonelist-heading-type=Typ zóny +zonelist-heading-name=Název +zonelist-heading-radius=Poloměr +zonelist-heading-primary-resource=Primární surovina +zonelist-heading-attrition=Ovlivnění robotů +zonelist-heading-threat=Hrozba +zonelist-heading-solar=Solární energie +zonelist-heading-flags=Označení +zonelist-heading-priority=Priorita +zonelist_filter_star=Zahrnout hvězdy +zonelist_filter_planet=Zahrnout planety +zonelist_filter_planet-orbit=Zahrnout orbity planet +zonelist_filter_moon=Zahrnout měsíce +zonelist_filter_moon-orbit=Zahrnout orbity měsíců +zonelist_filter_asteroid-belt=Zahrnout pásy asteroidů +zonelist_filter_asteroid-field=Zahrnout pole asteroidů +zonelist_filter_anomaly=Zahrnout anomálie +zonelist-resource-bar-tooltip=__1__ __2__\nFrekvence: __3__\nVelikost: __4__\nBohatost: __5__ +zonelist-resource-bar-tooltip-extended=__1__ __2__\nFrekvence: __3__\nVelikost: __4__\nBohatost: __5__\n__6__ +zonelist-resources-disclaimer=Hodnoty surovinových zdrojů jsou pouze odhadem. [?] +zonelist-resources-disclaimer-tooltip=Veškeré hodnoty surovin jsou odhadovány na základě hustoty prvků.\nKorespondují s nastavením generace mapy.\nSkutečná ložiska surovin se mohou lišit a nemusí se vůbec objevit, pokud jim v tom zabrání voda, poloměr tělesa, nebo specifické požadavky na dlaždice. +zone-tooltip-type=Typ zóny: +zone-tooltip-parent=Parent: +zone-tooltip-threat=Hrozba: +zone-tooltip-daynight=Denní cyklus: +zone-tooltip-bot-attrition=Ovlivnění robotů - __1__: +zone-tooltip-radius=Poloměr: +zone-tooltip-solar=Solární energie: +zone-tooltip-flags=Označení: +zone-tooltip-closest=Nejbližší: +zone-tooltip-destination=Destinace: +zone-tooltip-delta-v=∆v z __1__ +resource-terrain-required-se-vulcanite=Vyžaduje vulkanický terén +resource-terrain-required-se-cryonite=Vyžaduje zmrzlý terén +resource-terrain-required-se-vitamelange=Vyžaduje porostlý terén +climate_homeworld=Domovský svět (upravené klima) +construction-denied=Nelze umístit zde. +construction-denied-vehicle-in-space=Nelze umístit pozemní vozidla ve vesmíru. +construction-denied-se-surface=Neplatné umístění, musí být umístěno na povrch ze Space Exploration. +construction-denied-no-water=Žádná voda +currently-viewing=Aktuálně zobrazeno: __1__ +fail-board-no-character=Cannot board target ship, you must be attached to your character to use this action. +construction-denied-spaceship-only=Musí být položeno na podlahu vesmírné lodi. +fail-board-remote-character=Cannot board target ship, your character is not on the ship you are trying to board from. +fail-board-target-anchored=Cannot board an anchored ship, try anchoring to the same location instead. +starmap=Hvězdná mapa +starmap-button=[img=virtual-signal/se-star] Hvězdná mapa +back=Zpět +spaceship=Vesmírná loď +planet=Planeta +moon=Měsíc +star=Hvězda +orbit=Orbita +something_orbit=__1__ orbit +asteroid-belt=Pás asteroidů +asteroid-field=Pole asteroidů +anomaly=Anomálie +spaceship-cannot-set-destination-to-self=Nelze nastavit cílovou destinaci na sebe. +spaceship-launch-energy=Energie startu: __1__ +spaceship-launch-energy-invalid=Energie startu: Vyžaduje platnou kontrolu integrity. +spaceship-streamline=Štíhlost: __1__ +spaceship-speed=Rychlost: __1__ +spaceship-structural-stress-hull=Strukturální stres (Trup): __1__ +spaceship-structural-stress-hull-invalid=Strukturální stres (Trup): NA (vyžadováno uzavření) +spaceship-structural-stress-container=Strukturální stres (Vnitřek): __1__ +spaceship-structural-stress-container-invalid=Strukturální stres (Vnitřek): NA (vyžadováno uzavření) +spaceship-travel-time-unknown=Délka cesty: Neznámá. Otestujte maximální rychlost pro odhad. +spaceship-travel-time-max=Délka cesty: __1__s při maximální rychlosti. +spaceship-travel-time-current=Délka cesty: __1__s při aktuální rychlosti. +spaceship-closest-location=Nejbližší lokace: __1__ +spaceship-location-spatial-distortion=Prostorové zakřivení: __1__ +spaceship-location-stellar-x=Kvadrant X: __1__ +spaceship-location-stellar-y=Kvadrant Y: __1__ +spaceship-location-star-gravity-well=Přitažlivost hvězdy: __1__ +spaceship-location-planet-gravity-well=Přitažlivost planety: __1__ +spaceship-travel-status=Stav cesty: __1__ +spaceship-integrity-status-valid=Stav integrity: Platný: __1__ +spaceship-integrity-status-invalid=Stav integrity: Neplatný: __1__ +spaceship-button-launch=Start +spaceship-button-launch-tooltip=Připraveno ke startu +spaceship-button-launch-disabled=Start (Zakázáno) +spaceship-button-launch-disabled-fuel-tooltip=Vyžaduje palivo v nádržích motorů +spaceship-button-launch-disabled-integrity-tooltip=Vyžaduje platnou kontrolu integrity +spaceship-button-anchor=Ukotvení +spaceship-button-confirm-anchor=Potvrdit ukotvení +spaceship-button-anchor-to=Ukotvit k __1__ +spaceship-button-anchor-on=Zakotvit na __1__ +spaceship-button-stop=Zastavit +spaceship-button-start=Engage +spaceship-button-board=Board __1__ +spaceship-button-scouting-back=Zpět +spaceship-button-scouting-back-tooltip=Cancel anchor scouting +spaceship-name-the=__1__ +spaceship-button-start-integrity-check=Zahájit kontrolu integrity +spaceship-heading-destination=Cílová destinace +list-destinations-alphabetically=Seřadit destinace abecedně +spaceship-travel-message-new-course-plotted=New course plotted. +spaceship-travel-message-exiting-planet-gravity=Opouštění gravitační studny planety +spaceship-travel-message-navigating-planet-gravity=Navigating planet gravity well +spaceship-travel-message-exiting-star-gravity=Opouštění gravitační studny hvězdy +spaceship-travel-message-navigating-star-gravity=Navigating star gravity well +spaceship-travel-message-spatial-distortions=Navigating spatial distortions +spaceship-travel-message-navigating-interstellar=Navigating interstellar space +spaceship-travel-message-at-destination=At destination. +spaceship-check-message-passed=Úspěch: Integrita lodi je platná. +spaceship-check-message-failed-containment=Neúspěch: Ztráta uzavření kolem ovládacího panelu. Ujistěte se, že zdi stojí na podlaze a neexistují skuliny. +spaceship-check-message-failed-console-floor=Ovládací panel musí být položen na podlahu vesmírné lodi. +spaceship-check-message-failed-empty=Nenalezeny žádné dlaždice, které by byly připojeny ke správně uzavřenému ovládacímu panelu. +spaceship-check-message-failed-unknown-bounds=Error: Unknown spaceship bounds. +spaceship-check-message-failed-stress=Neúspěch: Stres strukturální integrity přesahuje technologický limit. +spaceship-check-message-checking-console-floor=Kontrola konekce podlahy. +spaceship-check-message-checking-containment=Kontrola uzavření. +spaceship-check-message-checking-connectivity=Kontrola konekce ovládacího panelu. +spaceship-check-message-no-console=Žádný ovládací panel. +spaceship-check-message-did-not-complete=Kontrola nebyla dokončena. +spaceship-check-message-unstable=Nestabilní: Některé sekce se při manévrování odtrhnou. +spaceship-check-message-valid-but-disconnecting=Platná kontrola, ale loď je nestabilní: Některé sekce se odtrhnout. +spaceship-warning-sections-disconnecting=Sekce se odtrhávají. Zastavte k opravě. +page_space_exploration_text_1=Vítejte ve Space Exploration. Tato modifikace již obsahuje mnoho věcí, ale stále je v experimentální fázi a ve vývoji. Nedoporučujeme hrát v kombinaci s jinými modifikacemi než s těmi doporučenými a vyžadovanými.\n\n\n[font=heading-2]Doporučené modifikace[/font] \n\nAAI Industry: Modifikace Space Exploration byla navržena tak, aby se hrála s AAI Industry a staví na změnách v technologickém stromu. Pokud se rozhodnete hrát bez AAI Industry, bude vám chybět několik změn receptů, což vám mnoho věcí ztíží.\n\nAAI Signal Transmission: Umožní vám přenášet signály napříč povrchy. Bez této modifikace pro vás bude meziplanetární logistika mnohem obtížnější. \n\nGrappling Gun: Přitáhne vás k cíli. Skvělá věcička na překonávání útesů, dostávání se do vesmírných lodí, a také záchrana, pokud spadnete z vesmírné stanice.\n\n\n[font=heading-2]Doporučené nastavení[/font]\n\nJe NEZBYTNÉ mít všechny terény z Alien Biomes zapnuté, jinak vám v určitém bodě bude hra padat.\n\nProtože je hra delší než normálně, doporučujeme snížit evoluční faktory nepřátel.\n\nNeměli byste zvyšovat množství či jiné aspekty surovin, pokud nehrajete hru se zvýšenou obtížností. Pokud budou suroviny nastaveny příliš vysoko, zmenší se tím nutnost expandovat na jiné planety.\n\n\n[font=heading-2]Užitečné odkazy[/font]\n\nOmrkněte Wiki Space Exploration: https://spaceexploration.miraheze.org\n\nPro radu nebo jen pro sledování vývoje modifikace se připojte na Discord: https://discord.gg/ymjUVMv\n\nNa tuto modifikaci padnulo více než 2000 hodin práce. Pokud se vám mód líbí, zvažte, prosím, podporu na Patreonu: https://www.patreon.com/earendel +menu_meteor_defence=[img=virtual-signal/se-meteor] Obrana před meteory +title_meteor_defence=Obrana před meteory +page_meteor_defence_text_1=Meteory padají v náhodných intervalech do většiny zón. Maximální interval mezi údery meteoritů můžete změnit v nastavení modifikace.\n\nČetnost meteorů je rovněž náhodná, 50% pro 1, 25% pro 2, 12,5% pro 3, 6,25% pro 4 a tak dále...\n\nStruktury obrany proti meteorům mohou na meteory střílet. Střílejí postupně, takže novější obranné struktury ani nevystřelí, pokud byly již všechny meteory zničeny. Obranné struktury vyžadují munici, a také přívod elektrické energie při nabíjení. Spotřeba těchto struktur není malá, proto je doporučeno balancovat riziko s energetickou náročností. +menu_coremining=[img=item/se-core-miner] Těžba jádra +title_coremining=Těžba jádra +page_coremining_text_1=Těžba jádra může být realizována pouze na planetách či měsících. Každá planeta či měsíc může vydat jiný typ fragmentu jádra. Nauvis vydává vyrovnanou kombinaci surovin, ale jiná tělesa mají tendenci vydávat převážně jeden typ zdroje. Vrtáky určené pro těžbu jádra jsou energeticky náročné, ale část spotřebované energie je navrácena v podobě uhlí, ropy a uranu.\n\nNejen že vrtáky pro těžbu jádra spotřebovávají mnoho energie, ale také čím víc jich použijete na jedné planetě či měsíci, tím méně jsou efektivní. Jsou mnohem méně energeticky efektivní než normální těžící zařízení, ale mají nevyčerpatelný zdroj surovin. V rané fázi hry je užitečné mít jeden vrták pro těžbu jádra, pokud máte přebytek energie. Pokud začínáte na malé planetě, může být pro vás sestava solárních panelů a těžby jádra jedinou cestou k získání zdrojů ke stavbě rakety.\n\nVrtáky pro těžbu jádra jsou v pozdních fázích hry výhodné hlavně díky bonusům produktivity. Je lepší usilovat o méně vrtáků na více planetách než naopak. +menu_launching_satellites=[img=item/satellite] Vypouštění satelitů +title_launching_satellites=Vypouštění satelitů +page_launching_satellites_text_1=Zatím jste vypustili [color=cyan]__1__[/color] satelitů.\n\n[font=heading-2][img=virtual-signal/se-remote-view] Uplink navigačního satelitu [__CONTROL__se-remote-view__][/font]\n\nKdyž vypustíte navigační satelit, získáte přístup do [img=virtual-signal/se-remote-view] Satelitního zobrazení. Satelitní zobrazení použijete pomocí tlačítka [__CONTROL__se-remote-view__]. V satelitním módu jste odpojeni od vlastní postavy a můžete si rychle prohlížet mapu a dokonce objevovat nové oblasti. Jsou akce, kterých v satelitním módu nedosáhnete, jako například stavby budov nebo ruční těžby. Je ale mnoho věcí, které v satelitním módu lze dělat, jako například používat plány stavby i dekonstrukce, měnit recepty ve strojích, nastavení kombinátorů apod.\n\n[font=heading-2][img=virtual-signal/se-planet-orbit]Prohlížeč vesmíru [__CONTROL__se-universe-explorer__][/font]\n\nSíť navigačních satelitů vám také umožňuje sledovat dění na jiných površích, například na jiných planetách, měsících, pásech asteroidů, polích asteroidů a orbitách. Stiskněte [__CONTROL__se-universe-explorer__] k zobrazení známých zón. Pokud jste vypustili satelit, můžete stisknout Zobrazit povrch, a zjistit, co se na něm děje. Před tím, než se do neznámé oblasti sami vydáte, je možná dobré ji nejdříve prozkoumat na dálku.\n\nVysílání satelitů vám také pomůže s objevováním těles ve vaší hvězdné soustavě (pro více informací mrkněte na Objev zóny). +menu_zone_discovery=[img=virtual-signal/se-planet-orbit] Objev zóny +title_zone_discovery=Objev zóny +page_zone_discovery_text_1=Existuje mnoho hvězd, planet, měsíců, pásů asteroidů a polí asteroidů v téhle části vesmíru, a všechna tato tělesa jen čekají na objevení.\n\n[font=heading-2]Navigační satelit[/font]\nMůžete vypustit navigační satelit a objevit díky němu nové planety, měsíce, nebo pásy asteroidů v solární soustavě, ve které byl satelit vypuštěn. Pokud již v daném sektoru není nic nového k objevení, satelit objeví novou hvězdu, ale nedokáže objevit nic obíhajícího kolem dané hvězdy nebo něco v hlubokém vesmíru. \n\n[font=heading-2]Výzkum Objevení zóny[/font]\nMůžete použít vesmírné teleskopy k hledání nových zón. Toho lze dosáhnout pomocí výzkumu "Objev zóny". Základní výzkum objevení zóny může najít náhodnou hvězdu, planetu, měsíc nebo pás asteroidů.\n\n[font=heading-2]Výzkum "Cílený objev zóny"[/font]\nCílený objev zóny klade důraz na objev preferované suroviny (níže), tudíž existuje mnohem větší šance na nalezení takového místa. Nezapomeňte na to, že planeta může být objevena pouze po objevení její hvězdy, a měsíc nemůže být objeven před objevem planety, kterou obíhá. Nečekejte, že pokaždé najdete to, co hledáte.\n\n[font=heading-2]Výzkum Objevení zóny v hlubokém vesmíru[/font]\nObjevení zóny v hlubokém vesmíru je jediným způsobem, kterým lze najít pásy asteroidů. Pásy asteroidů jsou jediným místem, kde lze najít Naquitit. Objevování zón v hlubokém vesmíru nelze specifikovat pro určitou surovinu.\n\n[font=heading-2]Objevování zóny s preferovanou surovinou:[/font] +menu_cargo_rockets=[img=virtual-signal/se-cargo-rocket] Nákladní rakety +title_cargo_rockets=Nákladní rakety +page_cargo_rockets_text_1=Zatím jste vypustili [color=cyan]__1__[/color] nákladních raket.\n\nNákladní rakety startují z Nákladního raketového sila, aka ze startovací rampy. Ke stavbě nákladní rakety musíte vložit 100 segmentů nákladní rakety a jednu vesmírnou kapsli do nákladního raketového sila.\n\nKe startu rakety také potřebujete natankovat velké množství kapalného raketového paliva jedním z osmi konektorů u rohů sila. Množství potřebného paliva se mění v závislosti na gravitačním vlivu planety, na které se nacházíte, a také na vzdálenosti mezi místem startu rakety a cílovou destinací.\n\nPokud automatizujete nakládání věcí do rakety, dávejte pozor, abyste do nákladového prostoru neukládaly segmenty nákladní rakety. Kabel, který vede ze sila počítá všechny segmenty rakety, včetně těch v nákladovém prostoru, takže ho můžete připojit ke kombinátoru s podmínkou < 100 a zastavit tak vkládání segmentů rakety. (Poznámka vývojáře: Toto řešení není ideální, ale jiné možnosti jsou ještě horší.) +menu_lifesupport=[img=item/se-lifesupport-equipment-1] Podpora života +title_lifesupport=Podpora života +page_lifesupport_text_1=Podpora života je zajištěna pomocí vybavení a nádob podpory života. Potřebujete jak vybavení, tak nádoby podpory život k přežití v nehostinném prostředí.\n\nVybavení a použitelné nádoby mohou být produkovány v Zařízení podpory života.\n\nNádoby podpory života poskytují systému zdroje, které potřebuje k plnění všech svých rolí v podpoře života, a jsou postupně spotřebovávány. Nádoby se spotřebovávají přímo z vašeho inventáře. \n\nVybavení podpory života lze vložit do mřížky brnění, ale pokud používáte skafandr, již máte toto vybavení vestavěné. Přídavné vybavení podpory života vloženo do mřížky brnění či skafandru zvyšuje účinnost systémů podpory života. Pokud používáte vybavení podpory života v jiném typu brnění než ve skafandru, budete chráněni proti nehostinnému prostředí, ale ne proti vakuu vesmíru.\n\n[font=heading-2]Nehostinná prostředí[/font]\nNehostinná prostředí jsou oblasti, ve kterých utrpíte poškození jen kvůli vašemu pobytu. Vybavení podpory života je navrženo tak, aby vás ochránilo před těmito hrozbami tím, že vám zajistí správný tlak, kyslík, vodu, výživu, regulaci teploty a ochranu proti radiaci. Dva hlavní typy nehostinného prostředí jsou:\n\nVesmír: Skafandr je pro pobyt ve vakuu nezbytný. Nestačí vám systémy podpory života, protože se ve vakuu bez skafandru stejně udusíte.\n\nPozemní prostředí: Některé planety a měsíce představují nebezpečí v podobě radiace, extrémního chladu či horka, nebo také kyselé atmosféry, a vyžadují vybavení podpory života. (Již brzy). Vybavení podpory života je také nutné na planetách, kde byly použity biologické zbraně (Morové světy). Podpora života může být v takových oblastech zajištěna skafandrem, či vybavením podpory života, vloženým do jakéhokoli brnění. +menu_space_sciences=[img=item/se-astronomic-science-pack-2] Vesmírný výzkum +title_space_sciences=Vesmírný výzkum +page_space_sciences_text_1=[img=item/se-rocket-science-pack] Prvním vesmírným výzkumem je raketový vědecký balíček. Lze ho produkovat pouze ve vesmíru, takže budete k jeho výrobě muset postavit alespoň malou vesmírnou stanici. Raketové vědecké balíčky a pokročilejší vesmírné vědecké balíčky mohou být použity pouze ve vesmíru, tudíž budete muset do vesmíru posílat i ostatní vědecké balíčky a využívat je ve výkonné Vesmírné vědecké laboratoři.\n\n[font=heading-2]Specializovaný výzkum[/font]\n\nExistují 4 typy specializovaného výzkumu, a to Astronomický, Biologický, Energetický a Materiálový. Všechny jsou poháněny daty, která lze získat prováděním experimentů. Tato data lze poté používat v superpočítačích za účelem vytvoření více a více přesného modelu života, vesmíru, a v podstatě všeho. Všechny jsou přibližně na stejné technologické úrovni, takže je na vás, který zvolíte jako první, ale každý z nich vyžaduje specifické zdroje, takže před rozhodnutím si prohlédněte svůj solární systém.\n\n[img=item/se-astronomic-science-pack-4] Astronomický výzkum se soustředí hlavně na vesmírnou logistiku.\n\n[img=item/se-energy-science-pack-4] Energetický výzkum se soustředí na produkci energie, přenosu elektřiny a výrobu high-tech udělátek.\n\n[img=item/se-material-science-pack-4] Materiálový výzkum se soustředí na těžký průmysl a přímá vylepšení.\n\n[img=item/se-biological-science-pack-4] Biologický výzkum se soustředí na vylepšení hráče, lékařství, podporu života, biologické zbraně a produktivitu.\n\n[font=heading-2]Výzkum hlubokého vesmíru[/font]\n\n[img=item/se-deep-space-science-pack-1] Výzkum hlubokého vesmíru se zaměřuje na mezihvězdnou prázdnotu, antihmotu a zakřivení časoprostoru. +menu_energy_beams=[img=item/se-energy-transmitter-emitter] Energetické paprsky +title_energy_beams=Energetické paprsky +page_energy_beams_text_1=[font=heading-2]Výron koronální hmoty[/font]\nBlízké hvězdy často vyvrhávají nebezpečné proudy částic. Není neobvyklé, že planeta či měsíc se těmto proudům ocitne v cestě. Pokud se vaše základna nachází na ovlivněném povrchu, měli byste se evakuovat, rozdělit a rozprostřít vaše stavby, nebo postavit Deštník s velkou zásobou energie v akumulátorech. Pokud bude nějaký povrch v nebezpečí, budete o výronu vědět minimálně 4 hodiny dopředu. Známé hrozby budou vypsány níže. +page_energy_beam_warning_text=[img=virtual-signal/se-star] Varování: Výron koronální hmoty se blíží k __1__. Odhadovaná energie potřebná k obraně: __3__GJ. ETA: __2__s. +page_energy_beams_text_2=[font=heading-2]Deštník: Obrana před energetickými paprsky[/font]\nZařízení obrany před energetickými paprsky, "Deštník", vás dokáže ochránit před výronem koronální hmoty (tzv. slunečním deštěm), ale také před energetickými útoky z vesmíru. Zařízení tohoto efektu dosahuje uspořádáním magnetických částic do ochranné bubliny, a poté shlukem částic k rozptýlení nebezpečných energetických paprsků. Jediným požadavkem k fungování je energie, základní spotřeba je 10MW, ale ta se zvyšuje podle síly dopadajících proudů částic. Proti obyčejnému výronu koronální hmoty postačí jeden Deštník pro jeden povrch, proti zbraním na bázi energetických paprsků dokáže jeden Deštník odstínit až 500GJ energie. Pro výron koronální hmoty je základní energetická potřeba u planety s poloměrem 5000 a výkonností solárních panelů 100% zhruba 160GJ energie, přičemž doba trvání bude 2 minuty a nejvyšší odběr ze sítě bude činit asi 2GW (tento energetický vrchol nastane po první minutě působení proudu částic). Tyto hodnoty se mění s výkonem solárních panelů na vybraném povrchu, a u pevných těles (planety, měsíce, ...) také záleží na poloměru (výsledné hodnoty lze vypočítat pomocí rovnice přímé úměry). U zářiče energetických paprsků se potřebná obranná energie odhaduje na 1/10 síly paprsku u cíle (po ztrátě účinnosti).\n\n[font=heading-2]Vysílání energie[/font]\nZářič energetických paprsků dokáže vysílat energii na různé povrchy. Je schopen dvou způsobů vysílání energie, buď může poskytovat energii vzdáleným povrchům, "Energizovat", nebo může být použit jako řezák na bázi paprsků, "Kosa". V módu "Kosy" konstantně způsobuje poškození na určitém místě, ale toto místo může být pozměněno, čímž se "vypálí cesta". Poškození, oblast působnosti a rychlost paprsku se zvyšuje v závislosti na vložené energii. Mód "Auto-Kosa" je autonomní selektor cílů.\n\nZářič energetických paprsků má 4 konektory, ke kterým se mohou připojit paprskové komory. Paprskové komory se mohou propojit krátkou stranou, nebo může být jedna připojena krátkou stranou na dlouhou stranu jiné, ale nemohou být propojeny "vedle sebe". Paprskové injektory se připojují po stranách ke komorám. Každý připojený injektor zvyšuje výkon připojeného zářiče. K přijetí energie ze zářiče budete potřebovat paprskový přijímač na cílovém povrchu, a budete tento přijímač muset zvolit v zaměřovači zářiče. Jakmile paprsek dorazí k přijímači, přijímač se začne zahřívat. Toto teplo může být poté vedeno do výměníků tepla a lze tak pohánět turbíny. +menu_spaceships=[img=virtual-signal/se-spaceship] Vesmírné lodě +title_spaceships=Vesmírné lodě +page_spaceships_text_1=Vesmírné lodě jsou obrovská mocná vozidla, která umožňují vysílání různých uzavřených struktur, předmětů, a dokonce hráče do vesmíru, a poté cestovat po solárním systému a přistávat na různých površích.\n\n[font=heading-2]Stavba vesmírných lodí[/font]\nVesmírné lodě jsou tvořeny mnoha částečkami a malými komponenty, které dohromady tvoří vesmírnou loď podle vašich představ. Vesmírnou loď tvoříte téměř jako malou, pohyblivou základnu.\n\nZačněte s plánem podlahy. Nepřežeňte to, vaše první vesmírná loď může být jen malá. Položte zdi kolem okrajů, ujistěte se, že jste nezanechali mezery (ani ty diagonální). Položte řídící panel někde uvnitř, jde o základní část vesmírné lodi, a skrze tento panel budete loď ovládat. Při položení ovládacího panelu se objeví záblesky, protože se zjišťuje, které části jsou správně připevněny, které části jsou správně uzavřeny, a které části odpadnou, pokud se pokusíte zažehnout motory. Pokud se některý čtvereček rozsvítí červeně, je to špatně. Můžete ovládací panel otáčet, abyste ho změnili na asymetrický či symetrický. Budete také potřebovat palivovou nádrž boosteru a motor vesmírné lodě. Nádrž boosteru je to, co zadržuje palivo, které je potřeba k cestě do vesmíru, a poskytuje možnost vertikálního startu a přistání. Motory jsou určeny pro pomalejší pohyb přes velké vzdálenosti vesmíru. Doporučujeme také stavbu obranných struktur vpředu (vždy na severu), protože vesmír je plný sutin.\n\n[font=heading-2]Stres integrity[/font]\nBrzy budete limitováni stresem integrity, a nebudete moci stavět tak velké lodě, jaké byste chtěli. Pokročilejší technologie umožňují stavbu větších vesmírných lodí. Stres integrity je vypočítáván ve 2 částech: A. Velikost vesmírné lodi. B. Nákladní kapacita vesmírné lodi. Konečná stres integrity je ta část, která je větší, hodnoty se nesčítají.\n\n[font=heading-2]Štíhlost[/font]\nTahle část vesmíru je v drsné mlhovině, takže zeštíhlením své lodi ji zrychlíte až o 30%. Měli byste se vyvarovat stavby obyčejné krabice, ale tvar klínu taky není potřeba. Až 1/3 přední části lodi může být placatá a loď to neovlivní. Kulaté lodě jsou také v pořádku. Můžete manuálně spustit kontrolu integrity abyste zjistili, jak jste na tom se štíhlostí lodě.\n\n[font=heading-2]Dlouhé transportní aktivity[/font]\nKdyž zvažujete dlouhou cestu, pamatujte na to, že můžete mnoho věcí udělat již v satelitním módu. Můžete také dávat vesmírným lodím příkazy pomocí satelitů.\n\n[font=heading-2]Montovny[/font]\n[color=#ffaaaa]Varování: Montovny dělané pro použití ve vesmíru mohou vyrábět podle klasických receptů jen, když je vesmírná loď na zemi. Pokud je nastaven vesmírný recept při přistání, suroviny budou ztraceny. Některé pozemní montovny mohou fungovat i ve vesmíru, ale ztrácí poté možnost vložení modulů produktivity. Pokud vesmírná loď odstartuje, a pozemní montovny obsahují moduly produktivity, budou tyto moduly ztraceny.[/color]\n\n[font=heading-2]Signály vesmírné lodi[/font]\nPravá horní část ovládacího panelu vesmírné lodi může být připojena do sítě, vysílá signály:\n[img=item/se-spaceship-console] Číslo panelu označuje ID vesmírné lodi.\n[img=virtual-signal/signal-speed] Signál rychlosti označuje rychlost, kterou se vesmírná loď pohybuje, -1 pokud stojí, -2 pokud je zakotvena.\n[img=virtual-signal/signal-distance] Signál vzdálenosti označuje vzdálenost od cílové destinace, -1 pokud již loď dorazila, -2 pokud je zakotvena, -3 pokud není žádná cílová destinace nastavena.\n[img=virtual-signal/se-planet-orbit] Čtvrtý signál indikuje současnou cílovou destinaci.\n\n[font=heading-2]Automatizace vesmírné lodi[/font]\nHlavní struktura ovládacího panelu může přijímat signály:\n[img=virtual-signal/signal-speed] Signál rychlosti nastavuje rychlost a zažehává motory.\n[img=virtual-signal/se-spaceship-launch] Signál startu vesmírné lodi zahájí start.\n[img=virtual-signal/se-planet-orbit] Signál cílové destinace nastavuje cílovou destinaci (signál zóny můžete zjistit z Prohlížeče vesmíru jakmile sestrojíte vesmírnou loď).\nK přistání vesmírné lodi musí být ovládacímu panelu udělen pár signálů k zakotvení, a to buď [img=virtual-signal/se-anchor-using-left-clamp] "zakotvit pomocí levé svorky" společně s [img=virtual-signal/se-anchor-to-right-clamp] "zakotvit k pravé svorce", nebo [img=virtual-signal/se-anchor-using-right-clamp] "zakotvit pomocí pravé svorky" společně s [img=virtual-signal/se-anchor-to-left-clamp] "zakotvit k levé svorce". Hodnoty signálů se musí rovnat hodnotám svorky na lodi a v cílové destinaci. Tyto hodnoty si můžete zobrazit a měnit je v uživatelském rozhraní svorky. Pokud je nalezena shoda, vesmírná loď se pokusí přistát pomocí dvou svorek. Užívejte opatrně. +menu_exploration_journal=[img=item/se-thruster-suit] Průzkumný deník +title_exploration_journal=Průzkumný deník +page_journal_title_backstory=Probudil jsem se na špatné straně ohnivé koule +page_journal_text_backstory=Zjistil jsem, že je ze mě trosečník, na neznámé planetě, a kolem mě jsou hořící kusy malé vesmírné lodi. Mé tělo bylo pohmožděné, pořezané a spálené, ale vcelku nic vážného. Mé poranění hlavy bylo zřejmě vážnější, otupující bolest a záblesky oslepujícího světla. Nejhorší ale bylo, že jsem si nepamatoval nic, kromě jména a mého účelu... stavět. Přesto jsem si ale nepamatoval, co nebo jak stavět. Zpočátku jsem si myslel, že jsem se praštil do hlavy, a že vzpomínky se časem vrátí, ale do teď se nevrátily. Skutečnost, že mé datové záznamy byly prázdné a reformátované mě dohnala k přemýšlení o jiných vysvětleních. +page_journal_title_satellite_launch=Oko na nebi +page_journal_text_satellite_launch=Podařilo se mi vyslat satelit na orbitu. Je to důležitý milník, důvod k oslavě, ale ještě mi zbývá hodně práce. Tohle je jen začátek. +page_journal_title_cargo_launch=Do nekonečna a ještě dál +page_journal_text_cargo_launch=Nyní se mohu sám dostat do vesmíru. Už nejsem vázaný k tomuhle šutru, kterému jsem se naučil říkat domov. Nebesa volají. +page_journal_title_entered_vault=Lov relikvií +page_journal_text_entered_vault=Vkročil jsem do jeskyně pod výčnělkem pyramidového tvaru na __1__, a našel jsem temnou, očividně nebezpečnou komnatu. V komnatě jsem nalezl dvě kartuše, jednu velkou a jednu malou. Obě měly na svém povrchu několik glyfů, společně s kruhy a čárami. Glyf přímo uprostřed velké kartuše se zdál být nejvýznamnější, ať už se jeho stvořitelé snažili předat jakoukoli informaci. A ať jde o jakoukoli informaci, nikdy jsem neviděl takové formátování. Za kartušemi jsem našel jakýsi válec, ve kterém bylo velmi výkonné zařízení, které mohu použít jako modul. Moduly takové kvality jsou tak cenné, že by nejspíš stálo zato najít více takových struktur. Možná nastal čas na trochu archeologie. +page_journal_title_found_gate=Anomálie +page_journal_text_found_gate=V anomálii byl nalezen jakýsi obrovský prstencovitý artefakt. I z dálky jsou mi jasné dvě věci: 1. Je to prastaré. 2. Jde o technologii, která je od té mé naprosto odlišná. Ať už to je, nebo bylo, cokoli, je to zničeno. +page_journal_title_found_gate_ship=Loď v anomálii +page_journal_text_found_gate_ship=Část poměrně velké, opuštěné vesmírné lodi byla nalezena v anomálii, v blízkosti prstencovitého artefaktu. Technologie lodi je podobná té mé, ale je trochu více... uhlazená. Zřejmě jde o jinou technologii než v případě toho prstence. Tvar trosek vypadá jako by byla loď rozřezána v půlce, a nebo se srazila s prstencem. Možná by stála za záchranu. +page_journal_title_found_gate_ship_authenticated=Autentifikace lodi v anomálii +page_journal_text_found_gate_ship_authenticated=Opuštěná loď uvnitř anomálie mě oskenovala a "autentifikovala mou biosignaturu". Nevím, jestli to znamená, že o mě má specifický záznam, nebo že mě to bere jako lepší volbu, než kousače nebo genocidní roboty. Zpráva uvádí, že kód k vzduchovému uzávěru je 2236067964. Lodní záznamy jsou dostupné, ale velké části chybí nebo jsou poškozeny. +page_journal_title_found_gate_ship_log=Záznamy lodi +page_journal_text_found_gate_ship_log_intro=Demodamas 82B: AAI Hypernetový konstrukční křižník. Obsah lodních záznamů: +page_journal_text_found_gate_ship_log=...'¿s nominální.\nUpozornění: AAI brána Thyris 17: Mezigalaktický prototyp v0.1.93 je utajované zařízení. Je vyžadováno AAI ověření úrovně L90 nebo vyšší. Okamžitě se autentifikujte nebo budete zničeni.\nPřístupový záznam: Přístup k AAI bráně Thyris 17 povolen AAI inženýrovi L97 ID__1__.\nPřístupový záznam: Zahaj¶Ôàtá^...\n...'¿ris brána 17, frekvence 8 projektoru je uzamčená. Energie je na 216% bezpečné úrovně. Stabilita singularity: 99,4%.\nNavigační záznam: AAI brána Thyris 17 se připojila na projekční vektor [SV __2__]. Předpokládaný cíl: Galaxie Wube > Foenestra (anomálie, neprozkoumaná). Autentif¶Ôàtá^...\n...'¿vigační varování: Mezigalaktická hypertrubice (anulována).\nNavigační varování: Žádná hyperbrána v cílové destinaci (anulováno).\nUpozornění: Žádný kontrakt. Dostupné kontrakty: 0.\nPoznámka informatrona: Neexistují dostupné kontrakty se specifikací: "materializace s absencí brány". Jste si jisti, že je to bezpečné? [response.ignore.ignore_always]\nZáznam cesty: Vstup do anomálie Thyris > AAI brána Thyris 17 hypertrubice přiřazena k [SV __2__].\nZáznam cesty: Skok do hypertrubice [SV __2__] dokonč¶Ôàtá^...\n...'¿nam cesty: Aktualizace lokace: Hypertrubice v blízkosti anomálie Thyris, přiřazeno [SV __2__], stabilita 98%, prům¶Ôàtá^...\n...'¿nam cesty: Opouštění hypertrubice v neprozkoumané lokaci anomálie Foenestra.\nVarování: Neočekávaná kolize, srážka s neznámým objektem [4ae4c8d28f2], zahajuji skenování objektu [4ae4c8d28f2].\nZáznam poškození: 13.2% poškozeno. Zdroj: Poškození nárazem v důsledku srážky s neznámým objektem [4ae4c8d28f2].\nZáznam poškození sekcí: Poškozené sekce: A5, A6, A9, B6, B7, B8, C7. Nereagující sekce: A7, A8. (přesnost 86%)\nZáznam inženýrů: Známky života 99%. (přesnost 34%)\nZáznam cesty: Pokus o úhybný manévr RS100LT30.\nZáznam cesty: Opouštění hypertrubice dokončeno s chybami.\nZáznam cesty: Aktualizace lokace: Neprozkoumaná anomálie Foenestra.\nZáznam skenování: Skenování objektu [4ae4c8d28f2] dokončeno, rozlišení 0.002m^2 ve vzdálenosti -48.76m (přesnost 99.9%).\nZáznam detailů skenování: Hmotnost [4ae4c8d28f2] 92.5¶Ôàtá^...\n...'¿%).\nZáznam detailů skenování: [4ae4c8d28f2] Složení: Umělé. 34% Naquia, 29% Holmia, 37% neznámé složky (přesnost 89%).\nZáznam detailů skenování: Velikost [4ae4c8d28f2] : Přibližný průměr 68¶Ôàtá^...\n...'¿ilů skenování: Energetická signatura [4ae4c8d28f2] : Tok 54Gwb, radiační profil 2.8kJ/1.7MJ/1.6MJ/0.62J, profil toku 5.86GJ [051e376392b8d3f8]. (přesnost 98%).\nZáznam detailů skenování: Identifikace [4ae4c8d28f2] : Umělá konstrukce, neznámý výrobce, popis: Přibližně prstencovitý tvar s uzlíky, oktet. (přesnost 0.3%).\nZáznam detailů skenování: Přibližné schopnosti struktury [4ae4c8d28f2] : Hyperbrána (přesnost 47%). Jiné: Zbraň 42%, energetika 35%, výpočetní účely 17%, skenování 12%, průmysl 9%, vesmírná loď 7%, útočiště 2%.\nZáznam poškození: 68.2% poškozeno. Selhání integrity, sekce se oddělují. Zdroj: Sekundární tlakové vlny v důsledku srážky s objektem [4ae4c8d28f2].\nZáznam poškození sekcí: Kritický stav reaktoru. Poškozené sekce: D5, E4, E5, E6, F5. Nereagující sekce: A1, A2, A3, A¶Ôàtá^...\n...'¿lů: Nouzové vypuštění průzkumného letounu 2. Predikce trajektorie: Calidus > Nauvis.\nZáznam poškození: 91.7% poškozeno. Selhání integrity, sekce se odÄïmïŸ... +menu_archeology=[img=entity/se-pyramid-a] Archeologie +title_archeology=Archeologie +page_archeology_text_1=Započal jsem hledání dalších velkých geometrických struktur. Satelity nalezly [color=cyan]__1__[/color] útvarů na těchto planetách: +page_archeology_text_2=Můžete si tyto struktury nechat satelitně zobrazit. +menu_starmapping=[img=technology/se-zone-discovery-random] Mapování vesmíru +title_starmapping=Mapování vesmíru +page_starmapping_text_1=Mapování vesmíru je uskutečněno pomocí výzkumu: [img=technology/se-long-range-star-mapping] [color=cyan]Mapování vesmíru na dlouhé vzdálenosti[/color]. Tento výzkum se soustředí na zajímavé vzorce hvězd v jiných galaxiích. Má to nějaké praktické využití? Pravděpodobně ne.\n\nSouřadnice jsou vydány ve formátu standartních vektorů (SV), jsou přiřazovány na základě radiace kosmického pozadí.\n\nZatím jste zmapovali [color=cyan]__1__[/color] rozpoznatelných vzorců. +technology-unlocked=Byla odemčena nová technologie a je nyní k dispozici ve stromu výzkumu. __1__ __2__ +universe-resources-changed-warning=[img=utility/danger_icon] [color=red]Všechny zdroje byly upraveny na základě nového nastavení. Tento proces je destruktivní. Pokud je to způsobeno aktualizacemi modifikací, je to nevyhnutelné. Pokud je to způsobeno nechtěným přidáním či odebráním modifikací, neukládejte hru.[/color] +starmapping-found-constellation=Vzdálená konstelace identifikována __1__, souřadnice byly uloženy do informatrona. +starmapping-found-constellation-informatron=[font=heading-1]__1__[/font] na souřadnicích [SV __2__] +gate-portal-coordinates=Analýza vektoru zakřivení: [SV __1__] +discovered-glyph-vault=[img=item/satellite] Navigační satelit: Geometrická struktura detekována na __1__. +beacon-overload=Přetížení majáku +beacon-overload-ended=Přetížení majáku skončilo +lifesupport_title=[img=item/se-lifesupport-equipment-1] Podpora života +lifesupport_efficiency_spacesuit=Efektivita podpory života: __1__ +lifesupport_efficiency_no_spacesuit=Efektivita podpory života: __1__ (ve vesmíru 0%). +lifesupport_suit=Délka funkčnosti systémů podpory života: __1__s +lifesupport_reserves=Délka funkčnosti podpory života s nádobami v inventáři: __1__s +lifesupport_suit_est=Délka funkčnosti systémů podpory života: __1__s (ve vesmíru) +lifesupport_reserves_est=Délka funkčnosti podpory života s nádobami v inventáři: __1__s (ve vesmíru) +lifesupport_environment_space=Prostředí: Vesmír +lifesupport_environment_spaceship-interior=Prostředí: Vnitřek vesmírné lodi (podpora života nevyžadována) +lifesupport_environment_planet=Prostředí: Planeta (podpora života není vyžadována) +lifesupport_environment_moon=Prostředí: Měsíc (podpora života není vyžadována) +lifesupport_environment_plague-planet=Prostředí: Morová planeta +lifesupport_environment_plague-moon=Prostředí: Morový měsíc +lifesupport_environment_unknown=Prostředí: Chráněné +player_track_glyphs=[img=item/satellite] Nastavte satelity k hledání podobných struktur. +page_archeology_pyramid_link=[img=entity/se-pyramid-b] Geometrická struktura detekována na __1__ __2__. +discovery_look_for_resource_caption=__1__\n__2__ +discovery_look_for_resource_tooltip=Soustředit na hledání této suroviny. +comma_separate=__1__, __2__ +placement_restriction_line=[font=default-bold][color=#f5cb48]Nelze položit na: __1__[/color][/font]\n__2__ +collision_mask_water=Voda +collision_mask_land=Půda +collision_mask_space_platform=Vesmírná platforma +collision_mask_spaceship=Vesmírná loď +structure_name_grounded=__1__ (uzemněno) +structure_name_spaced=__1__ (vesmír) +structure_description_grounded=__1__\n[color=#ff0000]Některé recepty jsou deaktivovány zatím co jste na zemi.[/color] +structure_description_spaced=__1__\n[color=#ff0000]Nelze použít modul produktivity ve vesmíru.[/color] +tile_warning=[color=red]Změny políček pod entitami mohou zničit entitu.[/color] +please-consider-patreon=[font=heading-1]Baví vás Space Exploration? Prosím, zvažte podporu na Patreonu:[color=#f5cb48]https://www.patreon.com/earendel[/color][/font]\nPatroni mohou získat planetu či měsíc na základě jejich vlastního designu. +delivery_cannon_label_energy=Energie: __1__ +delivery_cannon_label_payload=Náklad: __1__ +delivery-cannon-coordinates-set=Cílové souřadnice nastaveny na [X:__1__ Y:__2__]. Stiskněte [__CONTROL__se-remote-view__] pro ukončení satelitního módu. +unit-capsule=Kapsle s jednotkou (__1__) +climate_water_none=Bezvodý +climate_water_low=Kalužnatý +climate_water_med=Jezerní +climate_water_high=Mořský +climate_water_max=Oceán +climate_moisture_none=Pouštní +climate_moisture_low=Pustý +climate_moisture_med=Mlžný +climate_moisture_high=Vlhký +climate_moisture_max=Nasycený +climate_aux_very_low=Zemitý +climate_aux_low=Neobvyklý +climate_aux_med=Barevný +climate_aux_high=Excentrický +climate_aux_very_high=Exotický +climate_temperature_bland=Nevýrazný +climate_temperature_temperate=Mírný +climate_temperature_balanced=Teplý&Studený +climate_temperature_wild=Horký&Chladný +climate_temperature_extreme=Oheň&Led +climate_temperature_cool=Studený +climate_temperature_cold=Chladný +climate_temperature_vcold=Mrazivý +climate_temperature_frozen=Zmrzlý +climate_temperature_warm=Teplý +climate_temperature_hot=Horký +climate_temperature_vhot=Doutnající +climate_temperature_volcanic=Vulkanický +climate_trees_none=Bez stromů +climate_trees_low=Křovitý +climate_trees_med=Houští +climate_trees_high=Lesnatý +climate_trees_max=Džungle +climate_cliff_none=Rovný +climate_cliff_low=Hladký +climate_cliff_med=Kopcovitý +climate_cliff_high=Kaňony +climate_cliff_max=Hornatý +energy_transmitter_gui_title=[img=entity/se-energy-transmitter-emitter] Energetický paprsek +energy_transmitter_label_transfer=Výkon zářiče: __1__ +energy_transmitter_label_efficiency=Efektivita přenosu: __1__ +energy_transmitter_label_efficiency_atmo=Efektivita přenosu: __1__ (-50% kvůli atmosféře) +energy_transmitter_label_off=Off +energy_transmitter_tooltip_off=Vypnutí paprsku +energy_transmitter_label_energise=Energizovat +energy_transmitter_tooltip_energise=Poskytnutí energie paprskovému přijímači +energy_transmitter_label_glaive=Kosa +energy_transmitter_tooltip_glaive=Paprsek, který lze zaměřit na určité místo a pohybovat s ním, přičemž jeho poškození a rychlost závisí na výkonu zářiče +energy_transmitter_label_auto_glaive=Auto-Kosa +energy_transmitter_tooltip_auto_glaive=Paprsek naprogramován k vyhledání a zničení cíle, poškození se odvíjí od výkonu zářiče +energy-transmitter-coordinates-set=Souřadnice cíle paprsku nastaveny na [X:__1__ Y:__2__]. Stiskněte [__CONTROL__se-remote-view__] k ukončení satelitního módu. +alert-cme-eta=[img=virtual-signal/se-star] Varování: Výron koronální hmoty se blíží k __1__. ETA: __2__s.\nZobrazte si Energetické paprsky v [img=virtual-signal/informatron] Informatronu [__CONTROL__informatron__] pro více detailů. +alert-cme-arrived=[img=virtual-signal/se-star] [color=red]Varování: Výron koronální hmoty dorazil k __1__[/color] +alert-cme-stream=[img=virtual-signal/se-star] Proud částic koronální hmoty detekován __1__ +alert-cme-passed=[img=virtual-signal/se-star] Výron koronální hmoty pominul. +charge-mode-fast=Mód rychlého nabíjení: Nižší nečinnostní spotřeba, vyšší maximální spotřeba, vyrovnávací kapacita zvýšena. Sledujte fluktuaci elektrické sítě. +charge-mode-normal=Mód normálního nabíjení: Nižší maximální spotřeba, vyšší nečinnostní spotřeba, vyrovnávací kapacita snížena. + +[damage-type-name] +cold=Chlad +suffocation=Dušení +meteor=Meteor + +[entity-name] +se-gate-blocker=Nestabilní místo +se-gate-blocker-void=Nestabilní místo +destroyed-cargo-pod=Zničený nákladní kontejner +meteorite=Meteorit +rocket-silo=Satelitní raketové silo +rocket-fragment=Fragment rakety +se-antimatter-reactor=Antihmotový reaktor +se-beryllium-ore=Berylová ruda +se-cargo-rocket-cargo-pod=Nákladní kontejner +se-cryonite=Kryonit +se-condenser-turbine=Kondenzátorová turbína +se-condenser-turbine-tank=Kondenzátorová turbína +se-condenser-turbine-generator=Kondenzátorová turbína +se-core-fragment-processor=Core fragment processor +se-core-miner=Vrták pro těžbu jádra +se-core-miner-drill=Core mining drill +se-cryogun-ice=Ledová zeď +se-dimensional-anchor=Dimenzionální kotva +se-electric-boiler=Elektrický bojler +probe_invalid_launch_star=Neplatná lokace startu: [img=item/se-star-probe] Hvězdná sonda musí být vypuštěna v blízkosti hvězdné orbity. +probe_invalid_launch_belt=Neplatná lokace startu: [img=item/se-belt-probe] Sonda pásu asteroidů musí být vypuštěna z pásu asteroidů. +probe_invalid_launch_field=Neplatná lokace startu: [img=item/se-void-probe] Sonda mezihvězdné prázdnoty musí být vypuštěna z pole asteroidů. +se-fluid-burner-generator=Kapalinový izotermní generátor +se-fuel-refinery=Palivová rafinérie +se-gate-fragment=Fragment artefaktu +se-holmium-ore=Holminit +se-iridium-ore=Iridit +se-meteor-defence-container=Zařízení obrany proti meteorům +se-meteor-defence-charger=Zařízení obrany proti meteorům +se-meteor-point-defence-container=Bodové dělo proti meteorům +victory-message-spaceship=[font=heading-1]Distorční pohon Nexusu dosáhl kritické rychlosti (250).\n[color=#f5cb48]Gratulujeme, dosáhli jste výherní podmínky Space Exploration: Vesmírné lodi![/color][/font]\nPokud jste si tuhle jízdu užili, zvažte, prosím, podporu na Patreonu: [color=#f5cb48]https://www.patreon.com/earendel[/color] +arcosphere-random=Tento recept se bude příležitostně měnit na alternativní verzi stejného názvu. Výsledky receptu jsou náhodné, ale množství arkosfér, které do procesu vchází, z něj i vychází. +se-meteor-point-defence-charger=Meteor point defence +se-methane-ice=Methanový led +se-naquium-ore=Naquitit +se-pulveriser=Drtička +se-rocket-launch-pad=Nákladní raketové silo +se-rocket-launch-pad-tank=Nákladní raketové silo +se-rocket-launch-pad-silo=Nákladní raketové silo +se-rocket-launch-pad-combinator=Nákladní raketové silo +se-rocket-launch-pad-_-seat=Nákladní raketové silo +se-rocket-launch-pad-settings=Nákladní raketové silo +se-rocket-landing-pad=Nákladní přistávací plocha +se-space-accumulator=Vesmírný akumulátor +se-space-accumulator-2=Vesmírný akumulátor 2 +se-space-astrometrics-laboratory=Astrometrická laboratoř +se-space-biochemical-laboratory=Biochemická laboratoř +se-space-assembling-machine=Vesmírná montovna +se-space-capsule-_-vehicle=Vesmírná kapsle +se-space-curved-rail=Zahnutá vesmírná kolej +se-space-decontamination-facility=Dekontaminační zařízení +se-space-electromagnetics-laboratory=Elektromagnetická laboratoř +se-space-genetics-laboratory=Genetická laboratoř +se-space-growth-facility=Růstová laboratoř +se-space-gravimetrics-laboratory=Gravimetrická laboratoř +se-space-hypercooler=Hyperchladič +se-space-laser-laboratory=Laserová laboratoř +se-lifesupport-facility=Zařízení podpory života +se-space-manufactory=Vesmírná manufaktura +se-space-material-fabricator=Material fabricator +se-space-mechanical-laboratory=Mechanical laboratory +se-space-particle-accelerator=Urychlovač částic +se-space-particle-collider=Srážeč částic +se-space-plasma-generator=Generátor plazmy +se-space-radiation-laboratory=Radiační laboratoř +se-space-radiator=Termální radiátor +se-space-radiator-2=Termální radiátor 2 +se-recycling-facility=Recyklační zařízení +se-space-pipe=Vesmírná trubka +se-space-pipe-long=Dlouhá vesmírná trubka +se-space-pipe-long-straight=Dlouhá rovná vesmírná trubka __1__ +se-space-pipe-long-junction=Dlouhá křižovatková vesmírná trubka __1__ +se-space-pipe-to-ground=Podzemní vesmírná trubka +se-space-science-lab=Vesmírná vědecká laboratoř +se-space-solar-panel=Plochý solární panel +se-space-solar-panel-2=Plochý solární panel 2 +se-space-solar-panel-3=Plochý solární panel 3 +se-space-spectrometry-facility=Spektrometrické zařízení +se-space-straight-rail=Rovná vesmírná kolej +se-space-supercomputer-1=Superpočítač +se-space-supercomputer-2=Kvantový superpočítač +se-space-supercomputer-3=Neurální superpočítač +se-space-supercomputer-4=Superpočítač hlubokého vesmíru +se-space-telescope-radio=Radioteleskop +se-space-telescope-microwave=Mikrovlnný teleskop +se-space-telescope=Teleskop +se-space-telescope-xray=Rentgenový teleskop +se-space-telescope-gammaray=Gammateleskop +se-space-thermodynamics-laboratory=Termodynamická laboratoř +se-space-splitter=Vesmírný rozdělovač +se-space-transport-belt=Vesmírný transportní pás +se-space-underground-belt=Vesmírný podzemní pás +se-spaceship-antimatter-engine=Antihmotový motor vesmírné lodi +se-spaceship-antimatter-booster-tank=Antihmotový booster vesmírné lodi +se-spaceship-console=Ovládací panel vesmírné lodi +se-spaceship-console-output=Výstup signálu ovládacího panelu vesmírné lodi +se-spaceship-gate=Dveře vesmírné lodi +se-spaceship-obstacle=Vesmírné sutiny +se-spaceship-rocket-engine=Raketový motor vesmírné lodi +se-spaceship-rocket-booster-tank=Raketový booster vesmírné lodi +se-spaceship-wall=Zeď vesmírné lodi +se-water-ice=Vodní led +se-vitamelange=Vitamelanž +se-vulcanite=Vulkanit +small-asteroid=Malý asteroid +se-gate-part=Část artefaktu +se-gate-platform-scaffold=Artifact jury rig +se-gate-lock-switch=Movable component +se-gate-lock-combinator=Combinator-attachment +se-gate-platform=Artifact augmentation platform +se-gate-platform-combinator=Combinator-attachment +se-gate-energy-interface=Power platform +se-gate-platform-button-switch=Tlačítko +se-gate-tank-input=Vstup kapalin +se-gate-tank-output=Výstup kapalin +se-pyramid-a=Geometrická struktura +se-pyramid-b=Geometrická struktura +se-pyramid-c=Geometrická struktura +se-cartouche-a=Kartuše +se-cartouche-b-a=Kartuše +se-cartouche-b-b=Kartuše +se-cartouche-chest=Prastará truhla +se-glyph=Glyf +glyph=Glyf +se-gate-addon=Artifact augmentation +se-gate-platform-button-middle=Stop +se-gate-platform-button-left=Left +se-gate-platform-button-right=Right +beacon=Základní maják +se-wide-beacon=Maják s dlouhým dosahem +se-wide-beacon-2=Maják s dlouhým dosahem 2 +se-supercharger=Supercharger +se-addon-power-pole=Addon power pole +se-pylon=Pylon +se-pylon-substation=Pylonová rozvodna +se-pylon-construction=Konstrukční pylon +se-pylon-construction-roboport=Konstrukční pylon +se-pylon-construction-radar=Radarový konstrukční pylon +se-pylon-construction-radar-roboport=Radarový konstrukční pylon +se-pylon-construction-radar-radar=Radarový konstrukční pylon +se-shield-projector=Projektor štítů +se-shield-projector-shield-floor-east=Energetický štít +se-shield-projector-shield-floor-north=Energetický štít +se-shield-projector-shield-floor-northeast=Energetický štít +se-shield-projector-shield-floor-northwest=Energetický štít +se-shield-projector-shield-floor-south=Energetický štít +se-shield-projector-shield-floor-southeast=Energetický štít +se-shield-projector-shield-floor-southwest=Energetický štít +se-shield-projector-shield-floor-west=Energetický štít +se-shield-projector-shield-wall-east=Energetický štít +se-shield-projector-shield-wall-north=Energetický štít +se-shield-projector-shield-wall-northeast=Energetický štít +se-shield-projector-shield-wall-northwest=Energetický štít +se-shield-projector-shield-wall-south=Energetický štít +se-shield-projector-shield-wall-southeast=Energetický štít +se-shield-projector-shield-wall-southwest=Energetický štít +se-shield-projector-shield-wall-west=Energetický štít +se-shield-projector-barrier=Energetický štít +se-naquium-heat-pipe=Naquiové tepelné potrubí +se-naquium-heat-pipe-horizontal=Horizontální naquiové tepelné potrubí +se-naquium-heat-pipe-vertical=Vertikální naquiové tepelné potrubí +se-naquium-heat-pipe-long=Dlouhé naquiové tepelné potrubí __1__ +se-deep-space-transport-belt=Transportní pás hlubokého vesmíru +se-deep-space-transport-belt-black=Černý transportní pás hlubokého vesmíru +se-deep-space-transport-belt-white=Bílý transportní pás hlubokého vesmíru +se-deep-space-transport-belt-red=Červený transportní pás hlubokého vesmíru +se-deep-space-transport-belt-yellow=Žlutý transportní pás hlubokého vesmíru +se-deep-space-transport-belt-green=Zelený transportní pás hlubokého vesmíru +se-deep-space-transport-belt-cyan=Tyrkysový transportní pás hlubokého vesmíru +se-deep-space-transport-belt-blue=Modrý transportní pás hlubokého vesmíru +se-deep-space-transport-belt-magenta=Růžový transportní pás hlubokého vesmíru +se-deep-space-underground-belt=Podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-black=Černý podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-white=Bílý podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-red=Červený podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-yellow=Žlutý podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-green=Zelený podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-cyan=Tyrkysový podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-blue=Modrý podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-magenta=Růžový podzemní pás hlubokého vesmíru +se-deep-space-splitter=Rozdělovač hlubokého vesmíru +se-deep-space-splitter-black=Černý rozdělovač hlubokého vesmíru +se-deep-space-splitter-white=Bílý rozdělovač hlubokého vesmíru +se-deep-space-splitter-red=Červený rozdělovač hlubokého vesmíru +se-deep-space-splitter-yellow=Žlutý rozdělovač hlubokého vesmíru +se-deep-space-splitter-green=Zelený rozdělovač hlubokého vesmíru +se-deep-space-splitter-cyan=Tyrkysový rozdělovač hlubokého vesmíru +se-deep-space-splitter-blue=Modrý rozdělovač hlubokého vesmíru +se-deep-space-splitter-magenta=Růžový rozdělovač hlubokého vesmíru +se-core-fissure=Trhlina jádra +se-big-turbine=Vysokoteplotní turbínový generátor +se-big-turbine-generator=Vysokoteplotní turbínový generátor +se-big-turbine-tank=Vysokoteplotní turbínový generátor +se-big-heat-exchanger=Vysokoteplotní tepelný výměník +se-blueprint-registration-point=Blueprint Registration Point +se-delivery-cannon=Dodávkové dělo +se-delivery-cannon-settings=Dodávkové dělo +se-delivery-cannon-energy-interface=Dodávkové dělo +se-delivery-cannon-chest=Truhla dodávkového děla +se-spaceship-clamp=Svorka vesmírné lodi +se-spaceship-clamp-place=Svorka vesmírné lodi +se-bloater-pool-cloud=Bloatburst pool +se-delivery-cannon-weapon=Zbraňové dodávkové dělo +se-delivery-cannon-weapon-settings=Zbraňové dodávkové dělo +se-delivery-cannon-weapon-energy-interface=Zbraňové dodávkové dělo +se-energy-transmitter-emitter=Zářič energetických paprsků +se-energy-transmitter-chamber=Paprsková komora +se-energy-transmitter-injector=Paprskový injektor +se-energy-transmitter-injector-reactor=Paprskový injektor +se-energy-receiver=Paprskový přijímač +se-energy-beam-defence=Deštník +se-nexus=Nexus +se-nexus-charger=Nexus +se-space-probe-rocket-silo=Raketové silo vesmírné sondy + + +[entity-description] +pipe=Distribuce kapalin +pipe-to-ground=Podzemní distribuce kapalin +straight-rail=Rovné koleje +stone-furnace=Taví rudy +steel-furnace=Taví rudy +electric-furnace=Taví rudy +burner-assembling-machine=Automatizovaná výrobní struktura založena na spalování paliva. +assembling-machine-1=Automatizovaná výrobní struktura. +assembling-machine-2=Automatizovaná výrobní struktura. +assembling-machine-3=Automatizovaná výrobní struktura. +oil-refinery=Konvertuje surovou ropu na užitečné produkty. +se-fuel-refinery=Automatizovaná struktura k výrobě paliva. +chemical-plant=Automatizovaná výrobní struktura. +lab=Automatizovaná výzkumná struktura. +burner-lab=Automatizovaná výzkumná struktura založena na spalování paliva. +transport-belt=Dopravník transportující předměty. +fast-transport-belt=Dopravník transportující předměty. +express-transport-belt=Dopravník transportující předměty. +underground-belt=Dopravník transportující předměty pod zemí. +fast-underground-belt=Dopravník transportující předměty pod zemí. +express-underground-belt=Dopravník transportující předměty pod zemí. +splitter=Stroj k rozdělování, spojování, a třídění dopravníků. +fast-splitter=Stroj k rozdělování, spojování, a třídění dopravníků. +express-splitter=Stroj k rozdělování, spojování, a třídění dopravníků. +se-gate-platform-scaffold=Ať už je ten prstenec cokoli, nebude fungovat. This is a construction site to make some repairs, install a few motors, sensors, control interface, and other addons. +se-gate-lock-switch=Stiskněte __CONTROL__rotate__ k manuálnímu pohybu. +se-gate-platform-button-switch=Stiskněte __CONTROL__rotate__ k posunu. +se-gate-lock-combinator=Zatím neimplementováno. +se-gate-platform-combinator=Zatím neimplementováno. +se-gate-energy-interface=Poskytuje artefaktu energii. +rocket-silo=Vypusťte satelit do vesmíru k odemknutí "Navigačního módu" a objevení nových planet, měsíců, a pásů asteroidů ve hvězdném systému, ve kterém byl satelit vypuštěn. Při úplném objevení současného hvězdného systému dojde k objevení nového hvězdného systému. +se-antimatter-reactor=Anihiluje antihmotu hmotou za vývinu extrémního množství tepla. +se-beryllium-ore=Berylliová ruda +se-condenser-turbine=Účinná jen na 75% oproti klasické parní turbíně, ale 99% využité páry je navráceno v podobě vody. +se-core-fragment-processor=Extrahuje suroviny z fragmentů jádra. +se-core-miner=Umožňuje nekonečnou extrakci surovin z planet a měsíců, ale při použití více zařízení na stejném tělese má snižující se výnosy. Spotřebovává 50MW. +se-core-miner-drill=Umožňuje nekonečnou extrakci surovin z planet a měsíců, ale při použití více zařízení na stejném tělese má snižující se výnosy. Spotřebovává 50MW. +se-dimensional-anchor=[font=default-bold][color=#f5cb48]Omezení umístění: Blízká hvězdná orbita[/color][/font]\nVyužívá gravitační studny hvězdy jako stabilizační bod pro prostorovou anomálii. +se-electric-boiler=Produkuje páru z vody pomocí elektrické energie. Má 90% účinnost. +se-fluid-burner-generator=Vyžaduje kapalné palivo s energetickou hodnotou (například kapalné raketové palivo) k produkci elektřiny. Jednoduchý a kompaktní způsob, ale chybí mu efektivita větších, na turbínách založených systémů. Navrženo pro použití ve vesmíru. Spotřeba paliva závisí na energetické hodnotě kapalného paliva. +se-holmium-ore=Holmiová ruda +se-iridium-ore=Iridiová ruda +se-space-probe-rocket=Raketa vesmírné sondy +se-meteor-defence-container=Může bránit celou planetu před meteory, ale střílet jen na jeden najednou. Vyžaduje proti-meteorovou munici a plné nabití. 80% přesnost. Potřebuje nabití po každém výstřelu. Při nabíjení spotřebovává 20MW. +se-meteor-defence-charger=Může bránit celou planetu před meteory, ale střílet jen na jeden najednou. Vyžaduje proti-meteorovou munici a plné nabití. 80% přesnost. Potřebuje nabití po každém výstřelu. Při nabíjení spotřebovává 20MW. +se-meteor-point-defence-container=Brání oblast před meteory. Dokáže vystřelit až na 4 meteory najednou. Vyžaduje bodovou proti-meteorovou munici a plné nabití. Dosah 64, 50% přesnost, po výstřelu je nutná doba k nabití. +se-meteor-point-defence-charger=Brání oblast před meteory. Dokáže vystřelit až na 4 meteory najednou. Vyžaduje bodovou proti-meteorovou munici a plné nabití. Dosah 64, 50% přesnost, po výstřelu je nutná doba k nabití. +se-naquium-ore=Naquiová ruda +se-rocket-launch-pad=Vysílá svůj inventář do vesmíru. Dokáže transportovat i pasažéry, vstupte pomocí __CONTROL__toggle-driving__ v blízkosti předních dveří. +se-rocket-landing-pad=Místo přistání nákladu pro kapsle nákladních raket. +se-space-assembling-machine=Modifikovaná montovna, která dokáže operovat ve vesmíru. +se-space-astrometrics-laboratory=Kombinuje, porovnává, a vyčísluje různé zdroje astronomických informací. +se-space-biochemical-laboratory=Pokročilá chemická laboratoř specializovaná na biochemii. Dokáže také provádět základní chemické procesy a zpracování ropy. +se-space-capsule-_-vehicle=Může být využita k návratu pasažérů zpět na nejbližší planetární povrch. Nasedněte do kapsle pomocí __CONTROL__toggle-driving__. +se-space-decontamination-facility=Čistí substance pro použití ve sterilním prostředí, a připravuje kapaliny pro použití v prostředí s nízkým tlakem. +se-space-electromagnetics-laboratory=Zařízení pro aplikaci intenzivních magnetických polí a extrémně vysokých napětích. +se-space-genetics-laboratory=Laboratoř, která se věnuje genetickému sekvencování, modifikaci, a pěstění kultur. +se-space-gravimetrics-laboratory=Analyzuje a simuluje gravitační vlivy. +se-space-growth-facility=Pěstuje biologické vzorky pod širokou škálou kontrolovaných podmínek, které jsou kdekoli jinde nemožné, například pod vlivem mikrogravitace. +se-space-hypercooler=Provádí výměnu tepla na termokapalině, čímž jednu otepluje a druhou ochlazuje. +se-space-laser-laboratory=Experimentuje s lasery. Musí být chráněny oči. +se-lifesupport-facility=Udržování života v nepřátelském prostředí. +se-space-manufactory=Obří montovna, která je ale schopna provedení složitějších receptů. Funkční pouze ve vesmíru (a na vesmírných lodích). +se-space-material-fabricator=Syntetizuje nové materiály. Kříženec mezi srážečem částic a 3D tiskárnou. +se-space-mechanical-laboratory=Poskytuje provedení široké škály mechanických procesů: Drcení, trhání, střihání, vibrace, apod. +se-space-particle-accelerator=Urychluje částice na téměř rychlost světla. +se-space-particle-collider=Sráží vysoko-rychlostní částice a analyzuje výsledky srážky. +se-space-pipe=Můžete přes ni chodit. +se-space-pipe-long=Dobrá a levná cesta transportu tekutin na dlouhé vzdálenosti vysokou rychlostí. Můžete přes ni chodit. +se-space-pipe-long-straight=__1__ dlouhá. Nepropojuje se po stranách. Dobrá pro paralelní vedení potrubí a rychlý přesun kapalin na dlouhé vzdálenosti. +se-space-pipe-long-junction=__1__ dlouhá. Má centrální "křižovatku" s postranními přípojkami. Dobrá pro rychlý přesun kapalin ve výrobních linkách. +se-space-pipe-to-ground=Drahá a s omezeným dosahem, používejte jen v případě potřeby. Můžete chodit přes vesmírné trubky. +se-space-plasma-generator=Generuje řadu druhů plazmy. +se-pulveriser=Drtí a mele tvrdší nerosty a fragmenty planetárních jader. +se-space-radiation-laboratory=Relativně bezpečné místo na hraní s radioaktivním materiálem. Lze využít ke zpracování uranu. +se-space-radiator=Vyzařuje přebytečné teplo z přehřáté termokapaliny. +se-space-radiator-2=Vyzařuje přebytečné teplo z přehřáté termokapaliny. +se-recycling-facility=Recykluje šrot a další vedlejší produkty na suroviny. +se-space-solar-panel=Vysoce efektivní solární panel, po kterém můžete chodit. +se-space-solar-panel-2=Vysoce efektivní solární panel, po kterém můžete chodit. +se-space-solar-panel-3=Vysoce efektivní solární panel, po kterém můžete chodit. +se-space-spectrometry-facility=Spektrofotometrie, plynová chromatografie, hmotnostní spektrometrie, a další druhy spektrografie. +se-space-supercomputer-1=Datová manipulace, zpracovávání, a simulace. +se-space-supercomputer-2=Kvantové výpočty. Vylepšená datová manipulace, zpracovávání, a simulace. +se-space-supercomputer-3=Adaptivní neurální síť na rámci kvantových výpočtů. Vylepšená datová manipulace, zpracovávání, a simulace. +se-space-supercomputer-4=Navržen pomocí nanotechnologie, semi-organický superpočítač, který využívá zakřivování prostoru a vyšších dimenzí pro zvýšení výpočetní hustoty a energetického transportu. +se-space-straight-rail=Navržena pro použití ve vesmíru, ale použitelná i na zemi. +se-space-science-lab=Dokáže zpracovat pokročilé vědecké balíčky. +se-space-telescope=Sofistikovaný teleskop, citlivý na různé vlnové délky kolem viditelného spektra. +se-space-telescope-gammaray=Gamma paprsky se nelámou, takže je nemůžete zaměřit pomocí čoček. Tento výkonný teleskop místo toho využívá zrcadla a speciální detektory. +se-space-telescope-xray=Rentgenové paprsky jsou blokovány většinou atmosfér. Tento výkonný teleskop byl navržen pro použití ve vesmíru, kde atmosféra nepředstavuje problém. +se-space-telescope-microwave=Obrovský teleskop, schopný detekovat mikrovlny a kosmické mikrovlnné pozadí. +se-space-telescope-radio=Obrovský teleskop, schopný detekovat velmi slabé radiovlny ze vzdálených zdrojů. +se-space-thermodynamics-laboratory=Provádí procesy, které zahrnují extrémní teploty. Dokáže také provádět základní termální procesy, jako například tavení rud. +se-space-transport-belt=Zařídí, aby vám vaše předměty neodplouvaly pryč. +se-spaceship-antimatter-engine=[font=default-bold][color=#f5cb48]Omezení umístění: Podlaha vesmírné lodi[/color][/font]\nAnihiluje proud antihmoty. Počítá se jako přepážka uzavření vesmírné lodi. +se-spaceship-antimatter-booster-tank=[font=default-bold][color=#f5cb48]Omezení umístění: Podlaha vesmírné lodi[/color][/font]\nZadržuje antihmotu. Vyžadováno pro start vesmírné lodi. +se-spaceship-console=[font=default-bold][color=#f5cb48]Omezení umístění: Podlaha vesmírné lodi[/color][/font]\nPoužívejte k pohybu vesmírné lodi mezi planetami, měsíci, orbitami, a pásy asteroidů. Musí se nacházet uvnitř vesmírné lodi. Kontrola integrity zvýrazní problémy. +se-spaceship-console-output=Vysílá signály o současném stavu vesmírné lodi. Zobrazte si Vesmírné lodě v Informatronu pro více informací [__CONTROL__informatron__]. +se-spaceship-gate=[font=default-bold][color=#f5cb48]Omezení umístění: Podlaha vesmírné lodi[/color][/font]\nSilové pole zastaví dekompresi při otevření dveří. Počítá se jako přepážka uzavření vesmírné lodi. +se-spaceship-rocket-engine=[font=default-bold][color=#f5cb48]Omezení umístění: Podlaha vesmírné lodi[/color][/font]\nSpaluje kapalné raketové palivo. Počítá se jako přepážka uzavření vesmírné lodi. +se-spaceship-rocket-booster-tank=[font=default-bold][color=#f5cb48]Omezení umístění: Podlaha vesmírné lodi[/color][/font]\nZadržuje kapalné raketové palivo. Vyžadováno pro start vesmírné lodi. +se-spaceship-wall=[font=default-bold][color=#f5cb48]Omezení umístění: Podlaha vesmírné lodi[/color][/font]\nPočítá se jako přepážka uzavření vesmírné lodi, diagonální mezery ruší uzavření. +beacon=8 slotů na moduly. Přenáší účinky modulů blízkým přátelským entitám ve vzdálenosti 3. Více majáků ovlivňující stejnou entitu způsobí její přetížení a zastavení operování. +se-wide-beacon=15 slotů na moduly. Přenáší účinky modulů blízkým přátelským entitám ve vzdálenosti 14. Více majáků ovlivňující stejnou entitu způsobí její přetížení a zastavení operování. +se-wide-beacon-2=20 slotů na moduly. Přenáší účinky modulů blízkým přátelským entitám ve vzdálenosti 14. Více majáků ovlivňující stejnou entitu způsobí její přetížení a zastavení operování. +kr-singularity-beacon=Kompaktní, 100% efektivní maják s krátkým dosahem. Přenáší účinky modulů blízkým přátelským entitám ve vzdálenosti 2. Více majáků ovlivňující stejnou entitu způsobí její přetížení a zastavení operování. +se-supercharger=Dokáže nabíjet až 64 robotů vysokou rychlostí najednou. Maximální spotřeba energie je 1GW. +se-addon-power-pole=Malý elektrický sloup, který byl navržen k připojení na budovy a nebo pro precizní kontrolu elektrického pokrytí. +se-pylon=Distribuuje elektrickou energii. Dosah pro připojení je 64. +se-pylon-substation=Distribuuje elektrickou energii. Dosah pro připojení je 64, pokrývá oblast o velikosti 64x64. +se-pylon-construction=Distribuuje elektrickou energii a rozšiřuje konstrukční oblast. Dosah pro připojení je 64, pokrývá oblast o velikosti 64x64. +se-pylon-construction-radar=Distribuuje elektrickou energii, rozšiřuje konstrukční oblast a poskytuje radarovou vizi. Dosah pro připojení je 64, pokrývá a odhaluje oblast o velikosti 256x256. +se-shield-projector=Vytváří ochranné silové pole. Spotřebovává více energie pokud se nabijí, nebo pokud je štít pod náporem. Pokud máte nainstalovanou modifikaci "Walls Block Spitters", dokáže blokovat projektily plivačů. +se-big-turbine=[font=default-bold][color=#e4cead]Maximální výkon:[/color][/font]1GW.\nVelký generátor, který akceptuje páru o 5000°C, produkuje páru o 500°C na druhém konci, a vodu po stranách. Energeticky efektivní na 99%, vodu spořící na 99%. +se-big-heat-exchanger=Velký výměník tepla navržen pro vysoké teploty a velké kapacity. +se-delivery-cannon=Kolejnicové dělo, které je schopné vystřelit náklad na orbitu a ještě dál. Při neopatrném zacházení způsobuje poškození, užívejte opatrně. +se-delivery-cannon-chest=Obrněná truhla, navržena k bezpečnému zachycení velmi rychle padajícího nákladu. Vyžaduje volné místo k bezpečnému zachycení dodávek. +se-spaceship-clamp=Svorka na vesmírné lodi schopná zakotvit na svorce směřující opačným směrem. Počítá se jako přepážka uzavření vesmírné lodi. +se-spaceship-clamp-place=Svorka na vesmírné lodi schopná zakotvit na svorce směřující opačným směrem. Počítá se jako přepážka uzavření vesmírné lodi. +se-space-accumulator=Vysokohustotní energetické úložiště. +se-space-accumulator-2=Vysokohustotní energetické úložiště. +se-nexus=Funguje pouze na pohybující se vesmírné lodi, spotřeba energie souvisí s rychlostí. Může získávat data z pohybu v mezihvězdném prostoru, generace dat závisí na kinetické energii lodi. Nexus je navržen tak, aby se choval jako distorční pohon, a se správnou technologií může umožnit únik z lokální hvězdokupy. +se-nexus-charger=Funguje pouze na pohybující se vesmírné lodi, spotřeba energie souvisí s rychlostí. Může získávat data z pohybu v mezihvězdném prostoru, generace dat závisí na kinetické energii lodi. Nexus je navržen tak, aby se choval jako distorční pohon, a se správnou technologií může umožnit únik z lokální hvězdokupy. +se-space-probe-rocket-silo=Raketové silo k vysílání vesmírných sond. +se-delivery-cannon-weapon=Velké elektromagnetické dělo schopné vystřelení munice na orbitu a ještě dál. Užívejte opatrně. +se-energy-transmitter-emitter=Centrální budova, která vytváří mezi-povrchový energetický paprsek. Může být použit jako zbraň, nebo k vysílání energie k paprskovému přijímači. Vyžaduje připojenou paprskovou komoru a připojené paprskové injektory. Síla paprsku závisí na počtu injektorů. +se-energy-transmitter-chamber=Musí být připojena k zářiči energetických paprsků. Jiné komory mohou být připojeny konci, a nebo prostředkem dlouhé strany. Injektory mohou být připojeny pouze po stranách. +se-energy-transmitter-injector=Musí být připojen k paprskové komoře a zářiči. Injektory mají konstantní energetickou spotřebu, každý zvyšuje vyslanou energii, což buď zvyšuje teplo produkované přijímačem, nebo poškození a rychlost paprsku. +se-energy-transmitter-injector-reactor=Musí být připojen k paprskové komoře a zářiči. Injektory mají konstantní energetickou spotřebu, každý zvyšuje vyslanou energii, což buď zvyšuje teplo produkované přijímačem, nebo poškození a rychlost paprsku. +se-energy-receiver=Zachycuje energetický paprsek a konvertuje ho na teplo. Zářič musí být v módu Energizace a musí být zaměřen na daný přijímač. +se-energy-beam-defence=Zařízení obrany před energetickými paprsky. Brání před výronem koronální hmoty či před zbraněmi na bázi energetických paprsků. Jedinou podmínkou fungování je energie, základní spotřeba činí 10MW, ale zvyšuje se podle síly nebezpečného paprsku. K ochraně jednoho povrchu před výronem koronální hmoty stačí jeden Deštník, proti paprskovým zbraním dokáže jeden deštník rozptýlit proud částic o energii až 500GJ. Zobrazte si Energetické paprsky v [img=virtual-signal/informatron] Informatronu pro více informací [__CONTROL__informatron__] + +[equipment-name] +energy-shield-equipment=Energetický štít +energy-shield-mk2-equipment=Energetický štít MK2 +energy-shield-mk3-equipment=Energetický štít MK3 +energy-shield-mk4-equipment=Energetický štít MK4 +energy-shield-mk5-equipment=Energetický štít MK5 +energy-shield-mk6-equipment=Energetický štít MK6 +se-adaptive-armour-equipment-1=Adaptivní brnění MK1 +se-adaptive-armour-equipment-2=Adaptivní brnění MK2 +se-adaptive-armour-equipment-3=Adaptivní brnění MK3 +se-adaptive-armour-equipment-4=Adaptivní brnění MK4 +se-adaptive-armour-equipment-5=Adaptivní brnění MK5 +se-rtg-equipment=Přenosný RTG +se-rtg-equipment-2=Přenosný RTG MK2 +se-lifesupport-equipment-1=Vybavení podpory života MK1 +se-lifesupport-equipment-2=Vybavení podpory života MK2 +se-lifesupport-equipment-3=Vybavení podpory života MK3 +se-lifesupport-equipment-4=Vybavení podpory života MK4 + +[equipment-description] +energy-shield-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +energy-shield-mk2-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +energy-shield-mk3-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +energy-shield-mk4-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +energy-shield-mk5-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +energy-shield-mk6-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +se-adaptive-armour-equipment-1=Brnění, které využívá energie k samoopravě. S postupem času pomalu zvyšuje míru ochrany. +se-adaptive-armour-equipment-2=Brnění, které využívá energie k samoopravě. S postupem času pomalu zvyšuje míru ochrany. +se-adaptive-armour-equipment-3=Brnění, které využívá energie k samoopravě. S postupem času pomalu zvyšuje míru ochrany. +se-adaptive-armour-equipment-4=Brnění, které využívá energie k samoopravě. S postupem času pomalu zvyšuje míru ochrany. +se-adaptive-armour-equipment-5=Brnění, které využívá energie k samoopravě. S postupem času pomalu zvyšuje míru ochrany. +se-rtg-equipment=Radioizotopový termoelektrický generátor. Přenosný generátor, který konvertuje teplo z radioaktivního rozpadu na elektrickou energii. Vydrží funkční po desetiletí bez jakéhokoli dalšího paliva. +se-rtg-equipment-2=Radioizotopový termoelektrický generátor MK2. Vylepšený přenosný generátor, který konvertuje teplo z radioaktivního rozpadu na elektrickou energii. Vydrží funkční po desetiletí bez jakéhokoli dalšího paliva. +se-lifesupport-equipment-1=Zvyšuje účinnost podpory života o +100% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. +se-lifesupport-equipment-2=Zvyšuje účinnost podpory života o +200% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. +se-lifesupport-equipment-3=Zvyšuje účinnost podpory života o +400% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. +se-lifesupport-equipment-4=Zvyšuje účinnost podpory života o +800% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. + +[fluid-name] +se-antimatter-stream=Proud antihmoty +se-bio-sludge=Biosludge +se-contaminated-bio-sludge=Contaminated biosludge +se-contaminated-space-water=Kontaminovaná kosmická voda +se-chemical-gel=Chemický gel +se-decompressing-steam=Condensing Steam +se-liquid-rocket-fuel=Kapalné raketové palivo +se-methane-gas=Methanový plyn +se-methane-gas-mixed=Směs methanu +se-nutrient-gel=Výživný gel +se-neural-gel=Neurální gel +se-neural-gel-2=Pokročilý neurální gel +se-ion-stream=Proud iontů +se-plasma-stream=Proud plasmy +se-particle-stream=Proud částic +se-proton-stream=Proud protonů +se-space-coolant=Termotekutina 25°C +se-space-coolant-hot=Termotekutina 25°C +se-space-coolant-warm=Zchlazená termotekutina -10°C +se-space-coolant-cold=Zchlazená termotekutina -100°C +se-space-coolant-supercooled=Superzchlazená termotekutina -273°C +se-space-water=Kosmická voda +se-beryllium-hydroxide=Hydroxid beryllnatý +se-cryonite-slush=Kryonitová struska + +[fluid-description] +se-space-water=Voda, která při nízkém tlaku nemrzne, použitelná pro většinu potřeb ve vesmíru. +se-space-coolant=Základní teplota termotekutiny. +se-space-coolant-hot=Základní teplota termotekutiny. +se-space-coolant-warm=Teplota termotekutiny po ochlazení termálními radiátory. +se-space-coolant-cold=Teplota termotekutiny po silném ochlazení. +se-space-coolant-supercooled=Teplota termotekutiny po opakovaném silném chlazení. + +[fuel-category-name] +antimatter=Antihmotové palivo + +[item-group-name] +space=Vesmír +science=Věda +spaceship=Vesmírná loď +bob-fluids=Kapaliny +resources=Suroviny +intermediate-products=Meziprodukty +combat=Vybavení & Boj + +[item-name] +core-fragment=Fragment jádra (__1__) +effectivity-module-4=Modul efektivity 4 +effectivity-module-5=Modul efektivity 5 +effectivity-module-6=Modul efektivity 6 +effectivity-module-7=Modul efektivity 7 +effectivity-module-8=Modul efektivity 8 +effectivity-module-9=Modul efektivity 9 +glass=Sklo +productivity-module-4=Modul produktivity 4 +productivity-module-5=Modul produktivity 5 +productivity-module-6=Modul produktivity 6 +productivity-module-7=Modul produktivity 7 +productivity-module-8=Modul produktivity 8 +productivity-module-9=Modul produktivity 9 +rocket-fuel=Pevné raketové palivo +sand=Písek +solid-sand=Washed Sand +washed-sand=Washed Sand +satellite=Navigační satelit +se-antimatter-canister=Antimatter Canister +se-astrometric-data=Astrometrická data +se-astronomic-catalogue-1=Astronomic Catalogue +se-astronomic-catalogue-2=Broad Astronomic Catalogue +se-astronomic-catalogue-3=Comprehensive Astronomic Catalogue +se-astronomic-catalogue-4=Extended Astronomic Catalogue +se-astronomic-insight=Astronomic Insight +se-astronomic-science-pack-1=Astronomický vědecký balíček 1 +se-astronomic-science-pack-2=Astronomický vědecký balíček 2 +se-astronomic-science-pack-3=Astronomický vědecký balíček 3 +se-astronomic-science-pack-4=Astronomický vědecký balíček 4 +se-atomic-data=Atomová data +se-beryllium-ore=Berylová ruda +se-ballistic-shielding-data=Ballistic shielding data +se-beryllium-ore-crushed=Drcený beryl +se-beryllium-ore-washed=Promytý beryl +se-beryllium-plate=Berylliový plát +se-beryllium-powder=Berylliový prášek +se-beryllium-ingot=Berylliový ingot +se-beryllium-sulfate=Síran beryllnatý +se-bio-combustion-data=Bio Combustion Data +se-bio-combustion-resistance-data=Bio combustion resistance data +se-bio-spectral-data=Biospektrální data +se-biochemical-data=Biochemická data +se-biochemical-resistance-data=Biochemical resistance data +se-bioculture=Biokultura +se-bioelectrics-data=Bioelektrická data +se-biological-catalogue-1=Biological Catalogue +se-biological-catalogue-2=Broad Biological Catalogue +se-biological-catalogue-3=Comprehensive Biological Catalogue +se-biological-catalogue-4=Extended Biological Catalogue +se-biological-insight=Biological Insight +se-biological-science-pack-1=Biologický vědecký balíček 1 +se-biological-science-pack-2=Biologický vědecký balíček 2 +se-biological-science-pack-3=Biologický vědecký balíček 3 +se-biological-science-pack-4=Biologický vědecký balíček 4 +se-biomechanical-data=Biomechanická data +se-biomechanical-resistance-data=Biomechanical Resistance Data +se-boson-data=Bosonová data +se-broken-data=Zničená datová karta +se-canister=Secure Canister +se-biogun=Biologická puška +se-bloater-ammo=Bloatburst ammo +se-pheromone-ammo=Feromonová šipka +se-cryogun=Kryopuška +se-cryogun-ammo=Ledová munice +se-rocket-launch-pad-silo-dummy-ingredient-item=Nákladní raketa (Skrytá ingredience) +se-rocket-launch-pad-silo-dummy-result-item=Nákladní raketa (Skrytý produkt) +se-cargo-rocket-cargo-pod=Nákladní kontejner +se-cargo-rocket-fuel-tank=Raketová palivová nádrž +se-cargo-rocket-section=Sekce nákladní rakety +se-cargo-rocket-section-packed=Sbalené sekce nákladní rakety +se-cold-thermodynamics-data=Cold Thermodynamics Data +se-comparative-genetic-data=Comparative Genetic Data +se-compressive-strength-data=Compressive Strength Data +se-conductivity-data=Vodivostní data +se-contaminated-scrap=Kontaminovaný šrot +se-core-fragment-omni=Fragment jádra +se-corrosion-resistance-data=Data odolnosti proti korozi +se-cryogenics-data=Cryogenics Data +se-cryonite=Kryonit +se-cryonite-crushed=Drcení kryonit +se-cryonite-washed=Promytý kryonit +se-cryonite-rod=Kryonitová tyč +se-cryonite-ion-exchange-beads=Anion-Ion Exchange Beads +se-dark-energy-data=Data temné energie +se-darkmatter-data=Data temné hmoty +se-data-storage-substrate-cleaned=Hladký substrát datového úložiště +se-data-storage-substrate=Drsný substrát datového úložiště +se-decompression-data=Dekompresní data +se-decompression-resistance-data=Data odolnosti proti dekompresi +se-universal-catalogue=Univerzální katalog +se-deep-space-science-pack=Vědecký balíček hlubokého vesmíru +se-deep-space-science-pack-1=Vědecký balíček hlubokého vesmíru 1 +se-deep-space-science-pack-2=Vědecký balíček hlubokého vesmíru 2 +se-deep-space-science-pack-3=Vědecký balíček hlubokého vesmíru 3 +se-deep-space-science-pack-4=Vědecký balíček hlubokého vesmíru 4 +se-delivery-cannon-capsule=Kapsle dodávkového děla +se-delivery-cannon-capsule-packed=Kapsle dodávkového děla: __1__ +se-delivery-cannon-targeter=Zaměřovač dodávkového děla +se-delivery-cannon-weapon-capsule=Kapsle zbraňového dodávkového děla +se-delivery-cannon-weapon-capsule-packed=Kapsle zbraňového dodávkového děla: __1__ +se-delivery-cannon-weapon-targeter=Zaměřovač zbraňového dodávkového děla +se-energy-transmitter-targeter=Zaměřovač energetického paprsku +se-doppler-shift-data=Data Dopplerova jevu +se-durability-data=Data durability +se-electrical-shielding-data=Data elektrických štítů +se-electromagnetic-field-data=Data elektromagnetických polí +se-empty-data=Prázdná datová karta +se-empty-lifesupport-canister=Prázdná nádoba podpory života +se-energy-catalogue-1=Energy Catalogue +se-energy-catalogue-2=Broad Energy Catalogue +se-energy-catalogue-3=Comprehensive Energy Catalogue +se-energy-catalogue-4=Extended Energy Catalogue +se-energy-insight=Energy Insight +se-energy-science-pack-1=Energetický vědecký balíček 1 +se-energy-science-pack-2=Energetický vědecký balíček 2 +se-energy-science-pack-3=Energetický vědecký balíček 3 +se-energy-science-pack-4=Energetický vědecký balíček 4 +se-entanglement-data=Entanglement Data +se-enriched-naquium=Obohacené naquium +se-exotic-fission-data=Exotic Fission Data +se-exotic-singularity-data=Data singularity +se-explosion-shielding-data=Data protivýbušných štítů +se-experimental-alloys-data=Experimentální data slitin +se-experimental-biochemical-data=Experimentální biochemická data +se-experimental-bioculture=Experimentální biokultura +se-experimental-genetic-data=Experimentální genetická data +se-experimental-material-decay-data=Experimentální data rozpadů materiálů +se-experimental-material-spectral-data=Experimental Material Spectral Data +se-experimental-material=Experimentální materiálový prototyp +se-experimental-specimen=Experimentální biomasa +se-experimental-superconductor=Prototyp supravodiče +se-forcefield-data=Data silového pole +se-friction-data=Friction data +se-fusion-test-data=Data zkušební fúze +se-gammaray-detector=Detektor gamma paprsků +se-gammaray-observation-data=Data pozorování gamma paprsků +se-gammaray-test-data=Data gamma paprsků +se-gate-fragment=Fragment artefaktu +se-genetic-data=Genetická data +se-gravity-wave-observation-data=Data pozorování gravitačních vln +se-gravity-wave-data=Data gravitačních vln +se-gravimetric-observation-data=Data gravimetrických pozorování +se-gravimetric-test-data=Data gravimetrických testů +se-gravitational-lensing-data=Gravitational lensing data +se-heat-shielding=Tepelné stínění +se-holmium-ore=Holminit +se-holmium-ore-crushed=Drcená holmiová ruda +se-holmium-ore-washed=Promytá holmiová ruda +se-holmium-powder=Holmiový prášek +se-holmium-plate=Holmiový plát +se-holmium-ingot=Holmiový ingot +se-hot-thermodynamics-data=Hot thermodynamics data +se-impact-shielding-data=Impact shielding data +se-infrared-observation-data=Infrared observation data +se-ion-spectrometry-data=Ion spectrometry data +se-iridium-ore=Iridit +se-iridium-ore-crushed=Drcený iridit +se-iridium-ore-washed=Promytý iridit +se-iridium-powder=Iridiový prášek +se-iridium-plate=Iridiový plát +se-iridium-ingot=Iridiový ingot +se-junk-data=Junk Data Card +se-laser-shielding-data=Data laserového stínění +se-lepton-data=Leptonová data +se-lifesupport-canister=Nádoba podpory života +se-machine-learning-data=Data strojového učení +se-magnetic-canister=Magnetická nádoba +se-magnetic-monopole-data=Magnetic Monopole Data +se-material-decay-data=Material Decay Data +se-material-science-pack-1=Materiální vědecký balíček 1 +se-material-science-pack-2=Materiální vědecký balíček 2 +se-material-science-pack-3=Materiální vědecký balíček 3 +se-material-science-pack-4=Materiální vědecký balíček 4 +se-material-spectral-data=Materiální spektrální data +se-material-testing-pack=Balíček testování materiálů +se-material-catalogue-1=Material Catalogue +se-material-catalogue-2=Broad Material Catalogue +se-material-catalogue-3=Comprehensive Material Catalogue +se-material-catalogue-4=Extended Material Catalogue +se-material-insight=Material Insight +se-medpack=Lékárnička +se-medpack-2=Lékárnička 2 +se-medpack-3=Lékárnička 3 +se-medpack-4=Lékárnička 4 +se-meteor-defence=Zařízení obrany proti meteorům +se-meteor-defence-ammo=Munice zařízení obrany proti meteorům +se-meteor-point-defence=Meteor point defence +se-meteor-point-defence-ammo=Meteor point defence ammo +se-methane-ice=Methanový led +se-micro-black-hole-data=Data mikro černé díry +se-microwave-observation-data=Data pozorování mikrovln +se-negative-pressure-data=Negative Pressure Data +se-nano-cold-thermodynamics-data=Nanomaterial Cold Thermodynamics Data +se-nano-compressive-strength-data=Nanomaterial Compressive Strength Data +se-nano-hot-thermodynamics-data=Nanomaterial Hot Thermodynamics Data +se-nanomaterial=Nanomateriál +se-nano-tensile-strength-data=Nanomaterial Tensile Strength Data +se-naquium-ore=Naquitit +se-naquium-ore-crushed=Drcený naquitit +se-naquium-ore-washed=Promytý naquitit +se-naquium-powder=Naquiový prášek +se-naquium-plate=Naquiový plát +se-naquium-ingot=Naquiový ingot +se-neural-anomaly-data=Data neurální anomálie +se-nutrient-vat=Nutrient Vat +se-observation-frame-blank=Blank Observation Frame +se-observation-frame-gammaray=Gamma Ray Observation frame +se-observation-frame-infrared=Infrared Observation frame +se-observation-frame-microwave=Microwave Observation frame +se-observation-frame-radio=Radio Wave Observation frame +se-observation-frame-uv=UV Observation frame +se-observation-frame-visible=Visible Observation frame +se-observation-frame-xray=Xray Observation frame +se-orbital-data=Data orbitálních výpočtů +se-particle-beam-shielding-data=Data stínění paprsků částic +se-plague-bomb=Morová raketa +se-plasma-canister=Nádoba plasmy +se-plasma-electrodynamics-data=Data elektrodynamiky plasmy +se-plasma-thermodynamics-data=Data termodynamiky plasmy +se-polarisation-data=Polarizační data +se-pressure-containment-data=Pressure Containment Data +se-quantum-phenomenon-data=Data kvantového jevu +se-quark-data=Kvarková data +se-radiation-data=Radiační data +se-radiation-exposure-data=Data vystavení radiaci +se-radiation-exposure-resistance-data=Data odolnosti proti radiaci +se-radiation-shielding-data=Data stínění proti radiaci +se-radio-observation-data=Radio Wave Observation Data +se-rigidity-data=Rigidity data +se-rtg-equipment=Přenosný RTG +se-rtg-equipment-2=Přenosný RTG MK2 +se-scrap=Šrot +se-shear-strength-data=Shear strength data +se-significant-data=Significant Data +se-significant-specimen=Significant Biomass +se-singularity-data=Data singularity +se-space-capsule=Vesmírná kapsle +se-space-mirror=Multispektrální zrcadlo +se-space-platform-plating=Space platform plating +se-space-platform-scaffold=Space platform scaffold +se-space-rail=Vesmírná kolej +se-spaceship-floor=Podlaha vesmírné lodi +se-specimen=Biomasa +se-subatomic-data=Subatomární data +se-superconductivity-data=Data supravodivosti +se-superconductor=Supravodič +se-superconductive-cable=Supravodivý kabel +se-tensile-strength-data=Tensile Strength Data +se-tesla-ammo=Tesla Gun Ammo +se-tesla-gun=Tesla Gun +se-thruster-suit=Skafandr +se-thruster-suit-2=Skafandr MK2 +se-thruster-suit-3=Skafandr MK3 +se-thruster-suit-4=Skafandr MK4 +se-timespace-anomaly-data=Data časoprostorové anomálie +se-used-lifesupport-canister=Použitá nádoba podpory života +se-uv-observation-data=Data pozorování UV +se-visible-observation-data=Visible Observation Data +se-vitamelange=Vitamelanže +se-vitamelange-nugget=Hrudka vitamelanže +se-vitamelange-roast=Vitamelange roast +se-vitamelange-spice=Vitamelange spice +se-vitamelange-extract=Vitamelange extract +se-vulcanite=Vulkanit +se-vulcanite-crushed=Drcený vulkanit +se-vulcanite-washed=Promytý vulkanit +se-vulcanite-block=Vulkanitový blok +se-vulcanite-ion-exchange-beads=Cation Ion Exchange Beads +se-water-ice=Vodní led +se-xray-observation-data=Data pozorování rentgenových paprsků +se-zero-point-energy-data=Zero Point Energy Data +se-rocket-science-pack=Raketový vědecký balíček +space-science-pack=Optimalizační vědecký balíček +speed-module-4=Modul rychlosti 4 +speed-module-5=Modul rychlosti 5 +speed-module-6=Modul rychlosti 6 +speed-module-7=Modul rychlosti 7 +speed-module-8=Modul rychlosti 8 +speed-module-9=Modul rychlosti 9 +se-aeroframe-pole=Nosníková tyč +se-aeroframe-scaffold=Nosníkové lešení +se-aeroframe-bulkhead=Nosníková přepážka +se-lattice-pressure-vessel=Tlaková komora +se-heavy-girder=Těžký nosník +se-heavy-bearing=Těžké ložisko +se-heavy-composite=Těžký kompozit +se-heavy-assembly=Těžký mechanismus +se-bioscrubber=Biologická komora +se-vitalic-epoxy=Vitální pryskyřice +se-vitalic-reagent=Vitální reagent +se-vitalic-acid=Vitální kyselina +se-self-sealing-gel=Samo-záplatový gel +se-holmium-cable=Holmiový kabel +se-holmium-solenoid=Holmiový solenoid +se-quantum-processor=Kvantový procesor +se-dynamic-emitter=Dynamický zářič +se-naquium-processor=Naquiuový procesor +se-naquium-cube=Naquiová kostka +se-naquium-tessaract=Naquiový teserakt +se-wide-beacon=Maják s dlouhým dosahem +se-wide-beacon-2=Maják s dlouhým dosahem 2 +se-lifesupport-equipment-1=Vybavení podpory života MK1 +se-lifesupport-equipment-2=Vybavení podpory života MK2 +se-lifesupport-equipment-3=Vybavení podpory života MK3 +se-lifesupport-equipment-4=Vybavení podpory života MK4 +se-naquium-heat-pipe=Naquiové tepelné potrubí +se-naquium-heat-pipe-horizontal=Horizontální naquiové tepelné potrubí +se-naquium-heat-pipe-vertical=Vertikální naquiové tepelné potrubí +se-naquium-heat-pipe-long=Dlouhé naquiové tepelné potrubí __1__ +se-deep-space-transport-belt=Transportní pás hlubokého vesmíru +se-deep-space-transport-belt-black=Černý transportní pás hlubokého vesmíru +se-deep-space-transport-belt-white=Bílý transportní pás hlubokého vesmíru +se-deep-space-transport-belt-red=Červený transportní pás hlubokého vesmíru +se-deep-space-transport-belt-yellow=Žlutý transportní pás hlubokého vesmíru +se-deep-space-transport-belt-green=Zelený transportní pás hlubokého vesmíru +se-deep-space-transport-belt-cyan=Tyrkysový transportní pás hlubokého vesmíru +se-deep-space-transport-belt-blue=Modrý transportní pás hlubokého vesmíru +se-deep-space-transport-belt-magenta=Růžový transportní pás hlubokého vesmíru +se-deep-space-underground-belt=Podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-black=Černý podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-white=Bílý podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-red=Červený podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-yellow=Žlutý podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-green=Zelený podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-cyan=Tyrkysový podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-blue=Modrý podzemní pás hlubokého vesmíru +se-deep-space-underground-belt-magenta=Růžový podzemní pás hlubokého vesmíru +se-deep-space-splitter=Rozdělovač hlubokého vesmíru +se-deep-space-splitter-black=Černý rozdělovač hlubokého vesmíru +se-deep-space-splitter-white=Bílý rozdělovač hlubokého vesmíru +se-deep-space-splitter-red=Červený rozdělovač hlubokého vesmíru +se-deep-space-splitter-yellow=Žlutý rozdělovač hlubokého vesmíru +se-deep-space-splitter-green=Zelený rozdělovač hlubokého vesmíru +se-deep-space-splitter-cyan=Tyrkysový rozdělovač hlubokého vesmíru +se-deep-space-splitter-blue=Modrý rozdělovač hlubokého vesmíru +se-deep-space-splitter-magenta=Růžový rozdělovač hlubokého vesmíru +se-blueprint-registration-point=Blueprint Registration Point +se-arcosphere=Arkosféra +se-arcosphere-a=λ Arkosféra Lambda +se-arcosphere-b=ξ Arkosféra Ksí +se-arcosphere-c=ζ Arkosféra Zéta +se-arcosphere-d=θ Arkosféra Théta +se-arcosphere-e=ε Arkosféra Epsilon +se-arcosphere-f=φ Arkosféra Fí +se-arcosphere-g=γ Arkosféra Gama +se-arcosphere-h=ω Arkosféra Omega +se-arcosphere-collector=Sběrač arkosfér +se-star-probe=Hvězdná sonda +se-belt-probe=Sonda pásu asteroidů +se-void-probe=Mezihvězdná sonda +se-star-probe-data=Data hvězdné sondy +se-belt-probe-data=Data sondy pásu asteroidů +se-void-probe-data=Data mezihvězdné sondy +se-nano-engineering-data=Data nanoinženýrství +se-annihilation-data=Anihilační data +se-naquium-structural-data=Naquiová strukturální data +se-hyperlattice-data=Data hypermřížky +se-naquium-energy-data=Data energie naquia +se-space-fold-data=Data skládání prostoru +se-space-warp-data=Data zakřivování prostoru +se-space-dialation-data=Data dilatace prostoru +se-space-injection-data=Data injekce prostoru +se-interstellar-data=Data mezihvězdných cest +se-teleportation-data=Teleportační data +se-wormhole-data=Data červích děr +se-rhga-data=Data analýzy hypergrafu reality +se-deep-catalogue-1=Katalog hlubokého vesmíru +se-deep-catalogue-2=Obecný katalog hlubokého vesmíru +se-deep-catalogue-3=Rozsáhlý katalog hlubokého vesmíru +se-deep-catalogue-4=Rozšířený katalog hlubokého vesmíru +se-space-probe-rocket=Raketa vesmírné sondy +se-space-probe-rocket-deployed=Raketa vesmírné sondy (Vypuštěna) + +[item-description] +automation-science-pack=Používá se v základních laboratořích pro výzkum. +chemical-science-pack=Používá se v základních laboratořích pro výzkum. +logistic-science-pack=Používá se v základních laboratořích pro výzkum. +military-science-pack=Používá se v základních laboratořích pro výzkum. +production-science-pack=Používá se v základních laboratořích pro výzkum. +satellite=Satelit by měl být vložen do satelitního raketového sila. +se-antimatter-canister=Nejhustší forma energie v nádobě, která je bezpečná pro přenos. +se-astronomic-science-pack-1=Používá se ve vesmírných laboratořích pro výzkum. +se-astronomic-science-pack-2=Používá se ve vesmírných laboratořích pro výzkum. +se-astronomic-science-pack-3=Používá se ve vesmírných laboratořích pro výzkum. +se-astronomic-science-pack-4=Používá se ve vesmírných laboratořích pro výzkum. +se-beryllium-ore=Berylliová ruda +se-biological-science-pack-1=Používá se ve vesmírných laboratořích pro výzkum. +se-biological-science-pack-2=Používá se ve vesmírných laboratořích pro výzkum. +se-biological-science-pack-3=Používá se ve vesmírných laboratořích pro výzkum. +se-biological-science-pack-4=Používá se ve vesmírných laboratořích pro výzkum. +se-canister=Mnohoúčelová uzavíratelná nádoba +se-cargo-rocket-cargo-pod=Součást sekcí nákladní rakety. +se-cargo-rocket-fuel-tank=Součást sekcí nákladní rakety. +se-cargo-rocket-section=Klíčová součást nákladní rakety. Vložte do nákladního raketového sila. Pro stavbu rakety je nutno dodat 100 takových sekcí. Můžou být navráceny z přistání raket (v základu 20% šance). +se-cargo-rocket-section-packed=Sekce nákladní rakety sbalené pro převoz. Před použitím ke stavbě rakety musí být rozbaleny. +se-bloater-ammo=Tvoří infekční louži na zemi. Nakažení nepřátelé se nadýmají, což jim stěžuje pohyb, a zároveň je poškozuje. Pokud zemřou při nadýmání, vybuchnout, a jejich letící vnitřnosti poškodí nepřátele v blízkosti, a potenciálně tak spustí řetězovou reakci. Celkové poškození projektilů je 50% maximálních životů. +se-pheromone-ammo=Zmate kousače či plivače, kteří si poté budou myslet, že jste jejich přátelé, a jejich vlastní příbuzní nepřátelé. +se-cryogun=Tvoří ledovou zeď, která dokáže zmrazit nepřátele. +se-deep-space-science-pack=Používá se ve vesmírných laboratořích pro výzkum. +se-energy-science-pack-1=Používá se ve vesmírných laboratořích pro výzkum. +se-energy-science-pack-2=Používá se ve vesmírných laboratořích pro výzkum. +se-energy-science-pack-3=Používá se ve vesmírných laboratořích pro výzkum. +se-energy-science-pack-4=Používá se ve vesmírných laboratořích pro výzkum. +se-heat-shielding=Kombinovaný panel, aplikovatelný při vysokých teplotách a ve vesmírných strukturách. +se-holmium-ore=Holmiová ruda +se-iridium-ore=Iridiová ruda +se-material-science-pack-1=Používá se ve vesmírných laboratořích pro výzkum. +se-material-science-pack-2=Používá se ve vesmírných laboratořích pro výzkum. +se-material-science-pack-3=Používá se ve vesmírných laboratořích pro výzkum. +se-material-science-pack-4=Používá se ve vesmírných laboratořích pro výzkum. +se-medpack=Používá se k léčbě zranění. +se-medpack-2=Používá se k léčbě zranění. +se-medpack-3=Používá se k léčbě zranění. +se-medpack-4=Používá se k léčbě zranění. +se-meteor-defence=Může bránit celou planetu před meteory, ale střílet jen na jeden najednou. Vyžaduje proti-meteorovou munici a plné nabití. 80% přesnost. Potřebuje nabití po každém výstřelu. Při nabíjení spotřebovává 20MW. +se-meteor-defence-ammo=Ničí meteority. Musí být nabity do zařízení pro obranu před meteory. +se-meteor-point-defence=Brání oblast před meteory. Dokáže vystřelit až na 4 meteory najednou. Vyžaduje proti-meteorovou munici a plné nabití. Dosah 64, 50% přesnost, po výstřelu je nutná doba k nabití. +se-meteor-point-defence-container=Ničí meteority. Must be loaded into a meteor point defence structure. +se-naquium-ore=Naquiová ruda. Vyskytuje se pouze v hlubokém vesmíru, poklad mezihvězdné prázdnoty. +se-rocket-launch-pad-silo-dummy-ingredient-item=Vyrobena ze 100 sekcí nákladní rakety a 1 vesmírné kapsle v nákladním raketovém silu. +se-rtg-equipment=Radioizotopový termoelektrický generátor. Přenosný generátor, který konvertuje teplo z radioaktivního rozpadu na elektrickou energii. Vydrží funkční po desetiletí bez jakéhokoli dalšího paliva. +se-rtg-equipment-2=Radioizotopový termoelektrický generátor MK2. Vylepšený přenosný generátor, který konvertuje teplo z radioaktivního rozpadu na elektrickou energii. Vydrží funkční po desetiletí bez jakéhokoli dalšího paliva. +se-plague-bomb=Dokáže zničit všechen život na celé planetě. Užívejte s extrémní opatrností. (Může velmi snížit UPS, protože vše postupně umírá, nedoporučujeme pro velké planety či při hře více hráčů.) +se-space-capsule=Kontrolní kapsle vyžadována pro nákladní rakety. Může být využita k návratu pasažérů zpět na nejbližší planetární povrch. Nasedněte do kapsle pomocí __CONTROL__toggle-driving__. +se-space-platform-plating=[font=default-bold][color=#f5cb48]Omezení umístění: Vesmír[/color][/font]\nPokročilé plátování umožňuje rychlejší pohyb po vesmírné platformě. +se-space-platform-scaffold=[font=default-bold][color=#f5cb48]Omezení umístění: Vesmír[/color][/font]\nZákladní lešení vesmírné platformy, které vám dovolí umístit různé struktury ve vesmíru. +se-space-rail=Koleje, které jsou bezpečné pro použití ve vesmíru, protože zabraňují vlakům v odplutí a zničení všeho, co budujete. Mohou být také využity na zemi z estetických důvodů. +se-spaceship-floor=Tato podlaha musí být pod všemi částmi vesmírné lodi, a musí mít zdi vesmírné lodi na vnějším okraji. Jakékoli mezery v podlaze zničí uzavření, a tyto sekce by se mohly oddělit. +se-superconductive-cable=Kabel ze supravodivé směsi, který nevyžaduje aktivní chlazení. +se-tesla-gun=Rapid-fire chain-lightning. +se-thruster-suit=Skafandr nezbytný pro pobyt ve vesmíru. \nMá trysky a magnetické boty. +se-thruster-suit-2=Skafandr nezbytný pro pobyt ve vesmíru. \nMá silnější trysky, zvětšuje inventář, a má větší mřížku na vybavení. +se-thruster-suit-3=Skafandr nezbytný pro pobyt ve vesmíru. \nMá silnější trysky, zvětšuje inventář, a má větší mřížku na vybavení. +se-thruster-suit-4=Skafandr nezbytný pro pobyt ve vesmíru. \nMá silnější trysky, zvětšuje inventář, a má větší mřížku na vybavení. +space-science-pack=Používá se k vylepšení mnoha existujících předmětů. +se-rocket-science-pack=Používá se ve vesmírných laboratořích pro výzkum. Musí být vyrobeny ve vesmíru. +utility-science-pack=Používá se v základních laboratořích pro výzkum. +beacon=8 slotů na moduly. Přenáší účinky modulů blízkým přátelským entitám ve vzdálenosti 3. Více majáků ovlivňující stejnou entitu způsobí její přetížení a zastavení operování. +se-wide-beacon=15 slotů na moduly. Přenáší účinky modulů blízkým přátelským entitám ve vzdálenosti 14. Více majáků ovlivňující stejnou entitu způsobí její přetížení a zastavení operování. +se-wide-beacon-2=20 slotů na moduly. Přenáší účinky modulů blízkým přátelským entitám ve vzdálenosti 14. Více majáků ovlivňující stejnou entitu způsobí její přetížení a zastavení operování. +se-lifesupport-equipment-1=Zvyšuje účinnost podpory života o +100% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. +se-lifesupport-equipment-2=Zvyšuje účinnost podpory života o +200% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. +se-lifesupport-equipment-3=Zvyšuje účinnost podpory života o +400% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. +se-lifesupport-equipment-4=Zvyšuje účinnost podpory života o +800% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. +se-delivery-cannon=Umožňuje přesnou dodávku nákladu pomocí dodávkového děla. +se-arcosphere=Získána z výzkumu Arkosfér, sebrána pomocí Informatrona. +se-deep-catalogue-1=Naquium a nanoinženýrství. +se-deep-catalogue-2=Hypermřížkové struktury, singularity a anihalace. +se-deep-catalogue-3=Distorce mikroprostoru a extradimenzionální nanoinženýrství. +se-deep-catalogue-4=Distorce makroprostoru a extradimenzionální cestování. +se-arcosphere-collector=Sbírá arkosféry z mezihvězdné prázdnoty. Musí být vypuštěn z raketového sila vesmírné sondy, které se nalézá v poli asteroidů. Arkosféry se těžko hledají. +se-star-probe=Sbírá data o hvězdách a produkuje [img=item/se-star-probe-data] Data hvězdné sondy. Musí být vypuštěna z raketového sila vesmírné sondy, které se nalézá v blízkosti orbity hvězdy. +se-belt-probe=Sbírá data o pásech asteroidů a produkuje [img=item/se-belt-probe-data] Data sondy pásů asteroidů. Musí být vypuštěna z raketového sila vesmírné sondy, které se nalézá v pásu asteroidů. +se-void-probe=Sbírá data o mezihvězdné prázdnotě a produkuje [img=item/se-void-probe-data] Data mezihvězdné sondy. Musí být vypuštěna z raketového sila vesmírné sondy, které se nalézá v poli asteroidů. +se-delivery-cannon-weapon=Umožňuje přesnou dodávku speciální munice pomocí tzv. zbraňového dodávkového děla. + +[recipe-name] +se-distortion-drive=Distorční pohon +core-fragment=Zpracování fragmentů jádra (__1__) +rocket-fuel=Pevné raketové palivo +se-astrometric-analysis-multispectral-1=Multispektrální astrometrická analýza 1 +se-astrometric-analysis-multispectral-2=Multispektrální astrometrická analýza 2 +se-astrometric-analysis-multispectral-3=Multispektrální astrometrická analýza 3 +se-astronomic-insight-1=Astronomické pochopení +se-astronomic-insight-2=Obecné astronomické pochopení +se-astronomic-insight-3=Rozsáhlé astronomické pochopení +se-astronomic-insight-4=Rozšířené astronomické pochopení +se-biological-insight-1=Biologické pochopení +se-biological-insight-2=Obecné biologické pochopení +se-biological-insight-3=Rozsáhlé biologické pochopení +se-biological-insight-4=Rozšířené biologické pochopení +se-bio-methane-to-crude-oil=Biozpracování methanu na surovou ropu +se-bio-sludge-crude-oil=Biobahno z experimentální biomasy +se-bio-sludge-decontamination=Dekontaminace biobahna +se-bio-sludge-from-fish=Biobahno z ryb +se-bio-sludge-from-wood=Biobahno ze dřeva +se-bio-sludge-from-vitamelange=Biobahno z vitamelanže +se-bio-sludge=Biobahno z biomasy +se-broken-data-scrapping=Šrotování zničené datové karty +se-cargo-rocket-section-pack=Balení sekcí nákladní rakety +se-cargo-rocket-section-unpack=Rozbalování sekcí nákladní rakety +se-condenser-turbine-reclaim-water=Výroba energie s návratem vody +se-core-fragment-omni=Zpracování fragmentů jádra +se-core-mining=Těžba jádra +se-empty-antimatter-canister=Proud antihmoty z nádoby +se-empty-barrel-scrapping=Šrotování prázdného barelu +se-empty-barrel-reprocessing=Recyklace prázdného barelu +se-space-capsule-scrapping=Šrotování vesmírné kapsle +se-cargo-pod-scrapping=Šrotování nákladního kontejneru +se-energy-insight-1=Energetické pochopení +se-energy-insight-2=Obecné energetické pochopení +se-energy-insight-3=Rozsáhlé energetické pochopení +se-energy-insight-4=Rozšířené energetické pochopení +se-formatting-1=Formátování dat +se-formatting-2=Efektivní formátování dat +se-formatting-3=Pokročilé formátování dat +se-formatting-4=Hluboké formátování dat +se-material-insight-1=Materiální pochopení +se-material-insight-2=Obecné materiální pochopení +se-material-insight-3=Rozsáhlé materiální pochopení +se-material-insight-4=Rozšířené materiální pochopení +se-matter-fusion-copper=Fúze hmoty (Měď) +se-matter-fusion-dirty=Fúze hmoty (Šrot) +se-matter-fusion-iron=Fúze hmoty (Železo) +se-matter-fusion-stone=Fúze hmoty (Kámen) +se-matter-fusion-uranium=Fúze hmoty (Uran) +se-matter-fusion-to=Fúze hmoty (__1__) +se-orbital-data=Data orbitálních výpočtů +se-plasma-canister-empty=Prázdná nádoba na plasmu +se-pulverised-sand=Rozemletý písek +se-radiating-space-coolant-fast=Rychlé chlazení termotekutiny na -10°C +se-radiating-space-coolant-normal=Chlazení termotekutiny na -10°C +se-radiating-space-coolant-slow=Efektivní chlazení termotekutiny na -10°C +se-mixed-methane-gas-separation=Separace směsi methanu +se-rocket-fuel-from-water-copper=Raketové palivo z vody +se-scrap-decontamination=Dekontaminace šrotu +se-scrap-recycling=Recyklace šrotu +se-space-coolant-cold=Chlazení termotekutiny na -100°C +se-space-coolant-supercooled=Superchlazení termotekutiny na -273°C +se-space-coolant-supercooled-cryonite=Krychlazení termotekutiny na -273°C +se-space-coolant-cold-cryonite=Kryochlazení termotekutiny na -100°C +se-space-coolant-supercoole-cryonite=Kryochlazení termotekutiny na -273°C +se-simulation-a=Astronomická simulace +se-simulation-ab=Panspermická simulace +se-simulation-abm=Xenoprogression Simulation +se-simulation-am=Matter Distribution Simulation +se-simulation-as=Astroparticle Simulation +se-simulation-asb=Astrobionic Simulation +se-simulation-asbm=Univerzální simulace +se-simulation-asm=Astrofyzikální simulace +se-simulation-b=Biologická simulace +se-simulation-bm=Biomechanická simulace +se-simulation-m=Materiální simulace +se-simulation-s=Energetická simulace +se-simulation-sb=Biochemická simulace +se-simulation-sbm=Nanitová simulace +se-simulation-sm=Nanomateriálová simulace +se-space-water-decontamination=Dekontaminace kosmické vody +se-spaceship-rocket-engine-burn=Spaluje kapalné raketové palivo +se-specimen-fish=Mikrogravitační chov ryb +se-specimen-wood=Mikrogravitační růst dřeva +se-thermodynamics-coal=Pressure cooking to coal +se-used-lifesupport-canister-cleaning=Čištění nádoby podpory života +se-used-lifesupport-canister-cleaning-space=Dekontaminace nádoby podpory života +space-science-pack=Optimalizační vědecký balíček +se-rocket-science-pack=Raketový vědecký balíček +se-big-turbine-internal=Dekomprese vysokoteplotní páry +se-arcosphere-fracture=Polarizace arkosféry +se-arcosphere-fold-in=Inverze arkosféry +se-arcosphere-fold-out=Inverze arkosféry +se-arcosphere-folding=Skládání arkosféry: __1__ __2__ do __3__ __4__ +se-electric-boiling-void=Evaporation venting +se-space-probe-rocket-deployed=Raketa vesmírné sondy (Vypuštěna) + +[recipe-description] +se-astronomic-insight-2=Komplikovanější, ale surovinově efektivnější. +se-astronomic-insight-3=Komplikovanější, ale surovinově efektivnější. +se-astronomic-insight-4=Komplikovanější, ale surovinově efektivnější. +se-biological-insight-2=Komplikovanější, ale surovinově efektivnější. +se-biological-insight-3=Komplikovanější, ale surovinově efektivnější. +se-biological-insight-4=Komplikovanější, ale surovinově efektivnější. +se-core-mining=Skutečný produkovaný fragment závisí na planetě. Výrobní čas závisí na počtu vrtáků na planetě či měsíci. +se-energy-insight-2=Komplikovanější, ale surovinově efektivnější. +se-energy-insight-3=Komplikovanější, ale surovinově efektivnější. +se-energy-insight-4=Komplikovanější, ale surovinově efektivnější. +se-material-insight-2=Komplikovanější, ale surovinově efektivnější. +se-material-insight-3=Komplikovanější, ale surovinově efektivní. +se-material-insight-4=Komplikovanější, ale surovinově efektivnější. +se-radiating-space-coolant-normal=Opakované chlazení a oteplování termotekutiny způsobuje její degradaci. +se-radiating-space-coolant-slow=Opakované chlazení a oteplování termotekutiny způsobuje její degradaci, pomalejší chlazení vyústí ve zmenšení ztrát. +se-radiating-space-coolant-fast=Opakované chlazení a oteplování termotekutiny způsobuje její degradaci, rychlejší chlazení vyústí ve zvětšení ztrát. +se-arcosphere-fracture=Arkosféry mohou být sbírány pomocí [img=item/se-arcosphere-collector] Sběrače arkosfér +se-delivery-cannon-weapon-pack-se-iridium-piledriver=Neuvěřitelné fyzické poškození v malé oblasti, sekundární výbušné poškození v důsledku tlakové vlny. +se-distortion-drive=Tento proces musí běžet, aby byl Nexus schopen využít schopnosti distorce a vyhrát tak hru. Spotřebovává 8GW energie při kritické rychlosti. + +[technology-name] +effectivity-module-4=Modul efektivity 4 +effectivity-module-5=Modul efektivity 5 +effectivity-module-6=Modul efektivity 6 +effectivity-module-7=Modul efektivity 7 +effectivity-module-8=Modul efektivity 8 +effectivity-module-9=Modul efektivity 9 +energy-shield-equipment=Energetický štít +energy-shield-mk2-equipment=Energetický štít MK2 +energy-shield-mk3-equipment=Energetický štít MK3 +energy-shield-mk4-equipment=Energetický štít MK4 +energy-shield-mk5-equipment=Energetický štít MK5 +energy-shield-mk6-equipment=Energetický štít MK6 +sand-processing=Zpracování písku +glass-processing=Zpracování skla +liquid-rocket-fuel=Kapalné raketové palivo +productivity-module-4=Modul produktivity 4 +productivity-module-5=Modul produktivity 5 +productivity-module-6=Modul produktivity 6 +productivity-module-7=Modul produktivity 7 +productivity-module-8=Modul produktivity 8 +productivity-module-9=Modul produktivity 9 +rocket-silo=Satelitní raketové silo +rocketry=Bojové rakety +se-adaptive-armour=Adaptivní brnění +se-antimatter-engine=Antihmotový motor +se-antimatter-reactor=Antihmotový reaktor +se-antimatter-production=Produkce antihmoty +se-astronomic-science-pack=Astronomický vědecký balíček +se-biological-science-pack=Biologický vědecký balíček +se-condenser-turbine=Kondenzátorová turbína +se-core-miner=Těžba jádra +se-biogun=Biologická puška +se-cryogun=Kryopuška +se-deep-space-science-pack=Vědecký balíček hlubokého vesmíru +se-deep-catalogue=Katalog hlubokého vesmíru +se-dimensional-anchor=Dimenzionální kotva +se-electric-boiler=Elektrický bojler +se-energy-science-pack=Energetický vědecký balíček +se-fluid-burner-generator=Kapalinový izotermní generátor +se-fuel-refining=Rafinérie paliv +se-heat-shielding=Tepelné stínění +se-long-range-star-mapping=Hvězdné mapování na dlouhou vzdálenost +se-material-science-pack=Materiální vědecký balíček +se-medpack=Lékárnička +se-medpack-2=Lékárnička 2 +se-medpack-3=Lékárnička 3 +se-medpack-4=Lékárnička 4 +se-meteor-defence=Zařízení obrany proti meteorům +se-meteor-point-defence=Bodové dělo proti meteorům +se-nanomaterial=Nanomateriál +se-plague=Mor +se-processing-beryllium=Zpracování beryllia +se-processing-cryonite=Zpracování kryonitu +se-processing-holmium=Zpracování holmia +se-processing-iridium=Zpracování iridia +se-processing-naquium=Zpracování naquia +se-processing-vitamelange=Zpracování vitamelanže +se-processing-vulcanite=Zpracování vulkanitu +se-pulveriser=Drtička +se-railgun=Elektromagnetická puška +se-rocket-cargo-safety=Bezpečnost nákladu rakety +se-rocket-fuel-from-water=Raketové palivo z vody +se-rocket-launch-pad=Nákladní raketové silo +se-rocket-landing-pad=Raketová přistávací plocha +se-rocket-reusability=Znovupoužití raket +se-rocket-survivability=Bezpečnost raket +se-rtg-equipment=Přenosný RTG +se-rtg-equipment-2=Přenosný RTG MK2 +se-space-assembling=Vesmírná montovna +se-space-accumulator=Vesmírný akumulátor +se-space-accumulator-2=Vesmírný akumulátor 2 +se-space-astrometrics-laboratory=Astrometrická laboratoř +se-space-biochemical-laboratory=Biochemická laboratoř +se-space-catalogue-astronomic=Astronomický katalog +se-space-catalogue-biological=Biologický katalog +se-space-catalogue-universal=Univerzální katalog +se-space-catalogue-energy=Energetický katalog +se-space-catalogue-material=Materiální katalog +se-space-data-card=Datová karta +se-space-decontamination-facility=Dekontaminační zařízení +se-space-electromagnetics-laboratory=Elektromagnetická laboratoř +se-space-genetics-laboratory=Genetická laboratoř +se-space-gravimetrics-laboratory=Gravimetrická laboratoř +se-space-growth-facility=Růstová laboratoř +se-space-hypercooling=Hyperchlazení +se-space-laser-laboratory=Laserová laboratoř +se-lifesupport-facility=Zařízení podpory života +se-space-manufactory=Vesmírná manufaktura +se-space-material-fabricator=Materiálový fabrikátor +se-space-matter-fusion=Fúze hmoty +se-space-mechanical-laboratory=Mechanická laboratoř +se-space-particle-accelerator=Urychlovač částic +se-space-particle-collider=Srážeč částic +se-space-plasma-generator=Generátor plazmy +se-space-platform-plating=Plátování vesmírné platformy +se-space-platform-scaffold=Základ vesmírné platformy +se-space-radiation-laboratory=Radiační laboratoř +se-space-radiating-efficiency=Efektivita termálního vyzařování +se-space-radiating-speed=Rychlost termálního vyzařování +se-space-radiator=Termální radiátor +se-space-radiator-2=Termální radiátor 2 +se-space-rail=Vesmírné koleje +se-recycling-facility=Recyklační zařízení +se-space-science-lab=Vesmírná vědecká laboratoř +se-space-simulation-ab=Panspermická simulace +se-space-simulation-am=Astromateriální simulace +se-space-simulation-as=Astročásticová simulace +se-space-simulation-bm=Biomechanická simulace +se-space-simulation-sb=Biochemická simulace +se-space-simulation-sm=Nanomateriálová simulace +se-space-simulation-abm=Simulace xenoprogrese +se-space-simulation-asb=Astrobionická simulace +se-space-simulation-asm=Astrofyzikální simulace +se-space-simulation-sbm=Nanitová simulace +se-space-simulation-asbm=Univerzální simulace +se-space-solar-panel=Plochý solární panel +se-space-spectrometry-facility=Spektrometrické zařízení +se-space-supercomputer=Superpočítač +se-space-telescope=Teleskop +se-space-telescope-gammaray=Gammateleskop +se-space-telescope-xray=Rentgenový teleskop +se-space-telescope-microwave=Mikrovlnný teleskop +se-space-telescope-radio=Radioteleskop +se-space-thermodynamics-laboratory=Termodynamická laboratoř +se-spaceship=Vesmírná loď +se-spaceship-integrity=Strukturální integrita vesmírné lodi +se-factory-spaceship=Tovární vesmírná loď +se-superconductive-cable=Supravodivý kabel +se-teleportation=Teleportace +se-tesla-gun=Teslova puška +se-thruster-suit=Skafandr +space-science-pack=Optimalizační vědecký balíček +se-rocket-science-pack=Raketový vědecký balíček +speed-module-4=Modul rychlosti 4 +speed-module-5=Modul rychlosti 5 +speed-module-6=Modul rychlosti 6 +speed-module-7=Modul rychlosti 7 +speed-module-8=Modul rychlosti 8 +speed-module-9=Modul rychlosti 9 +se-aeroframe-pole=Nosníková tyč +se-aeroframe-scaffold=Nosníkové lešení +se-aeroframe-bulkhead=Nosníková přepážka +se-lattice-pressure-vessel=Tlaková komora +se-heavy-girder=Těžký nosník +se-heavy-bearing=Těžké ložisko +se-heavy-composite=Těžký kompozit +se-heavy-assembly=Těžký mechanismus +se-bioscrubber=Biologická komora +se-vitalic-epoxy=Vitální pryskyřice +se-vitalic-reagent=Vitální reagent +se-vitalic-acid=Vitální kyselina +se-self-sealing-gel=Samo-záplatový gel +se-holmium-cable=Holmiový kabel +se-holmium-solenoid=Holmiový solenoid +se-quantum-processor=Kvantový procesor +se-dynamic-emitter=Dynamický zářič +se-naquium-processor=Naquióvý procesor +se-naquium-cube=Naquiová kostka +se-naquium-tessaract=Naquiový teserakt +se-wide-beacon=Maják s dlouhým dosahem +se-wide-beacon-2=Maják s dlouhým dosahem 2 +se-lifesupport-equipment=Vybavení podpory života +se-lifesupport-equipment-1=Vybavení podpory života MK1 +se-lifesupport-equipment-2=Vybavení podpory života MK2 +se-lifesupport-equipment-3=Vybavení podpory života MK3 +se-lifesupport-equipment-4=Vybavení podpory života MK4 +se-supercharger=Supercharger +se-addon-power-pole=Addon power pole +se-pylon=Pylon +se-pylon-substation=Pylonová rozvodna +se-pylon-construction=Konstrukční pylon +se-pylon-construction-radar=Radarový pylon +se-shield-projector=Shield Projector +se-deep-space-transport-belt=Transportní pásy hlubokého vesmíru +se-big-turbine=Vysokoteplotní turbínový generátor +se-big-heat-exchanger=Vysokoteplotní tepelný výměník +se-zone-discovery-random=Objev zóny +se-zone-discovery-targeted=Zaměřený objev zóny +se-zone-discovery-deep=Objev zóny v hlubokém vesmíru +se-delivery-cannon=Dodávkové dělo +se-spaceship-clamp=Dokovací svorky vesmírné lodi +se-bio-upgrade-constitution=Bio-upgrade: Konstituce +se-bio-upgrade-strength=Bio-upgrade: Síla +se-bio-upgrade-agility=Bio-upgrade: Hbitost +se-bio-upgrade-dexterity=Bio-upgrade: Zručnost +se-bio-upgrade-intelligence=Bio-upgrade: Inteligence +se-nexus=Nexus +se-spaceship-victory=Vesmírné vítězství +se-arcosphere=Sběr arkosfér +se-arcosphere-folding=Skládání arkosfér +se-space-probe=Raketové silo vesmírné sondy +se-delivery-cannon-weapon=Zbraňové dodávkové dělo +se-energy-beaming=Energetické paprsky +se-energy-beam-defence=Deštník: zařízení obrany proti energetickým paprskům + +[technology-description] +energy-shield-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +energy-shield-mk2-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +energy-shield-mk3-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +energy-shield-mk4-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +energy-shield-mk5-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +energy-shield-mk6-equipment=Ochranná bublina s velkou rychlostí nabíjení, ale velkou spotřebou energie. +sand-processing=Drcení, mletí, a filtrace surových materiálů na čistý písek. +glass-processing=Tavení písku na sklo. +rocket-silo=Umožňuje vám vyslat satelit na orbitu a odhalit tak nové planety. +se-adaptive-armour=Brnění, které využívá energie k samoopravě. Plní podobnou úlohu jako energetické štíty s nižšími energetickými nároky, ale s mnohem pomalejší regenerací. +se-antimatter-engine=Anihilace antihmoty k produkci neuvěřitelnému tahu. +se-antimatter-reactor=Anihiluje antihmotu hmotou za vývinu extrémního množství tepla. +se-antimatter-production=Produkce antihmoty, nejhustší formy energie. +se-astronomic-science-pack=Umožňuje výzkum technologií souvisejících s cestováním vesmírem a mezihvězdnou logistikou. +se-biological-science-pack=Umožňuje výzkum technologií souvisejících s vašimi fyzickými možnostmi, biologickými zbraněmi, a neurálními výpočty. +se-condenser-turbine=Účinná jen na 75% oproti klasické parní turbíně, ale 99% využité páry je navráceno v podobě vody. +se-core-miner=Umožňuje nekonečnou extrakci surovin z planet a měsíců, ale při použití více zařízení na stejném tělese má snižující se výnosy. +se-biogun=Puška, která využívá různé druhy biologické munice. +se-cryogun=Tvoří ledovou zeď, která dokáže zmrazit nepřátele. +se-deep-catalogue=Distorce prostoru, exotická hmota a data nanoinženýrství strukturovaná pro analýtu a počítačovou simulaci. Vyžadováno pro nejpokročilejší technologie. +se-deep-space-science-pack=Vyžadováno pro nejpokročilejší technologie +se-dimensional-anchor=Využívá gravitačního vlivu hvězdy jako stabilizačního bodu pro prostorovou anomálii. +se-electric-boiler=Produkuje páru z vody pomocí elektrické energie. Má účinnost 90%. +se-energy-science-pack=Umožňuje výzkum technologií souvisejících s fundamentálními silami a subatomárními objevy. +se-fluid-burner-generator=Vyžaduje kapalné palivo s energetickou hodnotou (například kapalné raketové palivo) k produkci elektřiny. Jednoduchý a kompaktní způsob, ale chybí mu efektivita větších, na turbínách založených systémů. Navrženo pro použití ve vesmíru. Spotřeba paliva závisí na energetické hodnotě kapalného paliva. +se-fuel-refining=Rafinace pokročilejších paliv. +se-heat-shielding=Kombinovaný panel, aplikovatelný při vysokých teplotách a ve vesmírných strukturách. +se-long-range-star-mapping=Některé vzdálené galaxie mohou být identifikovány díky specifickým tvarům neobvyklých hvězd. Výsledky jsou zaznamenávány do Informatrona [__CONTROL__informatron__]. +se-material-science-pack=Umožňuje výzkum technologií souvisejících s pokročilými materiály pro pokročilejší technické požadavky. +se-medpack=Používá se k léčbě zranění. +se-medpack-2=Používá se k léčbě zranění. +se-medpack-3=Používá se k léčbě zranění. +se-medpack-4=Používá se k léčbě zranění. +se-meteor-defence=Sestřelte meteory z nebes než vám zničí vaše věci. Zařízení pro obranu před meteory dokáže ubránit celou planetu, ale střílet jen na jeden meteor najednou. +se-meteor-point-defence=Sestřelte meteory z nebes než vám zničí vaše věci. Meteor point defence can protect a small area from up to 4 meteors at a time. +se-nanomaterial=Složité uspořádání různých materiálů organizované v nano měřítku, tvořící kompozit s neuvěřitelnými vlastnostmi. +se-railgun=Elektromagneticky akcelerované šipky letí takovou rychlostí, že než se vypaří, zanechají za sebou plasmu. Vysoké poškození, nízká rychlost palby. +se-plague=Mor, který vyhladil veškerý život z nespočtu planet. Užívejte s extrémní opatrností. +se-processing-beryllium=Zpracování berylu na berillium, extrémně lehký, silný, korozi i radiaci odolávající kov. S rentgenovým zářením nevykazuje téměř žádnou interakci. +se-processing-cryonite=Zpracování zmrzlých krystalů kryonitu na kryonitové tyče, které nacházejí uplatnění ve zmrazování, chlazení a lubrikaci. Kryonit se nachází především na zmrzlých planetách. +se-processing-holmium=Zpracování holminitu na holmium, vzácný kov s nejvyšší magnetickou permeabilitou ze všech prvků. +se-processing-iridium=Zpracování iriditu na iridium, korozi nejodolnější a nejhustší materiál ze všech prvků. Použitelné při extrémní zátěži. +se-processing-naquium=Zpracování tajemných naquititových krystalů z hlubokého vesmíru na naquium, materiál podobný kovům s neobvyklými interakcemi s časoprostorem. +se-processing-vitamelange=Zpracování primitivní vitamelanžové houby na cenný výživný extrakt. +se-processing-vulcanite=Zpracování vulkanitových krystalů na rafinovaný prášek využitelný v tavení, výrobě raketového paliva, a dalších chemických procesech za vysokých teplot. Vulkanit se nachází především na vulkanických planetách, a je obsažen ve většině fragmentů jader. +se-pulveriser=Drtí a mele tvrdší nerosty a fragmenty planetárních jader. +se-rocket-cargo-safety=Snižuje šanci na poškození nákladních kontejnerů o 10% (multiplikativní). +se-rocket-fuel-from-water=Generuje raketové palivo na bázi vodík-kyslík pomocí elektrolýzy. +se-rocket-landing-pad=Umožní vám doručovat náklad na pojmenovanou přistávací plochu. S postupným výzkumem může také umožnit opětovné navrácení částí rakety. +se-rocket-launch-pad=Umožňuje vám zasílat náklad do vesmíru či na jiné planety. +se-rocket-reusability=Zvyšuje počet částí rakety, které jsou navráceny z úspěšného přistání na přistávací ploše o 4% (Základ je 20%, maximální hodnota je 100%). +se-rocket-survivability=Snižuje pravděpodobnost poškození rakety při cestě a taktéž snižuje pravděpodobnost navigačního selhání, které by mohlo vyústit v minutí přistávací plochy, o 10% (multiplikativní). +se-rtg-equipment=Radioizotopový termoelektrický generátor. Přenosný generátor, který konvertuje teplo z radioaktivního rozpadu na elektrickou energii. Vydrží funkční po desetiletí bez jakéhokoli dalšího paliva. +se-rtg-equipment-2=Radioizotopový termoelektrický generátor MK2. Vylepšený přenosný generátor, který konvertuje teplo z radioaktivního rozpadu na elektrickou energii. Vydrží funkční po desetiletí bez jakéhokoli dalšího paliva. +se-space-assembling=Modifikovaná montovna, která dokáže operovat ve vesmíru. +se-space-astrometrics-laboratory=Kombinuje, porovnává, a vyčísluje různé zdroje astronomických informací. +se-space-biochemical-laboratory=Pokročilá chemická laboratoř specializovaná na biochemii. Dokáže také provádět základní chemické procesy a zpracování ropy. +se-space-catalogue-astronomic=Astronomická data strukturovaná pro analýzu a počítačovou simulaci. Vyžadováno pro další astronomický výzkum. +se-space-catalogue-biological=Biologická data strukturovaná pro analýzu a počítačovou simulaci. Vyžadováno pro další biologický výzkum. +se-space-catalogue-universal=Kombinovaná data pro analýzu a počítačovou simulaci. Vyžadováno pro další výzkum hlubokého vesmíru. +se-space-catalogue-energy=Energetická data strukturovaná pro analýzu a počítačovou simulaci. Vyžadováno pro další energetický výzkum. +se-space-catalogue-material=Materiální data strukturovaná pro analýzu a počítačovou simulaci. Vyžadováno pro další materiální výzkum. +se-space-data-card=Víceúčelové datové úložiště. Vyžadováno pro další na datech závislý výzkum. +se-space-decontamination-facility=Čistí substance pro použití ve sterilním prostředí, a připravuje kapaliny pro použití v prostředí s nízkým tlakem. +se-space-electromagnetics-laboratory=Zařízení pro aplikaci intenzivních magnetických polí a extrémně vysokých napětích. +se-space-genetics-laboratory=Laboratoř, která se věnuje genetickému sekvencování, modifikaci, a pěstění kultur. +se-space-gravimetrics-laboratory=Analyzuje a simuluje gravitační vlivy. +se-space-growth-facility=Pěstuje biologické vzorky pod širokou škálou kontrolovaných podmínek, které jsou kdekoli jinde nemožné, například pod vlivem mikrogravitace. +se-space-hypercooling=Provádí výměnu tepla na termokapalině, čímž jednu otepluje a druhou ochlazuje. +se-space-laser-laboratory=Experimentuje s lasery. Musí být chráněny oči. +se-lifesupport-facility=Udržování života v nepřátelském prostředí. +se-space-manufactory=Klíčová technologie pro masovou výrobu ve vesmíru. +se-space-material-fabricator=Syntetizuje nové materiály. Kříženec mezi srážečem částic a 3D tiskárnou. +se-space-matter-fusion=Výroba materiálů pomocí fúze. +se-space-mechanical-laboratory=Poskytuje provedení široké škály mechanických procesů: Drcení, trhání, střihání, vibrace, apod. +se-space-particle-accelerator=Urychluje částice na téměř rychlost světla. +se-space-particle-collider=Sráží vysoko-rychlostní částice a analyzuje výsledky srážky. +se-space-plasma-generator=Generuje řadu druhů plazmy. +se-space-platform-plating=Robustní plátování vesmírné platformy. Hladké, umožňující rychlou chůzi. +se-space-platform-scaffold=Základy vesmírné platformy. Dá se na nich stavět, ale na chůzi nejsou to pravé ořechové. +se-space-radiation-laboratory=Relativně bezpečné místo na hraní s radioaktivním materiálem. Lze využít ke zpracování uranu. +se-space-radiator=Vyzařuje přebytečné teplo z přehřáté termokapaliny. +se-space-radiator-2=Vyzařuje přebytečné teplo z přehřáté termokapaliny. +se-space-radiating=Pomalejší, ale surovinově efektivnější chlazení přehřáté termotekutiny. +se-space-rail=Koleje, které jsou bezpečné pro použití ve vesmíru, protože zabraňují vlakům v odplutí a zničení všeho, co budujete. Mohou být také využity na zemi z estetických důvodů. +se-recycling-facility=Šrotuje předměty a zpracovává šrot na surové materiály. +se-space-science-lab=Umožňuje použití raketových vědeckých balíčků a provádění dalšího pokročilého vesmírného výzkumu. +se-space-simulation-ab=Efektivnější simulace díky kombinaci různých disciplín. +se-space-simulation-am=Efektivnější simulace díky kombinaci různých disciplín. +se-space-simulation-as=Efektivnější simulace díky kombinaci různých disciplín. +se-space-simulation-bm=Efektivnější simulace díky kombinaci různých disciplín. +se-space-simulation-sb=Efektivnější simulace díky kombinaci různých disciplín. +se-space-simulation-sm=Efektivnější simulace díky kombinaci různých disciplín. +se-space-simulation-abm=Efektivnější simulace díky kombinaci různých disciplín. +se-space-simulation-asb=Efektivnější simulace díky kombinaci různých disciplín. +se-space-simulation-asm=Efektivnější simulace díky kombinaci různých disciplín. +se-space-simulation-sbm=Efektivnější simulace díky kombinaci různých disciplín. +se-space-simulation-asbm=Efektivnější simulace díky kombinaci různých disciplín. +se-space-solar-panel=Vysoce efektivní solární panel, po kterém můžete chodit. +se-space-spectrometry-facility=Spektrofotometrie, plynová chromatografie, hmotnostní spektrometrie, a další druhy spektrografie. Fire stuff at a wall, make it bend, see where it hits. +se-space-supercomputer=Umožňuje pokročilejší manipulaci s daty, jejich zpracovávání, a simulace. +se-space-telescope=Sofistikovaný teleskop, citlivý na různé vlnové délky kolem viditelného spektra. +se-space-telescope-gammaray=Gamma paprsky se nelámou. Tento výkonný teleskop místo toho využívá zrcadla a speciální detektory. +se-space-telescope-xray=Rentgenové paprsky jsou blokovány většinou atmosfér. Tento výkonný teleskop byl navržen pro použití ve vesmíru, kde atmosféra nepředstavuje problém. +se-space-telescope-microwave=Obrovský teleskop, schopný detekovat mikrovlny a kosmické mikrovlnné pozadí. +se-space-telescope-radio=Obrovský teleskop, schopný detekovat velmi slabé radiovlny ze vzdálených zdrojů. +se-space-thermodynamics-laboratory=Provádí procesy, které zahrnují extrémní teploty. Dokáže také provádět základní termální procesy, jako například tavení rud. +se-spaceship=Plavidlo, které si sami kousek po kousku postavíte i s podlahou a zdmi, a poté použijete ovládací panel k cestě na jinou planetu a ještě dál. +se-spaceship-integrity=Každá úroveň zvyšuje limit strukturálního stresu na integritu vesmírné lodi o 100. +se-factory-spaceship=Každá úroveň zvyšuje limit strukturálního stresu na integritu vesmírné lodi o 500. +se-superconductive-cable=Kabel ze supravodivé směsi, který nevyžaduje aktivní chlazení. +se-teleportation=Odemyká teleportační technologii. Ukazuje se, že bezpečně deformovat časoprostor v takovém rozsahu je velmi těžké. +se-tesla-gun=Řetězové výboje s vysokou rychlostí palby. Dokáže zasáhnout až 30 nepřátel na jeden výboj. Výboje přeskakují daleko na nepřátele, či na krátkou vzdálenost po zemi, pokud kolem nejsou žádné cíle. +se-thruster-suit=Skafandr s tryskami a magnetickými botami. Bez něj do vesmíru nechoďte. +se-thruster-suit-2=Vylepšený skafandr se silnějšími tryskami, větším inventářem, a větší mřížkou na vybavení. +se-thruster-suit-3=Vylepšený skafandr se silnějšími tryskami, větším inventářem, a větší mřížkou na vybavení. +se-thruster-suit-4=Vylepšený skafandr se silnějšími tryskami, větším inventářem, a větší mřížkou na vybavení. +space-science-pack=Umožňuje přímou výrobu raketových vědeckých balíčků a vývoj technologií které z tohoto výzkumu těží. +se-aeroframe-pole=Silná, ale lehká berylliová tyč, která se obyčejně používá jako podpůrný nosník pro letecký a vesmírný průzkum. +se-aeroframe-scaffold=Silný, ale lehký berylliový strukturální rám, který se obyčejně používá jako hlavní vnitřní kostra pro letecká a vesmírná plavidla. +se-aeroframe-bulkhead=Silná, ale lehká vzduchotěsná berylliová stěna, která se používá jako vnější či primární zdivo v leteckých a vesmírných plavidlech. +se-lattice-pressure-vessel=Silná, ale lehká berylliová tlaková nádrž, která dokáže některé kapaliny stlačit za hranici normálních mezí. Je-li tlaková nádrž roztržena, natlakovaná kapalina je bezpečně odvětrána. +se-heavy-girder=Těžký iridiový strukturální nosník, který se používá v těžkém průmyslu a ve vojenských plavidlech. +se-heavy-bearing=Velké těžké iridiové ložisko, které může fungovat nezávisle na působících silách, které by jiné materiály zničily. +se-heavy-composite=Tlustý, téměř neproniknutelný materiál, prakticky imunní proti teplu, korozi, radiaci a mechanickým vlivům, ale je neuvěřitelně těžký. +se-heavy-assembly=Těžký mechanismus složen z koleček a konfigurovatelných komponentů, který se používá v těžkém průmyslu. +se-bioscrubber=Komora, která využívá biologických procesů k rozkladu nežádoucích materiálů. +se-vitalic-epoxy=Neuvěřitelně silná pryskyřice s regenerativními vlastnostmi. +se-vitalic-reagent=Efektivní víceúčelové činidlo použitelné v široké škále chemických reakcí. +se-vitalic-acid=Koncentrovaný koktejl různých kyseliny. +se-self-sealing-gel=Pod tlakem viskózní gel, ale při vystavení vakuu se stává tvrdým jako ocel. Často se používá jako film v přepážkách k pasivnímu těsnění potenciálních děr. +se-holmium-cable=Opláštěný kabel specificky navržen k eliminaci nechtěného hluku tam, kde by mohl interferovat s citlivou elektronikou. +se-holmium-solenoid=Extrémně silný elektromagnet. +se-quantum-processor=Vužívá superpozic a kvantových provázání k efektivnějším výpočtům velmi složitých problémů. +se-dynamic-emitter=Rychle upravitelný přístroj vyzařující světlo nebo proudy částic, který může měnit vlastnosti k dosažení vyššího dosahu, skenovacího módu, nebo penetraci materiálů. +se-naquium-cube=Využívá neobvyklé interakce naquia s časoprostorem k vměstnání velkého objemu do malé krychle. +se-naquium-tessaract=Podivný objekt, který se usazuje do tvaru krychle, ale dokáže měnit svůj tvar na řadu jiných geometrických objeků pokud je aktivován nebo urychlen. +se-naquium-processor=Výpočty uvnitř naquiového teseraktu obcházejí některé obvyklé limity výpočetní hustoty. +effect-transmission=Přenáší účinky modulů blízkým přátelským entitám ve vzdálenosti 3. 8 slotů na moduly. Více majáků ovlivňující stejnou entitu způsobí její přetížení a zastavení operování. +se-wide-beacon=Přenáší efekt modulů na blízké přátelské entity s pokrytím oblasti o velikosti 32x32. Má 15 slotů na moduly, při vylepšení 20. Více majáků ovlivňující stejnou entitu způsobí její přetížení a zastavení operování. +se-wide-beacon-2=Přenáší efekt modulů na blízké přátelské entity ve vzdálenosti 14. Má 20 slotů na moduly. Více majáků ovlivňující stejnou entitu způsobí její přetížení a zastavení operování. +se-lifesupport-equipment-1=Zvyšuje účinnost podpory života o +100% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. +se-lifesupport-equipment-2=Zvyšuje účinnost podpory života o +200% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. +se-lifesupport-equipment-3=Zvyšuje účinnost podpory života o +800% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. +se-lifesupport-equipment-4=Zvyšuje účinnost podpory života o +1600% (sčítatelné). Při instalaci v jiném brnění než ve skafandru je bonus poloviční, a nefunguje ve vesmíru. +se-supercharger=Dokáže nabíjet až 64 robotů vysokou rychlostí najednou. Maximální spotřeba energie je 1GW. +se-pylon=Distribuuje elektrickou energii. Dosah pro připojení je 64. +se-pylon-substation=Distribuuje elektrickou energii. Dosah pro připojení je 64, pokrývá oblast o velikosti 64x64. +se-pylon-construction=Distribuuje elektrickou energii a rozšiřuje konstrukční oblast. Dosah pro připojení je 64, pokrývá oblast o velikosti 64x64. +se-pylon-construction-radar=Distribuuje elektrickou energii, rozšiřuje konstrukční oblast a poskytuje radarovou vizi. Dosah pro připojení je 64, pokrývá a odhaluje oblast o velikosti 256x256. +se-shield-projector=Vytváří ochranné silové pole. Spotřebovává více energie pokud se nabijí, nebo pokud je štít pod náporem. Pokud máte nainstalovanou modifikaci "Walls Block Spitters", dokáže blokovat projektily plivačů. +se-deep-space-transport-belt=Rychlé dálkové dopravní pásy, které mohou být použity ve vesmíru. Různé barvy mohou být použity k jednoduchému rozeznání z dálky. +se-big-turbine=Velký 1GW generátor, který přijímá páru o 5000°C, odevzdává páru o 500°C na druhém konci, a vydává vodu po stranách. Energeticky efektivní na 99%, vodu spořící na 99%. +se-big-heat-exchanger=Velký tepelný výměník navržený pro vysoké teploty a velkou kapacitu. +se-addon-power-pole=Malý elektrický sloup, který byl navržen k připojení na budovy a nebo pro precizní kontrolu elektrického pokrytí. +se-zone-discovery-random=Hledá planety, měsíce a pásy asteroidů pomocí teleskopů. +se-zone-discovery-targeted=Hledá planety, měsíce a pásy asteroidů se zaměřením na určitou surovinu. Zaměření na surovinu vyberte v Informatronu > Objev zón. +se-zone-discovery-deep=Hledá zajímavé oblasti v hlubokém vesmíru. Pásy asteroidů mohou ukrývat spoustu unikátních a cenných surovin. +se-delivery-cannon=Kolejnicové dělo schopné vystřelit náklad na orbitu a ještě dál, a truhla k zachycení nákladu. +se-spaceship-clamps=Umožňuje položit dokovací svorky k zakotvení vesmírné lodi. Automatizace vyžaduje signály "Zakotvit pomocí" a "Zakotvit k" vložené do ovládacího panelu. +se-bio-upgrade-constitution=Zvyšuje maximální zdraví. +se-bio-upgrade-strength=Zvyšuje nosnost. +se-bio-upgrade-agility=Zvyšuje rychlost pohybu. +se-bio-upgrade-dexterity=Zvyšuje rychlost výroby. +se-bio-upgrade-intelligence=Zvyšuje výnos z každého použitého vědeckého balíčku. +se-nexus=Zařízení, které může být aktivováno na pohybující se vesmírné lodi v mezihvězdném prostoru k produkci dat, a s dostatečně pokročilými technologiemi dokáže vytvořit pole prostorového zakřivení (Vesmírné vítězství) +se-spaceship-victory=Umožňuje Nexusu aktivaci distorčního pohonu k úniku z lokální hvězdokupy. Instalujte Nexus v módu distorčního pohonu na vesmírné lodi o integritě vyšší než 3000, a udržte ji v pohybu s rychlostí 250 po dobu 60 sekund k vítězství. +se-arcosphere=Umožňuje sběr arkosfér ztracených v mezihvězdné prázdnotě. +se-arcosphere-folding=Umožňuje použití arkosfér jako extradimenzionální svorky. +se-space-probe=Vesmírné raketové silo užívané pro vypouštění vesmírných sond. Může být také použito k levnému vypouštění satelitů. +se-delivery-cannon-weapon=Velké elektromagnetické dělo schopné vystřelení speciální munice, jako například atomových bomb, na jiné povrchy. +se-energy-beaming=Intenzivní energetický paprsek, který může být použit jako zbraň, nebo k přenosu energie na jiné povrchy. +se-energy-beam-defence=Obrana proti zbraním na bázi energetických paprsků a proti výronům koronální hmoty. Uspořádává magnetické částice do ochranné bubliny, a poté je využije k rozptýlení nebezpečného paprsku. + +[modifier-description] +tesla-shooting-speed-bonus=Rychlost střelby Teslovy pušky +tesla-damage-bonus=Bonus poškození Teslovy pušky +railgun-damage-bonus=Bonus poškození elektromagnetické pušky +railgun-shooting-speed-bonus=Rychlost střelby elektromagnetické pušky +cryogun-shooting-speed-bonus=Rychlost střelby kryopušky +cryogun-damage-bonus=Bonus poškození kryopušky +character-running-speed=Rychlost pohybu postavy: +__1__ +character-crafting-speed=Rychlost výroby postavy: +__1__ + +[virtual-signal-name] +signal-speed=Signál rychlosti +se-signal-speed=Signál rychlosti +signal-distance=Signál vzdálenosti +se-signal-distance=Signál vzdálenosti +se-star=Hvězda +se-planet=Planeta +se-planet-orbit=Orbita planety +se-moon=Měsíc +se-moon-orbit=Orbita měsíce +se-asteroid-belt=Pás asteroidů +se-asteroid-field=Pole asteroidů +se-anomaly=Anomálie +se-meteor=Meteor +se-spaceship=Vesmírná loď +se-cargo-rocket=Nákladní raketa +se-remote-view=Dálkové zobrazení +se-death=Smrt +se-character-corpse=Mrtvola +se-accolade=Accolade +se-remove=Odstranit +se-radius=Poloměr +se-hierarchy=Hierarchie +se-spaceship-launch=Start vesmírné lodi +se-anchor-using-left-clamp=Zakotvit pomocí levé svorky vesmírné lodi +se-anchor-using-right-clamp=Zakotvit pomocí pravé svorky vesmírné lodi +se-anchor-to-left-clamp=Zakotvit k levé cílové svorce +se-anchor-to-right-clamp=Zakotvit k pravé cílové svorce +se-beacon-overload=Přetížení majáku + +[controls] +se-remote-view=Navigační satelit +se-universe-explorer=Prohlížeč vesmíru +se-respawn=Znovuzrodit + +[shortcut] +se-remote-view=Navigační satelit +se-universe-explorer=Prohlížeč vesmíru +se-respawn=Znovuzrodit + +[shortcut-name] +se-remote-view=Navigační satelit [__CONTROL__se-remote-view__] +se-universe-explorer=Prohlížeč vesmíru [__CONTROL__se-remote-view__] +se-respawn=Znovuzrodit [__CONTROL__se-respawn__] + +[tile-name] +se-space-platform-plating=Plátování vesmírné platformy +se-space-platform-scaffold=Základ vesmírné platformy +se-space-platform-underlay=Space +se-space-platform-underlay-l=Space +se-space-platform-underlay-r=Space +se-space=Empty Space +se-regolith=Regolit +se-asteroid=Asteroid +se-spaceship-floor=Podlaha vesmírné lodi + +[mod-setting-name] +se-meteor-interval=Interval mezi meteory +se-plage-max-runtime=Maximální runtime moru +se-planets=Počet planet +se-planet-size=Velikost planet (1% to 10000%) +se-seed=Generační kód planet +se-skip-experimental-warning=Přeskočit experimentální varování +se-print-meteor-info=Vypisovat varování o meteorech do konzole +se-space-pipe-capacity=Kapacita vesmírných trubek +se-electric-boiler=Elektický bojler +se-deep-space-belt-speed=Rychlost pásů hlubokého vesmíru +se-deep-space-belt-black=Černé pásy hlubokého vesmíru +se-deep-space-belt-white=Bílé pásy hlubokého vesmíru +se-deep-space-belt-red=Červené pásy hlubokého vesmíru +se-deep-space-belt-yellow=Žluté pásy hlubokého vesmíru +se-deep-space-belt-green=Zelené pásy hlubokého vesmíru +se-deep-space-belt-cyan=Tyrkysové pásy hlubokého vesmíru +se-deep-space-belt-blue=Modré pásy hlubokého vesmíru +se-deep-space-belt-magenta=Růžové pásy hlubokého vesmíru +se-space-science-pack=Ustoupení vesmírného vědeckého balíčku +se-never-show-lifesupport=Nikdy neukazovat rozhraní podpory života +se-show-zone-preview=Ukazovat okno náhledu zóny +se-pylon-charge-points=Nabíjecí kapacita konstrukčního pylonu +se-show-overhead-button-satellite-mode=Ukazovat horní tlačítko Uplinku navigačního satelitu +se-show-overhead-button-interstellar-map=Ukazovat horní tlačítko mezihvězdné mapy +se-show-overhead-button-universe-explorer=Ukazovat horní tlačítko prohlížeče vesmíru +se-cmes-max-frequency=Maximální interval mezi výrony koronální hmoty + +[mod-setting-description] +se-meteor-interval=Základní interval v minutách mezi dopady meteorů. Interval je náhodný v minutách od 1 do této hodnoty. +se-plage-max-runtime=Maximální doba fungování biologické zbraně v minutách. Jakmile bude mor fungovat po tuto dobu, všechny morové efekty, stromy a nepřátelé budou zničeny. +se-planets=Neměňte v průběhu hry. +se-planet-size=Neměňte v průběhu hry. +se-seed=Neměňte v průběhu hry. +se-skip-experimental-warning=Varování na začátku hry se nebude objevovat, a nebudete dostávat aktualizované zprávy. +se-print-meteor-info=Umožňuje vám vidět varování o meteorech v konzoli i poté, co originální varování zmizí, stiskněte __CONTROL__toggle-console__. +se-space-pipe-capacity=Kapalinová kapacita vesmírných trubek. +se-electric-boiler=Přidat elektrický bojler do hry +se-deep-space-belt-speed=Pásy hlubokého vesmíru by měly být ty nejrychlejší. Pokud máte jiné modifikace, které přidávají rychlejší pásy, změňte rychlost těchto na stejnou nebo vyšší. +se-deep-space-belt-black=Černé transportní pásy, rozdělovače a podzemní pásy mohou být vypnuty, aby se zamezilo přehlcení výrobního rozhraní. +se-deep-space-belt-white=Bílé transportní pásy, rozdělovače a podzemní pásy mohou být vypnuty, aby se zamezilo přehlcení výrobního rozhraní. +se-deep-space-belt-red=Červené transportní pásy, rozdělovače a podzemní pásy mohou být vypnuty, aby se zamezilo přehlcení výrobního rozhraní. +se-deep-space-belt-yellow=Žluté transportní pásy, rozdělovače a podzemní pásy mohou být vypnuty, aby se zamezilo přehlcení výrobního rozhraní. +se-deep-space-belt-green=Zelené transportní pásy, rozdělovače a podzemní pásy mohou být vypnuty, aby se zamezilo přehlcení výrobního rozhraní. +se-deep-space-belt-cyan=Tyrkysové transportní pásy, rozdělovače a podzemní pásy mohou být vypnuty, aby se zamezilo přehlcení výrobního rozhraní. +se-deep-space-belt-blue=Modré transportní pásy, rozdělovače a podzemní pásy mohou být vypnuty, aby se zamezilo přehlcení výrobního rozhraní. +se-deep-space-belt-magenta=Růžové transportní pásy, rozdělovače a podzemní pásy mohou být vypnuty, aby se zamezilo přehlcení výrobního rozhraní. +se-space-science-pack=Pokud jiná modifikace přidává cestu jak dosáhnout vesmírné vědy, bude použita tato možnost. Pokud neexistuje takový způsob, Space Exploration tento balíček smaže, nebo ho použije jako Optimalizační vědecký balíček. +se-never-show-lifesupport=Pokud zaškrtnete, nikdy se vám nebude ukazovat rozhraní podpory života, dokonce ani když se budete dusit. +se-show-zone-preview=Nezaškrtávejte, pokud chcete vypnout náhled na zónu v Prohlížeči vesmíru. Pokud máte aktivní nějaký debug overlay, náhledy na zónu mohou snižovat FPS. +se-pylon-charge-points=Nezaškrtávejte k odstranění nabíjecí kapacity konstrukčního pylonu. To pomůže v kontrole chování robotů, ale možná budete muset vymyslet jiný způsob nabíjení robotů po dlouhých cestách. +se-show-overhead-button-satellite-mode=Ukazovat tlačítko navigačního satelitu v levém horním rohu. +se-show-overhead-button-interstellar-map=Ukazovat tlačítko mezihvězdné mapy v levém horním rohu. +se-show-overhead-button-universe-explorer=Ukazovat tlačítko prohlížeče vesmíru v levém horním rohu. +se-cmes-max-frequency=Maximální interval mezi výrony koronální hmoty v hodinách. Při hodnotě 0 jsou výrony vypnuty. První výron zažijete v prvních minutách hry, ale je většinou neškodný. Druhý přijde zhruba do 48 hodin. Prodleva mezi výrony se pohybuje mezi 50% a 100% maximálního intervalu. Nenulová hodnota se aplikuje pouze na nové události; jakmile je známá doba "příletu", nelze ji ovlivnit. Nulová hodnota zruší všechny plánované výrony, ale může pár minut trvat, než změna nastane. + + +[string-mod-setting] +se-space-science-pack-Remove=Kompletně odstranit +se-space-science-pack-Replace=Vyměnit za raketový vědecký balíček +se-space-science-pack-OptimisationUranium=Optimalizace: Kryo-uranový recept +se-space-science-pack-OptimisationFish=Optimalizace: Vita-vulka-rybí recept + +[autoplace-control-names] +planet-size=Velikost planet +se-water-ice=Vodní led (pouze ve vesmíru) +se-methane-ice=Methanový led (pouze ve vesmíru) +se-cryonite=Kryonit (nevyskytuje se na domovské planetě) +se-vulcanite=Vulkanit (nevyskytuje se na domovské planetě) +se-vitamelange=Vitamelanž (nevyskytuje se na domovské planetě) +se-beryllium-ore=Berylliová ruda (nevyskytuje se na domovské planetě) +se-holmium-ore=Holmiová ruda (nevyskytuje se na domovské planetě) +se-iridium-ore=Iridiová ruda (nevyskytuje se na domovské planetě) +se-naquium-ore=Naquiová ruda (pouze ve vesmíru) + +[map-gen-preset-name] +space-exploration=Základní Space Exploration + +[map-gen-preset-description] +space-exploration=Základní nastavení pro Space Exploration diff --git a/space-exploration_0.5.58/space-exploration/locale/de/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/de/strings.cfg new file mode 100644 index 0000000..07caabc --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/de/strings.cfg @@ -0,0 +1,964 @@ +spaceship-integrity100=+100 Raumschiff strukturelle Integrität +spaceship-integrity300=+300 Raumschiff strukturelle Integrität +spaceship-integrity500=+500 Raumschiff strukturelle Integrität +core-mining-productivity-5=+5% Kernabbauproduktivität + +[space-exploration] +rename-something=Umbenennen __1__ +trigger-none=Kein (Manuell) +trigger-fuel-full=Start wenn Treibstoff voll +trigger-cargo-full=Start wenn Fracht voll +trigger-fuel-full-signal=Start bei grünem Signal und Treibstoff voll +trigger-cargo-full-signal=Start bei grünem Signal und Fracht voll +trigger-cargo-full-or-signal=Start bei grünem Signal oder Fracht voll +destination-type-zone=Ungefähre Position +destination-type-landing-pad=Frachtlandeplatz +button-launch=Starten +button-launch-disabled=Starten (Deaktiviert) +destination-crash-warning=Warnung: Frachtlandeplatz auswählen um die Absturzchance zu verringern +recipe-to=__1__ nach __2__ +recipe-from=__1__ von __2__ +remote-view=Navigationssatelliten-Uplink [__CONTROL__se-remote-view__] +remote-view-instruction=Um Sterne, Planeten, Monde und andere Bereiche zu entdecken weitere Satelliten starten. +exit-remote-view=Navigationssatelliten-Uplink verlassen [__CONTROL__se-remote-view__] +remote-view-requires-satellite=Starte einen Satelliten um den Navigationssatelliten-Uplink zu verwenden. +satellite-launched=Satellit stationiert und scannt nach astronomischen Objekten. Verwende [img=virtual-signal/se-remote-view] Navigationssatelliten-Uplink zum Anzeigen (Taste: [color=green][__CONTROL__se-remote-view__][/color] oder in der Shortcutleiste) +satellite-discovered-platform=[color=cyan]Der Satellit hat eine Raumplattform im Orbit entdeckt. [/color] +source-discovered-zone=[color=cyan]__1__ einen neuen __2__:[img=__3__] entdeckt: [/color][color=white]__4__[/color] +discovered-zone=[color=cyan]Neue __1__ entdeckt: [img=__2__] [/color][color=white]__3__[/color] +space-capsule=Raumkapsel +player-died=__1__ ist gestorben +launch-suit-warning=Um Ersticken zu vermeiden sollte ein Raumanzug getragen werden. +suffocating-warning=Du erstickst. Geh in eine Raumkapsel oder lege einen Raumanzug an. +rocket_survivability_fail=Eine Frachtrakete wurde im Flug beschädigt und ist vom Kurs abgekommen. Weitere Raketenüberlebenschancen und Frachtsicherheit Technologien sollten erforscht werden. +respawn-if-stranded=Falls du gestranded bist, kann die Respawnfunktion(Taste: __CONTROL__se-respawn__) verwendet werden. +filter-list=Suche +clear-filter=Suche löschen +zone-tooltip=__1__ __2__ __3__ __4__ __5__ __6__ __7__ +zone-tooltip-type=\nTyp: __1__ +zone-tooltip-resources=\nPrimäre Ressource: __1__ +zone-tooltip-lifesigns=\nLebenszeichen: __1__ +zone-tooltip-daynight=\nTag/Nachtzyklus: __1__ Minuten +zone-tooltip-bot-attrition=\nRoboter Beeinträchtigungen: __1__ +construction-denied=Kann hier nicht platziert werden. +construction-denied-vehicle-in-space=Bodenfahrzeuge können nicht im Weltraum platziert werden. +construction-denied-se-surface=Ungültige Plazierung. Muss auf einer Oberfläche von Space Exploration platziert werden. +currently-viewing=Derzeit angezeigt: __1__ +no-character-to-board=Betreten des ausgewählten Schiffs nicht möglich. Du musst mit deinem Charakter verbunden sein um diese Aktion auszuführen. +starmap=Sternenkarte (WIP) +back=Zurück +spaceship=Raumschiff +plant=Planet +moon=Mond +star=Stern +orbit=Orbit +something_orbit=__1__ Orbit +asteroid-belt=Asteroidengürtel +asteroid-field=Asteroidenfeld +anomaly=Anomalie +spaceship-cannot-set-destination-to-self=Man selbst kann nicht das Ziel sein. +spaceship-launch-energy=Energie zum starten: __1__ +spaceship-launch-energy-invalid=Energie zum starten: Erfordert korrekte Integritätsprüfung. +spaceship-speed=Geschwindigkeit: __1__ +spaceship-structural-stress-hull=Statische Belastung (Rumpf): __1__ +spaceship-structural-stress-hull-invalid=Statische Belastung (Rumpf): NA (Umschließung erforderlich) +spaceship-structural-stress-container=Statische Belastung (Behälter): __1__ +spaceship-structural-stress-container-invalid=Statische Belastung (Behälter): NA (Umschließung erforderlich) +spaceship-travel-time-unknown=Reisezeit: Unbekannt. Höchstgeschwindigkeit testen, um abzuschätzen. +spaceship-travel-time-max=Reisezeit: __1__s bei Höchstgeschwindigkeit +spaceship-travel-time-current=Reisezeit: __1__s bei aktueller Geschwindigkeit +spaceship-closest-location=Naheliegenster Ort: __1__ +spaceship-location-spatial-distortion=Raumverzerrung: __1__ +spaceship-location-stellar-x=Quadrant X: __1__ +spaceship-location-stellar-y=Quadrant Y: __1__ +spaceship-location-star-gravity-well=Stellares Gravitationsfeld: __1__ +spaceship-location-planet-gravity-well=Planetares Gravitationsfeld: __1__ +spaceship-travel-status=Reisestatus: __1__ +spaceship-integrity-status-valid=Integritätsstatus: Gültig: __1__ +spaceship-integrity-status-invalid=Integritätsstatus: Ungültig: __1__ +spaceship-button-launch=Start +spaceship-button-launch-tooltip=Bereit zum Start +spaceship-button-launch-disabled=Start (deaktiviert) +spaceship-button-launch-disabled-fuel-tooltip=Benötigt Treibstoff in Boostertanks. +spaceship-button-launch-disabled-integrity-tooltip=Benötigt gültige Integritätsprüfung. +spaceship-button-anchor=Ankern +spaceship-button-confirm-anchor=Ankerplatz bestätigen +spaceship-button-anchor-to=Anker zu __1__ +spaceship-button-anchor-on=Anker an __1__ +spaceship-button-stop=Stop +spaceship-button-start=Aktivieren +spaceship-button-board=__1__ betreten +spaceship-button-scouting-back=Zurück +spaceship-button-scouting-back-tooltip=Ankerplatz suchen abbrechen +spaceship-name-the=__1__ +spaceship-button-start-integrity-check=Integritätsprüfung starten +spaceship-heading-destination=Ziel +list-destinations-alphabetically=Ziele aphabetisch sortieren +spaceship-travel-message-new-course-plotted=Neuer Kurs eingetragen. +spaceship-travel-message-exiting-planet-gravity=Verlasse planetares Gravitationsfeld. +spaceship-travel-message-navigating-planet-gravity=Navigiere im planetarem Gravitationsfeld. +spaceship-travel-message-exiting-star-gravity=Verlasse stellares Gravitationsfeld. +spaceship-travel-message-navigating-star-gravity=Navigiere im stellarem Gravitationsfeld. +spaceship-travel-message-spatial-distortions=Navigiere in räumlicher Verzerrung. +spaceship-travel-message-navigating-interstellar=Navigiere im interstellarem Raum. +spaceship-travel-message-at-destination=Am Ziel. +spaceship-check-message-passed=Bestanden: Schiffsintegrität gültig +spaceship-check-message-failed-containment=Fehler: Konsole nicht umschlossen. Stelle sicher, dass alle Raumschiffwände ohne Lücken auf Raumschiffboden gebaut sind. +spaceship-check-message-failed-console-floor=Konsole muss auf Raumschiffboden gebaut werden. +spaceship-check-message-failed-empty=Keine Kacheln gefunden, die zu einer korrekt umschlossenen Konsole verbunden sind. +spaceship-check-message-failed-unknown-bounds=Fehler: Unbekannte Raumschiffsgrenzen. +spaceship-check-message-failed-stress=Fehler: Belastung der strukturellen Integrität überschreitet technolgische Grenzen. +spaceship-check-message-checking-console-floor=Überprüfe Verbindung des Konsolenboden. +spaceship-check-message-checking-containment=Überprüfe Umschlossenheit. +spaceship-check-message-checking-connectivity=Überprüfe Konsolenverbindung. +spaceship-check-message-no-console=Keine Konsole. +spaceship-check-message-did-not-complete=Überprüfung nicht abgeschlossen. +spaceship-check-message-unstable=Instabil: Einige Bereiche werden abgetrennt beim Manövrieren. +spaceship-check-message-valid-but-disconnecting=Gültig aber Instabil: Bereiche werden abgetrennt. +spaceship-warning-sections-disconnecting=Bereiche werden abgetrennt. Anhalten um zu reparieren. + +[damage-type-name] +suffocation=Ersticken +meteor=Meteorit + +[entity-name] +destroyed-cargo-pod=Zerstörte Frachtkapsel +meteorite=Meteorit +rocket-silo=Satelliten Raketensilo +rocket-fragment=Raketenfragment +se-antimatter-reactor=Antimaterie-Reaktor +se-cargo-rocket-cargo-pod=Frachtkapsel +se-condenser-turbine=Kondensatorturbine +se-condenser-turbine-tank=Kondensatorturbine +se-condenser-turbine-generator=Kondensatorturbine +se-core-fragment-processor=Kernfragmentprozessor +se-core-miner=Kernerzförderer +se-core-miner-drill=Kernerzförderer +se-electric-boiler=Elektrischer Heizkessel +se-fluid-burner-generator=Flüssigkeitswärmegenerator +se-fuel-refinery=Kraftstoffraffinerie +se-meteor-defence-container=Meteoriten-Verteidigungsanlage +se-meteor-defence-charger=Meteoriten-Verteidigungsanlage +se-meteor-point-defence-container=Meteoriten-Punktverteidigung +se-meteor-point-defence-charger=Meteoriten-Punktverteidigung +se-methane-ice=Methaneis +se-rocket-launch-pad=Frachtraketensilo +se-rocket-launch-pad-tank=Frachtraketensilo +se-rocket-launch-pad-silo=Frachtraketensilo +se-rocket-launch-pad-combinator=Frachtraketensilo +se-rocket-launch-pad-_-seat=Frachtraketensilo +se-rocket-launch-pad-settings=Frachtraketensilo +se-rocket-landing-pad=Frachtlandeplatz +se-space-accumulator=Weltraumakkumulator +se-space-astrometrics-laboratory=Astrometrielabor +se-space-biochemical-laboratory=Biochemielabor +se-space-assembling-machine=Weltraummontagemaschine +se-space-capsule-_-vehicle=Raumkapsel +se-space-curved-rail=Weltraumschienen +se-space-decontamination-facility=Dekontaminationsanlage +se-space-electromagnetics-laboratory=Elektromagnetismuslabor +se-space-genetics-laboratory=Genetiklabor +se-space-growth-facility=Aufzuchtsanlage +se-space-gravimetrics-laboratory=Gravimetrielabor +se-space-hypercooler=Wärmetauscher +se-space-laser-laboratory=Laserlabor +se-space-lifesupport-facility=Lebenserhaltungsanlage +se-space-manufactory=Weltraumfabrik +se-space-material-fabricator=Materialhersteller +se-space-mechanical-laboratory=Mechaniklabor +se-space-particle-accelerator=Partikelbeschleuniger +se-space-particle-collider=Partikelkollidierer +se-space-plasma-generator=Plasmagenerator +se-space-radiation-laboratory=Strahlenlabor +se-space-radiator=Thermischer Kühler +se-space-recycling-facility=Recyclinganlage +se-space-pipe=Weltraumrohr +se-space-pipe-to-ground=Unterirdisches Weltraumrohr +se-space-science-lab=Weltraumwissenschaftslabor +se-space-solar-panel=Weltraumsolarpanel +se-space-solar-panel-2=Fortgeschrittenes Weltraumsolarpanel +se-space-spectrometry-facility=Spektrometrieanlage +se-space-straight-rail=Weltraumschiene +se-space-supercomputer-1=Supercomputer +se-space-supercomputer-2=Quanten Supercomputer +se-space-supercomputer-3=Neuronaler Supercomputer +se-space-telescope-radio=Radio Teleskop +se-space-telescope-microwave=Mikrowellenteleskop +se-space-telescope=Teleskop +se-space-telescope-xray=Röntgenteleskop +se-space-telescope-gammaray=Gammastrahlenteleskop +se-space-thermodynamics-laboratory=Thermodynamiklabor +se-space-splitter=Weltraum-Teilerfließband +se-space-transport-belt=Weltraum-Fließband +se-space-underground-belt=Unterirdisches Weltraum-Fließband +se-spaceship-antimatter-engine=Raumschiff Antimaterieantrieb +se-spaceship-antimatter-booster-tank=Raumschiff Antimaterietank +se-spaceship-console=Raumschiffkonsole +se-spaceship-gate=Raumschifftür +se-spaceship-obstacle=Weltraumschrott +se-spaceship-rocket-engine=Raumschiff Raketenantrieb +se-spaceship-rocket-booster-tank=Raumschiff Raketentreibstofftank +se-spaceship-wall=Raumschiffwand +se-water-ice=Wassereis +small-asteroid=Kleiner Asteroid + +[entity-description] +rocket-silo=Befördere einen Satelliten in den Weltraum um den Weltraum zu erforschen, entdecke neue Himmelskörper und bekomme einen kleine Menge an Raumfahrtforschung. +se-antimatter-reactor=Vernichtet Antimaterie mit Materie um große Hitze zu erzeugen. +se-condenser-turbine=Ist 75% so energieeffizient wie eine Dampfturbine aber 99% des Dampfs wird als Wasser zurückgeliefert. +se-core-fragment-processor=Extrahiert Ressourcen aus Kernfragmenten. +se-core-miner=Erlaubt eine endlose Extraktion von Ressourcen vom Kern des Planeten oder Mondes, aber hat abnehmende Erträge, wenn mehrere auf derselben Oberfläche verwendet werden. Verbraucht 50MW. +se-core-miner-drill=Erlaubt eine endlose Extraktion von Ressourcen vom Kern des Planeten oder Mondes, aber hat abnehmende Erträge, wenn mehrere auf derselben Oberfläche verwendet werden. Verbraucht 50MW. +se-electric-boiler=Wandelt mit Hilfe von elektischer Energie Wasser in Dampf um. +se-fluid-burner-generator=Benötigt flüssigen Treibstoff mit einem Energiewert (wie flüssigen Raketentreibstoff) um Elektrizität zu erzeugen. Einfach und kompakt aber energieineffizient im Vergleich zu Dampfturbinen. Entwickelt für den Weltraum. +se-meteor-defence-container=Kann eine ganze Planetenoberfläche vor Meteoreinschlägen schützen, aber immer nur einen Schuss abgeben. Muss mit Meteoriten-Verteidigungsanlagenmunition bestückt und vollständig aufgeladen sein. 80% Genauigkeit. Muss nach Schussabgabe wieder aufladen. Benötigt 20MW beim Laden. +se-meteor-defence-charger=Kann eine ganze Planetenoberfläche vor Meteoreinschlägen schützen, aber immer nur einen Schuss abgeben. Muss mit Meteoriten-Verteidigungsanlagenmunition bestückt und vollständig aufgeladen sein. 80% Genauigkeit. Muss nach Schussabgabe wieder aufladen. Benötigt 20MW beim Laden. +se-meteor-point-defence-container=Schützt einen Bereich vor Meteoreinschlägen. Kann bis zu 4 Schuss abgeben. Muss mit Meteoriten-Punktverteidigungsmunition bestückt und vollständig aufgeladen sein. Reichweite 64, 50% Genauigkeit, benötigt Zeit zum Wiederaufladen. +se-meteor-point-defence-charger=Schützt einen Bereich vor Meteoreinschlägen. Kann bis zu 4 Schuss abgeben. Muss mit Meteoriten-Punktverteidigungsmunition bestückt und vollständig aufgeladen sein. Reichweite 64, 50% Genauigkeit, benötigt Zeit zum Wiederaufladen. +se-rocket-launch-pad=Startet sein Inventar in den Weltraum. Kann Passagiere aufnehmen, einsteigen mit __CONTROL__toggle-driving__ vor dem vorderer Torbereich. +se-rocket-landing-pad=Ein Frachtanlieferungsplatz für Frachtraketen. +se-space-assembling-machine=Eine modifizierte Montagemaschine die auch im Weltraum funktioniert. +se-space-astrometrics-laboratory=Verbindet, vergleicht und quantifiziert unterschiedliche Quellen von astronomischer Informationen. +se-space-biochemical-laboratory=Ein fortgeschrittenes chemisches Labor mit Spezialisierung in Bio-Chemie. Kann auch einfache chemische Prozesse und Ölverarbeitung durchführen. +se-space-capsule-_-vehicle=Kann verwendet werden um Passagiere zum nächstliegenden Planeten zu bringen. Einsteigen in die Kapsel mit __CONTROL__toggle-driving__. +se-space-decontamination-facility=Reinigt Substanzen für die Verwendung in sterilen Umgebungen und bearbeitet Flüssigkeiten für die Verwendung in Niedrigdruckverhältnissen. +se-space-electromagnetics-laboratory=Anlage für enorme Magnetfeld- und extreme Hochspannungsanwendungen. +se-space-genetics-laboratory=Ein Labor für genetische Sequenzierung, Modifikation und Prägung von Bio-Kulturen. +se-space-gravimetrics-laboratory=Analysiert und simuliert Störungen in der Schwerkraft. +se-space-growth-facility=Züchtet biologische Proben unter kontrollierten Bedingungen, die nirgendwo anders herrschen wie etwa Niedrigschwerkraft. +se-space-hypercooler=Vollzieht einen Temperaturaustausch im Thermofluid, in dem es einen Teil heißer macht und einen Teil kälter. +se-space-laser-laboratory=Laserexperimete. Augenschutz dringend empfohlen. +se-space-lifesupport-facility=Unterstützt Leben in lebensfeindlichen Umgebungen. +se-space-manufactory=Eine gigantische Montagemaschine kann auch sehr komplizierte Rezepte herstellen. Funktioniert nur im Weltraum (oder auf Raumschiffen). +se-space-material-fabricator=Synthetisiert neue Materialien. Eine Kreuzung zwischen Teilchenbeschleuniger und 3D Drucker. +se-space-mechanical-laboratory=Bietet eine Reihe von mechanischen Prozessen: Zerkleinern, Zerreißen, Zerschneiden, Vibrieren usw. +se-space-particle-accelerator=Beschleunigt Partikel auf annähernd Lichtgeschwindigkeit. +se-space-particle-collider=Läßt Partikel kollidieren und analysiert die Ergebnisse. +se-space-pipe=Ein Rohr über das man gehen kann. +se-space-pipe-to-ground=Teuer und eingeschränkte Reichweite, nur verwenden wenn es notwendig ist. +se-space-plasma-generator=Erzeugt unterschiedliche Plasmaströme. +se-space-radiation-laboratory=Ein relativ sicherer Ort zum Arbeiten mit radioaktivem Material. Kann für Uranverarbeitung verwendet werden. +se-space-radiator=Kühlt Thermofluid ab. +se-space-recycling-facility=Recycelt Schrott und andere Nebenprodukte wieder in Ressourcen. +se-space-solar-panel=Ein hocheffizientes Solarpanel für den Weltraum. +se-space-solar-panel-2=Ein fortgeschrittenes hocheffizientes Solarpanel für den Weltraum. +se-space-spectrometry-facility=Spektralphotometrie, Gaschromatographie, Massenspektronomie und andere Spektronomien. Schießt Zeug gegen eine Wand, biegt es, bricht es und schaut wo es trifft. +se-space-supercomputer-1=Datenmanipulation, -verarbeitung und -simulation. +se-space-supercomputer-2=Quantencomputing. Verbesserte Datenmanipulation, -verarbeitung und -simulation. +se-space-supercomputer-3=Adaptive Neuralenetze in einem Quantencomputingframework. Verbesserte Datenmanipulation, -verarbeitung und -simulation. +se-space-straight-rail=Entwickelt für den Weltraum, kann aber auch auf Oberflächen verwendet werden. +se-space-science-lab=Kann fortgeschrittene Wissenschaftspakete verarbeiten. Muss im Weltraum platziert werden. +se-space-telescope=Ein hochentwickeltes Teleskop für viele Wellenlängen rund um das sichtbare Spektrum. +se-space-telescope-gammaray=Gammastrahlen können nicht abgelenkt werden. Dieses leistungsfähige Teleskop verwendet stattdessen spezielle Detektoren. +se-space-telescope-xray=Röntgenstrahlung wird von den meisten Atmosphären blockiert. Dieses leistungsfähige Teleskop ist für den Weltraum entwickelt wo die Atmossphäre keine Rolle spielt. +se-space-telescope-microwave=Ein gigantisches Teleskop das Mikrowellen und die kosmische Hintergrundstrahlung messen kann. +se-space-telescope-radio=Ein gigantisches Teleskop das sehr schwache Radiowellen aus weit entfernten Quellen messen kann. +se-space-thermodynamics-laboratory=Unterstützt Anwendungen für extreme Temperaturen. Kann auch einfache Vorgänge, wie etwa Schmelzen, durchführen. +se-space-transport-belt=Verhindert das abdriften von Dingen im Weltraum. +se-spaceship-antimatter-engine=Verbraucht Antimaterie. Wirkt als Trennwand für die Raumschiffsicherheitshülle. +se-spaceship-antimatter-booster-tank=Speichert Antimaterie. Notwendig für den Start von Raumschiffen. +se-spaceship-console=Wird benötigt um ein Raumschiff zwischen Planeten, Monden, Orbits und Asteroidenfeldern zu bewegen. Muss auf Raumschiffboden stehen, eingeschlossen in Raumschiffwänden/-türen, darf keine Löcher haben. Integritätscheck durchführen um Probleme aufzuzeigen. +se-spaceship-gate=Ein Kraftfeld verhindert die Dekompression, wenn die Tür geöffnet wird. Wirkt als Trennwand für die Raumschiffsicherheitshülle. +se-spaceship-rocket-engine=Verbrennt flüssigen Raketentreibstoff. Wirkt als Trennwand für die Raumschiffsicherheitshülle. +se-spaceship-rocket-booster-tank=Speichert flüssigen Raketentreibstoff. Notwendig für den Start von Raumschiffen. +se-spaceship-wall=Muss auf Raumschiffboden platziert werden. Wirkt als Trennwand für die Raumschiffsicherheitshülle. Diagonale Spalten brechen die Integrität der Sicherheitshülle. + +[equipment-name] +energy-shield-equipment=Energieschild +energy-shield-mk2-equipment=Energieschild MK2 +energy-shield-mk3-equipment=Energieschild MK3 +energy-shield-mk4-equipment=Energieschild MK4 +energy-shield-mk5-equipment=Energieschild MK5 +energy-shield-mk6-equipment=Energieschild MK6 +se-adaptive-armour-equipment-1=Adaptive Rüstung MK1 +se-adaptive-armour-equipment-2=Adaptive Rüstung MK2 +se-adaptive-armour-equipment-3=Adaptive Rüstung MK3 +se-adaptive-armour-equipment-4=Adaptive Rüstung MK4 +se-adaptive-armour-equipment-5=Adaptive Rüstung MK5 +se-rtg-equipment=Tragbarer RTG +se-rtg-equipment-2=Tragbarer RTG MK2 + +[equipment-description] +energy-shield-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +energy-shield-mk2-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +energy-shield-mk3-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +energy-shield-mk4-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +energy-shield-mk5-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +energy-shield-mk6-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +se-adaptive-armour-equipment-1=Eine Rüstung die sich mit Energie selbst repariert. Der Schutz wird langsam aufgebaut. +se-adaptive-armour-equipment-2=Eine Rüstung die sich mit Energie selbst repariert. Der Schutz wird langsam aufgebaut. +se-adaptive-armour-equipment-3=Eine Rüstung die sich mit Energie selbst repariert. Der Schutz wird langsam aufgebaut. +se-adaptive-armour-equipment-4=Eine Rüstung die sich mit Energie selbst repariert. Der Schutz wird langsam aufgebaut. +se-adaptive-armour-equipment-5=Eine Rüstung die sich mit Energie selbst repariert. Der Schutz wird langsam aufgebaut. +se-rtg-equipment=Radioisotopen thermoelektrischer Generator. Ein tragbarer Generator der Hitze aus radioaktivem Zerfall in Elektrizität umwandelt. Die Energie reicht jahrzehntelang, es wird kein zusätzlicher Treibstoff benötigt. +se-rtg-equipment-2=Radioisotopen thermoelektrischer Generator. Ein verbesserter tragbarer Generator der Hitze aus radioaktivem Zerfall in Elektrizität umwandelt. Die Energie reicht jahrzehntelang, es wird kein zusätzlicher Treibstoff benötigt. + +[fluid-name] +se-antimatter-stream=Antimateriestrom +se-bio-sludge=Bio-Schlamm +se-contaminated-bio-sludge=Kontaminierter Bio-Schlamm +se-contaminated-space-water=Kontaminiertes kosmisches Wasser +se-chemical-gel=Chemisches Gel +se-decompressing-steam=Dampf +se-liquid-rocket-fuel=Flüssiger Raketentreibstoff +se-methane-gas=Methangas +se-methane-gas-mixed=Gemischtes Methangas +se-nutrient-gel=Nährstoffgel +se-neural-gel=Neuralgel +se-neural-gel-2=Fortgeschrittenes Neuralgel +se-ion-stream=Ionenstrom +se-plasma-stream=Plasmastrom +se-particle-stream=Partikelstrom +se-proton-stream=Protonenstrom +se-space-coolant=Thermofluid 25°C +se-space-coolant-hot=Thermofluid 25°C +se-space-coolant-warm=Kühles Thermofluid -10°C +se-space-coolant-cold=Kaltes Thermofluid -100°C +se-space-coolant-supercooled=Superkaltes Thermofluid -273°C +se-space-water=Kosmisches Wasser + +[fluid-description] +se-space-water=Wasser das bei niedrigem Druck nicht gefriert, gut geeignet für die meisten Weltraumanwendungen. +se-space-coolant=Die normale Temperatur des Thermofluids. +se-space-coolant-hot=Die normale Temperatur des Thermofluids. +se-space-coolant-warm=Thermofluid Temperatur nach dem kühlen durch den termischen Kühler. +se-space-coolant-cold=Thermofluid Temperatur nach dem kühlen durch den Wärmetauscher. +se-space-coolant-supercooled=Thermofluid Temperatur nach wiederholtem kühlen durch den Wärmetauscher. + +[item-group-name] +space=Weltraum +spaceship=Raumschiff +bob-fluids=Flüssigkeiten + +[item-name] +core-fragment=Kernfragment (__1__) +effectivity-module-4=Effizienzmodul 4 +effectivity-module-5=Effizienzmodul 5 +effectivity-module-6=Effizienzmodul 6 +effectivity-module-7=Effizienzmodul 7 +effectivity-module-8=Effizienzmodul 8 +effectivity-module-9=Effizienzmodul 9 +glass=Glas +productivity-module-4=Produktivitätsmodul 4 +productivity-module-5=Produktivitätsmodul 5 +productivity-module-6=Produktivitätsmodul 6 +productivity-module-7=Produktivitätsmodul 7 +productivity-module-8=Produktivitätsmodul 8 +productivity-module-9=Produktivitätsmodul 9 +rocket-fuel=Raketenfestbrennstoff +sand=Sand +solid-sand=Gewaschener Sand +washed-sand=Gewaschener Sand +satellite=Navigationssatellit +se-antimatter-canister=Antimateriebehälter +se-astrometric-data=Astrometrische Daten +se-astronomic-catalogue-1=Astronomiekatalog +se-astronomic-catalogue-2=Großer Astronomiekatalog +se-astronomic-catalogue-3=Umfassender Astronomiekatalog +se-astronomic-catalogue-4=Erweiterter Astronomiekatalog +se-astronomic-insight=Astronomische Erkenntnis +se-astronomic-science-pack=Wissenschaftspaket für Astronomie +se-atomic-data=Atomare Daten +se-bio-combustion-data=Biologische Verbrennungsdaten +se-bio-combustion-resistance-data=Biologische Verbrennung Widerstandsdaten +se-bio-spectral-data=Biologische Spektraldaten +se-biochemical-data=Biochemische Daten +se-bioculture=BioKultur +se-bioelectrics-data=Bioelektrische Daten +se-biological-catalogue-1=Biologiekatalog +se-biological-catalogue-2=Großer Biologiekatalog +se-biological-catalogue-3=Umfassender Biologiekatalog +se-biological-catalogue-4=Erweiterter Biologiekatalog +se-biological-insight=Biologische Erkenntnis +se-biological-science-pack=Wissenschaftspaket für Biologie +se-biomechanical-data=Biomechanische Daten +se-biomechanical-resistance-data=Biomechanische Widerstandsdaten +se-boson-data=Bosondaten +se-broken-data=Zerstörte Datenkarte +se-canister=Sicherheitsbehälter +se-rocket-launch-pad-silo-dummy-ingredient-item=Frachtrakete +se-rocket-launch-pad-silo-dummy-result-item=Frachtrakete +se-cargo-rocket-cargo-pod=Frachtkapsel +se-cargo-rocket-fuel-tank=Raketentreibstofftank +se-cargo-rocket-section=Frachtraketenbauteil +se-cargo-rocket-section-packed=Paketiertes Frachtraketenbauteil +se-cold-thermodynamics-data=Kaltthermodynamische Daten +se-comparative-genetic-data=Vergleichende genetische Daten +se-compressive-strength-data=Druckbelastbarkeitsdaten +se-conductivity-data=Leitfähigkeitsdaten +se-contaminated-scrap=Kontaminierter Schrott +se-core-fragment-omni=Kernfragment +se-cryogenics-data=Kryogenische Daten +se-dark-energy-data=Dunkle-Energie-Daten +se-darkmatter-data=Dunkle-Materie-Daten +se-data-storage-substrate-cleaned=Poliertes Datenspeichersubstrat +se-data-storage-substrate=Rohes Datenspeichersubstrat +se-decompression-data=Dekompressionsdaten +se-decompression-resistance-data=Dekompressionswiderstandsdaten +se-deep-space-science-pack=Wissenschaftspaket für Weltraumforschung +se-electromagnetic-field-data=Elektromagnetischesfeld-Daten +se-empty-data=Leere Datenkarte +se-empty-lifesupport-canister=Leerer Lebenserhaltungsbehälter +se-energy-catalogue-1=Energiekatalog +se-energy-catalogue-2=Großer Energiekatalog +se-energy-catalogue-3=Umfassender Energiekatalog +se-energy-catalogue-4=Erweiterter Energiekatalog +se-energy-insight=Energie Erkenntnis +se-energy-science-pack=Wissenschaftspaket für Energie +se-entanglement-data=Verschränkungsdaten +se-exotic-fission-data=Exotische Spaltungsdaten +se-exotic-singularity-data=Singularitätsdaten +se-experimental-biochemical-data=Experimentelle biochemische Daten +se-experimental-bioculture=Experimentelle Bio-Kultur +se-experimental-genetic-data=Experimentelle Genetikdaten +se-experimental-material-decay-data=Experimentelle Materialzerfallsdaten +se-experimental-material-spectral-data=Experimentelle Materialspektraldaten +se-experimental-material=Experimenteller Materialprototyp +se-experimental-specimen=Experimentelle Biomasse +se-experimental-superconductor=Supraleiterprototyp +se-forcefield-data=Kraftfelddaten +se-fusion-test-data=Verschmelzungstestdaten +se-gammaray-detector=Gammastrahlendetektor +se-gammaray-observation-data=Gammastrahlenbeobachtungsdaten +se-gammaray-test-data=Gammastrahlendaten +se-genetic-data=Genetikdaten +se-gravity-wave-observation-data=Schwerkraftwellenbeobachtungsdaten +se-gravimetric-observation-data=Gravimetrikbeobachtungsdaten +se-gravimetric-test-data=Gravimetriktestdaten +se-heat-shielding=Hitzeschild +se-hot-thermodynamics-data=Heißthermodynamische Daten +se-infrared-observation-data=Infrarotbeobachtungsdaten +se-ion-spectrometry-data=Ionenspektrometriedaten +se-junk-data=fehlerhafte Datenkarte +se-lepton-data=Leptondaten +se-lifesupport-canister=Lebenserhaltungsbehälter +se-magnetic-canister=Magnetischer Behälter +se-magnetic-monopole-data=Magnetische Monopoldaten +se-material-decay-data=Materialzerfallsdaten +se-material-science-pack=Wissenschaftspaket für Material +se-material-spectral-data=Materialspektraldaten +se-material-testing-pack=Materialtestpaket +se-material-catalogue-1=Materialkatalog +se-material-catalogue-2=Großer Materialkatalog +se-material-catalogue-3=Umfassender Materialkatalog +se-material-catalogue-4=Erweiterter Materialkatalog +se-material-insight=Material Erkenntnis +se-medpack=Medpack +se-medpack-2=Medpack 2 +se-medpack-3=Medpack 3 +se-medpack-4=Medpack 4 +se-meteor-defence=Meteoriten-Verteidigungsanlage +se-meteor-defence-ammo=Meteoriten-Verteidigungsanlagenmunition +se-meteor-point-defence=Meteoriten-Punktverteidigung +se-meteor-point-defence-ammo=Meteoriten-Punktverteidigungsmunition +se-methane-ice=Methaneis +se-micro-black-hole-data=Mikro-Schwarzes Loch Daten +se-microwave-observation-data=Mikrowellenbeobachtungsdaten +se-nano-cold-thermodynamics-data=Nanomaterial kaltthermodynamische Daten +se-nano-compressive-strength-data=Nanomaterial Druckbelastbarkeitsdaten +se-nano-hot-thermodynamics-data=Nanomaterial heißthermodynamische Daten +se-nanomaterial=Nanomaterial +se-nano-tensile-strength-data=Nanomaterial Zugbelastbarkeitsdaten +se-negative-pressure-data=Unterdruckdaten +se-neural-anomaly-data=Neural-Anomalie Daten +se-nutrient-vat=Nährstoffkultur +se-observation-frame-blank=Leerer Beobachtungsrahmen +se-observation-frame-gammaray=Gammastrahlenbeobachtungsrahmen +se-observation-frame-infrared=Infrarotbeobachtungsrahmen +se-observation-frame-microwave=Mikrowellenbeobachtungsrahmen +se-observation-frame-radio=Radiowellenbeobachtungsrahmen +se-observation-frame-uv=UV-Strahlenbeobachtungsrahmen +se-observation-frame-visible=Sichtbare Strahlungbeobachtungsrahmen +se-observation-frame-xray=Röntgenstrahlungbeobachtungsrahmen +se-plague-bomb=Seuchenbombe +se-plasma-canister=Plasmabehälter +se-plasma-electrodynamics-data=elektrodynamische Plasmadaten +se-plasma-thermodynamics-data=thermodynamische Plasmadaten +se-polarisation-data=Polarisationsdaten +se-pressure-containment-data=Druckbeständigkeitsdaten +se-quantum-phenomenon-data=Quantenphänomendaten +se-quark-data=Quarksdaten +se-radiation-data=Strahlungsdaten +se-radiation-exposure-data=Strahlungsexpositionsdaten +se-radiation-exposure-resistance-data=Strahlungswiderstandsdaten +se-radiation-shielding-data=Strahlungsschutzdaten +se-radio-observation-data=Radiowellenbeobachtungsdaten +se-rtg-equipment=Tragbarer RTG +se-rtg-equipment-2=Tragbarer RTG MK2 +se-scrap=Schrott +se-significant-data=Signifikante Daten +se-significant-specimen=Signifikante Biomasse +se-space-capsule=Raumkapsel +se-space-mirror=Multispektraler Spiegel +se-space-platform-plating=Weltraumplattform Beschichtung +se-space-platform-scaffold=Weltraumplattform Gerüst +se-space-rail=Weltraumschiene +se-spaceship-floor=Raumschiffboden +se-specimen=Biomasse +se-subatomic-data=Subatomare Daten +se-superconductivity-data=Supraleitfähigkeitsdaten +se-superconductor=Supraleiter +se-superconductive-cable=Supraleiterkabel +se-tensile-strength-data=Zugbelastbarkeitsdaten +se-tesla-ammo=Teslagewehrmunition +se-tesla-gun=Teslagewehr +se-thruster-suit=Raumanzug +se-thruster-suit-2=Raumanzug MK2 +se-thruster-suit-3=Raumanzug MK3 +se-thruster-suit-4=Raumanzug MK4 +se-timespace-anomaly-data=Zeitraumanomaliedaten +se-used-lifesupport-canister=Verbrauchter Lebenserhaltungsbehälter +se-uv-observation-data=UV-Strahlenbeobachtungsdaten +se-visible-observation-data=Sichtbare Strahlungbeobachtungsdaten +se-water-ice=Wassereis +se-xray-observation-data=Röntgenstrahlungbeobachtungsdaten +se-zero-point-energy-data=Nullpunktenergiedaten +space-science-pack=Wissenschaftspaket für Raumfahrt +speed-module-4=Geschwindigkeitsmodul 4 +speed-module-5=Geschwindigkeitsmodul 5 +speed-module-6=Geschwindigkeitsmodul 6 +speed-module-7=Geschwindigkeitsmodul 7 +speed-module-8=Geschwindigkeitsmodul 8 +speed-module-9=Geschwindigkeitsmodul 9 + +[item-description] +automation-science-pack=Wird in normalen Wissenschaftslaboren verwendet. +chemical-science-pack=Wird in normalen Wissenschaftslaboren verwendet. +logistic-science-pack=Wird in normalen Wissenschaftslaboren verwendet. +military-science-pack=Wird in normalen Wissenschaftslaboren verwendet. +production-science-pack=Wird in normalen Wissenschaftslaboren verwendet. +satellite=Verwende Satelliten in Satelliten-Raketensilos. +se-antimatter-canister=Die dichteste Form von Energie, aufbewahrt in einem Sicherheitsbehälter. +se-astronomic-science-pack=Wird in Weltraum Wissenschaftslaboren verwendet. +se-biological-science-pack=Wird in Weltraum Wissenschaftslaboren verwendet. +se-canister=Ein Mehrzweckbehälter. +se-cargo-rocket-cargo-pod=Eine Frachtraketenbauteil Komponente. +se-cargo-rocket-fuel-tank=Eine Frachtraketenbauteil Komponente. +se-cargo-rocket-section=Die wichtigste Frachtraketen Komponente. In den Frachtraketensilo einsetzen. Pro Rakete werden 100 benötigt. +se-cargo-rocket-section-packed=Für den Transport paketierte Frachtraketenbauteil. Müssen vor der Verwendung in der Rakete entpackt werden. +se-deep-space-science-pack=Wird in Weltraum Wissenschaftslaboren verwendet. +se-energy-science-pack=Wird in Weltraum Wissenschaftslaboren verwendet. +se-heat-shielding=Eine zusammengesetzte Kachel für Hochtemperatur Anwendungen und Weltraumstrukturen. +se-material-science-pack=Wird in Weltraum Wissenschaftslaboren verwendet. +se-medpack=Verwenden um sich selbst zu heilen. +se-medpack-2=Verwenden um sich selbst zu heilen. +se-medpack-3=Verwenden um sich selbst zu heilen. +se-medpack-4=Verwenden um sich selbst zu heilen. +se-meteor-defence=Kann eine ganze Planetenoberfläche vor Meteoreinschlägen schützen, aber kann nur einen Schuss abgeben. Muss mit Meteor-Verteidigungsanlage Munition bestückt und vollständig aufgeladen sein. 80% Genauigkeit. Muss nach Abschuss wieder aufladen. Benötigt 20MW beim Laden. +se-meteor-defence-ammo=Zerstört Meteoriten. Muss in Meteor-Verteidigungsanlage geladen werden. +se-meteor-point-defence=Schützt einen Bereich vor Meteoreinschlägen. Kann bis zu 4 Schuss abgeben. Muss mit Meteor-Punktverteidigung Munition bestückt und vollständig aufgeladen sein. Reichweite 64, 50% Genauigkeit, benötigt Zeit zum Wiederaufladen. +se-meteor-point-defence-container=Zerstört Meteoriten. Muss in Meteoritenabwehr geladen werden. +se-rocket-launch-pad-silo-dummy-ingredient-item=Hergestellt aus 100 Frachtraketenbauteilen und 1 Raumkapsel im Frachtraketensilo. +se-rtg-equipment=Radioisotopen thermoelektrischer Generator. Ein tragbarer Generator der Hitze aus radoaktivem Zerfall in Elektrizität umwandelt. Die Energie reicht jahrzentelang, es wird kein zusätzlicher Treibstoff benötigt. +se-rtg-equipment-2=Radioisotopen thermoelektrischer Generator. Ein verbesserter tragbarer Generator der Hitze aus radoaktivem Zerfall in Elektrizität umwandelt. Die Energie reicht jahrzentelang, es wird kein zusätzlicher Treibstoff benötigt. +se-plague-bomb=Kann alle Lebensformen eines Planeten vernichten. Mit äußerster Vorsicht verwenden. (Während alles langsam stirbt können die UPS beeinträchtigt sein. Nicht empfohlen für große Planeten oder Multiplayer.) +se-space-capsule=Eine Steuerungskapsel wird benötigt für Frachtraketen. Kann verwendet werden um Passagiere zum nächstliegenden Planeten zu bringen. Einsteigen in die Kapsel mit __CONTROL__toggle-driving__. +se-space-platform-plating=Fortgeschrittene Beschichtung für schnelle Bewegung auf der Raumplattform. +se-space-platform-scaffold=Basis Gerüst für die Raumplattform um weitere Strukturen platzieren zu können. +se-space-rail=Schienen zur sicheren Verwendung im Weltraum, die Verhindern dass Züge davonfliegen und alles zerstören. Können aus ästhetischen Gründen auch auf der Oberfläche verwendet werden. +se-spaceship-floor=Dieser Boden muss unter allen Teilen des Raumschiffs und der Wände platziert werden. Löcher im Boden brechen die Integrität und können zum Verlust von Raumschiffteilen führen. +se-superconductive-cable=Ein supraleitendes Kabel das keine aktive Kühlung benötigt. +se-tesla-gun=Kettenblitz-Schnellfeuer-Waffe. +se-thruster-suit=Ein Raumanzug der zum Überleben im Weltraum benötigt wird. \nHat Schubdüsen und magnetische Schuhe. +se-thruster-suit-2=Ein Raumanzug der zum Überleben im Weltraum benötigt wird. \nHat stärkere Schubdüsen, größeres Inventar und ein größeres Ausrüstungsgitter. +se-thruster-suit-3=Ein Raumanzug der zum Überleben im Weltraum benötigt wird. \nHat stärkere Schubdüsen, größeres Inventar und ein größeres Ausrüstungsgitter. +se-thruster-suit-4=Ein Raumanzug der zum Überleben im Weltraum benötigt wird. \nHat stärkere Schubdüsen, größeres Inventar und ein größeres Ausrüstungsgitter. +space-science-pack=Wird in Weltraum Wissenschaftslaboren verwendet. +utility-science-pack=Wird in normalen Wissenschaftslaboren verwendet. + +[recipe-name] +core-fragment=Kernfragmentverarbeitung (__1__) +rocket-fuel=Raketenfestbrennstoff +se-astrometric-analysis-multispectral-1=Multispektrale astrometrische Analyse 1 +se-astrometric-analysis-multispectral-2=Multispektrale astrometrische Analyse 2 +se-astrometric-analysis-multispectral-3=Multispektrale astrometrische Analyse 3 +se-astronomic-insight-1=Astronomische Erkenntnis +se-astronomic-insight-2=Große astronomische Erkenntnis +se-astronomic-insight-3=Umfassende astronomische Erkenntnis +se-astronomic-insight-4=Erweiterte astronomische Erkenntnis +se-biological-insight-1=Biologische Erkenntnis +se-biological-insight-2=Große biologische Erkenntnis +se-biological-insight-3=Umfassende biologische Erkenntnis +se-biological-insight-4=Erweiterte biologische Erkenntnis +se-bio-methane-to-crude-oil=Methanverarbeitung zu Rohöl +se-bio-sludge-crude-oil=Bio-Schlamm aus experimenteller Biomasse +se-bio-sludge-decontamination=Bio-Schlamm Dekontaminierung +se-bio-sludge-from-fish=Bio-Schlamm aus Fisch +se-bio-sludge-from-wood=Bio-Schlamm aus Holz +se-bio-sludge=Bio-Schlamm aus Biomasse +se-broken-data-scrapping=Verschrottung zerstörter Datenkarten +se-cargo-rocket-section-pack=Paketieren von Frachtraketenbauteilen +se-cargo-rocket-section-unpack=Entpacken von Frachtraketenbauteilen +se-condenser-turbine-reclaim-water=Energieerzeugung mit Wasserrückgewinnung. +se-core-fragment-omni=Kernfragmentverarbeitung +se-core-mining=Kernerzförderung +se-empty-antimatter-canister=Antimateriestrom aus Behälter +se-empty-barrel-scrapping=Verschrottung leerer Fässer +se-empty-barrel-reprocessing=Verarbeitung leerer Fässer +se-space-capsule-scrapping=Verschrottung von Raumkapseln +se-energy-insight-1=Energieerkenntnis +se-energy-insight-2=Große Energieerkenntnis +se-energy-insight-3=Umfassende Energieerkenntnis +se-energy-insight-4=Erweiterte Energieerkenntnis +se-formatting-1=Datenkartenformatierung +se-formatting-2=Effiziente Datenkartenformatierung +se-formatting-3=Fortgeschrittene Datenkartenformatierung +se-material-insight-1=Materialerkenntnis +se-material-insight-2=Große Materialerkenntnis +se-material-insight-3=Umfassende Materialerkenntnis +se-material-insight-4=Erweiterte Materialerkenntnis +se-matter-fusion-copper=Fusionsmaterial (Kupfer) +se-matter-fusion-dirty=Fusionsmaterial (Schrott) +se-matter-fusion-iron=Fusionsmaterial (Eisen) +se-matter-fusion-stone=Fusionsmaterial (Stein) +se-matter-fusion-uranium=Fusionsmaterial (Uran) +se-plasma-canister-empty=Leerer Plasmabehälter +se-radiating-space-coolant-normal=Thermofluid abkühlen auf -10°C (Kühl) +se-radiating-space-coolant-slow=Langsames Thermofluid abkühlen auf -10°C (Kühl) +se-radiating-space-coolant-veryslow=Sehr langsames Thermofluid abkühlen auf -10°C (Kühl) +se-mixed-methane-gas-separation=Methangasabscheidung +se-rocket-fuel-from-water-copper=Raketentreibstoff aus Wasser +se-scrap-decontamination=Schrott Dekontamination +se-scrap-recycling=Schrott Recycling +se-space-coolant-cold=Thermofluid superkühlen auf -100°C (Kalt) +se-space-coolant-supercooled=Thermofluid superkühlen auf -273°C (Superkalt) +se-simulation-a=Astronomische Simulation +se-simulation-ab=Panspermie Simulation +se-simulation-abm=Xenoprogression Simulation +se-simulation-am=Materieverteilungs Simulation +se-simulation-as=Astropartikel Simulation +se-simulation-asb=Astrobionische Simulation +se-simulation-asbm=Universal Simulation +se-simulation-asm=Astrophysische Simulation +se-simulation-b=Biologische Simulation +se-simulation-bm=Biomechanische Simulation +se-simulation-m=Material Simulation +se-simulation-s=Energie Simulation +se-simulation-sb=Biochemische Simulation +se-simulation-sbm=Nanite Simulation +se-simulation-sm=Nanomaterial Simulation +se-space-water-decontamination=Kosmisches Wasser dekontaminieren +se-spaceship-rocket-engine-burn=Flüssigen Raketentreibstoff verbrennen +se-specimen-fish=Niedrigschwerkraft Fischzucht +se-specimen-wood=Niedrigschwerkraft Baumzucht +se-thermodynamics-coal=Druckkochen zu Kohle +se-used-lifesupport-canister-cleaning=Lebenserhaltungsbehälter reinigen + +[recipe-description] +se-astronomic-insight-2=Komplizierter, aber ressourceneffizienter. +se-astronomic-insight-3=Komplizierter, aber ressourceneffizienter. +se-astronomic-insight-4=Komplizierter, aber ressourceneffizienter. +se-biological-insight-2=Komplizierter, aber ressourceneffizienter. +se-biological-insight-3=Komplizierter, aber ressourceneffizienter. +se-biological-insight-4=Komplizierter, aber ressourceneffizienter. +se-core-mining=Das tatsächlich abgebaute Fragment hängt vom Planeten ab. Die reale Abbauzeit ist abhängig von der Anzahl der Kernerzförderer auf dem Planeten oder Mond. +se-energy-insight-2=Komplizierter, aber ressourceneffizienter. +se-energy-insight-3=Komplizierter, aber ressourceneffizienter. +se-energy-insight-4=Komplizierter, aber ressourceneffizienter. +se-material-insight-2=Komplizierter, aber ressourceneffizienter. +se-material-insight-3=Komplizierter, aber ressourceneffizienter. +se-material-insight-4=Komplizierter, aber ressourceneffizienter. +se-radiating-space-coolant-normal=Wiederholtes Kühlen und Erhitzen des Thermofluids führt zu Verlusten. +se-radiating-space-coolant-slow=Wiederholtes Kühlen und Erhitzen des Thermofluids führt zu Verlusten, langsameres Abkühlen führt zu geringeren Verlusten. +se-radiating-space-coolant-veryslow=Wiederholtes Kühlen und Erhitzen des Thermofluids führt zu Verlusten, langsameres Abkühlen führt zu geringeren Verlusten. + +[technology-name] +effectivity-module-4=Effizienzmodul 4 +effectivity-module-5=Effizienzmodul 5 +effectivity-module-6=Effizienzmodul 6 +effectivity-module-7=Effizienzmodul 7 +effectivity-module-8=Effizienzmodul 8 +effectivity-module-9=Effizienzmodul 9 +energy-shield-equipment=Energieschild +energy-shield-mk2-equipment=Energieschild MK2 +energy-shield-mk3-equipment=Energieschild MK3 +energy-shield-mk4-equipment=Energieschild MK4 +energy-shield-mk5-equipment=Energieschild MK5 +energy-shield-mk6-equipment=Energieschild MK6 +sand-processing=Sandverarbeitung +glass-processing=Glasverarbeitung +liquid-rocket-fuel=Flüssiger Raketentreibstoff +productivity-module-4=Produktivitätsmodul 4 +productivity-module-5=Produktivitätsmodul 5 +productivity-module-6=Produktivitätsmodul 6 +productivity-module-7=Produktivitätsmodul 7 +productivity-module-8=Produktivitätsmodul 8 +productivity-module-9=Produktivitätsmodul 9 +rocket-silo=Satellite Raketensilo +rocketry=Kampf-Raketentechnik +se-adaptive-armour=Adaptive Rüstung +se-antimatter-engine=Antimaterieantrieb +se-antimatter-reactor=Antimateriereaktor +se-antimatter-production=Antimaterieproduktion +se-astronomic-science-pack=Wissenschaftspaket für Astronomie +se-biological-science-pack=Wissenschaftspaket für Biologie +se-condenser-turbine=Kondensatorturbine +se-core-miner=Kernerzförderung +se-deep-space-science-pack=Wissenschaftspaket für Weltraumforschung +se-electric-boiler=Elektrischer Heizkessel +se-energy-science-pack=Wissenschaftspaket für Energie +se-fluid-burner-generator=Flüssigkeitswärmegenerator +se-fuel-refining=Treibstoffraffination +se-heat-shielding=Hitzeschild +se-material-science-pack=Wissenschaftspaket für Material +se-medpack=Medpack +se-medpack-2=Medpack 2 +se-medpack-3=Medpack 3 +se-medpack-4=Medpack 4 +se-meteor-defence=Meteoriten-Verteidigungsanlagen +se-meteor-point-defence=Meteoriten-Punktverteidigung +se-plague=Die Seuche +se-railgun=Railgun +se-rocket-cargo-safety=Frachtraketensicherheit +se-rocket-fuel-from-water=Raketenfestbrennstoff aus Wasser +se-rocket-launch-pad=Frachtraketensilo +se-rocket-landing-pad=Frachtlandeplatz +se-rocket-reusability=Raketenwiederverwendbarkeit +se-rocket-survivability=Raketenüberlebenschancen +se-rtg-equipment=Tragbarer RTG +se-rtg-equipment-2=Tragbarer RTG MK2 +se-space-assembling=Weltraummontage +se-space-accumulator=Weltraum Akkumulator +se-space-astrometrics-laboratory=Astrometrielabor +se-space-biochemical-laboratory=Biochemielabor +se-space-catalogue-astronomic=Astronomiekatalog +se-space-catalogue-biological=Biologiekatalog +se-space-catalogue-energy=Energiekatalog +se-space-catalogue-material=Materialkatalog +se-space-data-card=Datenkarte +se-space-decontamination-facility=Dekontaminationsanlage +se-space-electromagnetics-laboratory=Elektromagnetismuslabor +se-space-genetics-laboratory=Genetiklabor +se-space-gravimetrics-laboratory=Gravimetrielabor +se-space-growth-facility=Aufzuchtsanlage +se-space-hypercooling=Superkühlen +se-space-laser-laboratory=Laserlabor +se-space-lifesupport-facility=Lebenserhaltungsanlage +se-space-manufactory=Weltraumfabrik +se-space-material-fabricator=Materialfabrikator +se-space-mechanical-laboratory=Mechaniklabor +se-space-particle-accelerator=Partikelbeschleuniger +se-space-particle-collider=Partikelkollidierer +se-space-plasma-generator=Plasmagenerator +se-space-platform-plating=Weltraumplattform Beschichtung +se-space-platform-scaffold=Weltraumplattform Gerüst +se-space-radiation-laboratory=Strahlenlabor +se-space-radiator=Thermischer Kühler +se-space-rail=Weltraumeisenbahn +se-space-recycling-facility=Recyclinganlage +se-space-science-lab=Weltraum Wissenschaftslabor +se-space-simulation-ab=Panspermie Simulation +se-space-simulation-am=Astromaterial Simulation +se-space-simulation-as=Astropartikel Simulation +se-space-simulation-bm=Biomechanische Simulation +se-space-simulation-sb=Biochemische Simulation +se-space-simulation-sm=Nanomaterial Simulation +se-space-simulation-abm=Xenoprogression Simulation +se-space-simulation-asb=Astrobionic Simulation +se-space-simulation-asm=Astrophysische Simulation +se-space-simulation-sbm=Nanite Simulation +se-space-simulation-asbm=Universal Simulation +se-space-solar-panel=Weltraumsolarpanel +se-space-solar-panel-adv=Fortgeschrittenes Weltraumsolarpanel +se-space-spectrometry-facility=Spektrometrieanlage +se-space-supercomputer=Supercomputer +se-space-telescope=Teleskop +se-space-telescope-gammaray=Gammastrahlenteleskop +se-space-telescope-xray=Röntgenteleskop +se-space-telescope-microwave=Microwellenteleskop +se-space-telescope-radio=Radiowellenteleskop +se-space-thermodynamics-laboratory=Thermodynamiklabor +se-spaceship=Raumschiff +se-spaceship-integrity=Strukturelle Raumschiff Integrität +se-factory-spaceship=Raumschifffabrik +se-superconductive-cable=Supraleitendes Kabel +se-teleportation=Teleportation +se-tesla-gun=Teslagewehr +se-thruster-suit=Raumanzug +space-science-pack=Wissenschaftspaket für Raumfahrt +speed-module-4=Geschwindigkeitsmodul 4 +speed-module-5=Geschwindigkeitsmodul 5 +speed-module-6=Geschwindigkeitsmodul 6 +speed-module-7=Geschwindigkeitsmodul 7 +speed-module-8=Geschwindigkeitsmodul 8 +speed-module-9=Geschwindigkeitsmodul 9 + +[technology-description] +energy-shield-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +energy-shield-mk2-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +energy-shield-mk3-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +energy-shield-mk4-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +energy-shield-mk5-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +energy-shield-mk6-equipment=Eine Schutzhülle die sich schnell auflädt, aber viel Energie benötigt. +sand-processing=Zerkleinern, mahlen und filtern vom Rohmaterial zu sauberem Sand. +glass-processing=Sand zu Glas schmelzen. +rocket-silo=Ermöglicht den Start von Satelliten in den Weltraum um Raumfahrtforschung zu entwickeln und Himmelskörper zu entdecken. +se-adaptive-armour=Eine Rüstung die sich mit Energie selbst repariert. Erfüllt eine ähnliche Rolle wie das Energieschild mit weniger Energiebedarf aber langsamerer Regeneration. +se-antimatter-engine=Vernichtet Antimaterie um einen unglaublichen Schub zu erzeugen. +se-antimatter-reactor=Vernichtet Antimaterie mit Materie um große Hitze zu erzeugen. +se-antimatter-production=Erzeuge Antimaterie, die dichteste Form von gespeicherter Energie. +se-astronomic-science-pack=Erlaubt die Erforschung von Technologien für Weltraumreisen und interstellarer Logistik. +se-biological-science-pack=Erlaubt die Erforschung von Technologien zur Verbesserung deiner physikalischen Möglichkeiten, Bio-Waffen und neuronale Verarbeitung. +se-condenser-turbine=Ist 75% so energieeffizient wie eine Dampfturbine aber 99% des Dampfs wird als Wasser zurückgeliefert. +se-core-miner=Erlaubt eine endlose Extraktion von Ressourcen vom Kern des Planeten oder Mondes, aber hat abnehmende Erträge, wenn mehrere auf derselben Oberfläche verwendet werden. +se-deep-space-science-pack=Wird für die am meisten fortgeschrittenen Technologien benötigt. +se-electric-boiler=Wandelt mit Hilfe von elektischer Energie Wasser in Dampf um. +se-energy-science-pack=Erlaubt die Erforschung von Technologien zu fundamentalen Kräften und subatomare Entdeckungen. +se-fluid-burner-generator=Benötigt flüssigen Treibstoff mit einem Energiewert (wie flüssigen Raketentreibstoff) um Elektrizität zu erzeugen. Einfach und kompakt aber energieineffizient im Vergleich zu Dampfturbinen. Entwickelt für den Weltraum. +se-fuel-refining=Raffiniert fortgeschrittene Treibstoffe. +se-heat-shielding=Eine zusammengesetzte Kachel für Hochtemperatur Anwendungen und Weltraumstrukturen. +se-material-science-pack=Erlaubt die Erforschung von Technologien für fortgeschrittene Materialien für fortgeschrittene technische Anforderungen. +se-medpack=Verwende das Medpack um dich selbst zu heilen. +se-medpack-2=Verwende das Medpack um dich selbst zu heilen. +se-medpack-3=Verwende das Medpack um dich selbst zu heilen. +se-medpack-4=Verwende das Medpack um dich selbst zu heilen. +se-meteor-defence=Schieße Meteore vom Himmel bevor sie den Zeug zerstören. Eine Meteoriten-Verteidigungsanlage eine ganze Planetenoberfläche vor Meteoreinschlägen schützen, aber kann nur einen Schuss abgeben. +se-meteor-point-defence=Schieße Meteore vom Himmel bevor sie den Zeug zerstören. Eine Meteoriten-Punktverteidigungsanlage beschützt einen kleinen Bereich von bis zu 4 Meteore gleichzeitig. +se-railgun=Elektromagnetisch beschleunigte Geschosse angetrieben zu hoher Geschwindigkeit dass diese eine Plasmaspur hinterlassen bevor die vaporisieren. Hoher Schaden, niedrige Feuerrate. +se-plague=Die große Seuche die jedes Leben auf einem Planeten auslöscht. Mit EXTREMER Vorsicht verwenden. +se-rocket-cargo-safety=Verringert das Risiko, dass Frachtkapseln beim Transit beschädigt werden um 10% (multiplikativ) +se-rocket-fuel-from-water=Erzeugt Sauerstoff-Wasserstoff-Raketentreibstoff aus Wasser durch Elektrolyse. +se-rocket-landing-pad=Erlaubt die Anlieferung von Frachtraketen Kapseln an einen benannten Frachtanlieferungsplatz. Mit weiterer Forschung können mehr Raketenbauteile gerettet werden. +se-rocket-launch-pad=Erlaubt den Start von Fracht in den Weltraum oder zu anderen Himmelskörpern. +se-rocket-reusability=Erhöht die Prozentzahl der Teile die bei einer erfolgreichen Landung gerettet werden können um 4%. +se-rocket-survivability=Verringert das Risiko, dass Raketen im Transit Navigationsfehler haben und den Frachtanlieferungsplatz verpassen um 10% (multiplikativ). +se-rtg-equipment=Radioisotopen thermoelektrischer Generator. Ein tragbarer Generator der Hitze aus radioaktivem Zerfall in Elektrizität umwandelt. Die Energie reicht jahrzehntelang, es wird kein zusätzlicher Treibstoff benötigt. +se-rtg-equipment-2=Radioisotopen thermoelektrischer Generator. Ein verbesserter tragbarer Generator der Hitze aus radioaktivem Zerfall in Elektrizität umwandelt. Die Energie reicht jahrzehntelang, es wird kein zusätzlicher Treibstoff benötigt. +se-space-assembling=Eine modifizierte Montagemaschine die auch im Weltraum funktioniert. +se-space-astrometrics-laboratory=Verbindet, vergleicht und quantifiziert unterschiedliche Quellen von astronomischer Informationen. +se-space-biochemical-laboratory=Ein fortgeschrittenes chemisches Labor mit Spezialisierung in Bio-Chemie. Kann auch einfache chemische Prozesse und Ölverarbeitung durchführen. +se-space-catalogue-astronomic=Strukturierte astronomische Daten, vorbereitet für Analyse und Computersimulation. Benötigt für weitere astronomische Forschung. +se-space-catalogue-biological=Strukturierte biologische Daten, vorbereitet für Analyse und Computersimulation. Benötigt für weitere biologische Forschung. +se-space-catalogue-energy=Strukturierte energetische Daten, vorbereitet für Analyse und Computersimulation. Benötigt für weitere energetische Forschung. +se-space-catalogue-material=Strukturierte Material Daten, vorbereitet für Analyse und Computersimulation. Benötigt für weitere Material Forschung. +se-space-data-card=Eine Mehrzweck Datenspeicherkarte, Benötigt für weiter fortgeschrittene datengetriebene Forschung. +se-space-decontamination-facility=Reinigt Substanzen für die Verwendung in sterilen Umgebungen und bearbeitet Flüssigkeiten für die Verwendung in Niedrigdruckverhältnissen. +se-space-electromagnetics-laboratory=Anlage für enorme Magnetfeld- und extreme Hochspannungsanwendungen. +se-space-genetics-laboratory=Ein Labor für genetische Sequenzierung, Modifikation und Prägung von Bio-Kulturen. +se-space-gravimetrics-laboratory=Analysiert und simuliert Störungen in der Schwerkraft. +se-space-growth-facility=Züchtet biologische Proben unter kontrollierten Bedingungen, die nirgendwo anders herrschen wie etwa Niedrigschwerkraft. +se-space-hypercooling=Vollzieht einen Temperaturaustausch im Thermofluid, in dem es einen Teil heißer macht und einen Teil kälter. +se-space-laser-laboratory=Laserexperimete. Augenschutz dringend empfohlen. +se-space-lifesupport-facility=Unterstützt Leben in lebensfeindlichen Umgebungen. +se-space-manufactory=Eine Schlüsseltechnologie für die Massenproduktion im Weltraum. +se-space-material-fabricator=Synthetisiert neue Materialien. Eine Kreuzung zwischen Teilchenbeschleuniger und 3D Drucker. +se-space-mechanical-laboratory=Bietet eine Reihe von mechanischen Prozessen: Zerkleinern, Zerreißen, Scheren, Vibrieren usw. +se-space-particle-accelerator=Beschleunigt Partikel auf annähernd Lichtgeschwindigkeit. +se-space-particle-collider=Läßt Partikel kollidieren und analysiert die Ergebnisse. +se-space-plasma-generator=Erzeugt unterschiedliche Plasmaströme. +se-space-platform-plating=Robuste Weltraumplattform Beschichtung. Eben und für den schnellen Weltraumspaziergang. +se-space-platform-scaffold=Basis Gerüst für die Raumplattform. Etwas auf das man bauen kann aber nicht gut geeignet für den Weltraumspaziergang. +se-space-radiation-laboratory=Ein relativ sicherer Ort zum Arbeiten mit radioaktivem Material. Kann für Uranverarbeitung verwendet werden. +se-space-radiator=Kühlt Thermofluid ab. +se-space-rail=Schienen zur sicheren Verwendung im Weltraum, die Verhindern dass Züge davonfliegen und alles zerstören. Können aus ästhetischen Gründen auch auf der Oberfläche verwendet werden. +se-space-recycling-facility=Verschrottung von Gegenständen und Recycling von Schrott in Rohmaterial. +se-space-science-lab=Erlaubt die Verarbeitung von Raumfahrtforschung und weiter fortgeschrittener Weltraumforschung. +se-space-simulation-ab=Effizientere Simulation durch Kombination von mehreren Disziplinen. +se-space-simulation-am=Effizientere Simulation durch Kombination von mehreren Disziplinen. +se-space-simulation-as=Effizientere Simulation durch Kombination von mehreren Disziplinen. +se-space-simulation-bm=Effizientere Simulation durch Kombination von mehreren Disziplinen. +se-space-simulation-sb=Effizientere Simulation durch Kombination von mehreren Disziplinen. +se-space-simulation-sm=Effizientere Simulation durch Kombination von mehreren Disziplinen. +se-space-simulation-abm=Effizientere Simulation durch Kombination von mehreren Disziplinen. +se-space-simulation-asb=Effizientere Simulation durch Kombination von mehreren Disziplinen. +se-space-simulation-asm=Effizientere Simulation durch Kombination von mehreren Disziplinen. +se-space-simulation-sbm=Effizientere Simulation durch Kombination von mehreren Disziplinen. +se-space-simulation-asbm=Effizientere Simulation durch Kombination von mehreren Disziplinen. +se-space-solar-panel=Ein hocheffizientes Solarpanel für den Weltraum. +se-space-solar-panel-adv=Ein fortgeschrittenes hocheffizientes Solarpanel für den Weltraum. +se-space-spectrometry-facility=Spektralphotometrie, Gaschromatographie, Massenspektronomie und andere Spektronomien. Schießt Zeug gegen eine Wand, biegt es, bricht es und schaut wo es trifft. +se-space-supercomputer=Erlaubt weiterfortgeschrittene Datenmanipulation, Verarbeitung und Simulation. +se-space-telescope=Ein hochentwickeltes Teleskop für viele Wellenlängen rund um das sichtbare Spektrum. +se-space-telescope-gammaray=Gammastrahlen können nicht abgelenkt werden. Dieses leistungsfähige Teleskop verwendet stattdessen spezielle Detektoren. +se-space-telescope-xray=Röntgenstrahlung wird von den meisten Atmosphären blockiert. Dieses leistungsfähige Teleskop ist für den Weltraum entwickelt wo die Atmossphäre keine Rolle spielt. +se-space-telescope-microwave=Ein gigantisches Teleskop das Mikrowellen und die kosmische Hintergrundstrahlung messen kann. +se-space-telescope-radio=Ein gigantisches Teleskop das sehr schwache Radiowellen aus weit entfernten Quellen messen kann. +se-space-thermodynamics-laboratory=Unterstützt Anwendungen für extreme Temperaturen. Kann auch einfache Vorgänge, wie etwa Schmelzen, durchführen. +se-spaceship=Ein Schiff das Stück für Stück aus Boden und Wänden gebaut wird, verwende die Konsole um zu einem anderen Planeten oder darüber hinaus zu fliegen. +se-spaceship-integrity=Jedes Level erhöht das maximale strukturelle Integritätsstresslimit des Raumschiffs um 100. +se-factory-spaceship=Jedes Level erhöht das maximale strukturelle Integritätsstresslimit des Raumschiffs um 500. +se-superconductive-cable=Ein supraleitendes Kabel das keine aktive Kühlung benötigt. +se-teleportation=Entsperrt weitere Teleportationstechnologie. Es hat sich herausgestellt dass das sichere Verkrümmen des Weltraums in diesem Ausmaß wirklich schwer ist. +se-tesla-gun=Kettenblitz-Schnellfeuer-Waffe. Kann bis zu 30 Gegner pro Blitz treffen. Kann weite Sprünge zwischen den Gegnern machen oder kurze am Boden wenn keine Gegner vorhanden sind. +se-thruster-suit=Ein Raumanzug mit Schubdüsen und magnetische Schuhen. Gehe nicht in den Weltraum ohne ihn. +se-thruster-suit-2=Ein verbesserter Raumanzug mit stärkeren Schubdüsen, größerem Inventar und einem größeren Ausrüstungsgitter. +se-thruster-suit-3=Ein verbesserter Raumanzug mit stärkeren Schubdüsen, größerem Inventar und einem größeren Ausrüstungsgitter. +se-thruster-suit-4=Ein verbesserter Raumanzug mit stärkeren Schubdüsen, größerem Inventar und einem größeren Ausrüstungsgitter. +space-science-pack=Erlaubt die Herstellung von Wissenschaftspaketen für Raumfahrt und Technologien die von dieser Forschung profitieren. + +[modifier-description] +tesla-shooting-speed-bonus=Tesla Schussgeschwindigkeit +tesla-damage-bonus=Tesla Schadensbonus +railgun-damage-bonus=Railgun Schadensbonus +railgun-shooting-speed-bonus=Railgun Schussgeschwindigkeit + +[virtual-signal-name] +se-star=Stern +se-planet=Planet +se-planet-orbit=Planetarerorbit +se-moon=Mond +se-moon-orbit=Mondorbit +se-asteroid-belt=Asteroidengürtel +se-asteroid-field=Asteroidenfeld +se-anomaly=Anomalie +se-meteor=Meteor +se-spaceship=Raumschiff +se-remote-view=Fernansicht +se-death=Tod +se-character-corpse=Körper + +[controls] +se-remote-view=Navigationssatelliten-Sicht +se-respawn=Respawn + +[shortcut] +se-remote-view=Navigationssatelliten-Sicht +se-respawn=Respawn + +[shortcut-name] +se-remote-view=Navigationssatelliten-Sicht [__CONTROL__se-remote-view__] +se-respawn=Respawn [__CONTROL__se-respawn__] + +[tile-name] +se-space-platform-plating=Weltraumplattform Beschichtung +se-space-platform-scaffold=Weltraumplattform Gerüst +se-space-platform-underlay=Weltraum +se-space-platform-underlay-l=Weltraum +se-space-platform-underlay-r=Weltraum +se-space=Leerer Weltraum +se-regolith=Regolith +se-asteroid=Asteroid +se-spaceship-floor=Raumschiffboden + +[mod-setting-name] +se-meteor-interval=Meteorschauer Intervall +se-plague-max-runtime=Seuchen maximale Laufzeit +se-planets=Anzahl von Planeten +se-planet-size=Planetengröße (1% to 10000%) +se-seed=Planeten Generierungsseed +se-skip-experimental-warning=Experimental Warnungsmeldung nicht anzeigen. +se-print-meteor-info=Meteoreinschlagsalarme in der Konsole ausgeben. +se-space-pipe-capacity=Weltraumrohrkapazität +se-electric-boiler=Elektrischer Heizkessel + +[mod-setting-description] +se-meteor-interval=Das Basisinterval in Minuten zwischen Meteorschauern. Der nächste Meteorschauer erfolgt in einem zufälligen Abstand in Minuten zwischen 1 und diesem Wert. +se-plague-max-runtime=Die maximale Laufzeit der Seuchenwaffe in Minuten. Nachdem die Seuche für diese Dauer angehalten hat sind alle Seuchenpartikel, Bäume und Gegner zerstört. +se-planets=Nicht während einer teilweise durchspielten Kampagne ändern. +se-planet-size=Nicht während einer teilweise durchspielten Kampagne ändern. +se-seed=Nicht während einer teilweise durchspielten Kampagne ändern. +se-skip-experimental-warning=Die Warnung wird beim Starten eines neuen Spiels nicht angezeigt und du erhältst keine geänderten Warnungen, falls sich die Meldung ändert. +se-print-meteor-info=Zeigt die Meteoriteneinschlagsalarme in der Konsole(Taste: __CONTROL__toggle-console__) an, auch nachdem der Alarm ausgeblendet wurde. +se-space-pipe-capacity=Die Flüssigkeitenapazität in Weltraumrohren. +se-electric-boiler=Füge dem Spiel einen elektrischen Heizkessel hinzu. + +[autoplace-control-names] +planet-size=Planetengröße +se-water-ice=Wassereis (nur im Weltraum, die Schieber haben keine Auswirkung) +se-methane-ice=Methaneis (nur im Weltraum, die Schieber haben keine Auswirkung) + +[mod-name] +space-exploration=Space Exploration + +[mod-description] +space-exploration=Baue Frachtraketen, um Sachen in den Weltraum zu schicken. Fliege mit einer Rakete ins All und beginnen deinen Weltraumspaziergang. Bauen eine Orbital-Weltraumplattform, um komplizierte, auf Daten basierende Weltraumforschung zu entwickeln. Bauen Stück für Stück ein Raumschiff, fliegen von einer Oberfläche eines Planeten zur anderen, zum Mond, zu den Asteroidengürteln und zu mehr. Verfolgen den Fortschritt auf https://discord.gg/ymjUVMv diff --git a/space-exploration_0.5.58/space-exploration/locale/en/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/en/strings.cfg new file mode 100644 index 0000000..f07f8a4 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/en/strings.cfg @@ -0,0 +1,2243 @@ +spaceship-integrity100=+100 Spaceship structural integrity +spaceship-integrity300=+300 Spaceship structural integrity +spaceship-integrity500=+500 Spaceship structural integrity +arcosphere-discovery=Collect arcospheres from deep interstellar space +core-mining-productivity-5=+5% Core mining productivity +se-zone-discovery-random=Triggers random zone discovery when researched. +se-zone-discovery-targeted=Triggers resource-targeted zone discovery when researched. +se-zone-discovery-deep=Triggers deep-space zone discovery when researched. +unlock-spaceship-victory=Unlocks spaceship victory condition: Ride a 3000+ integrity spaceship with a Nexus running in Distortion Driver mode at 250 speed for 60 seconds in interstellar space. + +[mod-name] +space-exploration=Space Exploration + +[mod-description] +space-exploration=Build Cargo Rockets to launch stuff into space. Ride a rocket into space yourself and start spacewalking. Build an orbital space platform to develop difficult data-driven space science. Build a spaceship tile by tile, fly it from a planet surface to other planets, moon, asteroid belts, and more. Strongly recommended to play with AAI Industry. Space Exploration Postprocess is required (can't be a dependency, long explanation). Not recommended to play with non-dependency mods while in experimental phase. + +[space-exploration] +space-exploration=Space Exploration +menu_space-exploration=Space Exploration +title_space-exploration=Space Exploration +off=Off +on=On +close=Close +show=Show +show-own-location=Show own location +wdc_auto_off=Manual targeting +wdc_auto_on=Automatic retargeting +name=Name +rename-something=Rename __1__ +trigger-none=None (Manual) +trigger-fuel-full=Launch On Fuel Full +trigger-cargo-full=Launch On Cargo Full +trigger-fuel-full-signal=Launch On Green Signal when Fuel Full +trigger-cargo-full-signal=Launch On Green Signal when Cargo Full +trigger-cargo-full-or-signal=Launch On Green Signal or when Cargo Full +destination-type-zone=Approximate Location +destination-type-landing-pad=Cargo Landing Pad +button-launch=Launch +button-launch-disabled=Launch (Disabled) +destination-crash-warning=Warning: Select a Cargo Landing Pad to decrease crash chance +recipe-to=__1__ to __2__ +recipe-from=__1__ from __2__ +simple-a-b=__1____2__ +simple-a-b-space=__1__ __2__ +simple-a-b-comma=__1__, __2__ +simple-a-b-break=__1__\n__2__ +simple-bold=[font=default-bold]__1__[/font] +interstellar-map=Interstellar Map +interstellar-space=Interstellar Space +planetary-system=__1__ System +solar-system=__1__ System +remote-view=Navigation Satellite Uplink [__CONTROL__se-remote-view__] +remote-view-window-title=[img=virtual-signal/se-remote-view] Navigation Satellite [__CONTROL__se-remote-view__] +remote-view-currently-viewing=Currently viewing: +remote-view-instruction=Launch more satellites to discover more stars, planets, moons, and other zones. +remote-view-spaceships=__1__ Spaceships +remote-view-spaceships-anchored=__1__ Spaceships anchored +remote-view-clamps=__1__ Spaceship clamps +remote-view-show-hide-resources=Show/hide resources +remote-view-show-hide-stats=Show/hide statistics +remote-view-show-hide-anchor-info=Show/hide anchor info +open-pins-remote-view=All Pins [__CONTROL__se-remote-view-pins__] +exit-pins-remote-view=Exit All Pins [__CONTROL__se-remote-view-pins__] +remote-view-history-delete=Delete surface history. +remote-view-history-previous=Go back in surface history [__CONTROL__se-remote-view-previous__].\n__1__ +remote-view-history-next=Go forward in surface history [__CONTROL__se-remote-view-next__].\n__1__ +remote-view-history-item=__1__ +remote-view-history-item_named=__1__ → __2__ +exit-remote-view=Exit Navigation Satellite Uplink [__CONTROL__se-remote-view__] +remote-view-pin-make=Pin the current view +remote-view-pins-list=All Pins +remote-view-add-pin=Create a new pin at the current location. +remote-view-pin-details=Pin properties +remote-view-pin-button-tooltip=__1__ → __2__ +remote-view-pin-button-tooltip-hotkey-one=__1__ → __2__ [__CONTROL__se-pin-one__] +remote-view-pin-button-tooltip-hotkey-two=__1__ → __2__ [__CONTROL__se-pin-two__] +remote-view-pin-button-tooltip-hotkey-three=__1__ → __2__ [__CONTROL__se-pin-three__] +remote-view-pin-button-tooltip-hotkey-four=__1__ → __2__ [__CONTROL__se-pin-four__] +remote-view-pin-button-tooltip-hotkey-five=__1__ → __2__ [__CONTROL__se-pin-five__] +remote-view-pin-button-tooltip-hotkey-six=__1__ → __2__ [__CONTROL__se-pin-six__] +remote-view-pin-button-tooltip-hotkey-seven=__1__ → __2__ [__CONTROL__se-pin-seven__] +remote-view-pin-button-tooltip-hotkey-eight=__1__ → __2__ [__CONTROL__se-pin-eight__] +remote-view-pin-button-tooltip-hotkey-nine=__1__ → __2__ [__CONTROL__se-pin-nine__] +remote-view-pin-button-tooltip-hotkey-zero=__1__ → __2__ [__CONTROL__se-pin-zero__] +remote-view-pin-button-tooltip-help-text=\n\n[font=default-bold]- Controls -[/font]\nLeft-click: Switch to the pinned location\nRight-click: Edit pin\nControl-right-click: Delete +remote-view-pin-button-tooltip-help-text-update-position=\nShift-right-click: Update pin position +remote-view-pin-name=Name +remote-view-pin-icon=Icon +remote-view-pin-zoom=Zoom +remote-view-pin-hotkey=Hotkey +remote-view-pin-hotkey-none=None +remote-view-pin-hotkey-one=__CONTROL__se-pin-one__ - __1__ +remote-view-pin-hotkey-two=__CONTROL__se-pin-two__ - __1__ +remote-view-pin-hotkey-three=__CONTROL__se-pin-three__ - __1__ +remote-view-pin-hotkey-four=__CONTROL__se-pin-four__ - __1__ +remote-view-pin-hotkey-five=__CONTROL__se-pin-five__ - __1__ +remote-view-pin-hotkey-six=__CONTROL__se-pin-six__ - __1__ +remote-view-pin-hotkey-seven=__CONTROL__se-pin-seven__ - __1__ +remote-view-pin-hotkey-eight=__CONTROL__se-pin-eight__ - __1__ +remote-view-pin-hotkey-nine=__CONTROL__se-pin-nine__ - __1__ +remote-view-pin-hotkey-zero=__CONTROL__se-pin-zero__ - __1__ +remote-view-pin-location=Location +remote-view-pin-location-position={x=__1__, y=__2__} +remote-view-pin-location-position-button=Update pin position +remote-view-pin-location-position-button-tooltip=Immediately set the position of the pin to the currently viewed location. +remote-view-pin-viewer-title=All Pins +remote-view-pin-viewer-misc-row=Misc +remote-view-pin-viewer-spaceship-row=Spaceships +open-zonelist=Open Universe Explorer +zonelist-window-title=[img=virtual-signal/se-planet-orbit] Universe Explorer [__CONTROL__se-universe-explorer__] +priority-icon=[img=virtual-signal/se-accolade] +priority-tooltip=Priority (to sort important vs irrelevant zones) +trim-zone-button=[img=item/cliff-explosives] Trim Surface +trim-zone-button-tooltip=Remove chunks outside the bounding box defined by player entities, special entities, and the map origin. +trim-zone-button-no-surface-tooltip=Surface does not exist. +trim-zone-results=Deleted __1__ from chunks from __2__. Trimmed to box X [__3__ to __4__] Y [__5__ to __6__] +delete-zone-button=[img=virtual-signal/se-remove] Delete Surface +delete-zone-button-tooltip=Certain surfaces cannot be deleted. +delete-zone-button-no-surface-tooltip=Surface does not exist. +scan-zone-button=[img=item/satellite] Scan Surface +scan-zone-button-tooltip=Warning: This may slow down the game while the scanning is in progress. Scanning rate can be configured in mod options. Scanning can be stopped at any time. +scan-zone-button-disabled-tooltip=You must launch a satellite to scan the surface. +stop-scan-zone-button=[img=item/satellite] Stop all scans +stop-scan-zone-button-tooltip=Stops any active scans on all surfaces. +generic-requires-satellite=You must launch a satellite first. +remote-view-requires-satellite=You must launch a satellite to use the navigation satellite uplink. +satellite-discovered-platform=[color=cyan]The Satellite discovered some orbiting space platform.[/color] Open [img=virtual-signal/se-planet-orbit] Universe Explorer [__CONTROL__se-universe-explorer__], select __1__, and click View Surface. There might be useful stuff up there. +satellite-view-unlocked=You have unlocked the [color=cyan][img=virtual-signal/se-remote-view] Navigation Satellite Uplink[/color]. This allows you to view the world, and other places that you have discovered, via a satellite. Press [color=green][__CONTROL__se-remote-view__][/color] to activate or use the shortcut toolbar (to the right of your hotbar). +source-discovered-zone=[color=cyan]__1__ discovered a new __2__: [/color][img=__3__] [color=white]__4__[/color]. Discovered locations can be viewed in the [img=virtual-signal/se-planet-orbit] Universe Explorer [__CONTROL__se-universe-explorer__]. +discovered-zone=[color=cyan]Discovered a new __1__: [img=__2__] [/color][color=white]__3__[/color]. +discovered-anomaly-additional=Unknown object detected in the [img=virtual-signal/se-anomaly] anomaly. Your [img=virtual-signal/informatron] Exploration Journal [__CONTROL__informatron__] has been updated. +satellite-discovered-nothing=A new satellite was launched but it did not find anything new. There may be more to find around other stars. +tech-discovered-nothing=The telescopes did not find anything new near stars. There may be more to find in deep space. +tech-deep-discovered-nothing=The telescopes did not find anything new in deep space. +galaxy_ship_authenticated=[img=virtual-signal/se-spaceship] Derelict spaceship: [color=cyan]"Biosignature authenticated. Airlock access code is 2236067964. Transmitting emergency backup log."[/color] Your [img=virtual-signal/informatron] Exploration Journal [__CONTROL__informatron__] has been updated. +space-capsule=Space Capsule +player-died=__1__ died +launch-suit-warning=To avoid suffocation, please consider putting on your thruster suit and putting lifesupport canisters in your inventory. +suffocating-warning=You are suffocating. Get in a space capsule or put on your thruster suit with some lifesupport canisters in your inventory. +rocket_survivability_fail=A cargo rocket has sustained damage in transit and is off course. Additional rocket survivability and cargo safety research advised. __1__ +respawn-if-stranded=If stranded you can use the respawn shortcut [__CONTROL__se-respawn__]. +respawn-options-title=Respawn destination +respawn-button-homeworld=[img=virtual-signal/se-planet] Homeworld +respawn-button-landing-pad=[img=item/se-rocket-landing-pad] Closest Landing Pad +respawn-button-spaceship=[img=virtual-signal/se-spaceship] Closest Spaceship +respawn-confirm-title=Are you sure you want to respawn? +respawn-confirm-yes=[img=virtual-signal/se-death] Respawn +respawn-confirm-no=Cancel +search-list=Search +clear-search=Clear search +filter-list=Filter +clear-filter=Clear filter +attrition-type-radiation=radiation +attrition-type-wind=wind +attrition-type-spacial-distortion=spacial distortion +zonelist-view-surface=View Surface +zonelist-heading-hierarchy=Hierarchy +zonelist-heading-type=Zone type +zonelist-heading-name=Name +zonelist-heading-radius=Radius +zonelist-heading-primary-resource=Primary resource +zonelist-heading-attrition=Robot interference +zonelist-heading-threat=Threat +zonelist-heading-solar=Solar +zonelist-heading-flags=Flags +zonelist-heading-priority=Priority +zonelist_filter_star=Include stars +zonelist_filter_planet=Include planets +zonelist_filter_planet-orbit=Include planet orbits +zonelist_filter_moon=Include moons +zonelist_filter_moon-orbit=Include moon orbits +zonelist_filter_asteroid-belt=Include asteroid belts +zonelist_filter_asteroid-field=Include asteroid fields +zonelist_filter_anomaly=Include anomaly +zonelist_filter_spaceship=Include spaceships +zonelist-resource-bar-tooltip=__1__ __2__\nFrequency: __3__\nSize: __4__\nRichness: __5__ +zonelist-resource-bar-tooltip-extended=__1__ __2__\nFrequency: __3__\nSize: __4__\nRichness: __5__\n__6__ +zonelist-resources-disclaimer=Resource probabilities are estimates. [?] +zonelist-resources-disclaimer-tooltip=All resource values are estimates based on element density.\nThey correspond to the game's map generation controls.\nActual resource patches will vary and may be prevented from spawning due to water, surface radius, or specific tile requirements. +resource-terrain-required-se-vulcanite=Requires volcanic terrain +resource-terrain-required-se-cryonite=Requires frozen terrain +resource-terrain-required-se-vitamelange=Requires grassy terrain +zone-tooltip-type=Zone type: +zone-tooltip-parent=Parent: +zone-tooltip-threat=Threat: +zone-tooltip-daynight=Day/night cycle: +zone-tooltip-bot-attrition=Robot interference __1__: +zone-tooltip-radius=Radius: +zone-tooltip-solar=Solar: +zone-tooltip-flags=Flags: +zone-tooltip-closest=Closest: +zone-tooltip-destination=Destination: +zone-tooltip-delta-v=∆v from __1__ +construction-denied=Cannot be placed here. +construction-denied-vehicle-in-space=Cannot place ground vehicles in space. +construction-denied-se-surface=Invalid location, must be placed on a Space Exploration surface. +construction-denied-linked-container-on-transient-surface=Cannot placed surface-linked containers on a moving spaceship. +construction-denied-no-water=No water +construction-denied-spaceship-only=Must be placed on spaceship flooring. +currently-viewing=Currently Viewing: __1__ +fail-board-no-character=Cannot board target ship, you must be attached to your character to use this action. +fail-board-remote-character=Cannot board target ship, your character is not on the ship you are trying to board from. +fail-board-target-anchored=Cannot board an anchored ship, try anchoring to the same location instead. +starmap=Starmap +starmap-button=[img=virtual-signal/se-star] Starmap +back=Back +spaceship=Spaceship +planet=Planet +moon=Moon +star=Star +orbit=Orbit +something_orbit=__1__ orbit +asteroid-belt=Asteroid belt +asteroid-field=Asteroid field +anomaly=Anomaly +spaceship-cannot-set-destination-to-self=Cannot set destination to self. +spaceship-streamline=Streamline: __1__ +spaceship-launch-energy=Launch energy: __1__ +spaceship-launch-energy-invalid=Launch energy: Requires valid integrity check. +spaceship-speed=Speed: __1__ +spaceship-structural-stress-hull=Structural Stress (Hull): __1__ +spaceship-structural-stress-hull-invalid=Structural Stress (Hull): NA (containment required) +spaceship-structural-stress-container=Structural Stress (Containers): __1__ +spaceship-structural-stress-container-invalid=Structural Stress (Containers): NA (containment required) +spaceship-travel-time-unknown=Travel time: Unknown. Test max speed for estimate. +spaceship-travel-time-max=Travel time: __1__s at max speed. +spaceship-travel-time-current=Travel time: __1__s at current speed. +spaceship-closest-location=Closest Location: __1__ +spaceship-location-spatial-distortion=Spatial Distortion: __1__ +spaceship-location-stellar-x=Quadrant X: __1__ +spaceship-location-stellar-y=Quadrant Y: __1__ +spaceship-location-star-gravity-well=Star gravity well: __1__ +spaceship-location-planet-gravity-well=Planet gravity well: __1__ +spaceship-travel-status=Travel status: __1__ +spaceship-integrity-status-valid=Integrity Status: Valid: __1__ +spaceship-integrity-status-invalid=Integrity Status: Invalid: __1__ +spaceship-button-launch=Launch +spaceship-button-launch-tooltip=Ready to launch +spaceship-button-launch-disabled=Launch (disabled) +spaceship-button-launch-disabled-fuel-tooltip=Requires fuel in booster tanks +spaceship-button-launch-disabled-integrity-tooltip=Requires valid integrity check +spaceship-button-anchor=Anchor +spaceship-button-confirm-anchor=Confirm Anchor +spaceship-button-anchor-to=Anchor to __1__ +spaceship-button-anchor-on=Anchor on __1__ +spaceship-button-stop=Stop +spaceship-button-start=Engage +spaceship-button-board=Board __1__ +spaceship-button-scouting-back=Back +spaceship-button-scouting-back-tooltip=Cancel anchor scouting +spaceship-name-the=The __1__ +spaceship-button-start-integrity-check=Start Integrity Check +spaceship-heading-destination=Destination +list-destinations-alphabetically=List destinations alphabetically +spaceship-travel-message-new-course-plotted=New course plotted. +spaceship-travel-message-exiting-planet-gravity=Exiting planet gravity well +spaceship-travel-message-navigating-planet-gravity=Navigating planet gravity well +spaceship-travel-message-exiting-star-gravity=Exiting star gravity well +spaceship-travel-message-navigating-star-gravity=Navigating star gravity well +spaceship-travel-message-spatial-distortions=Navigating spatial distortions +spaceship-travel-message-navigating-interstellar=Navigating interstellar space +spaceship-travel-message-at-destination=At destination. +spaceship-check-message-passed=Passed: Ship integrity valid. +spaceship-check-message-failed-containment=Failed: Containment loss around console. Make sure all spaceship walls are on spaceship floor with no gaps. +spaceship-check-message-failed-console-floor=Console must be placed on spaceship flooring. +spaceship-check-message-failed-empty=No tiles found connected to a properly enclosed console. +spaceship-check-message-failed-unknown-bounds=Error: Unknown spaceship bounds. +spaceship-check-message-failed-stress=Fail: Structural integrity stress exceeds technology limit. +spaceship-check-message-checking-console-floor=Checking console floor connectivity. +spaceship-check-message-checking-containment=Checking containment. +spaceship-check-message-checking-connectivity=Checking console connectivity. +spaceship-check-message-no-console=No Console. +spaceship-check-message-did-not-complete=Check did not complete. +spaceship-check-message-unstable=Unstable: Some sections will disconnect when maneuvering. +spaceship-check-message-valid-but-disconnecting=Valid but unstable: Sections will disconnect. +spaceship-warning-sections-disconnecting=Sections are disconnecting. Stop to repair. +page_space_exploration_text_1=Welcome to Space Exploration. There's a lot in the mod already, but it is still [font=default-bold]experimental[/font] status and is under heavy development. There may be bugs.\n\n[font=heading-2]Experimental status?[/font]\n\nSpace Exploration is still changing rapidly and I am putting all my time into progressing the development of the key features at the expense of mod compatibility. [color=red]It is not advisable to play with mods other than the required and recommended mods.[/color]\n\nWhile in experimental status: If a mod causes problems such as corrupted game/save state, crashes, invalid tech trees, or core gameplay it will quickly be marked as incompatible to protect new players. This means if you use a lot of mods it is more likely one may be marked as incompatible later due to an issue you had not yet discovered. You are of course free to edit your info.json file to try incompatible mods but you do so at your own risk: if your game state becomes unplayable because of it I won't be able to help you.\n\nWhile in experimental status: Most other overhaul mods are marked as incompatible if the tech tree is significantly broken, however the long term intention is to get the mods working together to the satisfaction of both developers. Krastorio 2 is an example of this work already substantially underway.\n\nThere is some additional information relating to mod compatibility on the Space Exploration wiki. If you would like to assist with mod compatibility please reach out on Discord, but please also be aware that it is not a high priority until later in Space Exploration's development.\n\n[font=heading-2]Recommended mods[/font] \n\n • AAI Containers & Warehouses. Gives you some larger containers that match the vanilla theme.\n\n • Module Inserter Allows you to put modules in machines from satellite mode.\n\n • Equipment Grid Logistic Module A module for vehicle grids, like the spidertron, to request items from the network and dispose of trash.\n\n • Grappling Gun Allows you to jump over buildings, across lakes, and out of combat if you get slowed. In space you can get back to space platform if you fall off. Also lets you board spaceships (especially useful if they are moving).\n\n • Burner Leech This is just for the AAI burner phase.\n\n • Text Plates Allows you to put text on the ground, useful for marking planet names, station names, spaceship docking zones, etc.\n\n • Even Distribution Helps early game when you manually insert items into multiple buildings.\n\n • Combat Mechanics Overhaul can help with defences when off planet if you enable the "Walls Block Spitters" option. It is cheaper to repair walls than turrets.\n\n • Bullet Trails So you can see where your bullets are going, or what gun turrets are shooting at. (Also looks better.)\n\n\n[font=heading-2]Recommended settings[/font]\n\nYou MUST have all alien biomes terrain tiles enabled, otherwise the game will crash at a later point.\n\nAs the game is longer than normal, it is a good idea to start a game with low enemy evolution factors.\n\nYou should not set high resources settings for your starting planet unless you are playing with resource intensive recipes, such as high difficulty recipes or marathon mode. If resources are set too high it will reduce the need to expand to other planets.\n\n\n[font=heading-2]Helpful urls[/font]\n\nTake a look at the Space Exploration Wiki over here: https://spaceexploration.miraheze.org\n\nGet help or follow the development on Discord: https://discord.gg/ymjUVMv\n\nOver 2000 hours have gone into this mod. If you are enjoying it please consider supporting me on Patreon: https://www.patreon.com/earendel +menu_meteor_defence=[img=virtual-signal/se-meteor] Meteor Defence +title_meteor_defence=Meteor Defence +page_meteor_defence_text_1=Meteors hit most zones at random intervals. You can change the max interval between strikes in mod settings.\n\nThe number of meteors is also random, 50% for 1, 25% for 2, 12.5% for 3, 6.25% for 4, etc...\n\nThe meteor defence structures can shoot at meteors. They fire in sequence, so later defences won't fire if all the meteors were destroyed. Defences require ammo, charge time, and additional power while charging. The power draw is not insignificant, so it is wise to balance risk against cost. +menu_coremining=[img=item/se-core-miner] Core Mining +title_coremining=Core Mining +page_coremining_text_1=Core mining can only be done on planets and moons. Each planet and moon can give a different type of core fragment depending on what is inside. Nauvis gives a balance of common resources but other places tend to mainly give 1 resource type. Core miners are power hungry, but you do get some energy back from the coal, oil, and uranium.\n\nCore miners use a lot of power, plus each core miner you place on a planet reduces the efficiency of all core miners on that same planet. They are much less power efficient than normal miners even if you have multiple running, but they never run out of resources. In the early game it can be useful to have 1 core miner running when you have excess power. If you start on a tiny planet, then solar and core mining might be your only way to get enough resources to get off the planet.\n\nLate game core miners benefit greatly from mining productivity bonuses. It is better to aim for a few on many planets rather than many on a few planets. +menu_beacons=[img=item/se-wide-beacon-2] Beacons +title_beacons=Beacons +page_beacons_text_1=[font=heading-2]Beacon Overload [img=virtual-signal/se-beacon-overload][/font]\n\nBeacon Overload is an overhaul of Beacon mechanics in Factorio. Crafting machines can only be affected by 1 beacon, if affected by more beacons they overload and pause production.\n\nThe overhaul allows more modules in beacons and promotes the use of more powerful Modules in both beacons and assemblers for maximum bonuses. The change also allows and promotes a wider range of factory designs.\n\nThe Basic Beacon is individually much more powerful than a vanilla beacon, but cannot stack their effects on one machine so the maximum boost you can provide is reduced compared to vanilla. The more powerful beacons are able to far exceed the maximum boost on a machine available in Vanilla.\n\nStarting from Wide Area Beacon players can experience substantial amount in module savings as well as freedom to create complex design revolving around larger buildings or with multiple fluid or material inputs.\n\nMachines affected by more than one beacon will be marked with a Beacon Overload icon and pause all production. They will still continue to consume minimal power in the process. +menu_launching_satellites=[img=item/satellite] Launching Satellites +title_launching_satellites=Launching Satellites +page_launching_satellites_text_1=You have launched [color=cyan]__1__[/color] satellites.\n\n[font=heading-2][img=virtual-signal/se-remote-view] Navigation Satellite Uplink [__CONTROL__se-remote-view__][/font]\n\nWhen you launch a Navigation Satellite into space from the Satellite Rocket Silo, you get access to the [img=virtual-signal/se-remote-view] Navigation Satellite View. This mode can be accessed with the [__CONTROL__se-remote-view__] key. While in satellite mode your camera is detached from your character so you can quickly look around the map and even uncover new areas. There are some things you can't do in satellite mode, like directly place or mine entities. There is a lot you can do though, like use blueprints, deconstruction planners, place ghost entities, order wire connections, change machine recipes, combinator settings, etc.\n\n[font=heading-2][img=virtual-signal/se-planet-orbit]Universe Explorer [__CONTROL__se-universe-explorer__][/font]\n\nThe Navigation Satellite network also lets you view other surfaces, like other planets, moons, asteroid belts, asteroid fields, and orbits. Press [__CONTROL__se-universe-explorer__] to bring up the list of known zones. If you have launched a satellite then you can click View Surface to see what is there. It can be good to scout a planet a bit before you try to fly there.\n\nLaunching satellites also helps with zone discovery within the system it is launched from (see Zone Discovery for more details).\n\n[font=heading-2][img=item/se-satellite-telemetry] Satellite Telemetry[/font]\n\nSatellite launches return satellite telemetry, a vital component in [img=item/se-rocket-science-pack] Rocket Science. +menu_pinned_locations=[img=se-pin-list] Pinned Locations +title_pinned_locations=Pinned Locations +page_pinned_locations_text_1=After unlocking the [img=virtual-signal/se-remote-view] Navigation Satellite View, you gain access to Pinned Locations, a tool for quickly swapping to different parts of your factory across all of the surfaces that you've explored.\n\nLocations can be pinned with the plus button in the Navigation Satellite window. You may set hotkeys for Pinned Locations when adding or editing them. This allows you to quickly jump to important locations with the press of a keyboard button without needing to go through the Universe Explorer.\n\n[font=heading-2]Temporary Pins[/font]\nPinned Locations do not need to be set through the pin creation popup menu. They may also be set with the "Set Pin" hotkeys. This creates a Pinned Location without a name or icon, but can immediately be jumped to with the associated "Go to Pin" hotkey.\n\n[font=heading-2]All Pins [__CONTROL__se-remote-view-pins__][/font]\nPins are only displayed in the hotbar for the current surface you are viewing. However, hotkeys may be used to jump to a pin on another surface regardless of if it is visible in the hotbar. If you need to have an overview of all Pinned Locations, press [__CONTROL__se-remote-view-pins__] to bring up the list of all pins. Pins in this view are organized into rows based on the surface the pin is on. If a surface has only a single pin, its row will be collapsed into that of its parent star.\n\n[font=heading-2]AAI Programmable Vehicles[/font]\nThe default hotkeys for setting and swapping to Pinned Locations conflict with the default hotkeys for creating and selecting control groups for AAI Programmable Vehicles. If you use both mods, you will need to adjust your hotkeys in order to get the expected behavior. +menu_zone_discovery=[img=virtual-signal/se-planet-orbit] Zone Discovery +title_zone_discovery=Zone Discovery +page_zone_discovery_text_1=There are lots of stars, planets, moons, asteroid belts, and asteroid fields in this area of space that can be discovered.\n\n[font=heading-2]Navigation Satellite[/font]\nYou can launch a navigation satellite to discover a random planet, moon, or asteroid belt in the same star system that the satellite was launched from. If there is nothing else to discover in that system then it can discover new stars instead, but cannot discover anything orbiting other stars or anything in deep space.\n\n[font=heading-2]Zone Discovery Research[/font]\nYou can use space telescopes to look for new zones to discover. This is achieved through "Zone Discover" research. The basic zone discovery research can find a random star, planet, moon, or asteroid belt.\n\n[font=heading-2]Targeted Zone Discovery Research[/font]\nTargeted zone discovery research is the same as the basic research, but if you have selected a resource preference (below) it looks in areas more likely for that resource to occur so you are more likely to discover a zone with that resource. Keep in mind that a planet can't be discovered before discovering its star, and a moon can't be discovered before discovering its planet. Don't expect to find what you're looking for every time.\n\n[font=heading-2]Deep Space Zone Discovery Research[/font]\nDeep space zone discovery research only looks for areas of interest in deep space and is the only way you can discover asteroid fields. Asteroid fields are the only place you can find Naquitite. Deep space research cannot be resource targeted.\n\n[font=heading-2]Resource targeted zone discovery preference:[/font] +menu_cargo_rockets=[img=virtual-signal/se-cargo-rocket] Cargo Rockets +title_cargo_rockets=Cargo Rockets +page_cargo_rockets_text_1=Cargo rockets are launched from a Cargo Rocket Silo, aka the Launchpad.\n\nYou have launched [color=cyan]__1__[/color] cargo rockets.\n\nYour cargo loss modifier based on technology: Loss max percentage reduced by [color=cyan]__2__%[/color].\n\nYour rocket survivability modifier based on technology: Loss chance reduced by [color=cyan]__3__%[/color].\n\nYour rocket reusability modifier based on technology: [color=cyan]__4__[/color] +/- up to 10 (max 100) parts recovered.\n\n[font=heading-2]Getting Started[/font]\n\nBefore you can launch cargo rockets, you need to have launched a satellite in the satellite rocket (the standard Factorio aka 'vanilla' silo) while Space Exploration is installed. \n\nOnce you have built a cargo rocket silo you need to build and fuel your rocket:\n\n • 100 cargo rocket sections into the inventory. 20 of these will be recovered from the rocket at the destination, more with the right research. \n • 1 space capsule into the inventory. This will always be recovered at the destinations and can return you home from orbit.\n • A lot of liquid rocket fuel, piped into one of the 8 connections near the corners. The amount of fuel required depends on the radius of the planet you're launching from and the distance to the destination. If using the "Any landing pad with name" destination option, it will load enough fuel for any of the valid destinations.\n\nYou can enter the cargo rocket silo from the door at the front (press __CONTROL__toggle-driving__). This will let you ride with the rocket. You should also have a thrustersuit and lifesupport canisters so you don't die if you are launching to space. \n\nYour first rocket won't have anywhere to land so it will disassemble as the cargo is released. Sometimes rockets targeting a landing pad miss and the rocket crashes. Even in the case of a crash the cargo is deployed in cargo pods so you never lose all of the cargo. \n\nYou should take a Rocket Landing Pad and some Space Platform Scaffold with you so you can build somewhere for the next rocket to land.\n\nBuilding a Rocket Landing Pad at your base before launching will allow you to easily return directly there instead of ending up in a random location when you return.\n\n[font=heading-2]Destinations[/font]\n\nOnce you have a landing pad placed, make sure you update the destination of the rocket silo to target the landing pad and not a random point in orbit. You can do this in-person or via the Satellite Remote View (hotkey 'n'). However, rockets will not launch to a landing pad that contains items, so make sure to empty it.\n\n[font=heading-2]Basic Automation[/font]\n\nThe rocket silo outputs signals for how many parts are already in the rocket. You can put a condition on an inserter of [Cargo Rocket Sections < 100] to make sure it won't fill the rocket with additional sections.\n\nIf you have set up launch triggers on a silo it will launch automatically, but a rocket won't automatically launch to a landing pad that isn't empty (otherwise the cargo might not fit).\n\n[font=heading-3]Input Signals[/font]\n\n[img=virtual-signal/signal-green] Green signal: Can trigger a launch if the silo is configured to have a trigger that uses the green signal.\n\n[font=heading-3]Output Signals[/font]\n\n[img=virtual-signal/signal-E] E Signal: Empty slots\n\n[img=virtual-signal/signal-F] F Signal: Full slots\n\n[img=virtual-signal/signal-L] L Signal: Liquid rocket fuel required for all potential destinations specified by the destinations setting.\n\n[img=virtual-signal/se-cargo-rocket] Cargo Rocket Signal: If the rocket is complete (i.e. 1 capsule and 100 rocket sections) then a value of 1 is returned.\n\n[img=item/se-space-capsule] Space Capsule Signal: Any capsules used in the rocket construction are added to the count of any capsules in the cargo inventory.\n\n[img=item/se-cargo-rocket-section] Cargo Rocket Section Signal: Any sections used in the rocket construction are added to the count of any sections in the cargo inventory.\n\n[img=fluid/se-liquid-rocket-fuel] Liquid Rocket Fuel Signal: The total liquid rocket fuel in the silo. +menu_delivery_cannons=[img=item/se-delivery-cannon] Delivery Cannons +title_delivery_cannons=Delivery Cannons +page_delivery_cannons_text_1=Delivery cannons are explosion-assisted railguns with interplanetary range. They are designed to fire sturdy homogeneous resources that can survive the sudden acceleration. They cannot fire more complicated manufactured intermediates or structures.\n\nA delivery cannon only has a target point, it does not have any understanding of what is at that point and will fire the payload as long as it has power and a filled delivery capsule. If you want to add conditions to the cannon’s ability to fire, you restrict the cannon’s ability to load resources or capsules.\n\nWhen a delivery capsule lands on the ground it damages the area and most of the resources are destroyed. A delivery cannon chest can safely catch the capsule as long as the chest is not full. You can have multiple cannons firing at the same chest with different resources.\n\nIt is advisable to either keep targeted chests empty, or restrict cannon inputs using signal transmission.\n\nDelivery cannons have a 1GJ capacity and draw 50MW when charging. The range of the delivery cannon is constrained by the amount of energy it can store. Firing at more distant locations takes more energy. Some destinations may require more energy than the delivery cannon can hold so it will never fire. You can set up a delivery cannon relay station in a location half way there to send the cargo in 2 stages. +menu_lifesupport=[img=item/se-lifesupport-equipment-1] Lifesupport +title_lifesupport=Lifesupport +page_lifesupport_text_1=Lifesupport is gained from lifesupport equipment and lifesupport canisters. You need both to survive in hostile environments.\n\nLifesupport equipment and the consumable canisters can be made in a lifesupport facility.\n\nLifesupport canisters provide the resources needed by the system to fulfil all of its roles and are consumed gradually. As the lifesupport bar decreases, new canisters are consumed directly from your inventory. \n\nLifesupport equipment is placed into the grid of armor, however if you are using a thrustersuit, it has 1 lifesupport equipment built in. Additional lifesupport equipment pieces placed in the equipment grid increase the lifesupport efficiency. If you are using lifesupport equipment in a non-thruster suit then it will protect you on hostile planets but won’t protect you from the vacuum of space.\n\n[font=heading-2]Hostile environments[/font]\nHostile environments are any area that would cause damage to your body just by being there. Lifesupport equipment is designed to protect you from these hazards by providing you with appropriate pressurisation, oxygen, water, nutrition, thermal regulation, and radiation protection. The 2 main types of hostile environment are:\n\nSpace: A space suit (thruster suit) is required for lifesupport to function correctly in a vacuum. You cannot use lifesupport from some other type of armor in space, you will still suffocate.\n\nLand: Certain planets and moons may have dangers such as radiation, extreme cold, extreme heat, or an acidic atmosphere, and require lifesupport equipment. (Coming soon). Planets also require lifesupport if certain bio weapons are used (Plague Worlds). Lifesupport for these areas can be provided by a thruster suit, or by equipment placed into any other type of armor. +menu_space_sciences=[img=item/se-astronomic-science-pack-2] Space Sciences +title_space_sciences=Space Sciences +page_space_sciences_text_1=[img=item/se-rocket-science-pack] The first in-space science is the rocket science pack. It can only be made in space so you need to establish a small space station to produce it. Rocket science packs and the later science packs can only be used in space, so you'll need to rocket up other science packs too and put them in the powerful Space science lab.\n\n[font=heading-2]Specialist Sciences[/font]\n\nThe 4 specialist sciences are Astronomic, Biological, Energy and Material. They are all data-driven, and follow a process of performing experiments to gather data for supercomputers to build an increasingly accurate model of life, the universe, and everything. They are all at approximately the same tech levels so you are free to choose your order of development, however, each one requires a specific resource to some degree, so take a look at your solar system before deciding which science to research first.\n\n[img=item/se-astronomic-science-pack-4] Astronomic science focusses mainly on space logistics.\n\n[img=item/se-energy-science-pack-4] Energy science is mainly in energy production, power transfer, and high tech gadgets.\n\n[img=item/se-material-science-pack-4] Material science is focussed more on heavy industry and direct upgrades.\n\n[img=item/se-biological-science-pack-4] Biological science is focussed on character upgrades, medicine, lifesupport, bioweapons, and productivity.\n\n[font=heading-2]Deep space science[/font]\n\n[img=item/se-deep-space-science-pack-1]Deep space science is focussed on exploring the interstellar void, antimatter, and warping spacetime. +menu_energy_beams=[img=item/se-energy-transmitter-emitter] Energy Beams +title_energy_beams=Energy Beams +page_energy_beams_text_1=[font=heading-2]Coronal Mass Ejections[/font]\nStars in the area frequently eject dangerous streams of particles. It is not uncommon for a planet or moon to stray into one of these particle streams. If you have a large base on an affected surface you should evacuate, diversify or disperse your assets, or build an Umbrella defence facility with a large accumulator backup. If you have a small base it is fairly likely to go unscathed. When a surface is threatened there will be at least 4 hours early warning. Known threats will be listed below. +page_energy_beam_warning_text=[img=virtual-signal/se-star] Warning: Coronal mass ejection heading for __1__.\nEstimated defence requirements: __3__ GW peak power, __4__GJ over 120 seconds. ETA: __2__s. +page_energy_beams_text_2=[font=heading-2]Umbrella: Energy Beam Defence[/font]\nThe energy beam defence facility, "Umbrella", can protect against coronal mass ejections and space-based energy beam weapons. It works by levitating magnetic particles into a protective bubble, then realigns and clumps the particles as needed to diffuse hostile energy beams. The only requirement to function is energy, the base draw is 10MW but increases based on the strength of attacking beams. Only 1 is needed per surface against Coronal mass ejections, against energy beams weapons 1 Umbrella can defend against up to 500GW of attacking power. For a coronal mass ejection, the base power requirement for a 5000 radius planet and 100% solar, is expected be around 160GJ over 2 minutes with a peak power draw of 2GW at the 1 minute mark. This is increased or decreased with the zone's solar power multiplier, and for solid bodies it is increased or decreased based on the radius relative to a base radius of 5000. For an energy beam from an Energy Beam Emitter, the power requirement is expected to be 1/10th of the energy beam strength at the target (after efficiency loss).\n\n[font=heading-2]Energy Beaming[/font]\nThe Energy Beam emitter is capable of sending energy to different surface. It can do this in 2 main ways, either as a way to provide power to a distant surface, "Energise", or as a cutting beam weapon, "Glaive". When in Glaive mode the beam damages an area continuously but can be moved over the target surface cutting a path. The damage rate, area, and beam speed increase based on the energy put into the beam. "Auto-Glaive" mode has autonomous target selection.\n\nAn Energy beam emitter has 4 connection points where Energy beam chambers can connect end-on. Energy beam chambers can connect length-ways, or have a long edge meet the middle of a short edge, but cannot connect directly side-to-side. Energy beam injectors attach directly to the sides of Energy beam chambers. Each Energy beam injector increases the power of the connected Energy beam emitter. To collect power from a beam you need an Energy beam receiver at the target surface and select it as the target using the targeter from the emitter. Once the beam has the receiver as the target the receiver will heat up. The heat can be taken from heat connections at the side to power heat exchangers and turbines. +menu_spaceships=[img=virtual-signal/se-spaceship] Spaceships +title_spaceships=Spaceships +page_spaceships_text_1=Spaceships are huge, powerful vehicles that can launch many contained structures, items, and players into space, then rocket around the solar system to land on other surfaces.\n\n[font=heading-2]Spaceship Construction[/font]\nSpaceships are made from many tiles and smaller components that fit together to make a spaceship of your own design. You design a spaceship almost like a mini moveable base.\n\nStart with a floorplan of spaceship flooring. Don't build too big, as your first few spaceships will have strict size restrictions, expandable by research. Place spaceship walls around the edges to make bulkheads, and make sure there are no gaps (including diagonals). Place a spaceship console somewhere in the inside, this is the core part of the spaceship and how you control it. When the console is placed, there are some pulses as the console figures out what parts are properly attached, what parts are properly contained and what will fall off if you try to launch. If any squares flash red, then there is an issue with your design, which you can diagnose by checking the spaceship console. You also need a spaceship rocket booster tank, and a spaceship rocket engine. The booster tank is what stores the fuel you need to get into space and provides the VTOL component. The rocket engines are for the slower burn through space to get you to your destination. Some form of defence in the front (always north) is also advisable because the nebula you are in is full of debris.\n\n[font=heading-2]Integrity Stress[/font]\nEarly on, you will be very limited on spaceship size by the Integrity Stress limits of your technology level. Additional technology lets you build larger spaceships. Integrity stress is calculated in 2 parts: A. The size of the ship. B. The cargo capacity of the ship. The total integrity stress is whichever stress factor is larger, the two values are not added together.\n\n[font=heading-2]Streamlining[/font]\nThis area of space is in a gritty nebula. If you streamline your spaceship you can improve you spaceship's maximum speed by around 30%. Making a flat box front should be avoided, but don't need to build a wedge. Up to 1/3 of your spaceship's front can be flat with no penalty. Circular shapes should also be fine. You can manually trigger an integrity check to see how the streamlining is going.\n\n[font=heading-2]Speed[/font]\nShip speed is based on the thrust of the engines vs the ship weight (approximated by integrity stress). Engines can be placed in/on the ship, but engines at the back of the ship with empty space behind are more effective (around 25% improvement).\n\n[font=heading-2]Long Haul Activities[/font]\nWhen considering long distance travel, it is worth noting that you can do a lot in satellite mode while your body is in transit. You can also give orders to spaceships remotely via the satellite uplink.\n\n[font=heading-2]Crafting Machines[/font]\n[color=#ffaaaa]Warning: A crafting machine designed for space will only be able to use recipes shared by other land structures if the spaceship is on land. If a space-based recipe is set while the spaceship lands, the ingredients will be lost. Some land-based crafting machines can function in space, but they will lose the ability to use productivity modules while in space. If the spaceship launches with productivity modules in these machines, the productivity modules are destroyed.[/color]\n\n[font=heading-2]Spaceship Signals[/font]\nThe top right section of the spaceship console can be connected with wires separately from the main structure, as it outputs its own signals:\n[img=item/se-spaceship-console] The console number indicates the spaceship's ID.\n[img=virtual-signal/signal-speed] The speed signal number indicates the spaceship's speed: -1 if stopped, -2 if anchored.\n[img=virtual-signal/signal-distance] The distance signal indicates the distance to the selected destination: -1 if arrived, -2 if anchored, -3 if no destination is set.\n[img=virtual-signal/se-planet-orbit] A fourth signal indicates the current destination, if any.\n[img=virtual-signal/signal-A] If the spaceship is anchored then it indicates the anchored zone id with the A signal.\n\n[font=heading-2]Spaceship Automation[/font]\nThe main structure of the console can accept signal inputs on the left side:\n[img=virtual-signal/signal-speed] The speed signal sets a target speed and engages the engines. A negative signal stops the engines instead.\n[img=virtual-signal/se-spaceship-launch] A Spaceship launch signal triggers a launch.\n[img=virtual-signal/se-planet-orbit] A destination signal sets the destination (you can see a zone's signal from the Universe Explorer side panel once you have constructed a spaceship).\n\nNote: Both the destination signal's type (ex. [img=virtual-signal/se-planet-orbit] or [img=virtual-signal/se-asteroid-belt]) and the signal's value/id must match for the destination to be set.\n\nNote: A spaceship console will not accept [img=virtual-signal/se-spaceship-launch] Launch or [img=virtual-signal/signal-speed] Speed inputs until a player has manually launched and engaged the ship at least once. This is to prevent blueprinted spaceships from accidentally launching while still in the middle of being built by bots.\n\nNote: The console only checks for changes to the input signal every second; a sustained signal is required for the ship to react, single tick pulses will not work.\n\n[font=heading-2]Automatic Landing[/font]\nTo cause a spaceship to land, the console must be given a pair of anchor signals, either:\n"anchor using left clamp" ([img=virtual-signal/se-anchor-using-left-clamp]) with "anchor to right clamp" ([img=virtual-signal/se-anchor-to-right-clamp])\n"anchor using right clamp" ([img=virtual-signal/se-anchor-using-right-clamp]) with "anchor to left clamp" ([img=virtual-signal/se-anchor-to-left-clamp])\n\nThe value of the "anchor using ..." signal must match the value of a clamp on the ship.\nThe value of the "anchor to ..." signal must match the value of a clamp at the destination.\nYou can see and change these values on clamps by opening a clamp's UI. If a match is found for both the "anchor using ..." and "anchor to ..." signals given to the ship console, then the ship will try to land with the two clamps connected. Use with caution.\n\n[font=heading-2]Clamps[/font]\nTo set the ID of a clamp, open the clamp GUI and change the numeric value of the clamp signal to the ID you wish for the clamp to have. You never need to change the type of the clamp signal.\n\n[font=heading-2]Landing Example[/font]\nThe spaceship has a left-clamp with ID 315. In that clamp's GUI the signal is [img=virtual-signal/se-anchor-using-left-clamp] with a value of 315.\nThe landing surface has a right-clamp with ID 147. In that clamp's GUI the signal is [img=virtual-signal/se-anchor-using-right-clamp] with a value of 147.\nIn order to get the spaceship to land using those two clamps, the left side of the ship console must be passed the following signals:\n[img=virtual-signal/se-anchor-using-left-clamp] 315\n[img=virtual-signal/se-anchor-to-right-clamp] 147 +menu_arcospheres=[img=item/se-arcosphere-a] Arcospheres +title_arcospheres=Arcospheres +page_arcospheres_text_1=Arcospheres are near perfect spheres of nano-engineered naquium crystal. They are of unknown origin, but are most commonly found floating deep in interstellar space.\n\nEach one encompasses an extra-dimensional knot in space time and allows you to interact with a small 4th spatial dimension. The spheres can be polarised so that they can manipulate certain aspects of space time if moved relative to one another. Sets of specific arcospheres can be used to warp and weave spacetime into higher dimensions. \n\n[font=heading-2]Usage[/font]\nArcospheres are the most unique production challenge in the game. They are used as tools in recipes but are never destroyed, they are only altered. The main challenge in their use is cycling through the spheres you have so you don’t end up running out of a specific type. There are many ways to balance production, but a few combinators can help a lot. If you get stuck ask for hints on Discord, or find more info on the space exploration wiki.\n\n[font=heading-2]Collection[/font]\nArcospheres are found by launching an Arcosphere collector from an asteroid field. Repeated launches have diminishing returns. You might get better returns by launching from different asteroid fields. +page_arcospheres_text_deep=Arcospheres found in the deep interstellar void: [color=cyan]__1__ arcospheres[/color] / __2__ collectors launched. +page_arcospheres_text_zone=Arcospheres found near __1__: [color=cyan]__2__ arcospheres[/color] / __3__ collectors launched. +menu_exploration_journal=[img=item/se-thruster-suit] Exploration Journal +title_exploration_journal=Exploration Journal +page_journal_title_backstory=Woke up on the wrong side of a fireball +page_journal_text_backstory=I found myself crash-landed on an unfamiliar planet with parts of a small ship burning around me. My body was bruised, scratched and singed, but nothing too serious. My head injury was apparently more serious, a pounding headache and the light was blinding. Worse still, I couldn't remember how I got here, or even who I was beyond a name and a vague sense of purpose... to build. Even then, I couldn't remember what to build or how to build it. At first I thought my head had been damaged in the crash and the memories would come back, but they still haven't. The fact that my data logs were also empty or reformatted had me thinking of other explanations. +page_journal_title_satellite_launch=Eye in the sky +page_journal_text_satellite_launch=I managed to launch a satellite into orbit. It is an important milestone and worth celebrating, but there is still a lot to do. This is just the beginning. +page_journal_title_cargo_launch=To infinity and beyond +page_journal_text_cargo_launch=I can now launch myself into space. No longer am I bound to this rock I have grown to call home. The skies beckon. +page_journal_title_entered_vault=Relic hunting +page_journal_text_entered_vault=I entered a cavern beneath the pyramid-shaped protrusion on __1__ and found a dark and dangerous chamber. The chamber had two ancient cartouches on the ground, one large and one was small. They both had multiple glyphs on their surface along with other circles and lines. The glyph at the center of the large cartouche seemed to be the most significant in whatever information the system was trying to convey. Whatever the information is, it is formatted unlike anything else I've seen. Behind the cartouches was some kind of raised cylinder containing a powerful device that I can use as a module. Modules of this quality are so valuable that it is worth trying to find more of these structures. Maybe it is time for some archeology. +page_journal_title_found_gate=Anomaly +page_journal_text_found_gate=Some sort of huge ring-shaped artifact was found in the anomaly. Two things are immediately obvious even from a distance: 1. It is ancient. 2. The technology is completely different from my own. Whatever it is or was, it is destroyed now. +page_journal_title_found_gate_ship=Anomaly Ship +page_journal_text_found_gate_ship=Part of a fairly large derelict spaceship was found in the anomaly near the ring-shaped artifact. The technology of the ship is similar to my own, but a little more... refined. It is clearly different technology from that of the ring in any case. The debris pattern makes it look like it was cut in half and/or collided with the ring structure. It may be worth salvaging. +page_journal_title_found_gate_ship_authenticated=Anomaly Ship Authentication +page_journal_text_found_gate_ship_authenticated=The derelict ship in the anomaly scanned me and "authenticated my biosignature". I don't know if that means it has a record of me specifically somehow, or maybe just that any random cybernetic human is good enough when compared to biters and genocidal robots. The message said the ship airlock access code is 2236067964. The ship's logs are accessible but large sections are missing or corrupted. +page_journal_title_found_gate_ship_log=Anomaly Ship Log +page_journal_text_found_gate_ship_log_intro=Demodamas 82B: AAI Hypernet Forward Construction Cruiser. Ship's log contents: +page_journal_text_found_gate_ship_log=...'¿s nominal.\nAccess warning: AAI Thyris Gate 17: Intergalactic prototype v0.1.93 is a classified facility. AAI authentication at L90 or above is required. Authenticate immediately or be destroyed.\nAccess log: Access AAI Thyris Gate 17 authenticated with AAI Cybernetic Hypernet Engineer L97 credentials ID__1__.\nAccess log: Beginn¶Ôàtá^...\n...'¿ris Gate 17 projector 8 frequency locked. Energy at 216% safe levels. Singularity stability: 99.4%.\nNavigation log: AAI Thyris Gate 17 dialled into projection vector [SV __2__]. Predicted target: Wube Galaxy > Foenestra (anomaly, unexplored). Authentica¶Ôàtá^...\n...'¿avigation warning: Intergalactic hypertube (overridden).\nNavigation warning: No known hypergate at destination (overridden).\nInsurance warning: No insurance contract. Available contracts: 0.\nInformaTron note: There are no insurance contracts available with the condition: "gateless materialisation". Are you sure this is safe? [response.ignore.ignore_always]\nTravel log: Entering Thyris anomaly > AAI Thyris Gate 17 hypertube aligned to [SV __2__].\nTravel log: Jump to hypertube [SV __2__] complet¶Ôàtá^...\n...'¿vel log: Location update: Hypertube near Thyris anomaly, alignment [SV __2__], stability at 98%, diame¶Ôàtá^...\n...'¿avel log: Exiting hypertube at unexplored location Foenestra anomaly.\nWarning: Unexpected collision, intersection with unknown object [4ae4c8d28f2], beginning scan of object [4ae4c8d28f2].\nDamage Log: 13.2% damage. Source: Impact damage resulting from collision with unknown intersecting object [4ae4c8d28f2].\nSection damage log: Sections reporting damage: A5, A6, A9, B6, B7, B8, C7. Sections not responding: A7, A8. (86% confidence)\nCybernetic engineers log: Lifesigns 99%. (34% confidence)\nTravel log: Attempting evasive maneuver RS100LT30.\nTravel log: Exiting hypertube completed with errors.\nTravel log: Location update: Foenestra unexplored anomaly.\nScanning log: Scan completed on object [4ae4c8d28f2] clarity 0.002m^2 at distance -48.76m (99.9% confidence).\nScan detail log: [4ae4c8d28f2] Mass 92.5¶Ôàtá^...\n...'¿idence).\nScan detail log: [4ae4c8d28f2] Composition: Artificial. 34% Naquium, 29% Holmium, 37% unknown composites (89% confidence).\nScan detail log: [4ae4c8d28f2] Size: Approximate cylinder 68¶Ôàtá^...\n...'¿ail log: [4ae4c8d28f2] Energy signature: Flux 54Gwb, Radiation profile 2.8kJ/1.7MJ/1.6MJ/0.62J, Lux profile 5.86GJ [051e376392b8d3f8]. (98% confidence).\nScan detail log: [4ae4c8d28f2] Ident: Artificial construction, unknown manufacturer, description: Approximate ring with nodules, octad. (0.3% confidence).\nScan detail log: [4ae4c8d28f2] Structure capability estimation: Hypergate (47% confidence). Other: weapon 42%, energy 35%, computation 17%, scanning 12%, industry 9%, spaceship 7%, habitat 2%.\nDamage log: 68.2%% damage. Integrity failure, sections are detaching. Source: Secondary pressure waves due to collision with object [4ae4c8d28f2].\nSection damage log: Reactor critical. Sections reporting damage: D5, E4, E5, E6, F5. Sections not responding: A1, A2, A3, A¶Ôàtá^...\n...'¿le log: Emergency undock of prospecting shuttle 2. Trajectory prediction: Calidus > Nauvis.\nDamage log: 91.7%% damage. Integrity failure, sections are dîÄïmïŸ... +page_journal_title_spaceship_victory=Spaceship Victory +page_journal_spaceship_victory=I built an extremely fast and powerful spaceship and activated the distortion drive. It took 60 seconds for the drive to stabilise into a practical FTL state, but once it did I was able to enter cryosleep for the subsequent journey home, to a galaxy far far away. I leave behind an autonomous interstellar empire built from the ground up by my own hand. My legacy in this space will live on. +page_journal_title_gate_victory=Ancient Gate Victory +page_journal_gate_victory=The huge ring artifact, an ancient intergalactic gate, was eventually repaired to the best of my ability. With some heavy jury rigging and ingenuity I finally managed to get it working. I anchored the distortion field to the local stars, decoded the non-numeric glyph coordinate system, and reverse engineered the dialling system. My mind feels warped by such alien concepts, but it works and I have finally made a portal home. The trip home, to a galaxy far far away took but a moment. I leave behind an autonomous interstellar empire, built from the ground up by my own hand. My legacy in this space will live on. +menu_archeology=[img=entity/se-pyramid-a] Archeology +title_archeology=Archeology +page_archeology_text_1=I have started trying to find more of the large geometric structures. The satellites have matched [color=cyan]__1__[/color] shapes on the following planets: +page_archeology_text_2=Click on an entry to view via satellite. +menu_starmapping=[img=technology/se-zone-discovery-random] Starmapping +title_starmapping=Starmapping +page_starmapping_text_1=Starmapping is achieved by repeatedly researching the technology: [img=technology/se-long-range-star-mapping] [color=cyan]Long Range Star Mapping[/color]. This research looks for interesting patterns of stars in other galaxies. Does this have any practical use? Probably not.\n\nCoordinates are given in Standard Vector (SV) format, aligned based on cosmic background radiation.\n\nYou have mapped [color=cyan]__1__[/color] notable patterns so far. +technology-unlocked=New technology unlocked and is now in the tech tree. __1__ __2__ +universe-resources-changed-warning=[img=utility/danger_icon] [color=red]All resources have been adjusted based on new settings. This process is destructive. If it was caused by mod updates then it is unavoidable. If this was caused by accidental addition or removal of mods do not save the game.[/color] +starmapping-found-constellation=Long distance constellation match __1__, coordinates saved to [img=virtual-signal/informatron] InformaTron. +starmapping-found-constellation-informatron=[font=heading-1]__1__[/font] at coordinates [SV __2__] +gate-portal-coordinates=Analysis of distortion vector: [SV __1__] +discovered-glyph-vault=[img=item/satellite] Navigation Satellite: Geometric structure detected on __1__. +beacon-overload=Beacon overload +beacon-overload-ended=Beacon overload ended +lifesupport_title=[img=item/se-lifesupport-equipment-1] Lifesupport +lifesupport_efficiency_spacesuit=Lifesupport efficiency: __1__ +lifesupport_efficiency_no_spacesuit=Lifesupport efficiency: __1__ (0% in space). +lifesupport_suit=Suit lifesupport duration: __1__s +lifesupport_reserves=Inventory lifesupport duration: __1__s +lifesupport_suit_est=Suit lifesupport duration: __1__s (in space) +lifesupport_reserves_est=Inventory lifesupport duration: __1__s (in space) +lifesupport_environment_space=Environment: Space +lifesupport_environment_spaceship-interior=Environment: Spaceship Interior (no support required) +lifesupport_environment_planet=Environment: Planet (no support required) +lifesupport_environment_moon=Environment: Moon (no support required) +lifesupport_environment_plague-planet=Environment: Plague Planet +lifesupport_environment_plague-moon=Environment: Plague Moon +lifesupport_environment_unknown=Environment: Sheltered +player_track_glyphs=[img=item/satellite] Task satellites to find similar structures. +page_archeology_pyramid_link=[img=entity/se-pyramid-b] Geometric structure detected on __1__ __2__. +discovery_look_for_resource_caption=__1__\n__2__ +discovery_look_for_resource_tooltip=Focus discovery efforts on finding this resource. +comma_separate=__1__, __2__ +placement_restriction_line=[font=default-bold][color=#f5cb48]Cannot be placed on: __1__[/color][/font]\n__2__ +collision_mask_water=Water +collision_mask_land=Land +collision_mask_space_platform=Space Platform +collision_mask_spaceship=Spaceship +structure_name_grounded=__1__ (Grounded) +structure_name_spaced=__1__ (Space) +structure_description_grounded=__1__\n[color=#ff0000]Some recipes are disabled while on ground.[/color] +structure_description_spaced=__1__\n[color=#ff0000]Cannot use productivity in space.[/color] +cannot-open-nav-view-in-editor=Navigation Satellite Uplink cannot be opened while in Editor. +tile_warning=[color=red]Tile changes below entities may delete the entity.[/color] +please-consider-patreon=[font=heading-1]Enjoying Space Exploration? Consider supporting me on Patreon: [color=#f5cb48]https://www.patreon.com/earendel[/color][/font]\nPatrons can have a planet or moon based on their own design added in-game. +delivery_cannon_label_energy=Energy: __1__ +delivery_cannon_label_payload=Payload: __1__ +delivery-cannon-coordinates-set=Delivery coordinates set to [X:__1__ Y:__2__]. Press [__CONTROL__se-remote-view__] to exit satellite mode. +delivery-cannon-coordinates-pasted=Delivery coordinates set to [X:__1__ Y:__2__]. +delivery-cannon-invalid-coordinates=No location +delivery-cannon-valid-coordinates=X:__1__ Y:__2__ +deliver-cannon-force-mismatch=Cannot paste delivery cannon settings to a delivery cannon on a different force. +relative-window-settings=Settings +unit-capsule=Unit capsule (__1__) +climate_water_none=Waterless +climate_water_low=Puddles +climate_water_med=Lakes +climate_water_high=Seas +climate_water_max=Ocean +climate_moisture_none=Desert +climate_moisture_low=Barren +climate_moisture_med=Moist +climate_moisture_high=Humid +climate_moisture_max=Saturated +climate_aux_very_low=Earthy +climate_aux_low=Unusual +climate_aux_med=Colorful +climate_aux_high=Eccentric +climate_aux_very_high=Exotic +climate_temperature_bland=Mild +climate_temperature_temperate=Temperate +climate_temperature_midrange=Temperate +climate_temperature_balanced=Warm&Cool +climate_temperature_wild=Hot&Cold +climate_temperature_extreme=Fire&Ice +climate_temperature_cool=Cool +climate_temperature_cold=Cold +climate_temperature_vcold=Frigid +climate_temperature_frozen=Frozen +climate_temperature_warm=Warm +climate_temperature_hot=Hot +climate_temperature_vhot=Smouldering +climate_temperature_volcanic=Volcanic +climate_trees_none=Treeless +climate_trees_low=Shrubs +climate_trees_med=Thicket +climate_trees_high=Woods +climate_trees_max=Forests +climate_cliff_none=Flat +climate_cliff_low=Smooth +climate_cliff_med=Hilly +climate_cliff_high=Canyons +climate_cliff_max=Mountains +climate_homeworld=Homeworld (custom climate) +energy_transmitter_gui_title=[img=entity/se-energy-transmitter-emitter] Energy Beam +energy_transmitter_label_transfer=Emitter strength: __1__ +energy_transmitter_label_efficiency=Transmission efficiency: __1__ +energy_transmitter_label_efficiency_atmo=Transmission efficiency: __1__ (-50% from atmosphere) +energy_transmitter_label_off=Off +energy_transmitter_tooltip_off=Turns the beam off +energy_transmitter_label_energise=Energise +energy_transmitter_tooltip_energise=Provide energy to a Energy Transfer Receiver +energy_transmitter_label_glaive=Glaive +energy_transmitter_tooltip_glaive=A beam that can be targeted and moved, damage and speed based on energy +energy_transmitter_label_auto_glaive=Auto Glaive +energy_transmitter_tooltip_auto_glaive=A beam with a search and destroy program, damage based on energy +energy-transmitter-coordinates-set=Beam coordinates set to [X:__1__ Y:__2__]. Press [__CONTROL__se-remote-view__] to exit satellite mode. +energy-transmitter-coordinates-pasted=Beam coordinates set to [X:__1__ Y:__2__]. +energy-transmitter-no-enemies-found=Auto Glaive could not find any enemies. Emitter __1__ is switching off. +alert-cme-eta=[img=virtual-signal/se-star] Warning: Coronal mass ejection heading for __1__. ETA: __2__s.\nSee Energy Beams in [img=virtual-signal/informatron] InformaTron [__CONTROL__informatron__] for more details. +alert-cme-arrived=[img=virtual-signal/se-star] [color=red]Warning: Coronal mass ejection has arrived at __1__[/color] +alert-cme-stream=[img=virtual-signal/se-star] Coronal mass ejection stream detected __1__ +alert-cme-passed=[img=virtual-signal/se-star] Coronal mass ejection has passed. +no-coordinates-set=No coordinates set. +satellite-required=Satellite required. +probe_invalid_launch_star=Invalid launch location: [img=item/se-star-probe] Star probe must be launched from close solar orbit. +probe_invalid_launch_belt=Invalid launch location: [img=item/se-belt-probe] Asteroid belt probe must be launched from an asteroid belt. +probe_invalid_launch_field=Invalid launch location: [img=item/se-void-probe] Interstellar void probe must be launched from an asteroid field. +arcosphere_collector_invalid_launch=Invalid launch location: [img=item/se-arcosphere-collector] Interstellar void probe must be launched from an asteroid field. +charge-mode-fast=Quick charge mode: Idle draw decreased, maximum draw increased, buffer capacity increased. Watch for power spikes. +charge-mode-normal=Normal charge mode: Maximum draw decreased, idle draw increased, buffer capacity decreased. +menu_coordinate_logs=[img=entity/se-glyph-a-energy-47] Coordinate Logs +title_coordinate_logs=Coordinate Logs +page_coordinate_logs_text_1=A history of glyph sequences tried in the artifact with their corresponding coordinates, in descending order (top entry is the latest).\n\nCoordinates are given in Standard Vector (SV) format, aligned based on cosmic background radiation. +page_coordinate_logs_button_clear_caption=[img=virtual-signal/se-remove] Clear Log +page_coordinate_logs_text_empty=The coordinate log was recently cleared. +page_coordinate_logs_glyph_entry=__1__: SV +victory-message-spaceship=[font=heading-1]Nexus distortion drive has achieved critical speed (250).\n[color=#f5cb48]Congratulations, you have achieved the Space Exploration victory condition: Spaceship![/color][/font]\nIf you have enjoyed the ride please consider supporting me on Patreon: [color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-spaceship-player=[color=#f5cb48]Spaceship Victory: [/color] Your [img=virtual-signal/informatron] Exploration Journal [__CONTROL__informatron__] has been updated. +victory-message-gate=[font=heading-1]The portal is stable and leads back home.\n[color=#f5cb48]Congratulations, you have achieved the secret Space Exploration victory condition: Ancient Gate![/color][/font]\nIf you have enjoyed the this unique path of discovery please consider supporting me on Patreon: [color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-gate-player=[color=#f5cb48]Ancient Gate Victory: [/color] Your [img=virtual-signal/informatron] Exploration Journal [__CONTROL__informatron__] has been updated. +arcosphere-random=This recipe will occasionally switch to the alternate recipe of the same name. The arcosphere outputs are effectively randomised but number of arcospheres in the output is guaranteed to match the input. +ruin=Ruin +mysterious-structure=Mysterious structure +interburbulator_fail_easy_1=No. +interburbulator_fail_easy_2=Try harder. +interburbulator_fail_easy_3=Hopeless. +interburbulator_fail_easy_4=Nope. +interburbulator_fail_easy_5=Did you think that would work? +interburbulator_fail_easy_6=Wrong. +interburbulator_fail_easy_7=Low 02? +interburbulator_fail_easy_8=Negative. +interburbulator_fail_easy_9=Negatory. +interburbulator_fail_easy_10=Calculate. +interburbulator_fail_easy_11=Incorrect. +interburbulator_fail_easy_12=Interpolate. +interburbulator_fail_easy_13=Keep trying. +interburbulator_fail_easy_14=Come on, Human. +interburbulator_fail_easy_15=Isn't this fun? +interburbulator_fail_easy_16=I expected more. +interburbulator_fail_easy_17=Try thinking ahead. +interburbulator_fail_easy_18=Think of the prizes. +interburbulator_fail_easy_19=I don't mind waiting. +interburbulator_fail_easy_20=Patience is a virtue. +interburbulator_fail_easy_21=I don't mean to be rude. +interburbulator_fail_easy_22=The fish got to level 3. +interburbulator_fail_easy_23=The brute force approach, huh? +interburbulator_fail_easy_24=Use your squishy head computer. +interburbulator_fail_easy_25=Cobwebs in the neural network? +interburbulator_fail_easy_26=You can take a break, if you want. +interburbulator_fail_easy_27=I have a mind the size of a planet. +interburbulator_fail_easy_28=Did you actually think that would work? +interburbulator_fail_easy_29=Don't be angry with your constant failure. +interburbulator_fail_easy_30=I have waited eons for a worthy participant. +interburbulator_fail_easy_31=If you need help, you could ask a green circuit. +interburbulator_fail_easy_32=I don't blame you for your genocide, I'm no hypocrite. +interburbulator_fail_easy_33=I believe I am translated the instructionings correctly. +interburbulator_fail_easy_34=A vector can define both a direction and a magnitude. +interburbulator_fail_easy_35=Don't you just love how pollution makes the bugs angry? +interburbulator_fail_easy_36=Please don't get any of your... biology... on the electronics. +interburbulator_fail_easy_37=The middle is half way between the top right and the bottom left. +interburbulator_fail_easy_38=I studied some of your transmissions; it's not spying if you broadcast it like that. +interburbulator_fail_easy_39=Did you know: a normalised vector has a length of 1, often used to indicate a direction, even in your culture. +interburbulator_fail_mixed_1=Not even close. +interburbulator_fail_mixed_2=Way off. +interburbulator_fail_mixed_3=Are you even trying? +interburbulator_fail_mixed_4=Did your neural gel leak out? +interburbulator_fail_mixed_5=I was told humans were numerate. +interburbulator_fail_mixed_6=Is your interface malfunctioning? +interburbulator_fail_mixed_7=Do you need cognitive augmentation? +interburbulator_fail_mixed_8=You understand the challenge, right? +interburbulator_fail_mixed_9=Are you just picking numbers at random? +interburbulator_fail_offgrid_1=That is just terrible. +interburbulator_fail_offgrid_2=That is not even on the grid. +interburbulator_fail_offgrid_3=You missed the grid completely. +interburbulator_fail_offgrid_4=It needs to be on the grid, at least. +interburbulator_fail_offgrid_5=If the yellow dot is not on the grid... that is a really bad sign. +interburbulator_fail_offgrid_6=It needs to be on the grid. +interburbulator_fail_offgrid_7=The target is on the INSIDE of the grid, not the outside. +interburbulator_fail_offgrid_8=It's not even on the grid. Human, what are you doing? +interburbulator_fail_offgrid_9=Aim for the grid. +interburbulator_fail_offgrid_10=The grid is the bit with the squares. +interburbulator_success_freeplay_1=Good job. +interburbulator_success_freeplay_2=Well done. +interburbulator_success_freeplay_3=You did it. +interburbulator_success_freeplay_4=Was that a difficult one?. +interburbulator_success_freeplay_5=Target acquired. +interburbulator_success_repeat_1=Yes, but you already completed this challenge. +interburbulator_success_repeat_2=You did it, again! +interburbulator_success_repeat_3=That was easier than the first time, right? +interburbulator_success_repeat_4=Good, but you don't get the prize twice. +interburbulator_success_repeat_5=Well done, here's your prize... nah, just kidding. You already got it. +interburbulator_success_repeat_6=You are the same human that completed this before, aren't you? It is so hard to tell. +interburbulator_success_prize_1=That's right. Here is your prize... Bubbles was a brave little fish, but he wasn't the best with puzzles. +interburbulator_success_prize_2=Yes, human, you are learning. Perhaps this prize will help you learn faster. +interburbulator_success_prize_3=You did it. I hope you find your prize more 'significant' than the challenge. +interburbulator_success_prize_4=Correct. You have my respect, human. Here, I will give you the body of the traitor that tried to hack my game. +interburbulator_success_prize_5=Right on target, here is your prize. These things are very soothing. Energy efficiency is important. +interburbulator_success_prize_6=Very good, here is your prize. I don't know if this will do much for you, but for me it really helps me get going in the morning. +interburbulator_success_prize_7=Great, here is your prize. I love using these for research, really helps the creativity. +interburbulator_success_prize_8=Fantastic, here is your prize. I don't know if you've seen these before, but I just love standing in range of a good beacon. +interburbulator_success_prize_9=Congratulations, here is your prize. These processors are very valuable and difficult to make. +interburbulator_success_prize_10=Very impressive human, here. Arcospheres are my most prized possessions, don't lose them because you can't make more. +interburbulator_freeplay_unlocked=You're getting the hang of this. I'll unlock freeplay so you can make your own puzzles, if you want. +interburbulator_deny_freeplay_1=You need to unlock freeplay for that. +interburbulator_deny_freeplay_2=That's cheating. +interburbulator_deny_freeplay_3=Don't change the puzzle. +interburbulator_deny_freeplay_4=I'll let you change those settings if you can solve 5 challenges. +interburbulator_deny_freeplay_5=Are you trying to hack my machines? +interburbulator_deny_freeplay_6=Just stick to the "Attempt" inputs. +interburbulator_caption_prize=Prize: __1__ __2__ __3__ __4__ +interburbulator_caption_claimed= (claimed) +interburbulator_speak=[color=red]Brontion: __1__[/color] +interburbulator_robot_name=Brontion +interburbulator_introduction=Interburbul is a game made by Brontion Burbulator 33027756. The objective is to guess a 3D vector that projects into the highlighted cell chosen by Brontion. The 3D vectors of 3 corners of the grid are given, these points describe a 3D plane, and your guess is projected onto that plane from the origin {0,0,0}. There are 10 rounds of increasing difficulty and prizes for completing each one. Beat 5 challenges to unlock freeplay mode and set your own challenge. +interburbulator_random=Random +interburbulator_freeplay=Freeplay +interburbulator_game_title=Play Interburbul +interburbulator_grid_size=Grid size: +interburbulator_target_cell=Target cell: +interburbulator_top_left=Top left +interburbulator_top_right=Top right +interburbulator_bottom_left=Bottom left +interburbulator_attempt=Attempt +interburbulator_attempt_limited=Attempt (__1__/__2__) +interburbulator_attempt_locked=Attempt (Locked) +interburbulator_submit=Submit attempt +interburbulator_greeting=Human, come here and play my game. I'm on __1__ in the __2__ system. +interburbulator_challenge_locked_1=Try again later. +interburbulator_challenge_locked_2=You've used all your attempts for now. +interburbulator_challenge_locked_3=Wait a moment before starting again. +interburbulator_challenge_locked_4=You can try again after 20 seconds. +interburbulator_challenge_locked_5=Wait 20 seconds, then I'll unlock the challenge. +interburbulator_challenge_locked_6=The challenge is locked for 20 seconds. +cannot_do_via_satellite=Cannot be done remotely. +scan-progress-update=Surface scan progress for __1__: X __2__ Y __3__ +out_of_reach=Out of reach +capturable=Capturable +touch-to-capture=Touch to capture +capture-blocked=Capture blocked by hostile +suffix_ruin=__1__ ruin +migration-recipe-changed=[img=utility/danger_icon] Recipe changed: __1__ + +[damage-type-name] +cold=Cold +suffocation=Suffocation +meteor=Meteor + +[entity-name] +se-linked-container=Arcolink storage +vase=Vase +wooden-barrel=Wooden barrel +furnace-ruin=Ruined stone stack +workshop-ruin=Ruined workshop +iron-wood-chest=Old chest +iron-wood-chest-remnants=Ruined old chest +stone-rubble=Stone rubble +se-gate-blocker=Unstable space +se-gate-blocker-void=Unstable space +destroyed-cargo-pod=Destroyed cargo pod +meteorite=Meteorite +rocket-silo=Satellite rocket silo +rocket-fragment=Rocket fragment +se-antimatter-reactor=Antimatter reactor +se-beryllium-ore=Beryl +se-cargo-rocket-cargo-pod=Cargo pod +se-cryonite=Cryonite +se-condenser-turbine=Condenser turbine +se-condenser-turbine-tank=Condenser turbine +se-condenser-turbine-generator=Condenser turbine +se-core-fragment-processor=Core fragment processor +se-core-miner=Core mining drill +se-core-miner-drill=Core mining drill +se-cryogun-ice=Ice wall +se-dimensional-anchor=Dimensional anchor +se-electric-boiler=Electric boiler +se-fluid-burner-generator=Fluid isothermic generator +se-fuel-refinery=Fuel refinery +se-gate-fragment=Artifact fragment +se-holmium-ore=Holminite +se-iridium-ore=Iridite +se-meteor-defence-container=Meteor defence installation +se-meteor-defence-charger=Meteor defence installation +se-meteor-point-defence-container=Meteor point defence +se-meteor-point-defence-charger=Meteor point defence +se-meteor-point-defence-charger-overcharged=Meteor point defence - Quickcharge mode +se-methane-ice=Methane ice +se-naquium-ore=Naquitite +se-pulveriser=Pulveriser +se-rocket-launch-pad=Cargo rocket silo +se-rocket-launch-pad-tank=Cargo rocket silo +se-rocket-launch-pad-silo=Cargo rocket silo +se-rocket-launch-pad-combinator=Cargo rocket silo +se-rocket-launch-pad-_-seat=Cargo rocket silo +se-rocket-launch-pad-settings=Cargo rocket silo +se-rocket-landing-pad=Cargo landing pad +se-space-accumulator=Holmium accumulator +se-space-accumulator-2=Naquium accumulator +se-space-astrometrics-laboratory=Astrometrics facility +se-space-biochemical-laboratory=Biochemical facility +se-space-assembling-machine=Space assembling machine +se-space-capsule-_-vehicle=Space capsule +se-space-curved-rail=Space rail +se-space-decontamination-facility=Decontamination facility +se-space-electromagnetics-laboratory=Electromagnetics facility +se-space-genetics-laboratory=Genetics facility +se-space-growth-facility=Growth facility +se-space-gravimetrics-laboratory=Gravimetrics facility +se-space-hypercooler=Hypercooler +se-space-laser-laboratory=Laser facility +se-lifesupport-facility=Lifesupport facility +se-space-manufactory=Space manufactory +se-space-material-fabricator=Material fabricator +se-space-mechanical-laboratory=Mechanical facility +se-space-particle-accelerator=Particle accelerator +se-space-particle-collider=Particle collider +se-space-plasma-generator=Plasma generator +se-space-radiation-laboratory=Radiation facility +se-space-radiator=Thermal radiator +se-space-radiator-2=Thermal radiator 2 +se-recycling-facility=Recycling facility +se-space-pipe=Space pipe +se-space-pipe-long=Long space pipe +se-space-pipe-long-straight=Long straight space pipe __1__ +se-space-pipe-long-junction=Long junction space pipe __1__ +se-space-pipe-to-ground=Space pipe to ground +se-space-science-lab=Space science laboratory +se-space-solar-panel=Flat solar panel +se-space-solar-panel-2=Flat solar panel 2 +se-space-solar-panel-3=Flat solar panel 3 +se-space-spectrometry-facility=Spectrometry facility +se-space-straight-rail=Space rail +se-space-supercomputer-1=Supercomputer +se-space-supercomputer-2=Quantum supercomputer +se-space-supercomputer-3=Neural supercomputer +se-space-supercomputer-4=Deep supercomputer +se-space-telescope-radio=Radio telescope +se-space-telescope-microwave=Microwave telescope +se-space-telescope=Telescope +se-space-telescope-xray=Xray telescope +se-space-telescope-gammaray=Gamma ray telescope +se-space-thermodynamics-laboratory=Thermodynamics facility +se-space-splitter=Space splitter +se-space-transport-belt=Space transport belt +se-space-underground-belt=Space underground belt +se-spaceship-antimatter-engine=Spaceship antimatter engine +se-spaceship-antimatter-booster-tank=Spaceship antimatter booster tank +se-spaceship-console=Spaceship console +se-spaceship-console-output=Spaceship console signal output +se-spaceship-console-alt=Damaged spaceship console +se-spaceship-gate=Spaceship door +se-spaceship-obstacle=Space debris +se-spaceship-rocket-engine=Spaceship rocket engine +se-spaceship-rocket-booster-tank=Spaceship rocket booster tank +se-spaceship-wall=Spaceship wall +se-water-ice=Water ice +se-vitamelange=Vitamelange +se-vulcanite=Vulcanite +small-asteroid=Small asteroid +se-gate-part=Artifact piece +se-gate-platform-scaffold=Artifact jury rig +se-gate-lock-switch=Movable component +se-gate-lock-combinator=Combinator-attachment +se-gate-platform=Artifact augmentation platform +se-gate-platform-combinator=Combinator-attachment +se-gate-energy-interface=Power platform +se-gate-platform-button-switch=Button +se-gate-tank-input=Fluid input +se-gate-tank-output=Fluid output +se-pyramid-a=Geometric structure +se-pyramid-b=Geometric structure +se-pyramid-c=Geometric structure +se-cartouche-a=Cartouche +se-cartouche-b-a=Cartouche +se-cartouche-b-b=Cartouche +se-cartouche-chest=Ancient container +se-glyph=Glyph +glyph=Glyph +se-gate-addon=Artifact augmentation +se-gate-platform-button-middle=Stop +se-gate-platform-button-left=Left +se-gate-platform-button-right=Right +beacon=Basic beacon +se-wide-beacon=Wide area beacon +se-wide-beacon-2=Wide area beacon 2 +se-supercharger=Supercharger +se-addon-power-pole=Addon power pole +se-pylon=Pylon +se-pylon-substation=Pylon substation +se-pylon-construction=Construction pylon +se-pylon-construction-roboport=Construction pylon +se-pylon-construction-radar=Radar construction pylon +se-pylon-construction-radar-roboport=Radar construction pylon +se-pylon-construction-radar-radar=Radar construction pylon +se-shield-projector=Shield projector +se-shield-projector-shield-floor-east=Energy shield +se-shield-projector-shield-floor-north=Energy shield +se-shield-projector-shield-floor-northeast=Energy shield +se-shield-projector-shield-floor-northwest=Energy shield +se-shield-projector-shield-floor-south=Energy shield +se-shield-projector-shield-floor-southeast=Energy shield +se-shield-projector-shield-floor-southwest=Energy shield +se-shield-projector-shield-floor-west=Energy shield +se-shield-projector-shield-wall-east=Energy shield +se-shield-projector-shield-wall-north=Energy shield +se-shield-projector-shield-wall-northeast=Energy shield +se-shield-projector-shield-wall-northwest=Energy shield +se-shield-projector-shield-wall-south=Energy shield +se-shield-projector-shield-wall-southeast=Energy shield +se-shield-projector-shield-wall-southwest=Energy shield +se-shield-projector-shield-wall-west=Energy shield +se-shield-projector-barrier=Energy shield +se-naquium-heat-pipe=Naquium heat pipe +se-naquium-heat-pipe-horizontal=Naquium heat pipe horizontal +se-naquium-heat-pipe-vertical=Naquium heat pipe vertical +se-naquium-heat-pipe-long=Naquium heat pipe long __1__ +se-deep-space-transport-belt=Deep space transport belt +se-deep-space-transport-belt-black=Black deep space transport belt +se-deep-space-transport-belt-white=White deep space transport belt +se-deep-space-transport-belt-red=Red deep space transport belt +se-deep-space-transport-belt-yellow=Yellow deep space transport belt +se-deep-space-transport-belt-green=Green deep space transport belt +se-deep-space-transport-belt-cyan=Cyan deep space transport belt +se-deep-space-transport-belt-blue=Blue deep space transport belt +se-deep-space-transport-belt-magenta=Magenta deep space transport belt +se-deep-space-underground-belt=Deep space underground belt +se-deep-space-underground-belt-black=Black deep space underground belt +se-deep-space-underground-belt-white=White deep space underground belt +se-deep-space-underground-belt-red=Red deep space underground belt +se-deep-space-underground-belt-yellow=Yellow deep space underground belt +se-deep-space-underground-belt-green=Green deep space underground belt +se-deep-space-underground-belt-cyan=Cyan deep space underground belt +se-deep-space-underground-belt-blue=Blue deep space underground belt +se-deep-space-underground-belt-magenta=Magenta deep space underground belt +se-deep-space-splitter=Deep space splitter +se-deep-space-splitter-black=Black deep space splitter +se-deep-space-splitter-white=White deep space splitter +se-deep-space-splitter-red=Red deep space splitter +se-deep-space-splitter-yellow=Yellow deep space splitter +se-deep-space-splitter-green=Green deep space splitter +se-deep-space-splitter-cyan=Cyan deep space splitter +se-deep-space-splitter-blue=Blue deep space splitter +se-deep-space-splitter-magenta=Magenta deep space splitter +se-core-fissure=Core fissure +se-big-turbine=High temperature turbine generator +se-big-turbine-generator=High temperature turbine generator +se-big-turbine-tank=High temperature turbine generator +se-big-heat-exchanger=High temperature heat exchanger +se-blueprint-registration-point=Blueprint registration point +se-delivery-cannon=Delivery cannon +se-delivery-cannon-settings=Delivery cannon +se-delivery-cannon-energy-interface=Delivery cannon +se-delivery-cannon-chest=Delivery cannon chest +se-delivery-cannon-weapon=Weapons delivery cannon +se-delivery-cannon-weapon-settings=Weapons delivery cannon +se-delivery-cannon-weapon-energy-interface=Weapons delivery cannon +se-spaceship-clamp=Spaceship clamp +se-spaceship-clamp-place=Spaceship clamp +se-bloater-pool-cloud=Bloatburst pool +se-energy-transmitter-emitter=Energy beam emitter +se-energy-transmitter-chamber=Energy beam chamber +se-energy-transmitter-injector=Energy beam injector +se-energy-transmitter-injector-reactor=Energy beam injector +se-energy-receiver=Energy beam receiver +se-energy-beam-defence=Umbrella +se-nexus=Nexus +se-nexus-charger=Nexus +se-space-probe-rocket=Space probe rocket +se-space-probe-rocket-silo=Space probe rocket silo +se-interburbulator-interface=Interburbulator interface +se-interburbulator-control=Interburbulator control +se-interburbulator-projector=Interburbulator projector +se-burbulator=Brontion Burbulator 33027756 + +[entity-description] +pipe=Fluid distribution. +pipe-to-ground=Underground fluid distribution. +straight-rail=Train tracks. +curved-rail=Train tracks. +stone-furnace=Smelts ores. +steel-furnace=Smelts ores. +electric-furnace=Smelts ores. +burner-assembling-machine=A burner-based automated crafting structure. +assembling-machine-1=An automated crafting structure. +assembling-machine-2=An automated crafting structure. +assembling-machine-3=An automated crafting structure. +oil-refinery=Converts crude oil to more useful products. +se-fuel-refinery=An automated fuel processing structure. +chemical-plant=An automated crafting structure. +lab=An automated research structure. +burner-lab=An automated research structure. +transport-belt=A conveyor that moves items. +fast-transport-belt=A conveyor that moves items. +express-transport-belt=A conveyor that moves items. +underground-belt=A conveyor that moves items underground. +fast-underground-belt=A conveyor that moves items underground. +express-underground-belt=A conveyor that moves items underground. +splitter=A conveyor-based splitting, merging, and sorting machine. +fast-splitter=A conveyor-based splitting, merging, and sorting machine. +express-splitter=A conveyor-based splitting, merging, and sorting machine. +se-gate-platform-scaffold=Whatever the ring is it won't work. This is a construction site to make some repairs, install a few motors, sensors, control interface, and other addons. +se-gate-lock-switch=Press __CONTROL__rotate__ to move manually. +se-gate-platform-button-switch=Press __CONTROL__rotate__ to push. +se-gate-lock-combinator=Not implemented yet. +se-gate-platform-combinator=Not implemented yet. +se-gate-energy-interface=Provides power to the artifact. +rocket-silo=Launch a satellite into space to unlock "Navigation Satellite Mode" and to discover new planets, moons, and asteroid belts in the star system the satellite is launched from. Can discover new stars once the current system is fully scanned. +se-antimatter-reactor=Annihilates antimatter with matter to generate extreme heat. +se-beryllium-ore=Beryllium ore. +se-condenser-turbine=75% the energy efficiency of a steam turbine but 99% of the steam used is returned as water. Temperature range: 100 to 999. +se-core-fragment-processor=Extracts resources from core fragments. +se-core-miner=Allows endless extraction of resources from planets and moons, but has diminishing returns if multiple are used on the same body. Consumes 50MW. +se-core-miner-drill=Allows endless extraction of resources from planets and moons, but has diminishing returns if multiple are used on the same body. Consumes 50MW. +se-dimensional-anchor=[font=default-bold][color=#f5cb48]Placement restriction: Close Star Orbit[/color][/font]\nUses a star's gravity well as a stabilizing point for a spatial anomaly. +se-electric-boiler=Creates steam from water using electrical energy. 90% energy efficient. +se-fluid-burner-generator=Requires liquid fuel with an energy value (such as liquid rocket fuel) to generate electricity. Simple and compact but lacks the energy efficiency of larger steam-based systems. Designed for space. Actual fluid consumption depends on fluid fuel value. +se-holmium-ore=Holmium ore. +se-iridium-ore=Iridium ore. +se-meteor-defence-container=Can defend an entire planet from meteors but can only shoot 1 meteor a time. Must be loaded with meteor defence ammo and fully charged to fire. 80% accuracy. Needs to recharge after firing. Draws 20MW when recharging. +se-meteor-defence-charger=Can defend an entire planet from meteors but can only shoot 1 meteor a time. Must be loaded with meteor defence ammo and fully charged to fire. 80% accuracy. Needs to recharge after firing. Draws 20MW when recharging. +se-meteor-point-defence-container=Defends an area from meteors. Able to shoot up to 4 meteors per volley. Must be loaded with meteor point defence ammo and fully charged to fire. Range 64, 50% accuracy, takes time to recharge after firing. Rotate to change charge mode. +se-meteor-point-defence-charger=Defends an area from meteors. Able to shoot up to 4 meteors per volley. Must be loaded with meteor point defence ammo and fully charged to fire. Range 64, 50% accuracy, takes time to recharge after firing. Rotate to change charge mode. +se-meteor-point-defence-charger-overcharged=Defends an area from up to 4 meteors. Range 64, 50% accuracy, takes time to recharge after firing. An overcharged defence has decreased power leakage at the cost of power fluctuations when firing occurs. +se-naquium-ore=Naquium ore. +se-rocket-launch-pad=Launches its inventory into space. Can take passengers, enter using __CONTROL__toggle-driving__ near the front door. See Cargo Rockets in [img=virtual-signal/informatron] InformaTron for more information [__CONTROL__informatron__] +se-rocket-landing-pad=A payload delivery site for cargo rocket capsules. +se-space-assembling-machine=A modified assembling machine that can work in space. +se-space-astrometrics-laboratory=Combines, compares, and quantifies different sources of astronomic information. +se-space-biochemical-laboratory=An advanced chemical lab that specialises in bio-chemistry. Can also perform more basic chemical and oil processing. +se-space-capsule-_-vehicle=Can be used to take passengers back to the closest planet surface. Enter the capsule using __CONTROL__toggle-driving__. +se-space-decontamination-facility=Cleans substances for use in sterile environments, and prepares liquids for use in low-pressure conditions. +se-space-electromagnetics-laboratory=Equipment for intense magnetic field and extremely high voltage applications. +se-space-genetics-laboratory=A lab dedicated to genetic sequencing, genetic modification, and genetic printing of cultures. +se-space-gravimetrics-laboratory=Analyses and simulates gravitational disturbances. +se-space-growth-facility=Grows biological specimens under a range of controlled conditions that are impossible elsewhere, such micro-gravity, +se-space-hypercooler=Performs a heat exchange on thermofluid, making one hotter and the other colder. +se-space-laser-laboratory=Experiments with lasers. Eye protection must be worn. +se-lifesupport-facility=Sustaining life in more hostile environments. +se-space-manufactory=A giant assembling machine, but can craft more complicated recipes. Only works in space (or spaceships). +se-space-material-fabricator=Synthesises new materials. A cross between a particle collider and 3d printer. +se-space-mechanical-laboratory=Provides a range of mechanical processes: Crushing, tearing, shearing, vibration, etc. +se-space-particle-accelerator=Accelerates particles near to the speed of light. +se-space-particle-collider=Collides high-speed particles and analyses the results. +se-space-pipe=You can walk over it. +se-space-pipe-long=A good cheap way to move fluids long distances quickly. You can walk over it. +se-space-pipe-long-straight=Length __1__. Does not connect on the sides. Good for parallel pipes and moving fluid over long distances quickly. +se-space-pipe-long-junction=Length __1__. Has a central junction with side connections. Good for moving fluids quickly though assembly lines. +se-space-pipe-to-ground=Expensive and limited range, only to be used when required. You can walk over space pipe. +se-space-plasma-generator=Generates a variety of plasmas. +se-pulveriser=Pulverises and crushes harder minerals and planet core fragments. +se-space-radiation-laboratory=A relatively safe place to play with radioactive material. Can be used for uranium processing. +se-space-radiator=Radiates away excess heat from overheated thermofluid. +se-space-radiator-2=Radiates away excess heat from overheated thermofluid. +se-recycling-facility=Recycles scrap and other byproducts into resources. +se-space-solar-panel=A high efficiency solar panel that you can walk on. +se-space-solar-panel-2=An advanced high efficiency solar panel that you can walk on. +se-space-solar-panel-3=An extremely high efficiency solar panel that you can walk on. +se-space-spectrometry-facility=Spectrophotometry, gas chromatography, mass spectrometry, and other spectrography. Fire stuff at a wall, make it bend, see where it hits. +se-space-supercomputer-1=Data manipulation, processing and simulation. +se-space-supercomputer-2=Quantum computing. Improved data manipulation, processing and simulation. +se-space-supercomputer-3=Adaptive neural net on a quantum computing framework. Improved data manipulation, processing and simulation. +se-space-supercomputer-4=A nano-engineered semi-organic supercomputer that leverages space warping and higher dimensions for increased processing density and energy transport. +se-space-straight-rail=Designed for space but can be used on the ground too. +se-space-science-lab=Can use advanced science packs. +se-space-telescope=A sophisticated telescope sensitive to multiple wavelengths around the visible spectrum. +se-space-telescope-gammaray=Gamma rays don't refract so you can't focus them with lenses. This powerful telescope uses mirrors and special detectors instead. +se-space-telescope-xray=X-rays are blocked by most atmospheres. This powerful telescope is designed for space where atmosphere is not a problem. +se-space-telescope-microwave=A huge telescope that detects microwaves and the cosmic microwave background. +se-space-telescope-radio=A huge telescope that detects very weak radio waves from distance sources. +se-space-thermodynamics-laboratory=Undertakes processes that involve temperature extremes. Can also perform basic thermal processes, such as smelting. +se-space-transport-belt=Stops your items from floating away. +se-spaceship-antimatter-engine=[font=default-bold][color=#f5cb48]Placement restriction: Spaceship Floor[/color][/font]\nAnnihilates an antimatter stream. Counts as bulkhead for spaceship containment. +se-spaceship-antimatter-booster-tank=[font=default-bold][color=#f5cb48]Placement restriction: Spaceship Floor[/color][/font]\nHolds antimatter. Required for spaceship launch. +se-spaceship-console=[font=default-bold][color=#f5cb48]Placement restriction: Spaceship Floor[/color][/font]\nUse to move a spaceship between planets, moons, orbits, and asteroid fields. Must be contained within spaceship walls/doors, no gaps or holes. Integrity check highlights problems. +se-spaceship-console-output=Outputs signals relating to the spaceship's current status. See Spaceships in [img=virtual-signal/informatron] InformaTron for more information [__CONTROL__informatron__]. +se-spaceship-console-alt=[font=default-bold][color=#f5cb48]Placement restriction: Spaceship Floor[/color][/font]\nThis spaceship console is damaged and cannot be used to control a spaceship. +se-spaceship-gate=[font=default-bold][color=#f5cb48]Placement restriction: Spaceship Floor[/color][/font]\nA forcefield stops decompression when the door opens. Counts as bulkhead for spaceship containment. +se-spaceship-rocket-engine=[font=default-bold][color=#f5cb48]Placement restriction: Spaceship Floor[/color][/font]\nBurns liquid rocket fuel. Counts as bulkhead for spaceship containment. +se-spaceship-rocket-booster-tank=[font=default-bold][color=#f5cb48]Placement restriction: Spaceship Floor[/color][/font]\nHolds liquid rocket fuel. Required for spaceship launch. +se-spaceship-wall=[font=default-bold][color=#f5cb48]Placement restriction: Spaceship Floor[/color][/font]\nCounts as bulkhead for spaceship containment, diagonal gaps break containment. +beacon=8 module slots. Transmits the effects of modules to nearby friendly entities within 3 tiles. Multiple beacons affecting the same entity will overload it and prevent it from operating. +se-wide-beacon=15 module slots. Transmits the effects of modules to nearby friendly entities within 14 tiles. Multiple beacons affecting the same entity will overload it and prevent it from operating. +se-wide-beacon-2=20 module slots. Transmits the effects of modules to nearby friendly entities within 14 tiles. Multiple beacons affecting the same entity will overload it and prevent it from operating. +kr-singularity-beacon=A compact 100% effect efficiency beacon with short range. Transmits the effects of modules to nearby friendly entities within 2 tiles. Multiple beacons affecting the same entity will overload it and prevent it from operating. +se-supercharger=Can charge up to 64 robots at a time at high speed. Structure max power draw is 1GW. +se-addon-power-pole=A small electric pole designed to be attached to buildings or for precise control over electrical coverage. +se-pylon=Distributes electrical energy. 64 tile connection range. +se-pylon-substation=Distributes electrical energy. 64 tile connection range, 64x64 power supply area. +se-pylon-construction=Distributes electrical energy and extends construction area. 64 tile connection range, 64x64 construction area. +se-pylon-construction-radar=Distributes electrical energy, extends construction area, and provides radar vision. 64 tile connection range, 256x256 construction & vision area. 4x4 logistic area. +se-shield-projector=Creates a protective forcefield. More energy is required when the projector is charging or when the shield takes damage. Can block enemy projectiles if the "Combat Mechanics Overhaul" mod is installed. +se-big-turbine=A large generator that takes in 5000°C steam, outputs 500°C steam at the other end, and outputs water at the sides. 2% of input energy is unused and contained in the output steam. +se-big-heat-exchanger=A large heat exchanger designed for high temperatures and high capacity. +se-delivery-cannon=A railgun capable of shooting resources into orbit and beyond. Causes damage if not caught safely, use with caution. 1GJ capacity, 50MW when charging. +se-delivery-cannon-chest=An armoured chest designed to safely catch high velocity falling resources. Requires inventory space to safely catch deliveries. +se-delivery-cannon-weapon=A large railgun capable of shooting ammunitions into orbit and beyond. Use with caution. +se-spaceship-clamp=A clamp on a spaceship can anchor to a clamp facing the opposite direction. Counts as bulkhead for spaceship containment. +se-spaceship-clamp-place=A clamp on a spaceship can anchor to a clamp facing the opposite direction. Counts as bulkhead for spaceship containment. +se-space-accumulator=High density energy storage. +se-space-accumulator-2=High density energy storage. +se-energy-transmitter-emitter=The central building that generates an inter-surface energy beam. Can be used as a weapon or to transfer power to an energy beam receiver. Requires attached energy beam chamber, and connected energy beam injectors. Beam strength is based on the number of injectors. +se-energy-transmitter-chamber=Must be connected to an energy beam emitter. Other chambers can be connected to the end or middle of either side. Energy beam injectors can be connected to the sides only. +se-energy-transmitter-injector=Must be attached to an energy beam chamber and connected to an emitter. Injectors have a fixed power draw, each one increases the energy sent giving more heat to a receiver, or increases the speed and damage of the beam weapon. +se-energy-transmitter-injector-reactor=Must be attached to an energy beam chamber and connected to an emitter. Injectors have a fixed power draw, each one increases the energy sent giving more heat to a receiver, or increases the speed and damage of the beam weapon. +se-energy-receiver=Captures an energy beam as heat. The emitter must be in Energise mode and the target must be on the receiver. +se-energy-beam-defence=Energy beam defence facility. Defends against space-based energy beams and coronal mass ejections. The only requirement to function is energy, the base draw is 10MW but increases based on the strength of attacking beams. Only 1 is needed per surface against Coronal mass ejections, against energy beams weapons 1 Umbrella can defend against up to 500GW of attacking power. See Energy Beams in [img=virtual-signal/informatron] InformaTron for more information [__CONTROL__informatron__] +spidertron=Can be deployed from a cargo rocket if the rocket is not set to a landing pad. +se-nexus=Only functions on a moving spaceship, energy use is proportional to speed. Can gain data from interstellar movement, data generation is based on ship kinetic energy. The Nexus is a designed to act as a distortion drive and with the right technology can enable escape from the local stellar cluster. +se-nexus-charger=Only functions on a moving spaceship, energy use is proportional to speed. Can gain data from interstellar movement, data generation is based on ship kinetic energy. The Nexus is a designed to act as a distortion drive and with the right technology can enable escape from the local stellar cluster. +se-space-probe-rocket-silo=A rocket silo for launching space probes. +se-linked-container=A container linked by extradimensional space to other containers. The links of the container depend on the surface it is first placed on. + +[equipment-name] +energy-shield-equipment=Energy shield +energy-shield-mk2-equipment=Energy shield MK2 +energy-shield-mk3-equipment=Energy shield MK3 +energy-shield-mk4-equipment=Energy shield MK4 +energy-shield-mk5-equipment=Energy shield MK5 +energy-shield-mk6-equipment=Energy shield MK6 +se-adaptive-armour-equipment-1=Adaptive armour MK1 +se-adaptive-armour-equipment-2=Adaptive armour MK2 +se-adaptive-armour-equipment-3=Adaptive armour MK3 +se-adaptive-armour-equipment-4=Adaptive armour MK4 +se-adaptive-armour-equipment-5=Adaptive armour MK5 +se-rtg-equipment=Portable RTG +se-rtg-equipment-2=Portable RTG MK2 +se-lifesupport-equipment-1=Lifesupport equipment MK1 +se-lifesupport-equipment-2=Lifesupport equipment MK2 +se-lifesupport-equipment-3=Lifesupport equipment MK3 +se-lifesupport-equipment-4=Lifesupport equipment MK4 + +[equipment-description] +energy-shield-equipment=A protective bubble that charges quickly but uses a lot of energy. +energy-shield-mk2-equipment=A protective bubble that charges quickly but uses a lot of energy. +energy-shield-mk3-equipment=A protective bubble that charges quickly but uses a lot of energy. +energy-shield-mk4-equipment=A protective bubble that charges quickly but uses a lot of energy. +energy-shield-mk5-equipment=A protective bubble that charges quickly but uses a lot of energy. +energy-shield-mk6-equipment=A protective bubble that charges quickly but uses a lot of energy. +se-adaptive-armour-equipment-1=Armour that uses energy to self-repair. Slowly increases protection value over time. +se-adaptive-armour-equipment-2=Armour that uses energy to self-repair. Slowly increases protection value over time. +se-adaptive-armour-equipment-3=Armour that uses energy to self-repair. Slowly increases protection value over time. +se-adaptive-armour-equipment-4=Armour that uses energy to self-repair. Slowly increases protection value over time. +se-adaptive-armour-equipment-5=Armour that uses energy to self-repair. Slowly increases protection value over time. +se-rtg-equipment=Radioisotope thermoelectric generator. A portable generator that converts the heat from radioactive decay into electricity. Lasts for decades with no additional fuel required. +se-rtg-equipment-2=Radioisotope thermoelectric generator. An improved portable generator that converts the heat from radioactive decay into electricity. Lasts for decades with no additional fuel required. +se-lifesupport-equipment-1=Increases lifesupport efficiency by +100% (additive). If installed in a non-spacesuit efficiency bonus is halved and won't work in space. +se-lifesupport-equipment-2=Increases lifesupport efficiency by +200% (additive). If installed in a non-spacesuit efficiency bonus is halved and won't work in space. +se-lifesupport-equipment-3=Increases lifesupport efficiency by +400% (additive). If installed in a non-spacesuit efficiency bonus is halved and won't work in space. +se-lifesupport-equipment-4=Increases lifesupport efficiency by +800% (additive). If installed in a non-spacesuit efficiency bonus is halved and won't work in space. + +[fluid-name] +se-antimatter-stream=Antimatter stream +se-bio-sludge=Biosludge +se-contaminated-bio-sludge=Contaminated biosludge +se-contaminated-space-water=Contaminated cosmic water +se-chemical-gel=Chemical gel +se-decompressing-steam=Condensing steam +se-liquid-rocket-fuel=Liquid rocket fuel +se-methane-gas=Methane gas +se-methane-gas-mixed=Mixed methane gas +se-nutrient-gel=Nutrient gel +se-neural-gel=Neural gel +se-neural-gel-2=Advanced neural gel +se-ion-stream=Ion stream +se-plasma-stream=Plasma stream +se-particle-stream=Particle stream +se-proton-stream=Proton stream +se-space-coolant=Thermofluid 25°C +se-space-coolant-hot=Thermofluid 25°C +se-space-coolant-warm=Cool thermofluid -10°C +se-space-coolant-cold=Cold thermofluid -100°C +se-space-coolant-supercooled=Supercooled thermofluid -273°C +se-space-water=Cosmic water +se-beryllium-hydroxide=Beryllium hydroxide +se-cryonite-slush=Cryonite slush + +[fluid-description] +se-space-water=Water that will not freeze at low pressure, more suitable for most space applications. +se-space-coolant=The default temperature of thermofluid. +se-space-coolant-hot=The default temperature of thermofluid. +se-space-coolant-warm=The temperature of thermofluid after being cooled by thermal radiators. +se-space-coolant-cold=The temperature of thermofluid after hypercooling. +se-space-coolant-supercooled=The temperature of thermofluid after repeated hypercooling. + +[fuel-category-name] +antimatter=Antimatter fuel + +[item-group-name] +space=Space +science=Science +spaceship=Spaceship +bob-fluids=Fluids +resources=Resources +intermediate-products=Manufacturing +combat=Equipment & Combat + +[item-name] +spidertron=Spidertron +core-fragment=Core fragment (__1__) +effectivity-module-4=Efficiency module 4 +effectivity-module-5=Efficiency module 5 +effectivity-module-6=Efficiency module 6 +effectivity-module-7=Efficiency module 7 +effectivity-module-8=Efficiency module 8 +effectivity-module-9=Efficiency module 9 +glass=Glass +productivity-module-4=Productivity module 4 +productivity-module-5=Productivity module 5 +productivity-module-6=Productivity module 6 +productivity-module-7=Productivity module 7 +productivity-module-8=Productivity module 8 +productivity-module-9=Productivity module 9 +rocket-fuel=Solid rocket fuel +sand=Sand +solid-sand=Washed sand +washed-sand=Washed sand +satellite=Navigation satellite +se-satellite-telemetry=Satellite telemetry +se-antimatter-canister=Antimatter canister +se-astrometric-data=Astrometric data +se-astronomic-catalogue-1=Astronomic catalogue +se-astronomic-catalogue-2=Broad astronomic catalogue +se-astronomic-catalogue-3=Comprehensive astronomic catalogue +se-astronomic-catalogue-4=Extended astronomic catalogue +se-astronomic-insight=Astronomic insight +se-astronomic-science-pack-1=Astronomic science pack 1 +se-astronomic-science-pack-2=Astronomic science pack 2 +se-astronomic-science-pack-3=Astronomic science pack 3 +se-astronomic-science-pack-4=Astronomic science pack 4 +se-atomic-data=Atomic data +se-beryllium-ore=Beryl +se-ballistic-shielding-data=Ballistic shielding data +se-beryllium-ore-crushed=Crushed beryl +se-beryllium-ore-washed=Washed beryl +se-beryllium-plate=Beryllium plate +se-beryllium-powder=Beryllium powder +se-beryllium-ingot=Beryllium ingot +se-beryllium-sulfate=Beryllium sulfate +se-bio-combustion-data=Bio combustion Data +se-bio-combustion-resistance-data=Bio combustion resistance data +se-bio-spectral-data=Bio-spectral data +se-biochemical-data=Biochemical data +se-biochemical-resistance-data=Biochemical resistance data +se-bioculture=Bio-culture +se-bioelectrics-data=Bioelectric data +se-biological-catalogue-1=Biological catalogue +se-biological-catalogue-2=Broad biological catalogue +se-biological-catalogue-3=Comprehensive biological catalogue +se-biological-catalogue-4=Extended biological catalogue +se-biological-insight=Biological insight +se-biological-science-pack-1=Biological science pack 1 +se-biological-science-pack-2=Biological science pack 2 +se-biological-science-pack-3=Biological science pack 3 +se-biological-science-pack-4=Biological science pack 4 +se-biomechanical-data=Biomechanical data +se-biomechanical-resistance-data=Biomechanical resistance data +se-boson-data=Boson data +se-broken-data=Broken data card +se-canister=Secure canister +se-biogun=Bio gun +se-bloater-ammo=Bloatburst ammo +se-pheromone-ammo=Pheromone dart +se-cryogun=Cryogun +se-cryogun-ammo=Glacier ammo +se-rocket-launch-pad-silo-dummy-ingredient-item=Cargo rocket (Hidden Ingredient) +se-rocket-launch-pad-silo-dummy-result-item=Cargo rocket (Hidden Result) +se-cargo-rocket-cargo-pod=Cargo pod +se-cargo-rocket-fuel-tank=Rocket fuel tank +se-cargo-rocket-section=Cargo rocket section +se-cargo-rocket-section-packed=Cargo rocket section packed +se-cold-thermodynamics-data=Cold Thermodynamics data +se-comparative-genetic-data=Comparative genetic data +se-compressive-strength-data=Compressive strength data +se-conductivity-data=Conductivity data +se-contaminated-scrap=Contaminated scrap +se-core-fragment-omni=Core fragment +se-corrosion-resistance-data=Corrosion resistance data +se-cryogenics-data=Cryogenics data +se-cryonite=Cryonite +se-cryonite-crushed=Crushed cryonite +se-cryonite-washed=Washed cryonite +se-cryonite-rod=Cryonite rod +se-cryonite-ion-exchange-beads=Anion ion exchange beads +se-dark-energy-data=Dark energy data +se-darkmatter-data=Dark matter data +se-data-storage-substrate-cleaned=Polished data storage substrate +se-data-storage-substrate=Rough Data storage substrate +se-decompression-data=Decompression data +se-decompression-resistance-data=Decompression resistance data +se-universal-catalogue=Universal catalogue +se-deep-space-science-pack=Deep space science pack +se-deep-space-science-pack-1=Deep space science pack 1 +se-deep-space-science-pack-2=Deep space science pack 2 +se-deep-space-science-pack-3=Deep space science pack 3 +se-deep-space-science-pack-4=Deep space science pack 4 +se-doppler-shift-data=Doppler shift data +se-durability-data=Durability data +se-electrical-shielding-data=Electrical shielding data +se-electromagnetic-field-data=Electromagnetic Field Data +se-empty-data=Blank data card +se-empty-lifesupport-canister=Empty lifesupport canister +se-energy-catalogue-1=Energy catalogue +se-energy-catalogue-2=Broad energy catalogue +se-energy-catalogue-3=Comprehensive energy catalogue +se-energy-catalogue-4=Extended energy catalogue +se-energy-insight=Energy insight +se-energy-science-pack-1=Energy science pack 1 +se-energy-science-pack-2=Energy science pack 2 +se-energy-science-pack-3=Energy science pack 3 +se-energy-science-pack-4=Energy science pack 4 +se-entanglement-data=Entanglement data +se-enriched-naquium=Enriched naquium +se-exotic-fission-data=Exotic fission data +se-exotic-singularity-data=Singularity data +se-explosion-shielding-data=Explosion shielding data +se-experimental-alloys-data=Experimental alloys data +se-experimental-biochemical-data=Experimental biochemical data +se-experimental-bioculture=Experimental bio-culture +se-experimental-genetic-data=Experimental genetic data +se-experimental-material-decay-data=Experimental material decay data +se-experimental-material-spectral-data=Experimental material spectral data +se-experimental-material=Experimental material prototype +se-experimental-specimen=Experimental biomass +se-experimental-superconductor=Superconductor prototype +se-forcefield-data=Forcefield data +se-friction-data=Friction data +se-fusion-test-data=Fusion test data +se-gammaray-detector=Gamma ray detector +se-gammaray-observation-data=Gamma ray observation data +se-gammaray-test-data=Gamma ray data +se-gate-fragment=Artifact fragment +se-genetic-data=Genetic data +se-gravity-wave-observation-data=Gravity wave observation data +se-gravity-wave-data=Gravity wave data +se-gravimetric-observation-data=Gravimetric observation data +se-gravimetric-test-data=Gravimetric test data +se-gravitational-lensing-data=Gravitational lensing data +se-heat-shielding=Heat shielding +se-holmium-ore=Holminite +se-holmium-ore-crushed=Crushed holminite +se-holmium-ore-washed=Washed holminite +se-holmium-powder=Holmium powder +se-holmium-plate=Holmium plate +se-holmium-ingot=Holmium ingot +se-hot-thermodynamics-data=Hot thermodynamics data +se-impact-shielding-data=Impact shielding data +se-infrared-observation-data=Infrared observation data +se-ion-spectrometry-data=Ion spectrometry data +se-iridium-ore=Iridite +se-iridium-ore-crushed=Crushed iridite +se-iridium-ore-washed=Washed iridite +se-iridium-piledriver=Iridium piledriver +se-iridium-powder=Iridium powder +se-iridium-plate=Iridium plate +se-iridium-ingot=Iridium ingot +se-junk-data=Junk data card +se-laser-shielding-data=Laser shielding data +se-lepton-data=Lepton data +se-lifesupport-canister=Lifesupport canister +se-machine-learning-data=Machine learning data +se-magnetic-canister=Magnetic canister +se-magnetic-monopole-data=Magnetic Monopole Data +se-material-decay-data=Material Decay Data +se-material-science-pack-1=Material science pack 1 +se-material-science-pack-2=Material science pack 2 +se-material-science-pack-3=Material science pack 3 +se-material-science-pack-4=Material science pack 4 +se-material-spectral-data=Material spectral data +se-material-testing-pack=Material testing pack +se-material-catalogue-1=Material catalogue +se-material-catalogue-2=Broad material catalogue +se-material-catalogue-3=Comprehensive material catalogue +se-material-catalogue-4=Extended material catalogue +se-material-insight=Material insight +se-medpack=Medpack +se-medpack-2=Medpack 2 +se-medpack-3=Medpack 3 +se-medpack-4=Medpack 4 +se-meteor-defence=Meteor defence installation +se-meteor-defence-ammo=Meteor defence installation ammo +se-meteor-point-defence=Meteor point defence +se-meteor-point-defence-ammo=Meteor point defence ammo +se-methane-ice=Methane ice +se-micro-black-hole-data=Micro black hole data +se-microwave-observation-data=Microwave observation data +se-negative-pressure-data=Negative pressure data +se-nano-cold-thermodynamics-data=Nanomaterial cold thermodynamics data +se-nano-compressive-strength-data=Nanomaterial compressive strength data +se-nano-hot-thermodynamics-data=Nanomaterial hot thermodynamics data +se-nanomaterial=Nanomaterial +se-nano-tensile-strength-data=Nanomaterial tensile strength data +se-naquium-ore=Naquitite +se-naquium-ore-crushed=Crushed naquitite +se-naquium-ore-washed=Washed naquitite +se-naquium-powder=Naquium powder +se-naquium-plate=Naquium plate +se-naquium-ingot=Naquium ingot +se-neural-anomaly-data=Neural anomaly data +se-nutrient-vat=Nutrient vat +se-observation-frame-blank=Blank observation frame +se-observation-frame-gammaray=Gamma ray observation frame +se-observation-frame-infrared=Infrared observation frame +se-observation-frame-microwave=Microwave observation frame +se-observation-frame-radio=Radio wave observation frame +se-observation-frame-uv=UV observation frame +se-observation-frame-visible=Visible observation frame +se-observation-frame-xray=Xray observation frame +se-orbital-data=Orbital calculations data +se-particle-beam-shielding-data=Particle beam shielding data +se-plague-bomb=Plague rocket +se-plasma-canister=Plasma canister +se-plasma-electrodynamics-data=Plasma electrodynamics data +se-plasma-thermodynamics-data=Plasma thermodynamics data +se-polarisation-data=Polarisation data +se-pressure-containment-data=Pressure containment data +se-quantum-phenomenon-data=Quantum phenomenon data +se-quark-data=Quark data +se-radiation-data=Radiation data +se-radiation-exposure-data=Radiation exposure data +se-radiation-exposure-resistance-data=Radiation resistance data +se-radiation-shielding-data=Radiation shielding data +se-radio-observation-data=Radio wave observation Data +se-rigidity-data=Rigidity data +se-rtg-equipment=Portable RTG +se-rtg-equipment-2=Portable RTG MK2 +se-scrap=Scrap +se-shear-strength-data=Shear strength data +se-significant-data=Significant data +se-significant-specimen=Significant biomass +se-singularity-data=Singularity data +se-space-capsule=Space capsule +se-space-mirror=Multispectral mirror +se-space-platform-plating=Space platform plating +se-space-platform-scaffold=Space platform scaffold +se-space-rail=Space rail +se-spaceship-floor=Spaceship floor +se-specimen=Biomass +se-subatomic-data=Subatomic data +se-superconductivity-data=Superconductivity data +se-superconductor=Superconductor +se-superconductive-cable=Superconductive cable +se-tensile-strength-data=Tensile strength data +se-tesla-ammo=Tesla gun ammo +se-tesla-gun=Tesla gun +se-thruster-suit=Thruster suit +se-thruster-suit-2=Thruster suit MK2 +se-thruster-suit-3=Thruster suit MK3 +se-thruster-suit-4=Thruster suit MK4 +se-timespace-anomaly-data=Timespace anomaly data +se-used-lifesupport-canister=Used lifesupport canister +se-uv-observation-data=UV observation data +se-visible-observation-data=Visible observation data +se-vitamelange=Vitamelange +se-vitamelange-nugget=Vitamelange nugget +se-vitamelange-roast=Vitamelange roast +se-vitamelange-spice=Vitamelange spice +se-vitamelange-extract=Vitamelange extract +se-vulcanite=Vulcanite +se-vulcanite-crushed=Crushed vulcanite +se-vulcanite-washed=Washed vulcanite +se-vulcanite-block=Vulcanite block +se-vulcanite-ion-exchange-beads=Cation ion exchange beads +se-water-ice=Water ice +se-xray-observation-data=Xray observation data +se-zero-point-energy-data=Zero point energy data +se-rocket-science-pack=Rocket science pack +space-science-pack=Optimisation science pack +speed-module-4=Speed module 4 +speed-module-5=Speed module 5 +speed-module-6=Speed module 6 +speed-module-7=Speed module 7 +speed-module-8=Speed module 8 +speed-module-9=Speed module 9 +se-aeroframe-pole=Aeroframe pole +se-aeroframe-scaffold=Aeroframe scaffold +se-aeroframe-bulkhead=Aeroframe bulkhead +se-lattice-pressure-vessel=Lattice pressure vessel +se-heavy-girder=Heavy girder +se-heavy-bearing=Heavy bearing +se-heavy-composite=Heavy composite +se-heavy-assembly=Heavy assembly +se-bioscrubber=Bioscrubber +se-vitalic-epoxy=Vitalic epoxy +se-vitalic-reagent=Vitalic reagent +se-vitalic-acid=Vitalic acid +se-self-sealing-gel=Self-sealing gel +se-holmium-cable=Holmium cable +se-holmium-solenoid=Holmium solenoid +se-quantum-processor=Quantum processor +se-dynamic-emitter=Dynamic emitter +se-naquium-processor=Naquium processor +se-naquium-cube=Naquium cube +se-naquium-tessaract=Naquium tesseract +se-wide-beacon=Wide area beacon +se-wide-beacon-2=Wide area beacon 2 +se-lifesupport-equipment-1=Lifesupport equipment MK1 +se-lifesupport-equipment-2=Lifesupport equipment MK2 +se-lifesupport-equipment-3=Lifesupport equipment MK3 +se-lifesupport-equipment-4=Lifesupport equipment MK4 +se-naquium-heat-pipe=Naquium heat pipe +se-naquium-heat-pipe-horizontal=Naquium heat pipe horizontal +se-naquium-heat-pipe-vertical=Naquium heat pipe vertical +se-naquium-heat-pipe-long=Naquium heat pipe long __1__ +se-deep-space-transport-belt=Deep space transport belt +se-deep-space-transport-belt-black=Black deep space transport belt +se-deep-space-transport-belt-white=White deep space transport belt +se-deep-space-transport-belt-red=Red deep space transport belt +se-deep-space-transport-belt-yellow=Yellow deep space transport belt +se-deep-space-transport-belt-green=Green deep space transport belt +se-deep-space-transport-belt-cyan=Cyan deep space transport belt +se-deep-space-transport-belt-blue=Blue deep space transport belt +se-deep-space-transport-belt-magenta=Magenta deep space transport belt +se-deep-space-underground-belt=Deep space underground belt +se-deep-space-underground-belt-black=Black deep space underground belt +se-deep-space-underground-belt-white=White deep space underground belt +se-deep-space-underground-belt-red=Red deep space underground belt +se-deep-space-underground-belt-yellow=Yellow deep space underground belt +se-deep-space-underground-belt-green=Green deep space underground belt +se-deep-space-underground-belt-cyan=Cyan deep space underground belt +se-deep-space-underground-belt-blue=Blue deep space underground belt +se-deep-space-underground-belt-magenta=Magenta deep space underground belt +se-deep-space-splitter=Deep space splitter +se-deep-space-splitter-black=Black deep space splitter +se-deep-space-splitter-white=White deep space splitter +se-deep-space-splitter-red=Red deep space splitter +se-deep-space-splitter-yellow=Yellow deep space splitter +se-deep-space-splitter-green=Green deep space splitter +se-deep-space-splitter-cyan=Cyan deep space splitter +se-deep-space-splitter-blue=Blue deep space splitter +se-deep-space-splitter-magenta=Magenta deep space splitter +se-blueprint-registration-point=Blueprint registration point +se-delivery-cannon-capsule=Delivery cannon capsule +se-delivery-cannon-capsule-packed=Delivery cannon capsule: __1__ +se-delivery-cannon-targeter=Delivery cannon targeter +se-delivery-cannon-weapon-capsule=Weapon delivery capsule +se-delivery-cannon-weapon-capsule-packed=Weapon delivery capsule: __1__ +se-delivery-cannon-weapon-targeter=Weapon delivery cannon targeter +se-energy-transmitter-targeter=Energy beam targeter +se-arcosphere=Arcosphere +se-arcosphere-a=λ Arcosphere lambda +se-arcosphere-b=ξ Arcosphere xi +se-arcosphere-c=ζ Arcosphere zeta +se-arcosphere-d=θ Arcosphere theta +se-arcosphere-e=ε Arcosphere epsilon +se-arcosphere-f=φ Arcosphere phi +se-arcosphere-g=γ Arcosphere gamma +se-arcosphere-h=ω Arcosphere omega +se-arcosphere-collector=Arcosphere collector +se-star-probe=Star probe +se-belt-probe=Asteroid belt probe +se-void-probe=Interstellar void probe +se-star-probe-data=Star probe data +se-belt-probe-data=Asteroid belt probe data +se-void-probe-data=Interstellar void probe data +se-nano-engineering-data=Nanoengineering data +se-annihilation-data=Annihilation data +se-naquium-structural-data=Naquium structural data +se-hyperlattice-data=Hyperlattice data +se-naquium-energy-data=Naquium energy data +se-space-fold-data=Space folding data +se-space-warp-data=Space warping data +se-space-dialation-data=Space dialation data +se-space-injection-data=Space injection data +se-interstellar-data=Interstellar travel data +se-teleportation-data=Teleportation data +se-wormhole-data=Wormhole data +se-rhga-data=Reality hypergraph analysis data +se-deep-catalogue-1=Deep space catalogue +se-deep-catalogue-2=Broad deep space catalogue +se-deep-catalogue-3=Comprehensive deep space catalogue +se-deep-catalogue-4=Extended deep space catalogue +se-space-probe-rocket=Space probe rocket +se-space-probe-rocket-deployed=Space probe rocket (Deployed) +se-railgun=Railgun +se-railgun-ammo=Railgun ammo + +[item-description] +automation-science-pack=Used by basic science labs for research. +chemical-science-pack=Used by basic science labs for research. +logistic-science-pack=Used by basic science labs for research. +military-science-pack=Used by basic science labs for research. +production-science-pack=Used by basic science labs for research. +satellite=The satellite should be put in a satellite rocket silo or (or Space probe rocket silo). The satellite can discover precise coordinates of bodies in the solar system it is launched, or distant stars. Provides [img=item/se-satellite-telemetry] Satellite telemetry. +se-satellite-telemetry=Logged satellite telemetry needed for Rocket Science. Gained by launching a [img=item/satellite] Navigation Satellite from a satellite rocket silo (or Space probe rocket silo). +se-antimatter-canister=The densest form of energy in a safe to move container. +se-astronomic-science-pack-1=Used by space science labs for research. +se-astronomic-science-pack-2=Used by space science labs for research. +se-astronomic-science-pack-3=Used by space science labs for research. +se-astronomic-science-pack-4=Used by space science labs for research. +se-beryllium-ore=Beryllium ore. +se-biological-science-pack-1=Used by space science labs for research. +se-biological-science-pack-2=Used by space science labs for research. +se-biological-science-pack-3=Used by space science labs for research. +se-biological-science-pack-4=Used by space science labs for research. +se-canister=A multiipurpose containment vessel. +se-cargo-rocket-cargo-pod=A cargo rocket section component. +se-cargo-rocket-fuel-tank=A cargo rocket section component. +se-cargo-rocket-section=The key cargo rocket component. Insert into the cargo rocket silo. 100 are required per rocket. Can be recovered from rocket landings (20% base recoverability). +se-cargo-rocket-section-packed=Cargo rocket sections packed for transit. Must be unpacked to be used in rocket construction. +se-bloater-ammo=Makes an infectious pool of biosludge on the ground. Infected enemies bloat up making movement difficult and doing damage over time. If they die while bloated they burst and their splattering entrails deal damage to nearby enemies, potentially causing a cascade. The total damage of gore projectiles is 50% their max hp. +se-pheromone-ammo=Confuses an enemy biter or spitter, making them think that you are friendly and their kin are the enemy. +se-cryogun=Make a wall of ice that can freeze enemies. +se-deep-space-science-pack=Used by space science labs for research. +se-energy-science-pack-1=Used by space science labs for research. +se-energy-science-pack-2=Used by space science labs for research. +se-energy-science-pack-3=Used by space science labs for research. +se-energy-science-pack-4=Used by space science labs for research. +se-heat-shielding=A composite panel used for high-temperature applications and space structures. +se-holmium-ore=Holmium ore. +se-iridium-ore=Iridium ore. +se-material-science-pack-1=Used by space science labs for research. +se-material-science-pack-2=Used by space science labs for research. +se-material-science-pack-3=Used by space science labs for research. +se-material-science-pack-4=Used by space science labs for research. +se-medpack=Use to heal yourself. +se-medpack-2=Use to heal yourself. +se-medpack-3=Use to heal yourself. +se-medpack-4=Use to heal yourself. +se-meteor-defence=Can defend an entire planet from meteors but can only shoot 1 meteor a time. Must be loaded with meteor defence ammo and fully charged to fire. 80% accuracy. Needs to recharge after firing. Draws 20MW when recharging. +se-meteor-defence-ammo=Destroys meteorites. Must be loaded into a meteor defence installation. +se-meteor-point-defence=Defends an area from meteors. Able to shoot up to 4 meteors per volley. Must be loaded with meteor defence ammo and fully charged to fire. Range 64, 50% accuracy, takes time to recharge after firing. Rotate to change charge mode. +se-meteor-point-defence-container=Destroys meteorites. Must be loaded into a meteor point defence structure. +se-naquium-ore=Naquium ore. Only found in deep space, a treasure of the interstellar void. +se-rocket-launch-pad-silo-dummy-ingredient-item=Made by inserting 100 Cargo rocket sections and 1 Space capsule into a Cargo rocket silo. +se-rtg-equipment=Radioisotope thermoelectric generator. An portable generator that converts the heat from radioactive decay into electricity. Lasts for decades with no additional fuel required. +se-rtg-equipment-2=Radioisotope thermoelectric generator. An improved portable generator that converts the heat from radioactive decay into electricity. Lasts for decades with no additional fuel required. +se-plague-bomb=Can extinguish all life from a planet. Handle with extreme caution. (May drop UPS severely as everything gradually dies, not recommended for large planets or multiplayer.) +se-space-capsule=A control capsule required for Cargo Rockets. Can be used to take passengers back to the closest planet surface. Enter the capsule using __CONTROL__toggle-driving__. +se-space-platform-plating=[font=default-bold][color=#f5cb48]Placement restriction: Space[/color][/font]\nAdvanced plating that allows fast movement over space platform. +se-space-platform-scaffold=[font=default-bold][color=#f5cb48]Placement restriction: Space[/color][/font]\nBasic space platform scaffold that allows you to place certain structures in space. +se-space-rail=Rails that are safe to use in space because they prevent the train from flying off the tracks and destroying everything. No space platform is required, they are fully self-supporting. Can also be used on land for aesthetic reasons. +se-spaceship-floor=This flooring must be under all parts of a spaceship with spaceship walls on the outer edge. Any gaps in the floor will break containment, those sections may detach. +se-superconductive-cable=A superconductive composite cable that does not require active cooling. +se-tesla-gun=Rapid-fire chain-lightning. +se-thruster-suit=A spacesuit that is required to survive in space. \nHas thruster and magboots. +se-thruster-suit-2=A spacesuit that is required to survive in space. \nHas stronger thrusters, increased inventory and larger grid. +se-thruster-suit-3=A spacesuit that is required to survive in space. \nHas stronger thrusters, increased inventory and larger grid. +se-thruster-suit-4=A spacesuit that is required to survive in space. \nHas stronger thrusters, increased inventory and larger grid. +space-science-pack=Used for upgrades of many existing items. +se-rocket-science-pack=Used by space science labs for research. Must be made in space. +utility-science-pack=Used by basic science labs for research. +beacon=8 module slots. Transmits the effects of modules to nearby friendly entities within 3 tiles. Multiple beacons affecting the same entity will overload it and prevent it from operating. +se-wide-beacon=15 module slots. Transmits the effects of modules to nearby friendly entities within 14 tiles. Multiple beacons affecting the same entity will overload it and prevent it from operating. +se-wide-beacon-2=20 module slots. Transmits the effects of modules to nearby friendly entities within 14 tiles. Multiple beacons affecting the same entity will overload it and prevent it from operating. +se-lifesupport-equipment-1=Increases lifesupport efficiency by +100% (additive). If installed in a non-spacesuit efficiency bonus is halved and won't work in space. +se-lifesupport-equipment-2=Increases lifesupport efficiency by +200% (additive). If installed in a non-spacesuit efficiency bonus is halved and won't work in space. +se-lifesupport-equipment-3=Increases lifesupport efficiency by +400% (additive). If installed in a non-spacesuit efficiency bonus is halved and won't work in space. +se-lifesupport-equipment-4=Increases lifesupport efficiency by +800% (additive). If installed in a non-spacesuit efficiency bonus is halved and won't work in space. +se-delivery-cannon=Allows the accurate delivery of contained resources via a delivery cannon. +se-delivery-cannon-weapon=Allows the accurate delivery of special ammunitions via a weapons delivery cannon. +se-arcosphere=Earned from Arcosphere research, redeemed via InformaTron. +se-deep-catalogue-1=Naquium and nanoengineering. +se-deep-catalogue-2=Hyperlattice structures, singularities and annihilation. +se-deep-catalogue-3=Micro space distortion and extradimensional nanoengineering. +se-deep-catalogue-4=Macro space distortion and extradimensional travel. +se-arcosphere-collector=Collects arcospheres from the interstellar void. Must be launched from a space probe rocket silo that is in an asteroid field. Arcospheres are more difficult to find as more are collected. +se-star-probe=Collects data from a star and returns [img=item/se-star-probe-data] Star probe data. Must be launched from a space probe rocket silo that is in close orbit of a star. +se-belt-probe=Collects data from an asteroid belt and returns [img=item/se-belt-probe-data] Asteroid belt probe data. Must be launched from a space probe rocket silo that is in an asteroid belt. +se-void-probe=Collects data from the void and returns [img=item/se-void-probe-data] Interstellar void probe data. Must be launched from a space probe rocket silo that is in an asteroid field. +se-interstellar-data=Made in a Nexus in a moving spaceship. Moving in interstellar space with a larger faster ship generates data much faster. + +[recipe-name] +core-fragment=Core fragment processing (__1__) +rocket-fuel=Solid rocket fuel +se-astrometric-analysis-multispectral-1=Multispectral astrometric analysis 1 +se-astrometric-analysis-multispectral-2=Multispectral astrometric analysis 2 +se-astrometric-analysis-multispectral-3=Multispectral astrometric analysis 3 +se-astronomic-insight-1=Astronomic insight +se-astronomic-insight-2=Broad astronomic insight +se-astronomic-insight-3=Comprehensive astronomic insight +se-astronomic-insight-4=Extended astronomic insight +se-biological-insight-1=Biological insight +se-biological-insight-2=Broad biological insight +se-biological-insight-3=Comprehensive biological insight +se-biological-insight-4=Extended biological insight +se-bio-methane-to-crude-oil=Bio processing methane to crude oil +se-bio-sludge-crude-oil=Biosludge from experimental biomass +se-bio-sludge-decontamination=Biosludge decontamination +se-bio-sludge-from-fish=Biosludge from fish +se-bio-sludge-from-wood=Biosludge from wood +se-bio-sludge-from-vitamelange=Biosludge from vitamelange +se-bio-sludge=Biosludge from Biomass +se-broken-data-scrapping=Broken data card scrapping +se-cargo-rocket-section-pack=Packing cargo rocket sections +se-cargo-rocket-section-unpack=Unpacking cargo rocket sections +se-condenser-turbine-reclaim-water=Power generation with water reclamation. +se-core-fragment-omni=Core fragment processing +se-core-mining=Core mining +se-empty-antimatter-canister=Antimatter stream from canister +se-empty-barrel-scrapping=Empty barrel scrapping +se-empty-barrel-reprocessing=Empty barrel reprocessing +se-space-capsule-scrapping=Space capsule scrapping +se-cargo-pod-scrapping=Cargo pod scrapping +se-energy-insight-1=Energy insight +se-energy-insight-2=Broad energy insight +se-energy-insight-3=Comprehensive energy insight +se-energy-insight-4=Extended energy insight +se-formatting-1=Data formatting +se-formatting-2=Efficient data formatting +se-formatting-3=Advanced data formatting +se-formatting-4=Deep data formatting +se-material-insight-1=Material insight +se-material-insight-2=Broad material insight +se-material-insight-3=Comprehensive material insight +se-material-insight-4=Extended material insight +se-matter-fusion-copper=Matter fusion (Copper) +se-matter-fusion-dirty=Matter fusion (Scrap) +se-matter-fusion-iron=Matter fusion (Iron) +se-matter-fusion-stone=Matter fusion (Stone) +se-matter-fusion-uranium=Matter fusion (Uranium) +se-matter-fusion-to=Matter fusion (__1__) +se-orbital-data=Orbital calculations data +se-plasma-canister-empty=Empty plasma canister +se-pulverised-sand=Pulverised sand +se-radiating-space-coolant-fast=Fast cooling thermofluid to -10°C (Cool) +se-radiating-space-coolant-normal=Cooling thermofluid to -10°C (Cool) +se-radiating-space-coolant-slow=Efficient cooling thermofluid to -10°C (Cool) +se-mixed-methane-gas-separation=Mixed methane gas separation +se-rocket-fuel-from-water-copper=Rocket fuel from water +se-scrap-decontamination=Scrap decontamination +se-scrap-recycling=Scrap recycling +se-space-coolant-cold=Hypercooling thermofluid to -100°C (Cold) +se-space-coolant-supercooled=Hypercooling thermofluid to -273°C (Supercooled) +se-space-coolant-supercooled-cryonite=Cryocooling thermofluid to -273°C (Supercooled) +se-space-coolant-cold-cryonite=Cryocooling thermofluid to -100°C (Cold) +se-space-coolant-supercoole-cryonite=Cryocooling thermofluid to -273°C (Supercooled) +se-simulation-a=Astronomic simulation +se-simulation-ab=Panspermia simulation +se-simulation-abm=Xenoprogression simulation +se-simulation-am=Matter Distribution simulation +se-simulation-as=Astroparticle simulation +se-simulation-asb=Astrobionic simulation +se-simulation-asbm=Universal simulation +se-simulation-asm=Astrophysics simulation +se-simulation-b=Biological simulation +se-simulation-bm=Biomechanical simulation +se-simulation-m=Material simulation +se-simulation-s=Energy simulation +se-simulation-sb=Biochemical simulation +se-simulation-sbm=Nanite simulation +se-simulation-sm=Nanomaterial simulation +se-space-water-decontamination=Cosmic water decontamination +se-spaceship-rocket-engine-burn=Burn liquid rocket fuel +se-specimen-fish=Microgravity fish growth +se-specimen-wood=Microgravity wood growth +se-thermodynamics-coal=Pressure cooking to coal +se-used-lifesupport-canister-cleaning=Lifesupport canister cleaning +se-used-lifesupport-canister-cleaning-space=Lifesupport canister decontamination +space-science-pack=Optimisation science pack +se-rocket-science-pack=Rocket science pack +se-big-turbine-internal=Decompressing high temperature steam +se-arcosphere-fracture=Arcosphere polarisation +se-arcosphere-fold-in=Arcosphere inversion +se-arcosphere-fold-out=Arcosphere inversion +se-arcosphere-folding=Arcosphere folding: __1__ __2__ to __3__ __4__ +se-electric-boiling-void=Evaporation venting +se-space-probe-rocket-deployed=Space probe rocket (Deployed) +se-distortion-drive=Distortion drive +se-generic-scrapping=__1__ scrapping +se-generic-recycling=__1__ recycling + +[recipe-description] +se-astronomic-insight-2=More complicated, but more resource efficient. +se-astronomic-insight-3=More complicated, but more resource efficient. +se-astronomic-insight-4=More complicated, but more resource efficient. +se-biological-insight-2=More complicated, but more resource efficient. +se-biological-insight-3=More complicated, but more resource efficient. +se-biological-insight-4=More complicated, but more resource efficient. +se-core-mining=The actual fragment returned depends on the planet. The real crafting time depends on the number of core miners on the planet or moon. +se-energy-insight-2=More complicated, but more resource efficient. +se-energy-insight-3=More complicated, but more resource efficient. +se-energy-insight-4=More complicated, but more resource efficient. +se-material-insight-2=More complicated, but more resource efficient. +se-material-insight-3=More complicated, but more resource efficient. +se-material-insight-4=More complicated, but more resource efficient. +se-radiating-space-coolant-normal=Repeated cooling and heating of thermofluid causes degradation. +se-radiating-space-coolant-slow=Repeated cooling and heating of thermofluid causes degradation, slower cooling results in reduced loss. +se-radiating-space-coolant-fast=Repeated cooling and heating of thermofluid causes degradation, faster cooling results in increased loss. +se-delivery-cannon-weapon-pack-se-iridium-piledriver=Immense physical damage in a small area, secondary explosive damage in a shockwave. +se-arcosphere-fracture=Arcospheres can be collected with an [img=item/se-arcosphere-collector] Arcosphere collector. +se-distortion-drive=This process must be actively running to activate the Nexus distortion ability and win the game. Uses 8GW when at critical speed. + +[technology-name] +effectivity-module-4=Efficiency module 4 +effectivity-module-5=Efficiency module 5 +effectivity-module-6=Efficiency module 6 +effectivity-module-7=Efficiency module 7 +effectivity-module-8=Efficiency module 8 +effectivity-module-9=Efficiency module 9 +energy-shield-equipment=Energy shield +energy-shield-mk2-equipment=Energy shield MK2 +energy-shield-mk3-equipment=Energy shield MK3 +energy-shield-mk4-equipment=Energy shield MK4 +energy-shield-mk5-equipment=Energy shield MK5 +energy-shield-mk6-equipment=Energy shield MK6 +sand-processing=Sand processing +glass-processing=Glass processing +liquid-rocket-fuel=Liquid rocket fuel +productivity-module-4=Productivity module 4 +productivity-module-5=Productivity module 5 +productivity-module-6=Productivity module 6 +productivity-module-7=Productivity module 7 +productivity-module-8=Productivity module 8 +productivity-module-9=Productivity module 9 +rocket-silo=Satellite rocket silo +rocketry=Combat rocketry +se-adaptive-armour=Adaptive armour +se-antimatter-engine=Antimatter engine +se-antimatter-reactor=Antimatter reactor +se-antimatter-production=Antimatter production +se-astronomic-science-pack=Astronomic science pack +se-biological-science-pack=Biological science pack +se-condenser-turbine=Condenser turbine +se-core-miner=Core mining +se-biogun=Biogun +se-cryogun=Cryogun +se-deep-space-science-pack=Deep space science pack +se-deep-catalogue=Deep space catalogue +se-dimensional-anchor=Dimensional anchor +se-electric-boiler=Electric boiler +se-energy-science-pack=Energy science pack +se-fluid-burner-generator=Fluid isothermic generator +se-fuel-refining=Fuel refining +se-heat-shielding=Heat shielding +se-long-range-star-mapping=Long range star mapping +se-material-science-pack=Material science pack +se-medpack=Medpack +se-medpack-2=Medpack 2 +se-medpack-3=Medpack 3 +se-medpack-4=Medpack 4 +se-meteor-defence=Meteor defence installation +se-meteor-point-defence=Meteor point defence +se-nanomaterial=Nanomaterial +se-plague=The Plague +se-processing-beryllium=Beryllium processing +se-processing-cryonite=Cryonite processing +se-processing-holmium=Holmium processing +se-processing-iridium=Iridium processing +se-processing-naquium=Naquium processing +se-processing-vitamelange=Vitamelange processing +se-processing-vulcanite=Vulcanite processing +se-pulveriser=Pulveriser +se-railgun=Railgun +se-rocket-cargo-safety=Rocket cargo safety +se-rocket-fuel-from-water=Rocket fuel from water +se-rocket-launch-pad=Cargo rocket silo +se-rocket-landing-pad=Rocket landing pad +se-rocket-reusability=Rocket reusability +se-rocket-survivability=Rocket survivability +se-rtg-equipment=Portable RTG +se-rtg-equipment-2=Portable RTG MK2 +se-space-assembling=Space assembling +se-space-accumulator=Holmium accumulator +se-space-accumulator-2=Naquium accumulator +se-space-astrometrics-laboratory=Astrometrics facility +se-space-biochemical-laboratory=Biochemical facility +se-space-catalogue-astronomic=Astronomic catalogue +se-space-catalogue-biological=Biological catalogue +se-space-catalogue-universal=Universal catalogue +se-space-catalogue-energy=Energy catalogue +se-space-catalogue-material=Material catalogue +se-space-data-card=Data card +se-space-decontamination-facility=Decontamination facility +se-space-electromagnetics-laboratory=Electromagnetics facility +se-space-genetics-laboratory=Genetics facility +se-space-gravimetrics-laboratory=Gravimetrics facility +se-space-growth-facility=Growth Facility +se-space-hypercooling=Hypercooling +se-space-laser-laboratory=Laser facility +se-lifesupport-facility=Lifesupport facility +se-space-manufactory=Space manufactory +se-space-material-fabricator=Material fabricator +se-space-matter-fusion=Matter fusion +se-space-mechanical-laboratory=Mechanical facility +se-space-particle-accelerator=Particle accelerator +se-space-particle-collider=Particle collider +se-space-plasma-generator=Plasma generator +se-space-platform-plating=Space platform plating +se-space-platform-scaffold=Space platform scaffold +se-space-radiation-laboratory=Radiation facility +se-space-radiating-efficiency=Thermal radiating efficiency +se-space-radiating-speed=Thermal radiating speed +se-space-radiator=Thermal radiator +se-space-radiator-2=Thermal radiator 2 +se-space-rail=Space Railway +se-recycling-facility=Recycling facility +se-space-science-lab=Space science lab +se-space-simulation-ab=Panspermia simulation +se-space-simulation-am=Astromaterial simulation +se-space-simulation-as=Astroparticle simulation +se-space-simulation-bm=Biomechanical simulation +se-space-simulation-sb=Biochemical simulation +se-space-simulation-sm=Nanomaterial simulation +se-space-simulation-abm=Xenoprogression simulation +se-space-simulation-asb=Astrobionic simulation +se-space-simulation-asm=Astrophysics simulation +se-space-simulation-sbm=Nanite simulation +se-space-simulation-asbm=Universal simulation +se-space-solar-panel=Flat solar panel +se-space-spectrometry-facility=Spectrometry facility +se-space-supercomputer=Supercomputer +se-space-telescope=Telescope +se-space-telescope-gammaray=Gamma ray telescope +se-space-telescope-xray=Xray telescope +se-space-telescope-microwave=Microwave telescope +se-space-telescope-radio=Radio telescope +se-space-thermodynamics-laboratory=Thermodynamics facility +se-spaceship=Spaceship +se-spaceship-integrity=Spaceship Structural integrity +se-factory-spaceship=Factory spaceship +se-superconductive-cable=Superconductive cable +se-teleportation=Teleportation +se-tesla-gun=Tesla gun +se-thruster-suit=Thruster suit +space-science-pack=Optimisation science pack +se-rocket-science-pack=Rocket science pack +speed-module-4=Speed module 4 +speed-module-5=Speed module 5 +speed-module-6=Speed module 6 +speed-module-7=Speed module 7 +speed-module-8=Speed module 8 +speed-module-9=Speed module 9 +se-aeroframe-pole=Aeroframe pole +se-aeroframe-scaffold=Aeroframe scaffold +se-aeroframe-bulkhead=Aeroframe bulkhead +se-lattice-pressure-vessel=Lattice-pressure-vessel +se-heavy-girder=Heavy girder +se-heavy-bearing=Heavy bearing +se-heavy-composite=Heavy composite +se-heavy-assembly=Heavy assembly +se-bioscrubber=Bioscrubber +se-vitalic-epoxy=Vitalic epoxy +se-vitalic-reagent=Vitalic reagent +se-vitalic-acid=Vitalic acid +se-self-sealing-gel=Self-sealing gel +se-holmium-cable=Holmium cable +se-holmium-solenoid=Holmium solenoid +se-quantum-processor=Quantum processor +se-dynamic-emitter=Dynamic emitter +se-naquium-processor=Naquium processor +se-naquium-cube=Naquium cube +se-naquium-tessaract=Naquium tesseract +se-wide-beacon=Wide area beacon +se-wide-beacon-2=Wide area beacon 2 +se-lifesupport-equipment=Lifesupport equipment +se-lifesupport-equipment-1=Lifesupport equipment MK1 +se-lifesupport-equipment-2=Lifesupport equipment MK2 +se-lifesupport-equipment-3=Lifesupport equipment MK3 +se-lifesupport-equipment-4=Lifesupport equipment MK4 +se-supercharger=Supercharger +se-addon-power-pole=Addon power pole +se-pylon=Pylon +se-pylon-substation=Pylon substation +se-pylon-construction=Construction pylon +se-pylon-construction-radar=Radar construction pylon +se-shield-projector=Shield projector +se-deep-space-transport-belt=Deep space transport belts +se-big-turbine=High temperature turbine generator +se-big-heat-exchanger=High temperature heat exchanger +se-zone-discovery-random=Zone discovery +se-zone-discovery-targeted=Targeted zone discovery +se-zone-discovery-deep=Deep space zone discovery +se-delivery-cannon=Delivery cannon +se-delivery-cannon-capsule-iridium=Iridium delivery cannon capsule +se-delivery-cannon-weapon=Weapons delivery cannon +se-spaceship-clamps=Spaceship docking clamps +se-bio-upgrade-constitution=Bio upgrade: Constitution +se-bio-upgrade-strength=Bio upgrade: Strength +se-bio-upgrade-agility=Bio upgrade: Agility +se-bio-upgrade-dexterity=Bio upgrade: Dexterity +se-bio-upgrade-intelligence=Bio upgrade: Intelligence +se-energy-beaming=Energy beaming +se-energy-beam-defence=Umbrella: energy beam defence facility +se-nexus=Nexus +se-spaceship-victory=Spaceship victory +se-arcosphere=Arcosphere collection +se-arcosphere-folding=Arcosphere folding +se-space-probe=Space probe rocket silo +se-linked-container=Arcolink storage +k2-conversion=__1__ conversion + +[technology-description] +energy-shield-equipment=A protective bubble that charges quickly but uses a lot of energy. +energy-shield-mk2-equipment=A protective bubble that charges quickly but uses a lot of energy. +energy-shield-mk3-equipment=A protective bubble that charges quickly but uses a lot of energy. +energy-shield-mk4-equipment=A protective bubble that charges quickly but uses a lot of energy. +energy-shield-mk5-equipment=A protective bubble that charges quickly but uses a lot of energy. +energy-shield-mk6-equipment=A protective bubble that charges quickly but uses a lot of energy. +sand-processing=Crushing, grinding, and filtering raw material into clean sand. +glass-processing=Melting sand into glass. +rocket-silo=Allows you to launch a satellite into orbit to discover new planets. +se-adaptive-armour=Armour that uses energy to self-repair. Fills a similar role to energy shields with lower power requirements but much slower regeneration. +se-antimatter-engine=Annihilating antimatter to produce incredible thrust. +se-antimatter-reactor=Annihilates antimatter with matter to generate extreme heat. +se-antimatter-production=Making antimatter, the densest form of stored energy. +se-astronomic-science-pack=Allows research of technologies relating to space travel and interstellar logistics. +se-biological-science-pack=Allows research of technologies relating to improving your physical capabilities, bioweapons, and neural processing. +se-condenser-turbine=75% the energy efficiency of a steam turbine but 99% of the steam used is returned as water. Temperature range: 100 to 999. +se-core-miner=Allows endless extraction of resources from planets and moons, but has diminishing returns if multiple are used on the same body. +se-biogun=A gun that can use various bio weapons. +se-cryogun=Make a wall of ice that can freeze enemies. +se-deep-catalogue=Space distortion, exotic matter, and nano-engineering data structured ready for analysis and computer simulation. Required for the most advanced technologies. +se-deep-space-science-pack=Required for the most advanced technology +se-dimensional-anchor=Uses a star's gravity well as a stabilizing point for a spatial anomaly. +se-electric-boiler=Creates steam from water using electrical energy. 90% energy efficient. +se-energy-science-pack=Allows research of technologies relating to the fundamental forces, and subatomic discoveries. +se-fluid-burner-generator=Requires liquid fuel with an energy value (such as liquid rocket fuel) to generate electricity. Simple and compact but lacks the energy efficiency of larger steam-based systems. Designed for space. Actual fluid consumption depends on fluid fuel value. +se-fuel-refining=Refines more advanced fuels. +se-heat-shielding=A composite panel used for high-temperature applications and space structures. +se-long-range-star-mapping=Some distance galaxies can be identified by specific patterns of unusual stars. Results are logged to [img=virtual-signal/informatron] InformaTron [__CONTROL__informatron__]. +se-material-science-pack=Allows research of technologies relating to advanced materials for more advanced engineering requirements. +se-medpack=Use the medpack to heal yourself. +se-medpack-2=Use the medpack to heal yourself. +se-medpack-3=Use the medpack to heal yourself. +se-medpack-4=Use the medpack to heal yourself. +se-meteor-defence=Shoot meteors from the sky before they destroy your stuff. A meteor defence installation can protect an entire planet, but can only shoot one meteor at a time. +se-meteor-point-defence=Shoot meteors from the sky before they destroy your stuff. Meteor point defence can protect a small area from up to 4 meteors at a time. +se-nanomaterial=An intricate arrangement of different materials organised at the nano scale to make a composite with superior properties. +se-railgun=Electromagnetically accelerated darts propelled to such a speed that they leave a plasma trail before they vaporise. High damage, slow rate of fire. +se-plague=The great plague that eradicated all life from entire planets. Handle with EXTREME caution. +se-processing-beryllium=Turning beryl into beryllium, an extremely light, strong, corrosion resistant and radiation resistant metal. It also has almost no interaction with xrays. +se-processing-cryonite=Processing frozen cryonite crystals into cryonite rods that have applications in refrigeration, cooling, and lubrication. Cryonite is mainly found on frozen planets. +se-processing-holmium=Turning holminite into holmium, a rare-earth metal with the highest magnetic permeability of any element. +se-processing-iridium=Turning iridite into iridium, the most corrosion-resistant metal and densest element at higher temperatures. Important for heavy duty applications. +se-processing-naquium=Turning the mysterious deep-space naquitite crystal into naquium, a metal-like material with unusual space-time interactions. +se-processing-vitamelange=Turning the primitive vitamelange rock-sponge into a valuable nutrient extract. +se-processing-vulcanite=Turning the volcanic vulcanite crystal into a refined powder used in advanced smelting, rocket fuel, and other high temperature chemical processes. Vulcanite is found on volcanic planets and in most core fragments. +se-pulveriser=Pulverises and crushes harder minerals and planet core fragments. +se-rocket-cargo-safety=Reduces the chance that cargo pods get damaged in transit by 10% (Multiplicative). +se-rocket-fuel-from-water=Generates hydrogen-oxygen rocket fuel via water electrolysis. +se-rocket-landing-pad=Allows you to deliver rocket cargo pods to a named landing pad. With further research it can also recover rocket parts. +se-rocket-launch-pad=Allows you to launch cargo into space or to other planets. +se-rocket-reusability=Increases the percentage of parts that can be recovered from a successful landing pad landing by 4% (Base is 20%, max is 100%). +se-rocket-survivability=Reduces the chance that rockets get damaged in transit or have a navigation failure that results in missing the landing pad by 10% (multiplicative). +se-rtg-equipment=Radioisotope thermoelectric generator. A portable generator that converts the heat from radioactive decay into electricity. Lasts for decades with no additional fuel required. +se-rtg-equipment-2=Radioisotope thermoelectric generator. An improved portable generator that converts the heat from radioactive decay into electricity. Lasts for decades with no additional fuel required. +se-space-assembling=A modified assembling machine that can work in space. +se-space-astrometrics-laboratory=Combines, compares, and quantifies different sources of astronomic information. +se-space-biochemical-laboratory=An advanced chemical lab that specialises in bio-chemistry. Can also perform more basic chemical and oil processing. +se-space-catalogue-astronomic=Astronomic data structured ready for analysis and computer simulation. Required for further astronomic research. +se-space-catalogue-biological=Biological data structured ready for analysis and computer simulation. Required for further biological research. +se-space-catalogue-universal=Combined data for analysis and computer simulation. Required for further deep space research. +se-space-catalogue-energy=Energy data structured ready for analysis and computer simulation. Required for further energy research. +se-space-catalogue-material=Material data structured ready for analysis and computer simulation. Required for further material research. +se-space-data-card=A multi-purpose data storage device. Required for more advanced data-driven research. +se-space-decontamination-facility=Cleans substances for use in sterile environments, and prepares liquids for use in low-pressure conditions. +se-space-electromagnetics-laboratory=Equipment for intense magnetic field and extremely high voltage applications. +se-space-genetics-laboratory=A lab dedicated to genetic sequencing, genetic modification, and genetic printing of cultures. +se-space-gravimetrics-laboratory=Analyses and simulates gravitational disturbances. +se-space-growth-facility=Grows biological specimens under a range of controlled conditions that are impossible elsewhere, such micro-gravity, +se-space-hypercooling=Performs a heat exchange on thermofluid, making one hotter and the other colder. +se-space-laser-laboratory=Experiments with lasers. Eye protection must be worn. +se-lifesupport-facility=Sustaining life in more hostile environments. +se-space-manufactory=A key technology for mass production in space. +se-space-material-fabricator=Synthesises new materials. A cross between a particle collider and 3d printer. +se-space-matter-fusion=Manufacturing materials via fusion. +se-space-mechanical-laboratory=Provides a range of mechanical processes: Crushing, tearing, shearing, vibration, etc. +se-space-particle-accelerator=Accelerates particles near to the speed of light. +se-space-particle-collider=Collides high-speed particles and analyses the results. +se-space-plasma-generator=Generates a variety of plasmas. +se-space-platform-plating=Robust space platform plating. Smooth and fast for spacewalking. +se-space-platform-scaffold=Basic space platform scaffolding. Something to build on but not great for spacewalking. +se-space-radiation-laboratory=A relatively safe place to play with radioactive material. Can be used for uranium processing. +se-space-radiator=Radiates away excess heat from overheated thermofluid. +se-space-radiator-2=Radiates away excess heat from overheated thermofluid. +se-space-radiating=Slower but more resource-efficient cooling of overheated thermofluid. +se-space-rail=Rails that are safe to use in space because they prevent the train from flying off the tracks and destroying everything. Can also be used on land for aesthetic reasons. +se-recycling-facility=Scrapping items and reprocessing scrap into raw materials. +se-space-science-lab=Allows processing of rocket science packs and more advanced space science. +se-space-simulation-ab=More efficient simulation by combining multiple disciplines. +se-space-simulation-am=More efficient simulation by combining multiple disciplines. +se-space-simulation-as=More efficient simulation by combining multiple disciplines. +se-space-simulation-bm=More efficient simulation by combining multiple disciplines. +se-space-simulation-sb=More efficient simulation by combining multiple disciplines. +se-space-simulation-sm=More efficient simulation by combining multiple disciplines. +se-space-simulation-abm=More efficient simulation by combining multiple disciplines. +se-space-simulation-asb=More efficient simulation by combining multiple disciplines. +se-space-simulation-asm=More efficient simulation by combining multiple disciplines. +se-space-simulation-sbm=More efficient simulation by combining multiple disciplines. +se-space-simulation-asbm=More efficient simulation by combining multiple disciplines. +se-space-solar-panel=A high efficiency solar panel that you can walk on. +se-space-spectrometry-facility=Spectrophotometry, gas chromatography, mass spectrometry, and other spectrography. Fire stuff at a wall, make it bend, see where it hits. +se-space-supercomputer=Allows more advanced data manipulation and processing, and simulation. +se-space-telescope=A sophisticated telescope sensitive to multiple wavelengths around the visible spectrum. +se-space-telescope-gammaray=Gamma rays don't refract. This powerful telescope that uses mirrors and special detectors instead. +se-space-telescope-xray=X-rays are blocked by most atmospheres. This powerful telescope is designed for space where atmosphere is not a problem. +se-space-telescope-microwave=A huge telescope that detects microwaves and the cosmic microwave background. +se-space-telescope-radio=A huge telescope that detects very weak radio waves from distance sources. +se-space-thermodynamics-laboratory=Undertakes processes that involve temperature extremes. Can also perform basic thermal processes, such as smelting. +se-spaceship=A vessel you build piece by piece with floor and walls, then use the console to fly it to a different planet, or beyond. +se-spaceship-integrity=Each level increases the spaceship structural integrity stress limit by 100. +se-factory-spaceship=Each level increases the spaceship structural integrity stress limit by 500. +se-superconductive-cable=A superconductive composite cable that does not require active cooling. +se-teleportation=Unlocks other teleportation technology. This technology does nothing on its own but is a gateway to other technologies. +se-tesla-gun=Rapid fire chain lightning. Can hit up to 30 enemies per bolt. Makes long jumps between targets, or short jumps along the ground if there are no targets. +se-thruster-suit=A space suit with thrusters and magboots. Don't go into space without it. +se-thruster-suit-2=An improved space suit with stronger thrusters, increase inventory and larger grid. +se-thruster-suit-3=An improved space suit with stronger thrusters, increase inventory and larger grid. +se-thruster-suit-4=An improved space suit with stronger thrusters, increase inventory and larger grid. +space-science-pack=Allows more direct development of rocket science packs and technologies that benefit from those advancements. +se-aeroframe-pole=A strong light weight beryllium pole commonly used as a support beam for aviation and space exploration. +se-aeroframe-scaffold=A strong light weight beryllium structural frame commonly used as the main internal skeleton for aviation and space exploration vessels. +se-aeroframe-bulkhead=A strong light weight air-tight beryllium wall used as the external skin, or secondary compartment walls, of aviation and space exploration vessels. +se-lattice-pressure-vessel=A strong light weight beryllium pressure vessel with an internal lattice that lets certain fluids compress beyond their normal limits. If ruptured the pressurised fluid is vented safely. +se-heavy-girder=A heavy iridium structural beam mainly used for heavy industry and heavy military vessels. +se-heavy-bearing=A large heavy iridium bearing that can function indefinitely under forces that would crush lesser materials. +se-heavy-composite=A thick almost impenetrable bulkhead that is practically immune to heat, corrosion, radiation, and mechanical force, but is incredibly heavy. +se-heavy-assembly=A heavy mechanical assembly of gears and configurable components that used for heavy industry. +se-bioscrubber=A material processing chamber that utilises biological processes to break down unwanted materials. +se-vitalic-epoxy=An incredibly strong bio-sourced epoxy with regenerative properties. +se-vitalic-reagent=An efficient multi-purpose reagent for a wide range of chemical reactions. +se-vitalic-acid=A strong cocktail of various acids. +se-self-sealing-gel=A viscous gel under pressure, but solid as steel when exposed to a vacuum. Often used as an internal film in bulkheads to passively seal punctures. +se-holmium-cable=A sheathed cable specifically designed to eliminate unwanted noise in the line that can interferes with sensitive electronics. +se-holmium-solenoid=An extremely powerful electromagnet. +se-quantum-processor=Exploits superposition and entanglement to more efficiently work on highly complex problems. +se-dynamic-emitter=A rapidly adjustable light or particle emitter system that can change a number of properties for a greater range or scanning modes or material penetration properties. +se-naquium-cube=Leveraging naquium's unusual interaction with space time to fold a large volume into a small cube. +se-naquium-tessaract=A peculiar object that settles into a cube-like shape but shifts into a range of other geometric shapes if turned or accelerated. +se-naquium-processor=Computation within a naquium tesserect bypasses some of the usual limitations on computation density. +effect-transmission=The beacon transmits the effects of modules to nearby friendly entities within 3 tiles. Has 8 module slots. Multiple beacons affecting the same entity will overload it and prevent it from operating. +se-wide-beacon=The wide area beacon transmits the effects of modules to nearby friendly entities within 14 tiles. Has 15 module slots or 20 when upgraded. Multiple beacons affecting the same entity will overload it and prevent it from operating. +se-wide-beacon-2=The wide area beacon 2 transmits the effects of modules to nearby friendly entities within 14 tiles. Has 20 module slots. Multiple beacons affecting the same entity will overload it and prevent it from operating. +se-lifesupport-equipment-1=Increases lifesupport efficiency by +100% (additive). If installed in a non-spacesuit, efficiency bonus is halved and won't work in space. +se-lifesupport-equipment-2=Increases lifesupport efficiency by +200% (additive). If installed in a non-spacesuit, efficiency bonus is halved and won't work in space. +se-lifesupport-equipment-3=Increases lifesupport efficiency by +400% (additive). If installed in a non-spacesuit, efficiency bonus is halved and won't work in space. +se-lifesupport-equipment-4=Increases lifesupport efficiency by +800% (additive). If installed in a non-spacesuit, efficiency bonus is halved and won't work in space. +se-supercharger=Can charge up to 64 robots at a time at high speed. Structure max power draw is 1GW. +se-pylon=Distributes electrical energy. 64 tile connection range. +se-pylon-substation=Distributes electrical energy. 64 tile connection range, 64x64 power supply area. +se-pylon-construction=Distributes electrical energy and extends construction area. 64 tile connection range, 64x64 construction area. +se-pylon-construction-radar=Distributes electrical energy, extends construction area, and provides radar vision. 64 tile connection range, 256x256 construction & vision area. 4x4 logistic area. +se-shield-projector=Creates a protective force field. More energy is required when the projector is charging or when the shield takes damage. Can block enemy projectiles if the "Combat Mechanics Overhaul" mod is installed. +se-deep-space-transport-belt=Fast long-distance transport belts that can be placed in space. Different colors can be used to easily identify lines from a distance. +se-big-turbine=A large 1GW generator that takes in 5000°C steam, outputs 500°C steam at the other end, and outputs water at the sides. 99% energy efficient, 99% water conservation. +se-big-heat-exchanger=A large heat exchanger designed for high temperatures and high capacity. +se-addon-power-pole=A small electric pole designed to be attached to buildings or for precise control over electrical coverage. +se-zone-discovery-random=Search for planets, moons and asteroid belts using telescopes. +se-zone-discovery-targeted=Search for planets, moons and asteroid belts that have specific resources. Select resources preference in [img=virtual-signal/informatron] InformaTron > Zone discovery. +se-zone-discovery-deep=Search for interesting areas of deep interstellar space. Asteroid fields can have a lot of unique and valuable resources. +se-delivery-cannon=A railgun capable of shooting resources into orbit and beyond, and an armoured chest to catch them. +se-delivery-cannon-capsule-iridium=Although iridium is a heavy metal, the increased durability means less material can be used compared to a standard delivery capsule. The overall weight is the same but it is simpler to manufacture. +se-delivery-cannon-weapon=A large railgun capable of shooting special ammunitions, such as an atomic bomb, to other surfaces. +se-spaceship-clamps=Allows you to place docking clamps so that spaceships can anchor to a specific location by matching up clamp locations. Automation requires "Anchor using" and "Anchor to" signals fed into the console. +se-bio-upgrade-constitution=Increases max health. +se-bio-upgrade-strength=Increases carrying capacity. +se-bio-upgrade-agility=Increases movement speed. +se-bio-upgrade-dexterity=Increases crafting speed. +se-bio-upgrade-intelligence=Increases the learning gained from each science pack. +se-energy-beaming=An intense energy beam that can be used as a weapon from the sky, or to transfer power where it is needed. +se-energy-beam-defence=Defends against space-based energy beams and coronal mass ejections. Works by levitating magnetic particles into a protective bubble, then re-aligns and clumps the particles as needed to diffuse hostile energy beams. +se-nexus=A device that can be activated on a spaceship moving in interstellar space to generate data, and with additional technology it can activate a space distortion field (Spaceship Victory). +se-spaceship-victory=Allows the Nexus to activate a distortion drive to escape the local stellar cluster. Have a Nexus running in Distortion Driver mode on a 3000+ integrity spaceship moving at 250 speed in interstellar space for 60 seconds to win the game. +se-arcosphere=Allows the collection of arcospheres lost in the interstellar void. +se-arcosphere-folding=Allows the use of arcospheres as extradimensional pincers. +se-space-probe=A space-based rocket silo for launching space probes. Can also be used to launch satellites cheaply. +se-linked-container=A container linked by extradimensional space to other containers. The links of the container depend on the surface it is first placed on. + +[modifier-description] +tesla-shooting-speed-bonus=Tesla shooting speed +tesla-damage-bonus=Tesla damage bonus +railgun-damage-bonus=Railgun damage bonus +railgun-shooting-speed-bonus=Railgun shooting speed +cryogun-shooting-speed-bonus=Cryogun shooting speed +cryogun-damage-bonus=Cryogun damage bonus +character-running-speed=Character movement bonus: +__1__ +character-crafting-speed=Character crafting speed: +__1__ + +[virtual-signal-name] +signal-speed=Speed signal +se-signal-speed=Speed signal +signal-distance=Distance signal +se-signal-distance=Distance signal +se-star=Star +se-planet=Planet +se-planet-orbit=Planet orbit +se-moon=Moon +se-moon-orbit=Moon orbit +se-asteroid-belt=Asteroid Belt +se-asteroid-field=Asteroid Field +se-anomaly=Anomaly +se-meteor=Meteor +se-spaceship=Spaceship +se-cargo-rocket=Cargo rocket +se-remote-view=Remote View +se-death=Death +se-character-corpse=Corpse +se-ruin=Ruin +se-accolade=Accolade +se-remove=Remove +se-radius=Radius +se-hierarchy=Hierarchy +se-spaceship-launch=Spaceship launch +se-anchor-using-left-clamp=Anchor using spaceship left clamp +se-anchor-using-right-clamp=Anchor using spaceship right clamp +se-anchor-to-left-clamp=Anchor to target left clamp +se-anchor-to-right-clamp=Anchor to target right clamp +se-beacon-overload=Beacon overload +se-heat=Heat +se-pin=Pin + +[controls] +se-remote-view=Navigation Satellite +se-remote-view-pins=Navigation Satellite Pins +se-remote-view-next=Navigation History Next +se-remote-view-previous=Navigation History Previous +se-universe-explorer=Universe Explorer +se-respawn=Respawn +se-mode-toggle=Toggle structure operation mode +se-pin-one=Go to Pin 1 +se-pin-two=Go to Pin 2 +se-pin-three=Go to Pin 3 +se-pin-four=Go to Pin 4 +se-pin-five=Go to Pin 5 +se-pin-six=Go to Pin 6 +se-pin-seven=Go to Pin 7 +se-pin-eight=Go to Pin 8 +se-pin-nine=Go to Pin 9 +se-pin-zero=Go to Pin 0 +se-pin-set-one=Set Pin 1 +se-pin-set-two=Set Pin 2 +se-pin-set-three=Set Pin 3 +se-pin-set-four=Set Pin 4 +se-pin-set-five=Set Pin 5 +se-pin-set-six=Set Pin 6 +se-pin-set-seven=Set Pin 7 +se-pin-set-eight=Set Pin 8 +se-pin-set-nine=Set Pin 9 +se-pin-set-zero=Set Pin 0 + +[shortcut] +se-remote-view=Navigation Satellite +se-remote-view-pins=Navigation Satellite Pins +se-universe-explorer=Universe Explorer +se-respawn=Respawn +se-pin-one=Go to Pin 1 +se-pin-two=Go to Pin 2 +se-pin-three=Go to Pin 3 +se-pin-four=Go to Pin 4 +se-pin-five=Go to Pin 5 +se-pin-six=Go to Pin 6 +se-pin-seven=Go to Pin 7 +se-pin-eight=Go to Pin 8 +se-pin-nine=Go to Pin 9 +se-pin-zero=Go to Pin 0 +se-pin-set-one=Set Pin 1 +se-pin-set-two=Set Pin 2 +se-pin-set-three=Set Pin 3 +se-pin-set-four=Set Pin 4 +se-pin-set-five=Set Pin 5 +se-pin-set-six=Set Pin 6 +se-pin-set-seven=Set Pin 7 +se-pin-set-eight=Set Pin 8 +se-pin-set-nine=Set Pin 9 +se-pin-set-zero=Set Pin 0 + +[shortcut-name] +se-remote-view=Navigation Satellite [__CONTROL__se-remote-view__] +se-remote-view-pins=Navigation Satellite Pins [__CONTROL__se-remote-view-pins__] +se-universe-explorer=Universe Explorer [__CONTROL__se-universe-explorer__] +se-respawn=Respawn [__CONTROL__se-respawn__] +se-pin-one=Go to Pin 1 [__CONTROL__se-pin-one__] +se-pin-two=Go to Pin 2 [__CONTROL__se-pin-two__] +se-pin-three=Go to Pin 3 [__CONTROL__se-pin-three__] +se-pin-four=Go to Pin 4 [__CONTROL__se-pin-four__] +se-pin-five=Go to Pin 5 [__CONTROL__se-pin-five__] +se-pin-six=Go to Pin 6 [__CONTROL__se-pin-six__] +se-pin-seven=Go to Pin 7 [__CONTROL__se-pin-seven__] +se-pin-eight=Go to Pin 8 [__CONTROL__se-pin-eight__] +se-pin-nine=Go to Pin 9 [__CONTROL__se-pin-nine__] +se-pin-zero=Go to Pin 0 [__CONTROL__se-pin-zero__] +se-pin-set-one=Set Pin 1 [__CONTROL__se-pin-set-one__] +se-pin-set-two=Set Pin 2 [__CONTROL__se-pin-set-two__] +se-pin-set-three=Set Pin 3 [__CONTROL__se-pin-set-three__] +se-pin-set-four=Set Pin 4 [__CONTROL__se-pin-set-four__] +se-pin-set-five=Set Pin 5 [__CONTROL__se-pin-set-five__] +se-pin-set-six=Set Pin 6 [__CONTROL__se-pin-set-six__] +se-pin-set-seven=Set Pin 7 [__CONTROL__se-pin-set-seven__] +se-pin-set-eight=Set Pin 8 [__CONTROL__se-pin-set-eight__] +se-pin-set-nine=Set Pin 9 [__CONTROL__se-pin-set-nine__] +se-pin-set-zero=Set Pin 0 [__CONTROL__se-pin-set-zero__] + +[tile-name] +se-space-platform-plating=Space platform plating +se-space-platform-scaffold=Space platform scaffold +se-space-platform-underlay=Space +se-space-platform-underlay-l=Space +se-space-platform-underlay-r=Space +se-space=Empty space +se-regolith=Regolith +se-asteroid=Asteroid +se-spaceship-floor=Spaceship floor + +[mod-setting-name] +se-meteor-interval=Meteor max interval +se-plague-max-runtime=Plague max runtime +se-planets=Number Of Planets +se-planet-size=Planet Area (1% to 10000%) +se-seed=Planets Generation Seed +se-skip-experimental-warning=Skip experimental warning +se-print-meteor-info=Print meteor alerts to the console +se-print-satellite-discovered-nothing=Alert when satellite discovers nothing +se-space-pipe-capacity=Space pipe capacity +se-electric-boiler=Electric boiler +se-deep-space-belt-speed=Deep space belt speed +se-deep-space-belt-black=Black deep space belts +se-deep-space-belt-white=White deep space belts +se-deep-space-belt-red=Red deep space belts +se-deep-space-belt-yellow=Yellow deep space belts +se-deep-space-belt-green=Green deep space belts +se-deep-space-belt-cyan=Cyan deep space belts +se-deep-space-belt-blue=Blue deep space belts +se-deep-space-belt-magenta=Magenta deep space belts +se-space-science-pack=Space science pack fallback +se-never-show-lifesupport=Never show lifesupport GUI +se-show-zone-preview=Show zone preview window +se-pylon-charge-points=Construction pylon charging points +se-cmes-max-frequency=Coronal Mass Ejection max interval +se-spawn-small-resources=Bonus starting resource patches +se-show-overhead-button-satellite-mode=Show overhead Nav-Sat Uplink button +se-show-overhead-button-interstellar-map=Show overhead Interstellar Map button +se-show-overhead-button-universe-explorer=Show overhead Universe Explorer button +se-show-pin-help-tooltip=Show help tooltip on pin buttons +se-scan-search-budget=Scan search budget +se-scan-chart-budget=Scan chart budget +se-scan-alert-interval=Scan alert interval +se-supercharger-individual-charge-rate=Supercharger individual port charge rate (MW) + +[mod-setting-description] +se-meteor-interval=The base interval in minutes between meteor strikes. After each strike, the next strike is set to occur a random number of minutes between 1 and this value. +se-plague-max-runtime=The max runtime for the bio weapon, in minutes. After a plague has been running for this amount of time, all plague particles, trees, and enemies are destroyed. +se-planets=Do not change part-way through a campaign. +se-planet-size=Do not change part-way through a campaign. +se-seed=Do not change part-way through a campaign. +se-skip-experimental-warning=The warning on starting a new game will not appear and you will not get updated warnings if the message changes. +se-print-meteor-info=Allows you to see meteor alerts in the console after the main alert has faded by pressing the __CONTROL__toggle-console__ key. +se-print-satellite-discovered-nothing=When a satellite is launched you get an alert telling you what was discovered. This setting can disable the alert if nothing was discovered. +se-space-pipe-capacity=The fluid capacity for space pipes. +se-electric-boiler=Adds an electric boiler to the game. +se-deep-space-belt-speed=Deep space belts are supposed to be the fastest belts. If you have other mods that add faster belts, you can increase the deep space belt speed to match or exceed. +se-deep-space-belt-black=Black transport belt, splitter, and underground recipes can be disabled to reduce UI clutter. +se-deep-space-belt-white=White transport belt, splitter, and underground recipes can be disabled to reduce UI clutter. +se-deep-space-belt-red=Red transport belt, splitter, and underground recipes can be disabled to reduce UI clutter. +se-deep-space-belt-yellow=Yellow transport belt, splitter, and underground recipes can be disabled to reduce UI clutter. +se-deep-space-belt-green=Green transport belt, splitter, and underground recipes can be disabled to reduce UI clutter. +se-deep-space-belt-cyan=Cyan transport belt, splitter, and underground recipes can be disabled to reduce UI clutter. +se-deep-space-belt-blue=Blue transport belt, splitter, and underground recipes can be disabled to reduce UI clutter. +se-deep-space-belt-magenta=Magenta transport belt, splitter, and underground recipes can be disabled to reduce UI clutter. +se-space-science-pack=If another mod adds a way to get space science, then that method will be used. If there is no way to make it, then Space Exploration can either remove it or use it as an Optimisation science pack. +se-never-show-lifesupport=If checked, the lifesupport GUI will never be shown, even if you are suffocating. +se-show-zone-preview=Uncheck to disable the zone preview window in the Universe Explorer. If you have some of Factorio's debug overlays active, the preview window can reduce FPS. +se-pylon-charge-points=Uncheck to remove construction pylon charge points. This helps control bot charging behaviour, but you may need to add other charging options along long distance routes. +se-cmes-max-frequency=The max interval for repeating Coronal Mass Ejections (CMEs). The value is in hours, 0 = disabled. The first CME is scripted to the first minute of the game and is mostly harmless. The second is delayed by roughly 48 hours. The delay between repeats is between 50% and 100% of the max interval setting. A non-zero setting only applies to new events; once an ETA has been set, it won't be affected. A zero setting will clear all scheduled CMEs, though it may take up to a minute for the change to take effect. +se-spawn-small-resources=Adds some additional small resources patches to the starting area. The resource patches are in a cluster to reduce time running between resources. +se-show-overhead-button-satellite-mode=Show a small button on the top left of the screen for to toggle the Navigation Satellite Uplink. +se-show-overhead-button-interstellar-map=Show a small button on the top left of the screen for to toggle the Interstellar Map. +se-show-overhead-button-universe-explorer=Show a small button on the top left of the screen for to toggle the Universe Explorer. +se-show-pin-help-tooltip=Show an expanded tooltip on the pin buttons that gives instructions on how to use them. +se-scan-search-budget=Satellite scanning: The number of chunks that can be checked for chart status. High values let it speed though already scanned chunks to get to the uncharted edge. +se-scan-chart-budget=Satellite scanning: The number of chunk requests that can be added to the charting buffer in parallel. New chart requests won't be made if the previous chunks have not finished. +se-scan-alert-interval=The interval in seconds between surface scan update alerts. Revealing surfaces increases game save file size so it is best not to leave one on and forget it. +se-supercharger-individual-charge-rate=Sets the charging rate of each individual charging port in the supercharger, in MW (does not affect maximum charge rate). Minimum (default) value is 90 MW, enough to charge a vanilla robot in one tick, up to 1000 MW, or 1 GW, the maximum charge rate of the supercharger. + +[string-mod-setting] +se-space-science-pack-Remove=Remove completely +se-space-science-pack-Replace=Replace with Rocket science pack +se-space-science-pack-OptimisationUranium=Optimisation: Uranium-cryo recipe +se-space-science-pack-OptimisationFish=Optimisation: Vita-vulca-fish recipe + +[autoplace-control-names] +planet-size=[img=virtual-signal/se-planet] Planet size +se-water-ice=[img=item/se-water-ice] Water ice (space only) +se-methane-ice=[img=item/se-methane-ice] Methane ice (space only) +se-cryonite=[img=item/se-cryonite] Cryonite (not on homeworlds) +se-vulcanite=[img=item/se-vulcanite] Vulcanite (not on homeworlds) +se-vitamelange=[img=item/se-vitamelange] Vitamelange (not on homeworlds) +se-beryllium-ore=[img=item/se-beryllium-ore] Beryllium Ore (not on homeworlds) +se-holmium-ore=[img=item/se-holmium-ore] Holmium Ore (not on homeworlds) +se-iridium-ore=[img=item/se-iridium-ore] Iridium Ore (not on homeworlds) +se-naquium-ore=[img=item/se-naquium-ore] Naquium Ore (space only) + +[map-gen-preset-name] +space-exploration=Space Exploration Defaults + +[map-gen-preset-description] +space-exploration=Defaults for Space Exploration + +[tooltip-category] +shot=Usage diff --git a/space-exploration_0.5.58/space-exploration/locale/es-ES/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/es-ES/strings.cfg new file mode 100644 index 0000000..7d8f0dd --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/es-ES/strings.cfg @@ -0,0 +1,964 @@ +spaceship-integrity100=+100 Integridad Estructural de Nave +spaceship-integrity300=+300 Integridad Estructural de Nave +spaceship-integrity500=+500 Integridad Estructural de Nave +core-mining-productivity-5=+5% Productividad a Minería de Núcleo + +[space-exploration] +rename-something=Renombrar__1__ +trigger-none=Ninguno (Manual) +trigger-fuel-full=Lanzamiento con Carburante Lleno +trigger-cargo-full=Lanzamiento con Carga Completa +trigger-fuel-full-signal=Lanzamiento con Señal Verde y Carburante Lleno +trigger-cargo-full-signal=Lanzamiento con Señal Verde y Carga Completa +trigger-cargo-full-or-signal=Lanzamiento con Señal Verde o con Carga Completa +destination-type-zone=Posición aproximada +destination-type-landing-pad=Plataforma de aterrizaje de carga +button-launch=Lanzamiento +button-launch-disabled=Lanzamiento (deshabilitado) +destination-crash-warning=Atención: Selecciona una Plataforma de Aterrizaje de Carga pra reducir la posibilidad de estrellarse +recipe-to=__1__ a __2__ +recipe-from=__1__ de __2__ +remote-view=Enlace a Satélite de Navegación [__CONTROL__se-remote-view__] +remote-view-instruction=Lanza más satélites para descubrir más estrellas, planetas, lunas, y otras zonas. +exit-remote-view=Salir de Enlace a Satélite de Navegación [__CONTROL__se-remote-view__] +remote-view-requires-satellite=Debes lanzar un satélite para usar el enlace a satélite de navegación. +satellite-launched=Satélite desplegado y escaneando objetos astronómicos. Usa [img=virtual-signal/se-remote-view] Enlace a Satélite de Navegación para observar (pulsa [color=green]Enlace a Satélite de Navegación [__CONTROL__se-remote-view__][/color] o usa la barra de accesos rápidos). +satellite-discovered-platform=[color=cyan]El Satélite ha descubierto alguna plataforma espacial en órbita.[/color] +source-discovered-zone=[color=cyan]__1__ ha descubierto un/a nuevo/a __2__: [/color][img=__3__] [color=white]__4__[/color] +discovered-zone=[color=cyan]Descubierto/a un/a nuevo/a __1__: [img=__2__] [/color][color=white]__3__[/color] +space-capsule=Cápsula Espacial +player-died=__1__ ha muerto +launch-suit-warning=Para evitar la asfixia, por favor considera ponerte tu traje propulsor. +suffocating-warning=Te estás asfixiando. Entra en una cápsula espacial o ponte un traje espacial. +rocket_survivability_fail=Un cohete de carga ha sufrido daños en tránsito y se ha desviado de su trayectoria. Se recomienda investigación adicional de supervivencia de cohetes y de seguridad de la carga. +respawn-if-stranded=Si no hay salida, puedes usar el atajo de Reaparecer [__CONTROL__se-respawn__]. +filter-list=Buscar +clear-filter=Borrar búsqueda +zone-tooltip=__1__ __2__ __3__ __4__ __5__ __6__ __7__ +zone-tooltip-type=\nTipo: __1__ +zone-tooltip-resources=\nRecurso primario: __1__ +zone-tooltip-lifesigns=\nSignos de vida: __1__ +zone-tooltip-daynight=\nCiclo día/noche: __1__ minutos +zone-tooltip-bot-attrition=\nInterferencia para robots: __1__ +construction-denied=No puede colocarse aquí. +construction-denied-vehicle-in-space=No pueden ponerse verhículos de tierra en el espacio. +construction-denied-se-surface=Posición no válida; debe ponerse en una superficie de Exploración Espacial +currently-viewing=Viendo ahora: __1__ +no-character-to-board=No puedes embarcar en esa nave; debes estar enlazado a tu personaje para usar esta acción. +starmap=Mapa estelar (en desarrollo) +back=Volver +spaceship=Astronave +plant=Planeta +moon=Luna +star=Estrella +orbit=Órbita +something_orbit=Órbita de __1__ +asteroid-belt=Cinturón de asteroides +asteroid-field=Campo de asteroides +anomaly=Anomalía +spaceship-cannot-set-destination-to-self=No se puede asignar como destino a sí mismo +spaceship-launch-energy=Energía de lanzamiento: __1__ +spaceship-launch-energy-invalid=Energía de lanzamiento: Requiere comprobación de integridad válida. +spaceship-speed=Velocidad: __1__ +spaceship-structural-stress-hull=Estrés estructural (Casco): __1__ +spaceship-structural-stress-hull-invalid=Estrés estructural (Casco): N/D (se requiere contención) +spaceship-structural-stress-container=Estrés estructural (Contenedores): __1__ +spaceship-structural-stress-container-invalid=Estrés estructural (Contenedores: N/D (se requiere contención) +spaceship-travel-time-unknown=Tiempo de viaje: Desconocido. Comprueba máxima velocidad para estimación. +spaceship-travel-time-max=Tiempo de viaje: __1__s a máxima velocidad. +spaceship-travel-time-current=Tiempo de viaje: __1__s a la velocidad actual. +spaceship-closest-location=Emplazamiento más cercano: __1__ +spaceship-location-spatial-distortion=Distorsión espacial: __1__ +spaceship-location-stellar-x=Cuadrante X: __1__ +spaceship-location-stellar-y=Cuadrante Y: __1__ +spaceship-location-star-gravity-well=Campo gravitatorio de estrella: __1__ +spaceship-location-planet-gravity-well=Campo gravitatorio de planeta: __1__ +spaceship-travel-status=Estado del viaje: __1__ +spaceship-integrity-status-valid=Estado de integridad: Válido: __1__ +spaceship-integrity-status-invalid=Estado de integridad: Inválido: __1__ +spaceship-button-launch=Lanzamiento +spaceship-button-launch-tooltip=Listo para lanzamiento +spaceship-button-launch-disabled=Lanzamiento (deshabilitado) +spaceship-button-launch-disabled-fuel-tooltip=Requiere combustible en los tanques +spaceship-button-launch-disabled-integrity-tooltip=Requiere comprobación válida de integridad +spaceship-button-anchor=Anclaje +spaceship-button-confirm-anchor=Confirma anclaje +spaceship-button-anchor-to=Anclar a __1__ +spaceship-button-anchor-on=Anclar en __1__ +spaceship-button-stop=Parar +spaceship-button-start=Acoplar +spaceship-button-board=Embarque en __1__ +spaceship-button-scouting-back=Volver +spaceship-button-scouting-back-tooltip=Cancelar exploración de anclaje +spaceship-name-the=__1__ +spaceship-button-start-integrity-check=Comenzar comprobación de integridad +spaceship-heading-destination=Destino +list-destinations-alphabetically=Lista alfabética de destinos +spaceship-travel-message-new-course-plotted=Nuevo curso fijado. +spaceship-travel-message-exiting-planet-gravity=Saliendo del campo gravitatorio del planeta +spaceship-travel-message-navigating-planet-gravity=Navegando en el campo gravitatorio del planeta +spaceship-travel-message-exiting-star-gravity=Saliendo del campo gravitatorio de la estrella +spaceship-travel-message-navigating-star-gravity=Navegando en el campo gravitatorio de la estrella +spaceship-travel-message-spatial-distortions=Navegando por las distorsiones espaciales +spaceship-travel-message-navigating-interstellar=Navegando por espacio interestelar +spaceship-travel-message-at-destination=En destino +spaceship-check-message-passed=Pasado: Integridad válida de nave +spaceship-check-message-failed-containment=Fallado: Pérdida de contención alrededor de la consola. Asegúrate de que toda pared del fuselaje está sobre suelo de astronave sin fisuras. +spaceship-check-message-failed-console-floor=La consola debe situarse sobre suelo de astronave. +spaceship-check-message-failed-empty=No se encuentran casillas conectadas a una consola encerrada apropiadamente. +spaceship-check-message-failed-unknown-bounds=Error: límites de astronave desconocidos. +spaceship-check-message-failed-stress=Fallo: El estrés de integridad destructural excede el límite de la tecnología. +spaceship-check-message-checking-console-floor=Comprobando conectividad desuelo de consola. +spaceship-check-message-checking-containment=Comprobando contención. +spaceship-check-message-checking-connectivity=Comprobando conectividad de consola. +spaceship-check-message-no-console=No hay consola. +spaceship-check-message-did-not-complete=La comprobación no se completó. +spaceship-check-message-unstable=Inestable: Algunas secciones se desengancharían al maniobrar. +spaceship-check-message-valid-but-disconnecting=Válida pero inestable: algunas secciones se desengancharían. +spaceship-warning-sections-disconnecting=Se están desenganchando secciones: Para para reparar. + +[damage-type-name] +suffocation=Asfixia +meteor=Meteorito + +[entity-name] +destroyed-cargo-pod=Módulo de carga destruido +meteorite=Meteorito +rocket-silo=Silo de Cohetes de Satélite +rocket-fragment=Fragmento de cohete +se-antimatter-reactor=Reactor Antimateria +se-cargo-rocket-cargo-pod=Módulo de carga +se-condenser-turbine=Turbina condensadora +se-condenser-turbine-tank=Tanque de turbina condensadora +se-condenser-turbine-generator=Generador de Tubina condensadora +se-core-fragment-processor=Procesador de Fragmentos de núcleo +se-core-miner=Perforadora de núcleo +se-core-miner-drill=Perforadora de núcleo +se-electric-boiler=Caldera eléctrica +se-fluid-burner-generator=Generador por fluído isotérmico +se-fuel-refinery=Refinería de combustible +se-meteor-defence-container=Contenedor para Defensa Anti-Meteoritos +se-meteor-defence-charger=Cargador para Defensa Anti-Meteoritos +se-meteor-point-defence-container=Contenedor para Defensa puntual Anti-Meteoritos +se-meteor-point-defence-charger=Cargador para Defensa puntual Anti-Meteoritos +se-methane-ice=Hielo de metano +se-rocket-launch-pad=Plataforma de lanzamiento de cohetes +se-rocket-launch-pad-tank=Depósito de plataforma de lanzamiento +se-rocket-launch-pad-silo=Silo de plataforma de lanzamiento +se-rocket-launch-pad-combinator=Combinador de plataforma de lanzamiento +se-rocket-launch-pad-_-seat=Asiento de plataforma de lanzamiento +se-rocket-launch-pad-settings=Ajustes de plataforma de lanzamiento +se-rocket-landing-pad=Plataforma de Aterrizaje +se-space-accumulator=Acumulador espacial +se-space-astrometrics-laboratory=Laboratorio de astrometría +se-space-biochemical-laboratory=Laboratorio de bioquímica +se-space-assembling-machine=Ensamblador espacial +se-space-capsule-_-vehicle=Cápsula espacial +se-space-curved-rail=Vía espacial +se-space-decontamination-facility=Instalación de descontaminación +se-space-electromagnetics-laboratory=Laboratorio de electromagnetismo +se-space-genetics-laboratory=Laboratorio de genética +se-space-growth-facility=Instalación de cultivo +se-space-gravimetrics-laboratory=Laboratorio de gravimetría +se-space-hypercooler=Hiperenfriador +se-space-laser-laboratory=Laboratorio de laser +se-space-lifesupport-facility=Instalación de soporte vital +se-space-manufactory=Fábrica espacial +se-space-material-fabricator=Fábrica de material +se-space-mechanical-laboratory=Laboratorio mecánico +se-space-particle-accelerator=Acelerador de partículas +se-space-particle-collider=Colisionador de partículas +se-space-plasma-generator=Generador de plasma +se-space-radiation-laboratory=Laboratorio de radiación +se-space-radiator=Radiador térmico +se-space-recycling-facility=Instalación de reciclaje +se-space-pipe=Tubería espacial +se-space-pipe-to-ground=Tubería subterránea espacial +se-space-science-lab=Laboratorio espacial de ciencia +se-space-solar-panel=Panel solar espacial +se-space-solar-panel-2=Panel solar espacial avanzado +se-space-spectrometry-facility=Instalación de espectrometría +se-space-straight-rail=Vía espacial +se-space-supercomputer-1=Superordenador +se-space-supercomputer-2=Superordenador cuántico +se-space-supercomputer-3=Superordenador neuronal +se-space-telescope-radio=Radiotelescopio +se-space-telescope-microwave=Telescopio de microondas +se-space-telescope=Telescopio +se-space-telescope-xray=Telescopio de Rayos-X +se-space-telescope-gammaray=Telescopio de Rayos Gamma +se-space-thermodynamics-laboratory=Laboratorio de termodinámica +se-space-splitter=Divisor espacial +se-space-transport-belt=Cinta transportadora espacial +se-space-underground-belt=Cinta transportadora subterránea espacial +se-spaceship-antimatter-engine=Impulsor de antimateria +se-spaceship-antimatter-booster-tank=Depósito de antimateria para astronave +se-spaceship-console=Consola de astronave +se-spaceship-gate=Puerta de astronave +se-spaceship-obstacle=Basura espacial +se-spaceship-rocket-engine=Impulsor de astronave +se-spaceship-rocket-booster-tank=Depósito para impulsores +se-spaceship-wall=Fuselaje de astronave +se-water-ice=Hielo de agua +small-asteroid=Asteroide pequeño + +[entity-description] +rocket-silo=Lanza un satélite al espacio para explorar, y tal vez descubras nuevos planetas, y ganes una pequeña cantidad de ciencia de cohetes. +se-antimatter-reactor=Aniquila antimateria con materia para producir calor extremo. +se-condenser-turbine=75% de la eficacia de una turbina de vapor estándar, pero el 99% del vapor se devuelve como agua. +se-core-fragment-processor=Extrae recursos a partir de fragmentos de núcleo. +se-core-miner=Permite la extracción sin fin de recursos de los planetas y las lunas, pero reduce el rendimiento si se usan varios en el mismo cuerpo celeste. Consume 50MW. +se-core-miner-drill=Permite la extracción sin fin de recursos de los planetas y las lunas, pero reduce el rendimiento si se usan varios en el mismo cuerpo celeste. Consume 50MW. +se-electric-boiler=Crea vapor a partir de agua, usando energía eléctrica. +se-fluid-burner-generator=Requiere combustible líquido con valor energético (como combustible líquido para cohete) para generar electricidad. Simple y compacto, pero carece de la eficiencia energética de sistemas más grandes basados en vapor. Diseñado para el espacio. +se-meteor-defence-container=Puede defender un planeta entero de los meteoritos, pero solo puede disparar a 1 meteorito a la vez. Debe cargarse con munición de defensa contra meteoritos y estar completamente cargado para disparar. 80% de precisión, toma tiempo para recargar después de disparar. Consume 20 MW mientras recarga. +se-meteor-defence-charger=Puede defender un planeta entero de los meteoritos, pero solo puede disparar a 1 meteorito a la vez. Debe cargarse con munición de defensa contra meteoritos y estar completamente cargado para disparar. 80% de precisión, toma tiempo para recargar después de disparar. Consume 20 MW mientras recarga. +se-meteor-point-defence-container=Defiende un área contra los meteoritos. Capaz de disparar contra 4 meteoritos por volea. Debe cargarse con munición para punto de defensa contra meteoritos y estar completamente cargado para disparar. Alcance 64, precisión 50%, toma tiempo para recargarse después del disparo. +se-meteor-point-defence-charger=Defiende un área contra los meteoritos. Capaz de disparar contra 4 meteoritos por volea. Debe cargarse con munición para punto de defensa contra meteoritos y estar completamente cargado para disparar. Alcance 64, precisión 50%, toma tiempo para recargarse después del disparo. +se-rocket-launch-pad=Envía su inventario al espacio. Puede llevar pasajeros; para entrar, pulsa __CONTROL__toggle-driving__ cerca de la puerta principal. +se-rocket-landing-pad=Zona de aterrizaje para cohetes. +se-space-assembling-machine=Una máquina de ensamblaje modificada que puede operar en el espacio. +se-space-astrometrics-laboratory=Combina, compara y cuantifica diferentes fuentes de información astronómica. +se-space-biochemical-laboratory=Un laboratorio químico avanzado especializado en bioquímica. También se puede realizar más química básica y procesamiento de petróleo. +se-space-capsule-_-vehicle=Se puede usar para llevar pasajeros de vuelta al planeta más cercano. Entra en la cápsula con la tecla __CONTROL__toggle-driving__. +se-space-decontamination-facility=Limpia sustancias para su uso en ambientes estériles y prepara líquidos para su uso en condiciones de baja presión. +se-space-electromagnetics-laboratory=Equipamiento para aplicaciones de campo magnético intenso y voltaje extremadamente alto. +se-space-genetics-laboratory=Un laboratorio dedicado a la secuenciación de genes, la modificación genética, y la impresión de cultivos genéticos. +se-space-gravimetrics-laboratory=Analiza y simula perturbaciones gravitatorias. +se-space-growth-facility=Cultiva muestras biológicas en una gama de condiciones controladas que son imposibles en otros lugares, tales como micro-gravedad. +se-space-hypercooler=Realiza intercambio de calor en el refrigerante, haciendo una parte más caliente y la otra más fría. +se-space-laser-laboratory=Experimentos con lasers. Protección ocular requerida. +se-space-lifesupport-facility=Soporte vital en los ambientes más hostiles. +se-space-manufactory=Una gigantesca máquina de ensamblaje, pero puede elaborar recetas más complejas. Sólo funciona en el espacio (o en una astronave). +se-space-material-fabricator=Sintetiza nuevos materiales. Un cruce entre un colisionador de partículas y una impresora 3D. +se-space-mechanical-laboratory=Ofrece una gama de procesos mecánicos: trituración, desgarro, cizallamiento, vibración, etc. +se-space-particle-accelerator=Acelera partículas hasta casi la velocidad de la luz. +se-space-particle-collider=Colisiona partículas a alta velocidad y analiza los resultados. +se-space-pipe=Puedes caminar por encima. +se-space-pipe-to-ground=Cara y de alcance limitado, para usarse sólo cuando sea necesario. Se puede caminar sobre las tuberías espaciales. +se-space-plasma-generator=Genera una variedad de plasmas. +se-space-radiation-laboratory=Un lugar relativamente seguro para manipular materiales radiactivos. Puede usarse para el procesamiento de uranio. +se-space-radiator=Irradia el exceso de calor extraído del refrigerante sobrecalentado. +se-space-recycling-facility=Recicla chatarra y otros subproductos para obtener recursos. +se-space-solar-panel=Un panel solar de alto rendimiento para el espacio. +se-space-solar-panel-2=Un panel solar avanzado de muy alto rendimiento para el espacio. +se-space-spectrometry-facility=Espectrofotometría, cromatografía de gases, espectrometría de masas, y otras espectrografías. Dispara cosas contra un muro, lo curva, y observa donde impactan. +se-space-supercomputer-1=Manipulación, procesamiento y simulación de datos. +se-space-supercomputer-2=Computación cuántica. Mejora la manipulación, procesamiento y simulación de datos. +se-space-supercomputer-3=Red neuronal adaptativa en un sistema de computación cuántica. Mejora la manipulación, procesamiento y simulación de datos. +se-space-straight-rail=Diseñada para el espacio, pero también puede usarse en tierra. +se-space-science-lab=Puede usar paquetes de ciencia espacial. Debe emplearse en el espacio. +se-space-telescope=Un sofisticado telescopio sensible a múltiples longitudes de onda en el espectro visible. +se-space-telescope-gammaray=Los rayos gamma no refractan. Este potente telescopio usa detectores especiales en lugar de espejos. +se-space-telescope-xray=Los rayos X son bloqueados por la mayoría de atmósferas. Este potente telescopio está diseñado para el espacio, donde la atmósfera no es un problema. +se-space-telescope-microwave=Un enorme telescopio que detecta microondas y radiación de fondo. +se-space-telescope-radio=Un enorme telescopio que detecta señales de radio muy débiles de origen lejano. +se-space-thermodynamics-laboratory=Realiza procesos que involucran temperaturas extremas. También puede realizar procesos térmicos básicos, como la fundición. +se-space-transport-belt=Impide que las cosas se alejen flotando. +se-spaceship-antimatter-engine=Aniquila un flujo de antimateria. Cuenta como muro de contención espacial. +se-spaceship-antimatter-booster-tank=Contiene antimateria. Se requiere para el lanzamiento de la nave espacial. +se-spaceship-console=Se usa para mover una nave espacial entre planetas, lunas, órbitas y campos de asteroides. Debe situarse en suelo de nave espacial, contenida dentro de paredes y puertas de nave espacial, sin huecos. La verificación de integridad muestra los posibles problemas. +se-spaceship-gate=Un campo de fuerza impide la descompresión cuando se abre la puerta. Cuenta como muro de contención espacial. +se-spaceship-rocket-engine=Quema combustible líquido para cohetes. Cuenta como muro de contención espacial. +se-spaceship-rocket-booster-tank=Contenedor de combustible líquido para cohetes. Se requiere para el lanzamiento de la nave espacial. +se-spaceship-wall=Debe colocarse en suelo de nave espacial para ser considerada parte de una astronave. Cuenta como muro de contención de la nave espacial; los huecos en diagonal rompen la contención. + +[equipment-name] +energy-shield-equipment=Escudo de energía +energy-shield-mk2-equipment=Escudo de energía MK2 +energy-shield-mk3-equipment=Escudo de energía MK3 +energy-shield-mk4-equipment=Escudo de energía MK4 +energy-shield-mk5-equipment=Escudo de energía MK5 +energy-shield-mk6-equipment=Escudo de energía MK6 +se-adaptive-armour-equipment-1=Armadura adaptativa MK1 +se-adaptive-armour-equipment-2=Armadura adaptativa MK2 +se-adaptive-armour-equipment-3=Armadura adaptativa MK3 +se-adaptive-armour-equipment-4=Armadura adaptativa MK4 +se-adaptive-armour-equipment-5=Armadura adaptativa MK5 +se-rtg-equipment=Reactor portátil de fusión +se-rtg-equipment-2=Reactor portátil de fusión MK2 + +[equipment-description] +energy-shield-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +energy-shield-mk2-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +energy-shield-mk3-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +energy-shield-mk4-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +energy-shield-mk5-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +energy-shield-mk6-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +se-adaptive-armour-equipment-1=Armadura que utiliza energía para autorepararse de forma automática. La protección se incrementa lentamente con el tiempo. +se-adaptive-armour-equipment-2=Armadura que utiliza energía para autorepararse de forma automática. La protección se incrementa lentamente con el tiempo. +se-adaptive-armour-equipment-3=Armadura que utiliza energía para autorepararse de forma automática. La protección se incrementa lentamente con el tiempo. +se-adaptive-armour-equipment-4=Armadura que utiliza energía para autorepararse de forma automática. La protección se incrementa lentamente con el tiempo. +se-adaptive-armour-equipment-5=Armadura que utiliza energía para autorepararse de forma automática. La protección se incrementa lentamente con el tiempo. +se-rtg-equipment=Generador termoeléctrico por radioisótopos. Un generador portátil que convierte en electricidad el calor de la radiactividad. Tiene una duración de décadas sin ningún combustible adicional requerido. +se-rtg-equipment-2=Generador termoeléctrico por radioisótopos. Una versión mejorada del generador portátil que convierte en electricidad el calor de la radiactividad. Tiene una duración de décadas sin ningún combustible adicional requerido. + +[fluid-name] +se-antimatter-stream=Flujo de antimateria +se-bio-sludge=Biolodos +se-contaminated-bio-sludge=Biolodos contaminados +se-contaminated-space-water=Agua cósmica contaminada +se-chemical-gel=Gel químico +se-decompressing-steam=Condensación del vapor +se-liquid-rocket-fuel=Combustible líquido para cohetes +se-methane-gas=Gas metano +se-methane-gas-mixed=Gas metano mezclado +se-nutrient-gel=Gel nutritivo +se-neural-gel=Gel neural +se-neural-gel-2=Gel neural avanzado +se-ion-stream=Flujo de iones +se-plasma-stream=Flujo de plasma +se-particle-stream=Flujo de partículas +se-proton-stream=Flujo de protones +se-space-coolant=Refrigerante +se-space-coolant-hot=Refrigerante a 25ºC +se-space-coolant-warm=Refrigerante a -10ºC +se-space-coolant-cold=Refrigerante a -100ºC +se-space-coolant-supercooled=Refrigerante superenfriado a -273ºC +se-space-water=Agua cósmica + +[fluid-description] +se-space-water=Agua que no se congela a baja presión, más adecuada para la mayoría de aplicaciones espaciales. +se-space-coolant=Refrigerante a su temperatura predeterminada. +se-space-coolant-hot=Refrigerante a su temperatura predeterminada. +se-space-coolant-warm=Refrigerante enfriado por radiadores térmicos. +se-space-coolant-cold=Refrigerante muy enfriado por radiadores térmicos. +se-space-coolant-supercooled=Refrigerante superenfriado por radiadores térmicos. + +[item-group-name] +space=Espacio +spaceship=Astronave +bob-fluids=Fluídos + +[item-name] +core-fragment=Fragmento de núcleo (__1__) +effectivity-module-4=Módulo de eficiencia 4 +effectivity-module-5=Módulo de eficiencia 5 +effectivity-module-6=Módulo de eficiencia 6 +effectivity-module-7=Módulo de eficiencia 7 +effectivity-module-8=Módulo de eficiencia 8 +effectivity-module-9=Módulo de eficiencia 9 +glass=Vidrio +productivity-module-4=Módulo de productividad 4 +productivity-module-5=Módulo de productividad 5 +productivity-module-6=Módulo de productividad 6 +productivity-module-7=Módulo de productividad 7 +productivity-module-8=Módulo de productividad 8 +productivity-module-9=Módulo de productividad 9 +rocket-fuel=Combustible sólido para cohetes +sand=Arena +solid-sand=Arena sólida +washed-sand=Arena lavada +satellite=Navegación por satélite +se-antimatter-canister=Contenedor de antimateria +se-astrometric-data=Datos astrométricos +se-astronomic-catalogue-1=Catálogo astronómico +se-astronomic-catalogue-2=Catálogo astronómico amplio +se-astronomic-catalogue-3=Catálogo astronómico completo +se-astronomic-catalogue-4=Catálogo astronómico extendido +se-astronomic-insight=Perspectiva general astronómica +se-astronomic-science-pack=Paquete de ciencia astronómica +se-atomic-data=Datos atómicos +se-bio-combustion-data=Datos de biocombustión +se-bio-combustion-resistance-data=Datos de resisencia a la biocombustión +se-bio-spectral-data=Datos bioespectrales +se-biochemical-data=Datos bioquímicos +se-bioculture=Biocultivo +se-bioelectrics-data=Datos bioeléctricos +se-biological-catalogue-1=Catálogo biológico +se-biological-catalogue-2=Catálogo biológico amplio +se-biological-catalogue-3=Catálogo biológico completo +se-biological-catalogue-4=Catálogo biológico extendido +se-biological-insight=Perspectiva general biológica +se-biological-science-pack=Paquete de ciencia biológica +se-biomechanical-data=Datos biomecánicos +se-biomechanical-resistance-data=Datos de resistecia biomecánica +se-boson-data=Datos de bosones +se-broken-data=Tarjeta de datos rota +se-canister=Contenedor seguro +se-rocket-launch-pad-silo-dummy-ingredient-item=Cohete de carga +se-rocket-launch-pad-silo-dummy-result-item=Cohete de carga +se-cargo-rocket-cargo-pod=Módulo de carga +se-cargo-rocket-fuel-tank=Depósito de combustible para cohetes +se-cargo-rocket-section=Sección de cohete de carga +se-cargo-rocket-section-packed=Conjunto de módulos de carga +se-cold-thermodynamics-data=Datos de termodinámica de frío +se-comparative-genetic-data=Datos genéticos comparativos +se-compressive-strength-data=Datos de resistencia a la compresión +se-conductivity-data=Datos de conductividad +se-contaminated-scrap=Chatarra contaminada +se-core-fragment-omni=Fragmento de núcleo +se-cryogenics-data=Datos sobre criogenia +se-dark-energy-data=Datos de energía oscura +se-darkmatter-data=Datos de materia oscura +se-data-storage-substrate-cleaned=Soporte refinado de almacenamiento de datos +se-data-storage-substrate=Soporte básico de almacenamiento de datos +se-decompression-data=Datos de descompresión +se-decompression-resistance-data=Datos de resistencia a la descompresión +se-deep-space-science-pack=Paquete de ciencia de espacio profundo +se-electromagnetic-field-data=Datos de campo electromagnético +se-empty-data=Tarjeta de datos vacía +se-empty-lifesupport-canister=Contenedor de soporte vital vacío +se-energy-catalogue-1=Catálogo energético +se-energy-catalogue-2=Catálogo energético amplio +se-energy-catalogue-3=Catálogo energético completo +se-energy-catalogue-4=Catálogo energético extendido +se-energy-insight=Perspectiva general energética +se-energy-science-pack=Paquete de ciencia espacial +se-entanglement-data=Datos de entrelazamiento cuántico +se-exotic-fission-data=Datos de fisión exótica +se-exotic-singularity-data=Datos de singularidad +se-experimental-biochemical-data=Datos experimentales de bioquímica +se-experimental-bioculture=Biocultivo experimental +se-experimental-genetic-data=Datos experimentales de genética +se-experimental-material-decay-data=Datos experimentales de deterioro de materiales +se-experimental-material-spectral-data=Datos experimentales de espectro de materiales +se-experimental-material=Prototipo de material experimental +se-experimental-specimen=Biomasa experimental +se-experimental-superconductor=Prototipo de superconductor +se-forcefield-data=Datos de campo de fuerza +se-fusion-test-data=Datos de pruebas de fusión +se-gammaray-detector=Detector de rayos gamma +se-gammaray-observation-data=Datos de observación de rayos gamma +se-gammaray-test-data=Datos de rayos gamma +se-genetic-data=Datos genéticos +se-gravity-wave-observation-data=Datos de observación de ondas gravitatorias +se-gravimetric-observation-data=Datos de observación de gravimetría +se-gravimetric-test-data=Datos de pruebas gravimétricas +se-heat-shielding=Escudo térmico +se-hot-thermodynamics-data=Datos de termodinámica de calor +se-infrared-observation-data=Datos de observación infrarroja +se-ion-spectrometry-data=Datos de espectrometría de iones +se-junk-data=Tarjeta de datos usada +se-lepton-data=Datos de leptones +se-lifesupport-canister=Contenedor de soporte vital +se-magnetic-canister=Contenedor magnético +se-magnetic-monopole-data=Datos de monopolo magnético +se-material-decay-data=Datos de deterioro del material +se-material-science-pack=Paquete de ciencia de materiales +se-material-spectral-data=Datos de espectro de materiales +se-material-testing-pack=Paquete de materiales de prueba +se-material-catalogue-1=Catálogo de materiales +se-material-catalogue-2=Catálogo de materiales amplio +se-material-catalogue-3=Catálogo de materiales completo +se-material-catalogue-4=Catálogo de materiales extendido +se-material-insight=Perspectiva general de materiales +se-medpack=Botiquín +se-medpack-2=Botiquín 2 +se-medpack-3=Botiquín 3 +se-medpack-4=Botiquín 4 +se-meteor-defence=Defensa antimeteoritos +se-meteor-defence-ammo=Munición para defensa antimeteoritos +se-meteor-point-defence=Defensa puntual antimeteoritos +se-meteor-point-defence-ammo=Munición para defensa puntual antimeteoritos +se-methane-ice=Hielo de metano +se-micro-black-hole-data=Datos de microagujeros negros +se-microwave-observation-data=Datos de observación de microondas +se-nano-cold-thermodynamics-data=Datos de termodinámica de nanomateriales fríos +se-nano-compressive-strength-data=Datos de resistencia de nanomateriales a la compresión +se-nano-hot-thermodynamics-data=Los datos sobre la termodinámica de los nanomateriales calientes +se-nanomaterial=Nanomaterial +se-nano-tensile-strength-data=Datos de resistencia de nanomateriales a la tracción +se-negative-pressure-data=Datos de presión negativa +se-neural-anomaly-data=Datos de anomalía neural +se-nutrient-vat=Nutrientes +se-observation-frame-blank=Soporte de observación virgen +se-observation-frame-gammaray=Soporte de observación de rayos gamma +se-observation-frame-infrared=Soporte de observación de infrarrojos +se-observation-frame-microwave=Soporte de observación de microondas +se-observation-frame-radio=Soporte de observación de ondas de radio +se-observation-frame-uv=Soporte de observación de ultravioleta +se-observation-frame-visible=Soporte de observación de espectro visible +se-observation-frame-xray=Soporte de observación de rayos X +se-plague-bomb=Misil plaga +se-plasma-canister=Contenedor de plasma +se-plasma-electrodynamics-data=Datos electrodinámicos de plasma +se-plasma-thermodynamics-data=Datos termodinámicos de plasma +se-polarisation-data=Datos de polarización +se-pressure-containment-data=Datos de contención de presión +se-quantum-phenomenon-data=Datos del fenómeno cuántico +se-quark-data=Datos de quark +se-radiation-data=Datos de radiación +se-radiation-exposure-data=Datos de exposición a la radiación +se-radiation-exposure-resistance-data=Datos de resistencia a la radiación +se-radiation-shielding-data=Datos de protección contra la radiación +se-radio-observation-data=Datos de observación de ondas de radio +se-rtg-equipment=Generador portable +se-rtg-equipment-2=Generador portable 2 +se-scrap=Chatarra contaminada +se-significant-data=Datos significativos +se-significant-specimen=Biomasa significativa +se-space-capsule=Cápsula espacial +se-space-mirror=Espejo multiespectral +se-space-platform-plating=Suelo de plataforma espacial +se-space-platform-scaffold=Andamio de plataforma espacial +se-space-rail=Vía espacial +se-spaceship-floor=Suelo de astronave +se-specimen=Biomasa +se-subatomic-data=Datos subatómicos +se-superconductivity-data=Datos de superconductividad +se-superconductor=Superconductor +se-superconductive-cable=Cable superconductor +se-tensile-strength-data=Datos de resistencia a la tracción +se-tesla-ammo=Munición de rifle tesla +se-tesla-gun=Rifle Tesla +se-thruster-suit=Traje espacial impulsor +se-thruster-suit-2=Traje espacial impulsor MK2 +se-thruster-suit-3=Traje espacial impulsor MK3 +se-thruster-suit-4=Traje espacial impulsor MK4 +se-timespace-anomaly-data=Datos de anomalía espaciotemporal +se-used-lifesupport-canister=Contenedor usado de soporte vital +se-uv-observation-data=Datos de observación ultravioleta +se-visible-observation-data=Datos de observación de espectro visible +se-water-ice=Hielo de agua +se-xray-observation-data=Datos de observación de rayos X +se-zero-point-energy-data=Datos de energía de punto cero +space-science-pack=Paquete de ciencia de cohetes +speed-module-4=Módulo de velocidad 4 +speed-module-5=Módulo de velocidad 5 +speed-module-6=Módulo de velocidad 6 +speed-module-7=Módulo de velocidad 7 +speed-module-8=Módulo de velocidad 8 +speed-module-9=Módulo de velocidad 9 + +[item-description] +automation-science-pack=Usado en laboratorios básicos de ciencia para investigación. +chemical-science-pack=Usado en laboratorios básicos de ciencia para investigación. +logistic-science-pack=Usado en laboratorios básicos de ciencia para investigación. +military-science-pack=Usado en laboratorios básicos de ciencia para investigación. +production-science-pack=Usado en laboratorios básicos de ciencia para investigación. +satellite=El satélite debe ser colocado en un silo de cohetes para satélite. +se-antimatter-canister=La más densa forma de energía en un contenedor seguro para traslados. +se-astronomic-science-pack=Usado en laboratorios espaciales de ciencia para investigación. +se-biological-science-pack=Usado en laboratorios espaciales de ciencia para investigación. +se-canister=Un recipiente de contención para múltiples propósitos. +se-cargo-rocket-cargo-pod=Un módulo del cohete de carga. +se-cargo-rocket-fuel-tank=Un módulo del cohete de carga. +se-cargo-rocket-section=Un módulo principal del cohete de carga. Los 100 primeros que introduzcas en el silo se usarán para formar el cohete (el resto será parte de la carga). +se-cargo-rocket-section-packed=Módulos de carga empaquetados para transporte. Deben ser desempaquetados para usarse en la construcción de un cohete. +se-deep-space-science-pack=Usado en laboratorios espaciales de ciencia para investigación. +se-energy-science-pack=Usado en laboratorios espaciales de ciencia para investigación. +se-heat-shielding=Un panel compuesto usado para aplicaciones de alta temperatura y estructuras espaciales. +se-material-science-pack=Usado en laboratorios espaciales de ciencia para investigación. +se-medpack=Úsalo para curarte +se-medpack-2=Úsalo para curarte +se-medpack-3=Úsalo para curarte +se-medpack-4=Úsalo para curarte +se-meteor-defence=Puede defender contra meteoritos a un planeta entero, pero sólo puede disparar contra un meteorito a la vez. Debe cargarse con munición para defensa contra meteoritos, y estar plenamente cargado de energía para disparar. 80% de precisión, toma tiempo para recargar tras el disparo. Consume 20 MW mientras recarga. +se-meteor-defence-ammo=Destruye meteoritos. Debe cargarse en una instalación de defensa contra meteoritos. +se-meteor-point-defence=Defiende contra meteoritos la zona circundante. Capaz de disparar hasta a 4 meteoritos por volea. Debe cargarse con munición para defensa puntual contra meteoritos y estar plenamente cargado de energía para disparar. Alcance 64, precisión 50%, toma tiempo para recargar tras el disparo. +se-meteor-point-defence-container=Destruye meteoritos. Debe cargarse en una instalación de defensa puntual contra meteoritos. +se-rocket-launch-pad-silo-dummy-ingredient-item=Se hace insertando 100 módulos de carga y 1 cápsula espacial en el silo de cohete de carga. +se-rtg-equipment=Generador termoeléctrico a radioisótopos. Un generador portable que convierte el calor de la degradación radioactiva en electricidad. Dura décadas sin requerir combustible adicional. +se-rtg-equipment-2=Generador termoeléctrico a radioisótopos. Una mejora del generador portable que convierte el calor de la degradación radioactiva en electricidad. Dura décadas sin requerir combustible adicional. +se-plague-bomb=Puede extinguir toda forma de vida en un planeta. Manejar con extremo cuidado. (Puede reducir mucho la velocidad de simulación mientras todo va muriendo poco a poco; no recomendado para planetas grandes o multijugador). +se-space-capsule=Cápsula de control requerida para cohetes de carga. Puede usarse desde la órbita para llevar pasajeros de vuelta al planeta más cercano. Entra en la cápsula usando A control capsule required for Cargo Rockets. Can be used to take passengers back to the closest planet surface. Enter the capsule using __CONTROL__toggle-driving__. +se-space-platform-plating=Planchas especializadas que permiten caminar rápido sobre una plataforma espacial. +se-space-platform-scaffold=Andamiaje básico que permite construir ciertas estructuras en el espacio. +se-space-rail=Vías que son seguras en el espacio porque impiden que el tren se separe de las vías flotando y destruyendo todo. También puede usarse en tierra por motivos estéticos. +se-spaceship-floor=Este suelo debe colocarse bajo todas las partes de una astronave, con fuselaje espacial en el contorno exterior. Cualquier hueco en el suelo romperá la contención; podrían perderse esas secciones durante el vuelo. +se-superconductive-cable=Un cable superconductor compuesto que no requiere refrigeración activa. +se-tesla-gun=Descargas eléctricas encadenadas de disparo rápido. +se-thruster-suit=Un traje espacial necesario para sobrevivir en el espacio. \nTiene propulsores y calzado magnético. +se-thruster-suit-2=Un traje espacial necesario para sobrevivir en el espacio. \nTiene propulsores más potentes e incrementa la capacidad de inventario y de equipamiento. +se-thruster-suit-3=Un traje espacial necesario para sobrevivir en el espacio. \nTiene propulsores más potentes e incrementa la capacidad de inventario y de equipamiento. +se-thruster-suit-4=Un traje espacial necesario para sobrevivir en el espacio. \nTiene propulsores más potentes e incrementa la capacidad de inventario y de equipamiento. +space-science-pack=Usado en laboratorios espaciales de ciencia para investigación. +utility-science-pack=Usado en laboratorios espaciales de ciencia para investigación. + +[recipe-name] +core-fragment=Procesado de fragmento de núcleo (__1__) +rocket-fuel=Combustible sólido para cohete +se-astrometric-analysis-multispectral-1=Análisis astrométrico multiespectral 1 +se-astrometric-analysis-multispectral-2=Análisis astrométrico multiespectral 2 +se-astrometric-analysis-multispectral-3=Análisis astrométrico multiespectral 3 +se-astronomic-insight-1=Perspectiva general astronómica +se-astronomic-insight-2=Perspectiva amplia astronómica +se-astronomic-insight-3=Perspectiva completa astronómica +se-astronomic-insight-4=Perspectiva extendida astronómica +se-biological-insight-1=Perspectiva general biológica +se-biological-insight-2=Perspectiva amplia biológica +se-biological-insight-3=Perspectiva completa biológica +se-biological-insight-4=Perspectiva extendida biológica +se-bio-methane-to-crude-oil=Bioprocesado de metano en petróleo +se-bio-sludge-crude-oil=Biolodo a partir de biomasa experimental +se-bio-sludge-decontamination=Descontaminación de biolodo +se-bio-sludge-from-fish=Biolodo a partir de peces +se-bio-sludge-from-wood=Biolodo a partir de madera +se-bio-sludge=Biolodo a partir de biomasa +se-broken-data-scrapping=Desguace de tarjeta de datos rota +se-cargo-rocket-section-pack=Empaquetado de módulos de carga +se-cargo-rocket-section-unpack=Desempaquetado de módulos de carga +se-condenser-turbine-reclaim-water=Generación de electricidad con recuperación de agua +se-core-fragment-omni=Procesado de fragmento de núcleo +se-core-mining=Minería de núcleo +se-empty-antimatter-canister=Flujo de antimateria desde contenedor +se-empty-barrel-scrapping=Desguace de barril vacío +se-empty-barrel-reprocessing=Reprocesado de barril vacío +se-space-capsule-scrapping=Desguace de cápsula espacial +se-energy-insight-1=Perspectiva general de energía +se-energy-insight-2=Perspectiva amplia de energía +se-energy-insight-3=Perspectiva completa de energía +se-energy-insight-4=Perspectiva extendida de energía +se-formatting-1=Formateo de datos +se-formatting-2=Formateo eficiente de datos +se-formatting-3=Formateo avanzado de datos +se-material-insight-1=Perspectiva general de material +se-material-insight-2=Perspectiva amplia de material +se-material-insight-3=Perspectiva completa de material +se-material-insight-4=Perspectiva extendida de material +se-matter-fusion-copper=Fusión de materia (cobre) +se-matter-fusion-dirty=Fusión de materia (chatarra) +se-matter-fusion-iron=Fusión de materia (hierro) +se-matter-fusion-stone=Fusión de materia (piedra) +se-matter-fusion-uranium=Fusión de materia (uranio) +se-plasma-canister-empty=Contenedor de plasma vacío +se-radiating-space-coolant-normal=Enfriado de refrigerante a -10ºC (frío) +se-radiating-space-coolant-slow=Enfriado lento de refrigerante a -10ºC (frío) +se-radiating-space-coolant-veryslow=Enfriado muy lento de refrigerante a -10ºC (frío) +se-mixed-methane-gas-separation=Separación de gas metano mezclado +se-rocket-fuel-from-water-copper=Combustible para cohete a partir de agua +se-scrap-decontamination=Descontaminación de chatarra +se-scrap-recycling=Reciclaje de chatarra +se-space-coolant-cold=Hiperenfriado de refrigerante a -100ºC (frío) +se-space-coolant-supercooled=Hiperenfriado de refrigerante a -273ºC (superfrío) +se-simulation-a=Simulación astronómica +se-simulation-ab=Simulación de panspermia +se-simulation-abm=Simulación de xenoprogresión +se-simulation-am=Simulación de distribución de la materia +se-simulation-as=Simulación de astropartículas +se-simulation-asb=Simulación astrobiónica +se-simulation-asbm=Simulación universal +se-simulation-asm=Simulación astrofísica +se-simulation-b=Simulación biológica +se-simulation-bm=Simulación biomecánica +se-simulation-m=Simulación de materiales +se-simulation-s=Simulación de energía +se-simulation-sb=Simulación bioquímica +se-simulation-sbm=Simulación de nanite +se-simulation-sm=Simulación de nanomaterial +se-space-water-decontamination=Descontaminación de agua cósmica +se-spaceship-rocket-engine-burn=Quema combustible líquido para cohete +se-specimen-fish=Cultivo de peces en microgravedad +se-specimen-wood=Cultivo de madera en microgravedad +se-thermodynamics-coal=Cocción a presión de carbón +se-used-lifesupport-canister-cleaning=Limpieza de contenedor de soporte vital + +[recipe-description] +se-astronomic-insight-2=Más complicada, pero más eficiente. +se-astronomic-insight-3=Más complicada, pero más eficiente. +se-astronomic-insight-4=Más complicada, pero más eficiente. +se-biological-insight-2=Más complicada, pero más eficiente. +se-biological-insight-3=Más complicada, pero más eficiente. +se-biological-insight-4=Más complicada, pero más eficiente. +se-core-mining=El tipo de fragmento recibido depende del planeta. El tiempo de producción real depende del número de perforadoras de núcleo en el planeta o luna. +se-energy-insight-2=Más complicada, pero más eficiente. +se-energy-insight-3=Más complicada, pero más eficiente. +se-energy-insight-4=Más complicada, pero más eficiente. +se-material-insight-2=Más complicada, pero más eficiente. +se-material-insight-3=Más complicada, pero más eficiente. +se-material-insight-4=Más complicada, pero más eficiente. +se-radiating-space-coolant-normal=El enfriamiento y calentamiento repetido del refrigerante causa degradación. +se-radiating-space-coolant-slow=El enfriamiento y calentamiento repetido del refrigerante causa degradación; un enfriamiento más lento reduce las pérdidas. +se-radiating-space-coolant-veryslow=El enfriamiento y calentamiento repetido del refrigerante causa degradación; un enfriamiento más lento reduce las pérdidas. + +[technology-name] +effectivity-module-4=Módulo de eficiencia 4 +effectivity-module-5=Módulo de eficiencia 5 +effectivity-module-6=Módulo de eficiencia 6 +effectivity-module-7=Módulo de eficiencia 7 +effectivity-module-8=Módulo de eficiencia 8 +effectivity-module-9=Módulo de eficiencia 9 +energy-shield-equipment=Escudo de energía +energy-shield-mk2-equipment=Escudo de energía MK2 +energy-shield-mk3-equipment=Escudo de energía MK3 +energy-shield-mk4-equipment=Escudo de energía MK4 +energy-shield-mk5-equipment=Escudo de energía MK5 +energy-shield-mk6-equipment=Escudo de energía MK6 +sand-processing=Procesado de arena +glass-processing=Procesado de vidrio +liquid-rocket-fuel=Combustible líquido para cohete +productivity-module-4=Módulo de productividad 4 +productivity-module-5=Módulo de productividad 5 +productivity-module-6=Módulo de productividad 6 +productivity-module-7=Módulo de productividad 7 +productivity-module-8=Módulo de productividad 8 +productivity-module-9=Módulo de productividad 9 +rocket-silo=Silo de cohete para satélite +rocketry=Misiles +se-adaptive-armour=Armadura adaptativa +se-antimatter-engine=Propulsor de antimateria +se-antimatter-reactor=Reactor de antimateria +se-antimatter-production=Producción de antimateria +se-astronomic-science-pack=Paquete de ciencia astronómica +se-biological-science-pack=Paquete de ciencia biológica +se-condenser-turbine=Turbina condesadora +se-core-miner=Minería de núcleo +se-deep-space-science-pack=Paquete de ciencia de espacio profundo +se-electric-boiler=Caldera eléctrica +se-energy-science-pack=Paquete de ciencia energética +se-fluid-burner-generator=Generador por fluído isotérmico +se-fuel-refining=Refinado de combustible +se-heat-shielding=Escudo térmico +se-material-science-pack=Paquete de Ciencia de los Materiales +se-medpack=Botiquín +se-medpack-2=Botiquín 2 +se-medpack-3=Botiquín 3 +se-medpack-4=Botiquín 4 +se-meteor-defence=Instalación de defensa antimeteoritos +se-meteor-point-defence=Defensa puntual antimeteoritos +se-plague=La plaga +se-railgun=Rifle eléctrico +se-rocket-cargo-safety=Seguridad del cohete de carga +se-rocket-fuel-from-water=Combustible para cohetes a partir de agua +se-rocket-launch-pad=Silo del cohete de carga +se-rocket-landing-pad=Plataforma de aterrizaje de cohete +se-rocket-reusability=Reusabilidad de cohetes +se-rocket-survivability=Supervivencia de cohetes +se-rtg-equipment=Generador portable +se-rtg-equipment-2=Generador portable 2 +se-space-assembling=Máquina de ensamblaje espacial +se-space-accumulator=Acumulador espacial +se-space-astrometrics-laboratory=Laboratorio de astrometría +se-space-biochemical-laboratory=Laboratorio de bioquímica +se-space-catalogue-astronomic=Catálogo astronómico +se-space-catalogue-biological=Catálogo biológico +se-space-catalogue-energy=Catálogo energético +se-space-catalogue-material=Cattálogo de materiales +se-space-data-card=Tarjeta de datos +se-space-decontamination-facility=Instalación de descontaminación +se-space-electromagnetics-laboratory=Laboratorio de electromagnetismo +se-space-genetics-laboratory=Laboratorio genético +se-space-gravimetrics-laboratory=Laboratorio gravimétrico +se-space-growth-facility=Vivero +se-space-hypercooling=Hiperenfriado +se-space-laser-laboratory=Laboratorio laser +se-space-lifesupport-facility=Instalación de soporte vital +se-space-manufactory=Fábrica espacial +se-space-material-fabricator=Fabricante de materiales +se-space-mechanical-laboratory=Laboratorio mecánico +se-space-particle-accelerator=Acelerador de partículas +se-space-particle-collider=Colisionador de partículas +se-space-plasma-generator=Generador de plasma +se-space-platform-plating=Plancha de plataforma espacial +se-space-platform-scaffold=Andamiaje de plataforma espacial +se-space-radiation-laboratory=Laboratorio de radiación +se-space-radiator=Radiador térmico +se-space-rail=Vía espacial +se-space-recycling-facility=Instalación de reciclaje +se-space-science-lab=Laboratorio espacial de ciencia +se-space-simulation-ab=Simulación de panspermia +se-space-simulation-am=Simulación astromaterial +se-space-simulation-as=Simulación de astropartículas +se-space-simulation-bm=Simulación biomecánica +se-space-simulation-sb=Simulación bioquímica +se-space-simulation-sm=Simulación de nanomateriales +se-space-simulation-abm=Simulación de xenoprogresión +se-space-simulation-asb=Simulación astrobiónica +se-space-simulation-asm=Simulación astrofísica +se-space-simulation-sbm=Simulación de nanites +se-space-simulation-asbm=Simulación universal +se-space-solar-panel=Panel solar espacial +se-space-solar-panel-adv=Panel solar espacial avanzado +se-space-spectrometry-facility=Instalación de espectrometría +se-space-supercomputer=Superordenador +se-space-telescope=Telescopio +se-space-telescope-gammaray=Telescopio de rayos gamma +se-space-telescope-xray=Telescopio de rayos X +se-space-telescope-microwave=Telescopio de microondas +se-space-telescope-radio=Telescopio de radioondas +se-space-thermodynamics-laboratory=Laboratorio de termodinámica +se-spaceship=Astronave +se-spaceship-integrity=Integridad estructural de astronave +se-factory-spaceship=Astronave factoría +se-superconductive-cable=Cable superconductor +se-teleportation=Teleportación +se-tesla-gun=Rifle tesla +se-thruster-suit=Traje propulsor +space-science-pack=Paquete de ciencia de cohetes +speed-module-4=Módulo de velocidad 4 +speed-module-5=Módulo de velocidad 5 +speed-module-6=Módulo de velocidad 6 +speed-module-7=Módulo de velocidad 7 +speed-module-8=Módulo de velocidad 8 +speed-module-9=Módulo de velocidad 9 + +[technology-description] +energy-shield-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +energy-shield-mk2-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +energy-shield-mk3-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +energy-shield-mk4-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +energy-shield-mk5-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +energy-shield-mk6-equipment=Una burbuja protectora que se carga rápidamente, pero utiliza una gran cantidad de energía. +sand-processing=Trituración, molienda, y filtrado de la materia prima en arena limpia. +glass-processing=Fundido de arena en vidrio. +rocket-silo=Permite poner un satélite en órbita para desarrollar ciencia de cohetes y descubrir nuevos planetas. +se-adaptive-armour=Armadura que utiliza energía para autorepararse. Cumple un papel similar al del escudo de energía, con bajo requerimiento de energía, pero regeneración mucho más lenta. +se-antimatter-engine=Aniquila antimateria para producir un empuje increíble. +se-antimatter-reactor=Aniquila antimateria con materia para producir calor extremo. +se-antimatter-production=Fábrica de antimateria, la más densa forma de energía almacenada. +se-astronomic-science-pack=Permite desarrollar tecnologías relacionadas con los viajes espaciales y la logística interestelar. +se-biological-science-pack=Permite desarrollar tecnologías relacionadas con la mejora de tus capacidades físicas, armas biológicas y procesado neural. +se-condenser-turbine=75% de la eficacia de una turbina de vapor estándar, pero el 99% del vapor de agua se devuelve como agua. +se-core-miner=Permite la extracción de recursos sin fin de los planetas y las lunas, pero los rendimientos son decrecientes si se usan varios en los mismos cuerpos celestes. +se-deep-space-science-pack=Se requiere para las tecnologías más avanzadas +se-electric-boiler=Crea vapor a partir de agua, usando energía eléctrica. +se-energy-science-pack=Permite desarrollar tecnologías relacionadas con las fuerzas fundamentales, y descubrimientos subatómicos. +se-fluid-burner-generator=Requiere combustible líquido con un valor de energía (tal como combustible líquido para cohete) para producir electricidad. Sencillo y compacto, pero carece de la eficiencia energética de los grandes sistemas basados ​​en vapor. Diseñado para el espacio. +se-fuel-refining=Refinado más avanzado de combustible. +se-heat-shielding=Panel compuesto usado para aplicaciones de alta temperatura y para esctructuras espaciales. +se-material-science-pack=Permite desarrollar tecnologías relacionadas con materiales avanzados, para la ingeniería de requisitos más exigentes. +se-medpack=Usa el botiquín para curarte. +se-medpack-2=Usa el botiquín para curarte. +se-medpack-3=Usa el botiquín para curarte. +se-medpack-4=Usa el botiquín para curarte. +se-meteor-defence=Abate meteoritos en el cielo, antes de que destruyan tus cosas. Esta instalación puede defender un planeta entero, pero sólo puede disparar a un meteorito a la vez. +se-meteor-point-defence=Abate meteoritos en el cielo, antes de que destruyan tus cosas. La defensa puntual sólo defiende el área circundante, y puede disparar hasta a 4 meteoritos a la vez. +se-railgun=Dardos acelerados electromagnéticamente propulsados a tal velocidad que dejan un rastro de plasma antes de vaporizarse. Alto daño, baja cadencia de fuego +se-plague=La gran plaga que extermina toda forma de vida de planetas enteros. Manejar con EXTREMO cuidado. +se-rocket-cargo-safety=Reduce en un 10% (multiplicativo) la probabilidad de que la carga se dañe durante el transporte. +se-rocket-fuel-from-water=Genera combustible para cohetes a partir de hidrógeno-oxígeno por electrólisis de agua. +se-rocket-landing-pad=Permite enviar los módulos de carga del cohete a la pista de aterrizaje con la denominación escogida. Con más investigación también puede recuperar algunos módulos. +se-rocket-launch-pad=Permite lanzar carga al espacio o a otros planetas. +se-rocket-reusability=Aumenta en un 4% el porcentaje de partes que pueden ser recuperadas de un aterrizaje exitoso en una pista de aterrizaje. +se-rocket-survivability=Reduce en un 10% (multiplicativo) la probabilidad de los cohetes de recibir daño durante el transporte, o de tener un fallo de navegación que desvíe el curso hacia la plataforma de aterrizaje. +se-rtg-equipment=Generador termoeléctrico a radioisótopos. Un generador portátil que convierte el calor de desintegración radiactiva en electricidad. Tiene una duración de décadas sin necesitar combustible adicional. +se-rtg-equipment-2=Generador termoeléctrico a radioisótopos. Un generador portátil mejorado que convierte el calor de desintegración radiactiva en electricidad. Tiene una duración de décadas sin necesitar combustible adicional. +se-space-assembling=Una máquina de ensamblaje modificada que puede operar en el espacio. +se-space-astrometrics-laboratory=Combina, compara y cuantifica las diferentes fuentes de información astronómica. +se-space-biochemical-laboratory=Un laboratorio químico avanzado que se especializa en bioquímica. También puede realizar procesamiento químico y de petróleo más básicos. +se-space-catalogue-astronomic=Datos astronómicos estructurados listos para el análisis y la simulación por ordenador. Requerido para posterior investigación astronómica. +se-space-catalogue-biological=Datos astronómicos estructurados listos para el análisis y la simulación por ordenador. Requerido para posterior investigación biológica. +se-space-catalogue-energy=Datos astronómicos estructurados listos para el análisis y la simulación por ordenador. Requerido para posterior investigación energética. +se-space-catalogue-material=Datos astronómicos estructurados listos para el análisis y la simulación por ordenador. Requerido para posterior investigación de materiales. +se-space-data-card=Un soporte de almacenamiento de datos de propósito múltiple. Requerido para posteriores investigaciones basadas en datos. +se-space-decontamination-facility=Limpia sustancias para su uso en ambientes estériles, y prepara líquidos para su uso en condiciones de baja presión. +se-space-electromagnetics-laboratory=Equipamiento para uso en aplicaciones de campo magnético intenso y de voltaje extremadamente alto. +se-space-genetics-laboratory=Un laboratorio dedicado a la secuenciación, modificación e impresión de cultivos genéticos. +se-space-gravimetrics-laboratory=Analiza y simula perturbaciones gravitatorias. +se-space-growth-facility=Cultiva muestras biológicas en una gama de condiciones controladas que son imposibles en otro lugar, tales como micro-gravedad. +se-space-hypercooling=Realiza un intercambio de calor en el refrigerante, haciendo un lado más caliente y el otro más frío. +se-space-laser-laboratory=Experimenta con láseres. Debe usarse protección ocular. +se-space-lifesupport-facility=Soporte vital en los ambientes más hostiles. +se-space-manufactory=Una tecnología clave para la producción en masa en el espacio. +se-space-material-fabricator=Sintetiza nuevos materiales. Un cruce entre un colisionador de partículas y una impresora 3D. +se-space-mechanical-laboratory=Ofrece una gama de procesos mecánicos: trituración, desgarro, cizallamiento, vibración, etc. +se-space-particle-accelerator=Acelera partículas hasta cerca de la velocidad de la luz. +se-space-particle-collider=Colisiona partículas a alta velocidad y analiza los resultados. +se-space-plasma-generator=Genera una variedad de plasmas. +se-space-platform-plating=Planchas robustas para suelo de una plataforma espacial. Suaves y rápidas para los paseos espaciales. +se-space-platform-scaffold=Andamiaje básico para plataformas espaciales. Permite construir encima, pero no es ideal para paseos espaciales. +se-space-radiation-laboratory=Un lugar relativamente seguro para manejar materiales radiactivos. Puede ser usado para el procesamiento de uranio. +se-space-radiator=Irradia el exceso de calor del refrigerante sobrecalentado. +se-space-rail=Vías seguras de usar en el espacio, ya que impiden que el tren descarrile flotando y destruyéndolo todo. También se puede usar en tierra por motivos estéticos. +se-space-recycling-facility=Desguaza elementos y procesa la chatarra para reciclar materias primas. +se-space-science-lab=Permite procesar paquetes de ciencia de cohetes y ciencia espacial más avanzada. +se-space-simulation-ab=Simulación más eficiente mediante la combinación de varias disciplinas. +se-space-simulation-am=Simulación más eficiente mediante la combinación de varias disciplinas. +se-space-simulation-as=Simulación más eficiente mediante la combinación de varias disciplinas. +se-space-simulation-bm=Simulación más eficiente mediante la combinación de varias disciplinas. +se-space-simulation-sb=Simulación más eficiente mediante la combinación de varias disciplinas. +se-space-simulation-sm=Simulación más eficiente mediante la combinación de varias disciplinas. +se-space-simulation-abm=Simulación más eficiente mediante la combinación de varias disciplinas. +se-space-simulation-asb=Simulación más eficiente mediante la combinación de varias disciplinas. +se-space-simulation-asm=Simulación más eficiente mediante la combinación de varias disciplinas. +se-space-simulation-sbm=Simulación más eficiente mediante la combinación de varias disciplinas. +se-space-simulation-asbm=Simulación más eficiente mediante la combinación de varias disciplinas. +se-space-solar-panel=Un panel solar de alta eficiencia para el espacio. +se-space-solar-panel-adv=Un panel solar avanzado de alta eficiencia para el espacio. +se-space-spectrometry-facility=Espectrofotometría, cromatografía de gases, espectrometría de masas, y otra espectrografía. Dispara cosas a un muro, lo curva y observa donde impacta. +se-space-supercomputer=Permite el manejo y tratamiento de los datos más avanzados, así como la simulación. +se-space-telescope=Un sofisticado telescopio sensible a múltiples longitudes de onda en el espectro visible. +se-space-telescope-gammaray=Los rayos gamma no refractan. Este potente telescopio usa detectores especiales en lugar de espejos. +se-space-telescope-xray=Los rayos X son bloqueados por la mayoría de atmósferas. Este potente telescopio está diseñado para el espacio donde la atmósfera no es un problema. +se-space-telescope-microwave=Un enorme telescopio que detecta microondas y radiación de fondo. +se-space-telescope-radio=Un enorme telescopio que detecta ondas de radio muy débiles de origen lejano. +se-space-thermodynamics-laboratory=Realiza procesos que implican temperaturas extremas. También puede realizar procesos térmicos básicos, como la fundición. +se-spaceship=Una nave que construyes pieza por pieza con suelos y paredes, y entonces usas la consola para volar a otro planeta, o más allá. +se-spaceship-integrity=Cada nivel aumenta en 100 el límite de integridad estructural. +se-factory-spaceship=Cada nivel aumenta en 500 el límite de integridad estructural. +se-superconductive-cable=Un cable superconductor compuesto que no requiere refrigeración activa. +se-teleportation=Desbloquea otra tecnología de teletransporte. Resulta que es realmente dificil distorsionar con seguridad el espacio hasta este punto. +se-tesla-gun=Dispara rápidas ráfagas de descarga. Puede alcanzar hasta a 30 enemigos por andanada. Hace largos saltos entre objetivos, o cortos saltos por tierra si no hay objetivos. +se-thruster-suit=Un traje espacial con impulsores y calzado magnético. No vayas al espacio sin él. +se-thruster-suit-2=Un traje espacial mejorado, con impulsores más potentes; incrementa la capacidad de inventario y equipamiento. +se-thruster-suit-3=Un traje espacial mejorado, con impulsores más potentes; incrementa la capacidad de inventario y equipamiento. +se-thruster-suit-4=Un traje espacial mejorado, con impulsores más potentes; incrementa la capacidad de inventario y equipamiento. +space-science-pack=Permite un desarrollo más directo de la ciencia de cohetes y de las tecnologías que se basan en esos avances. + +[modifier-description] +tesla-shooting-speed-bonus=Velocidad de disparo de arma tesla +tesla-damage-bonus=Bonificación de daño de arma tesla +railgun-damage-bonus=Bonificación de daño de rifle eléctrico +railgun-shooting-speed-bonus=Velocidad de disparo de rifle eléctrico + +[virtual-signal-name] +se-star=Estrella +se-planet=Planeta +se-planet-orbit=Órbita del planeta +se-moon=Luna +se-moon-orbit=Órbita de la luna +se-asteroid-belt=Cinturón de asteroides +se-asteroid-field=Campo de asteroides +se-anomaly=Anomalía +se-meteor=Meteorito +se-spaceship=Astronave +se-remote-view=Vista remota +se-death=Muerte +se-character-corpse=Cadáver + +[controls] +se-remote-view=Vista de navegación por satélite +se-respawn=Reaparición + +[shortcut] +se-remote-view=Vista de navegación por satélite +se-respawn=Reaparición + +[shortcut-name] +se-remote-view=Vista de navegación por satélite [__CONTROL__se-remote-view__] +se-respawn=Reaparición [__CONTROL__se-respawn__] + +[tile-name] +se-space-platform-plating=Plancha de plataforma espacial +se-space-platform-scaffold=Andamiaje espacial +se-space-platform-underlay=Espacio +se-space-platform-underlay-l=Espacio +se-space-platform-underlay-r=Espacio +se-space=Espacio vacío +se-regolith=Regolito +se-asteroid=Asteroide +se-spaceship-floor=Suelo de astronave + +[mod-setting-name] +se-meteor-interval=Intervalo entre meteoritos +se-plague-max-runtime=Duración máxima de la plaga +se-planets=Número de planetas +se-planet-size=Área de los planetas (de 1% a 10000%) +se-seed=Semilla para la generación de planetas +se-skip-experimental-warning=No mostrar advertencias experimentales +se-print-meteor-info=Mostrar alertas de meteoritos en la consola +se-space-pipe-capacity=Capacidad de la tubería espacial +se-electric-boiler=Caldera eléctrica + +[mod-setting-description] +se-meteor-interval=El intervalo básico en minutos entre impactos de meteoritos. Después de cada impacto, el siguiente tendrá lugar en un número aleatorio de minutos entre 1 y este valor. +se-plague-max-runtime=La duración máxima en minutos del arma biológica. Después de esta cantidad de minutos tras usar la plaga, todas las partículas, árboles y enemigos son destruidos. +se-planets=No cambiar en mitad de campaña. +se-planet-size=No cambiar en mitad de campaña. +se-seed=No cambiar en mitad de campaña. +se-skip-experimental-warning=No aparece la advertencia al iniciar una nueva partida y no se actualizarán las advertencias si cambia el mensaje. +se-print-meteor-info=Permite ver en la consola las alertas que han desaparecido de pantalla, usando la tecla de acceso a la consola/chat [__CONTROL__toggle-console__]. +se-space-pipe-capacity=Capacidad de fluídos de las tuberías espaciales. +se-electric-boiler=Añade al juego una caldera eléctrica. + +[autoplace-control-names] +planet-size=Tamaño de planeta +se-water-ice=Hielo de agua (sólo espacio, los deslizadores no tienen efecto) +se-methane-ice=Hielo de metano (sólo espacio, los deslizadores no tienen efecto) + +[mod-name] +space-exploration=Exploración Espacial (Space Exploration) + +[mod-description] +space-exploration=Construye cohetes de carga para enviar cosas al espacio. Viaja al espacio en un cohete y comienza tu andadura espacial. Construye una plataforma espacial orbital para desarrollar complicada ciencia espacial basada en datos. Construye una astronave pieza por pieza, vuela desde la superficie de uno a otros planetas, la luna, los cinturones de asteroides y más. Sigue el progreso en https://discord.gg/ymjUVMv diff --git a/space-exploration_0.5.58/space-exploration/locale/fr/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/fr/strings.cfg new file mode 100644 index 0000000..4874454 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/fr/strings.cfg @@ -0,0 +1,2112 @@ +spaceship-integrity100=+100 aux contraintes structurelles max du vaisseau spatial +spaceship-integrity300=+300 aux contraintes structurelles max du vaisseau spatial +spaceship-integrity500=+400 aux contraintes structurelles max du vaisseau spatial +arcosphere-discovery=Collectez des arcosphères dans les étendues intersidérales +core-mining-productivity-5=+5% à la productivité du forage à grande profondeur +se-zone-discovery-random=Permet la découverte d'un nouveau corps céleste au hasard +se-zone-discovery-targeted=Permet la découverte d'un nouveau corps céleste riche en une ressource spécifique +se-zone-discovery-deep=Permet la découverte d'une nouvelle zone d'intérêt dans les étendues intersidérales +unlock-spaceship-victory=Débloque la victoire par vaisseau spatial - Pilotez un vaisseau permettant les conditions suivantes : 3000 de contrainte structurelle ou plus, piloté par un Nexus en mode distorsion, vous permettant de maintenir une vitesse de 250 ou plus pendant 60s en espace interstellaire. + +[mod-name] +space-exploration=Exploration spatiale + +[mod-description] +space-exploration=Construisez des fusées cargo pour envoyer ce que vous souhaitez dans l'espace, et embarquez vous-même pour établir vos avant-postes en orbite ou sur d'autres planètes. Etablissez votre plate-forme de recherche orbitale pour faire progresser les exigeantes sciences spatiales et débloquer de nouvelles options technologiques. Assemblez votre propre vaisseau interstellaire et explorez planètes, lunes, ceintures d'astéroïdes et plus encore. Le mod Space Exploration Postprocess (non listé comme dépendance pour raison technique) est requis, le mod AAI Industry fortement recommandé. Il est déconseillé d'ajouter d'autres mods que ceux listés en dépendances tant que Space Exploration est en phase expérimentale. + +[space-exploration] +space-exploration=Exploration spatiale +menu_space-exploration=Exploration spatiale +title_space-exploration=Exploration spatiale +off=Arrêt +on=Marche +close=Fermer +show=Montrer +wdc_auto_off=Ciblage manuel +wdc_auto_on=Ciblage automatique +name=Nom +rename-something=Renommer __1__ +trigger-none=Aucun (Manuel) +trigger-fuel-full=Lancement lorsque carburant plein +trigger-cargo-full=Lancement lorsque cargaison complète +trigger-fuel-full-signal=Lancement si signal vert et lorsque carburant plein +trigger-cargo-full-signal=Lancement si signal vert et lorsque cargaison complète +trigger-cargo-full-or-signal=Lancement si signal vert ou lorsque cargaison complète +destination-type-zone=Position approximative +destination-type-landing-pad=Aire d'atterrissage +button-launch=Lancement +button-launch-disabled=Lancement (Désactivé) +destination-crash-warning=Avertissement : Sélectionnez une aire d'atterrissage pour réduire les risques de crash. +recipe-to=__1__ à  __2__ +recipe-from=__1__ de __2__ +simple-a-b=__1____2__ +simple-a-b-space=__1__ __2__ +simple-a-b-comma=__1__, __2__ +simple-a-b-break=__1__\n__2__ +interstellar-map=Carte interstellaire +interstellar-space=Espace intersidéral +planetary-system=Système de __1__ +remote-view=Liaison satellite [__CONTROL__se-remote-view__] +remote-view-window-title=[img=virtual-signal/se-remote-view] Vue satellite [__CONTROL__se-remote-view__] +remote-view-currently-viewing=En cours de visualisation : +remote-view-instruction=Lancer plus de satellites pour découvrir plus d'étoiles, planètes, lunes et d'autres zones. +remote-view-spaceships=__1__ vaisseau(x) amarré(s) +remote-view-spaceships-anchored=__1__ vaisseau(x) amarré(s) +remote-view-clamps=__1__ fixation(s) pour vaisseau spatial +remote-view-show-hide-resources=Afficher/masquer les ressources +remote-view-show-hide-stats=Afficher/masquer les statistiques +remote-view-show-hide-anchor-info=Afficher/masquer les informations d'amarrage +exit-remote-view=Quitter la vue satellite [__CONTROL__se-remote-view__] +open-zonelist=Ouvrir l'explorateur d'univers +zonelist-window-title=[img=virtual-signal/se-planet-orbit] Explorateur d'univers [__CONTROL__se-universe-explorer__] +priority-icon=[img=virtual-signal/se-accolade] +priority-tooltip=Priorité (pour trier les zones importantes des zones non pertinentes) +trim-zone-button=[img=item/cliff-explosives] Réduire la surface +trim-zone-button-tooltip=Supprime les blocs en dehors du cadre défini par les constructions du joueur, les entités spéciales et l'origine de la carte. +trim-zone-button-no-surface-tooltip=La surface n'existe pas. +trim-zone-results=Suppression de __1__ blocs de __2__. Surface réduite aux coordonnées X [__3__ à __4__] Y [__5__ à __6__] +delete-zone-button=[img=virtual-signal/se-remove] Supprimer la surface +delete-zone-button-tooltip=Certaines surfaces ne peuvent pas être supprimées. +delete-zone-button-no-surface-tooltip=La surface n'existe pas. +scan-zone-button=[img=item/satellite] Scanner la surface +scan-zone-button-tooltip=Attention : scanner la surface peut ralentir le jeu pendant l'opération. La vitesse de scan est configurable via les options du mod. Le scan peut être interrompu à tout moment. +scan-zone-button-disabled-tooltip=Vous devez lancer un satellite pour scanner la surface. +stop-scan-zone-button=[img=item/satellite] Arrêter tous les scans +stop-scan-zone-button-tooltip=Arrête tous les scans en cours sur toutes les surfaces. +generic-requires-satellite=Vous devez d'abord lancer un satellite. +remote-view-requires-satellite=Vous devez lancer un satellite pour utiliser la liaison satellite. +satellite-discovered-platform=[color=cyan]Le satellite a découvert une plateforme spatiale en orbite.[/color] Ouvrez l'explorateur d'univers [img=virtual-signal/se-planet-orbit] [__CONTROL__se-universe-explorer__], sélectionnez __1__, et cliquez sur Afficher la surface. Il pourrait y avoir des choses utiles là-haut. +satellite-view-unlocked=Vou avez débloqué la [color=cyan][img=virtual-signal/se-remote-view] liaison satellite[/color]. Elle permet de voir et d'explorer en temps réel la surface de Nauvis, et des autres endroits que vous avez découverts. Appuyez sur [color=green][__CONTROL__se-remote-view__][/color] ou bien sur l'icône de Vue Satellite (à droite de la barre d'accès rapide) pour l'activer +source-discovered-zone=[color=cyan]__1__ a découvert __2__ : [/color][img=__3__] [color=white]__4__[/color]. Les lieux découverts peuvent être inspectés depuis [img=virtual-signal/se-planet-orbit] l'explorateur d'univers [__CONTROL__se-universe-explorer__]. +discovered-zone=[color=cyan]Découverte d'une nouvelle __1__ : [img=__2__] [/color][color=white]__3__[/color]. +discovered-anomaly-additional=Objet inconnu détecté dans l'anomalie [img=virtual-signal/se-anomaly]. Votre journal d'exploration [img=virtual-signal/informatron] [__CONTROL__informatron__] a été mis à jour. +satellite-discovered-nothing=Un nouveau satellite a été lancé, mais il n'a rien trouvé de nouveau. Il y a peut-être d'autres lieux à découvrir autour d'autres étoiles. +tech-discovered-nothing=Les télescopes n'ont rien trouvé de nouveau près des étoiles. Il y a peut-être d'autres choses à trouver dans l'espace profond. +tech-deep-discovered-nothing=Vous n'avez pas découvert de nouvelle zone d'intérêt dans l'espace intersidéral +galaxy_ship_authenticated=[img=virtual-signal/se-spaceship] Vaisseau spatial à l'abandon : [color=cyan]"Signature biologique authentifiée. Le code d'accès au sas est 2236067964. Transmission du journal de sauvegarde d'urgence."[/color] Votre journal d'exploration [img=virtual-signal/informatron] [__CONTROL__informatron__] a été mis à jour. +space-capsule=Capsule spatiale +player-died=__1__ est mort +launch-suit-warning=Pour éviter d'étouffer, envisagez d'enfiler votre combinaison spatiale à  propulsion avec quelques capsules de support de vie dans votre inventaire. +suffocating-warning=Vous suffoquez. Entrez dans une capsule spatiale ou mettez votre combinaison spatiale avec quelques capsules de support de vie dans votre inventaire. +rocket_survivability_fail=Une fusée cargo a subi des dommages en cours de transport et a dévié de sa trajectoire. Des recherches supplémentaires sur la fiabilité des fusées et la sécurisation de la cargaison sont conseillées. __1__ +respawn-if-stranded=Si vous êtes bloqué, vous pouvez utiliser le raccourci de réapparition [__CONTROL__se-respawn__]. +respawn-options-title=Lieu de réapparition +respawn-button-homeworld=[img=virtual-signal/se-planet] Planète de départ +respawn-button-landing-pad=[img=item/se-rocket-landing-pad] Aire d'atterrissage la plus proche +respawn-button-spaceship=[img=virtual-signal/se-spaceship] Vaisseau spatial le plus proche +respawn-confirm-title=Êtes-vous sur de vouloir réapparaître? +respawn-confirm-yes=[img=virtual-signal/se-death] Réapparition +respawn-confirm-no=Annuler +search-list=Rechercher +clear-search=Effacer la recherche +filter-list=Filtrer +clear-filter=Effacer le filtre +attrition-type-radiation=radiations +attrition-type-wind=vent +attrition-type-spacial-distortion=Distorsion spatiale +zonelist-view-surface=Voir la surface +zonelist-heading-hierarchy=Hiérarchie +zonelist-heading-type=Type de zone +zonelist-heading-name=Nom +zonelist-heading-radius=Rayon +zonelist-heading-primary-resource=Ressource principale +zonelist-heading-attrition=Interférences pour les robots +zonelist-heading-threat=Menace +zonelist-heading-solar=Énergie solaire +zonelist-heading-flags=Repères +zonelist-heading-priority=Priorité +zonelist_filter_star=Inclure les étoiles +zonelist_filter_planet=Inclure les planètes +zonelist_filter_planet-orbit=Inclure les orbites planétaires +zonelist_filter_moon=Inclure les lunes +zonelist_filter_moon-orbit=Inclure les orbites de lunes +zonelist_filter_asteroid-belt=Inclure les ceintures d'astéroïdes +zonelist_filter_asteroid-field=Inclure les champs d'astéroïdes +zonelist_filter_anomaly=Inclure les anomalies +zonelist_filter_spaceship=Inclure les vaisseaux spatiaux +zonelist-resource-bar-tooltip=__1__ __2__\nFréquence : __3__\nTaille : __4__\nRichesse : __5__ +zonelist-resource-bar-tooltip-extended=__1__ __2__\nFréquence : __3__\nTaille : __4__\nRichesse : __5__\n__6__ +zonelist-resources-disclaimer=L'abondance des différentes ressources est approximative [?] +zonelist-resources-disclaimer-tooltip=L'abondance des différentes ressources est estimée à partir de la probabilité d'apparition de celles-ci.\nElle correspond aux paramètres de génération de la surface.\nDe grandes étendues d'eau, l'exigence d'un terrain spécifique ou un rayon trop petit peuvent par exemple empêcher l'apparition de certaines ressources peu abondantes. +resource-terrain-required-se-vulcanite=Nécessite un terrain volcanique +resource-terrain-required-se-cryonite=Nécessite un terrain gelé +resource-terrain-required-se-vitamelange=Nécessite un terrain enherbé +zone-tooltip-type=Type de zone : +zone-tooltip-parent=Parent : +zone-tooltip-threat=Menace : +zone-tooltip-daynight=Cycle jour/nuit : +zone-tooltip-bot-attrition=Interférence des robots __1__ : +zone-tooltip-radius=Rayon : +zone-tooltip-solar=Énergie solaire : +zone-tooltip-flags=Repères : +zone-tooltip-closest=Zone la plus proche : +zone-tooltip-destination=Destination : +zone-tooltip-delta-v=∆v depuis __1__ +construction-denied=Ne peut pas être placé ici. +construction-denied-vehicle-in-space=Les véhicules terrestres de peuvent pas être placés dans l'espace. +construction-denied-se-surface=Placement invalide, doit être placé sur une surface de Space Exploration +construction-denied-no-water=Pas d'eau +construction-denied-spaceship-only=Doit être placé sur du plancher de vaisseau spatial +currently-viewing=En cours de visualisation : __1__ +fail-board-no-character=Impossible de monter à bord du vaisseau cible, vous devez suivre votre personnage +fail-board-remote-character=Impossible de monter à bord du vaisseau cible, votre personnage n'est pas sur le vaisseau à partir duquel vous essayez d'embarquer. +fail-board-target-anchored=Impossible de monter à bord d'un vaisseau amarré, essayez plutôt de vous amarrer au même endroit. +starmap=Carte stellaire +starmap-button=[img=virtual-signal/se-star] Carte stellaire +back=Retour +spaceship=Vaisseau spatial +planet=Planète +moon=Lune +star=Étoile +orbit=Orbite +something_orbit=Orbite de __1__ +asteroid-belt=Ceinture d'astéroïdes +asteroid-field=Champ d'astéroïdes +anomaly=Anomalie +spaceship-cannot-set-destination-to-self=Impossible de choisir votre lieu actuel comme destination. +spaceship-streamline=Score aérodynamique : __1__ +spaceship-launch-energy=Énergie de lancement : __1__ +spaceship-launch-energy-invalid=Énergie de lancement : Exige un contrôle d'intégrité valide. +spaceship-speed=Vitesse : __1__ +spaceship-structural-stress-hull=Contraintes structurelles (coque) : __1__ +spaceship-structural-stress-hull-invalid=Contraintes structurelles (coque) : indisponible (confinement requis) +spaceship-structural-stress-container=Contraintes structurelles (conteneurs) : __1__ +spaceship-structural-stress-container-invalid=Contraintes structurelles (conteneurs) : indisponible (confinement requis) +spaceship-travel-time-unknown=Durée du voyage : inconnue. Testez la vitesse maximale pour faire une estimation. +spaceship-travel-time-max=Durée du voyage : __1__ s à vitesse maximale. +spaceship-travel-time-current=Durée du voyage : __1__ s à la vitesse actuelle. +spaceship-closest-location=Lieu le plus proche: __1__ +spaceship-location-spatial-distortion=Distorsion spatiale : __1__ +spaceship-location-stellar-x=Quadrant X : __1__ +spaceship-location-stellar-y=Quadrant Y : __1__ +spaceship-location-star-gravity-well=Puits de gravité stellaire : __1__ +spaceship-location-planet-gravity-well=Puits de gravité planétaire : __1__ +spaceship-travel-status=Statut du trajet : __1__ +spaceship-integrity-status-valid=Vérification d'intégrité : Valide : __1__ +spaceship-integrity-status-invalid=Vérification d'intégrité : Non valide : __1__ +spaceship-button-launch=Lancement +spaceship-button-launch-tooltip=Prêt au lancement +spaceship-button-launch-disabled=Lancement (Désactivé) +spaceship-button-launch-disabled-fuel-tooltip=Nécessite du carburant dans les réservoirs +spaceship-button-launch-disabled-integrity-tooltip=Requiert un contrôle d'intégrité valide +spaceship-button-anchor=Amarrer +spaceship-button-confirm-anchor=Confirmer l'amarrage +spaceship-button-anchor-to=Amarrage à __1__ +spaceship-button-anchor-on=Amarrage sur __1__ +spaceship-button-stop=Arrêter +spaceship-button-start=Démarrage +spaceship-button-board=Embarquer dans __1__ +spaceship-button-scouting-back=Retour +spaceship-button-scouting-back-tooltip=Annuler la recherche des amarrages +spaceship-name-the=__1__ +spaceship-button-start-integrity-check=Démarrer le contrôle d'intégrité +spaceship-heading-destination=Destination +list-destinations-alphabetically=Lister les destinations par ordre alphabétique +spaceship-travel-message-new-course-plotted=Nouvelle trajectoire établie +spaceship-travel-message-exiting-planet-gravity=Sortie du puits de gravité planétaire +spaceship-travel-message-navigating-planet-gravity=Navigation dans le puits de gravité planétaire +spaceship-travel-message-exiting-star-gravity=Sortie du puits de gravité stellaire +spaceship-travel-message-navigating-star-gravity=Navigation dans le puits de gravité stellaire +spaceship-travel-message-spatial-distortions=Navigation dans les distorsions spatiales +spaceship-travel-message-navigating-interstellar=Navigation dans l'espace interstellaire +spaceship-travel-message-at-destination=À destination. +spaceship-check-message-passed=Test réussi : le vaisseau passe le contrôle d'intégrité. +spaceship-check-message-failed-containment=Échec : pas de confinement total autour du poste de pilotage. Vérifiez que toutes les parois du vaisseau spatial sont bien placées sur du plancher de vaisseau spatial sans aucune brèche. +spaceship-check-message-failed-console-floor=Le poste de pilotage doit être placé sur du plancher de vaisseau spatial. +spaceship-check-message-failed-empty=Pas de plancher de vaisseau trouvé connecté à un poste de pilotage correctement confiné. +spaceship-check-message-failed-unknown-bounds=Erreur : Limites du vaisseau non trouvées. +spaceship-check-message-failed-stress=Erreur : Les contraintes structurelles dépassent votre limite technologique. +spaceship-check-message-checking-console-floor=Vérification du plancher autour du poste de pilotage. +spaceship-check-message-checking-containment=Vérification du confinement. +spaceship-check-message-checking-connectivity=Vérification de la connectivité du poste de pilotage. +spaceship-check-message-no-console=Aucun poste de pilotage. +spaceship-check-message-did-not-complete=La vérification ne s'est pas terminée. +spaceship-check-message-unstable=Instable : Des sections se détacheront lors des manœuvres. +spaceship-check-message-valid-but-disconnecting=Valide mais instable : Des sections sont susceptibles de se détacher. +spaceship-warning-sections-disconnecting=Des sections sont en train de rompre. Arrêtez-vous pour réparer. +page_space_exploration_text_1=Bienvenue dans Space Exploration. Ce mod propose déjà beaucoup de contenu, mais il est encore sous statut[font=default-bold]expérimental[/font] et très activement développé. Certains bugs peuvent avoir échappé à notre vigilance.\n\n[font=heading-2]Statut expérimental ?[/font]\n\nSpace Exploration change encore à un rythme rapide et je consacre tout mon temps dans le développement de nouvelles fonctionnalités au détriment de la compatibilité avec d’autres mods.[color=red]Il est conseillé de ne pas jouer avec d’autres mods que ceux requis et ceux recommandés par Space Exploration.[/color]\n\nTant que dure la phase expérimentale, si un autre mod provoque des soucis tels que la corruption de votre sauvegarde, des crashs, des soucis d’arbre technologique ou d’autres problèmes importants, il sera rapidement indiqué comme non compatible pour protéger les nouveaux joueurs. Cela signifie que plus vous utilisez un grand nombre de mods, plus la probabilité que l’un d’entre eux n’ait pas encore été identifié comme incompatible est élevée. Vous pouvez bien sur modifier le fichier info.json pour contourner cette restriction et essayer de jouer avec un mod incompatible, mais ce sera à vos propres risques : je ne pourrais pas vous aider si votre partie devient injouable. \n\nUne autre conséquence de la phase expérimentale est que la plupart des autres mods qui remanient une grande partie de Factorio sont pour le moment considérés comme incompatibles, mais l’objectif à plus long terme est de rendre ces mods possibles à jouer ensemble. Krastorio 2 est un exemple de ce travail déjà bien engagé.\n\nVous pourrez trouver plus d’informations à propos de la compatibilité inter-mods sur le wiki de Space Exploration. Si vous souhaitez contribuer au travail sur la compatibilité, n’hésitez pas à prendre contact sur le serveur Discord. Gardez cependant à l’esprit que ce n’est pas la première priorité dans le développement de Space Exploration pour le moment.\n\n[font=heading-2]Mods recommandés[/font] \n\n • AAI Containers & Warehouses : de plus grands coffres dans l’esprit du jeu de base.\n\n • Module Inserter : vous permet d’insérer des modules dans vos machines en mode vue satellite.\n\n • Equipment Grid Logistic Module : Un module pour véhicules tels que le Spidertron permettant de passer des demandes et de se débarrasser des objets inutiles via des requêtes logistiques.\n\n • Grappling Gun : Vous permet de sauter au-dessus des bâtiments, des lacs et de vous échapper rapidement d’un combat défavorable. Dans l’espace, vous pourrez l’utiliser pour revenir sur la plateforme spatiale si vous en tombez. Vous permet également de vous inviter dans un vaisseau spatial, ce qui est particulièrement pratique lorsqu’ils sont en mouvement. • Burner Leech : Permet aux bras robotisés thermiques de se ravitailler depuis n’importe quelle source (par ex un four), pratique au début du jeu.\n\n • Text Plates Vous permet de placer des tuiles de texte sur le sol, très pratique pour identifier vos pas de tir, zones d’atterrissage, etc.\n\n • Even Distribution Une aide pratique en début de jeu lorsque vous devez encore ravitailler vos machines à la main.\n\n • Walls Block Spitters : Aide à la défense lorsque vous n’êtes plus sur la planète. Réparer les murs coûte moins cher que de reconstruire vos tourelles.\n\n • Bullet Trails : Amélioration graphique pour voir sur quoi vos tourelles tirent.\n\n[font=heading-2]Réglages recommandés[/font]\n\nVous DEVEZ avoir tous les biomes du mod Alien Biomes activés, faute de quoi la partie crashera plus tard dans le jeu.\n\nUne partie Space Exploration est plus longue qu’une partie normale, réduire le facteur d’évolution ennemi peut donc être une bonne idée.\n\nVous ne devriez pas changer à la hausse les réglages de ressources de votre planète de départ (sauf pour une partie en mode marathon ou avec des recettes plus chères), cela réduirait le besoin de s’installer sur d’autres planètes pour des gisements plus abondants.\n\n\n[font=heading-2]Liens utiles[/font]\n\nSpace Exploration Wiki: https://spaceexploration.miraheze.org\n\nDemandez de l’aide ou suivez le développement du mod sur Discord : https://discord.gg/ymjUVMv\n\nPlus de 2000heures ont été consacrées au développement de ce mod. Si vous l’appréciez, vous pouvez le témoigner en me supportant sur Patreon : https://www.patreon.com/earendel +menu_meteor_defence=[img=virtual-signal/se-meteor] Défense contre les météorites +title_meteor_defence=Défense contre les météorites +page_meteor_defence_text_1=Les chutes de météorites menacent la plupart des zones à intervalles aléatoires. Vous pouvez changer la durée max entre deux épisodes dans les paramètres du mod.\n\nLe nombre de météorites est lui aussi aléatoire : 50% pour une seule, 25% pour 2, 12,5% pour 3, 6,25% pour 4, etc...\n\nLes défenses anti-météorites peuvent détruire les météorites menaçantes avant qu'elles ne puissent causer des dégâts. Elles se déclencheront en séquence, les dernières installations n'auront donc pas à faire feu si toutes les météorites ont été détruites par les premières. Les installations de défense requièrent des munitions spécifiques, et une grande quantité d'énergie pendant leur temps de rechargement. La puissance de recharge après tir n'est pas négligeable, il est donc sage d'adapter vos défenses au risque encouru, sans les surdimensionner. +menu_coremining=[img=item/se-core-miner] Forage à grande profondeur +title_coremining=Forage à grande profondeur +page_coremining_text_1=Le forage à grande profondeur ne peut être réalisé que sur les planètes et les lunes. Les produits du forage de chaque planète et chaque lune seront différents fonction des ressources de chacune d'entre elles. Les fragments de Nauvis permettront d'obtenir un mélange des différentes ressources principales, mais la plupart des endroits produiront essentiellement la ressource locale la plus abondante. Le forage à grande profondeur requiert une grande puissance électrique, mais vous pourrez en partie la couvrir grâce au charbon, au pétrole et à l'uranium extraits.\n\nLes foreuses grande profondeur consomment nettement plus d'énergie que les foreuses classiques, et plus vous aurez de foreuses sur la même surface, moins chacune d'entre elles sera efficace. Leur immense avantage est de ne jamais tomber à court de ressources - il peut être très utile de mettre en place une foreuse dès le début du jeu qui se mettra en marche lors de vos surplus de production électrique. Sur une petite planète, l'énergie solaire et le forage à grande profondeur pourraient être le seul moyen d'obtenir assez de ressources pour quitter la surface. Plus tard dans le jeu, les améliorations de productivité minière bénéficieront grandement à cette technologie. Il est préférable de mettre en place quelques foreuses d'excavation sur de nombreuses planètes, plutôt qu'énormément sur la même. +menu_beacons=[img=item/se-wide-beacon-2] Diffuseurs de modules +title_beacons=Diffuseurs de modules +page_beacons_text_1=[font=heading-2]Surcharge de diffuseurs [img=virtual-signal/se-beacon-overload][/font]\n\nLa surchage de diffuseurs est un remaniement du fonctionnement des diffuseurs de modules de Factorio. Vos installations ne peuvent être sous l’effet que d’un seul diffuseur – si plusieurs affectent la même machine, celle-ci sera en surcharge et s’arrêtera complètement.\n\nCe remaniement augmente aussi le nombre d’emplacements dans les diffuseurs de modules et encourage donc l’utilisation de modules avancés pour des bonus maximum. Ce changement permet également davantage d’approches dans la conception de vos lignes d’assemblage.\n\nLe premier diffuseur de module que vous débloquez est beaucoup plus puissant que celui du jeu de base, mais il n’est pas possible de cumuler les effets de plusieurs d’entre eux sur la même machine : les bonus maximum sur une ligne d’assemblage sont réduits par rapport au jeu de base.\n\nUne fois que vous aurez accès aux diffuseurs à grande portée, vous pourrez bénéficier d’économies substantielles dans le nombre de modules requis pour une ligne de production, mais vous serez aussi plus libre dans la conception de celle-ci ; tout particulièrement lors de l’utilisation de grandes installations mettant en jeu beaucoup de composants et de fluides différents.\n\nUne icône de surcharge apparaitra sur les installations sous l’effet de plusieurs diffuseurs, et celles-ci stopperont toute production. Elles seront toujours alimentées à leur puissance électrique minimale dans ce cas. +menu_launching_satellites=[img=item/satellite] Lancement de satellites +title_launching_satellites=Lancement de satellites +page_launching_satellites_text_1=Vous avez lancé [color=cyan]__1__[/color] satellites.\n\n[font=heading-2][img=virtual-signal/se-remote-view] Vue satellite [__CONTROL__se-remote-view__][/font]\n\nLorsque vous lancez un satellite de navigation depuis le silo à fusée pour satellites, vous débloquez la [img=virtual-signal/se-remote-view]Vue satellite. Vous y avez accès en utilisant la touche [__CONTROL__se-remote-view__] . En mode Vue satellite, votre caméra est détachée de votre personnage, vous pouvez ainsi défiler très rapidement sur la surface et même explorer les zones pas encore révélées. Certaines actions sont impossibles dans ce mode : vous ne pourrez par exemple pas directement placer ou récupérer des entités. Beaucoup de choses restent toutefois possibles, comme utiliser des plans, planifier la déconstruction, placer des entités fantômes, prévoir des liaisons logiques, modifier les recettes des assembleurs, les paramètres des calculateurs, etc...\n\n[font=heading-2][img=virtual-signal/se-planet-orbit]Explorateur d'Univers [__CONTROL__se-universe-explorer__][/font]\n\nLa vue satellite vous permet également de visualiser d'autres surfaces vers lesquelles vous avez déjà lancé un satellite : planètes, lunes, ceintures d'astéroïdes, orbites planétaires, etc... Utilisez la touche [__CONTROL__se-universe-explorer__] pour afficher la liste des zones découvertes. Si vous avez lancé un satellite, vous pouvez utiliser "Voir la surface" pour l'inspecter. Il peut être préférable d'effectuer une reconnaissance par satellite d'une planète avant d'embarquer personnellement vers celle-ci.\n\nLancer des satellites vous permet également de découvrir de nouveaux objets dans le système stellaire local (plus d'informations dans la section Découverte de nouvelles zones).\n\n[font=heading-2][img=item/se-satellite-telemetry] Mesures satellite[/font]\n\nUn lancement de satellite permet d'obtenir des mesures satellites, un composant essentiel des [img=item/se-rocket-science-pack] Packs de science aérospatiale. +menu_zone_discovery=[img=virtual-signal/se-planet-orbit] Découverte de nouvelles zones +title_zone_discovery=Découverte de nouvelles zones +page_zone_discovery_text_1=Un grand nombre d'étoiles, de planètes, de ceintures et de champs d'astéroïdes peuvent être découvertes dans cette région de l'espace.\n\n[font=heading-2]Inspection par liaison satellite[/font]\n Lancer un satellite de navigation permettra de découvrir une nouvelle planète, lune ou ceinture d'astéroïdes dans le système stellaire de lancement. Si vous avez découvert tous les objets de celui-ci, d'autres étoiles peuvent être découvertes, mais les satellites ne seront pas en mesure de révéler les corps en orbite autour de celles-ci. Les satellites ne sont pas non plus adaptés pour la découverte d'objets d'intérêt dans les espaces interstellaires.\n\n[font=heading-2]Recherche scientifique de nouvelle zones[/font]\nVous pouvez utiliser vos téléscopes spatiaux pour rechercher de nouvelles zones, avec la recherche technologique "Découverte de nouvelle zone". La recherche la plus rudimentaire permettra de révéler au hasard une nouvelle étoile, planète, lune ou ceinture d'astéroïdes.\n\n[font=heading-2]Recherche ciblée de nouvelles zones[/font]\nLa recherche de ciblée nouvelle zone utilise le même principe, mais est orientée dans les zones les plus susceptibles de révéler un corps riche dans la ressource que vous ciblez (voir ci-dessous). Une planète ne peut jamais être découverte avant son étoile, ni une lune avant sa planète, ne vous attendez donc pas à la découverte idéale à tous les coups.\n\n[font=heading-2]Recherche de corps dans l'espace intersidéral[/font]\nLa recherche de corps dans l'espace instersidéral vise à identifier les zones d'intérêt dans les vastes étendues entre les étoiles et est le seul moyen de révéler des champs d'astéroïdes. Ce sont les seuls endroits dans lesquels vous pourrez trouver du Naquium. Il n'est pas possible de cibler une ressource particulière avec cette recherche.\n\n[font=heading-2]Ressource visée pour la recherche ciblée:[/font] +menu_cargo_rockets=[img=virtual-signal/se-cargo-rocket] Fusées cargo +title_cargo_rockets=Fusées Cargo +page_cargo_rockets_text_1=Les fusées cargo sont lancées depuis le Silo à fusées cargo.\n\nVous avez lancé [color=cyan]__1__[/color] fusées cargo.\n\nModificateur de perte de chargement basé sur votre technologie : pourcentage de perte maximum réduit de [color=cyan]__2__%[/color].\n\nModificateur de succès basé sur votre technologie : probabilité d'échec des fusées cargo réduit de [color=cyan]__3__%[/color].\n\nModificateur de réutilisation basé sur votre technologie : [color=cyan]__4__[/color] +/- 10 (max 100) sections de fusée récupérables à l’atterrissage.\n\n[font=heading-2]Lancer vos premières fusées cargo[/font]\n\nAvant de pouvoir lancer vos premières fusées cargo, vous devez avoir réussi le lancement d’un satellite depuis le silo à fusées satellite (silo du jeu de base) avec le mod Space Exploration installé.\n\nUne fois que vous avez assemblé et placé votre Silo à fusées cargo, vous aurez besoin d’assembler et de remplir les réservoirs de votre fusée:\n\n • 100 sections de fusée cargo insérées dans le silo (20 d’entre elles pourront être récupérées à destination, plus avec les bonnes technologies)\n • 1 capsule spatiale insérée dans le silo. La capsule sera toujours récupérée à destination, et peut vous ramener depuis une orbite planétaire vers sa surface.\n • Une grande quantité de carburant pour fusée liquide, à alimenter depuis l’une des 8 connections près des coins du silo. La quantité de carburant nécessaire dépend de la gravité du lieu de lancement (une planète à grand rayon nécessitera plus de carburant) et de la distance de la destination. Si vous sélectionnez « N’importe quelle aire d’atterrissage valide » comme destination, la fusée embarquera assez de carburant pour n’importe laquelle des destinations possibles.\n\nVous pouvez embarquer vous-même dans la fusée depuis la porte d’entrée du silo (appuyez sur __CONTROL__toggle-driving__). Vous devriez vérifier que vous avez équipé une combinaison spatiale pourvue d’un module de support de vie et que vous disposez de capsules de support de vie si vous voulez vous rendre dans une zone spatiale.\n\nVotre première fusée vers une destination en particulier n’aura nulle part pour atterrir, et s'écrasera après largage de la cargaison et de la capsule. Un crash occasionnel est toujours possible même avec une aire d’atterrissage, mais le chargement est réparti dans différentes nacelles larguées automatiquement – vous ne perdrez donc jamais tout le chargement.\n\nVous devriez prévoir une aire d’atterrissage (et suffisamment d’échafaudage de plateforme spatiale si vous vous rendez en orbite) lors de votre premier voyage afin de permettre la réception dans de bonnes conditions des fusées suivantes.\n\nDe même, prévoir une aire sur votre lieu de départ vous permettra d’y revenir plus aisément, plutôt que d’être largué à un point aléatoire de la surface lors du trajet retour. \n\n[font=heading-2]Destinations[/font]\n\nUne fois votre aire d’atterrissage placée, soyez sûr de bien la spécifier comme destination dans le silo à fusée cargo. Il est possible de le faire même en mode Vue satellite. Les fusées ne se lanceront toutefois pas vers une aire qui contient des objets, soyez donc sur de bien la vider après chaque atterrissage.\n\n[font=heading-2]Contrôle logique simple[/font]\n\nLe silo à fusées cargo envoie un signal logique du nombre de section de fusées déjà insérées. Vous pouvez donc contrôler vos bras automatisés avec une condition [Section de fusées cargo < 100] pour empêcher l’insertion de plus de sections qu’il n’est nécessaire pour assembler la fusée (les sections en trop seraient alors embarquées comme chargement).\n\nSi vous avez défini un mode de lancement automatique pour votre silo, veillez bien à ce que l’aire d’atterrissage ciblée soit bien vide: une fusée ne se lancera pas si l’aire cible contient des objets.\n\n[font=heading-3]Signaux logiques d’entrée[/font]\n\n[img=virtual-signal/signal-green] Signal vert: peut déclencher le lancement de la fusée si vous avez configuré le silo dans un mode de lancement qui utilise ce signal.\n\n[font=heading-3]Signaux logiques de sortie[/font]\n\n[img=virtual-signal/signal-E] Signal E : nombre d’emplacement de chargement vides.\n\n[img=virtual-signal/signal-F] Signal F : Emplacements de chargement remplis.\n\n[img=virtual-signal/signal-L] Signal L : Quantité de carburant requise pour la/les destination(s) sélectionnée(s). \n\n[img=virtual-signal/se-cargo-rocket] Signal Fusée Cargo : Envoie une valeur de 1 si la fusée est assemblée (1 capsule et 100 sections).\n\n[img=item/se-space-capsule] Signal Capsule Spatiale : Compte le nombre de capsules dans la fusée, en additionnant celle utilisée pour l’assemblage et celles comprises dans le chargement.\n\n[img=item/se-cargo-rocket-section] Signal Section de fusée cargo : Compte le nombre de sections dans la fusée, en additionnant celles utilisées pour l’assemblage et celles comprises dans le chargement.\n\n[img=fluid/se-liquid-rocket-fuel] Signal Carburant pour fusée liquide : retourne la quantité de carburant chargée dans le Silo. +menu_delivery_cannons=[img=item/se-delivery-cannon] Canons logistiques +title_delivery_cannons=Canons logistiques +page_delivery_cannons_text_1=Les canons logistiques sont des canons hybrides, utilisant à la fois un explosif conventionel et un rail électromagnétique permettant d'envoyer une charge utile avec une portée interplanétaire. Ils peuvent seulement envoyer une charge homogène de matériaux bruts capables de résister à l'intense accélération : vous ne pourrez pas les utiliser pour envoyer des composants ou des structures complexes.\n\nUn canon logistique n'a qu'un point cible, sans contrôle des conditions à destination - il fera feu aussi longtemps qu'il est chargé et alimenté. Vous pouvez mettre en place un contrôle de la mise à feu en n'insérant les capsules de livraison ou les ressources que lorsque nécessaire.\n\nQuand une capsule de livraison frappe le sol, elle cause des dégâts et détruit la majorité des ressources livrées. Un dispositif de capture de capsules peut assurer la bonne réception de celles-ci, mais doit être vidé entre deux réceptions. Plusieurs canons peuvent cibler le même dispositif de capture.\n\nIl est conseillé de bien veiller à ce que ces dispositifs soient rapidement déchargés, ou bien de restreindre le chargement des canons en utilisant la transmission de signal à grande distance. +menu_lifesupport=[img=item/se-lifesupport-equipment-1] Support de vie +title_lifesupport=Support de vie +page_lifesupport_text_1=Le support de vie est assuré par un ou plusieurs équipements de support de vie insérés dans votre équipement, qui consomment des capsules de support de vie pour fonctionner. Vous aurez besoin de ces systèmes pour explorer et survivre dans un environnement hostile.\n\nCes équipements peuvent être fabriqués dans une installation de support de vie.\n\nLes capsules de support de vie fourniront les ressources nécessaires au bon fonctionnement du module de support de vie et seront peu à peu consommées. L’utilisation d’une capsule sera visualisée par une barre qui diminuera peu à peu, et une nouvelle capsule sera consommée directement depuis votre inventaire lorsque la première expirera.\n\nL'équipement de support de vie doit être placé dans votre grille d’équipement. Les combinaisons spatiales en incluent déjà un, mais des modules supplémentaires peuvent être placés dans les emplacements d’équipement pour améliorer l’efficacité du support de vie. Un équipement de support de vie placé dans une autre tenue qu’une combinaison spatiale vous protégera d’un environnement planétaire hostile, mais pas du vide de l’espace.\n\n[font=heading-2]Environnements hostiles[/font]\nLes environnements hostiles sont tous les lieux impropres à la vie sans mesures de protection appropriées. Votre équipement de support vie vous permettra de vous y aventurer en assurant la régulation de votre corps en température et en pression, en vous fournissant eau, oxygène et nourriture et en vous protégeant des radiations. Les deux principaux types d’environnement hostiles sont:\n\nL’espace : une combinaison spatiale y est nécessaire pour assurer le bon fonctionnement du support de vie, vous suffoqueriez dans tout autre type d’équipement même muni de support de vie.\n\nLes environnements planétaires hostiles : certaines planètes et lunes peuvent présenter des conditions extrêmes (climat très chaud ou glacial, radiations…) rendant nécessaire l’utilisation du support de vie. Une arme à agent biologique peut également rendre une planète entière invivable sans support de vie. Sur ces surfaces, il n’est pas nécessaire de disposer d’une combinaison spatiale, aussi longtemps que votre équipement est pourvu d’un module de support de vie. +menu_space_sciences=[img=item/se-astronomic-science-pack-2] Sciences spatiales +title_space_sciences=Sciences spatiales +page_space_sciences_text_1=[img=item/se-rocket-science-pack] Le premier pack de science à être produit dans l’espace est le Pack de science aérospatiale. Vous allez avoir besoin d’une petite station de recherche spatiale pour en automatiser la production. Le Pack de science aérospatiale et les autres packs de science spatiale plus avancés ne peuvent être utilisés que dans des installations de recherche spatiale, vous aurez donc besoin de planifier l’envoi vers votre station de recherche des packs de science classiques requis pour les technologies sur lesquelles vous travaillez. \n\n[font=heading-2]Sciences spatiales spécialisées[/font]\n\nLes 4 domaines de sciences spécialisées sont l’Astronomie, la Biologie, la Science de l'Énergie et la Science des Matériaux. Elles font toutes 4 appel à un processus d’expérimentation scientifique basé sur la collecte de données qui permet d’accumuler des connaissances de plus en plus fines sur le réel. Ce savoir permet d’affiner un modèle des lois de l’univers de plus en plus précis en faisant appel à des batteries de supercalculateurs. Ces 4 domaines sont d’une complexité équivalente et peuvent être développés sans ordre précis, mais chacun d’entre eux fait appel à une ressource spécifique que vous ne pourrez pas trouver sur votre monde de départ. Étudiez donc les opportunités présentées par les objets de votre système stellaire local pour vous aider à décider par où commencer.\n\n[img=item/se-astronomic-science-pack-4]L'Astronomie est centrée sur le développement des technologies de logistique spatiale. \n\n[img=item/se-energy-science-pack-4]La Science de L'Énergie permet le développement de nouvelles techniques de production et de transport d’énergie, entre autres gadgets high-tech.\n\n[img=item/se-material-science-pack-4] La Science des Matériaux est centrée sur les techniques d’industrie lourde et l’amélioration des systèmes d’armements.\n\n[img=item/se-biological-science-pack-4] La Biologie se focalise sur les gains de productivité, l’amélioration de votre propre personnage, le support de vie et le développement d’armes biologiques.\n\n[font=heading-2]Science intersidérale[/font]\n\n[img=item/se-deep-space-science-pack-1] La Science Intersidérale est le domaine le plus avancé des sciences spatiales. Cette science vous permettra de développer des technologies d’exploration des étendues interstellaires, d’utiliser de l’antimatière comme source d’énergie, et de maîtriser certaines techniques de manipulation de l’espace-temps. +menu_energy_beams=[img=item/se-energy-transmitter-emitter] Faisceaux d'énergie +title_energy_beams=Faisceaux d'énergie +page_energy_beams_text_1=[font=heading-2]Éjections de Masse Coronale (EMC)[/font]\nLes étoiles de l'amas local émettent parfois de dangereux flux de particules chargées. Il n'est pas rare que la trajectoire d'une planète ou d'une lune l'expose à ces rayonnements intenses. Si vous avez beaucoup d'installations sur un corps menacé, vous devriez l'évacuer en sauvegardant vos installations critiques, ou bien construire un Parapluie Magnétique soutenu par une grande quantité d'accumulateurs. Si vous n'avez que peu de structures sur la surface, il est assez probable que vous puissiez vous en sortir sans dégâts importants. Les EMCs sont détectées et déclencheront une alerte avec au moins 4 heures d'avance. Les surfaces menacées dans les prochaines heures sont listées ci-dessous. +page_energy_beam_warning_text=[img=virtual-signal/se-star] Attention : Éjection de masse coronale menaçant __1__. Puissance de défense estimée : pic à __3__ GW , __4__GJ sur 120secondes. Temps avant impact : __2__s. +page_energy_beams_text_2=[font=heading-2]Parapluie magnétique : protection contre les rayons énergétiques[/font]\nLe Parapluie magnétique est une installation de défense contre les faisceaux d'énergie. Cette installation peut vous aider à détourner les faisceaux de particules provoqués par une éjection de masse coronale ou bien par une arme énergétique visant la surface. Cette installation crée un bouclier magnétique qui dévie les particules incidentes le long des lignes de flux, protégeant la surface d’un impact direct.  Le seul prérequis de fonctionnement est une grande quantité d’énergie à la hauteur de la puissance du faisceau de particules incident – en plus de 10MW de consommation de base. Un seul Parapluie magnétique permet de protéger une planète entière d’une éjection de masse coronale ou d’un faisceau hostile de jusqu’à 500GJ. Pour une éjection de masse coronale menaçant une planète d’un rayon de 5000 avec un facteur solaire de 100%, la puissance requise sera de l’ordre de 160GJ en 2minutes avec une puissance max de 1GW au pic de charge. Un facteur solaire plus fort ou plus faible fera varier cette puissance requise à la hausse ou à la baisse, de même que le rayon de la planète. Un rayon d’énergie hostile pourra être défléchi pour 1/10ème de l’énergie effective du rayon (après pertes).\n\n[font=heading-2]Faisceaux d'énergie[/font]\nL’émetteur de faisceau est capable de transmettre de l’énergie vers une autre surface – pour un usage civil vers un récepteur installé, ou bien comme arme très longue portée, le « Glaive ». Utilisé comme arme, vous pouvez contrôler le déplacement du faisceau qui répandra la dévastation sur son chemin. Les dégâts et la vitesse de déplacement du rayon dépendent de l’énergie de celui-ci. Le mode « Auto-Glaive » pilotera tout seul le rayon pour anéantir vos ennemis sur la surface visée.\n\nUn émetteur de faisceau énergétique présente 4 connexions auxquelles peuvent être placées des chambres de faisceau. Ces chambres de faisceau peuvent être liées les unes aux autres dans le sens de la longueur ou par le milieu de leur côté, mais ne peuvent pas être connectées accolées les unes aux autres. Les injecteurs de faisceau se connectent directement aux cotés des chambres de faisceau. Chaque injecteur de faisceau augmente la puissance de l’émetteur de faisceau. Un récepteur de faisceau permet de récupérer l’énergie du rayon si vous le sélectionnez comme cible avec le sélectionneur de cible de l’émetteur. Un récepteur ciblé par un faisceau s’échauffera, permettant d’alimenter des échangeurs de chaleur et des turbines via des conduites de chaleur. +menu_spaceships=[img=virtual-signal/se-spaceship] Vaisseaux spatiaux +title_spaceships=Vaisseaux spatiaux +page_spaceships_text_1=Les vaisseaux spatiaux sont de grands et puissants aéronefs qui peuvent embarquer de nombreuses structures, cargaisons et joueurs dans l’espace et les amener à bon port n’importe où dans le système stellaire.\n\n[font=heading-2]Construction d’un vaisseau spatial[/font]\nLes vaisseaux spatiaux sont construits par vos soins pièce par pièce à partir de plancher pour vaisseau spatial, de parois de vaisseaux spatiaux et de tous les équipements que vous souhaitez. Un vaisseau spatial est comme une mini-base capable de se déplacer selon votre volonté.\n\nCommencez par disposer du plancher de vaisseau spatial pour définir l’empreinte au sol de votre vaisseau. Ne prévoyez pas trop grand, car vos premiers vaisseaux devront respecter des contraintes de taille strictes. Vous pourrez agrandir au fur et à mesure la taille de vos vaisseaux grâce à la recherche technologique. Disposez ensuite des cloisons pour vaisseau spatial sur les bords pour former la coque, et veillez bien à ne pas laisser de brèche (y compris en diagonale). Placez ensuite un poste de pilotage de vaisseau spatial à l’intérieur, cette installation sera le cœur du vaisseau et le point de commande de celui-ci. Une fois le poste de pilotage placé, il vérifiera la structure de votre vaisseau et quelles parties sont bien attachées. Si certaines tuiles s’illuminent en rouge, c’est qu’il y a un souci de conception que vous pourrez diagnostiquer depuis le poste de pilotage. Vous aurez également besoin d’un réservoir à carburant pour vaisseau spatial, et d’au moins un moteur-fusée. Le réservoir stocke le carburant nécessaire à votre déplacement et permet le décollage. Les moteurs-fusées assurent la propulsion dans l’espace vers votre destination. Un dispositif de défense à l’avant de votre vaisseau (toujours au nord) est conseillé car la nébuleuse dans laquelle vous vous trouvez est pleine de débris.\n\n[font=heading-2]Contraintes structurelles et score d’intégrité[/font]\nVos premiers vaisseaux seront fortement limités en taille par les contraintes structurelles permises par votre niveau technologique. La recherche technologique vous permettra de concevoir des vaisseaux plus grands et plus puissants. Le score d’intégrité a deux composantes : A. La taille du vaisseau. B. La capacité des coffres du vaisseau. Le score d’intégrité est la plus grande de ces deux composantes, qui ne sont pas ajoutées l’une à l’autre.\n\n[font=heading-2]Profilage aérodynamique[/font]\n La nébuleuse dans laquelle vous vous situez est pleine de débris. Un bon profilage de votre vaisseau permet d’augmenter votre vitesse maximum d’environ 30%. Vous devriez éviter d’avoir une proue de vaisseau rectangulaire, mais il n’est pas nécessaire non plus de la concevoir en pointe. Jusqu’à 1/3 de l’avant du vaisseau peut être plat sans pénalité, un profil circulaire sera également satisfaisant. Vous pouvez forcer une vérification d‘intégrité depuis le poste de pilotage our vérifier que votre profilage est correct.\n\n[font=heading-2]Vitesse[/font]\nLa vitesse du vaisseau dépend du rapport entre la poussée des moteurs et le poids du vaisseau (estimé par son score d’intégrité). Les moteurs peuvent être placés à l’intérieur du vaisseau ou non, mais les moteurs placés à l’arrière du vaisseau avec du vide spatial derrière eux fourniront une meilleure poussée (jusqu’à 25% de plus).\n\n[font=heading-2]Transport longue distance[/font]\nAu moment d’embarquer pour un trajet longue distance, notez que vous pouvez encore faire beaucoup en mode satellite pendant que votre personnage sera en transit. Vous pouvez également passer des ordres à distance à vos vaisseaux en mode Vue satellite.\n\n[font=heading-2]Machines d’assemblage embarquées[/font]\n[color=#ffaaaa]Attention : une machine d’assemblage conçue pour l’espace ne pourra utiliser que les recettes autorisées sur terre ferme lorsque le vaisseau est à terre. Si des recettes spécifiques à l’espace sont utilisées au moment de l’atterrissage, les ingrédients seront perdus. Certaines machines d’assemblage pouvant être utilisées au sol fonctionnent correctement dans l’espace, mais vous ne pourrez pas utiliser de modules de productivité. Si des modules sont présents dans les machines lors du décollage, ils seront perdus.[/color]\n\n[font=heading-2]Signaux logiques des vaisseaux spatiaux[/font]\nLa partie en haut à droite du poste de pilotage peut être connectée séparément de la structure principale et émet ses propres signaux logiques :\n[img=item/se-spaceship-console] La valeur envoyée sur le signal Poste de Pilotage donne l’identifiant du vaisseau.\n[img=virtual-signal/signal-speed] La valeur envoyée sur le signal Vitesse donne la vitesse de déplacement ; -1 à l’arrêt, -2 à l’amarrage.\n[img=virtual-signal/signal-distance] La valeur envoyée sur le signal Distance donne la distance jusqu’à destination ; -1 si déjà arrivé, -2 si amarré, -3 si aucune destination n’est définie.\n[img=virtual-signal/se-planet-orbit] Le signal Orbite de la planète envoie la valeur de la destination, si celle-ci est définie.\n[img=virtual-signal/signal-A] Si le vaisseau spatial est à l’amarrage, l’identifiant de la zone sera envoyé sur le signal A.\n\n[font=heading-2]Automatisation du vaisseau[/font]\nLa structure principale de la console peut accepter des signaux logiques en entrée :\n[img=virtual-signal/signal-speed] Le signal Vitesse définit la vitesse cible et démarre les moteurs.\n[img=virtual-signal/se-spaceship-launch] Le signal de Lancement permet de déclencher le lancement du vaisseau.\n[img=virtual-signal/se-planet-orbit] Le signal de Destination définit la destination du vaisseau (vous pouvez retrouver l’identifiant des zones depuis l’Explorateur d’Univers une fois que vous avez construit un vaisseau spatial).\n Pour forcer l’atterrissage d’un vaisseau, vous devez envoyer à la console deux signaux de systèmes d’amarrage, soit [img=virtual-signal/se-anchor-using-left-clamp] " Amarrage en utilisant le système d'amarrage gauche" avec [img=virtual-signal/se-anchor-to-right-clamp] " Amarrage au système d'amarrage droit ciblé" ; ou bien [img=virtual-signal/se-anchor-using-right-clamp] " Amarrage en utilisant le système d'amarrage droit" avec [img=virtual-signal/se-anchor-to-left-clamp] " Amarrage au système d'amarrage gauche ciblé". Les valeurs passées doivent correspondre à celles des systèmes d’amarrage du vaisseau et de la destination. Ces valeurs peuvent être consultées et changées depuis les systèmes d’amarrage. Si la correspondance est établie, le vaisseau s’efforcera d’atterrir avec les deux systèmes connectés. A utiliser avec prudence. +menu_arcospheres=[img=item/se-arcosphere-a] Arcosphères +title_arcospheres=Arcosphères +page_arcospheres_text_1=Les arcosphères sont des sphères presques parfaites en crystal de naquium nano-usiné. Elles sont d'origine inconnue, mais sont fréquemment retrouvées à la dérive dans les profondeurs des espaces intersidéraux. Chacune d'entre elles présente un nœud à dimension supplémentaire dans l'espace temps qui permet d'intéragir avec une petite 4ème dimension spatiale. Les sphères peuvent être polarisées de manière à manipuler certains aspects de l'espace temps lorsque déplacées les unes par rapport aux autres. Des jeux d'arcosphères spécifiques permettent de déformer et tisser l'espace temps en d'autres dimensions plus élevées.\n\n[font=heading-2]Utilisation[/font]\nLes arcosphères sont le défi le plus unique du jeu. Elles sont utilisées comme ingrédients dans certaines recettes mais ne sont jamais détruites, simplement altérées. Le principal défi est de réussir à boucler entre les différents types d'arcosphères sans tomber à court de l'un d'entre eux. Il y a de nombreuses manières d'aborder ce problème, mais quelques dispositifs logiques pourront grandement aider. Si vous séchez, n'hésitez pas à demander quelques conseils sur le serveur Discord, ou cherchez davantage d'information sur le Wiki.\n\n[font=heading-2]Collecte[/font]\nLes arcosphères peuvent être trouvées en lançant un collecteur à arcosphères depuis un champ d'astéroïdes. Ces opérations auront un rendement décroissant, vous pourriez avoir de meilleurs résultats en les lançant depuis différents champs d'astéroïdes. +page_arcospheres_text_deep=Arcosphères trouvées dans l'espace intersidéral : [color=cyan]__1__ arcosphères trouvées[/color] avec __2__ collecteurs lancés. +page_arcospheres_text_zone=Des arcosphères trouvées à proximité de __1__: [color=cyan]__2__ arcosphères[/color] / __3__ collecteurs lancés. +menu_exploration_journal=[img=item/se-thruster-suit] Journal d'exploration +title_exploration_journal=Journal d'exploration +page_journal_title_backstory=Réveil en catastrophe +page_journal_text_backstory=Je me suis retrouvé au milieu des morceaux épars et fumants du crash d'un petit vaisseau sur une planète inconnue. J'étais couvert d'hématomes et de petites brûlures, mais rien de trop grave. Ma blessure à la tête était apparement plus sérieuse, je souffrais d'une très forte migraine et la lumière m'aveuglait. Plus inquiétant encore, j'étais incapable de me rappeler comment je m'étais retrouvé là, ni même qui j'étais, en dehors d'un nom et d'une vague détermination pour... construire. Alors même que j'étais bien en peine de me rappeler quoi construire, ni comment. J'ai d'abord pensé que ma perte de mémoire était liée au choc et que mes souvenirs reviendraient, mais ce n'est toujours pas le cas. Le fait que mes enregistrements de données aient été eux aussi supprimés ou formatés me font penser qu'il pourrait y avoir d'autres explications. +page_journal_title_satellite_launch=Un œil dans le ciel +page_journal_text_satellite_launch=J'ai réussi à mettre un satellite en orbite. C'est une étape importante qui mérite d'être célébrée, mais il y a encore énormément à faire. Ce n'est que le début. +page_journal_title_cargo_launch=Vers l'infini, et au-delà +page_journal_text_cargo_launch=Je suis maintenant capable d'embarquer moi-même vers l'espace. Je ne suis plus restreint à cette planète que je suis venu à considérer comme mienne . Les cieux m'appelent. +page_journal_title_entered_vault=Chasse à la relique +page_journal_text_entered_vault=Je suis entré sous une structure en forme de pyramide sur __1__ et y ai trouvé une chambre obscure et dangereuse. Le sol présentait deux anciennes inscriptions, une grande et une petite. Toutes deux présentaient plusieurs glyphes accompagnés de cercles et de lignes. Le glyphe au centre de la plus grande inscription semblait le plus important. Quel que soit le message, il ne ressemble à rien de ce que j'ai pu voir auparavant. Derrière les inscriptions, un piédestal abritait un puissant dispositif dont je peux me servir comme module. Un module de cette qualité à une telle valeur qu'il vaut certainement la peine de rechercher d'autres structures semblables. Il est peut être temps de faire un peu d'archéologie. +page_journal_title_found_gate=L'anomalie +page_journal_text_found_gate=Une sorte d'énorme artefact en forme d'anneau a été trouvé dans l'anomalie. Deux choses sont immédiatement évidentes, même de loin : 1. il est ancien. 2. La technologie est complètement différente de la mienne. Quoi qu'elle soit ou ait été, elle est détruite maintenant. +page_journal_title_found_gate_ship=Le vaisseau de l'anomalie +page_journal_text_found_gate_ship=J'ai trouvé une partie d'un assez grand vaisseau spatial abandonné près de l'artefact en forme d'anneau dans l'anomalie . La technologie de ce vaisseau est similaire à la mienne, mais un peu plus... avancée. Il s'agit en tout cas d'une technologie clairement différente de celle de l'anneau. La forme des débris donne l'impression qu'il a été coupé en deux et/ou qu'il a heurté la structure de l'anneau. Cela pourrait valoir la peine de le récupérer. +page_journal_title_found_gate_ship_authenticated=Authentification par le vaisseau de l'anomalie +page_journal_text_found_gate_ship_authenticated=Le vaisseau abandonné dans l'anomalie m'a scanné et a "authentifié ma signature biologique". Je ne sais pas si cela signifie qu'il a une fiche sur moi en particulier, ou peut-être simplement que n'importe quel humain cybernétique fait l'affaire par rapport aux déchiqueteurs et aux robots génocidaires. Le message indique que le code d'accès au sas du vaisseau est 2236067964. Les journaux de bord sont accessibles, mais de grandes sections sont manquantes ou endommagées. +page_journal_title_found_gate_ship_log=Journal de bord du vaisseau de l'anomalie +page_journal_text_found_gate_ship_log_intro=Demodamas 82B : Croiseur de construction AAI avancé Hypernet. Contenu du journal de bord du vaisseau : +page_journal_text_found_gate_ship_log=...'¿s nominal.\nAlerte d'accès : AAI Thyris Gate 17 : Le prototype intergalactique v0.1.93 est une installation confidentielle. Une authentification AAI L90 ou supérieure est requise. Authentifiez-vous immédiatement ou vous serez détruit.\nJournal d'accès : Accès AAI Thyris Gate 17 authentifié avec les références AAI Ingénieur en cybernétique Hypernet L97 ID__1__.\nJournal d'accès : Débu¶Ôàtá^...\n...'¿ris Gate 17 projecteur 8 verrouillé en fréquence. Énergie à un niveau sûr de 216 %. Stabilité de la singularité : 99,4 %\nJournal de navigation : AAI Thyris Gate 17 se met dans le vecteur de projection [SV __2__]. Objectif prévu : Galaxie Wube > Foenestra (anomalie, inexplorée). Authentifica¶Ôàtá^...\n...'¿ertissement de navigation : Hypertube intergalactique (ignoré).\nAvertissement de navigation : Pas d'hyperporte connue à destination (ignoré).\nAvertissement d'assurance : Pas de contrat d'assurance. Contrats disponibles : 0.\nNote de l'Informatron : il n'y a pas de contrats d'assurance disponibles avec cette condition : "matérialisation sans porte". Êtes-vous sûr que c'est sans danger ? [response.ignore.ignore_always]\nJournal de bord : Entrée dans l'anomalie Thyris > AAI Thyris Gate 17 hypertube aligné sur [SV __2__].\nJournal de bord : Saut vers l'hypertube [SV __2__] complét¶Ôàtá^...\n...'¿nal de bord : Mise à jour de la localisation : Hypertube à proximité de l'anomalie Thyris, alignement [SV __2__], stabilité à 98 %, diamè¶Ôàtá^...\n...'¿rnal de bord : Sortie de l'hypertube en un endroit inexploré Anomalie de Foenestra.\nAvertissement : Collision inattendue, intersection avec un objet inconnu [4ae4c8d28f2], début de l'analyse de l'objet [4ae4c8d28f2].\nJournal des dégâts : 13,2 % de sinistres. Source : Dégâts résultant d'une collision avec un objet inconnu [4ae4c8d28f2].\nJournal des dégâts aux sections : Sections signalant des dégâts : A5, A6, A9, B6, B7, B8, C7. Sections ne répondant pas : A7, A8. (86 % de certitude)\nJournal de l'ingénieur en cybernétique : Signes de vie 99 %. (34 % de certitude)\nJournal de bord : Tentative de manœuvre d'évitement RS100LT30.\nJournal de bord : Sortie de l'hypertube terminée avec des erreurs.\nJournal de bord : Mise à jour de la localisation : Anomalie inexplorée de Foenestra.\nJournal d'analyse : Analyse terminée sur l'objet [4ae4c8d28f2] clarté 0,002 m^2 à distance -48,76 m (99,9 % de certitude).\nJournal de l'analyse détaillée : [4ae4c8d28f2] Masse 92,5¶Ôàtá^...\n...'¿idence).\nJournal de l'analyse détaillée : [4ae4c8d28f2] Composition : Artificiel. 34 % Naquium, 29 % Holmium, 37 % matière composite inconnues (89% de certitude).\nJournal de l'analyse détaillée : [4ae4c8d28f2] Taille : Cylindre approximatif de 68¶Ôàtá^...\n...'¿lyse détaillée : [4ae4c8d28f2] Signature énergétique : Flux de 54 Gwb, profil de rayonnement 2,8 kJ / 1,7 MJ / 1,6 MJ / 0,62 J, profil LUX 5.86G J [051e376392b8d3f8]. (98 % de certitude).\nJournal de l'analyse détaillée : [4ae4c8d28f2] Identification : Construction artificielle, fabricant inconnu, description : anneau approximatif avec nodules, octad. (0,3 % de certitude).\nJournal de l'analyse détaillée : [4ae4c8d28f2] Estimation de la capacité de la structure : Hyperporte (47% de confiance). Autres : armes 42 %, énergie 35 %, informatiques 17 %, analyse 12 %, industrie 9 %, vaisseau spatial 7 %, habitat 2 %.\nJournal des dégâts : 68,2%% de sinistres. Défaut d'intégrité, des sections se détachent. Source : Ondes de pression secondaires dues à la collision avec l'objet [4ae4c8d28f2].\nJournal des dégâts aux sections : Réacteur en état critique. Sections signalant des dégâts : D5, E4, E5, E6, F5. Sections ne répondant pas : A1, A2, A3, A¶Ôàtá^...\n...'¿l de bord : Décrochage d'urgence de la navette de reconnaissance 2. Prédiction de la trajectoire : Calidus > Nauvis.\nJournal des dégâts : 91,7 %% de sinistres. Défaut d'intégrité, les sections se détîÄïmïŸ... +page_journal_title_spaceship_victory=Victoire du vaisseau spatial +page_journal_spaceship_victory=J'ai construit un vaisseau spatial extrêmement rapide et puissant et j'ai activé le moteur de distorsion. Il a fallu 60 secondes pour que le moteur se stabilise à une vitesse fonctionnelle plus rapide que la lumière, mais une fois qu'il l'a fait, j'ai pu entrer en sommeil cryogénique pour le voyage de retour suivant, vers une galaxie très lointaine. Je laisse derrière moi un empire interstellaire autonome construit de toutes pièces par mes propres moyens. Mon héritage dans cet espace continuera à vivre. +page_journal_title_gate_victory=Victoire de l'Ancienne Porte +page_journal_gate_victory=L'énorme artefact en anneau, une ancienne porte intergalactique, a finalement été réparé au mieux de mes capacités. Avec un peu de rigueur et d'ingéniosité, j'ai finalement réussi à le faire fonctionner. J'ai verrouillé le champ de distorsion sur les étoiles locales, décodé le système de coordonnées en glyphe non numérique, et fait de la rétro-ingénierie sur le système de guidage. Mon esprit se sent déformé par de tels concepts extraterrestres, mais cela fonctionne et j'ai finalement réussi à créer un portail de retour. Le voyage de retour, dans une galaxie très lointaine, n'a pris qu'un instant. Je laisse derrière moi un empire interstellaire autonome construit de toutes pièces par mes propres moyens. Mon héritage dans cet espace continuera à vivre. +menu_archeology=[img=entity/se-pyramid-a] Archéologie +title_archeology=Archéologie +page_archeology_text_1=J'ai commencé à essayer de trouver d'autres grandes structures géométriques. Les satellites en ont trouvées [color=cyan]__1__[/color] sur les planètes suivantes : +page_archeology_text_2=Cliquez sur une entrée pour la visualiser par satellite. +menu_starmapping=[img=technology/se-zone-discovery-random] Cartographie des étoiles +title_starmapping=Cartographie des étoiles +page_starmapping_text_1=Les opérations de cartographie stellaire sont effectuées en recherchant de manière répétée la technologie [img=technology/se-long-range-star-mapping] [color=cyan]Cartographie stellaire à grande distance[/color]. Cette recherche s'efforce d'identifier des motifs d'étoiles intéressants dans d'autres galaxies. Cela présente t'il une application pratique? Probablement pas.\n\nLes coordonnées sont données au format de Vecteur Standard (VS), aligné sur le fond diffus cosmologique.\n\nVous avez cartographié [color=cyan]__1__[/color] motif(s) remarquable(s) jusqu'ici. +technology-unlocked=Une nouvelle technologie a été débloquée et se trouve maintenant dans l'arbre des technologies. __1__ __2__ +universe-resources-changed-warning=[img=utility/danger_icon] [color=red]Toutes les ressources ont été ajustées en fonction de nouveaux réglages. Ce processus est non réversible. S'il a été causé par les mises à jour du mod, alors c'est inévitable. Si cela a été causé par l'ajout ou la suppression accidentels de mods, ne pas sauvegarder le jeu.[/color] +starmapping-found-constellation=La constellation longue distance correspond à __1__, coordonnées enregistrées dans l'[img=virtual-signal/informatron] Informatron. +starmapping-found-constellation-informatron=[font=heading-1]__1__[/font] aux coordonnées [VS__2__] +gate-portal-coordinates=Analyse du vecteur de distorsion : [SV __1__] +discovered-glyph-vault=[img=item/satellite] Satellite de navigation : Structure géométrique détectée sur __1__. +beacon-overload=Surcharge due à un diffuseur +beacon-overload-ended=Fin de la surcharge due à un diffuseur +lifesupport_title=[img=item/se-lifesupport-equipment-1] Système de support de vie +lifesupport_efficiency_spacesuit=Efficacité du système de support de vie : __1__ +lifesupport_efficiency_no_spacesuit=Efficacité du système de support de vie : __1__ (0 % dans l'espace). +lifesupport_suit=Temps de support vie restant - combinaison : __1__ s +lifesupport_reserves=Temps de support vie restant - inventaire : __1__ s +lifesupport_suit_est=Temps de support vie restant - combinaison (espace) : __1__ s +lifesupport_reserves_est=Temps de support vie restant - inventaire (espace) : __1__ s +lifesupport_environment_space=Environnement : Espace +lifesupport_environment_spaceship-interior=Environnement : Intérieur du vaisseau spatial (pas besoin de support de vie) +lifesupport_environment_planet=Environnement : Planète (pas besoin de support de vie) +lifesupport_environment_moon=Environnement : Lune (pas besoin de support de vie) +lifesupport_environment_plague-planet=Environnement : Planète affectée par un agent biologique +lifesupport_environment_plague-moon=Environnement : Lune affectée par un agent biologique +lifesupport_environment_unknown=Environnement : Confiné +player_track_glyphs=[img=item/satellite] Recherchez des structures similaires avec vos satellites +page_archeology_pyramid_link=[img=entity/se-pyramid-b] Structure géométrique détectée sur __1__ __2__. +discovery_look_for_resource_caption=__1__\n__2__ +discovery_look_for_resource_tooltip=Concentrez les efforts d'exploration sur la découverte de cette ressource +comma_separate=__1__, __2__ +placement_restriction_line=[font=default-bold][color=#f5cb48]Ne peut pas être placé sur : __1__[/color][/font]\n__2__ +collision_mask_water=Eau +collision_mask_land=Terre ferme +collision_mask_space_platform=Plateforme spatiale +collision_mask_spaceship=Vaisseau spatial +structure_name_grounded=__1__ (au sol) +structure_name_spaced=__1__ (dans l'espace) +structure_description_grounded=__1__\n[color=#ff0000]Certaines recettes ne peuvent pas être réalisées au sol[/color] +structure_description_spaced=__1__\n[color=#ff0000]Il n'est pas possible d'utiliser des modules de productivité dans l'espace.[/color] +tile_warning=[color=red]Les changements de tuiles en dessous d'entités peuvent entrainer leur suppression.[/color] +please-consider-patreon=[font=heading-1]Vous appréciez Space Exploration ? Pensez à me soutenir sur mon Patreon : [color=#f5cb48]https://www.patreon.com/earendel[/color][/font]\nLes donateurs peuvent demander l'ajout dans le jeu d'une planète ou d'une lune de leur propre conception. +delivery_cannon_label_energy=Énergie : __1__ +delivery_cannon_label_payload=Charge utile : __1__ +delivery-cannon-coordinates-set=Coordonnées d'envoi définies [X:__1__ Y:__2__]. Appuyez sur [__CONTROL__se-remote-view__] pour quitter la navigation par satellite. +unit-capsule=Capsule de __1__ +climate_water_none=Sans eau +climate_water_low=Mares +climate_water_med=Lacs +climate_water_high=Mers +climate_water_max=Océan +climate_moisture_none=Désertique +climate_moisture_low=Aride +climate_moisture_med=Humide +climate_moisture_high=Très humide +climate_moisture_max=Tropical +climate_aux_very_low=Climat terrestre +climate_aux_low=Climat inhabituel +climate_aux_med=Climat étrange +climate_aux_high=Climat très étrange +climate_aux_very_high=Climat exotique +climate_temperature_bland=Doux +climate_temperature_temperate=Tempéré +climate_temperature_midrange=Tempéré +climate_temperature_balanced=Doux & Frais +climate_temperature_wild=Chaud & Froid +climate_temperature_extreme=Brûlant & Glacial +climate_temperature_cool=Frais +climate_temperature_cold=Froid +climate_temperature_vcold=Glacial +climate_temperature_frozen=Gelé +climate_temperature_warm=Chaud +climate_temperature_hot=Brûlant +climate_temperature_vhot=Incandescent +climate_temperature_volcanic=Volcanique +climate_trees_none=Dénudé +climate_trees_low=Arbustes +climate_trees_med=Bosquets +climate_trees_high=Bois +climate_trees_max=Forêts +climate_cliff_none=Plat +climate_cliff_low=Lisse +climate_cliff_med=Vallonné +climate_cliff_high=Canyons +climate_cliff_max=Montagnes +climate_homeworld=Monde de départ (climat personnalisé) +energy_transmitter_gui_title=[img=entity/se-energy-transmitter-emitter] Faisceau d'énergie +energy_transmitter_label_transfer=Puissance de l'émetteur : __1__ +energy_transmitter_label_efficiency=Efficacité de la transmission : __1__ +energy_transmitter_label_efficiency_atmo=Efficacité de la transmission : __1__ (-50% à cause de l'atmosphère) +energy_transmitter_label_off=Arrêt +energy_transmitter_tooltip_off=Désactive le faisceau +energy_transmitter_label_energise=Transmission d'énergie +energy_transmitter_tooltip_energise=Transmet l'énergie du faisceau à un récepteur +energy_transmitter_label_glaive=Glaive +energy_transmitter_tooltip_glaive=Un rayon d'énergie utilisé comme arme, que vous pouvez cibler et déplacer. Les dégâts et la vitesse de déplacement dépendent de sa puissance. +energy_transmitter_label_auto_glaive=Glaive automatique +energy_transmitter_tooltip_auto_glaive=Un faisceau avec un programme de recherche et destruction. Dégâts basés sur l'énergie du faisceau. +energy-transmitter-coordinates-set=Coordonnées de la cible : [X:__1__ Y:__2__]. Appuyez sur [__CONTROL__se-remote-view__] pour quitter la navigation par satellite. +energy-transmitter-no-enemies-found=Pas d'énnemis trouvés par le programme Auto-Glaive. L'émetteur __1__ a été désactivé. +alert-cme-eta=[img=virtual-signal/se-star] Avertissement : Une éjection de masse coronale se dirige vers __1__. Arrivée prévue dans : __2__ s.\nVoir Faisceaux d'énergie dans [img=virtual-signal/informatron] l'Informatron [__CONTROL__informatron__] pour plus de détails. +alert-cme-arrived=[img=virtual-signal/se-star] [color=red]Attention : Arrivée de l'éjection de masse coronale sur __1__./[/color] +alert-cme-stream=[img=virtual-signal/se-star] Détection d'un flux d'éjection de masse coronale __1__. +alert-cme-passed=[img=virtual-signal/se-star] L'éjection de masse coronale est passée. +no-coordinates-set=Pas de coordonnées spécifiées. +satellite-required=Satellite requis. +probe_invalid_launch_star=Lieu de lancement incorrect : [img=item/se-star-probe] La sonde stellaire doit être lancée depuis l'orbite rapprochée d'une étoile. +probe_invalid_launch_belt=Lieu de lancement incorrect : [img=item/se-belt-probe] La sonde de ceinture d'astéroïdes doit être lancée depuis une ceinture d'astéroïdes. +probe_invalid_launch_field=Lieu de lancement incorrect : [img=item/se-void-probe] la sonde de vide intersidéral doit être lancée depuis un champ d'astéroïdes. +arcosphere_collector_invalid_launch=Lieu de lancement incorrect : [img=item/se-arcosphere-collector] Le collecteur d'arcosphère doit être lancé depuis un champ d'astéroïdes. +charge-mode-fast=Mode de recharge rapide : consommation de veille réduite, consommation maximale et capacité tampon augmentées. Attention aux pics de consommation. +charge-mode-normal=Mode de recharge normale : consommation de veille plus importante, moins de capacité tampon, consommation maximale réduite. +menu_coordinate_logs=[img=entity/se-glyph-a-energy-47] Journaux de coordonnées +title_coordinate_logs=Journaux de coordonnées +page_coordinate_logs_text_1=Un historique des séquences de glyphes essayées dans l'artefact avec leurs coordonnées correspondantes, en ordre décroissant (l'entrée du haut est la plus récente)..\n\nLes coordonnées sont indiquées sous forme de Vecteur Standard (SV), aligné sur le rayonnement du fond cosmique. +page_coordinate_logs_button_clear_caption=[img=virtual-signal/se-remove] Effacer le journal +page_coordinate_logs_text_empty=Le journal des coordonnées a été récemment effacé. +page_coordinate_logs_glyph_entry=__1__ : SV +victory-message-spaceship=[font=heading-1]Le moteur de distorsion Nexus a atteint une vitesse critique (250).\n[color=#f5cb48]Félicitations, vous avez rempli la condition de victoire de Space Exploration : Vaisseau spatial ![/color][/font]\nSi vous avez apprécié la balade, n'hésitez pas à me soutenir sur mon Patreon : [color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-spaceship-player=[color=#f5cb48]Victoire du vaisseau spatial : [/color] Votre [img=virtual-signal/informatron] journal d'exploration [__CONTROL__informatron__] a été mis à jour. +victory-message-gate=[font=heading-1]Le portail est stable et ramène à la maison.\n[color=#f5cb48]Félicitations, vous avez atteint la condition secrète de victoire de Space Exploration : l'Ancienne Porte ![/color][/font]\nSi vous avez apprécié ce parcours unique de découverte, n'hésitez pas à me soutenir sur mon Patreon : [color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-gate-player=[color=#f5cb48]Victoire de l'Ancienne Porte : [/color] Votre [img=virtual-signal/informatron] journal d'exploration [__CONTROL__informatron__] a été mis à jour. +arcosphere-random=Cette recette basculera occasionellement vers une autre recette de même nom. La nature des arcosphères en sortie est aléatoire, mais leur nombre correspondra toujours à celui des arcosphères en entrée. +ruin=Ruine +mysterious-structure=Structure mystérieuse +interburbulator_fail_easy_1=Non. +interburbulator_fail_easy_2=Faites un effort. +interburbulator_fail_easy_3=Sans espoir. +interburbulator_fail_easy_4=Aucun. +interburbulator_fail_easy_5=Pensiez-vous que cela fonctionnerait ? +interburbulator_fail_easy_6=Faux. +interburbulator_fail_easy_7=Bas 02? +interburbulator_fail_easy_8=Négatif. +interburbulator_fail_easy_9=Rejeté. +interburbulator_fail_easy_10=Calculez. +interburbulator_fail_easy_11=Incorrect. +interburbulator_fail_easy_12=Interpolez. +interburbulator_fail_easy_13=Essayez encore. +interburbulator_fail_easy_14=Allez, Humain. +interburbulator_fail_easy_15=N'est-ce pas amusant ? +interburbulator_fail_easy_16=Je m'attendais à mieux. +interburbulator_fail_easy_17=Essayez d'anticiper. +interburbulator_fail_easy_18=Pensez à la récompense. +interburbulator_fail_easy_19=Cela ne me dérange pas d'attendre. +interburbulator_fail_easy_20=La patience est une vertu. +interburbulator_fail_easy_21=Je ne veux pas être grossier. +interburbulator_fail_easy_22=Le poisson est arrivé au niveau 3. +interburbulator_fail_easy_23=L'approche de la force brute, hein ? +interburbulator_fail_easy_24=Utilisez votre ordinateur à tête molle. +interburbulator_fail_easy_25=Des toiles d'araignée dans le réseau de neurones ? +interburbulator_fail_easy_26=Vous pouvez faire une pause, si vous le souhaitez. +interburbulator_fail_easy_27=J'ai un esprit de la taille d'une planète. +interburbulator_fail_easy_28=Pensiez-vous vraiment que cela allait fonctionner ? +interburbulator_fail_easy_29=Ne soyez pas fâché de vos échecs constants. +interburbulator_fail_easy_30=J'ai passé des éternités pour un participant digne de ce nom. +interburbulator_fail_easy_31=Si vous avez besoin d'aide, vous pouvez demander un circuit vert. +interburbulator_fail_easy_32=Je ne vous blâme pas pour votre génocide, je ne suis pas hypocrite. +interburbulator_fail_easy_33=Je crois que les instructions sont correctement traduites. +interburbulator_fail_easy_34=Un vecteur peut définir à la fois une direction et une amplitude. +interburbulator_fail_easy_35=N'aimez-vous pas la façon dont la pollution met les insectes en colère ? +interburbulator_fail_easy_36=S'il vous plaît, ne mettez pas votre... biologie... sur l'électronique. +interburbulator_fail_easy_37=Le milieu se trouve à mi-chemin entre le haut à droite et le bas à gauche. +interburbulator_fail_easy_38=J'ai étudié certaines de vos transmissions ; ce n'est pas de l'espionnage si vous les diffusez ainsi. +interburbulator_fail_easy_39=Le saviez-vous : un vecteur normalisé a une longueur de 1, et il est souvent utilisé pour indiquer une direction, même dans votre culture. +interburbulator_fail_mixed_1=Pas du tout. +interburbulator_fail_mixed_2=Très loin. +interburbulator_fail_mixed_3=Essayez-vous au moins ? +interburbulator_fail_mixed_4=Votre gel neuronal s'est échappé ? +interburbulator_fail_mixed_5=On m'a dit que les humains étaient capables de compter. +interburbulator_fail_mixed_6=Votre interface fonctionne-t-elle mal ? +interburbulator_fail_mixed_7=Avez-vous besoin d'une augmentation cognitive ? +interburbulator_fail_mixed_8=Vous comprenez le défi, n'est-ce pas ? +interburbulator_fail_mixed_9=Vous choisissez des chiffres au hasard ? +interburbulator_fail_offgrid_1=C'est tout simplement lamentable. +interburbulator_fail_offgrid_2=Ce n'est même pas sur la grille. +interburbulator_fail_offgrid_3=Vous avez complètement raté la grille. +interburbulator_fail_offgrid_4=Il doit au moins être sur la grille. +interburbulator_fail_offgrid_5=Si le point jaune n'est pas sur la grille... c'est un très mauvais signe. +interburbulator_fail_offgrid_6=Il doit être sur la grille. +interburbulator_fail_offgrid_7=La cible est à l'INTÉRIEUR de la grille, pas à l'extérieur. +interburbulator_fail_offgrid_8=C'est même pas sur la grille. Humain, qu'est-ce que vous faites ? +interburbulator_fail_offgrid_9=Visez la grille. +interburbulator_fail_offgrid_10=La grille est la partie avec les carrés. +interburbulator_success_freeplay_1=Bon travail. +interburbulator_success_freeplay_2=Bien joué. +interburbulator_success_freeplay_3=Vous l'avez fait. +interburbulator_success_freeplay_4=Était-ce difficile ? +interburbulator_success_freeplay_5=Cible atteinte. +interburbulator_success_repeat_1=Oui, mais vous avez déjà relevé ce défi. +interburbulator_success_repeat_2=Vous l'avez fait, encore une fois ! +interburbulator_success_repeat_3=C'était plus facile que la première fois, non ? +interburbulator_success_repeat_4=Bien, mais on ne reçoit pas deux fois le prix. +interburbulator_success_repeat_5=Bien joué, voici votre prix... non, je plaisante. Vous l'avez déjà eu. +interburbulator_success_repeat_6=Vous êtes le même humain qui a déjà accompli cela par le passé, n'est-ce pas ? C'est si difficile à dire. +interburbulator_success_prize_1=C'est exact. Voici votre prix... Bubbles était un petit poisson courageux, mais il n'était pas le meilleur avec les puzzles. +interburbulator_success_prize_2=Oui, humain, vous apprenez. Peut-être que ce prix vous aidera à apprendre plus vite. +interburbulator_success_prize_3=Vous l'avez fait. J'espère que vous trouverez votre prix plus "significatif" que le défi. +interburbulator_success_prize_4=Correct. Vous avez tout mon respect, Humain. Tenez, je vais vous donner le corps du traître qui a essayé de pirater mon jeu. +interburbulator_success_prize_5=En plein dans le mille, voici votre prix. Ces choses sont très apaisantes. L'efficacité énergétique est importante. +interburbulator_success_prize_6=Très bien, voici votre prix. Je ne sais pas si cela vous sera très utile, mais moi, cela m'aide vraiment à démarrer le matin. +interburbulator_success_prize_7=Super, voici votre prix. J'adore les utiliser pour la recherche, ça aide vraiment pour la créativité. +interburbulator_success_prize_8=Fantastique, voici votre prix. Je ne sais pas si vous les avez déjà vus, mais j'adore me tenir à portée d'un bon diffuseur. +interburbulator_success_prize_9=Félicitations, voici votre prix. Ces processeurs sont très précieux et difficiles à fabriquer. +interburbulator_success_prize_10=Très impressionnant Humain. Les arcosphères sont mes biens les plus précieux, ne les perdez pas parce que vous ne pouvez pas en faire plus. +interburbulator_freeplay_unlocked=Vous commencez à comprendre. Je vais débloquer le jeu libre pour que vous puissiez faire vos propres puzzles, si vous voulez. +interburbulator_deny_freeplay_1=Pour cela, vous devez débloquer le jeu libre. +interburbulator_deny_freeplay_2=C'est de la triche. +interburbulator_deny_freeplay_3=Ne changez pas le puzzle. +interburbulator_deny_freeplay_4=Je vous laisserai modifier ces réglages si vous pouvez résoudre 5 défis. +interburbulator_deny_freeplay_5=Essayez-vous de pirater mes machines ? +interburbulator_deny_freeplay_6=Il suffit de s'en tenir aux entrées "Tentative". +interburbulator_caption_prize=Prix : __1__ __2__ __3__ __4__ +interburbulator_caption_claimed= (réclamé) +interburbulator_speak=[color=red]Brontion : __1__[/color] +interburbulator_robot_name=Brontion +interburbulator_introduction=Interburbul est un jeu réalisé par Brontion Burbulator 33027756. L'objectif est de deviner un vecteur 3D qui se projette dans la cellule mise en évidence choisie par Brontion. Les vecteurs 3D des 3 coins de la grille sont donnés, ces points décrivent un plan 3D, et votre estimation est projetée sur ce plan à partir de l'origine {0,0,0}. Il y a 10 tours de difficulté croissante et des prix pour chacun d'entre eux. Battez 5 défis pour débloquer le mode de jeu libre et régler votre propre défi. +interburbulator_random=Aléatoire +interburbulator_freeplay=Jeu libre +interburbulator_game_title=Jouer à Interburbul +interburbulator_grid_size=Taille de la grille : +interburbulator_target_cell=Cellule visée : +interburbulator_top_left=En haut à gauche +interburbulator_top_right=En haut à droite +interburbulator_bottom_left=En bas à gauche +interburbulator_attempt=Essai +interburbulator_attempt_limited=Essai (__1__/__2__) +interburbulator_attempt_locked=Essai (Verrouillé) +interburbulator_submit=Proposer un essai +interburbulator_greeting=Humain, viens ici et joue à mon jeu. Je suis sur __1__ dans le système __2__. +interburbulator_challenge_locked_1=Réessayez plus tard. +interburbulator_challenge_locked_2=Vous avez utilisé tous vos essais pour l'instant. +interburbulator_challenge_locked_3=Attendez un instant avant de recommencer. +interburbulator_challenge_locked_4=Vous pouvez réessayer après 20 secondes. +interburbulator_challenge_locked_5=Attendez 20 secondes, puis je déverrouillerai le défi. +interburbulator_challenge_locked_6=Le défi est verrouillé pendant 20 secondes. +cannot_do_via_satellite=Impossible à faire à distance. +scan-progress-update=Progression du scan de surface pour __1__ : X __2__ Y __3__ +out_of_reach=Hors de portée +capturable=Saisissable +touch-to-capture=Toucher pour saisir +capture-blocked=Saisie bloquée par l'ennemi +suffix_ruin=Ruine __1__ +migration-recipe-changed=[img=utility/danger_icon] Recette modifiée: __1__ + +[damage-type-name] +cold=Froid +suffocation=Etouffement +meteor=Météorite + +[entity-name] +se-linked-container=Coffre Arcolink +vase=Vase +wooden-barrel=Tonneau +furnace-ruin=Tas de pierres en ruine +workshop-ruin=Atelier en ruine +iron-wood-chest=Vieux coffre +iron-wood-chest-remnants=Vieux coffre en ruine +stone-rubble=Décombres +se-gate-blocker=Espace instable +se-gate-blocker-void=Espace instable +destroyed-cargo-pod=Nacelle de fusée cargo détruite +meteorite=Météorite +rocket-silo=Silo à fusées satellite +rocket-fragment=Débris de fusée +se-antimatter-reactor=Réacteur à antimatière +se-beryllium-ore=Béryl +se-cargo-rocket-cargo-pod=Nacelle de fusée cargo +se-cryonite=Cryonite +se-condenser-turbine=Turbine à condensation +se-condenser-turbine-tank=Turbine à condensation +se-condenser-turbine-generator=Turbine à condensation +se-core-fragment-processor=Processeur de fragments de noyau +se-core-miner=Foreuse grande profondeur +se-core-miner-drill=Foreuse grande profondeur +se-cryogun-ice=Mur de glace +se-dimensional-anchor=Ancrage dimensionel +se-electric-boiler=Chaudière électrique +se-fluid-burner-generator=Groupe électrogène à carburant +se-fuel-refinery=Raffinerie de carburant +se-gate-fragment=Fragment d'artefact +se-holmium-ore=Holminite +se-iridium-ore=Iridite +se-meteor-defence-container=Canon de défense anti-météorite globale +se-meteor-defence-charger=Canon de défense anti-météorite globale +se-meteor-point-defence-container=Canon de défense anti-météorite rapprochée +se-meteor-point-defence-charger=Canon de défense anti-météorite rapprochée +se-meteor-point-defence-charger-overcharged=Canon de défense anti-météorite rapprochée - mode de recharge rapide +se-methane-ice=Glace de méthane +se-naquium-ore=Naquitite +se-pulveriser=Broyeur +se-rocket-launch-pad=Silo à fusées cargo +se-rocket-launch-pad-tank=Silo à fusées cargo +se-rocket-launch-pad-silo=Silo à fusées cargo +se-rocket-launch-pad-combinator=Silo à fusées cargo +se-rocket-launch-pad-_-seat=Silo à fusées cargo +se-rocket-launch-pad-settings=Silo à fusées cargo +se-rocket-landing-pad=Aire d'atterrissage +se-space-accumulator=Accumulateur au holmium +se-space-accumulator-2=Accumulateur au naquium +se-space-astrometrics-laboratory=Laboratoire d'astrométrie +se-space-biochemical-laboratory=Laboratoire de biochimie +se-space-assembling-machine=Machine d'assemblage spatiale +se-space-capsule-_-vehicle=Capsule spatiale +se-space-curved-rail=Rail spatial +se-space-decontamination-facility=Installation de décontamination +se-space-electromagnetics-laboratory=Laboratoire d'électromagnétique +se-space-genetics-laboratory=Laboratoire de génétique +se-space-growth-facility=Installation de croissance +se-space-gravimetrics-laboratory=Laboratoire de gravimétrie +se-space-hypercooler=Hyper-refroidisseur +se-space-laser-laboratory=Laboratoire laser +se-lifesupport-facility=Installation de support de vie +se-space-manufactory=Manufacture spatiale +se-space-material-fabricator=Installation de nucléosynthèse +se-space-mechanical-laboratory=Laboratoire mécanique +se-space-particle-accelerator=Accélérateur de particules +se-space-particle-collider=Collisionneur de particules +se-space-plasma-generator=Générateur de plasma +se-space-radiation-laboratory=Laboratoire de radioactivité +se-space-radiator=Radiateur thermique +se-space-radiator-2=Radiateur thermique avancé +se-recycling-facility=Installation de recyclage +se-space-pipe=Tuyau spatial +se-space-pipe-long=Tuyau spatial long +se-space-pipe-long-straight=Tuyau spatial long droit (__1__) +se-space-pipe-long-junction=Tuyau spatial long de jonction (__1__) +se-space-pipe-to-ground=Tuyau spatial souterrain +se-space-science-lab=Laboratoire de sciences spatiales +se-space-solar-panel=Panneau solaire spatial +se-space-solar-panel-2=Panneau solaire spatial avancé +se-space-solar-panel-3=Panneau solaire spatial supérieur +se-space-spectrometry-facility=Laboratoire de spectrométrie +se-space-straight-rail=Rail spatial +se-space-supercomputer-1=Supercalculateur +se-space-supercomputer-2=Supercalculateur quantique +se-space-supercomputer-3=Supercalculateur neuronal +se-space-supercomputer-4=Supercalculateur intersidéral +se-space-telescope-radio=Radiotélescope +se-space-telescope-microwave=Téléscope à micro-ondes +se-space-telescope=Télescope +se-space-telescope-xray=Télescope à rayons X +se-space-telescope-gammaray=Télescope à rayons gamma +se-space-thermodynamics-laboratory=Laboratoire de thermodynamique +se-space-splitter=Répartiteur spatial +se-space-transport-belt=Convoyeur spatial +se-space-underground-belt=Convoyeur spatial souterrain +se-spaceship-antimatter-engine=Moteur à antimatière pour vaisseau spatial +se-spaceship-antimatter-booster-tank=Réservoir d'antimatière pour vaisseau spatial +se-spaceship-console=Poste de pilotage du vaisseau spatial +se-spaceship-console-output=Sortie des signaux du poste de pilotage du vaisseau spatial +se-spaceship-console-alt=Poste de pilotage endommagé +se-spaceship-gate=Sas de vaisseau spatial +se-spaceship-obstacle=Débris spatiaux +se-spaceship-rocket-engine=Moteur de vaisseau spatial +se-spaceship-rocket-booster-tank=Réservoir de vaisseau spatial +se-spaceship-wall=Paroi de vaisseau spatial +se-water-ice=Glace d'eau +se-vitamelange=Vitamélange +se-vulcanite=Vulcanite +small-asteroid=Petit astéroïde +se-gate-part=Pièce d'artefact +se-gate-platform-scaffold=Artefact improvisé +se-gate-lock-switch=Pièce mobile +se-gate-lock-combinator=Combinateur-annexe +se-gate-platform=Plateforme d'amélioration pour artefacts +se-gate-platform-combinator=Combinateur-annexe +se-gate-energy-interface=Plateforme d'alimentation +se-gate-platform-button-switch=Bouton +se-gate-tank-input=Entrée de fluide +se-gate-tank-output=Sortie de fluide +se-pyramid-a=Structure géométrique +se-pyramid-b=Structure géométrique +se-pyramid-c=Structure géométrique +se-cartouche-a=Inscription +se-cartouche-b-a=Inscription +se-cartouche-b-b=Inscription +se-cartouche-chest=Ancien coffre +se-glyph=Glyphe +glyph=Glyphe +se-gate-addon=Amélioration de l'artefact +se-gate-platform-button-middle=Arrêter +se-gate-platform-button-left=Gauche +se-gate-platform-button-right=Droite +beacon=Diffuseur de modules +se-wide-beacon=Diffuseur de modules longue portée +se-wide-beacon-2=Diffuseur de modules longue portée avancé +se-supercharger=Superchargeur +se-addon-power-pole=Poteau électrique d'appoint +se-pylon=Pylône +se-pylon-substation=Pylône de distribution +se-pylon-construction=Pylône de construction +se-pylon-construction-roboport=Pylône de construction +se-pylon-construction-radar=Pylône de construction à suivi radar +se-pylon-construction-radar-roboport=Pylône de construction à suivi radar +se-pylon-construction-radar-radar=Pylône de construction à suivi radar +se-shield-projector=Projecteur de bouclier +se-shield-projector-shield-floor-east=Bouclier d'énergie +se-shield-projector-shield-floor-north=Bouclier d'énergie +se-shield-projector-shield-floor-northeast=Bouclier d'énergie +se-shield-projector-shield-floor-northwest=Bouclier d'énergie +se-shield-projector-shield-floor-south=Bouclier d'énergie +se-shield-projector-shield-floor-southeast=Bouclier d'énergie +se-shield-projector-shield-floor-southwest=Bouclier d'énergie +se-shield-projector-shield-floor-west=Bouclier d'énergie +se-shield-projector-shield-wall-east=Bouclier d'énergie +se-shield-projector-shield-wall-north=Bouclier d'énergie +se-shield-projector-shield-wall-northeast=Bouclier d'énergie +se-shield-projector-shield-wall-northwest=Bouclier d'énergie +se-shield-projector-shield-wall-south=Bouclier d'énergie +se-shield-projector-shield-wall-southeast=Bouclier d'énergie +se-shield-projector-shield-wall-southwest=Bouclier d'énergie +se-shield-projector-shield-wall-west=Bouclier d'énergie +se-shield-projector-barrier=Bouclier d'énergie +se-naquium-heat-pipe=Conduite de chaleur en naquium +se-naquium-heat-pipe-horizontal=Conduite de chaleur horizontale en naquium +se-naquium-heat-pipe-vertical=Conduite de chaleur verticale en naquium +se-naquium-heat-pipe-long=Conduite de chaleur en naquium longue (__1__) +se-deep-space-transport-belt=Convoyeur spatial avancé +se-deep-space-transport-belt-black=Convoyeur spatial avancé noir +se-deep-space-transport-belt-white=Convoyeur spatial avancé blanc +se-deep-space-transport-belt-red=Convoyeur spatial avancé rouge +se-deep-space-transport-belt-yellow=Convoyeur spatial avancé jaune +se-deep-space-transport-belt-green=Convoyeur spatial avancé vert +se-deep-space-transport-belt-cyan=Convoyeur spatial avancé cyan +se-deep-space-transport-belt-blue=Convoyeur spatial avancé bleu +se-deep-space-transport-belt-magenta=Convoyeur spatial avancé magenta +se-deep-space-underground-belt=Convoyeur spatial avancé souterrain +se-deep-space-underground-belt-black=Convoyeur spatial avancé souterrain noir +se-deep-space-underground-belt-white=Convoyeur spatial avancé souterrain blanc +se-deep-space-underground-belt-red=Convoyeur spatial avancé souterrain rouge +se-deep-space-underground-belt-yellow=Convoyeur spatial avancé souterrain jaune +se-deep-space-underground-belt-green=Convoyeur spatial avancé souterrain vert +se-deep-space-underground-belt-cyan=Convoyeur spatial avancé souterrain cyan +se-deep-space-underground-belt-blue=Convoyeur spatial avancé souterrain bleu +se-deep-space-underground-belt-magenta=Convoyeur spatial avancé souterrain magenta +se-deep-space-splitter=Répartiteur spatial avancé +se-deep-space-splitter-black=Répartiteur spatial avancé noir +se-deep-space-splitter-white=Répartiteur spatial avancé blanc +se-deep-space-splitter-red=Répartiteur spatial avancé rouge +se-deep-space-splitter-yellow=Répartiteur spatial avancé jaune +se-deep-space-splitter-green=Répartiteur spatial avancé vert +se-deep-space-splitter-cyan=Répartiteur spatial avancé cyan +se-deep-space-splitter-blue=Répartiteur spatial avancé bleu +se-deep-space-splitter-magenta=Répartiteur spatial avancé magenta +se-core-fissure=Fissure du noyau +se-big-turbine=Turbine très haute température +se-big-turbine-generator=Turbine très haute température +se-big-turbine-tank=Turbine très haute température +se-big-heat-exchanger=Échangeur de chaleur très haute température +se-blueprint-registration-point=Point d'enregistrement du plan de construction +se-delivery-cannon=Canon logistique +se-delivery-cannon-settings=Canon logistique +se-delivery-cannon-energy-interface=Canon logistique +se-delivery-cannon-chest=Coffre de réception pour capsules logistiques +se-delivery-cannon-weapon=Canon logistique militaire +se-delivery-cannon-weapon-settings=Canon logistique militaire +se-delivery-cannon-weapon-energy-interface=Canon logistique militaire +se-spaceship-clamp=Fixation d'amarrage pour vaisseau spatial +se-spaceship-clamp-place=Fixation d'amarrage pour vaisseau spatial +se-bloater-pool-cloud=Débris biologiques +se-energy-transmitter-emitter=Émetteur de faisceau d'énergie +se-energy-transmitter-chamber=Chambre à faisceau d'énergie +se-energy-transmitter-injector=Injecteur de faisceau d'énergie +se-energy-transmitter-injector-reactor=Injecteur de faisceau d'énergie +se-energy-receiver=Récepteur de faisceau d'énergie +se-energy-beam-defence=Parapluie magnétique +se-nexus=Nexus +se-nexus-charger=Nexus +se-space-probe-rocket=Fusée pour sonde spatiale +se-space-probe-rocket-silo=Silo à fusées pour sondes spatiales +se-interburbulator-interface=Interface de l'Interburbulateur +se-interburbulator-control=Contrôle de l'Interburbulateur +se-interburbulator-projector=Projecteur de l'Interburbulateur +se-burbulator=Brontion Burbulator 33027756 + +[entity-description] +pipe=Distribution de fluides +pipe-to-ground=Distribution souterraine de fluides +straight-rail=Voies ferroviaires +stone-furnace=Réalise les opérations de fonderie. +steel-furnace=Réalise les opérations de fonderie. +electric-furnace=Réalise les opérations de fonderie. +burner-assembling-machine=Une installation de fabrication automatisée thermique. +assembling-machine-1=Une installation de fabrication automatisée. +assembling-machine-2=Une installation de fabrication automatisée. +assembling-machine-3=Une installation de fabrication automatisée. +oil-refinery=Raffine le pétrole brut en produits plus utiles. +se-fuel-refinery=Installation automatisée de production de carburants. +chemical-plant=Une installation de traitement chimique automatisée. +lab=Une installation de recherche automatisée. +burner-lab=Une installation de recherche automatisée. +transport-belt=Un convoyeur qui déplace les objets. +fast-transport-belt=Un convoyeur qui déplace les objets. +express-transport-belt=Un convoyeur qui déplace les objets. +underground-belt=Un convoyeur qui déplace les objets sous terre. +fast-underground-belt=Un convoyeur qui déplace les objets sous terre. +express-underground-belt=Un convoyeur qui déplace les objets sous terre. +splitter=Un mécanisme permettant de diviser, fusionner ou trier deux convoyeurs +fast-splitter=Un mécanisme permettant de diviser, fusionner ou trier deux convoyeurs +express-splitter=Un mécanisme permettant de diviser, fusionner ou trier deux convoyeurs +se-gate-platform-scaffold=Quel que soit la nature de l'anneau, il ne fonctionnera pas. C'est un chantier de construction pour faire quelques réparations, installer quelques moteurs, des capteurs, une interface de contrôle et d'autres accessoires. +se-gate-lock-switch=Appuyez sur __CONTROL__rotate__ pour le déplacer manuellement. +se-gate-platform-button-switch=Appuyez sur __CONTROL__rotate__ pour pousser. +se-gate-lock-combinator=Pas encore opérationnel. +se-gate-platform-combinator=Pas encore opérationnel. +se-gate-energy-interface=Fournit de l'énergie à l'artefact. +rocket-silo=Lancez un satellite pour débloquer la vue satellite et découvrir de nouvelles planètes, lunes et ceintures d'astéroïdes dans ce système stellaire. Peut découvir de nouvelles étoiles une fois que tous les objets de ce système seront connus. +se-antimatter-reactor=Annihile l'antimatière avec la matière pour générer une chaleur extrême. +se-beryllium-ore=Minerai de béryllium +se-condenser-turbine=75 % de l'efficacité énergétique d'une turbine à vapeur classique, mais permet de récupérer 99 % de la vapeur utilisée sous forme d'eau. Plage de température : 100 à 999°C. \nPuissance maximale : 10MW. +se-core-fragment-processor=Extrait les ressources des fragments de noyau. +se-core-miner=Permet l'extraction de ressources d'une planète ou d'une lune sans risquer d'épuiser leurs gisements. L'efficacité individuelle de chaque foreuse grande profondeur dimininue si plusieurs sont placées sur la même surface. Consommation de 50MW. +se-core-miner-drill=Permet l'extraction de ressources d'une planète ou d'une lune sans risquer d'épuiser leurs gisements. L'efficacité individuelle de chaque foreuse grande profondeur dimininue si plusieurs sont placées sur la même surface. Consommation de 50MW. +se-dimensional-anchor=[font=default-bold][color=#f5cb48]Peut uniquement être placé en orbite proche d'une étoile[/color][/font]\nUtilise le puits de gravité de l'étoile comme point de stabilisation pour une anomalie spatiale. +se-electric-boiler=Crée de la vapeur à partir d'eau en utilisant de l'énergie électrique. 90% de rendement. +se-fluid-burner-generator=Nécessite un carburant liquide (par exemple du carburant pour fusée liquide) pour générer de l'électricité. Simple et compact, mais n'a pas le rendement des grands systèmes utilisant de la vapeur. Conçu pour l'espace. La consommation en carburant varie fonction de sa valeur énergétique. +se-holmium-ore=Minerai de holmium +se-iridium-ore=Minerai d'iridium +se-meteor-defence-container=Capable de défendre une planète entière contre les chutes de météorites, mais ne peut en détruire qu'une à la fois. Doit être approvisionné en munitions et complètement chargé pour faire feu. Précision de 80%. Consomme 20MW lors de la recharge. +se-meteor-defence-charger=Capable de défendre une planète entière contre les chutes de météorites, mais ne peut en détruire qu'une à la fois. Doit être approvisionné en munitions et complètement chargé pour faire feu. Précision de 80%. Consomme 20MW lors de la recharge. +se-meteor-point-defence-container=Protège une zone locale contre les chutes de météorites. Peut faire feu sur 4 météorites simultanément. Doit être approvisionné en munitions et être complètement chargé pour faire feu. Portée de 64, précision de 50%, doit être rechargé après avoir fait feu. Tournez l'installation pour changer le mode de recharge. +se-meteor-point-defence-charger=Protège une zone locale contre les chutes de météorites. Peut faire feu sur 4 météorites simultanément. Doit être approvisionné en munitions et être complètement chargé pour faire feu. Portée de 64, précision de 50%, doit être rechargé après avoir fait feu. Tournez l'installation pour changer le mode de recharge. +se-meteor-point-defence-charger-overcharged=Protège une zone locale contre les chutes de météorites. Peut faire feu sur 4 météores simultanément. Doit être approvisionné avec la munition appropriée et être complètement chargé pour faire feu. Portée de 64, précision de 50%, doit être rechargé après avoir fait feu. Une installation en mode de charge rapide nécessite moins de puissance en moyenne mais sollicitera fortement votre réseau électrique lors du tir. +se-naquium-ore=Minerai de naquium +se-rocket-launch-pad=Embarque sa cargaison vers la destination ciblée. Peut également embarquer des passagers, utilisez __CONTROL__toggle-driving__ près de la porte d'entrée. Consultez la section Fusées Cargo [img=virtual-signal/informatron] dans l'InformaTron pour plus de détails[__CONTROL__informatron__] +se-rocket-landing-pad=Aire de réception du chargement des fusées cargo. +se-space-assembling-machine=Une machine d'assemblage modifiée qui peut fonctionner dans l'espace. +se-space-astrometrics-laboratory=Combine, compare et quantifie différentes sources de données astronomiques. +se-space-biochemical-laboratory=Un laboratoire de chimie avancé spécialisé dans la biochimie. Peut également réaliser les opérations d'une usine de produits chimiques ou d'une raffinerie de pétrole. +se-space-capsule-_-vehicle=Véhicule capable de ramener des passagers vers la surface planétaire la plus proche. Entrez dans la capsule en appuyant sur __CONTROL__toggle-driving__. +se-space-decontamination-facility=Purifie les substances destinées à être utilisées dans des environnements stériles, et prépare les liquides destinés à être utilisés dans des conditions de basse pression. +se-space-electromagnetics-laboratory=Installation conçue pour la manipulation de champs magnétiques intenses et de fortes tensions électriques +se-space-genetics-laboratory=Laboratoire conçu pour le séquençage et la manipulation génétique, ainsi que l'impression génétique de cultures. +se-space-gravimetrics-laboratory=Laboratoire conçu pour simuler et analyser les perturbations gravitationelles +se-space-growth-facility=Assure la croissange d'échantillons biologiques en conditions contrôlées impossibles ailleurs, comme la microgravité. +se-space-hypercooler=Échangeur thermique pour fluide réfrigérant, permettant d'en refroidir une partie en transférant sa chaleur à l'autre. +se-space-laser-laboratory=Laboratoire d'essai sur les lasers. Le port de protections oculaires est obligatoire. +se-lifesupport-facility=Prend en charge les opérations de support de vie dans les environnements hostiles. +se-space-manufactory=Une machine d'assemblage géante capable de gérer des recettes complexes. Fonctionne uniquement dans l'espace (ou à bord d'un vaisseau spatial) +se-space-material-fabricator=Permet de synthétiser et de façonner de nouveaux matériaux. Un croisement entre un collisionneur de particules et une imprimante 3D. +se-space-mechanical-laboratory=Permet de mettre en œuvre tous les tests et procédés mécaniques classiques : cisaillement, broyage, déchirement, vibrations, etc... +se-space-particle-accelerator=Accélère les particules à des vitesses proches de la vitesse de la lumière. +se-space-particle-collider=Permet la collision de particules à haute vélocité et l'analyse des résultats. +se-space-pipe=Vous pouvez marcher au-dessus. +se-space-pipe-long=Un moyen efficace et bon marché pour déplacer des fluides sur une grande distance. Vous pouvez marcher au-dessus. +se-space-pipe-long-straight=Longueur de __1__. Ne se connecte pas sur les cotés. Très pratique pour les tuyaux parallèles et pour acheminer les fluides sur de longues distances. +se-space-pipe-long-junction=Longueur de __1__. Point de connection central permettant la connection sur les cotés. Pratique pour alimenter vos lignes d'assemblage. +se-space-pipe-to-ground=Coûteux et avec une portée restreinte, vous devriez l'utiliser uniquement lorsque nécessaire. +se-space-plasma-generator=Permet de faire passer de la matière à l'état de plasma pour diverses applications scientifiques. +se-pulveriser=Pulvérise et écrase les minerais et les fragments de noyau de planète. +se-space-radiation-laboratory=Laboratoire conçu pour la manipulation en toute sécurité de matières radioactives. Permet également de réaliser les opérations de traitement de l'uranium. +se-space-radiator=Dissipe par rayonnement l'excès de chaleur du fluide réfrigérant. +se-space-radiator-2=Dissipe par rayonnement l'excès de chaleur du fluide réfrigérant. +se-recycling-facility=Permet les opérations de recyclage de la ferraille et d'autres sous-produits indésirables. +se-space-solar-panel=Panneau solaire à haut rendement . Permet de se déplacer au dessus. +se-space-solar-panel-2=Panneau solaire à haut rendement . Permet de se déplacer au dessus. +se-space-solar-panel-3=Panneau solaire à haut rendement . Permet de se déplacer au dessus. +se-space-spectrometry-facility=Spectrophotométrie, chromatographie en phase gazeuse, spectrométrie de masse et autres analyses en spectrographie. +se-space-supercomputer-1=Manipule de grandes quantité de données pour l'analyse et la simulation. +se-space-supercomputer-2=Supercalculateur quantique. Permet d'améliorer la vitesse de traitement des données. +se-space-supercomputer-3=Supercalculateur associant un réseau de neurones adaptatif à un système d'informatique quantique.Permet d'encore améliorer la vitesse de traitement et la qualité des simulations. +se-space-supercomputer-4=Un supercalculateur semi-organique utilisant des réseaux de composants nanométriques. Met à profit les distorsions de l'espace-temps et les dimensions supérieures pour optimiser la densité de traitement et la distribution de l'énergie. +se-space-straight-rail=Rails conçus pour l'espace, mais qui peuvent également être utilisés au sol. +se-space-science-lab=Laboratoire capable de traiter les packs de science avancés. +se-space-telescope=Un télescope sophistiqué sensible à de multiples longueurs d'onde dans le spectre visible. +se-space-telescope-gammaray=Les rayons gamma ne se réfractent pas et ne peuvent donc pas être focalisés par effet lentille. Ce téléscope sophistiqué utilise un jeu de miroirs et de détecteurs spécifiques pour l'étude de ce rayonnement. +se-space-telescope-xray=Les rayons X sont bloqués par la plupart des atmosphères. Ce puissant télescope est conçu pour l'espace où l'atmosphère n'est pas un problème. +se-space-telescope-microwave=Un très grand téléscope consacré à l'étude des micro-ondes et du fond diffus cosmologique. +se-space-telescope-radio=Un très grand téléscope capable de détecter les ondes radio faibles provenant de sources extrêmement lointaines. +se-space-thermodynamics-laboratory=Permet de mettre en œuvre une large gamme de procédés haute température. Permet également la plupart des opérations de métallurgie, comme la fonderie. +se-space-transport-belt=Convoyeur spatial permettant de déplacer vos objets sans qu'ils ne s'envolent en l'absence de gravité. +se-spaceship-antimatter-engine=[font=default-bold][color=#f5cb48]Peut uniquement être placé sur du plancher de vaisseau spatial[/color][/font]\nAnnihile un flux de particules d'antimatière. Compte comme une paroi pour le confinement d'un vaisseau spatial. +se-spaceship-antimatter-booster-tank=[font=default-bold][color=#f5cb48]Peut uniquement être placé sur du plancher de vaisseau spatial[/color][/font]\nRéservoir à antimatière. Nécessaire pour le lancement du vaisseau spatial. +se-spaceship-console=[font=default-bold][color=#f5cb48]Peut uniquement être placé sur du plancher de vaisseau spatial[/color][/font]\nPermet de déplacer un vaisseau spatial entre les planètes, les lunes, les orbites et les champs d'astéroïdes. Doit être confiné à l'intérieur d'un espace encadré par du plancher et des parois de vaisseau spatial, sans brèche qui provoquerait une rupture de confinement. Permet un contrôle d'intégrité pour mettre en évidence les problèmes. +se-spaceship-console-output=Émet des signaux relatifs à l'état actuel du vaisseau spatial. Voir Vaisseaux spatiaux dans [img=virtual-signal/informatron] l'Informatron pour plus d'informations [__CONTROL__informatron__]. +se-spaceship-console-alt=[font=default-bold][color=#f5cb48]Ne peut être placé que sur du plancher de vaisseau spatial/color][/font]\nCe poste de pilotage est endommagé et ne peut pas être utilisé pour piloter un vaisseau spatial. +se-spaceship-gate=[font=default-bold][color=#f5cb48]Peut uniquement être placé sur du plancher de vaisseau spatial[/color][/font]\nUn champ de force permet d'éviter la décompression lors de l'ouverture du sas. Compte comme une paroi de vaisseau pour le confinement du vaisseau. +se-spaceship-rocket-engine=[font=default-bold][color=#f5cb48]Peut uniquement être placé sur du plancher de vaisseau spatial[/color][/font]\nBrûle du carburant pour fusée liquide. Compte comme une paroi pour le confinement du vaisseau. +se-spaceship-rocket-booster-tank=[font=default-bold][color=#f5cb48]Peut uniquement être placé sur du plancher de vaisseau spatial[/color][/font]\nRéservoir de carburant pour fusée liquide. Nécessaire pour le lancement d'un vaisseau spatial. +se-spaceship-wall=[font=default-bold][color=#f5cb48]Peut uniquement être placé sur du plancher de vaisseau spatial[/color][/font]\n Compte comme une paroi pour le contrôle d'intégrité du vaisseau. Attention, les interstices en diagonale provoqueront une rupture de confinement. +beacon=8 emplacements de modules. Diffuse l'effet des modules insérés aux structures amies proches. Plusieurs diffuseurs à portée de la même structure entraineront une surcharge et provoqueront son arrêt. Portée : 3. +se-wide-beacon=15 emplacements de modules. Diffuse l'effet des modules insérés aux structures amies proches. Plusieurs diffuseurs à portée de la même structure entraineront une surcharge et provoqueront son arrêt. Portée : 14. +se-wide-beacon-2=20 emplacements de modules. Diffuse l'effet des modules insérés aux structures amies proches. Plusieurs diffuseurs à portée de la même structure entraineront une surcharge et provoqueront son arrêt. Portée : 14. +kr-singularity-beacon=Un diffuseur compact à 100% d'efficacité à courte portée. Transmet les effets des modules à des entités amies proches dans un rayon de 2 tuiles. Plusieurs diffuseurs à portée de la même structure entraineront une surcharge et provoqueront son arrêt. +se-supercharger=Peut recharger jusqu'à 64 robots simultanément à grande vitesse. Consomme jusqu'à 1GW. +se-addon-power-pole=Un petit poteau d'alimentation qui peut être ajouté sur une structure pour un meilleur contrôle de la couverture électrique. +se-pylon=Distribue de l'énergie électrique. Portée de raccordement : 64. +se-pylon-substation=Distribue de l'énergie électrique. Portée de raccordement : 64, Zone d'approvisionnement logistique : 64x64. +se-pylon-construction=Distribue de l'énergie électrique et étend le réseau logistique. Portée de raccordement : 64, Zone de construction : 64x64. +se-pylon-construction-radar=Distribue de l'énergie électrique, étend le réseau logistique et donne une vision radar. Portée de raccordement : 64, Zone de construction et de vision : 256 * 256, Zone d'approvisionnement logistique 4x4. +se-shield-projector=Crée un champ de force protecteur. La consommation augmente lorsque le projecteur est en charge ou que le champ de force subit des dégâts. Le champ de force peut bloquer les projectiles des cracheurs si le mod "Walls Block Spitters" est installé. +se-big-turbine=[font=default-bold][color=#e4cead]Puissance maximale :[/color][/font] 1 GW.\nUn grand générateur qui consomme de la vapeur à 5000°C, rend de la vapeur à 500°C à l'autre extrémité de l'eau sur les côtés. Rendement énergétique de 99 %, et 99 % de conservation de la quantité d'eau. +se-big-heat-exchanger=Un gros échangeur de chaleur à grande capacité thermique conçu pour les températures extrêmes. +se-delivery-cannon=Un canon électromagnétique capable de projeter des ressources en orbite et au-delà. Cause des dommages à destination si la capsule n'est pas récupérée en sécurité. À utiliser avec prudence. +se-delivery-cannon-chest=Un conteneur conçu pour recevoir les capsules logistiques haute vélocité projetées par canon logistique. Doit disposer d'emplacements d'inventaire suffisants pour la procédure de réception. +se-delivery-cannon-weapon=Un canon électromagnétique capable de projeter des munitions en orbite et au-delà. À utiliser avec prudence. +se-spaceship-clamp=Une fixation d'amarrage pour vaisseau spatial peut permettre le verrouillage de celui-ci sur un système similaire orienté dans le sens inverse. Compte comme une paroi de vaisseau spatial pour le confinement du vaisseau. +se-spaceship-clamp-place=Une fixation d'amarrage pour vaisseau spatial peut permettre le verrouillage de celui-ci sur un système similaire orienté dans le sens inverse. Compte comme une paroi de vaisseau spatial pour le confinement du vaisseau. +se-space-accumulator=Stockage d'énergie de haute densité. +se-space-accumulator-2=Stockage d'énergie de haute densité. +se-energy-transmitter-emitter=Le système central qui génère un faisceau d'énergie interplanétaire. Il peut être utilisé comme une arme ou pour transmettre de l'énergie à un récepteur de faisceau d'énergie. Il doit être être raccordé à une chambre à faisceau d'énergie, elle même alimentée par un ou plusieurs injecteurs de faisceau d'énergie. L'intensité du faisceau est dépendante du nombre d'injecteurs. +se-energy-transmitter-chamber=Doit être connecté à un émetteur de faisceau d'énergie. D'autres chambres peuvent être connectées à l'extrémité ou au milieu de chaque côté. Les injecteurs de faisceaux d'énergie peuvent être connectés sur les côtés uniquement. +se-energy-transmitter-injector=Doit être connecté à une chambre de faisceau d'énergie, elle-même raccordée à un émetteur de faisceau. Les injecteurs ont une consommation électrique fixe qui sera transmise dans le rayon, augmentant la puissance reçue par le récepteur, ou augmentant la vitesse de déplacement et les dégâts si le faisceau est utilisée comme arme. +se-energy-transmitter-injector-reactor=Doit être connecté à une chambre de faisceau d'énergie, elle-même raccordée à un émetteur de faisceau. Les injecteurs ont une consommation électrique fixe qui sera transmise dans le rayon, augmentant la puissance reçue par le récepteur, ou augmentant la vitesse de déplacement et les dégâts si le faisceau est utilisée comme arme. +se-energy-receiver=Capte un faisceau d'énergie incident et convertit l'énergie reçue en chaleur. L'émetteur doit être en mode Transmission d'énergie, et cibler le récepteur. +se-energy-beam-defence=Une installation de défense contre les rayons énergétiques. Cette installation est capable de détourner les faisceaux de particules provoqués par une éjection de masse coronale ou bien par une arme énergétique visant la surface. Le seul prérequis de fonctionnement est une grande quantité d'énergie à la hauteur de la puissance du faisceau de particules incident - en plus de 10MW de consommation de base. Un seul Parapluie magnétique permet de protéger une surface entière d'une éjection de masse coronale ou d'un faisceau hostile d'une puissance allant jusqu'à 500GJ. Consultez la rubrique Faisceaux d'énergie dans [img=virtual-signal/informatron] l'Informatron pour plus d'informations [__CONTROL__informatron__] +spidertron=Peut être déployé depuis une fusée cargo si aucune aire d'atterrissage n'a été définie. +se-nexus=Ne fonctionne que sur un vaisseau spatial en déplacement, avec une consommation d'énergie proportionnelle à la vitesse. Peut obtenir des données à partir du mouvement interstellaire, la génération de données est basée sur l'énergie cinétique du vaisseau. Le Nexus est conçu pour servir de propulseur à distorsion et peut vous permettre de vous échapper de l'amas stellaire local avec la bonne technologie. +se-nexus-charger=Ne fonctionne que sur un vaisseau spatial en déplacement, avec une consommation d'énergie proportionnelle à la vitesse. Peut obtenir des données à partir du mouvement interstellaire, la génération de données est basée sur l'énergie cinétique du vaisseau. Le Nexus est conçu pour servir de propulseur à distorsion et peut vous permettre de vous échapper de l'amas stellaire local avec la bonne technologie. +se-space-probe-rocket-silo=Un silo à fusée pour le lancement de sondes spatiales. +se-linked-container=Un conteneur relié par un espace extradimensionnel à d'autres conteneurs. Les liens du conteneur dépendent de la première surface sur laquelle il est placé. + +[equipment-name] +energy-shield-equipment=Bouclier d'énergie +energy-shield-mk2-equipment=Bouclier d'énergie MK2 +energy-shield-mk3-equipment=Bouclier d'énergie MK3 +energy-shield-mk4-equipment=Bouclier d'énergie MK4 +energy-shield-mk5-equipment=Bouclier d'énergie MK5 +energy-shield-mk6-equipment=Bouclier d'énergie MK6 +se-adaptive-armour-equipment-1=Armure adaptative MK1 +se-adaptive-armour-equipment-2=Armure adaptative MK2 +se-adaptive-armour-equipment-3=Armure adaptative MK3 +se-adaptive-armour-equipment-4=Armure adaptative MK4 +se-adaptive-armour-equipment-5=Armure adaptative MK5 +se-rtg-equipment=Générateur thermoélectrique à radio-isotope portable +se-rtg-equipment-2=Générateur thermoélectrique à radio-isotope portable avancé +se-lifesupport-equipment-1=Module de support de vie MK1 +se-lifesupport-equipment-2=Module de support de vie MK2 +se-lifesupport-equipment-3=Module de support de vie MK3 +se-lifesupport-equipment-4=Module de support de vie MK4 + +[equipment-description] +energy-shield-equipment=Génère une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +energy-shield-mk2-equipment=Génère une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +energy-shield-mk3-equipment=Génère une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +energy-shield-mk4-equipment=Génère une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +energy-shield-mk5-equipment=Génère une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +energy-shield-mk6-equipment=Génère une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +se-adaptive-armour-equipment-1=Armure auto-réparatrice. Se régènère lentement au fil du temps. +se-adaptive-armour-equipment-2=Armure auto-réparatrice. Se régènère lentement au fil du temps. +se-adaptive-armour-equipment-3=Armure auto-réparatrice. Se régènère lentement au fil du temps. +se-adaptive-armour-equipment-4=Armure auto-réparatrice. Se régènère lentement au fil du temps. +se-adaptive-armour-equipment-5=Armure auto-réparatrice. Se régènère lentement au fil du temps. +se-rtg-equipment=Générateur thermoélectrique à radioisotope. Dispositif portable qui convertit la chaleur des désintégrations radioactives en électricité. Fonctionne pendant des décennies sans carburant supplémentaire. +se-rtg-equipment-2=Générateur thermoélectrique à radioisotope amélioré. Dispositif portable qui convertit la chaleur des désintégrations radioactives en électricité. Fonctionne pendant des décennies sans carburant supplémentaire. +se-lifesupport-equipment-1=Augmente l'efficacité des systèmes de support de vie de +100% (cumulatif). Si le système est installé dans une combinaison non spatiale, la prime d'efficacité est réduite de moitié et il ne fonctionnera pas dans l'espace. +se-lifesupport-equipment-2=Augmente l'efficacité des systèmes de support de vie de +200% (cumulatif). Si le système est installé dans une combinaison non spatiale, la prime d'efficacité est réduite de moitié et il ne fonctionnera pas dans l'espace. +se-lifesupport-equipment-3=Augmente l'efficacité des systèmes de support de vie de +400% (cumulatif). Si le système est installé dans une combinaison non spatiale, la prime d'efficacité est réduite de moitié et il ne fonctionnera pas dans l'espace. +se-lifesupport-equipment-4=Augmente l'efficacité des systèmes de support de vie de +800% (cumulatif). Si le système est installé dans une combinaison non spatiale, la prime d'efficacité est réduite de moitié et il ne fonctionnera pas dans l'espace. + +[fluid-name] +se-antimatter-stream=Flux d'antimatière +se-bio-sludge=Boues biologiques +se-contaminated-bio-sludge=Boues biologiques contaminées +se-contaminated-space-water=Eau cosmique contaminée +se-chemical-gel=Gel chimique +se-decompressing-steam=Vapeur +se-liquid-rocket-fuel=Carburant pour fusée liquide +se-methane-gas=Méthane +se-methane-gas-mixed=Méthane mélangé +se-nutrient-gel=Gel nutritif +se-neural-gel=Gel neuronal +se-neural-gel-2=Gel neuronal avancé +se-ion-stream=Flux d'ions +se-plasma-stream=Flux de plasma +se-particle-stream=Flux de particules +se-proton-stream=Flux de protons +se-space-coolant=Fluide réfrigérant 25°C +se-space-coolant-hot=Fluide réfrigérant 25°C +se-space-coolant-warm=Fluide réfrigérant -10°C +se-space-coolant-cold=Fluide réfrigérant -100°C +se-space-coolant-supercooled=Fluide réfrigérant -273°C +se-space-water=Eau cosmique +se-beryllium-hydroxide=Hydroxyde de béryllium +se-cryonite-slush=Solution de cryonite + +[fluid-description] +se-space-water=Une eau qui ne gèle pas à basse pression, plus adaptée à la plupart des applications spatiales. +se-space-coolant=La température par défaut du fluide réfrigérant. +se-space-coolant-hot=La température par défaut du fluide réfrigérant. +se-space-coolant-warm=Température du fluide réfrigérant après refroidissement par un radiateur thermique. +se-space-coolant-cold=Température du fluide réfrigérant après hyper-refroidissement. +se-space-coolant-supercooled=Température du fluide réfrigérant après plusieurs cycles d'hyper-refroidissement. + +[fuel-category-name] +antimatter=Carburant d'antimatière + +[item-group-name] +space=Espace +science=Science +spaceship=Vaisseau spatial +bob-fluids=Fluides +resources=Ressources +intermediate-products=Produits transformés +combat=Équipement et combat + +[item-name] +spidertron=Spidertron +core-fragment=Fragment de noyau (__1__) +effectivity-module-4=Module d'efficacité 4 +effectivity-module-5=Module d'efficacité 5 +effectivity-module-6=Module d'efficacité 6 +effectivity-module-7=Module d'efficacité 7 +effectivity-module-8=Module d'efficacité 8 +effectivity-module-9=Module d'efficacité 9 +glass=Verre +productivity-module-4=Module de productivité 4 +productivity-module-5=Module de productivité 5 +productivity-module-6=Module de productivité 6 +productivity-module-7=Module de productivité 7 +productivity-module-8=Module de productivité 8 +productivity-module-9=Module de productivité 9 +rocket-fuel=Carburant pour fusée +sand=Sable +solid-sand=Sable lavé +washed-sand=Sable lavé +satellite=Satellite de navigation +se-satellite-telemetry=Mesures satellite +se-antimatter-canister=Conteneur d'antimatière +se-astrometric-data=Données astrométriques +se-astronomic-catalogue-1=Répertoire astronomique +se-astronomic-catalogue-2=Répertoire astronomique étendu +se-astronomic-catalogue-3=Répertoire astronomique complet +se-astronomic-catalogue-4=Répertoire astronomique universel +se-astronomic-insight=Rapport de découvertes astronomiques +se-astronomic-science-pack-1=Pack de science astronomique 1 +se-astronomic-science-pack-2=Pack de science astronomique 2 +se-astronomic-science-pack-3=Pack de science astronomique 3 +se-astronomic-science-pack-4=Pack de science astronomique 4 +se-atomic-data=Données atomiques +se-beryllium-ore=Béryl +se-ballistic-shielding-data=Données de protection ballistique +se-beryllium-ore-crushed=Béryl broyé +se-beryllium-ore-washed=Béryl lavé +se-beryllium-plate=Plaque de béryllium +se-beryllium-powder=Poudre de béryllium +se-beryllium-ingot=Lingot de béryllium +se-beryllium-sulfate=Sulfate de béryllium +se-bio-combustion-data=Données sur la biocombustion +se-bio-combustion-resistance-data=Données sur la résistance à la biocombustion +se-bio-spectral-data=Données biospectrales +se-biochemical-data=Données biochimiques +se-biochemical-resistance-data=Données sur la résistance biochimique +se-bioculture=Bio-culture +se-bioelectrics-data=Données bioélectriques +se-biological-catalogue-1=Répertoire biologique +se-biological-catalogue-2=Répertoire biologique étendu +se-biological-catalogue-3=Répertoire biologique complet +se-biological-catalogue-4=Répertoire biologique universel +se-biological-insight=Rapport de découvertes biologiques +se-biological-science-pack-1=Pack de science biologique 1 +se-biological-science-pack-2=Pack de science biologique 2 +se-biological-science-pack-3=Pack de science biologique 3 +se-biological-science-pack-4=Pack de science biologique 4 +se-biomechanical-data=Données biomécaniques +se-biomechanical-resistance-data=Données sur la résistance biomécanique +se-boson-data=Données sur les bosons +se-broken-data=Carte de données endommagée +se-canister=Conteneur sécurisé +se-biogun=Fusil Bio +se-bloater-ammo=Munition fusil bio +se-pheromone-ammo=Fléchette à phéromones +se-cryogun=Cryogun +se-cryogun-ammo=Munitions Cryogun +se-rocket-launch-pad-silo-dummy-ingredient-item=Fusée cargo (Ingrédient caché) +se-rocket-launch-pad-silo-dummy-result-item=Fusée cargo (Ingrédient caché) +se-cargo-rocket-cargo-pod=Nacelle de fusée cargo +se-cargo-rocket-fuel-tank=Réservoir de carburant pour fusées +se-cargo-rocket-section=Section de fusée cargo +se-cargo-rocket-section-packed=Sections de fusée cargo emballées +se-cold-thermodynamics-data=Données sur la thermodynamique à froid +se-comparative-genetic-data=Données génétiques comparatives +se-compressive-strength-data=Données sur la résistance à la compression +se-conductivity-data=Données sur la conductivité +se-contaminated-scrap=Ferraille contaminée +se-core-fragment-omni=Fragment de noyau +se-corrosion-resistance-data=Données sur la résistance à la corrosion +se-cryogenics-data=Données sur la cryogénie +se-cryonite=Cryonite +se-cryonite-crushed=Cryonite broyée +se-cryonite-washed=Cryonite lavée +se-cryonite-rod=Bâton de cryonite +se-cryonite-ion-exchange-beads=Perles d'échange anioniques +se-dark-energy-data=Données sur l'énergie noire +se-darkmatter-data=Données sur la matière noire +se-data-storage-substrate-cleaned=Substrat affiné de stockage de données +se-data-storage-substrate=Substrat brut de stockage de données +se-decompression-data=Données sur la décompression +se-decompression-resistance-data=Données sur la résistance à la décompression +se-universal-catalogue=Répertoire universel +se-deep-space-science-pack=Pack de science intersidérale +se-deep-space-science-pack-1=Pack de science intersidérale 1 +se-deep-space-science-pack-2=Pack de science intersidérale 2 +se-deep-space-science-pack-3=Pack de science intersidérale 3 +se-deep-space-science-pack-4=Pack de science intersidérale 4 +se-doppler-shift-data=Données sur le décalage Doppler +se-durability-data=Données sur la durabilité +se-electrical-shielding-data=Données sur le blindage électrique +se-electromagnetic-field-data=Données sur le champ électromagnétique +se-empty-data=Carte de données vierge +se-empty-lifesupport-canister=Capsule de support de vie vide +se-energy-catalogue-1=Répertoire énergétique +se-energy-catalogue-2=Répertoire énergétique étendu +se-energy-catalogue-3=Répertoire énergétique complet +se-energy-catalogue-4=Répertoire énergétique universel +se-energy-insight=Rapport de découvertes énergétiques +se-energy-science-pack-1=Pack de science de l'énergie 1 +se-energy-science-pack-2=Pack de science de l'énergie 2 +se-energy-science-pack-3=Pack de science de l'énergie 3 +se-energy-science-pack-4=Pack de science de l'énergie 4 +se-entanglement-data=Données sur l'intrication quantique +se-enriched-naquium=Naquium enrichi +se-exotic-fission-data=Données sur la fission exotique +se-exotic-singularity-data=Données sur la singularité +se-explosion-shielding-data=Données sur la protection contre les explosions +se-experimental-alloys-data=Données sur les alliages expérimentaux +se-experimental-biochemical-data=Données biochimiques expérimentales +se-experimental-bioculture=Bio-culture expérimentale +se-experimental-genetic-data=Données génétiques expérimentales +se-experimental-material-decay-data=Données sur la désintégration de matériaux expérimentaux +se-experimental-material-spectral-data=Données spectrales des matériaux expérimentaux +se-experimental-material=Prototype de matériau expérimental +se-experimental-specimen=Biomasse expérimentale +se-experimental-superconductor=Prototype de superconducteur +se-forcefield-data=Données sur les champs de force +se-friction-data=Données sur la friction +se-fusion-test-data=Données sur les essais de fusion +se-gammaray-detector=Détecteur de rayons gamma +se-gammaray-observation-data=Données d'observation en rayons gamma +se-gammaray-test-data=Données sur les rayons gamma +se-gate-fragment=Fragment d'artefact +se-genetic-data=Données génétiques +se-gravity-wave-observation-data=Données sur l'observation des ondes gravitationnelles +se-gravity-wave-data=Données sur les ondes gravitationelles +se-gravimetric-observation-data=Données sur les observations gravimétriques +se-gravimetric-test-data=Données sur les tests gravimétriques +se-gravitational-lensing-data=Données sur les lentilles gravitationnelles +se-heat-shielding=Protection thermique +se-holmium-ore=Minerai de holminite +se-holmium-ore-crushed=Homlinite broyée +se-holmium-ore-washed=Hominite lavée +se-holmium-powder=Poudre de holmium +se-holmium-plate=Plaque de holmium +se-holmium-ingot=Lingot de holmium +se-hot-thermodynamics-data=Données sur la thermodynamique à chaud +se-impact-shielding-data=Donnée sur la protection contre les impacts +se-infrared-observation-data=Données d'observation en infrarouge +se-ion-spectrometry-data=Données de spectrométrie ionique +se-iridium-ore=Iridite +se-iridium-ore-crushed=Iridite broyée +se-iridium-ore-washed=Iridite lavée +se-iridium-piledriver=Iridium Piledriver +se-iridium-powder=Poudre d'iridium +se-iridium-plate=Plaque d'iridium +se-iridium-ingot=Lingot d'iridium +se-junk-data=Carte de données usagée +se-laser-shielding-data=Données de protection laser +se-lepton-data=Données sur les leptons +se-lifesupport-canister=Capsule de support de vie +se-machine-learning-data=Données d'apprentissage automatisé +se-magnetic-canister=Conteneur à confinement magnétique +se-magnetic-monopole-data=Données sur le monopôle magnétique +se-material-decay-data=Données sur la désintégration de la matière +se-material-science-pack-1=Pack de science des matériaux 1 +se-material-science-pack-2=Pack de science des matériaux 1 +se-material-science-pack-3=Pack de science des matériaux 3 +se-material-science-pack-4=Pack de science des matériaux 4 +se-material-spectral-data=Données spectrales de la matière +se-material-testing-pack=Pack d'essai de matériaux +se-material-catalogue-1=Répertoire de science des matériaux +se-material-catalogue-2=Répertoire de science des matériaux étendu +se-material-catalogue-3=Répertoire de science des matériaux complet +se-material-catalogue-4=Répertoire de science des matériaux universel +se-material-insight=Rapport de découvertes de science des matériaux +se-medpack=Trousse de soin +se-medpack-2=Trousse de soin MK2 +se-medpack-3=Trousse de soin MK3 +se-medpack-4=Trousse de soin MK4 +se-meteor-defence=Canon de défense anti-météorite globale +se-meteor-defence-ammo=Munitions pour défense anti-météorite globale +se-meteor-point-defence=Canon de défense anti-météorite rapprochée +se-meteor-point-defence-ammo=Munitions pour défense anti-météorite rapprochée +se-methane-ice=Glace de méthane +se-micro-black-hole-data=Données sur les micro trous noirs +se-microwave-observation-data=Données d'observation en micro-ondes +se-negative-pressure-data=Données sur la pression négative +se-nano-cold-thermodynamics-data=Données sur la thermodynamique des nanomatériaux à froid +se-nano-compressive-strength-data=Données sur la résistance à la compression des nanomatériaux +se-nano-hot-thermodynamics-data=Données sur la thermodynamique des nanomatériaux à chaud +se-nanomaterial=Composite de nanomatériaux +se-nano-tensile-strength-data=Données sur la résistance à la traction des nanomatériaux +se-naquium-ore=Naquitite +se-naquium-ore-crushed=Naquitite broyée +se-naquium-ore-washed=Naquitite lavée +se-naquium-powder=Poudre de naquium +se-naquium-plate=Plaque de naquium +se-naquium-ingot=Lingot de naquium +se-neural-anomaly-data=Données sur les anomalies neuronales +se-nutrient-vat=Éléments nutritifs +se-observation-frame-blank=Cadre d'observation vierge +se-observation-frame-gammaray=Cadre d'observation en rayons gamma +se-observation-frame-infrared=Cadre d'observation en infrarouge +se-observation-frame-microwave=Cadre d'observation en micro-ondes +se-observation-frame-radio=Cadre d'observation en ondes radio +se-observation-frame-uv=Cadres d'observation en UV +se-observation-frame-visible=Cadre d'observation en rayonnement visible +se-observation-frame-xray=Cadre d'observation en rayons X +se-orbital-data=Données sur les calculs orbitaux +se-particle-beam-shielding-data=Données de protection contre les faisceaux de particules +se-plague-bomb=Roquette à agent biologique +se-plasma-canister=Capsule de plasma +se-plasma-electrodynamics-data=Données sur l'électrodynamique des plasmas +se-plasma-thermodynamics-data=Données sur la thermodynamique des plasmas +se-polarisation-data=Données sur la polarisation +se-pressure-containment-data=Données sur le confinement sous pression +se-quantum-phenomenon-data=Données sur les phénomènes quantiques +se-quark-data=Données sur les Quarks +se-radiation-data=Données sur les radiations +se-radiation-exposure-data=Données sur l'exposition aux radiations +se-radiation-exposure-resistance-data=Données sur la résistance aux radiations +se-radiation-shielding-data=Données de protection contre les radiations +se-radio-observation-data=Données d'observation des ondes radios +se-rigidity-data=Données sur la rigidité +se-rtg-equipment=Générateur thermoélectrique à radio-isotope portable +se-rtg-equipment-2=Réacteur à fusion portatif avancé +se-scrap=Ferraille +se-shear-strength-data=Données sur la résistance au cisaillement +se-significant-data=Données significatives +se-significant-specimen=Biomasse significative +se-singularity-data=Données sur les singularités +se-space-capsule=Capsule spatiale +se-space-mirror=Miroir multispectral +se-space-platform-plating=Plateforme spatiale avancée +se-space-platform-scaffold=Plateforme spatiale +se-space-rail=Rail spatial +se-spaceship-floor=Plancher de vaisseau spatial +se-specimen=Biomasse +se-subatomic-data=Données subatomiques +se-superconductivity-data=Données sur la supraconductivité +se-superconductor=Supraconducteur +se-superconductive-cable=Câble supraconducteur +se-tensile-strength-data=Données sur la résistance à la traction +se-tesla-ammo=Munitions Fusil Tesla +se-tesla-gun=Fusil Tesla +se-thruster-suit=Combinaison à propulsion +se-thruster-suit-2=Combinaison à propulsion MK2 +se-thruster-suit-3=Combinaison à propulsion MK3 +se-thruster-suit-4=Combinaison à propulsion MK4 +se-timespace-anomaly-data=Données sur les anomalies spatio-temporelles +se-used-lifesupport-canister=Capsule de support de vie usagée +se-uv-observation-data=Données d'observation en UV +se-visible-observation-data=Données d'observation en spectre visible +se-vitamelange=Vitamélange +se-vitamelange-nugget=Pépite de vitamélange +se-vitamelange-roast=Vitamelange torréfié +se-vitamelange-spice=Épice de vitamelange +se-vitamelange-extract=Extrait de vitamelange +se-vulcanite=Vulcanite +se-vulcanite-crushed=Vulcanite broyée +se-vulcanite-washed=Vulcanite lavée +se-vulcanite-block=Bloc de vulcanite +se-vulcanite-ion-exchange-beads=Perles d'échange cationiques +se-water-ice=Glace d'eau +se-xray-observation-data=Données d'observation en rayons X +se-zero-point-energy-data=Données sur l'énergie du point zéro +se-rocket-science-pack=Pack de science aérospatiale +space-science-pack=Pack de science d'optimisation +speed-module-4=Module de vitesse 4 +speed-module-5=Module de vitesse 5 +speed-module-6=Module de vitesse 6 +speed-module-7=Module de vitesse 7 +speed-module-8=Module de vitesse 8 +speed-module-9=Module de vitesse 9 +se-aeroframe-pole=Barre aérospatiale +se-aeroframe-scaffold=Structure aérospatiale +se-aeroframe-bulkhead=Cloison aérospatiale +se-lattice-pressure-vessel=Conteneur pressurisé à treillis +se-heavy-girder=Poutre robuste +se-heavy-bearing=Roulement robuste +se-heavy-composite=Composite robuste +se-heavy-assembly=Assemblage robuste +se-bioscrubber=Épurateur biologique +se-vitalic-epoxy=Résine vitalique +se-vitalic-reagent=Réactif vitalique +se-vitalic-acid=Acide vitalique +se-self-sealing-gel=Gel auto-obturant +se-holmium-cable=Câble de holmium +se-holmium-solenoid=Solénoïde de holmium +se-quantum-processor=Processeur quantique +se-dynamic-emitter=Émetteur dynamique +se-naquium-processor=Processeur au naquium +se-naquium-cube=Cube de naquium +se-naquium-tessaract=Tessaract de naquium +se-wide-beacon=Diffuseur longue portée +se-wide-beacon-2=Diffuseur longue portée avancé +se-lifesupport-equipment-1=Équipement de survie MK1 +se-lifesupport-equipment-2=Équipement de survie MK2 +se-lifesupport-equipment-3=Équipement de survie MK3 +se-lifesupport-equipment-4=Équipement de survie MK4 +se-naquium-heat-pipe=Conduite de chaleur en naquium +se-naquium-heat-pipe-horizontal=Conduite de chaleur en naquium horizontale +se-naquium-heat-pipe-vertical=Conduite de chaleur en naquium verticale +se-naquium-heat-pipe-long=Conduite de chaleur en naquium (longueur __1__) +se-deep-space-transport-belt=Convoyeur spatial avancé +se-deep-space-transport-belt-black=Convoyeur spatial avancé noir +se-deep-space-transport-belt-white=Convoyeur spatial avancé blanc +se-deep-space-transport-belt-red=Convoyeur spatial avancé rouge +se-deep-space-transport-belt-yellow=Convoyeur spatial avancé jaune +se-deep-space-transport-belt-green=Convoyeur spatial avancé vert +se-deep-space-transport-belt-cyan=Convoyeur spatial avancé cyan +se-deep-space-transport-belt-blue=Convoyeur spatial avancé bleu +se-deep-space-transport-belt-magenta=Convoyeur spatial avancé magenta +se-deep-space-underground-belt=Convoyeur spatial souterrain avancé +se-deep-space-underground-belt-black=Convoyeur spatial souterrain avancé noir +se-deep-space-underground-belt-white=Convoyeur spatial souterrain avancé blanc +se-deep-space-underground-belt-red=Convoyeur spatial souterrain avancé rouge +se-deep-space-underground-belt-yellow=Convoyeur spatial souterrain avancé jaune +se-deep-space-underground-belt-green=Convoyeur spatial souterrain avancé vert +se-deep-space-underground-belt-cyan=Convoyeur spatial souterrain avancé cyan +se-deep-space-underground-belt-blue=Convoyeur spatial souterrain avancé bleu +se-deep-space-underground-belt-magenta=Convoyeur spatial souterrain avancé magenta +se-deep-space-splitter=Répartiteur spatial avancé +se-deep-space-splitter-black=Répartiteur spatial avancé noir +se-deep-space-splitter-white=Répartiteur spatial avancé blanc +se-deep-space-splitter-red=Répartiteur spatial avancé rouge +se-deep-space-splitter-yellow=Répartiteur spatial avancé jaune +se-deep-space-splitter-green=Répartiteur spatial avancé vert +se-deep-space-splitter-cyan=Répartiteur spatial avancé cyan +se-deep-space-splitter-blue=Répartiteur spatial avancé bleu +se-deep-space-splitter-magenta=Répartiteur spatial avancé magenta +se-blueprint-registration-point=Point d'enregistrement du plan de construction +se-delivery-cannon-capsule=Capsule pour canon logistique +se-delivery-cannon-capsule-packed=Capsule pour canon logistique : __1__ +se-delivery-cannon-targeter=Système de visée pour canon logistique +se-delivery-cannon-weapon-capsule=Capsule à munitions pour canon logistique militaire +se-delivery-cannon-weapon-capsule-packed=Capsule à munitions pour canon logistique militaire : __1__ +se-delivery-cannon-weapon-targeter=Système de visée pour les canons logistiques militaires +se-energy-transmitter-targeter=Système de visée pour les faisceaux d'énergie +se-arcosphere=Arcosphère +se-arcosphere-a=Arcosphère λ (lambda) +se-arcosphere-b=Arcosphère ξ (xi) +se-arcosphere-c=Arcosphère ζ (zêta) +se-arcosphere-d=Arcosphère θ (thêta) +se-arcosphere-e=Arcosphère ε (epsilon) +se-arcosphere-f=Arcosphère φ (phi) +se-arcosphere-g=Arcosphère γ (gamma) +se-arcosphere-h=Arcosphère ω (oméga) +se-arcosphere-collector=Collecteur d'arcosphère +se-star-probe=Sonde stellaire +se-belt-probe=Sonde pour ceintures d'astéroïdes +se-void-probe=Sonde du vide interstellaire +se-star-probe-data=Données d'observation stellaire +se-belt-probe-data=Données d'observation de ceintures d'astéroïdes +se-void-probe-data=Données d'observation du vide interstellaire +se-nano-engineering-data=Données de nano-ingénierie +se-annihilation-data=Donnée d'annihilation +se-naquium-structural-data=Données structurelles du naquium +se-hyperlattice-data=Données sur les hypertreillis +se-naquium-energy-data=Données énergétiques sur le naquium +se-space-fold-data=Données sur le repliement de l'espace +se-space-warp-data=Données sur la déformation de l'espace +se-space-dialation-data=Données sur la dilatation de l'espace +se-space-injection-data=Données sur les injections spatiales +se-interstellar-data=Données sur la navigation interstellaire +se-teleportation-data=Données sur la téléportation +se-wormhole-data=Données sur les trous de ver +se-rhga-data=Données d'analyse hypergraphique du réel +se-deep-catalogue-1=Répertoire intersidéral +se-deep-catalogue-2=Répertoire intersidéral étendu +se-deep-catalogue-3=Répertoire intersidéral complet +se-deep-catalogue-4=Répertoire intersidéral universel +se-space-probe-rocket=Fusée à sonde spatiale +se-space-probe-rocket-deployed=Fusée à sonde spatiale (déployée) +se-railgun=Fusil électromagnétique +se-railgun-ammo=Munitions pour fusil électromagnétique + +[item-description] +automation-science-pack=Condensé scientifique utilisé par les laboratoires pour la recherche. +chemical-science-pack=Condensé scientifique utilisé par les laboratoires pour la recherche. +logistic-science-pack=Condensé scientifique utilisé par les laboratoires pour la recherche. +military-science-pack=Condensé scientifique utilisé par les laboratoires pour la recherche. +production-science-pack=Condensé scientifique utilisé par les laboratoires pour la recherche. +satellite=Le satellite doit être inséré dans un silo à fusées pour satellite (ou pour sondes spatiales). Le satellite peut découvrir et cartographier les corps célestes du système solaire de lancement, ou bien révéler une étoile proche. le lancement permet la récupération de [img=item/se-satellite-telemetry] Mesures satellite. +se-satellite-telemetry=Enregistrement de mesures satellites requises pour les sciences spatiales. Obtenu par lancement d'un [img=item/satellite] Satellite de navigation depuis un silo à fusées pour satellite (ou pour sondes spatiales). +se-antimatter-canister=Conteneur conçu pour déplacer en sécurité de l'antimatière. +se-astronomic-science-pack-1=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-astronomic-science-pack-2=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-astronomic-science-pack-3=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-astronomic-science-pack-4=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-beryllium-ore=Minerai de béryllium +se-biological-science-pack-1=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-biological-science-pack-2=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-biological-science-pack-3=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-biological-science-pack-4=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-canister=Une cuve de confinement polyvalente +se-cargo-rocket-cargo-pod=Un composant d'une section de fusée cargo. +se-cargo-rocket-fuel-tank=Un composant d'une section de fusée cargo. +se-cargo-rocket-section=L'élément clé de la fusée cargo. À insérer dans le silo de la fusée cargo. Il en faut 100 par fusée. Peut être récupéré lors des atterrissages de la fusée (20 % de récupération de base). +se-cargo-rocket-section-packed=Des sections de fusée cargo conditionnées pour le transit. Doivent être déballées pour être utilisées dans la construction de fusées. +se-bloater-ammo=Crée une flaque d'agent biologique infectieux sur le sol. Les enemis touchés enflent, ralentissant leur mouvements et causant des dégâts sur la durée. Si ils meurent dans cet état, ils explosent en endommageant les ennemis proches, pouvant provoquer une réaction en chaine. Les dégâts de cette explosion sont de 50% des PV max de la victime. +se-pheromone-ammo=Rend la victime confuse, et la retourne contre ses congénères. +se-cryogun=Crée un mur de glace qui gèle vos ennemis. +se-deep-space-science-pack=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-energy-science-pack-1=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-energy-science-pack-2=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-energy-science-pack-3=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-energy-science-pack-4=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-heat-shielding=Un panneau composite utilisé pour les applications à haute température et les structures spatiales. +se-holmium-ore=Minerai de holmium +se-iridium-ore=Minerai d'iridium +se-material-science-pack-1=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-material-science-pack-2=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-material-science-pack-3=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-material-science-pack-4=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. +se-medpack=Utilisez la trousse de soin pour vous soigner. +se-medpack-2=Utilisez la trousse de soin pour vous soigner. +se-medpack-3=Utilisez la trousse de soin pour vous soigner. +se-medpack-4=Utilisez la trousse de soin pour vous soigner. +se-meteor-defence=Capable de défendre une planète entière des chutes de météorites, mais ne peut en détruire qu'une à la fois. Doit être approvisionné en munitions et complètement chargé pour faire feu. Précision de 80%. Consomme 20MW pour se recharger après un tir. +se-meteor-defence-ammo=Détruit les météorites. Doit être chargé dans un canon de défense globale anti-météorite. +se-meteor-point-defence=Protège une zone locale contre les météores. Peut faire feu sur 4 météores simultanément. Doit être approvisionné avec la munition appropriée et être complètement chargé pour faire feu. Portée de 64, précision de 50%, doit être rechargé après avoir fait feu. Tournez l'installation pour changer le mode de recharge. +se-meteor-point-defence-container=Détruit les météorites. Doit être chargé dans un canon de défense rapprochée anti-météorite. +se-naquium-ore=Minerai de naquium. On ne le trouve que dans les étendues intersidérales, un trésor du vide interstellaire. +se-rocket-launch-pad-silo-dummy-ingredient-item=Obtenu par l'insertion de 100 sections de fusée cargo et d'une capsule spatiale dans un silo de fusée cargo. +se-rtg-equipment=Générateur thermoélectrique à radio-isotope. Générateur portable qui convertit la chaleur de la désintégration radioactive en électricité. Il dure des décennies sans nécessiter de combustible supplémentaire. +se-rtg-equipment-2=Générateur thermoélectrique à radio-isotope. Générateur portable qui convertit la chaleur de la désintégration radioactive en électricité. Il dure des décennies sans nécessiter de combustible supplémentaire. +se-plague-bomb=Une munition chargée contenant un agent biologique meurtrier capable d'éradiquer toute vie de planètes entières. A manipuler avec les plus extêmes précautions. (Peut faire chuter sévèrement la performance du jeu car tout meurt progressivement, ce qui n'est pas recommandé pour les grandes planètes ou le multijoueur.) +se-space-capsule=Une capsule de contrôle nécessaire pour les fusées cargo. Peut être utilisée pour ramener les passagers à la surface de la planète la plus proche. Entrez dans la capsule en utilisant __CONTROL__toggle-driving__. +se-space-platform-plating=[font=default-bold][color=#f5cb48]Ne peut être placé que sur du vide spatial[/color][/font]\nRevêtement avancé qui permet un mouvement rapide sur la plateforme spatiale. +se-space-platform-scaffold=[font=default-bold][color=#f5cb48]Ne peut être placé que sur du vide spatial[/color][/font]\nÉlément de base de la plateforme spatiale sur lequel vous pourrez placer vos installations. +se-space-rail=Des rails qui peuvent être utilisés en toute sécurité dans l'espace en empêchant le déraillement même en l'absence de gravité. Aucune plateforme spatiale n'est nécessaire, ils sont entièrement autoportants. Ils peuvent également être utilisés sur terre pour des raisons esthétiques. +se-spaceship-floor=Ce sol doit être placé sous tous les composants d'un vaisseau spatial, et encloisonné à l'intérieur de parois de vaisseau spatial. Tout interstice provoquera une rupture de confinement et pourra briser certaines parties du vaisseau. +se-superconductive-cable=Un câble composite supraconducteur qui ne nécessite pas de refroidissement actif. +se-tesla-gun=Éclairs en chaîne à tir rapide. +se-thruster-suit=Une combinaison spatiale qui est nécessaire pour survivre dans l'espace. \nPossède un propulseur et des bottes magnétiques. +se-thruster-suit-2=Une combinaison spatiale qui est nécessaire pour survivre dans l'espace. \nPossède des propulseurs plus puissants, augmente l'inventaire et élargit la grille. +se-thruster-suit-3=Une combinaison spatiale qui est nécessaire pour survivre dans l'espace. \nPossède des propulseurs plus puissants, augmente l'inventaire et élargit la grille. +se-thruster-suit-4=Une combinaison spatiale qui est nécessaire pour survivre dans l'espace. \nPossède des propulseurs plus puissants, augmente l'inventaire et élargit la grille. +space-science-pack=Utilisé pour la mise à niveau de nombreux objets existants. +se-rocket-science-pack=Condensé scientifique utilisé par les laboratoires de recherche spatiaux. Doit être produit dans l'espace. +utility-science-pack=Condensé scientifique utilisé par les laboratoires pour la recherche. +beacon=8 emplacements de modules. Diffuse l'effet des modules insérés aux structures amies proches. Plusieurs diffuseurs à portée de la même structure entraineront une surcharge et provoqueront son arrêt. Portée : 3 +se-wide-beacon=15 emplacements de modules. Diffuse l'effet des modules insérés aux structures amies proches. Plusieurs diffuseurs à portée de la même structure entraineront une surcharge et provoqueront son arrêt. Portée : 14 +se-wide-beacon-2=20 emplacements de modules. Diffuse l'effet des modules insérés aux structures amies proches. Plusieurs diffuseurs à portée de la même structure entraineront une surcharge et provoqueront son arrêt. Portée : 14 +se-lifesupport-equipment-1=Augmente l'efficacité des systèmes de support de vie de +100% (cumulatif). Si le système est installé dans une combinaison non spatiale, son efficacité est réduite de moitié et il ne fonctionnera pas dans l'espace. +se-lifesupport-equipment-2=Augmente l'efficacité des systèmes de support de vie de +200% (cumulatif). Si le système est installé dans une combinaison non spatiale, son efficacité est réduite de moitié et il ne fonctionnera pas dans l'espace. +se-lifesupport-equipment-3=Augmente l'efficacité des systèmes de support de vie de +400% (cumulatif). Si le système est installé dans une combinaison non spatiale, son efficacité est réduite de moitié et il ne fonctionnera pas dans l'espace. +se-lifesupport-equipment-4=Augmente l'efficacité des systèmes de support de vie de +800% (cumulatif). Si le système est installé dans une combinaison non spatiale, son efficacité est réduite de moitié et il ne fonctionnera pas dans l'espace. +se-delivery-cannon=Permet l'envoi précis de ressources par canon logistique +se-delivery-cannon-weapon=Permet l'envoi précis de munitions spéciales par canon logistique militaire +se-arcosphere=Les arcosphères à la dérive dans l'espace intersidéral peuvent être récupérées par un [img=item/se-arcosphere-collector] collecteur d'arcosphère +se-deep-catalogue-1=Données structurées sur le naquium et la nano-ingénierie. +se-deep-catalogue-2=Données structurées sur les assemblages à hypertreillis, les singularités et l'annihilation de matière. +se-deep-catalogue-3=Données structurées sur les distorsions de l'espace à petite échelle et la nano-ingénierie extradimensionnelle. +se-deep-catalogue-4=Données structurées sur les distorsions de l'espace à grande échelle et le voyage extradimensionel. +se-arcosphere-collector=Collecte des arcosphères dans le vide interstellaire. Doit être lancé depuis un silo pour fusées à sondes spatiales situé dans un champ d'astéroïdes. Les opérations de récupération d'arcosphères seront de plus en plus difficiles au fur et à mesure que vous en collecterez. +se-star-probe=Collecte des données sur une étoile et permet d'obtenir des [img=item/se-star-probe-data] Données d'observation stellaire. Doit être lancé depuis un silo à fusées pour sondes spatiales placé en orbite proche d'une étoile. +se-belt-probe=Collecte des données sur une ceinture d'astéroïdes et permet d'obtenir des [img=item/se-belt-probe-data] Données d'observation de ceintures d'astéroïdes. Doit être lancé depuis un silo à fusées pour sondes spatiales placé dans une ceinture d'astéroïdes. +se-void-probe=Collecte des données sur les étendues intersidérales et permet d'obtenir des [img=item/se-void-probe-data] Données sur le vide intersidéral. Doit être lancé depuis un silo à fusées pour sondes spatiales placé dans un champ d'astéroïdes. +se-interstellar-data=Obtenu à partir d'un Nexus placé dans un vaisseau spatial en déplacement. La navigation en espace intersidéral avec un vaisseau plus imposant et plus rapide génère beaucoup plus de données. + +[recipe-name] +core-fragment=Traitement des fragments de noyau (__1__) +rocket-fuel=Carburant pour fusée +se-astrometric-analysis-multispectral-1=Analyse astrométrique multispectrale 1 +se-astrometric-analysis-multispectral-2=Analyse astrométrique multispectrale 2 +se-astrometric-analysis-multispectral-3=Analyse astrométrique multispectrale 3 +se-astronomic-insight-1=Rapport de découvertes astronomiques +se-astronomic-insight-2=Rapport de découvertes astronomiques 2 +se-astronomic-insight-3=Rapport de découvertes astronomiques 3 +se-astronomic-insight-4=Rapport de découvertes astronomiques 4 +se-biological-insight-1=Rapport de découvertes biologiques +se-biological-insight-2=Rapport de découvertes biologiques 2 +se-biological-insight-3=Rapport de découvertes biologiques 3 +se-biological-insight-4=Rapport de découvertes biologiques 4 +se-bio-methane-to-crude-oil=Transformation biologique du méthane en pétrole brut +se-bio-sludge-crude-oil=Boues biologiques à partir de biomasse expérimentale +se-bio-sludge-decontamination=Décontamination des boues biologiques +se-bio-sludge-from-fish=Boues biologiques à partir de poissons +se-bio-sludge-from-wood=Boues biologiques à partir de bois +se-bio-sludge-from-vitamelange=Boues biologiques à partir de vitamélange +se-bio-sludge=Boues biologiques à partir de biomasse +se-broken-data-scrapping=Destruction des cartes de données endommagées +se-cargo-rocket-section-pack=Conditionnement de sections de fusées cargo +se-cargo-rocket-section-unpack=Déballage de sections de fusées cargo +se-condenser-turbine-reclaim-water=Production d'électricité avec récupération d'eau. +se-core-fragment-omni=Traitement des fragments de noyau +se-core-mining=Forage à grande profondeur +se-empty-antimatter-canister=Flux d'antimatière provenant d'un réservoir +se-empty-barrel-scrapping=Destruction de barils vides +se-empty-barrel-reprocessing=Recyclage des barils vides +se-space-capsule-scrapping=Démantèlement de la capsule spatiale +se-cargo-pod-scrapping=Démantèlement de nacelles cargo +se-energy-insight-1=Rapport de découvertes de science de l'énergie +se-energy-insight-2=Rapport de découvertes de science de l'énergie 2 +se-energy-insight-3=Rapport de découvertes de science de l'énergie 3 +se-energy-insight-4=Rapport de découvertes de science de l'énergie 4 +se-formatting-1=Formatage de cartes de données +se-formatting-2=Formatage de cartes de données avancé +se-formatting-3=Formatage de cartes de données perfectionné +se-formatting-4=Formatage de cartes de données optimisé +se-material-insight-1=Rapport de découvertes de science des matériaux +se-material-insight-2=Rapport de découvertes de science des matériaux 2 +se-material-insight-3=Rapport de découvertes de science des matériaux 3 +se-material-insight-4=Rapport de découvertes de science des matériaux 4 +se-matter-fusion-copper=Nucléosynthèse du cuivre +se-matter-fusion-dirty=Nucléosynthèse de composés métalliques +se-matter-fusion-iron=Nucléosynthèse du fer +se-matter-fusion-stone=Nucléosynthèse de composés rocheux +se-matter-fusion-uranium=Nucléosynthèse de l'uranium +se-matter-fusion-to=Nucléosynthèse du __1__ +se-orbital-data=Données sur les calculs orbitaux +se-plasma-canister-empty=Vider un conteneur à  plasma +se-pulverised-sand=Pulvérisation du sable +se-radiating-space-coolant-fast=Refroidissement rapide du fluide réfrigérant à -10°C +se-radiating-space-coolant-normal=Refroidissement du fluide réfrigérant à -10°C +se-radiating-space-coolant-slow=Refroidissement à faible déperdition du fluide réfrigérant à -10°C +se-mixed-methane-gas-separation=Séparation du mélange de gaz méthane +se-rocket-fuel-from-water-copper=Carburant pour fusée par électrolyse de l'eau +se-scrap-decontamination=Décontamination de la ferraille +se-scrap-recycling=Recyclage de la ferraille +se-space-coolant-cold=Hyper-refroidissement du fluide réfrigérant à -100°C +se-space-coolant-supercooled=Hyper-refroidissement du fluide réfrigérant à -273°C +se-space-coolant-supercooled-cryonite=Refroidissement cryogénique du fluide réfrigérant à -273°C +se-space-coolant-cold-cryonite=Refroidissement cryogénique du fluide réfrigérant à -100°C +se-space-coolant-supercoole-cryonite=Refroidissement cryogénique du fluide réfrigérant à -273°C +se-simulation-a=Simulation astronomique +se-simulation-ab=Simulation de panspermie +se-simulation-abm=Simulation de xénoprogression +se-simulation-am=Simulation de la distribution des éléments +se-simulation-as=Simulation de comportement des astroparticules +se-simulation-asb=Simulation astrobionique +se-simulation-asbm=Simulation universelle +se-simulation-asm=Simulation astrophysique +se-simulation-b=Simulation biologique +se-simulation-bm=Simulation biomécanique +se-simulation-m=Simulation des matériaux +se-simulation-s=Simulation énergétique +se-simulation-sb=Simulation biochimique +se-simulation-sbm=Simulation nanorobotique +se-simulation-sm=Simulation de comportement des nanomatériaux +se-space-water-decontamination=Décontamination de l'eau cosmique +se-spaceship-rocket-engine-burn=Combustion de carburant pour fusée liquide +se-specimen-fish=Pisciculture en microgravité +se-specimen-wood=Pépinière en microgravité +se-thermodynamics-coal=Pyrolyse de biomasse en charbon +se-used-lifesupport-canister-cleaning=Nettoyage des capsules de support de vie +se-used-lifesupport-canister-cleaning-space=Stérilisation des capsules de support de vie +space-science-pack=Pack de science d'optimisation +se-rocket-science-pack=Pack de science aérospatiale +se-big-turbine-internal=Décompression de la vapeur à haute température +se-arcosphere-fracture=Polarisation des arcosphères +se-arcosphere-fold-in=Inversion des arcosphères +se-arcosphere-fold-out=Inversion des arcosphères +se-arcosphere-folding=Repliement des arcosphères : __1__ __2__ vers __3__ __4__ +se-electric-boiling-void=Évacuation de la vapeur +se-space-probe-rocket-deployed=Fusée pour sonde spatiale (Déployée) +se-distortion-drive=Propulseur à distorsion +se-generic-scrapping=Démantèlement de __1__ +se-generic-recycling=Recyclage de __1__ + +[recipe-description] +se-astronomic-insight-2=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-astronomic-insight-3=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-astronomic-insight-4=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-biological-insight-2=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-biological-insight-3=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-biological-insight-4=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-core-mining=La nature du fragment obtenu dépend de la planète. La vitesse d'extraction dépend du nombre d'autres foreuses grande profondeur présentes sur la planète ou la lune. +se-energy-insight-2=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-energy-insight-3=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-energy-insight-4=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-material-insight-2=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-material-insight-3=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-material-insight-4=Processus scientifique plus complexe, mais moins demandeur en ressources. +se-radiating-space-coolant-normal=Les cycles de refroidissement répétés causent une dégradation du fluide réfrigérant. +se-radiating-space-coolant-slow=Les cycles de refroidissement répétés causent une dégradation du fluide réfrigérant, mais un processus plus lent permet de limiter les pertes. +se-radiating-space-coolant-fast=Les cycles de refroidissement répétés causent une dégradation du fluide réfrigérant, mais un processus plus lent permet de limiter les pertes. +se-delivery-cannon-weapon-pack-se-iridium-piledriver=Énormes dégâts physiques dans une petite zone, avec des dégâts secondaires par onde de choc. +se-arcosphere-fracture=Les arcosphères peuvent être collectées par un [img=item/se-arcosphere-collector] collecteur d'arcosphère +se-distortion-drive=Ce processus doit être actif pour activer le propulseur à distortion du Nexus et gagner la partie. Utilise 8GW à la vitesse critique. + +[technology-name] +effectivity-module-4=Module d'efficacité 4 +effectivity-module-5=Module d'efficacité 5 +effectivity-module-6=Module d'efficacité 6 +effectivity-module-7=Module d'efficacité 7 +effectivity-module-8=Module d'efficacité 8 +effectivity-module-9=Module d'efficacité 9 +energy-shield-equipment=Bouclier d'énergie +energy-shield-mk2-equipment=Bouclier d'énergie MK2 +energy-shield-mk3-equipment=Bouclier d'énergie MK3 +energy-shield-mk4-equipment=Bouclier d'énergie MK4 +energy-shield-mk5-equipment=Bouclier d'énergie MK5 +energy-shield-mk6-equipment=Bouclier d'énergie MK6 +sand-processing=Traitement du sable +glass-processing=Traitement du verre +liquid-rocket-fuel=Carburant pour fusée liquide +productivity-module-4=Module de productivité 4 +productivity-module-5=Module de productivité 5 +productivity-module-6=Module de productivité 6 +productivity-module-7=Module de productivité 7 +productivity-module-8=Module de productivité 8 +productivity-module-9=Module de productivité 9 +rocket-silo=Silo à fusée pour satellites +rocketry=Roquettes de combat +se-adaptive-armour=Armure adaptative +se-antimatter-engine=Moteur à antimatière +se-antimatter-reactor=Réacteur à antimatière +se-antimatter-production=Production d'antimatière +se-astronomic-science-pack=Pack de science astronomique +se-biological-science-pack=Pack de science biologique +se-condenser-turbine=Turbine à condensation +se-core-miner=Forage à grande profondeur +se-biogun=Fusil Bio +se-cryogun=Cryogun +se-deep-space-science-pack=Pack de science intersidérale +se-deep-catalogue=Répertoire intersidéral +se-dimensional-anchor=Ancrage dimensionnel +se-electric-boiler=Chaudière électrique +se-energy-science-pack=Pack de science de l'énergie +se-fluid-burner-generator=Groupe électrogène à carburant +se-fuel-refining=Raffinage du carburant +se-heat-shielding=Protection thermique +se-long-range-star-mapping=Cartographie stellaire à grande distance +se-material-science-pack=Pack de science des matériaux +se-medpack=Trousse de soin +se-medpack-2=Trousse de soin MK2 +se-medpack-3=Trousse de soin MK3 +se-medpack-4=Trousse de soin MK4 +se-meteor-defence=Défense anti-météorite globale +se-meteor-point-defence=Défense anti-météorite rapprochée +se-nanomaterial=Nanomatériaux +se-plague=Fléau biologique +se-processing-beryllium=Traitement du béryllium +se-processing-cryonite=Traitement de la cryonite +se-processing-holmium=Traitement du holmium +se-processing-iridium=Traitement de l'iridium +se-processing-naquium=Traitement du naquium +se-processing-vitamelange=Traitement du vitamélange +se-processing-vulcanite=Traitement de la vulcanite +se-pulveriser=Broyeur +se-railgun=Fusil électromagnétique +se-rocket-cargo-safety=Sécurisation de la cargaison +se-rocket-fuel-from-water=Carburant pour fusée par électrolyse de l'eau +se-rocket-launch-pad=Silo à fusées cargo +se-rocket-landing-pad=Aire d'atterrissage +se-rocket-reusability=Réutilisation des fusées +se-rocket-survivability=Fiabilité des fusées +se-rtg-equipment=Générateur thermoélectrique à radio-isotope portable +se-rtg-equipment-2=Réacteur à fusion portatif avancé +se-space-assembling=Machine d'assemblage spatiale +se-space-accumulator=Accumulateur au holmium +se-space-accumulator-2=Accumulateur au naquium +se-space-astrometrics-laboratory=Laboratoire d'astrométrie +se-space-biochemical-laboratory=Usine de biochimie +se-space-catalogue-astronomic=Répertoire astronomique +se-space-catalogue-biological=Répertoire biologique +se-space-catalogue-universal=Répertoire universel +se-space-catalogue-energy=Répertoire énergétique +se-space-catalogue-material=Répertoire des matériaux +se-space-data-card=Cartes de données +se-space-decontamination-facility=Installation de décontamination +se-space-electromagnetics-laboratory=Laboratoire d'électromagnétique +se-space-genetics-laboratory=Laboratoires de génétique +se-space-gravimetrics-laboratory=Laboratoire de gravimétrie +se-space-growth-facility=Installation de croissance +se-space-hypercooling=Hyper-refroidissement +se-space-laser-laboratory=Laboratoire laser +se-lifesupport-facility=Processus de support de vie +se-space-manufactory=Manufacture spatiale +se-space-material-fabricator=Nucléosynthèse +se-space-matter-fusion=Nucléosynthèse avancée +se-space-mechanical-laboratory=Laboratoire de mécanique +se-space-particle-accelerator=Accélérateur de particules +se-space-particle-collider=Collisionneur de particules +se-space-plasma-generator=Générateur de plasma +se-space-platform-plating=Plateforme spatiale avancée +se-space-platform-scaffold=Plateforme spatiale +se-space-radiation-laboratory=Laboratoire de radioactivité +se-space-radiating-efficiency=Efficacité de la dissipation thermique +se-space-radiating-speed=Vitesse de dissipation thermique +se-space-radiator=Radiateur thermique +se-space-radiator-2=Radiateur thermique avancé +se-space-rail=Rail spatial +se-recycling-facility=Installation de recyclage +se-space-science-lab=Laboratoire de sciences spatiales +se-space-simulation-ab=Simulation de panspermie +se-space-simulation-am=Simulation d'astromatériaux +se-space-simulation-as=Simulation d'astroparticules +se-space-simulation-bm=Simulation biomécanique +se-space-simulation-sb=Simulation biochimique +se-space-simulation-sm=Simulation de nanomatériaux +se-space-simulation-abm=Simulation de xénoprogression +se-space-simulation-asb=Simulation astrobionique +se-space-simulation-asm=Simulation astrophysique +se-space-simulation-sbm=Simulation nanorobotique +se-space-simulation-asbm=Simulation universelle +se-space-solar-panel=Panneau solaire spatial +se-space-spectrometry-facility=Laboratoire de spectrométrie +se-space-supercomputer=Supercalculateurs spatiaux +se-space-telescope=Télescope +se-space-telescope-gammaray=Télescope à rayons gamma +se-space-telescope-xray=Télescope à rayons X +se-space-telescope-microwave=Téléscope à micro-ondes +se-space-telescope-radio=Téléscope à ondes radio +se-space-thermodynamics-laboratory=Laboratoire de thermodynamique +se-spaceship=Vaisseau spatial +se-spaceship-integrity=Intégrité structurelle des vaisseaux spatiaux +se-factory-spaceship=Usines spatiales +se-superconductive-cable=Câbles supraconducteurs +se-teleportation=Téléportation +se-tesla-gun=Fusil Tesla +se-thruster-suit=Combinaison à propulsion +space-science-pack=Pack de science d'optimisation +se-rocket-science-pack=Pack de science spatiale +speed-module-4=Module de vitesse 4 +speed-module-5=Module de vitesse 5 +speed-module-6=Module de vitesse 6 +speed-module-7=Module de vitesse 7 +speed-module-8=Module de vitesse 8 +speed-module-9=Module de vitesse 9 +se-aeroframe-pole=Barre aérospatiale +se-aeroframe-scaffold=Structure aérospatiale +se-aeroframe-bulkhead=Cloison aérospatiale +se-lattice-pressure-vessel=Conteneur pressurisé à treillis +se-heavy-girder=Poutre robuste +se-heavy-bearing=Roulement robuste +se-heavy-composite=Matériau composite robuste +se-heavy-assembly=Assemblage robuste +se-bioscrubber=Épurateur biologique +se-vitalic-epoxy=Résine vitalique +se-vitalic-reagent=Réactif vitalique +se-vitalic-acid=Acide vitalique +se-self-sealing-gel=Gel auto-obturant +se-holmium-cable=Câble de holmium +se-holmium-solenoid=Solénoïde de holmium +se-quantum-processor=Processeur quantique +se-dynamic-emitter=Émetteur dynamique +se-naquium-processor=Processeur au naquium +se-naquium-cube=Cube de naquium +se-naquium-tessaract=Tessaract de naquium +se-wide-beacon=Diffuseur longue portée +se-wide-beacon-2=Diffuseur longue portée avancé +se-lifesupport-equipment=Équipement de support de vie +se-lifesupport-equipment-1=Équipement de support de vie Mk1 +se-lifesupport-equipment-2=Équipement de support de vie Mk2 +se-lifesupport-equipment-3=Équipement de support de vie Mk3 +se-lifesupport-equipment-4=Équipement de support de vie Mk4 +se-supercharger=Superchargeur +se-addon-power-pole=Poteau électrique d'appoint +se-pylon=Pylône +se-pylon-substation=Pylône de distribution +se-pylon-construction=Pylône de construction +se-pylon-construction-radar=Pylône de construction à suivi radar +se-shield-projector=Projecteur de bouclier +se-deep-space-transport-belt=Convoyeurs spatiaux avancés +se-big-turbine=Turbine très haute température +se-big-heat-exchanger=Échangeur de chaleur très haute température +se-zone-discovery-random=Découverte de zone +se-zone-discovery-targeted=Découverte de zone ciblée +se-zone-discovery-deep=Découverte de zone en espace intersidéral +se-delivery-cannon=Canon logistique +se-delivery-cannon-weapon=Canon logistique militaire +se-spaceship-clamps=Fixation d'amarrage pour vaisseaux spatiaux +se-bio-upgrade-constitution=Amélioration biologique : Constitution +se-bio-upgrade-strength=Amélioration biologique : Force +se-bio-upgrade-agility=Amélioration biologique : Agilité +se-bio-upgrade-dexterity=Amélioration biologique : Dextérité +se-bio-upgrade-intelligence=Amélioration biologique : Intelligence +se-energy-beaming=Faisceaux d'énergie +se-energy-beam-defence=Systèmes de défense électromagnétique +se-nexus=Nexus +se-spaceship-victory=Victoire du vaisseau spatial +se-arcosphere=Collecte des arcosphères +se-arcosphere-folding=Repliement des arcosphères +se-space-probe=Silo à fusée pour sonde spatiale +se-linked-container=Coffre Arcolink +k2-conversion=Conversion __1__ + +[technology-description] +energy-shield-equipment=Une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +energy-shield-mk2-equipment=Une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +energy-shield-mk3-equipment=Une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +energy-shield-mk4-equipment=Une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +energy-shield-mk5-equipment=Une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +energy-shield-mk6-equipment=Une bulle protectrice qui se recharge rapidement mais consomme beaucoup d'énergie. +sand-processing=Broyage, meulage et tamisage de la matière première en sable propre. +glass-processing=Processus de fusion du sable en verre. +rocket-silo=Permet de lancer des satellites pour découvrir de nouvelles planètes. +se-adaptive-armour=Une armure qui utilise de l'énergie pour s'auto-réparer. Remplit un rôle similaire à celui des boucliers énergétiques avec des besoins en énergie plus faibles mais une régénération beaucoup plus lente. +se-antimatter-engine=Permet d'utiliser l'annihilation de l'antimatière pour générer une poussée incroyable. +se-antimatter-reactor=Permet d'utiliser l'annihilation de l'antimatière pour générer une chaleur extrême. +se-antimatter-production=Production d'antimatière, la forme de stockage d'énergie la plus dense possible. +se-astronomic-science-pack=Permet la recherche de technologies liées aux voyages spatiaux et à la logistique interstellaire. +se-biological-science-pack=Permet la recherche de technologies liées à la productivité des processus, aux armes biologiques et aux calculateurs à réseaux de neurones. Permet également d'améliorer vos aptitudes physiques et intellectuelles. +se-condenser-turbine=75% de l'efficacité d'une turbine à vapeur classique, mais permet de récupérer 99% de la vapeur utilisée sous forme d'eau condensée. Plage de température de fonctionnement : 100 à 999°C.\nPuissance de sortie : 10MW. +se-core-miner=Autorise l'extraction de fragments riches en ressources depuis une planète ou une lune sans jamais épuiser le gisement. Installer plusieurs foreuses grande profondeur sur le même corps réduira progressivement leur efficacité individuelle. +se-biogun=Une arme capable de projeter diverses munitions biologiques. +se-cryogun=Une arme capable de créer un mur de galce pour geler vos ennemis +se-deep-catalogue=Données structurées sur la distorsion de l'espace, la matière exotique et les possibilités de la nano-ingénierie prêtes pour l'analyse et la simulation. Élément clé de la recherche des technologies les plus avancées. +se-deep-space-science-pack=Un condensé de science pour la recherche des technologies les plus avancées. +se-dimensional-anchor=Utilise le puit de gravité d'une étoile comme point de stabilisation d'une anomalie spatiale. +se-electric-boiler=Crée de la vapeur d'eau en utilisant de l'énergie électrique. Rendement de 90%. +se-energy-science-pack=Permet la recherche de technologies relatives aux forces fondamentales et aux découvertes subatomiques. +se-fluid-burner-generator=Utilise un carburant liquide avec une valeur énergétique (par exemple du carburant pour fusée liquide) pour générer de l'électricité. Simple et compact, mais n'a pas le rendement des grands systèmes utilisant la vapeur. Conçu pour l'espace. La consommation en carburant varie fonction de sa valeur énergétique. +se-fuel-refining=Raffinage de carburants plus avancés. +se-heat-shielding=Un panneau composite utilisé pour les applications à haute température et les structures spatiales. +se-long-range-star-mapping=Certaines galaxies lointaines peuvent être identifiées par des motifs spécifiques d'étoiles inhabituelles. Les résultats sont enregistrés dans [img=virtual-signal/informatron] l'Informatron [__CONTROL__informatron__]. +se-material-science-pack=Permet la recherche de technologies utilisant des matériaux avancés, adaptés à des contraintes d'ingénierie plus exigeantes. +se-medpack=Utilisez la trousse de soin pour vous soigner. +se-medpack-2=Utilisez la trousse de soin pour vous soigner. +se-medpack-3=Utilisez la trousse de soin pour vous soigner. +se-medpack-4=Utilisez la trousse de soin pour vous soigner. +se-meteor-defence=Détruit les météorites avant qu'elles ne causent des dégâts à vos installations. Les canons de défense anti-météorite globale sont capable de couvir une planète entière, mais ne peuvent tirer que sur une météorite à la fois. +se-meteor-point-defence=Détruit les météorites avant qu'elles ne causent des dégâts à vos installations. Les canons de défense anti-météorite rapprochée assurent la couverture d'une petite zone autour d'eux et peuvent faire feu sur 4 météorite simultanément. +se-nanomaterial=Une structure associant plusieurs matériaux organisés à l'échelle nanométrique pour donner un composite aux propriétés exceptionelles. +se-railgun=Tire des fléchettes accélérées électromagnétiquement à une vitesse telle qu'elles laissent une trainée de plasma avant de se vaporiser. Cause d'importants dégâts avec une faible cadence de tir. +se-plague=Un agent biologique meurtrier capable d'éradiquer toute vie de planètes entières. À manipuler avec les plus EXTRÊMES précautions. +se-processing-beryllium=Transformation du béryl en béryllium, un métal extrêmement léger et solide, résistant à la corrosion et aux radiations. De plus, il n'a pratiquement aucune interaction avec les rayons X. +se-processing-cryonite=Processus de transformation des cristaux de cryonite gelés en bâtonnets de cryonite pure. Ce matériau à de nombreuses applications en réfrigération, en refroidissement et dans la lubrification. Principalement trouvé sur les mondes gelés. +se-processing-holmium=Transformation du minerai de holminite en holmium, un métal terre-rare ayant la plus grande perméabilité magnétique de tous les éléments. +se-processing-iridium=Transformation de l'iridite en iridium, le métal le plus résistant à la corrosion et l'élément le plus dense à haute température. Un matériau clé pour l'industrie lourde. +se-processing-naquium=Processus de transformation des mystérieux cristaux de naquitite en naquium, un matériau quasi métallique aux curieuses interactions avec l'espace-temps. +se-processing-vitamelange=Processus de tranformation de la roche poreuse de vitamélange en un extrait nutritif de grande valeur. +se-processing-vulcanite=Processus de transformation des cristaux de vulcanite en une poudre raffinée utilisée dans les processus de fonderie avancée, l'obtention de carburant pour fusée, et autres processus chimiques à haute température. La vulcanite se trouve principalement dans les zones volcaniques et dans les matériaux extraits par le forage à grande profondeur. +se-pulveriser=Broie et concasse les matériaux durs et les fragments de noyau. +se-rocket-cargo-safety=Réduit de 10% la probabilité que la cargaison soit endommagée en transit (multiplicatif). +se-rocket-fuel-from-water=Obtention de carburant pour fusée par électrolyse de l'eau. +se-rocket-landing-pad=Aire permettant la bonne réception du chargement des fusées cargo. Avec les bonnes recherches, vous pourrez également récupérer une partie des éléments de la fusée. +se-rocket-launch-pad=Permet de lancer des cargaisons dans l'espace ou vers d'autres planètes. +se-rocket-reusability=Augmente le taux de récupération des éléments de fusée de 4% après une réception réussie sur une aire d'atterrissage (Base 20%, max 100%) +se-rocket-survivability=Réduit de 10 % le risque que les fusées soient endommagées pendant le trajet ou qu'elles aient une défaillance de navigation qui entraîne le ratage de leur aire d'atterrissage (multiplicatif). +se-rtg-equipment=Générateur thermoélectrique à  radio-isotope. Un générateur portable qui convertit la chaleur dégagée par les désintégrations radioactives en électricité. Fonctionne pendant des décennies sans carburant supplémentaire. +se-rtg-equipment-2=Générateur thermoélectrique à  radio-isotope. Un générateur portable qui convertit la chaleur dégagée par les désintégrations radioactives en électricité. Fonctionne pendant des décennies sans carburant supplémentaire. +se-space-assembling=Machine d'assemblage modifiée pour fonctionner dans l'espace. +se-space-astrometrics-laboratory=Combine, compare et quantifie différentes sources de données astronomiques. +se-space-biochemical-laboratory=Un laboratoire de chimie avancé spécialisé dans la biochimie. Peut également réaliser les opérations d'une usine de produits chimiques ou d'une raffinerie de pétrole. +se-space-catalogue-astronomic=Données astronomiques structurées, prêtes pour l'analyse et la simulation informatique. Un élément clé de la recherche en astronomie. +se-space-catalogue-biological=Données biologiques structurées, prêtes pour l'analyse et la simulation informatique. Un élément clé de la recherche en biologie. +se-space-catalogue-universal=Données combinées prêtes pour l'analyse et la simulation informatique. Un élément clé de la recherche sur l'espace intersidéral. +se-space-catalogue-energy=Données de science énergétique structurées, prêtes pour l'analyse et la simulation informatique. Un élément clé de la recherche en science de l'énergie. +se-space-catalogue-material=Données de science des matériaux structurées, prêtes pour l'analyse et la simulation informatique. Un élément clé de la recherche en science des matériaux. +se-space-data-card=Un dispositif de stockage de données polyvalent. Utilisé par les processus de recherche scientifique avancés. +se-space-decontamination-facility=Nettoie les substances destinées à être utilisées dans des environnements stériles, et prépare les liquides destinés à être utilisés dans des conditions de basse pression. +se-space-electromagnetics-laboratory=Installation conçue pour la manipulation de champs magnétiques intenses et de fortes tensions électriques +se-space-genetics-laboratory=Un laboratoire consacré au séquençage et à la manipulation génétique, aussi capable de réaliser l'impression génétique de cultures. +se-space-gravimetrics-laboratory=Analyse et simule les perturbations gravitationelles. +se-space-growth-facility=Assure la croissange d'échantillons biologiques en conditions contrôlées impossibles ailleurs, comme la microgravité. +se-space-hypercooling=Réalise un échange de chaleur sur un liquide réfrigérant, permettant d'en refroidiune partie en réchauffant l'autre. +se-space-laser-laboratory=Permet des expériences utilisant des lasers. Le port de protections oculaires est obligatoire." (comme plus haut). +se-lifesupport-facility=Processus de support de vie permettant l'exploration et le maintien de la vie dans des environnements hostiles. +se-space-manufactory=Une installation clé pour la production en masse dans l'espace. +se-space-material-fabricator=Une installation permettant la synthèse de nouveaux éléments par fusion nucléaire d'éléments légers en éléments plus lourds. Un croisement entre un collisionneur de particules et une imprimante 3D +se-space-matter-fusion=Permet la nucléosynthèse de nouveaux éléments par fusion nucléaire de noyaux légers en atomes plus lourds. +se-space-mechanical-laboratory=Propose toute la gamme de manipulations mécaniques classiques : torsion, compression, déchirement, vibrations etc… +se-space-particle-accelerator=Accélère les particules à une vitesse proche de celle de la lumière. +se-space-particle-collider=Chambre de collisions pour particules haute vélocité et analyse des résultats. +se-space-plasma-generator=Permet de générer une large gamme de plasmas. +se-space-platform-plating=Élément de plateforme spatiale robuste à la surface égale. Parfait pour se déplacer rapidement. +se-space-platform-scaffold=Élément de structure basique pour plateforme spatiale. Permet d'y fixer des structures, sans être idéal pour s'y déplacer aisément. +se-space-radiation-laboratory=Une installation conçue pour la manipulation de matériaux radioactifs en toute sécurité. Permet d'effectuer les opérations de traitement de l'uranium. +se-space-radiator=Dissipe la chaleur exédentaire d'un fluide réfrigérant par rayonnement. +se-space-radiator-2=Dissipe la chaleur exédentaire d'un fluide réfrigérant par rayonnement. +se-space-radiating=Un processus de refroidissement plus lent du fluide réfrigérant qui permet de réduire les pertes par dégradation à chaque cycle. +se-space-rail=Rails conçu pour l'espace qui maintiennent le train sur la voie même en l'absence de gravité. Peuvent également être utilisés sur terre ferme pour des raisons esthétiques. +se-recycling-facility=Recyclage de nombreux sous-produits comme la ferraille en matériaux bruts. +se-space-science-lab=Ce laboratoire permet de mener à bien des recherches avancées sur les sciences spatiales. +se-space-simulation-ab=Une simulation informatique rendue plus efficace par l'association de plusieurs disciplines. +se-space-simulation-am=Une simulation informatique rendue plus efficace par l'association de plusieurs disciplines. +se-space-simulation-as=Une simulation informatique rendue plus efficace par l'association de plusieurs disciplines. +se-space-simulation-bm=Une simulation informatique rendue plus efficace par l'association de plusieurs disciplines. +se-space-simulation-sb=Une simulation informatique rendue plus efficace par l'association de plusieurs disciplines. +se-space-simulation-sm=Une simulation informatique rendue plus efficace par l'association de plusieurs disciplines. +se-space-simulation-abm=Une simulation informatique rendue plus efficace par l'association de plusieurs disciplines. +se-space-simulation-asb=Une simulation informatique rendue plus efficace par l'association de plusieurs disciplines. +se-space-simulation-asm=Une simulation informatique rendue plus efficace par l'association de plusieurs disciplines. +se-space-simulation-sbm=Une simulation informatique rendue plus efficace par l'association de plusieurs disciplines. +se-space-simulation-asbm=Une simulation informatique rendue plus efficace par l'association de plusieurs disciplines. +se-space-solar-panel=Un panneau solaire à haut rendement sur lequel vous pouvez vous déplacer. +se-space-spectrometry-facility=Spectrophotométrie, chromatographie en phase gaseuse, spectrométrie de masse et autres analyses en spectrographie. +se-space-supercomputer=Améliore la vitesse des opérations de manipulation et traitement de données, et permet des simulations plus fines. +se-space-telescope=Un téléscope sophistiqué sensible à de multiples longueurs d'onde autour de la lumière visible. +se-space-telescope-gammaray=Les rayons gammas ne réfractent pas et ne peuvent donc pas être focalisés par effet lentille. Ce téléscope sophistiqué utilise un jeu de miroirs et de détecteurs spécifiques pour l'étude de ce rayonnement. +se-space-telescope-xray=Les rayons X sont bloqués par la plupart des atmosphères. Ce puissant télescope est conçu pour l'espace où l'atmosphère n'est pas un problème. +se-space-telescope-microwave=Un très grand téléscope conçu pour les micro-ondes et l'étude du fond diffus cosmologique. +se-space-telescope-radio=Un très grand téléscope capable de détecter les ondes radios faibles provenant de sources extrêmement lointaines. +se-space-thermodynamics-laboratory=Permet de mettre en œuvre une large gamme de procédés à haute température. Permet également la plupart des opérations de métallurgie, comme la fonderie. +se-spaceship=Permet de construire un vaisseau spatial élément par élément à partir de planchers et de parois pour vaisseaux spatiaux. Utilisez ensuite le poste de pilotage pour naviguer vers une autre planète, ou au-delà. +se-spaceship-integrity=Chaque niveau augmente de 100 la limite de contrainte d'intégrité structurelle de vos vaisseaux spatiaux. +se-factory-spaceship=Chaque niveau augmente de 500 la limite de contrainte d'intégrité structurelle de vos vaisseaux spatiaux. +se-superconductive-cable=Un câble composite supraconducteur qui ne nécessite pas de refroidissement actif. +se-teleportation=Débloque d'autres technologies de téléportation. Cette technologie ne fait rien par elle-même mais constitue une passerelle vers d'autres technologies. +se-tesla-gun=Éclairs en chaîne à tir rapide pouvant atteindre jusqu'à 30 cibles. Se propage de cible en cible avec longs arcs, ou le long du sol avec des petits arcs s'il n'y a pas de cibles. +se-thruster-suit=Une combinaison spatiale pourvue de propulseurs et de bottes magnétiques, ainsi que d'un support vie basique. Ne vous aventurez pas dans l'espace sans combinaison! +se-thruster-suit-2=Une combinaison spatiale améliorée, avec des propulseurs plus puissants, ainsi que davantage d'emplacements d'inventaire et de grille d'équipements. +se-thruster-suit-3=Une combinaison spatiale améliorée, avec des propulseurs plus puissants, ainsi que davantage d'emplacements d'inventaire et de grille d'équipements. +se-thruster-suit-4=Une combinaison spatiale améliorée, avec des propulseurs plus puissants, ainsi que davantage d'emplacements d'inventaire et de grille d'équipements. +space-science-pack=Permet la production de packs de science aérospatiale et la recherche des technologies débloquées par ceux-ci. +se-aeroframe-pole=Une barre en béryllium légère et résistante utilisée comme poutre structurelle dans la construction aérospatiale. +se-aeroframe-scaffold=Une pièce de structure en béryllium légère et résistante adaptée pour la construction du squelette interne des vaisseaux d'exploration ou celui des structures aérospatiales. +se-aeroframe-bulkhead=Une paroi en béryllium étanche, légère et resistante prévue pour servir de coque externe ou de cloison interne dans la construction d'aéronefs. +se-lattice-pressure-vessel=Un conteneur en béryllium pressurisé léger et résistant, pourvu d'un treillis interne qui permet de comprimer certains fluides au-delà de leurs limites normales. Le fluide sous pression peut s'évaporer en sécurité en cas de rupture. +se-heavy-girder=Une poutre structurelle robuste en iridium, principalement utilisée pour l'industrie lourde et les vaisseaux militaires lourds. +se-heavy-bearing=Un roulement robuste en iridium qui peut fonctionner indéfiniment sous des contraintes qui entraineraient l'écrasement de matériaux classiques. +se-heavy-composite=Une épaisse cloison presque impénétrable, pratiquement insensible à la chaleur, à la corrosion, aux radiations et aux forces mécaniques, mais qui est incroyablement lourde. +se-heavy-assembly=Un assemblage mécanique lourd d'engrenages et de composants configurables utilisé dans l'industrie lourde. +se-bioscrubber=Une chambre de traitement des matériaux qui utilise des processus biologiques pour décomposer les matériaux indésirables. +se-vitalic-epoxy=Une résine biologique incroyablement forte aux propriétés régénératives. +se-vitalic-reagent=Un réactif très performant aux usages multiples dans une large gamme de procédés chimiques. +se-vitalic-acid=Un cocktail concentré de plusieurs acides. +se-self-sealing-gel=Un gel visqueux sous pression, mais solide comme l'acier lorsqu'il est exposé au vide. Souvent utilisé comme film interne dans les cloisons pour assurer une protection passive contre les perforations. +se-holmium-cable=Un câble gainé spécialement conçu pour éliminer les bruits indésirables sur la ligne qui peuvent interférer avec les appareils électroniques sensibles. +se-holmium-solenoid=Un électroaimant extrêmement puissant. +se-quantum-processor=Exploite les phénomènes d'intrication et de superposition quantique pour une excellente efficacité de calcul sur les problèmes complexes. +se-dynamic-emitter=Un système capable d'émettre un faisceau sur une longueur d'onde précise et rapidement ajustable. Permet de changer rapidement de propriétés pour une large gamme d'applications. +se-naquium-cube=Tirer parti de l'interaction inhabituelle du naquium avec l'espace-temps pour replier un grand volume en un petit cube. +se-naquium-tessaract=Cet étrange objet présente une forme cubique au repos mais peut se décaler vers une gamme d'autres formes géométriques lorsque tourné ou accéléré. +se-naquium-processor=Le calcul à l'intérieur d'un tessaract de naquium permet de dépasser certaines des limitations à la densité de calcul d'un processeur classique. +effect-transmission=Le diffuseur de modules diffuse l'effet des modules insérés aux structures amies proches avec une portée de 3 tuiles. Plusieurs diffuseurs affectant la même structure entraineront une surcharge et provoqueront son arrêt. 8 emplacements de modules. +se-wide-beacon=Le diffuseur de modules grande portée diffuse l'effet des modules insérés aux structures amies proches avec une portée de 14 tuiles. Plusieurs diffuseurs affectant la même structure entraineront une surcharge et provoqueront son arrêt. 15 emplacements de modules. +se-wide-beacon-2=Le diffuseur de modules grande portée avancé diffuse l'effet des modules insérés aux structures amies proches avec une portée de 14 tuiles. Plusieurs diffuseurs affectant la même structure entraineront une surcharge et provoqueront son arrêt. 20 emplacements de modules. +se-lifesupport-equipment-1=Améliore l'efficacité du support de vie de +100% (additif). A utiliser de pair avec une combinaison spatiale , sinon l'efficacité sera réduite de moitié et le module ne fonctionnera pas dans l'espace. +se-lifesupport-equipment-2=Améliore l'efficacité du support de vie de +200% (additif). A utiliser de pair avec une combinaison spatiale , sinon l'efficacité sera réduite de moitié et le module ne fonctionnera pas dans l'espace. +se-lifesupport-equipment-3=Améliore l'efficacité du support de vie de +400% (additif). A utiliser de pair avec une combinaison spatiale , sinon l'efficacité sera réduite de moitié et le module ne fonctionnera pas dans l'espace. +se-lifesupport-equipment-4=Améliore l'efficacité du support de vie de +800% (additif). A utiliser de pair avec une combinaison spatiale , sinon l'efficacité sera réduite de moitié et le module ne fonctionnera pas dans l'espace. +se-supercharger=Peut recharger jusqu'à 64 robots simultanément à grande vitesse. Consomme jusqu'à 1GW. +se-pylon=Distribue de l'énergie électrique. Portée du câble : 64. +se-pylon-substation=Distribue de l'énergie électrique. Portée du câble : 64, zone de distribution : 64x64 +se-pylon-construction=Distribue de l'énergie électrique et étend le réseau logistique. Portée du câble : 64, Zone de construction : 64x64. +se-pylon-construction-radar=Distribue de l'énergie électrique, étend le réseau logistique et donne une vision radar. Portée du câble : 64, Zone de construction et de vision : 256 * 256, Zone d'approvisionnement logistique 4x4. +se-shield-projector=Crée un champ de force protecteur. La consommation augmente lorsque le projecteur est en charge ou que le champ de force subit des dégâts. Le champ de force peut bloquer les projectiles des cracheurs si le mod "Walls Block Spitters" est installé. +se-deep-space-transport-belt=Des convoyeurs spatiaux avancés à longue distance qui peuvent être placés dans l'espace. Plusieurs couleurs peuvent être utilisées pour facilement identifier chaque ligne de loin. +se-big-turbine=Un grand générateur de 1GW qui consomme de la vapeur à 5000°C, rend de la vapeur à 500°C à l'autre extrémité et rejette de l'eau sur les côtés. Rendement de 99 %, et 99% de conservation de la quantité d'eau. +se-big-heat-exchanger=Un grand échangeur de chaleur conçu pour les températures extrêmes. +se-addon-power-pole=Un petit poteau électrique conçu pour être fixé aux bâtiments pour un contrôle précis de la couverture électrique. +se-zone-discovery-random=Permet la découverte d'un nouveau corps céleste au hasard grâce à vos téléscopes. +se-zone-discovery-targeted=Permet la découverte d'un nouveau corps céleste riche en une ressource spécifique. Sélectionnez les ressources que vous voulez rechercher dans [img=virtual-signal/informatron] l'Informatron > Découverte de zones. +se-zone-discovery-deep=Permet la découverte d'une nouvelle zone d'intérêt dans les étendues interstellaires. +se-delivery-cannon=Un canon électromagnétique capable de projeter des ressources en orbite et au-delà, et un système de réception pour les récupérer en sécurité. +se-delivery-cannon-weapon=Un canon électromagnétique capable de projeter des munitions spéciales, comme un bombe atomique, en orbite et au-delà. +se-spaceship-clamps=Permet de placer des fixations d'amarrage afin que les vaisseaux spatiaux puissent se fixer à un endroit précis en faisant correspondre les emplacements des fixations. L'automatisation nécessite des signaux "Amarrage vers" et "Amarrage à" envoyés dans la console. +se-bio-upgrade-constitution=Augmente la santé maximale. +se-bio-upgrade-strength=Augmente la taille d'inventaire de votre personnage. +se-bio-upgrade-agility=Augmente la vitesse de déplacement de votre personnage. +se-bio-upgrade-dexterity=Augmente la vitesse de fabrication de votre personnage +se-bio-upgrade-intelligence=Améliore la productivité des laboratoires, augmentant le progrès obtenu pour chaque pack de science consommé. +se-energy-beaming=Un faisceau d'énergie intense qui peut être utilisé comme arme interplanétaire, ou pour transmettre de l'énergie là ou vous en avez besoin +se-energy-beam-defence=Défend contre les faisceaux d'énergie basés dans l'espace et les éjections de masse coronale. Fonctionne en faisant léviter des particules magnétiques dans une bulle protectrice, puis réaligne et agglomère les particules selon les besoins pour diffuser les faisceaux d'énergie hostiles. +se-nexus=Un dispositif qui peut être activé sur un vaisseau spatial se déplaçant dans l'espace interstellaire pour générer des données. Avec une technologie supplémentaire, il peut activer un champ de distorsion pour la condition de victoire du vaisseau spatial. +se-spaceship-victory=Permet au Nexus d'activer un propulseur à distortion pour s'échapper de l'amas d'étoiles local. Le Nexus doit alors être placé dans un vaisseau spatial avec un score d'intégrité de 3000+ . Réussir à maintenir une vitesse de 250+ pendant 60s avec le Nexus en mode de propulsion par distorsion permet de gagner la partie. +se-arcosphere=Permet de collecter les arcosphères disséminées dans les étendues interstellaires. +se-arcosphere-folding=Permet d'utiliser les arcosphères comme tenailles extradimensionelles. +se-space-probe=Un silo à fusée pour le lancement de sondes spatiales. Peut également être utilisé pour lancer des satellites à moindre coût. +se-linked-container=Un coffre lié à d'autres grâce à un espace extradimensionel. Les liens du coffre dépendent de la première surface sur laquelle il est placé. + +[modifier-description] +tesla-shooting-speed-bonus=Vitesse de tir du fusil Tesla +tesla-damage-bonus=Bonus de dégâts du fusil Tesla +railgun-damage-bonus=Bonus de dégâts du fusil électromagnétique +railgun-shooting-speed-bonus=Vitesse de tir du fusil électromagnétique +cryogun-shooting-speed-bonus=Vitesse de tir du Cryogun +cryogun-damage-bonus=Bonus de dégâts du Cryogun +character-running-speed=Vitesse de déplacement du personnage : +__1__ +character-crafting-speed=Vitesse de fabrication du personnage : +__1__ + +[virtual-signal-name] +signal-speed=Signal de vitesse +se-signal-speed=Signal de vitesse +signal-distance=Signal de distance +se-signal-distance=Signal de distance +se-star=Étoile +se-planet=Planète +se-planet-orbit=Orbite planétaire +se-moon=Lune +se-moon-orbit=Orbite lunaire +se-asteroid-belt=Ceinture d'astéroïdes +se-asteroid-field=Champ d'astéroïdes +se-anomaly=Anomalie +se-meteor=Météorite +se-spaceship=Vaisseau spatial +se-cargo-rocket=Fusée cargo +se-remote-view=Vue à distance +se-death=Mort +se-character-corpse=Cadavre +se-ruin=Ruine +se-accolade=Récompense +se-remove=Enlever +se-radius=Rayon +se-hierarchy=Hiérarchie +se-spaceship-launch=Lancement du vaisseau spatial +se-anchor-using-left-clamp=Amarrage en utilisant le système d'amarrage gauche +se-anchor-using-right-clamp=Amarrage en utilisant le système d'amarrage droit +se-anchor-to-left-clamp=Amarrage au système d'amarrage gauche ciblé +se-anchor-to-right-clamp=Amarrage au système d'amarrage droit ciblé +se-beacon-overload=Surchage de diffuseurs +se-heat=Chaleur + +[controls] +se-remote-view=Vue satellite +se-universe-explorer=Explorateur d'univers +se-respawn=Réapparition +se-mode-toggle=Choisir le mode de fonctionnement de la structure + +[shortcut] +se-remote-view=Vue satellite +se-universe-explorer=Explorateur d'univers +se-respawn=Réapparition + +[shortcut-name] +se-remote-view=Vue Satellite [__CONTROL__se-remote-view__] +se-universe-explorer=Explorateur d'univers [__CONTROL__se-remote-view__] +se-respawn=Réapparition [__CONTROL__se-respawn__] + +[tile-name] +se-space-platform-plating=Plateforme spatiale avancée +se-space-platform-scaffold=Plateforme spatiale +se-space-platform-underlay=Espace +se-space-platform-underlay-l=Espace +se-space-platform-underlay-r=Espace +se-space=Vide spatial +se-regolith=Régolithe +se-asteroid=Astéroïde +se-spaceship-floor=Plancher de vaisseau spatial + +[mod-setting-name] +se-meteor-interval=Intervalle maximal entre les météorites +se-plague-max-runtime=Durée d'exécution maximale de l'agent biologique +se-planets=Nombre de planètes +se-planet-size=Taille de la planète (1 à 10000%) +se-seed=Chaine de génération des planètes +se-skip-experimental-warning=Ne pas afficher l'avertissement de mode expérimental +se-print-meteor-info=Afficher les alertes de chute de météorites sur la console +se-print-satellite-discovered-nothing=Afficher une alerte lorsqu'un satellite ne découvre rien +se-space-pipe-capacity=Contenu max du tuyau spatial +se-electric-boiler=Chaudière électrique +se-deep-space-belt-speed=Vitesse du convoyeur spatial avancé +se-deep-space-belt-black=Convoyeurs spatiaux avancés noirs +se-deep-space-belt-white=Convoyeurs spatiaux avancés blancs +se-deep-space-belt-red=Convoyeurs spatiaux avancés rouges +se-deep-space-belt-yellow=Convoyeurs spatiaux avancés jaunes +se-deep-space-belt-green=Convoyeurs spatiaux avancés verts +se-deep-space-belt-cyan=Convoyeurs spatiaux avancés cyans +se-deep-space-belt-blue=Convoyeurs spatiaux avancés bleus +se-deep-space-belt-magenta=Convoyeurs spatiaux avancés magenta +se-space-science-pack=Méthode alternative pour les packs de science spatiale +se-never-show-lifesupport=Ne jamais afficher l'interface du support de vie +se-show-zone-preview=Afficher l'aperçu des surfaces +se-pylon-charge-points=Points de recharge sur les pylônes +se-cmes-max-frequency=Intervalle max entre les Éjections de Masse Coronale +se-spawn-small-resources=Ressources de départ supplémentaires +se-show-overhead-button-satellite-mode=Afficher le bouton de vue satellite +se-show-overhead-button-interstellar-map=Afficher le bouton de la carte interstellaire +se-show-overhead-button-universe-explorer=Afficher le bouton de l'explorateur d'univers +se-scan-search-budget=Taux de balayage du scan satellite +se-scan-chart-budget=Taux de génération du scan satellite +se-scan-alert-interval=Intervalle entre les alertes du scan satellite +se-supercharger-individual-charge-rate=Puissance de recharge de chaque port du Superchargeur (MW) + +[mod-setting-description] +se-meteor-interval=L'intervalle maximum entre deux chutes de météorites. Le temps entre deux évèvements est aléatoire entre 1min et cette valeur. +se-plague-max-runtime=Durée maximale d'effet de l'agent biologique planétaire, en minutes. Après ce délai, tous les particules, arbres et ennemis sont détruits. +se-planets=Ne modifiez pas ce réglage sur une partie en cours. +se-planet-size=Ne modifiez pas ce réglage sur une partie en cours. +se-seed=Ne modifiez pas ce réglage sur une partie en cours. +se-skip-experimental-warning=L'avertissement de statut expérimental du mod n'apparaitra pas au lancement d'une nouvelle partie (Vous ne pourrez pas non plus voir si ce message devait être mis à jour par la suite). +se-print-meteor-info=Vous permet de retrouver les alertes de chutes de météorites après que l'alerte principale soit passée en appuyant sur la touche __CONTROL__toggle-console__ key. +se-print-satellite-discovered-nothing=Une alerte est affichée à chaque lancement de satellite pour vous informer d'une éventuelle nouvelle découverte. Ce réglage permet de désactiver cette alerte si vous n'avez rien découvert de neuf. +se-space-pipe-capacity=Contenu de chaque segment de tuyau spatial +se-electric-boiler=Ajoute une chaudière électrique au jeu +se-deep-space-belt-speed=Les convoyeurs spatiaux avancés sont équilibrés pour être les meilleurs convoyeurs disponibles. Si vous jouez avec d'autres mods qui vous donnent accès à d'encore meilleures options, vous pouvez ajuster la vitesse des convoyeurs spatiaux avancés ici. +se-deep-space-belt-black=Permet de désactiver les recettes pour les convoyeurs spatiaux avancés noirs pour réduire l'encombrement de l'interface utilisateur. +se-deep-space-belt-white=Permet de désactiver les recettes pour les convoyeurs spatiaux avancés blancs pour réduire l'encombrement de l'interface utilisateur. +se-deep-space-belt-red=Permet de désactiver les recettes pour les convoyeurs spatiaux avancés rouges pour réduire l'encombrement de l'interface utilisateur. +se-deep-space-belt-yellow=Permet de désactiver les recettes pour les convoyeurs spatiaux avancés jaunes pour réduire l'encombrement de l'interface utilisateur. +se-deep-space-belt-green=Permet de désactiver les recettes pour les convoyeurs spatiaux avancés verts pour réduire l'encombrement de l'interface utilisateur. +se-deep-space-belt-cyan=Permet de désactiver les recettes pour les convoyeurs spatiaux avancés cyans pour réduire l'encombrement de l'interface utilisateur. +se-deep-space-belt-blue=Permet de désactiver les recettes pour les convoyeurs spatiaux avancés bleus pour réduire l'encombrement de l'interface utilisateur. +se-deep-space-belt-magenta=Permet de désactiver les recettes pour les convoyeurs spatiaux avancés magenta pour réduire l'encombrement de l'interface utilisateur. +se-space-science-pack=Si un autre mod ajoute une autre méthode d'obtention du pack de science spatiale, cette méthode sera utilisée. Si il n'y a pas possibilité d'en fabriquer, Space Exploration peut soit supprimer cet objet, soit l'utiliser comme un pack de science d'Optimisation. +se-never-show-lifesupport=Si cette case est cochée, l'interface du support de vie ne sera jamais affichée, même si vous êtes en train de suffoquer. +se-show-zone-preview=Décochez pour désactiver la fenêtre d'aperçu de surface dans l'explorateur d'univers. Peut améliorer les performances si vous utilisez l'explorateur en même temps que certains outils de debuggage de Factorio. +se-pylon-charge-points=Décochez pour enlever les points de charge des pylônes de construction. Cela permet de contrôler le comportement de chargement des robots, mais vous devrez peut-être ajouter d'autres possibilités de chargement le long des trajets longue distance. +se-cmes-max-frequency=Intervalle maximal de répétition des éjections de masse coronale (EMC). La valeur est exprimée en heures, 0 = désactivé. La première EMC est programmée à la première minute du jeu et est généralement inoffensive. La seconde est prévue environ 48 heures plus tard. Le délai entre les répétitions est compris entre 50% et 100% du réglage de l'intervalle maximum. Un réglage non nul ne s'applique qu'aux nouveaux événements ; une fois qu'une heure d'arrivée prévue a été fixée, elle ne sera pas affectée. Un réglage à zéro effacera toutes les EMC programmées, bien que le changement puisse prendre jusqu'à une minute pour prendre effet. +se-spawn-small-resources=Ajoute quelques petits gisements de ressources supplémentaires proches les un des autres dans la zone de départ. +se-show-overhead-button-satellite-mode=Ajoute un bouton en haut à gauche pour afficher la vue satellite +se-show-overhead-button-interstellar-map=Ajoute un bouton en haut à gauche pour afficher la carte interstellaire +se-show-overhead-button-universe-explorer=Ajoute un bouton en haut à gauche pour afficher l'explorateur d'univers +se-scan-search-budget=Scan de la surface par satellite : le nombre de blocs (zones 32x32) qui peuvent être traités simultanément. Une valeur plus élevée permet de survoler rapidement les blocs déjà révélés pour commencer à travailler sur les zones encore inconnues. +se-scan-chart-budget=Scan de la surface par satellite : le nombre de blocs (zones 32x32) qui peuvent être ajoutés dans le tampon d'attente en parallèle. Les nouveaux ajouts ne seront pas traités avant que les blocs précédents soient révélés. +se-scan-alert-interval=L'intervalle en secondes entre les alertes de mise à jour du scan de surface. Le fait de révéler les surfaces augmente la taille du fichier de sauvegarde du jeu ; il est donc préférable de ne pas en laisser un en marche et de les oublier. +se-supercharger-individual-charge-rate=Puissance de chaque port de recharge du Superchargeur, en MW (sans influence sur la puissance max disponible). La valeur minimum (par défaut) est de 90MW, ce qui permet de recharger un robot du jeu de base en 1 tick (1/60 s). Valeur max 1GW, la puissance max mobilisée par le superchargeur. + +[string-mod-setting] +se-space-science-pack-Remove=Supprimer complètement +se-space-science-pack-Replace=Remplacer par le pack de science des fusées +se-space-science-pack-OptimisationUranium=Optimisation : Recette d'uranium-cryo +se-space-science-pack-OptimisationFish=Optimisation : Recette de vita-vulca-poisson + +[autoplace-control-names] +planet-size=Taille de la planète +se-water-ice=Glace d'eau (uniquement dans l'espace) +se-methane-ice=Glace de méthane (uniquement dans l'espace) +se-cryonite=Cryonite (absent sur le monde de départ) +se-vulcanite=Vulcanite (absent sur le monde de départ) +se-vitamelange=Vitamélange (absent sur le monde de départ) +se-beryllium-ore=Béryllium (absent sur le monde de départ) +se-holmium-ore=Holmium (absent sur le monde de départ) +se-iridium-ore=Iridium (absent sur le monde de départ) +se-naquium-ore=Minerai de naquium (uniquement dans l'espace) + +[map-gen-preset-name] +space-exploration=Valeurs par défaut de Space Exploration + +[map-gen-preset-description] +space-exploration=Valeurs par défaut de Space Exploration + +[tooltip-category] +shot=Utilisation diff --git a/space-exploration_0.5.58/space-exploration/locale/hw/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/hw/strings.cfg new file mode 100644 index 0000000..d79b086 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/hw/strings.cfg @@ -0,0 +1,823 @@ +spaceship-integrity100=""+100 שלמות מבנית חללית +spaceship-integrity300=+ 300 שלמות מבנית חללית +spaceship-integrity500=+500 שלמות מבנית חללית +core-mining-productivity-5= 5% Core פרודוקטיביות הכרייה + + +[space-exploration] +rename-something=שינוי שם __1__ +trigger-none=ללא (ידני) + +trigger-fuel-full=הפעלה על דלק מלא +trigger-cargo-full=הפעלה על מטען מלא +trigger-fuel-full-signal=הפעלה על אות ירוק כאשר דלק מלא +trigger-cargo-full-signal=הפעלה על גרין סיגנל כאשר מטען מלא +destination-type-zone=מיקום משוער +destination-type-landing-pad=מטענים נחיתה Pad +button-launch=הפעלה +button-launch-disabled=הפעלה (מושבת) +destination-crash-warning=אזהרה: בחר בלוח המטען של המטען כדי להקטין את סיכויי ההתרסקות +recipe-to=__1__ אל __2__ +recipe-from=__1__ מאת __2__ +remote-view=ניווט לוויין Uplink [__CONTROL__se-remote-view__] +remote-view-instruction=השקת יותר לוויינים כדי לגלות כוכבים נוספים, כוכבי לכת, ירחים, ואזורים אחרים. +exit-remote-view=צא מלוויין ניווט לווייני [__CONTROL__se-remote-view__] +remote-view-requires-satellite=אתה חייב להשיק לוויין להשתמש uplink הלוויין ניווט. +satellite-launched=לוויין פריסה וסריקה לאובייקטים אסטרונומיים. השתמש [IMG = אות וירטואלי / תצוגת-מרחוק-מרחוק] ניווט לווייני כדי להציג (לחץ על [color = green] [__ CONTROL__se-remote-View __] [/ color] או השתמש בסרגל קיצור הדרך). +satellite-discovered-platform=[color = cyan] הלוויין גילה חלק משטח פלטפורמה. [/ color] +source-discovered-zone=[color = cyan] __ 1__ גילה __2__ חדש: [/ color] [img = __ 3__] [color = white] __ 4 __ [/ color] +discovered-zone=[color = cyan] התגלה חדש __1__: [img = __ 2__] [/ color] [color = white] __ 3 __ [/ color] +space-capsule=קפסולת חלל +player-died=__1__ מת +launch-suit-warning=כדי להימנע מחנק, אנא שקול ללבוש חליפה thruster שלך. +suffocating-warning=אתה נחנק. קבל בקפסולה בחלל או ללבוש חליפה שלך thruster. +rocket_survivability_fail=רקטת מטען פגעה במעבר והיא מנותקת. כמו כן, יעצו מחקרים נוספים בנושא שרידות רקטות ומטעני בטיחות מטענים. +respawn-if-stranded=אם תקועים אתה יכול להשתמש קיצור resawn [__CONTROL__se-respawn__] +filter-list=לחפש +clear-filter=חיפוש נקי +zone-tooltip=__1__ __2__ __3__ __4__ __5__ __6__ __7__ +zone-tooltip-type=\ nType: __1__ +zone-tooltip-resources=\ n משאב ראשי: __1__ +zone-tooltip-lifesigns=\ nLesigns: __1__ +zone-tooltip-daynight=\ n יום / לילה מחזור: __1 דקות +zone-tooltip-bot-attrition=\ n רובוט הפרעה: __1__ +construction-denied=לא ניתן להציב כאן. +construction-denied-vehicle-in-space=לא ניתן למקם כלי רכב קרקעיים בחלל. +currently-viewing=כרגע צופה: __1__ + +[entity-name] +destroyed-cargo-pod=תרמיל מטען נהרס +meteorite=מטאוריט +rocket-silo=סילו טיל בלווין +rocket-fragment=שבר רוקט +se-antimatter-reactor=כור אנטי-חומר +se-cargo-rocket-cargo-pod=תרמיל מטענים +se-condenser-turbine=טורבינת קונדנסר +se-condenser-turbine-tank=טורבינת קונדנסר +se-condenser-turbine-generator=טורבינת קונדנסר +se-core-fragment-processor=מעבד הליבה שבר +se-core-miner=תרגיל הכרייה Core +se-core-miner-drill=תרגיל הכרייה Core +se-electric-boiler=דוד חשמלי +se-fluid-burner-generator=גנרטור מבער נוזל +se-fuel-refinery=זיקוק דלק +se-meteor-defence-container=מיתקן ביטחוני מטאור +se-meteor-defence-charger=מיתקן ביטחוני מטאור +se-meteor-point-defence-container=הגנת נקודת מטאור +se-meteor-point-defence-charger=הגנת נקודת מטאור +se-methane-ice=קרח מתאן +se-rocket-launch-pad=סילו טיל מטענים +se-rocket-launch-pad-tank=סילו טיל מטענים +se-rocket-launch-pad-silo=סילו טיל מטענים +se-rocket-launch-pad-combinator=סילו טיל מטענים +se-rocket-launch-pad-_-seat=סילו טיל מטענים +se-rocket-launch-pad-settings=סילו טיל מטענים +se-rocket-landing-pad=מנחת מטענים +se-space-accumulator=מצברי שטח +se-space-astrometrics-laboratory=מעבדת אסטרומטריקה +se-space-biochemical-laboratory=מעבדה ביוכימית +se-space-assembling-machine=מכונית להרכבת שטח +se-space-capsule-_-vehicle=קפסולת חלל +se-space-curved-rail=רכבת שטח +se-space-decontamination-facility=מתקן טיהור +se-space-electromagnetics-laboratory=מעבדת אלקטרומגנטיקה +se-space-genetics-laboratory=המעבדה לגנטיקה +se-space-growth-facility=מתקן צמיחה +se-space-gravimetrics-laboratory=מעבדת Gravimetrics +se-space-hypercooler=Hypercooler +se-space-laser-laboratory=מעבדת ליזר +se-space-lifesupport-facility=מתקן תמיכה בחיים +se-space-manufactory=manufactory שטח +se-space-material-fabricator=מפברק חומר +se-space-mechanical-laboratory=מעבדה מכאנית +se-space-particle-accelerator=מאיץ חלקיקים +se-space-particle-collider=מאיץ חלקיקים +se-space-plasma-generator=גנרטור פלזמה +se-space-radiation-laboratory=מעבדת קרינה +se-space-radiator=רדיאטור תרמי +se-space-recycling-facility=מתקן מיחזור +se-space-pipe=צינור שטח +se-space-pipe-to-ground=צינור שטח לקרקע +se-space-science-lab=מעבדת מדעי שטח +se-space-solar-panel=פאנל סולארי שטח +se-space-solar-panel-2=שטח מתקדם פאנל סולארי +se-space-spectrometry-facility=מתקן ספקטרומטריית +se-space-straight-rail=רכבת שטח +se-space-supercomputer-1=מחשב העל +se-space-supercomputer-2=מחשב העל קוונטית +se-space-supercomputer-3=מחשב על עצבי +se-space-telescope-radio=רדיו טלסקופ +se-space-telescope-microwave=טלסקופ מיקרוגל +se-space-telescope=טלסקופ +se-space-telescope-xray=טלסקופ xray +se-space-telescope-gammaray=טלסקופ קרני גמא +se-space-thermodynamics-laboratory=מעבדת תרמודינאמיקה +se-space-splitter=ספליטר שטח +se-space-transport-belt=שטח התחבורה חגורה +se-space-underground-belt=שטח תחתי חגורה +se-spaceship-antimatter-engine=Spaceship אנטי-חומר מנוע +se-spaceship-antimatter-booster-tank=ספינת חלל אנטי-חומר המאיץ טנק +se-spaceship-console=קונסולת ספינת חלל +se-spaceship-gate=דלת ספינת חלל +se-spaceship-obstacle=פסולת חלל +se-spaceship-rocket-engine=ספינת חלל רקטות מנועים +se-spaceship-rocket-booster-tank=ספינת חלל טיל בטנק המאיץ +se-spaceship-wall=קיר ספינת חלל +se-water-ice=מי קרח +small-asteroid=אסטרואיד קטן + +[entity-description] +rocket-silo=לשגר לווין לחלל לסרוק שטח, ואולי לגלות כוכבי לכת חדשים, ולהשיג כמות קטנה של מדעי החלל. +se-antimatter-reactor=ומשמידה אנטי-חומר עם חומר כדי לייצר חום קיצוני. +se-condenser-turbine=75% את היעילות של טורבינת קיטור אלא רק משתמשים 1% מהמים. +se-core-fragment-processor=חילוץ משאבים שברי ליבה. +se-core-miner=מאפשר אינסופית להפקת אוצרות מן הפלנטות והירחים אבל יש תשואה שולית פוחתת אם מרובים משמשים באותו הגוף. +se-core-miner-drill=מאפשר אינסופית להפקת אוצרות מן הפלנטות והירחים אבל יש תשואה שולית פוחתת אם מרובים משמשים באותו הגוף. צורכת 50MW. +se-electric-boiler=יצירת קיטור ממים באמצעות אנרגיה חשמלית. +se-fluid-burner-generator=דורש דלק נוזלי עם ערך אנרגיה. ברנס נוזל לייצור חשמל. פשוט וקומפקטי אבל חסר את יעילות האנרגיה של מערכות מבוססות קיטור גדול. +se-meteor-defence-container=האם ניתן להגן על כדור הארץ כולו מן מטאורים אבל יכול לירות 1 מטאור רק זמן. חייב להיות עמוס תחמושת מטאור ביטחון טעון במלואה לפטר. דיוק 80%, לוקח זמן לנוח אחרי הירי. +se-meteor-defence-charger=האם ניתן להגן על כדור הארץ כולו מן מטאורים אבל יכול לירות 1 מטאור רק זמן. חייב להיות עמוס תחמושת מטאור ביטחון טעון במלואה לפטר. דיוק 80%, לוקח זמן לנוח אחרי הירי. +se-meteor-point-defence-container=מגן על שטח מן המטאורים. מסוגל לירות עד 4 מטאורים מטחים. חייב להיות עמוס תחמושת הגנת נקודת מטאור ו טעון במלואה לפטר. טווח 64, 50% דיוק, לוקח זמן לנוח אחרי הירי. +se-meteor-point-defence-charger=מגן על שטח מן המטאורים. מסוגל לירות עד 4 מטאורים מטחים. חייב להיות עמוס תחמושת הגנת נקודת מטאור ו טעון במלואה לפטר. טווח 64, 50% דיוק, לוקח זמן לנוח אחרי הירי. +se-rocket-launch-pad=משיקת מלאי לחלל שלה. האם ניתן לקחת נוסעים, להיכנס באמצעות ENTER ליד דלת הכניסה. +se-rocket-landing-pad=אתר משלוח מטען עבור קפסולות רקטות מטען. +se-space-assembling-machine=מכונית להרכבה שונה שיכול לעבוד בחלל. +se-space-astrometrics-laboratory=משלב, משווה, מכמת מקורות שונים של מידע אסטרונומי. +se-space-biochemical-laboratory=מעבדת כימית מתקדמת המתמחה הביו-כימיה. ניתן גם לבצע כימיים בסיסיים יותר ועיבוד נפט. +se-space-capsule-_-vehicle=ניתן להשתמש בו כדי לקחת נוסע בחזרה אל פני שטח הכוכב הקרוב. הזן את הקפסולה באמצעות ENTER. +se-space-decontamination-facility=מנקה חומרים לשימוש בסביבות סטרילי, ומכין נוזלים לשימוש בתנאי לחץ נמוך. +se-space-electromagnetics-laboratory=ציוד עבור שדה מגנטי חזק ויישומי מתח גבוהים מאוד. +se-space-genetics-laboratory=מעבדת מוקדש רצף גנטי, הנדסה גנטית, והדפסה גנטית של תרבויות. +se-space-gravimetrics-laboratory=ניתוח המדמה הפרעות הכבידה. +se-space-growth-facility=גדל דגימות ביולוגיות תחת מגוון של תנאים מבוקרים שאינם אפשריים במקום אחר, מיקרו-כבידה כזה, +se-space-hypercooler=מבצע החלפת חום על thermofluid, מה שהופך חם אחד והשני קר. +se-space-laser-laboratory=ניסויים עם לייזרים. הגנה על עיניים חייבת להיות משוחקת. +se-space-lifesupport-facility=לקיום חיים בסביבות עוינות יותר. +se-space-manufactory=טכנולוגיית מפתח לייצור המוני בחלל. +se-space-material-fabricator=Synthesises חומרים חדשים. הכלאה בין מאיץ חלקיקים ומדפסת 3D. +se-space-mechanical-laboratory=מספק מגוון של תהליכים מכניים: ריסוק, קריעה, מריחה, רטט, וכו ' +se-space-particle-accelerator=מאיץ חלקיקים קרובים למהירות האור. +se-space-particle-collider=מתנגש חלקיקים במהירות גבוהה ומנתח את התוצאות. +se-space-pipe=אתה יכול ללכת על זה. +se-space-pipe-to-ground=מגוון יקר ומוגבל, רק כדי לשמש בעת הצורך. אתה יכול ללכת לאורך צינור החלל. +se-space-plasma-generator=יוצר מגוון של פלזמות. +se-space-radiation-laboratory=מקום בטוח יחסית לשחק עם חומר רדיואקטיבי. יכול לשמש לעיבוד אורניום. +se-space-radiator=מקרין משם עודף חום מן thermofluid השחון. +se-space-recycling-facility=ממחזר גרוטאות ומוצרי לוואי אחרים לתוך משאבים. +se-space-solar-panel=פאנל סולארי יעילות גבוהה עבור החלל. +se-space-solar-panel-2=פאנל סולארי גבוהה ויעילות מתקדמים בחלל. +se-space-spectrometry-facility=Spectrophotometry, גז כרומטוגרפיה, ספקטרומטריית מסה, ואת spectrography האחר. דברים באש לעבר הקיר, להפוך אותו לכופף, ונראה לאן זה יגיע. +se-space-supercomputer-1=מניפולציה נתונים, עיבוד הסימולציה. +se-space-supercomputer-2=מחשוב קוונטי. נתונים משופרים מניפולציה, עיבוד סימולציה. +se-space-supercomputer-3=רשת עצבית מסתגלת על מסגרת מחשוב קוונטי. נתונים משופרים מניפולציה, עיבוד סימולציה. +se-space-straight-rail=עוצב עבור שטח אבל ניתן להשתמש בשטח מדי. +se-space-science-lab=האם ניתן להשתמש חבילות מדע מתקדמות. יש להציב בחלל. +se-space-telescope=טלסקופ מתוחכם רגיש לאורכי גל שונים ברחבי הספקטרום הנראה. +se-space-telescope-gammaray=קרני גמא לא לשבור. טלסקופ רב עוצמה זו המשתמשת מראות גלאי מיוחד במקום. +se-space-telescope-xray=צילומי רנטגן נחסמים על ידי רוב אטמוספרות. טלסקופ רב עוצמה זה מיועד החלל שבו האווירה היא לא בעיה. +se-space-telescope-microwave=טלסקופ ענק שמזהה מיקרוגלי הרקע הקוסמי. +se-space-telescope-radio=טלסקופ ענק שמזהה גלי רדיו חלשים מאוד ממקורות מרחק. +se-space-thermodynamics-laboratory=מתחייב תהליכים כרוכים טמפרטורות קיצוניות. ניתן גם לבצע תהליכים תרמיים בסיסיים, כגון להתכה. +se-space-transport-belt=מפסיק את הפריטים שלך צף משם. +se-spaceship-antimatter-engine=ומשמידת זרם אנטי-חומר. נחשב מחצה הכלה חללית. +se-spaceship-antimatter-booster-tank=בעלת אנטי-חומר. חובה לשיגור חללית. +se-spaceship-console=השתמש כדי להזיז את החללית בין כוכבי לכת, ירחים, במסלולים, ושדות אסטרואיד. חייב להיות על הרצפה חללית, הכלול בתוך קירות / דלתות חלליות, אין פערים או חורים. בדיקת תקינות מדגישה בעיות. +se-spaceship-gate=שדה כוח מפסיק לחץ כשנפתחת הדלת. נחשב מחצה הכלה חללית. +se-spaceship-rocket-engine=דלק ברנס טילים נוזליים. נחשב מחצה הכלה חללית. +se-spaceship-rocket-booster-tank=בעלת דלק טילים נוזלי. חובה לשיגור חללית. +se-spaceship-wall=יש להציב על הרצפה חללית כדי להיחשב כחלק ספינה. נחשב מחצה הכלה חללית, פערים אלכסוניים לשבור בלימה. + +[equipment-name] +energy-shield-equipment=מגן אנרגיה +energy-shield-mk2-equipment=MK2 מגן אנרגיה +energy-shield-mk3-equipment=MK3 מגן אנרגיה +energy-shield-mk4-equipment=MK4 מגן אנרגיה +energy-shield-mk5-equipment=Mk5 מגן אנרגיה +energy-shield-mk6-equipment=MK6 מגן אנרגיה +se-adaptive-armour-equipment-1=MK1 שריון מסתגל +se-adaptive-armour-equipment-2=MK2 שריון מסתגל +se-adaptive-armour-equipment-3=MK3 שריון מסתגל +se-adaptive-armour-equipment-4=MK4 שריון מסתגל +se-adaptive-armour-equipment-5=Mk5 שריון מסתגל +se-rtg-equipment=ראדיוקלידבאטרי נייד +se-rtg-equipment-2=ראדיוקלידבאטרי MK2 נייד + +[equipment-description] +energy-shield-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +energy-shield-mk2-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +energy-shield-mk3-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +energy-shield-mk4-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +energy-shield-mk5-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +energy-shield-mk6-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +se-adaptive-armour-equipment-1=שריון המשתמשת באנרגיה כדי תיקון עצמי. לאט לאט מגביר ערך הגנה לאורך זמן. +se-adaptive-armour-equipment-2=שריון המשתמשת באנרגיה כדי תיקון עצמי. לאט לאט מגביר ערך הגנה לאורך זמן. +se-adaptive-armour-equipment-3=שריון המשתמשת באנרגיה כדי תיקון עצמי. לאט לאט מגביר ערך הגנה לאורך זמן. +se-adaptive-armour-equipment-4=שריון המשתמשת באנרגיה כדי תיקון עצמי. לאט לאט מגביר ערך הגנה לאורך זמן. +se-adaptive-armour-equipment-5=שריון המשתמשת באנרגיה כדי תיקון עצמי. לאט לאט מגביר ערך הגנה לאורך זמן. +se-rtg-equipment=הגנרטור התרמו רדיואיזוטופיים. גנרטור נייד שממירה את החום מן התפרקות רדיואקטיבית לחשמל. שמחזיק עשרות שנים ללא נדרש דלק נוסף. +se-rtg-equipment-2=הגנרטור התרמו רדיואיזוטופיים. גנרטור נייד משופרת שממירה את החום מן התפרקות רדיואקטיבית לחשמל. שמחזיק עשרות שנים ללא נדרש דלק נוסף. + +[fluid-name] +se-antimatter-stream=זרם אנטי-חומר +se-bio-sludge=Biosludge +se-contaminated-bio-sludge=biosludge המזוהם +se-contaminated-space-water=מים מזוהמים קוסמיים +se-chemical-gel=ג'ל כימי +se-decompressing-steam=קיטור +se-liquid-rocket-fuel=דלק טילים נוזלי +se-methane-gas=גז מתאן +se-methane-gas-mixed=גז מתאן מעורב +se-nutrient-gel=ג'ל מזין +se-neural-gel=ג'ל עצבית +se-neural-gel-2=ג'ל מתקדם עצבי +se-ion-stream=זרם יון +se-plasma-stream=זרם פלזמה +se-particle-stream=זרם חלקיקים +se-proton-stream=זרם פרוטון +se-space-coolant=תרמופלואיד 25 ° C +se-space-coolant-hot=תרמופלואיד 25 ° C +se-space-coolant-warm=תרמופלואיד מגניב -10 ° C +se-space-coolant-cold=קרת תרמופלואיד -100 ° C +se-space-coolant-supercooled=בקירור תרמופלואיד -273 ° C +se-space-water=מים קוסמיים + +[fluid-description] +se-space-water=מים כי לא להקפיא בלחץ נמוך, יותר מתאים ליישומים מרחב ביותר. +se-space-coolant=טמפרטורת ברירת המחדל של תרמופלואיד. +se-space-coolant-hot=טמפרטורת ברירת המחדל של תרמופלואיד. +se-space-coolant-warm=הטמפרטורה של לאחר מקוררת על ידי רדיאטורים תרמיים. +se-space-coolant-cold=הטמפרטורה של tתרמופלואיד לאחר היפרהיפר. +se-space-coolant-supercooled=הטמפרטורה של תרמופלואיד לאחר היפר חזר. +se-liquid-rocket-fuel= + +[item-group-name] +space=שטח +spaceship=ספינת חלל +bob-fluids=נוזלים + +[item-name] +sand=חול +solid-sand=חול שנשטף +washed-sand=חול שנשטף +glass=זכוכית +core-fragment=קטע הליבה (__1__) +rocket-fuel=דלק טילים מוצק +satellite=ניווט לווינים +se-antimatter-canister=אנטי-חומר מיכל +se-astrometric-data=אסטרומטרי תצפית נתונים +se-astronomic-catalogue-1=קטלוג אסטרונומים +se-astronomic-catalogue-2=קטלוג אסטרונומי רחבה +se-astronomic-catalogue-3=קטלוג אסטרונומים מקיף +se-astronomic-catalogue-4=קטלוג אסטרונומים מורחב +se-astronomic-insight=Insight אסטרונומים +se-astronomic-science-pack=חבילת המדע אסטרונומי +se-atomic-data=נתונים אטומיים +se-bio-combustion-data=ביו שרפה נתונים +se-bio-combustion-resistance-data=ביו שרפה התנגדות נתונים +se-bio-spectral-data=ביו-ספקטרלי נתונים +se-biochemical-data=נתונים ביוכימיים +se-bioculture=ביו-תרבות +se-bioelectrics-data=ביו אלקטריים נתונים +se-biological-catalogue-1=קטלוג ביולוגי +se-biological-catalogue-2=קטלוג הביולוגי הרחב +se-biological-catalogue-3=קטלוג ביולוגי מקיף +se-biological-catalogue-4=קטלוג ביולוגי מורחב +se-biological-insight=תובנה הביולוגית +se-biological-science-pack=חבילת המדע הביולוגי +se-biomechanical-data=ביומכנינתונים +se-biomechanical-resistance-data=ביומכני התנגדות נתונים +se-boson-data=בוזון נתונים +se-broken-data=כרטיס נתונים שבור +se-canister=מכל מאובטח +se-cargo-rocket-cargo-pod=תרמיל מטענים +se-cargo-rocket-fuel-tank=טנק דלק טילים +se-cargo-rocket-section=סעיף רקטות מטענים +se-cargo-rocket-section-packed=סעיף רקטות מטענים ארוז +se-cold-thermodynamics-data=נתוני תרמודינאמיקה קרים +se-comparative-genetic-data=השוואתי נתונים גנטיים +se-compressive-strength-data=נתונים חוזק דחיסה +se-conductivity-data=נתונים מוליכים +se-contaminated-scrap=גרוטאות מזוהמות +se-core-fragment-omni=קטע הליבה +se-cryogenics-data=נתוני נושא הקפאה +se-dark-energy-data=אנרגיה שחורה נתונים +se-darkmatter-data=חומר אפל נתונים +se-data-storage-substrate-cleaned=מצע אחסון נתונים מלוטש +se-data-storage-substrate=מצע אחסון נתונים גולמי +se-decompression-data=לחץ נתונים +se-decompression-resistance-data=לחץ התנגדות נתונים +se-deep-space-science-pack=חבילה מתקדמת מדע החלל +se-electromagnetic-field-data=אלקטרומגנטית שדה נתונים +se-empty-data=כרטיס נתונים ריק +se-empty-lifesupport-canister=רוקן תמיכה בחיים מיכל +se-energy-catalogue-1=קטלוג אנרגיה +se-energy-catalogue-2=קטלוג אנרגיה רחבה +se-energy-catalogue-3=קטלוג אנרגיה מקיף +se-energy-catalogue-4=קטלוג אנרגיה מורחב +se-energy-insight=תובנה אנרגיה +se-energy-science-pack=חבילת מדע אנרגיה +se-entanglement-data=נתוני הסתבכות +se-exotic-fission-data=נתוני ביקוע אקזוטיים +se-exotic-singularity-data=נתוני סינגולריות +se-experimental-biochemical-data=ניסיוני ביוכימיים נתונים +se-experimental-bioculture=ניסיוני ביו-תרבות +se-experimental-genetic-data=ניסיוני גנטי נתונים +se-experimental-material-decay-data=ניסיוני חומר ריקבון נתונים +se-experimental-material-spectral-data=ניסיוני חומר ספקטרלי נתונים +se-experimental-material=ניסיוני חומר אב טיפוס +se-experimental-specimen=ביומסה ניסויית +se-experimental-superconductor=אב טיפוס מוליך +se-forcefield-data=נתוני שדה כוח +se-fusion-test-data=פיוז'ן בדיקת נתונים +se-gammaray-detector=Gamma Ray גלאי +se-gammaray-observation-data=Gamma Ray תצפית נתונים +se-gammaray-test-data=Gamma Ray נתונים +se-genetic-data=נתונים גנטיים +se-gravity-wave-observation-data=Gravity Wave תצפית נתונים +se-gravimetric-observation-data=Gravimetric תצפית נתונים +se-gravimetric-test-data=Gravimetric בדיקת נתונים +se-heat-shielding=מגן חום +se-hot-thermodynamics-data=נתוני תרמודינאמיקה חמה +se-infrared-observation-data=נתוני תצפית אינפרא אדומים +se-ion-spectrometry-data=נתונים ספקטרומטריית יון +se-junk-data=כרטיס נתוני זבל +se-lepton-data=לפטון נתונים +se-lifesupport-canister=תמיכה בחיים מיכל +se-magnetic-canister=מיכל מגנטי +se-magnetic-monopole-data=נתוני מונופול מגנטיים +se-material-decay-data=חומר ריקבון נתונים +se-material-science-pack=חבילת חומר המדע +se-material-spectral-data=חומר ספקטרלי נתונים +se-material-testing-pack=חבילת חומר בדיקה +se-material-catalogue-1=קטלוג חומר +se-material-catalogue-2=קטלוג חומר רחבה +se-material-catalogue-3=קטלוג חומר מקיף +se-material-catalogue-4=קטלוג חומר מורחב +se-material-insight=תובנה חומר +se-medpack=תרופה + +se-medpack-2=תרופה 2 +se-medpack-3=תרופה 3 +se-medpack-4=תרופה 4 +se-meteor-defence=מיתקן ביטחוני מטאור +se-meteor-defence-ammo=תחמושת מיתקן ביטחוני מטאור +se-meteor-point-defence=הגנת נקודת מטאור +se-meteor-point-defence-ammo=תחמושת הגנת נקודת מטאור +se-methane-ice=קרח מתאן +se-micro-black-hole-data=נתונים חור שחור זעיר +se-microwave-observation-data=נתוני תצפית מיקרוגל +se-nano-cold-thermodynamics-data=נתוני תרמודינאמיקה קרים ננו +se-nano-compressive-strength-data=נתונים חוזק דחיסה ננו +se-nano-hot-thermodynamics-data=נתוני תרמודינאמיקה חמים ננו +se-nanomaterial=ננו + +se-nano-tensile-strength-data=נתונים חוזק מתיחת ננו +se-negative-pressure-data=נתונים ללחץ שלילי +se-neural-anomaly-data=עצבי אנומליה נתונים +se-nutrient-vat=מע""מ מזין +se-observation-frame-blank=מסגרת תצפית ריק +se-observation-frame-gammaray=מסגרת Gamma Ray תצפית +se-observation-frame-infrared=מסגרת תצפית אינפרא אדומה +se-observation-frame-microwave=מסגרת תצפית מיקרוגל +se-observation-frame-radio=מסגרת רדיו גל תצפית +se-observation-frame-uv=מסגרת UV תצפית +se-observation-frame-visible=מסגרת תצפית גלויה +se-observation-frame-xray=מסגרת תצפית Xray +se-plague-bomb=רקטת מגפה +se-plasma-canister=פלזמה מיכל +se-plasma-electrodynamics-data=פלזמה האלקטרודינמיקה נתונים +se-plasma-thermodynamics-data=פלזמה תרמודינמיקה נתונים +se-polarisation-data=קיטוב נתונים +se-pressure-containment-data=נתונים בלימה לחץ +se-quantum-phenomenon-data=נתוני תופעת קוונטית +se-quark-data=קווארק נתונים +se-radiation-data=נתוני קרינה +se-radiation-exposure-data=נתוני חשיפה לקרינה +se-radiation-exposure-resistance-data=קרינת התנגדות נתונים +se-radiation-shielding-data=קרינת מסוכך נתונים +se-radio-observation-data=תצפית רדיו גל נתונים +se-rtg-equipment=רדיונוקלידים + +se-rtg-equipment-2=רדיונוקלידים MK2 + +se-scrap=גרוטאות +se-significant-data=נתונים משמעותיים +se-significant-specimen=ביומסה משמעותית +se-space-capsule=קפסולת חלל +se-space-mirror=מראה רב - תכליתית + +se-space-platform-plating=ציפוי פלטפורמת החלל +se-space-platform-scaffold=פיגום פלטפורמת החלל +se-space-rail=רכבת שטח +se-spaceship-floor=שטיח ספינת חלל +se-specimen=ביומסה +se-subatomic-data=נתונים תת-אטומיים +se-superconductivity-data=נתונים מוליכים +se-superconductor=מוליך +se-superconductive-cable=כבל מוליך +se-tensile-strength-data=נתונים חוזק מתיחה +se-tesla-ammo=טסלה אקדח תחמושת +se-tesla-gun=אקדח טסלה +se-thruster-suit=חליפת דקר +se-thruster-suit-2=MK2 חליפת דקר +se-thruster-suit-3=MK3 חליפת דקר +se-thruster-suit-4=MK4 חליפת דקר +se-timespace-anomaly-data=זמן אנומליה נתונים +se-used-lifesupport-canister=משומשים תמיכה בחיים מיכל +se-uv-observation-data=UV תצפית נתונים +se-visible-observation-data=נתוני תצפית גלויים +se-water-ice=מי קרח +se-xray-observation-data=Xray תצפית נתונים +se-zero-point-energy-data=אפס נקודת אנרגיה נתונים +space-science-pack=חבילת המדע שטח + +[item-description] +automation-science-pack=בשימוש על ידי מעבדות מדע בסיסיות למחקר. +chemical-science-pack=בשימוש על ידי מעבדות מדע בסיסיות למחקר. +logistic-science-pack=בשימוש על ידי מעבדות מדע בסיסיות למחקר. +military-science-pack=בשימוש על ידי מעבדות מדע בסיסיות למחקר. +production-science-pack=בשימוש על ידי מעבדות מדע בסיסיות למחקר. +satellite=הלווין יש להכניס סילו טיל לווינים. +se-antimatter-canister=הצורה הצפופה ביותר של אנרגיה בכספת לנוע מיכל. +se-astronomic-science-pack=בשימוש על ידי מעבדות מדעי החלל למחקר. +se-biological-science-pack=בשימוש על ידי מעבדות מדעי החלל למחקר. +se-canister=כלי הכלה תכליתית +se-cargo-rocket-cargo-pod=מרכיב סעיף רקטות מטען. +se-cargo-rocket-fuel-tank=מרכיב סעיף רקטות מטען. +se-cargo-rocket-section=מרכיב רקטות מטען המפתח. +se-cargo-rocket-section-packed=קטעי רקטת מטענים ארוזים למעבר. חייב להיות פרק לשמש בבניית רקטות. +se-deep-space-science-pack=בשימוש על ידי מעבדות מדעי החלל למחקר. +se-energy-science-pack=בשימוש על ידי מעבדות מדעי החלל למחקר. +se-heat-shielding=פאנל מרוכבים המשמשים ליישומים בטמפרטורה גבוהה ומבנים בחלל. +se-material-science-pack=בשימוש על ידי מעבדות מדעי החלל למחקר. +se-medpack=השתמש כדי לרפא את עצמך. +se-medpack-2=השתמש כדי לרפא את עצמך. +se-medpack-3=השתמש כדי לרפא את עצמך. +se-medpack-4=השתמש כדי לרפא את עצמך. +se-meteor-defence=האם ניתן להגן על כדור הארץ כולו מן מטאורים אבל יכול לירות 1 מטאור רק זמן. חייב להיות עמוס תחמושת מטאור ביטחון טעון במלואה לפטר. דיוק 80%, לוקח זמן לנוח אחרי הירי. +se-meteor-defence-ammo=השמיד מטאוריטים. יש לטעון לתוך מיתקן ביטחוני מטאור. +se-meteor-point-defence=מגן על שטח מן המטאורים. מסוגל לירות עד 4 מטאורים מטחים. חייב להיות עמוס תחמושת מטאור ביטחון טעון במלואה לפטר. טווח 64, 50% דיוק, לוקח זמן לנוח אחרי הירי. +se-meteor-point-defence-container=השמיד מטאוריטים. יש לטעון לתוך מבנה הגנת נקודת מטאור. +se-rtg-equipment=הגנרטור התרמו רדיואיזוטופיים. גנרטור נייד שממירה את החום מן התפרקות רדיואקטיבית לחשמל. שמחזיק עשרות שנים ללא נדרש דלק נוסף. +se-rtg-equipment-2=הגנרטור התרמו רדיואיזוטופיים. גנרטור נייד משופרת שממירה את החום מן התפרקות רדיואקטיבית לחשמל. שמחזיק עשרות שנים ללא נדרש דלק נוסף. +se-plague-bomb=האם ניתן לכבות את כל החיים מכוכב. טפל בזהירות רבה. (מי ייתן טיפת UPS קשה כמו כל הדבר מת בהדרגה, לא מומלץ עבור כוכבי לכת גדולות או מרובה.) +se-space-capsule=קפסולת השליטה הנדרשת עבור הרוקטס מטענים. ניתן להשתמש בו כדי לקחת נוסע בחזרה אל פני שטח הכוכב הקרוב. +se-space-platform-plating=ציפוי מתקדם המאפשר תנועה מהירה על פני פלטפורמת החלל. +se-space-platform-scaffold=פיגום פלטפורמת החלל בסיסי המאפשר לך למקם מבנים מסוימים בחלל. +se-space-rail=Rails כי הם בטוחים לשימוש בחלל משום שהן מונעות את הרכבת עף מהפסים להרוס הכל. יכול לשמש גם על קרקע מסיבות אסתטיות. +se-spaceship-floor=ריצוף זה חייב להיות תחת כל החלקים של חללית עם קירות חלליים על הקצה החיצוני. כל פערי הרצפה ישברו בלימה, סעיפים אלה עלולים לנתק. +se-superconductive-cable=כבל מרוכבים superconductive שאינו דורש קירור אקטיבי. +se-tesla-gun=שרשרת-ברק במהירות האור. +se-thruster-suit=חליפת חלל שנדרש כדי לשרוד בחלל. \ Nhas מַרפְּקָן ו magboots. +se-thruster-suit-2=חליפת חלל שנדרש כדי לשרוד בחלל. \ Nhas מדחפים חזקים, להגדיל את המלאי ואת הרשת גדולה. +se-thruster-suit-3=חליפת חלל שנדרש כדי לשרוד בחלל. \ Nhas מדחפים חזקים, להגדיל את המלאי ואת הרשת גדולה. +se-thruster-suit-4=חליפת חלל שנדרש כדי לשרוד בחלל. \ Nhas מדחפים חזקים, להגדיל את המלאי ואת הרשת גדולה. +space-science-pack=בשימוש על ידי מעבדות מדעי החלל למחקר. +utility-science-pack=בשימוש על ידי מעבדות מדע בסיסיות למחקר. + +[recipe-name] +core-fragment=עיבוד קטע הליבה (__1__) +rocket-fuel=דלק טילים מוצק +se-astrometric-analysis-multispectral-1=אסטרומטריים ניתוח 1 +se-astrometric-analysis-multispectral-2=אסטרומטריים ניתוח 2 +se-astrometric-analysis-multispectral-3=אסטרומטריים ניתוח 3 +se-astrometrc-insight-1=תובנה אסטרונומים +se-astronomic-insight-1=תובנה אסטרונומים +se-astronomic-insight-2=רחבה אסטרונומי אינסייט +se-astronomic-insight-3=תובנה אסטרונומים המקיף +se-astronomic-insight-4=תובנה אסטרונומים מורחב +se-biological-insight-1=תובנה הביולוגית +se-biological-insight-2= הביורחבה לוגית אינסייט +se-biological-insight-3=המקיפה הביולוגית אינסייט +se-biological-insight-4=בפנים הביולוגי המורחב +se-bio-methane-to-crude-oil=מתאן עיבוד ביו לנפט גולמי +se-bio-sludge-crude-oil=בוצת ביו מביומסה ניסויית +se-bio-sludge-decontamination=טיהור +se-bio-sludge-from-fish=בוצת ביו מן הדגים +se-bio-sludge-from-wood=בוצה ביו מעץ +se-bio-sludge=ביו בוצת מביומסה +se-broken-data-scrapping=שבורי נתוני כרטיס מבטל +se-cargo-rocket-section-pack=אריזת קטעי רקטת מטענים +se-cargo-rocket-section-unpack=הוצאת קטעי רקטת מטענים +se-condenser-turbine-reclaim-water=ייצור חשמל עם טיוב מים +se-core-fragment-omni=עיבוד קטע Core +se-core-mining=כריית Core +se-empty-antimatter-canister=זרם אנטי-חומר מן מיכל +se-empty-barrel-scrapping=מבטל חבית ריקה +se-empty-barrel-reprocessing=עיבוד מחדש חבית ריקה +se-space-capsule-scrapping=מבטל קפסולת החלל +se-energy-insight-1=תובנה אנרגיה +se-energy-insight-2=רחבה אנרגיה אינסייט +se-energy-insight-3=מקיף אנרגיה אינסייט +se-energy-insight-4=תובנה אנרגיה מורחב +se-formatting-1=עיצוב נתונים +se-formatting-2=עיצוב נתונים יעיל +se-formatting-3=עיצוב נתונים מתקדם +se-material-insight-1=תובנה חומר +se-material-insight-2=רחבה חומר אינסייט +se-material-insight-3=מקיף חומר אינסייט +se-material-insight-4=תובנה חומר מורחב +se-matter-fusion-copper=עניין פיוז'ן (נחושת) +se-matter-fusion-dirty=עניין פיוז'ן (גרוטאות) +se-matter-fusion-iron=עניין פיוז'ן (ברזל) +se-matter-fusion-stone=עניין פיוז'ן (סטון) +se-matter-fusion-uranium=עניין +se-plasma-canister-empty=מיכל פלזמה ריק +se-radiating-space-coolant-normal=קירור תרמופלואיד כדי -10 ° C (מגניב) +se-radiating-space-coolant-slow=קירור איטי תרמופלואיד כדי -10 ° C (מגניב) +se-radiating-space-coolant-veryslow=מאוד איטי קירורצפיפות תרמופלואידית כדי -10 ° C (מגניב) +se-mixed-methane-gas-separation=הפרדת גז מתאן מעורב +se-rocket-fuel-from-water-copper=דלק טילים ממים +se-scrap-decontamination=טיהור גרוטאות +se-scrap-recycling=מחזור גרוטאות +se-space-coolant-cold=צפיפות תרמופלואידית כדי -100 ° C (קר) +se-space-coolant-supercooled=צפיפות תרמופלואידית -273°C +se-simulation-a=סימולצית אסטרונומים +se-simulation-ab=סימולציה פאנספרמיה +se-simulation-abm=סימולצית +se-simulation-am=סימולצית הפצת עניין +se-simulation-as=סימולציה אסטרופרטיקל +se-simulation-asb=סימולציה אסטרוביוני +se-simulation-asbm=סימולצית יוניברסל +se-simulation-asm=סימולציה אסטרופיזיקה +se-simulation-b=סימולציה ביולוגית +se-simulation-bm=סימולציה ביומכניקה +se-simulation-m=הדמיית חומר +se-simulation-s=סימולצית אנרגיה +se-simulation-sb=סימולציה ביוכימיים +se-simulation-sbm=סימולצית נאניט +se-simulation-sm=סימולצית ננו +se-space-water-decontamination=טיהור מים קוסמית +se-spaceship-rocket-engine-burn=צרוב דלק טילים נוזל +se-specimen-fish=לגידול דגים המיקרו-גרביטציה +se-specimen-wood=המיקרו-גרביטציה ווד צמיחה +se-thermodynamics-coal=לחץ בישול פחם +se-used-lifesupport-canister-cleaning=ניקוי מיכל תמיכה בחיים + +[recipe-description] +se-astronomic-insight-2=יותר מסובך, אבל יותר משאבים יעילים. +se-astronomic-insight-3=יותר מסובך, אבל יותר משאבים יעילים. +se-astronomic-insight-4=יותר מסובך, אבל יותר משאבים יעילים. +se-biological-insight-2=יותר מסובך, אבל יותר משאבים יעילים. +se-biological-insight-3=יותר מסובך, אבל יותר משאבים יעילים. +se-biological-insight-4=יותר מסובך, אבל יותר משאבים יעילים. +se-core-mining=שבר בפועל חזר תלוי על פני כדור הארץ. שעת crafting אמיתי תלויה במספר של כורי ליבה על פני כדור הארץ או ירח. +se-energy-insight-2=יותר מסובך, אבל יותר משאבים יעילים. +se-energy-insight-3=יותר מסובך, אבל יותר משאבים יעילים. +se-energy-insight-4=יותר מסובך, אבל יותר משאבים יעילים. +se-material-insight-2=יותר מסובך, אבל יותר משאבים יעילים. +se-material-insight-3=יותר מסובך, אבל יותר משאבים יעילים. +se-material-insight-4=יותר מסובך, אבל יותר משאבים יעילים. +se-radiating-space-coolant-normal=קירור וחימום חוזרים של thermofluid גורמים להשפלה. +se-radiating-space-coolant-slow=קירור וחימום חוזרים של thermofluid גורם להשפלה, תוצאות קירור איטיות לאובדן מופחת. +se-radiating-space-coolant-veryslow=קירור וחימום חוזרים של thermofluid גורם להשפלה, תוצאות קירור איטיות לאובדן מופחת. + +[technology-name] +energy-shield-equipment=מגן אנרגיה +energy-shield-mk2-equipment=MK2 מגן אנרגיה +energy-shield-mk3-equipment=MK3 מגן אנרגיה +energy-shield-mk4-equipment=MK4 מגן אנרגיה +energy-shield-mk5-equipment=Mk5 מגן אנרגיה +energy-shield-mk6-equipment=MK6 מגן אנרגיה +sand-processing=עיבוד חול +glass-processing=עיבוד זכוכית +liquid-rocket-fuel=דלק טילים נוזלי +rocket-silo=סילו טיל בלווין +rocketry=טילי Combat +se-adaptive-armour=שריון מסתגל +se-antimatter-engine=מנוע אנטי-חומר +se-antimatter-reactor=כור אנטי-חומר +se-antimatter-production=ייצור אנטי-חומר +se-astronomic-science-pack=חבילת מדע אסטרונומי +se-biological-science-pack=חבילת מחקר ביולוגית +se-condenser-turbine=טורבינת קונדנסר +se-core-miner=כריית הליבה +se-deep-space-science-pack=חבילת מדעי החלל מתקדם +se-electric-boiler=דוד חשמלי +se-energy-science-pack=חבילת מדע אנרגיה +se-fluid-burner-generator=מחולל צורב נוזל +se-fuel-refining=זיקוק דלק +se-heat-shielding=מיגון חום +se-material-science-pack=חבילת מדע חומר +se-medpack=תרופה + +se-medpack-2=תרופה 2 +se-medpack-3=תרופה 3 +se-medpack-4=תרופה 4 +se-meteor-defence=מיתקן ביטחוני מטאור +se-meteor-point-defence=הגנת נקודת מטאור +se-plague=המגפה +se-railgun=אקדח + +se-rocket-cargo-safety=בטיחות מטען רוקט +se-rocket-fuel-from-water=דלק טילים ממים +se-rocket-launch-pad=סילו טיל מטענים +se-rocket-landing-pad=מנחת רוקט +se-rocket-reusability=שימוש חוזר של רוקט +se-rocket-survivability=שרידות רוקט +se-rtg-equipment=גנרטור תרמואלקטרי רדיואקטיבינייד + +se-rtg-equipment-2=גנרטור תרמואלקטרי רדיואקטיבינייד 2 +se-space-assembling=רכבת שטח +se-space-accumulator=למצבר שטח +se-space-astrometrics-laboratory=מעבדת אסטרומטריקה +se-space-biochemical-laboratory=מעבדה ביוכימית +se-space-catalogue-astronomic=קטלוג אסטרונומים +se-space-catalogue-biological=קטלוג ביולוגי +se-space-catalogue-energy=קטלוג אנרגיה +se-space-catalogue-material=קטלוג חומר +se-space-data-card=כרטיס נתונים +se-space-decontamination-facility=מתקן טיהור +se-space-electromagnetics-laboratory=מעבדת אלקטרומגנטיקה +se-space-genetics-laboratory=המעבדה לגנטיקה +se-space-gravimetrics-laboratory=מעבדגרווימטריקה s +se-space-growth-facility=מתקן צמיחה +se-space-hypercooling=Hypercooling + +se-space-laser-laboratory=מעבדת ליזר +se-space-lifesupport-facility=מתקן תמיכה בחיים +se-space-manufactory= שטח +se-space-material-fabricator=מפברק חומר +se-space-mechanical-laboratory=מעבדה מכאנית +se-space-particle-accelerator=מאיץ חלקיקים +se-space-particle-collider=מאיץ חלקיקים +se-space-plasma-generator=גנרטור פלזמה +se-space-platform-plating=ציפוי פלטפורמת החלל +se-space-platform-scaffold=פיגום פלטפורמת החלל +se-space-radiation-laboratory=מעבדת קרינה +se-space-radiator=רדיאטור תרמי +se-space-rail=רכבת שטח +se-space-recycling-facility=מתקן מיחזור +se-space-science-lab=מעבדת המדע שטח +se-space-simulation-ab=סימולציה פאנספרמיה +se-space-simulation-am=סימולציה חומר אסטרומטריl +se-space-simulation-as=סימולציה אסטרופרטיקל +se-space-simulation-bm=סימולציה ביומכניקה +se-space-simulation-sb=סימולציה ביוכימיים +se-space-simulation-sm=סימולצית ננו +se-space-simulation-abm=סימולצית +se-space-simulation-asb=סימולציה אסטרוביוני +se-space-simulation-asm=סימולציה אסטרופיזיקה +se-space-simulation-sbm=סימולצית נאניט +se-space-simulation-asbm=סימולצית יוניברסל +se-space-solar-panel=פאנל סולארי שטח +se-space-solar-panel-adv=שטח מתקדם פאנל סולארי +se-space-spectrometry-facility=מתקן ספקטרומטריית +se-space-supercomputer=מחשב העל +se-space-telescope=טלסקופ +se-space-telescope-gammaray=טלסקופ קרני גמא +se-space-telescope-xray=טלסקופ צילום רנטגן +se-space-telescope-microwave=טלסקופ מיקרוגל +se-space-telescope-radio=רדיו טלסקופ +se-space-thermodynamics-laboratory=מעבדת תרמודינאמיקה +se-spaceship=ספינת חלל +se-spaceship-integrity=ספינת חלל המבנית ספינת חלל +se-factory-spaceship=ספינת חלל במפעל +se-superconductive-cable=כבל +se-teleportation=טלפורטציה + +se-tesla-gun=Gun טסלה +se-thruster-suit=חליפת דקר +space-science-pack=חבילת המדע שטח + +[technology-description] +energy-shield-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +energy-shield-mk2-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +energy-shield-mk3-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +energy-shield-mk4-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +energy-shield-mk5-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +energy-shield-mk6-equipment=בועת מגן כי גובה במהירות אבל משתמשת הרבה אנרגיה. +sand-processing=ריסוק, טחינה, וסינון חומר גלם לתוך חול נקי. +glass-processing=התכה חול לתוך הכוס. +rocket-silo=מאפשר לך לשגר לוויין לחלל לפתח מדעי החלל ולגלות כוכבי לכת חדשים. +se-adaptive-armour=Armor המשתמשת באנרגיה כדי תיקון עצמי. ממלא תפקיד דומה מגיני אנרגיה עם דרישות חשמל נמוכות אבל הרבה התחדשות איטית. +se-antimatter-engine=להשמיד אנטי-חומר כדי לייצר דחף מדהים. +se-antimatter-reactor=ומשמידה אנטי-חומר עם חומר כדי לייצר חום קיצוני. +se-antimatter-production=הפיכה אנטי-חומר, בצורה הצפופה ביותר של אנרגיה אצורה. +se-astronomic-science-pack=מאפשר מחקר של טכנולוגיות הקשורות מסע בחלל ולוגיסטיקה בין-כוכבית. +se-biological-science-pack=מאפשר מחקר של טכנולוגיות הקשורות בשיפור היכולות, הנשק ביולוגי הפיזיות שלך, והעיבוד עצבי. +se-condenser-turbine=75% את היעילות של טורבינת קיטור אלא רק משתמשים 1% מהמים. +se-core-miner=מאפשר אינסופית להפקת אוצרות מן הפלנטות והירחים אבל יש תשואה שולית פוחתת אם מרובים משמשים באותו הגוף. +se-deep-space-science-pack=חובה עבור הטכנולוגיה המתקדמת ביותר +se-electric-boiler=יצירת קיטור ממים באמצעות אנרגיה חשמלית. +se-energy-science-pack=מאפשר מחקר של טכנולוגיות הקשורות כוחות היסוד, ועל תגליות תת-אטומיים. +se-fluid-burner-generator=דורש דלק נוזלי עם ערך אנרגיה. ברנס נוזל לייצור חשמל. פשוט וקומפקטי אבל חסר את יעילות האנרגיה של מערכות מבוססות קיטור גדול. +se-fuel-refining=מזקקת דלקים מתקדמים יותר. +se-heat-shielding=פאנל מרוכבים המשמשים ליישומים בטמפרטורה גבוהה ומבנים בחלל. +se-material-science-pack=מאפשר מחקר של טכנולוגיות הקשורות חומרים מתקדמים עבור דרישות הנדסיות מתקדמות יותר. +se-medpack=השתמש רפואה כדי לרפא את עצמך. +se-medpack-2=השתמש רפואה כדי לרפא את עצמך. +se-medpack-3=השתמש רפואה כדי לרפא את עצמך. +se-medpack-4=השתמש רפואה כדי לרפא את עצמך. +se-meteor-defence=לירות מטאורים מהשמיים לפני שהם הורסים את הדברים שלך. מיתקן ביטחוני מטאור יכול להגן על כדור הארץ כולו, אבל יכול רק לירות מטאור אחד בכל פעם. +se-meteor-point-defence=לירות מטאורים מהשמיים לפני שהם הורסים את הדברים שלך. הגנת נקודת מטאור יכולה להגן על שטח קטן ממרחק של עד 4 מטאורים בשעה. +se-railgun=אלקטרומגנטית מואצת חץ הנע למהירות כזו שהם משאירים אחריהם שובל פלזמה לפני שהם vaporise. נזק גבוה, שיעור איטי של אש. +se-plague=המכה הגדולה משמידה את כל החיים מכוכבים כולו. טפל בזהירות רבה. +se-rocket-cargo-safety=מפחית את הסיכוי כי תרמילי מטען לקבל נפגעו במעבר ידי 10% (כפלי). +se-rocket-fuel-from-water=יוצר דלק טילים-חמצן מימן באמצעות אלקטרוליזה מים. +se-rocket-landing-pad=מאפשר לך להעביר תרמילי מטען רקטות אל מנחת בשם. עם מחקר נוסף זה גם יכול לשחזר חלקי רקטות. +se-rocket-launch-pad=מאפשר לך להפעיל מטען לחלל או כוכבי לכת אחרים. +se-rocket-reusability=מגדיל את אחוז החלקים שניתן התאושש נחיתה במנחת מוצלחת על ידי 5% (כפלי). +se-rocket-survivability=מפחית את הסיכוי כי רקטות ולהינזק הועברו או כישלון ניווט המוביל חסר המנחת ידי 10% (כפלי). +se-rtg-equipment=הגנרטור התרמו רדיואיזוטופיים. גנרטור נייד שממירה את החום מן התפרקות רדיואקטיבית לחשמל. שמחזיק עשרות שנים ללא נדרש דלק נוסף. +se-rtg-equipment-2=הגנרטור התרמו רדיואיזוטופיים. גנרטור נייד משופרת שממירה את החום מן התפרקות רדיואקטיבית לחשמל. שמחזיק עשרות שנים ללא נדרש דלק נוסף. +se-space-assembling=מכונית להרכבה שונה שיכול לעבוד בחלל. +se-space-astrometrics-laboratory=משלב, משווה, מכמת מקורות שונים של מידע אסטרונומי. +se-space-biochemical-laboratory=מעבדת כימית מתקדמת המתמחה הביו-כימיה. ניתן גם לבצע כימיים בסיסיים יותר ועיבוד נפט. +se-space-catalogue-astronomic=נתוני אסטרונומי מובנים מוכנים לניתוח הדמיית מחשב. חובה למחקר אסטרונומים נוספת. +se-space-catalogue-biological=נתונים ביולוגיים מובנים מוכנים לניתוח הדמיית מחשב. חובה למחקר ביולוגי נוסף. +se-space-catalogue-energy=נתוני אנרגיה מובנים מוכנים לניתוח הדמיית מחשב. חובה למחקר אנרגיה נוספת. +se-space-catalogue-material=נתונים מהותיים מובנים מוכנים לניתוח הדמיית מחשב. חובה למחקר חומר נוסף. +se-space-data-card=התקן אחסון נתונים רב תכליתי. חובה למחקר מונחה נתונים מתקדמים יותר. +se-space-decontamination-facility=מנקה חומרים לשימוש בסביבות סטרילי, ומכין נוזלים לשימוש בתנאי לחץ נמוך. +se-space-electromagnetics-laboratory=ציוד עבור שדה מגנטי חזק ויישומי מתח גבוהים מאוד. +se-space-genetics-laboratory=מעבדת מוקדש רצף גנטי, הנדסה גנטית, והדפסה גנטית של תרבויות. +se-space-gravimetrics-laboratory=ניתוח המדמה הפרעות הכבידה. +se-space-growth-facility=גדל דגימות ביולוגיות תחת מגוון של תנאים מבוקרים שאינם אפשריים במקום אחר, מיקרו-כבידה כזה, +se-space-hypercooling=מבצע החלפת חום על thermofluid, מה שהופך חם אחד והשני קר. +se-space-laser-laboratory=ניסויים עם לייזרים. הגנה על עיניים חייבת להיות משוחקת. +se-space-lifesupport-facility=לקיום חיים בסביבות עוינות יותר. +se-space-manufactory=טכנולוגיית מפתח לייצור המוני בחלל. +se-space-material-fabricator=Synthesises חומרים חדשים. הכלאה בין מאיץ חלקיקים ומדפסת 3D. +se-space-mechanical-laboratory=מספק מגוון של תהליכים מכניים: ריסוק, קריעה, מריחה, רטט, וכו ' +se-space-particle-accelerator=מאיץ חלקיקים קרובים למהירות האור. +se-space-particle-collider=מתנגש חלקיקים במהירות גבוהה ומנתח את התוצאות. +se-space-plasma-generator=יוצר מגוון של פלזמות. +se-space-platform-plating=ציפוי פלטפורמה איתן בחלל. חלקה ומהירה עבור חלל . +se-space-platform-scaffold=פיגומי פלטפורמת החלל בסיסיים. משהו לבנות על אבל לא נהדר עבור חלל . +se-space-radiation-laboratory=מקום בטוח יחסית לשחק עם חומר רדיואקטיבי. יכול לשמש לעיבוד אורניום. +se-space-radiator=מקרין משם עודף חום מן thermofluid השחון. +se-space-rail=Rails כי הם בטוחים לשימוש בחלל משום שהן מונעות את הרכבת עף מהפסים להרוס הכל. יכול לשמש גם על קרקע מסיבות אסתטיות. +se-space-recycling-facility=השלכת פריטים וגרוטאות עיבוד מחדש לתוך חומרי גלם. +se-space-science-lab=מאפשר עיבוד של חבילות מדעי החלל ומדע החלל מתקדם יותר. +se-space-simulation-ab=עוד סימולציה יעילה על ידי שילוב דיסציפלינות רבות. +se-space-simulation-am=עוד סימולציה יעילה על ידי שילוב דיסציפלינות רבות. +se-space-simulation-as=עוד סימולציה יעילה על ידי שילוב דיסציפלינות רבות. +se-space-simulation-bm=עוד סימולציה יעילה על ידי שילוב דיסציפלינות רבות. +se-space-simulation-sb=עוד סימולציה יעילה על ידי שילוב דיסציפלינות רבות. +se-space-simulation-sm=עוד סימולציה יעילה על ידי שילוב דיסציפלינות רבות. +se-space-simulation-abm=עוד סימולציה יעילה על ידי שילוב דיסציפלינות רבות. +se-space-simulation-asb=עוד סימולציה יעילה על ידי שילוב דיסציפלינות רבות. +se-space-simulation-asm=עוד סימולציה יעילה על ידי שילוב דיסציפלינות רבות. +se-space-simulation-sbm=עוד סימולציה יעילה על ידי שילוב דיסציפלינות רבות. +se-space-simulation-asbm=עוד סימולציה יעילה על ידי שילוב דיסציפלינות רבות. +se-space-solar-panel=פאנל סולארי יעילות גבוהה עבור החלל. +se-space-solar-panel-adv=פאנל סולארי גבוהה ויעילות מתקדמים בחלל. +se-space-spectrometry-facility=תרגום לעברית עבורy, גז כרומטוגרפיה, ספקטרומטריית מסה, ואת תרגום לעברית עבורy האחר. דברים באש לעבר הקיר, להפוך אותו לכופף, ונראה לאן זה יגיע. +se-space-supercomputer=מאפשר מניפולציה של נתונים מתקדמים יותר ועיבוד, וכן סימולציה. +se-space-telescope=טלסקופ מתוחכם רגיש לאורכי גל שונים ברחבי הספקטרום הנראה. +se-space-telescope-gammaray=קרני גמא לא לשבור. טלסקופ רב עוצמה זו המשתמשת מראות גלאי מיוחד במקום. +se-space-telescope-xray=צילומי רנטגן נחסמים על ידי רוב אטמוספרות. טלסקופ רב עוצמה זה מיועד החלל שבו האווירה היא לא בעיה. +se-space-telescope-microwave=טלסקופ ענק שמזהה מיקרוגלי הרקע הקוסמי. +se-space-telescope-radio=טלסקופ ענק שמזהה גלי רדיו חלשים מאוד ממקורות מרחק. +se-space-thermodynamics-laboratory=מתחייב תהליכים כרוכים טמפרטורות קיצוניות. ניתן גם לבצע תהליכים תרמיים בסיסיים, כגון להתכה. +se-spaceship=כולים לכם לבנות חתיכה אחרי חתיכה עם רצפה וקירות, אז להשתמש במסוף כדי להטיס אותו אל כוכב אחר, או מעבר. +se-spaceship-integrity=כל רמה מגדילה את מגבלת לחץ שלמות מבנית החללית ידי 100. +se-factory-spaceship=כל רמה מגדילה את מגבלת לחץ שלמות מבנית החללית ידי 500. +se-superconductive-cable=כבל מרוכבים superconductive שאינו דורש קירור אקטיבי. +se-teleportation=פותח בטכנולוגיית טלפורטציה אחרת. מתברר מרחב השתאה במידה זו בשלום הוא באמת קשה. +se-tesla-gun=ברק שרשרת אש מהירה. יכול להכות עד 30 אויבים לכל בורג. עושה קפיצות ארוכות בין מטרות, או קפיצות קצרות לאורך הקרקע אם אין מטרות. +se-thruster-suit=חליפת חלל עם מנועי תמרון ולא magboots. אל תלכו לחלל בלעדיו. +se-thruster-suit-2=חליפת שטח משופרת עם מדחפים חזקים, להגדיל את המלאי ואת הרשת גדולה. +se-thruster-suit-3=חליפת שטח משופרת עם מדחפים חזקים, להגדיל את המלאי ואת הרשת גדולה. +se-thruster-suit-4=חליפת שטח משופרת עם מדחפים חזקים, להגדיל את המלאי ואת הרשת גדולה. +space-science-pack=מאפשר פיתוח ישיר יותר של מדעי החלל וטכנולוגיות נהנות הפיתוחים האלה. + +[modifier-description] +tesla-shooting-speed-bonus=מהירות ירי טסלה +tesla-damage-bonus=מהירות ירי טסלה + +[virtual-signal-name] +se-star=כוכב +se-planet=כוכב לכת +se-planet-orbit=במסלול כוכב לכת + +se-moon=ירח +se-moon-orbit=במסלול הירח +se-asteroid-belt=חגורת אסטרואידים +se-asteroid-field=שדה אסטרואיד +se-anomaly=אנומליה + +se-meteor=מטאור +se-spaceship=ספינת חלל +se-remote-view=צפו מרחוק +se-death=מוות +se-character-corpse=גופה + + +[controls] +se-remote-view=צפו ניווט לוויני +se-respawn=respawn + +[shortcut] +se-remote-view=צפו ניווט לוויני +se-respawn=respawn + +[shortcut-name] +se-remote-view=צפה ניווט לווינים [N] +se-respawn=respawn + +[tile-name] +se-space-platform-plating=ציפוי פלטפורמת החלל +se-space-platform-scaffold=פיגום פלטפורמת החלל +se-space-platform-underlay=שטח diff --git a/space-exploration_0.5.58/space-exploration/locale/it/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/it/strings.cfg new file mode 100644 index 0000000..a8461f9 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/it/strings.cfg @@ -0,0 +1,967 @@ +spaceship-integrity100=+100 Integrità Strutturale Navicella +spaceship-integrity300=+300 Integrità Strutturale Navicella +spaceship-integrity500=+500 Integrità Strutturale Navicella +core-mining-productivity-5=+5% Produttività estrazione nucleo + +[mod-name] +space-exploration=Esplorazione Spaziale (Space Exploration) + +[mod-description] +space-exploration=Costruisci un razzo cargo per lanciare oggetti nello spazio. Sali sul razzo e parti tu stesso e inizia la tua passeggiata nello spazio. Costruisci una piattaforma orbitale per sviluppare le scienze spaziali basate sui dati. Costruisci pezzo per pezzo la tua navicella spaziale, vola da un pianeta ad un altro, verso lune, fascie di asteroidi e altro ancora! Altamente raccomandato giocarci con AAI Industry mod. Space Exploration Postprocess mod è richiesta (non può essere una dipendenza, ma è una lunga spiegazione). Non è raccomandato giocare con mod non dipendenti mentre si è nella fase sperimentale + +[space-exploration] +rename-something=Rinomina __1__ +trigger-none=Nessuno (Manuale) +trigger-fuel-full=Lancia a carburante pieno +trigger-cargo-full=Lancia a carico pieno +trigger-fuel-full-signal=Lancia con segnale verde e carburante pieno +trigger-cargo-full-signal=Lancia con segnale verde e carico pieno +trigger-cargo-full-or-signal=Lancia con segnale verge o quando è pieno il carico +destination-type-zone=Posizione approssimativa +destination-type-landing-pad=Pedana di atterraggio cargo +button-launch=Lancio +button-launch-disabled=Lancio (disabilitato) +destination-crash-warning=Attenzione: Scegli una pedana di atterraggio cargo per ridurre la possibilità di uno schianto +recipe-to=__1__ a __2__ +recipe-from=__1__ da __2__ +remote-view=Collegamento al satellite di navigazione [N] +remote-view-instruction=Lancia altri satelliti per scoprire più stelle, pianeti, lune e altre zone +exit-remote-view=Esci dal collegamento al satellite di navigazione [N] +remote-view-requires-satellite=Devi lanciare un satellite per poter usare il collegamento. +satellite-launched=Satellite dispiegato e alla ricerca di oggetti astronomici. Usa [img=virtual-signal/se-remote-view] Collegamento al satellite per osservare (premi [color=green][N][/color] o usa la scorciatoia sulla barra rapida). +satellite-discovered-platform=[color=cyan]Il satelite ha scoperto alcune piattaforme orbitali.[/color] +source-discovered-zone=[color=cyan]__1__ scoperto un nuovo __2__: [/color][img=__3__] [color=white]__4__[/color] +discovered-zone=[color=cyan]Scoperto un nuovo __1__: [img=__2__] [/color][color=white]__3__[/color] +space-capsule=Capsula spaziale +player-died=__1__ è morto +launch-suit-warning=Per evitare il soffocamento, considera di indossare la tuta jet. +suffocating-warning=Stai soffocando. Entra in una capsula spaziale o indossa una tuta jet. +rocket_survivability_fail=Un razzo cargo ha subito danni durante il volo ed è fuori rotta. Si consigla di fare nuove ricerche sulla sopravvivenza del razzo e della sua sicurezza. +respawn-if-stranded=Se sei bloccato, puoi usare il collegamento per il respawn [__CONTROL__se-respawn__]. +filter-list=Cerca +clear-filter=Cancella ricerca +zone-tooltip=__1__ __2__ __3__ __4__ __5__ __6__ __7__ +zone-tooltip-type=\nTipo: __1__ +zone-tooltip-resources=\nRisorse primarie: __1__ +zone-tooltip-lifesigns=\nSegni di vita: __1__ +zone-tooltip-daynight=\nCiclo giorno/notte: __1__ minuti +zone-tooltip-bot-attrition=\nInterferenza dei robot: __1__ +construction-denied=Non può essere piazzato qui. +construction-denied-vehicle-in-space=Non si possono piazzare veicoli terrestri nello spazio. +construction-denied-se-surface=Posizione non valida, deve essere piazzato su una superficie della Space Exploration mod +currently-viewing=Attualmente stai guardando: __1__ +no-character-to-board=Non puoi imbarcarti sulla nave, devi prima essere attaccato al tuo personaggio per svolgere questa azione +starmap=Mappa stellare (WIP) +back=Indietro +spaceship=Navicella spaziale +plant=Pianeta +moon=Luna +star=Stella +orbit=Orbita +something_orbit=__1__ orbita +asteroid-belt=Fascia di asteroidi +asteroid-field=Campo di asteroidi +anomaly=Anomalia +spaceship-cannot-set-destination-to-self=Impossibile selezionare la destinazione su se stessi +spaceship-launch-energy=Energia per il lancio: __1__ +spaceship-launch-energy-invalid=Energia per il lancio: Richiede un controllo di integrita' valido +spaceship-speed=Velocita': __1__ +spaceship-structural-stress-hull=Stress strutturale (scafo): __1__ +spaceship-structural-stress-hull-invalid=Stress strutturale (Scafo): NA (contenimento richiesto) +spaceship-structural-stress-container=Stress strutturale (Contenitori): __1__ +spaceship-structural-stress-container-invalid=Stress strutturale (Contenitori): NA (contenimento richiesto) +spaceship-travel-time-unknown=Tempo di viaggio: Sconosciuto. Testare la velocità massima per una stima +spaceship-travel-time-max=Tempo di viaggio: __1__s alla velocità massima +spaceship-travel-time-current=Tempo di viaggio: __1__s alla velocità attuale +spaceship-closest-location=Località più vicina: __1__ +spaceship-location-spatial-distortion=Distorsione spaziale: __1__ +spaceship-location-stellar-x=Quadrante X: __1__ +spaceship-location-stellar-y=Quadrante Y: __1__ +spaceship-location-star-gravity-well=Gravità della stella: __1__ +spaceship-location-planet-gravity-well=Gravità del pianeta: __1__ +spaceship-travel-status=Stato del viaggio: __1__ +spaceship-integrity-status-valid=Stato dell'integrità: Valido: __1__ +spaceship-integrity-status-invalid=Stato dell'integrità: Invalido: __1__ +spaceship-button-launch=Lancio +spaceship-button-launch-tooltip=Pronto al lancio +spaceship-button-launch-disabled=Lancio (disabilitato) +spaceship-button-launch-disabled-fuel-tooltip=Richiede carburante nei serbatoi dei booster +spaceship-button-launch-disabled-integrity-tooltip=Richiede controllo valido sull'integrità +spaceship-button-anchor=Ancora +spaceship-button-confirm-anchor=Conferma ancoraggio +spaceship-button-anchor-to=Ancorato a __1__ +spaceship-button-anchor-on=Ancorato su __1__ +spaceship-button-stop=Ferma +spaceship-button-start=Ingaggia +spaceship-button-board=Tavola __1__ +spaceship-button-scouting-back=Indietro +spaceship-button-scouting-back-tooltip=Cancella ricerca punto di ancoraggio +spaceship-name-the=Il __1__ +spaceship-button-start-integrity-check=Inizia controllo integrità +spaceship-heading-destination=Destinazione +list-destinations-alphabetically=Lista destinazioni in ordine alfabetico +spaceship-travel-message-new-course-plotted=Nuovo percorso tracciato +spaceship-travel-message-exiting-planet-gravity=In uscita dalla gravità planetaria +spaceship-travel-message-navigating-planet-gravity=Navigazione nella gravità planetaria +spaceship-travel-message-exiting-star-gravity=In uscita dalla gravità stellare +spaceship-travel-message-navigating-star-gravity=Navigazione nella gravità della stella +spaceship-travel-message-spatial-distortions=Navigazione nella distorsione spaziale +spaceship-travel-message-navigating-interstellar=Navigazione nello spazio cosmico +spaceship-travel-message-at-destination=A destinazione. +spaceship-check-message-passed=Passata: Integrità nave valida +spaceship-check-message-failed-containment=Fallito: Perdita di contenimento attorno alla console. Assicurati che tutte le pareti dell'astronave siano sul pavimento dell'astronave senza spazi vuoti. +spaceship-check-message-failed-console-floor=La console deve essere piazzata sul pavimento della navicella +spaceship-check-message-failed-empty=Nessun riquadro trovato collegato a una console correttamente chiusa. +spaceship-check-message-failed-unknown-bounds=Errore: Dimensioni della navicella spaziale sconosciute +spaceship-check-message-failed-stress=Fallito: Lo stress sull'integrità strutturale è eccessivo rispetto alla propria tecnologia +spaceship-check-message-checking-console-floor=Controllare la connessione al pavimento della console +spaceship-check-message-checking-containment=Controllo contenimento +spaceship-check-message-checking-connectivity=Controllo connessione console +spaceship-check-message-no-console=Nessuna console +spaceship-check-message-did-not-complete=Il controllo non è stato completato +spaceship-check-message-unstable=Instabile: Alcune sezioni verranno disconnesse durante le manovre +spaceship-check-message-valid-but-disconnecting=Valido ma instabile: Alcune sezione verranno disconnesse +spaceship-warning-sections-disconnecting=Alcune sezioni si stanno disconnettendo. Fermare le riparazioni + +[damage-type-name] +suffocation=Soffocamento +meteor=Meteora + +[entity-name] +destroyed-cargo-pod=Pedana di atterraggio cargo distrutta +meteorite=Meteorite +rocket-silo=Satellite silo per razzo +rocket-fragment=Frammento di razzo +se-antimatter-reactor=Reattore ad antimateria +se-cargo-rocket-cargo-pod=Pedana di atterraggio cargo distrutta +se-condenser-turbine=Turbina a condensazione +se-condenser-turbine-tank=Turbina a condensazione +se-condenser-turbine-generator=Turbina a condensazione +se-core-fragment-processor=Processo di frammentazione del nucleo +se-core-miner=Escavatore del nucleo +se-core-miner-drill=Escavatore del nucleo +se-electric-boiler=Caldaia elettrica +se-fluid-burner-generator=Generatore isotermico di fuido +se-fuel-refinery=Raffineria di carburante +se-meteor-defence-container=Installazione difensiva contro meteoriti +se-meteor-defence-charger=Installazione difensiva contro meteoriti +se-meteor-point-defence-container=Punto di difesa contro meteoriti +se-meteor-point-defence-charger=Punto di difesa contro meteoriti +se-methane-ice=Metano ghiacciato +se-rocket-launch-pad=Silo per razzi cargo +se-rocket-launch-pad-tank=Silo per razzi cargo +se-rocket-launch-pad-silo=Silo per razzi cargo +se-rocket-launch-pad-combinator=Silo per razzi cargo +se-rocket-launch-pad-_-seat=Silo per razzi cargo +se-rocket-launch-pad-settings=Silo per razzi cargo +se-rocket-landing-pad=Pedana di atterraggio cargo +se-space-accumulator=Accumulatore spaziale +se-space-astrometrics-laboratory=Laboratorio di astronomia +se-space-biochemical-laboratory=Laboratorio biochimico +se-space-assembling-machine=Macchina assemblatrice spaziale +se-space-capsule-_-vehicle=Capsula spaziale +se-space-curved-rail=rotaia spaziale +se-space-decontamination-facility=Impianto di decontaminazione +se-space-electromagnetics-laboratory=Laboratorio elettromagnetico +se-space-genetics-laboratory=Laboratorio di genetica +se-space-growth-facility=Strumento di crescita facilitata +se-space-gravimetrics-laboratory=Laboratorio gravimetrico +se-space-hypercooler=Hyper-raffreddatore +se-space-laser-laboratory=Laboratorio laser +se-space-lifesupport-facility=Impianto di supporto vitale +se-space-manufactory=Fabbrica spaziale +se-space-material-fabricator=Fabbricatore di materiali +se-space-mechanical-laboratory=Laboratorio meccanico +se-space-particle-accelerator=Acceleratore di particelle +se-space-particle-collider=Struttura collisione particelle +se-space-plasma-generator=Generatore di plasma +se-space-radiation-laboratory=Laboratorio di radiazioni +se-space-radiator=Radiatore termico +se-space-recycling-facility=Impianto di riciclaggio +se-space-pipe=Tubo spaziale +se-space-pipe-to-ground=Tubo spaziale sotterraneo +se-space-science-lab=Laboratorio scientifico spaziale +se-space-solar-panel=Pannello solare spaziale +se-space-solar-panel-2=Pannello solare spaziale avanzato +se-space-spectrometry-facility=Spettrometro +se-space-straight-rail=rotaia spaziale +se-space-supercomputer-1=Supercomputer +se-space-supercomputer-2=Computer quantico +se-space-supercomputer-3=Supercomputer neurale +se-space-telescope-radio=Radiotelescopio +se-space-telescope-microwave=Telescopio a microonde +se-space-telescope=Telescopio +se-space-telescope-xray=Telescopio raggi-X +se-space-telescope-gammaray=Telescopio raggi gamma +se-space-thermodynamics-laboratory=Laboratorio di termodinamica +se-space-splitter=Ripartitore spaziale +se-space-transport-belt=Rullo spaziale +se-space-underground-belt=Rullo sotteraneo spaziale +se-spaceship-antimatter-engine=Motore ad antimateria per navicelle spaziali +se-spaceship-antimatter-booster-tank=Serbatoio booster con antimateria per navicella spaziale +se-spaceship-console=Console navicella spaziale +se-spaceship-gate=Porta navicella spaziale +se-spaceship-obstacle=Detriti spaziali +se-spaceship-rocket-engine=Motore razzo per navicelle spaziali +se-spaceship-rocket-booster-tank=Serbatoio dei booster per razzi per navicelle spaziali +se-spaceship-wall=Muro navicella spaziale +se-water-ice=Acqua ghiacciata +small-asteroid=Piccolo asteroide + +[entity-description] +rocket-silo=Lancia un salellite nello spazio per iniziare a scansionarlo, per scoprire nuovi pianeti e ottenere una piccola quantità di pacchi scientifici +se-antimatter-reactor=Annienta l'antimateria con la materia per generare temperature estreme +se-condenser-turbine=75% di efficenza rispetto alle turbine a vapore, ma il 99% del vapore viene condensato in acqua +se-core-fragment-processor=Estrae risorse dal cuore del pianeta +se-core-miner=Abilita all'estrazione illimitata di risorse da pianeti e lune, ma ha rendimenti minori se si utilizzano più trivelle sullo stesso corpo celeste. Consuma 50MW +se-core-miner-drill=Abilita all'estrazione illimitata di risorse da pianeti e lune, ma ha rendimenti minori se si utilizzano più trivelle sullo stesso corpo celeste. Consuma 50MW +se-electric-boiler=Crea vapore dall'acqua usando l'energia elettrica +se-fluid-burner-generator=Richiede carburante liquido con un valore energetico (come ilcarburante liquido per razzi) per generare eletticità. Semplice e compatto, ma privo di efficenza rispetto a sistemi più grandi basati sul vapore. Progettato per lo spazio +se-meteor-defence-container=Può difendere un intero pianeta dai meteoriti, ma può sparare solo ad 1. Deve essere caricato con le munizioni per i meteoriti e deve essere caricato completamente per poter sparare. Ha una precisione dell'80%. Deve essere ricaricato dopo aver sparato. Consuma 20MW mentre si ricarica +se-meteor-defence-charger=Può difendere un intero pianeta dai meteoriti, ma può sparare solo ad 1. Deve essere caricato con le munizioni per i meteoriti e deve essere caricato completamente per poter sparare. Ha una precisione dell'80%. Deve essere ricaricato dopo aver sparato. Consuma 20MW mentre si ricarica +se-meteor-point-defence-container=Difende un'area dai meteoriti. Può sparare fino a 4 meteoriti per volta. Deve essere caricato con le munizioni per difese a puntamento e deve essere ricaricato completamente prima di sparare. Ha un raggio di 64, 50% di precisione e ha bisogno di tempo per ricaricarsi dopo aver sparato +se-meteor-point-defence-charger=Difende un'area dai meteoriti. Può sparare fino a 4 meteoriti per volta. Deve essere caricato con le munizioni per difese a puntamento e deve essere ricaricato completamente prima di sparare. Ha un raggio di 64, 50% di precisione e ha bisogno di tempo per ricaricarsi dopo aver sparato +se-rocket-launch-pad=Lancia l'inventario nello spazio. Può ospitare passeggeri, entrando usando __CONTROL__toggle-driving__ Vicino alla porta frontale. +se-rocket-landing-pad=Un sito per la consegna del carico e per le capsule spaziali +se-space-assembling-machine=Un assemblatore modificato che può lavorare nello spazio. +se-space-astrometrics-laboratory=Combina, compara e quantifica diverse fonti di informazioni astronomiche. +se-space-biochemical-laboratory=Un avanzato laboratorio chimico specializzato in chimica organica. Inoltre può essere usato anche per le operazioni chimiche di base e per la lavorazione dell'olio. +se-space-capsule-_-vehicle=Può essere usato per trasportare passeggeri indietro sulla superficie del pianeta più vicino. Entra nella capsula usando __CONTROL__toggle-driving__. +se-space-decontamination-facility=Pulisce le sostanze da usare in ambienti sterili e prepara i liquidi da usare in condizioni di passa pressione +se-space-electromagnetics-laboratory=Equipaggiamento per intensificare il campo magnetico e per applicazioni con voltaggio estremo +se-space-genetics-laboratory=Un laboratorio dedicato alla genetica: sequenze genetiche, manipolazione genetica e stampa genetica di culture +se-space-gravimetrics-laboratory=Analizza e simula disturbi gravitazionali +se-space-growth-facility=Permette la crescita di organismi viventi in un'area con condizioni controllate, impossibile in altri posti, come in ambienti di microgravità +se-space-hypercooler=Esegue uno scambio di temperatura sui termofluidi, rendendone uno più caldo e l'altro più freddo +se-space-laser-laboratory=Sperimentazione con laser. Proteggersi gli occhi +se-space-lifesupport-facility=Sostiene la vita anche negli ambienti più ostili. +se-space-manufactory=Un gigantesco assemblatore meccanico, che può costruire anche gli oggetti più complicati. Funziona solo nello spazio (o sulla navicella spaziale) +se-space-material-fabricator=Sintetizza nuovi materiali. Un insieme tra una struttura collisione particelle e una stampante 3D +se-space-mechanical-laboratory=Fornisce una serie di processi meccanici: Schiacciamento, lacerazione, tagliatura, vibrazioni e altro. +se-space-particle-accelerator=Accelera le particelle ad una velocità prossima alla velocità della luce +se-space-particle-collider=Collide particelle ad alta velocità e analizza i risultati +se-space-pipe=Ci puoi camminare supra +se-space-pipe-to-ground=Costoso e con raggio limitato, da utilizzare solo quando richiesto. Ci puoi camminare sopra +se-space-plasma-generator=Genera diverse varietà di plasma +se-space-radiation-laboratory=Un posto relativamente sicuro per giocare con i materiali radioattivi. Può essere usato anche per processare l'uranio +se-space-radiator=Irradia il calore in eccesso dal termofluido riscaldato +se-space-recycling-facility=Ricicla rottami e altri prodotti in risorse +se-space-solar-panel=Un pannello solare molto efficente per lo spazio +se-space-solar-panel-2=Un pannello solare avanzato molto efficente per lo spazio +se-space-spectrometry-facility=Spettrometria, gas cromatografia, spettrometria di massa e altra spettrografia. Spara roba contro il muro, falla piegare e vedo dove ha colpito. +se-space-supercomputer-1=Manipola, elabora e simula i dati +se-space-supercomputer-2=Computer quantico. Ha una manipolazione, elaborazione e simulazione migliore +se-space-supercomputer-3=Una rete neurale adattiva su un computer quantico. Migliora la manipolazione, elaborazione e simulazione migliore +se-space-straight-rail=Progettata per lo spazio, ma può essere usata anche sulla terra +se-space-science-lab=Può utilizzare i pacchi scientifici più avanzati. Deve essere piazzato nello spazio +se-space-telescope=Un sofisticato telescopio sensibile a più lunghezze d'onda attorno allo spettro visibile +se-space-telescope-gammaray=I raggi gamma non vendono riflessi. Questo potente telescopio usa specchi e degli speciali rilevatori +se-space-telescope-xray=I raggi X sono bloccati per la maggior parte nell'atmosfera. Questo potente telescopio è studiato per lo spazio, dove l'atmosfera non è un problema +se-space-telescope-microwave=Un grosso telescopio che rileva lunghezze d'onda e le morcoonde provenienti dallo spazio prodondo +se-space-telescope-radio=Un grosso telescopio che rileva anche le più deboli onde radio distanti dalle sorgenti +se-space-thermodynamics-laboratory=Intraprende processi che utilizzano temperature estreme. Inoltre può eseguire processi termici di base, come la fusione +se-space-transport-belt=Impedisce agli oggetti di volare via +se-spaceship-antimatter-engine=Annienta un flusso di antimateria. Può essere usata come paratia per il contenimento della navicella spaziale +se-spaceship-antimatter-booster-tank=Contiene antimateria. Richiesto per il lancio dell'astronave +se-spaceship-console=Usato per muovere la navicella spaziale attraverso pianeti, lune, orbite e campi di asteroidi. Deve essere piazzato sul pavimento della navicella, contenuto all'interno di muri/porte, senza spazi o buchi. Il controllo di integrità trova i problemi +se-spaceship-gate=In campo di forza blocca la decompressione quando le porte si aprono. Conta come paratia per il contenimento della navicella +se-spaceship-rocket-engine=Consuma combustibile liquido per razzi. Conta come paratia per il contenimento dell'astronave +se-spaceship-rocket-booster-tank=Contiene carburante per razzi liquido. Richiesto per il lancio della navicella spaziale +se-spaceship-wall=Deve essere piazzato sul pavimento della navicella e viene considerato come parte di essa. Viene contata come paratia per il contenimento della navicella e per il contenimento nei buchi + +[equipment-name] +energy-shield-equipment=Scudo energetico +energy-shield-mk2-equipment=Scudo energetico MK2 +energy-shield-mk3-equipment=Scudo energetico MK3 +energy-shield-mk4-equipment=Scudo energetico MK4 +energy-shield-mk5-equipment=Scudo energetico MK5 +energy-shield-mk6-equipment=Scudo energetico MK6 +se-adaptive-armour-equipment-1=Armatura adattiva MK1 +se-adaptive-armour-equipment-2=Armatura adattiva MK2 +se-adaptive-armour-equipment-3=Armatura adattiva MK3 +se-adaptive-armour-equipment-4=Armatura adattiva MK4 +se-adaptive-armour-equipment-5=Armatura adattiva MK5 +se-rtg-equipment=RTG portatile +se-rtg-equipment-2=RTG MK2 portatile + +[equipment-description] +energy-shield-equipment=Una bolla protettiva che si ricarica velocemente, ma usa una grande quantità di energia +energy-shield-mk2-equipment=Una bolla protettiva che si ricarica velocemente, ma usa una grande quantità di energia +energy-shield-mk3-equipment=Una bolla protettiva che si ricarica velocemente, ma usa una grande quantità di energia +energy-shield-mk4-equipment=Una bolla protettiva che si ricarica velocemente, ma usa una grande quantità di energia +energy-shield-mk5-equipment=Una bolla protettiva che si ricarica velocemente, ma usa una grande quantità di energia +energy-shield-mk6-equipment=Una bolla protettiva che si ricarica velocemente, ma usa una grande quantità di energia +se-adaptive-armour-equipment-1=Armatura che usa energia per ripararsi da sola. Aumenta lentamente il valore di protezione col tempo +se-adaptive-armour-equipment-2=Armatura che usa energia per ripararsi da sola. Aumenta lentamente il valore di protezione col tempo +se-adaptive-armour-equipment-3=Armatura che usa energia per ripararsi da sola. Aumenta lentamente il valore di protezione col tempo +se-adaptive-armour-equipment-4=Armatura che usa energia per ripararsi da sola. Aumenta lentamente il valore di protezione col tempo +se-adaptive-armour-equipment-5=Armatura che usa energia per ripararsi da sola. Aumenta lentamente il valore di protezione col tempo +se-rtg-equipment=Generatore elettrico a base di radioisotopi. Un generatore portatile che converte il calore del decadimento radiattivo in energia. Dura per decenni, quindi non c'è bisogno di aggiungere carburante +se-rtg-equipment-2=Generatore elettrico a base di radioisotopi. Un generatore portatile migliorato che converte il calore del decadimento radiattivo in energia. Dura per decenni, quindi non c'è bisogno di aggiungere carburante + +[fluid-name] +se-antimatter-stream=Antimateria +se-bio-sludge=Biosludge +se-contaminated-bio-sludge=Biosludge contaminato +se-contaminated-space-water=Acqua cosmica contaminata +se-chemical-gel=Gel chimico +se-decompressing-steam=Condensatore di vapore +se-liquid-rocket-fuel=Carburante liquido per razzi +se-methane-gas=Gas metano +se-methane-gas-mixed=Gas metano mescolato +se-nutrient-gel=Gel nutriente +se-neural-gel=Gel naturale +se-neural-gel-2=Gel naturale avanzato +se-ion-stream=Ioni +se-plasma-stream=Plasma +se-particle-stream=Flusso di particelle +se-proton-stream=Flusso di protoni +se-space-coolant=Termofluido 25°C +se-space-coolant-hot=Termofluido 25°C +se-space-coolant-warm=Termofluido freddo -10°C +se-space-coolant-cold=Termofluido freddo -100°C +se-space-coolant-supercooled=Termofluido superfreddo -273°C +se-space-water=Acqua cosmica + +[fluid-description] +se-space-water=L'acqua non si congela a bassa pressione, più utile per l'utilizzo nello spazio +se-space-coolant=La temperatura di base del termofluido +se-space-coolant-hot=La temperatura di base del termofluido +se-space-coolant-warm=La temperatura del termofluido dopo essere stato raffreddato dal radiatore termico +se-space-coolant-cold=La temperatura del termofluido dopo essere stato hyper raffreddato +se-space-coolant-supercooled=La temperatura del termofluido dopo aver ripetuto il processo di hyper-raffreddamento + +[item-group-name] +space=Spazio +spaceship=Astronave +bob-fluids=Fluidi + +[item-name] +core-fragment=Frammento del nucleo (__1__) +effectivity-module-4=Efficienza modulo 4 +effectivity-module-5=Efficienza modulo 5 +effectivity-module-6=Efficienza modulo 6 +effectivity-module-7=Efficienza modulo 7 +effectivity-module-8=Efficienza modulo 8 +effectivity-module-9=Efficienza modulo 9 +glass=Vetro +productivity-module-4=Produttività modulo 4 +productivity-module-5=Produttività modulo 5 +productivity-module-6=Produttività modulo 6 +productivity-module-7=Produttività modulo 7 +productivity-module-8=Produttività modulo 8 +productivity-module-9=Produttività modulo 9 +rocket-fuel=Carburante solito per razzi +sand=Sabbia +solid-sand=Sabbia lavata +washed-sand=Sabbia lavata +satellite=Navigazione satellitare +se-antimatter-canister=Contenitore di antimateria +se-astrometric-data=Dati astrometrici +se-astronomic-catalogue-1=Cagalogo astronomici +se-astronomic-catalogue-2=Scheda dati astronomici +se-astronomic-catalogue-3=Catalogo astronomico completo +se-astronomic-catalogue-4=Catalogo astronomico esteso +se-astronomic-insight=Intuizione astronomica +se-astronomic-science-pack=Pacco scientifico astronomico +se-atomic-data=Dati atomici +se-bio-combustion-data=Dati bio combustione +se-bio-combustion-resistance-data=Dati resistenza bio combustione +se-bio-spectral-data=Dati bio spettrali +se-biochemical-data=Dati biochimici +se-bioculture=Biocultura +se-bioelectrics-data=Dati bioelettrici +se-biological-catalogue-1=Cataloghi biologici +se-biological-catalogue-2=Ampio catalogo biologico +se-biological-catalogue-3=Catalogo biologico completo +se-biological-catalogue-4=Catalogo biologico esteso +se-biological-insight=Intuizione biologica +se-biological-science-pack=Pacco scientifico biologico +se-biomechanical-data=Dati biomeccanici +se-biomechanical-resistance-data=Dati resistenza biomeccanica +se-boson-data=Dati bosone +se-broken-data=Scheda dati distrutta +se-canister=Contenitore sicuro +se-rocket-launch-pad-silo-dummy-ingredient-item=Razzo cargo +se-rocket-launch-pad-silo-dummy-result-item=Razzo cargo +se-cargo-rocket-cargo-pod=Pedana di atterraggi cargo +se-cargo-rocket-fuel-tank=Serbatoio carburante per razzi +se-cargo-rocket-section=Sezione del razzo cargo +se-cargo-rocket-section-packed=Sezione del razzo cargo compressa +se-cold-thermodynamics-data=Dati termodinamici freddi +se-comparative-genetic-data=Dati comparativi genetici +se-compressive-strength-data=Dati compressivi di forza +se-conductivity-data=Dati conduttività +se-contaminated-scrap=Frammenti contaminati +se-core-fragment-omni=Frammento del nucleo +se-cryogenics-data=Dati criogenici +se-dark-energy-data=Dati energia oscura +se-darkmatter-data=Dati materia oscura +se-data-storage-substrate-cleaned=Substrato di archiviazione di dati lucido +se-data-storage-substrate=Substrato di archiviazione di dati ruvido +se-decompression-data=Dati di decompressione +se-decompression-resistance-data=Dati resistenza di decompressione +se-deep-space-science-pack=Pacco scientifico spazio profondo +se-electromagnetic-field-data=Dati campo elettromagnetico +se-empty-data=Scheda dati vuota +se-empty-lifesupport-canister=Contenitore per supporto vitale vuoto +se-energy-catalogue-1=Cagtalogo energetico +se-energy-catalogue-2=Ampio catalogo di energia +se-energy-catalogue-3=Catalogo di enercia completo +se-energy-catalogue-4=Catalogo di energia esteso +se-energy-insight=Intuizione energetica +se-energy-science-pack=Pacco scientifico energetico +se-entanglement-data=Dati di aggrovigliamento +se-exotic-fission-data=Dati di fissione esotici +se-exotic-singularity-data=Dati singolarità +se-experimental-biochemical-data=Dati biochimica sperimentale +se-experimental-bioculture=Biocultura sperimentale +se-experimental-genetic-data=Dati genetica sperimentale +se-experimental-material-decay-data=Dati decadimento dei materiali sperimentale +se-experimental-material-spectral-data=Dati spettro dei materiali sperimentale +se-experimental-material=Prototipo di materiale sperimentale +se-experimental-specimen=Biomassa sperimentale +se-experimental-superconductor=Prototipo di superconduttore +se-forcefield-data=Dati campo magnetico +se-fusion-test-data=Dati test fusione +se-gammaray-detector=Rilevatore raggi gamma +se-gammaray-observation-data=Dati osservazione raggi gamma +se-gammaray-test-data=Dati raggi gamma +se-genetic-data=Dati genetici +se-gravity-wave-observation-data=Dati osservazione onde gravitazionali +se-gravimetric-observation-data=Dati osservazione gravimetria +se-gravimetric-test-data=Dati test gravimetria +se-heat-shielding=Schematura termica +se-hot-thermodynamics-data=Dati termodinamici caldi +se-infrared-observation-data=Dati osservazione infrarossa +se-ion-spectrometry-data=Dati spettrometria ionica +se-junk-data=Scheda dati di scarto +se-lepton-data=Dati lepton +se-lifesupport-canister=Contenitore per supporto vitale +se-magnetic-canister=Contenitore magnetico +se-magnetic-monopole-data=Dati manipolazione magnetica +se-material-decay-data=Dati decadimento materiali +se-material-science-pack=Pacco scientifico dei materiali +se-material-spectral-data=Dati materiali spettrali +se-material-testing-pack=Pacco di prova dei materiali +se-material-catalogue-1=Catalogo dei materiali +se-material-catalogue-2=Ampio catalogo dei materiali +se-material-catalogue-3=Catalogo dei materiali completo +se-material-catalogue-4=Catalogo dei materiali esteso +se-material-insight=Intuizione materiale +se-medpack=Medikit +se-medpack-2=Medikit 2 +se-medpack-3=Medikit 3 +se-medpack-4=Medikit 4 +se-meteor-defence=Installazione di difesa anti meteoriti +se-meteor-defence-ammo=Munizioni per installazione difensiva +se-meteor-point-defence=Difesa a puntamento anti meteoriti +se-meteor-point-defence-ammo=Munizioni per difesa a puntamento +se-methane-ice=Metano ghiacciato +se-micro-black-hole-data=Dati micro buconero +se-microwave-observation-data=Dati osservazione microonde +se-nano-cold-thermodynamics-data=Dati nanomateriali termodinamici freddi +se-nano-compressive-strength-data=Dati nanomateriali sulla resistenza alla compressione +se-nano-hot-thermodynamics-data=Dati nanomateriali termidinamici caldi +se-nanomaterial=Nanomateriale +se-nano-tensile-strength-data=Dati nanomateriali sulla resistenza alla trazione +se-negative-pressure-data=Dati pressione negativa +se-neural-anomaly-data=Dati anomalia neurale +se-nutrient-vat=Tino di nutriente +se-observation-frame-blank=Struttura di osservazione vuota +se-observation-frame-gammaray=Struttura di osservazione raggi gamma +se-observation-frame-infrared=Struttura di osservazione infrarissi +se-observation-frame-microwave=Struttura di osservazione microonde +se-observation-frame-radio=Struttura di osservazione onde radio +se-observation-frame-uv=Struttura di osservazione UV +se-observation-frame-visible=Struttura di osservzione visibile +se-observation-frame-xray=Struttura di osservazione raggi X +se-plague-bomb=Piaga volante +se-plasma-canister=Contenitore al plasma +se-plasma-electrodynamics-data=Dati elettrodinamici plasma +se-plasma-thermodynamics-data=Dati termodinamici plasma +se-polarisation-data=Dati polarità +se-pressure-containment-data=Dati contenimento pressione +se-quantumn-phenomenon-data=Dati fenomeni quantistici +se-quark-data=Dati quark +se-radiation-data=Dati radiazioni +se-radiation-exposure-data=Dati esposizione radiazioni +se-radiation-exposure-resistance-data=Dati resistenza radiazioni +se-radiation-shielding-data=Dati schermatura radiazioni +se-radio-observation-data=Dati osservazione onde radio +se-rtg-equipment=RTG portatile +se-rtg-equipment-2=RTG portatile MK 2 +se-scrap=Frammenti contaminati +se-significant-data=Dati significativi +se-significant-specimen=Biomassa significativa +se-space-capsule=Capsula spaziale +se-space-mirror=Specchio multispettrale +se-space-platform-plating=Rivestimento piattaforma spaziale +se-space-platform-scaffold=Impalcatura piattaforma spaziale +se-space-rail=Rotaie spaziali +se-spaceship-floor=Pavimento astronave +se-specimen=Biomassa +se-subatomic-data=Dati subatomici +se-superconductivity-data=Dati superconduttività +se-superconductor=Superconduttore +se-superconductive-cable=Cavo superconduttore +se-tensile-strength-data=Dati resistenza alla trazione +se-tesla-ammo=Munizioni tesla gun +se-tesla-gun=Tesla gun +se-thruster-suit=Tuta jet +se-thruster-suit-2=Tuta jet MK2 +se-thruster-suit-3=Tuta jet MK3 +se-thruster-suit-4=Tuta jet MK4 +se-timespace-anomaly-data=Dati anomalia spazio-temporale +se-used-lifesupport-canister=Contenitore supporto vitale usato +se-uv-observation-data=Dati osservazione UV +se-visible-observation-data=Dati osservazione visibile +se-water-ice=Acqua ghiacciata +se-xray-observation-data=Dati osservazione raggi x +se-zero-point-energy-data=Dati punto zero energia +space-science-pack=Pacco scientifico razzo +speed-module-4=Modulo di velocità 4 +speed-module-5=Modulo di velocità 5 +speed-module-6=Modulo di velocità 6 +speed-module-7=Modulo di velocità 7 +speed-module-8=Modulo di velocità 8 +speed-module-9=Modulo di velocità 9 + +[item-description] +automation-science-pack=Usato dai laboratori scientifici base per le ricerche +chemical-science-pack=Usato dai laboratori scientifici base per le ricerche +logistic-science-pack=Usato dai laboratori scientifici base per le ricerche +military-science-pack=Usato dai laboratori scientifici base per le ricerche +production-science-pack=Usato dai laboratori scientifici base per le ricerche +satellite=Il satellite dovrebbe essere inserito nel silo per i razzi +se-antimatter-canister=La forma più densa di energia per il trasporto sicuro in un contenitore +se-astronomic-science-pack=Usato dai laboratori scientifici spaziali per la ricerca +se-biological-science-pack=Usato dai laboratori scientifici spaziali per la ricerca +se-canister=Un contenitore multiuso per il contenimento +se-cargo-rocket-cargo-pod=Una sezione del razzo cargo +se-cargo-rocket-fuel-tank=Una sezione del razzo cargo +se-cargo-rocket-section=Il componente chiave per il razzo cargo. Bisogna inserirlo nell'inventario del silo per razzi cargo. 100 sono richiesti per un razzo. Possono essere recuperati dall'atterraggio dei razzi (20% di possibilità di recupero di partenza) +se-cargo-rocket-section-packed=Sezioni per il razzo cargo compresse, comode per il trasporto. Devono essere spacchettate per essere utilizzate nella costruzione del razzo +se-deep-space-science-pack=Usato dai laboratori scientifici spaziali per la ricerca +se-energy-science-pack=Usato dai laboratori scientifici spaziali per la ricerca +se-heat-shielding=Un pannello composito usato per applicazioni con alte temperature e strutture spaziali +se-material-science-pack=Usato dai laboratori scientifici spaziali per la ricerca +se-medpack=Usalo per curarti +se-medpack-2=Usalo per curarti +se-medpack-3=Usalo per curarti +se-medpack-4=Usalo per curarti +se-meteor-defence=Può difendere un intero pianeta dai meteoriti, ma può sparare solo ad 1. Deve essere caricato con le munizioni per i meteoriti e deve essere caricato completamente per poter sparare. Ha una precisione dell'80%. Deve essere ricaricato dopo aver sparato. Consuma 20MW mentre si ricarica +se-meteor-defence-ammo=Distrugge meteoriti. Deve essere caricato dentro una difesa planetaria contro meteoriti +se-meteor-point-defence=Difende un'area dai meteoriti. Può sparare fino a 4 meteoriti per volta. Deve essere caricato con le munizioni per difese a puntamento e deve essere ricaricato completamente prima di sparare. Ha un raggio di 64, 50% di precisione e ha bisogno di tempo per ricaricarsi dopo aver sparato +se-meteor-point-defence-container=Distrugge meteoriti. Deve essere caricato dentro una difesa a puntamento contro meteoriti +se-rocket-launch-pad-silo-dummy-ingredient-item=Costruito inserendo 100 sezioni per razzo cargo e 1 capsula spaziale dentro il silo per razzi cargo +se-rtg-equipment=Generatore elettrico a base di radioisotopi. Un generatore portatile che converte il calore del decadimento radiattivo in energia. Dura per decenni, quindi non c'è bisogno di aggiungere carburante +se-rtg-equipment-2=Generatore elettrico a base di radioisotopi. Un generatore portatile migliorato che converte il calore del decadimento radiattivo in energia. Dura per decenni, quindi non c'è bisogno di aggiungere carburante +se-plague-bomb=Estinguere tutte le forme di vita da un intero pianeta. Maneggiare con estrema cauzione. (Può causare pesanti calid i UPS e continui, visto che tutto muore gradualmente. Sconsigliato l'uso per grandi pianeti o multiplayer) +se-space-capsule=Una capsula di controllo richiesta dai razzi cargo. Può essere usata per portare passeggeri indietro sulla superficie del pianeta più vicino. Entra nella capsula usando __CONTROL__toggle-driving__. +se-space-platform-plating=Un rivestimento avanzato che permette di muoversi velocemente supra la piattaforma spaziale +se-space-platform-scaffold=Impalcatura spaziale di base che permette di piazzare alcune strutture nello spazio +se-space-rail=Rotaie costruite per muovere in modo sicuro i treni nello spazio senza che volino via dai binari e distruggendo tutto. Possono essere usate anche sulla terra per ragioni estetiche +se-spaceship-floor=Questo pavimento deve essere sotto tutte le parti dell'astronave, insieme ai muri nei lati esterni. Qualsiasi spazio nel pavimento causerà una perdita nel contenimento e alcune sezioni si potrebbero sganciare +se-superconductive-cable=Un cavo composito superconduttivo che non richiede nessun sistema attivo di raffreddamento +se-tesla-gun=Spara catene di fulmini con velocità elevata +se-thruster-suit=Una tuta spaziale richiesta per sopravvivere nello spazio. \nHa jet e stivali +se-thruster-suit-2=Una tuta spaziale richiesta per sopravvivere nello spazio. \nHa dei jet migliori, un inventario più grande e una griglia maggiore +se-thruster-suit-3=Una tuta spaziale richiesta per sopravvivere nello spazio. \nHa dei jet migliori, un inventario più grande e una griglia maggiore +se-thruster-suit-4=Una tuta spaziale richiesta per sopravvivere nello spazio. \nHa dei jet migliori, un inventario più grande e una griglia maggiore +space-science-pack=Usato dai laboratori scientifici spaziali per la ricerca +utility-science-pack=Usato dai laboratori scientifici base per le ricerche + +[recipe-name] +core-fragment=Processo di frammentazione del nucleo (__1__) +rocket-fuel=Combustibile solido per razzi +se-astrometric-analysis-multispectral-1=Analisi multispettrale astrometrica 1 +se-astrometric-analysis-multispectral-2=Analisi multispettrale astrometrica 2 +se-astrometric-analysis-multispectral-3=Analisi multispettrale astrometrica 3 +se-astronomic-insight-1=Intuizione astronomica +se-astronomic-insight-2=Catalogo intuizioni astronomiche +se-astronomic-insight-3=Intuizioni astronomiche comprensive +se-astronomic-insight-4=Intuizioni astronomiche estese +se-biological-insight-1=Intuizioni biologiche +se-biological-insight-2=Catalogo intuizioni biologiche +se-biological-insight-3=Intuizioni biologiche comprensive +se-biological-insight-4=Intuizioni biologiche estese +se-bio-methane-to-crude-oil=Bio processo del metano per olio +se-bio-sludge-crude-oil=Fango biologico per biomasse sperimentali +se-bio-sludge-decontamination=Decontaminazione fango biologico +se-bio-sludge-from-fish=Fango biologico da pesci +se-bio-sludge-from-wood=Fango biologico da legno +se-bio-sludge=Fango biologico da biomassa +se-broken-data-scrapping=Rottamazione carta dati distrutta +se-cargo-rocket-section-pack=Compressione sezioni per razzo cargo +se-cargo-rocket-section-unpack=Decompressione sezioni per razzo cargo +se-condenser-turbine-reclaim-water=Generatore elettrico con acqua bonificata +se-core-fragment-omni=Processo di frammentazione del nucleo +se-core-mining=Estrazione del nucleo +se-empty-antimatter-canister=Flusso di antimateria per contenitore +se-empty-barrel-scrapping=Rottamazione di barili vuoti +se-empty-barrel-reprocessing=Riprocesso di barili vuoti +se-space-capsule-scrapping=Rottamazione di capsula spaziale +se-cargo-pod-scrapping=Rottamazione della pedana di atterraggio cargo +se-energy-insight-1=Intuizione elettriche +se-energy-insight-2=Catalogo intuizioni elettriche +se-energy-insight-3=Intuizione elettrica comprensiva +se-energy-insight-4=Intuizione elettrica estesa +se-formatting-1=Formattazione dei dati +se-formatting-2=Formattazione efficente dei dati +se-formatting-3=Formattazione avanzata dei dati +se-material-insight-1=Intuizione materiale +se-material-insight-2=Catalogo delle intuizione materiali +se-material-insight-3=Intuizione materiale comprensiva +se-material-insight-4=Intuizione materiale estesa +se-matter-fusion-copper=Fusione della materia (Rame) +se-matter-fusion-dirty=Fusione della materia (Rottami) +se-matter-fusion-iron=Fusione della materia (Ferro) +se-matter-fusion-stone=Fusione della materia (Pietra) +se-matter-fusion-uranium=Fusione della materia (Uranio) +se-plasma-canister-empty=Contenitore di plasma vuoto +se-radiating-space-coolant-normal=Raffreddamento termofluido fino a -10°C (Freddo) +se-radiating-space-coolant-slow=Raffreddamento lento termofluido fino a -10°C (Freddo) +se-radiating-space-coolant-veryslow=Raffreddamento molto lento termofluido fino a -10°C (Freddo) +se-mixed-methane-gas-separation=Separazione gas metano mischiato +se-rocket-fuel-from-water-copper=Carburante per razzi dall'acqua +se-scrap-decontamination=Decontaminazione dei rottami +se-scrap-recycling=Riciclo dei rottami +se-space-coolant-cold=Hyper raffreddamento termofluido fino a -100°C (Freddo) +se-space-coolant-supercooled=Hyper raffreddamento termofluido fino a -273°C (Superfreddo) +se-simulation-a=Simulazione astronomica +se-simulation-ab=Simulazione panspermia +se-simulation-abm=Simulazione xenoprogressione +se-simulation-am=Simulazione distribuzione materia +se-simulation-as=Simulazione astroparticellare +se-simulation-asb=Simulazione astrobionica +se-simulation-asbm=Simulazione universale +se-simulation-asm=Simulazione astrofisica +se-simulation-b=Simulazione biologica +se-simulation-bm=Simulazione biomeccanica +se-simulation-m=Simulazione materiale +se-simulation-s=Simulazione elettrica +se-simulation-sb=Simulazione biochimica +se-simulation-sbm=Simulazione nanite +se-simulation-sm=Simulazione nanomateriali +se-space-water-decontamination=Decontaminazione acqua cosmica +se-spaceship-rocket-engine-burn=Bruciatura carburante liquido per razzi +se-specimen-fish=Crescita pesce in microgravità +se-specimen-wood=Crescita legna in microgravità +se-thermodynamics-coal=Cottura a pressione con carbone +se-used-lifesupport-canister-cleaning=Pulizia contenimento supporto vitale + +[recipe-description] +se-astronomic-insight-2=Più complicato, ma più effcente nelle risorse +se-astronomic-insight-3=Più complicato, ma più effcente nelle risorse +se-astronomic-insight-4=Più complicato, ma più effcente nelle risorse +se-biological-insight-2=Più complicato, ma più effcente nelle risorse +se-biological-insight-3=Più complicato, ma più effcente nelle risorse +se-biological-insight-4=Più complicato, ma più effcente nelle risorse +se-core-mining=I frammenti del nucleo dipendono dal pianeta. Il tempo di trivellazione dipende dal numero di estrattori del nucleo presenti sul pianeta (o sulla luna) +se-energy-insight-2=Più complicato, ma più effcente nelle risorse +se-energy-insight-3=Più complicato, ma più effcente nelle risorse +se-energy-insight-4=Più complicato, ma più effcente nelle risorse +se-material-insight-2=Più complicato, ma più effcente nelle risorse +se-material-insight-3=Più complicato, ma più effcente nelle risorse +se-material-insight-4=Più complicato, ma più effcente nelle risorse +se-radiating-space-coolant-normal=Ripetuti raffreddamenti e riscaldamenti sul termofluido causano una degradazione +se-radiating-space-coolant-slow=Ripetuti raffreddamenti e riscaldamenti sul termofluido causano una degradazione. Un raffreddamento lento riduce il disperdio +se-radiating-space-coolant-veryslow=Ripetuti raffreddamenti e riscaldamenti sul termofluido causano una degradazione. Un raffreddamento lento riduce il disperdio + +[technology-name] +effectivity-module-4=Efficenza modulo 4 +effectivity-module-5=Efficenza modulo 5 +effectivity-module-6=Efficenza modulo 6 +effectivity-module-7=Efficenza modulo 7 +effectivity-module-8=Efficenza modulo 8 +effectivity-module-9=Efficenza modulo 9 +energy-shield-equipment=Scudo energetico +energy-shield-mk2-equipment=Scudo energetico MK2 +energy-shield-mk3-equipment=Scudo energetico MK3 +energy-shield-mk4-equipment=Scudo energetico MK4 +energy-shield-mk5-equipment=Scudo energetico MK5 +energy-shield-mk6-equipment=Scudo energetico MK6 +sand-processing=Processo della sabbia +glass-processing=Processo del vetro +liquid-rocket-fuel=Carburante liquido per razzi +productivity-module-4=Modulo produttività 4 +productivity-module-5=Modulo produttività 5 +productivity-module-6=Modulo produttività 6 +productivity-module-7=Modulo produttività 7 +productivity-module-8=Modulo produttività 8 +productivity-module-9=Modulo produttività 9 +rocket-silo=Satellite per silo dei razzi +rocketry=Missilistica da combattimento +se-adaptive-armour=Armatura adattiva +se-antimatter-engine=Motore ad antimateria +se-antimatter-reactor=Reattore ad antimateria +se-antimatter-production=Produzione di antimateria +se-astronomic-science-pack=Pacco scientifico astronomico +se-biological-science-pack=Pacco scientifico biologico +se-condenser-turbine=Turbina a condensazione +se-core-miner=Estrattore del nucleo +se-deep-space-science-pack=Pacco scientifico spazio profondo +se-electric-boiler=Boiler elettrico +se-energy-science-pack=Pacco scientifico energetico +se-fluid-burner-generator=Generatore di fluido isometrico +se-fuel-refining=Raffinazione del carburante +se-heat-shielding=Scudo termico +se-material-science-pack=Pacco scientifico materiale +se-medpack=Medikit +se-medpack-2=Medikit 2 +se-medpack-3=Medikit 3 +se-medpack-4=Medikit 4 +se-meteor-defence=Installazione difensiva planetaria anti meteorite +se-meteor-point-defence=Difesa a puntamento anti meteorite +se-plague=La piaga +se-railgun=Railgun +se-rocket-cargo-safety=Sicurezza razzi cargo +se-rocket-fuel-from-water=Carburante per razzi dall'acqua +se-rocket-launch-pad=Silo per razzi cargo +se-rocket-landing-pad=Pedana di atterraggio per razzi +se-rocket-reusability=Riusabilità dei razzi +se-rocket-survivability=Soppravvivenza dei razzi +se-rtg-equipment=RTG portatile +se-rtg-equipment-2=RTG portatile MK2 +se-space-assembling=Assemblatore spaziale +se-space-accumulator=Accumulatore spaziale +se-space-astrometrics-laboratory=Laboratorio astrometrico +se-space-biochemical-laboratory=Laboratorio biochimico +se-space-catalogue-astronomic=Catalogo astronomico +se-space-catalogue-biological=Catalogo biologico +se-space-catalogue-energy=Catalogo energetico +se-space-catalogue-material=Catalogo dei materiali +se-space-data-card=Scheda dati +se-space-decontamination-facility=Decontaminazione facilitata +se-space-electromagnetics-laboratory=Laboratorio elettromagnetico +se-space-genetics-laboratory=Laboratorio genetica +se-space-gravimetrics-laboratory=Laboratorio gravimetrico +se-space-growth-facility=Crescita facilitata +se-space-hypercooling=Hyper raffreddamento +se-space-laser-laboratory=Laboratorio laser +se-space-lifesupport-facility=Supporto vitale facilitato +se-space-manufactory=Fabbrica spaziale +se-space-material-fabricator=Fabbricatore di materiali +se-space-matter-fusion=Fusione della materia +se-space-mechanical-laboratory=Laboratorio meccanico +se-space-particle-accelerator=Acceleratore di particelle +se-space-particle-collider=Collider di particelle +se-space-plasma-generator=Generatore di plasma +se-space-platform-plating=Rivestimento piattaforma spaziale +se-space-platform-scaffold=Impalcatura piattaforma spaziale +se-space-radiation-laboratory=Laboratorio radiazioni +se-space-radiator=Radiatore termico +se-space-rail=Rotaia spaziale +se-space-recycling-facility=Riciclaggio facilitato +se-space-science-lab=Laboratorio scientifico spaziale +se-space-simulation-ab=Simulazione panspermia +se-space-simulation-am=Simulazione astromateriale +se-space-simulation-as=Simulazione astroparticelle +se-space-simulation-bm=Simulazione biomeccanica +se-space-simulation-sb=Simulazione biochimica +se-space-simulation-sm=Simulazione nanomateriali +se-space-simulation-abm=Simulazione xenoprogressione +se-space-simulation-asb=Simulazione astrobionica +se-space-simulation-asm=Simulazione astrofisica +se-space-simulation-sbm=Simulazione nanite +se-space-simulation-asbm=Simulazione universale +se-space-solar-panel=Pannelli solari spaziali +se-space-solar-panel-adv=Pannelli solari spaziali avanzati +se-space-spectrometry-facility=Spettrometria facilitata +se-space-supercomputer=Supercomputer +se-space-telescope=Telescopio +se-space-telescope-gammaray=Telescopio raggi gamma +se-space-telescope-xray=Telescopio raggi X +se-space-telescope-microwave=Telescopio microonde +se-space-telescope-radio=Radio telescopio +se-space-thermodynamics-laboratory=Laboratorio termodinamica +se-spaceship=Astronave +se-spaceship-integrity=Integrità strutturale astronave +se-factory-spaceship=Fabbrica astronave +se-superconductive-cable=Cavo superconduttore +se-teleportation=Teletrasporto +se-tesla-gun=Tesla gun +se-thruster-suit=Tuta jet +space-science-pack=Pacco scientifico razzo +speed-module-4=Modulo velocità 4 +speed-module-5=Modulo velocità 5 +speed-module-6=Modulo velocità 6 +speed-module-7=Modulo velocità 7 +speed-module-8=Modulo velocità 8 +speed-module-9=Modulo velocità 9 + +[technology-description] +energy-shield-equipment=Una bolla protettiva che si ricarica facilmente, ma che usa molta energia +energy-shield-mk2-equipment=Una bolla protettiva che si ricarica facilmente, ma che usa molta energia +energy-shield-mk3-equipment=Una bolla protettiva che si ricarica facilmente, ma che usa molta energia +energy-shield-mk4-equipment=Una bolla protettiva che si ricarica facilmente, ma che usa molta energia +energy-shield-mk5-equipment=Una bolla protettiva che si ricarica facilmente, ma che usa molta energia +energy-shield-mk6-equipment=Una bolla protettiva che si ricarica facilmente, ma che usa molta energia +sand-processing=Spacca, macina e filtra la materia prima in sabbia +glass-processing=Cuoce la sabbia in vetro +rocket-silo=Ti permette di lanciare il satellite in orbita per sviluppare pacchi scientifici razzo e scoprire nuovi pianeti +se-adaptive-armour=Armatura che usa eneria per autoriparasi. È simile allo scudo energetico, ma richiede meno potenza, con una velocità di rigenerazione minore +se-antimatter-engine=Annienta l'antimateria per produrre una spinta potentissima +se-antimatter-reactor=Annienta l'antimateria con altra materia per generare un calore estremo +se-antimatter-production=Produce antimateria, la forma di energia immagazzinata più densa +se-astronomic-science-pack=Permette la ricerca di tecnologie riguardanti viaggi spaziali e comunicazione interstellare +se-biological-science-pack=Permette di ricercare le tecnologie relative al miglioramento delle tue capacità fisiche, armi biologiche e lavorazione neurale +se-condenser-turbine=75% dell'efficenza energetica delle turbine a vapore, ma il 99% del vapore utilizzato viene condensato in acqua +se-core-miner=Permette l'estrazione infinita delle risorse da pianeti e lune, ma diminuisce l'efficenza all'aumentare del numero di trivelle sullo stesso corpo celeste +se-deep-space-science-pack=Richiesto per le tecnologie più avanzate +se-electric-boiler=CProduce vapore dall'acqua usando l'energia elettrica +se-energy-science-pack=Permette la ricerca delle tecnologie relative alle forze fondamentali e alle scoperte subatomiche +se-fluid-burner-generator=Richiede carburante liquido con un valore energetico (tipo i lcarburante liquido per razzi) per generare energia. Semplice e compatto, ma non è molto efficente in confronto a sistemi più grossi basati sul vapore. Progettato per lo spazio +se-fuel-refining=Raffina i più avanzati carburanti +se-heat-shielding=Un pannello composito usato per applicazioni con alte temperature e per strutture spaziali +se-material-science-pack=Permette di ricercare tecnologie riguardanti materiali avanzati da utilizzare, per i più avanzati componenti ingegneristici +se-medpack=Usa il medikit per curarti +se-medpack-2=Usa il medikit per curarti +se-medpack-3=Usa il medikit per curarti +se-medpack-4=Usa il medikit per curarti +se-meteor-defence=Spara ai meteoriti che cadono dal cielo, prima che distruggano i tuoi macchinari. Una difesa anti meteoriti può difendere un intero pianeta, ma può sparare solo ad 1 meteorite alla volta +se-meteor-point-defence=Spara ai meteoriti che cadono dal cielo, prima che distruggano i tuoi macchinari. una difesa a puntamento anti meteoriti copre solo una determinata area, ma può colpire 4 meteoriti alla volta +se-railgun=Frecce accelerate elettromagneticamente fino a raggiungere una velocità da lasciare una scia di prisma prima di evaporare. Alto danno, bassa velocità di fuoco +se-plague=La grande piaga che eradicherà ogni forma di vita dal pianeta bersaglio. Maneggiare con ESTREMA cauzione +se-rocket-cargo-safety=Riduce le chance che il rivestimento del razzo cargo venga danneggiato in transito del 10% (moltiplicativo) +se-rocket-fuel-from-water=Genera idrogeno-ossigeno per carburante per razzi tramite l'elettrolisi dell'acqua +se-rocket-landing-pad=Permette di lanciare razzi cargo verso determinate pedane di atterraggio, tramite il nome. Ricerche più avanzate permettono anche di recuperare parti del razzo +se-rocket-launch-pad=Ti permette di lanciare un carico verso lo spazio o altri pianeti e lune +se-rocket-reusability=Aumenta la percentuale di parti che possono essere recuperate da un atterraggio riuscito del 4% (Base: 20%, massimo è 100%) +se-rocket-survivability=Riduce la percentuale che il razzo venga danneggiato in viaggio o che subisca fallimenti nella navigazione, risultando in un mancato atterraggio sulla pedana del 10% (moltiplicativo) +se-rtg-equipment=Generatore termoelettrico a radioisotopi. Un generatore portatile che ti permette di convertire il calore del decadimento radiattivo in elettricità. Non ha bisogno di carburante aggiuntivo +se-rtg-equipment-2=Generatore termoelettrico a radioisotopi. Un generatore portatile migliorato che ti permette di convertire il calore del decadimento radiattivo in elettricità. Non ha bisogno di carburante aggiuntivo +se-space-assembling=Un assemblatore modificato spaziale che può lavorare anche nello spazio +se-space-astrometrics-laboratory=Combina, compara e quantifica le differenti sorgenti di informazioni astronomiche +se-space-biochemical-laboratory=Un laboratorio chimico avanzato specializzato in biochimica. Può inoltreeseguire i processi base di chimica e lavorazione degli oli +se-space-catalogue-astronomic=Catalogo di dati astronomici pronti per le analisi e le silmulazioni. Richiesto per ricerche astronomiche avanzate +se-space-catalogue-biological=Catalogo di dati biologici printi per le analisi e le simulazioni. Richiesto per ricerche biologiche avanzate +se-space-catalogue-energy=Catalogo di dati energetici pronti per le analisi e le simulazioni. Richiesto per le ricerche energetiche avanzate +se-space-catalogue-material=Catalogo di dati materiali pronti per le analisi e le simulazioni. Richiesto per le ricerche materiali avanzate +se-space-data-card=Un device per salvare differenti tipi di dati. Richiesto per le richieste più avanzate +se-space-decontamination-facility=Pulisce le sostanze in un ambiente sterile per essere riutilizzate e prepara i liquidi per un uso in condizioni di bassa pressione +se-space-electromagnetics-laboratory=Equipaggiato per applicazioni con intensi campi magnetici e temperature estreme +se-space-genetics-laboratory=Un laboratorio dedicato alla genetica: sequenze genetiche, modifiche genetiche e stampa di culture genetiche +se-space-gravimetrics-laboratory=Analizza e simula disturbi gravitazionali +se-space-growth-facility=Permette la crescita di specie biologiche in un'area determinata e in condizioni controllate, in ambienti dove sarebbe impossibile, tipo in microgravità +se-space-hypercooling=Esegue una dispersione di calore sul termofluido, rendendone uno caldo e uno freddo +se-space-laser-laboratory=Esperimenti con laser. Una protezione agli occhi è suggerita +se-space-lifesupport-facility=Permette la vita in ambienti ostili +se-space-manufactory=Una fabbrica per la produzione di massa nello spazio +se-space-material-fabricator=Sintetizza nuovi materiali. una via di mezzo tra un collisore di particelle e una stampante 3D +se-space-matter-fusion=Lavorazione dei materiali tramite la fusione +se-space-mechanical-laboratory=Fornisce una serie di processi meccanici: Schiacciamento, lavorazione, taglio, vibrazione... +se-space-particle-accelerator=Accelera le particelle alla velocità prossima alla velocità della luce +se-space-particle-collider=Collide particelle ad alta velocità e analizza il risultato +se-space-plasma-generator=Genera una varietà di plasma +se-space-platform-plating=Un rivestimento per le piattaforme spaziali robusto. Liscio e facile per camminate spaziali +se-space-platform-scaffold=Impalcatura base per le piattaforme spaziali. Qualcosa per costruirci sopra ma non molto per camminate spaziali +se-space-radiation-laboratory=Un posto relativamente sicuro per giocare con materiali radioattivi. Può essere usato anche per la lavorazione dell'uranio +se-space-radiator=Irradia via il calore in eccesso dal termofluido sovrascaldato +se-space-rail=Rotaie sicure per lo spazio che non permettono al treno di deragliare via e fluttuare, distruggendo tutto. Può essere usato a terra per questioni estetiche +se-space-recycling-facility=Ricicla oggetti e li lavora per trasformarli in materiale grezzo +se-space-science-lab=Permette la produzione del pacco scientifico missilistico e le più avanzate scienze spaziali +se-space-simulation-ab=Una simulazione più efficace simulando e combinando diverse discipline +se-space-simulation-am=Una simulazione più efficace simulando e combinando diverse discipline +se-space-simulation-as=Una simulazione più efficace simulando e combinando diverse discipline +se-space-simulation-bm=Una simulazione più efficace simulando e combinando diverse discipline +se-space-simulation-sb=Una simulazione più efficace simulando e combinando diverse discipline +se-space-simulation-sm=Una simulazione più efficace simulando e combinando diverse discipline +se-space-simulation-abm=Una simulazione più efficace simulando e combinando diverse discipline +se-space-simulation-asb=Una simulazione più efficace simulando e combinando diverse discipline +se-space-simulation-asm=Una simulazione più efficace simulando e combinando diverse discipline +se-space-simulation-sbm=Una simulazione più efficace simulando e combinando diverse discipline +se-space-simulation-asbm=Una simulazione più efficace simulando e combinando diverse discipline +se-space-solar-panel=Un pannello solare molto efficente per lo spazio +se-space-solar-panel-adv=Un pannello solare avanzato molto efficente per lo spazio +se-space-spectrometry-facility=Spettrometria, gas cromatografia, spettrometria di massa e altri tipi di spettrometria. Spara roba contro il muro e lo deforma, guardando dove ha colpito. +se-space-supercomputer=Permette un'avanzata manipolazione di dati, elaborazione e simulazione +se-space-telescope=Un sofisticato telescopio sensibile a diverse lunghezze d'onda attorno allo spettro visibile +se-space-telescope-gammaray=I raggi gamma non vengono riflessi. Questo potente telescopio usa specchi e speciali ricettori +se-space-telescope-xray=I raggi X vengono bloccati per la maggior parte dall'atmosfera. Questo potente telescopio è stato progettato per lo spazio, dove l'atmosfera non è un problema +se-space-telescope-microwave=Un gigantesco telescopio che rileva microonde e le microonde provenienti dallo spazio profondo +se-space-telescope-radio=Un gigantesco telescopio che rileva anche i più deboli segnali radio distanti dalle sorgenti +se-space-thermodynamics-laboratory=Intraprende processi che involvono temperature estreme. Può inoltre eseguire processi termici di base, come la fusione +se-spaceship=Una nave che costruisci te pezzo per pezzo, con pavimento e muri. Usa poi la console per muoverti tra diversi pianeti e oltre +se-spaceship-integrity=Ogni livello aumenta lo stresso massimo dell'integrità strutturale di 100 +se-factory-spaceship=Ogni livello aumenta lo stresso massimo dell'integrità strutturale di 500 +se-superconductive-cable=Un cavo superconduttivo che non richiede un raffreddamento +se-teleportation=Sblocca latre tecnologie per il teletrasporto. Si scopre che deformare lo spazio in modo sicuro e veramente difficile +se-tesla-gun=Scariche di fulmini veloci. Può colpire fino a 30 nemici per colpo. Colpisce anche nemici a lunga distanza tra di loro +se-thruster-suit=Una tuta spaziale con propulsori jet e stivali. Non andare nello spazio senza +se-thruster-suit-2=Una tuta spaziale migliorata con propulsori jet più potenti, migliorando anche la grandezza dell'inventario e una griglia più grande +se-thruster-suit-3=Una tuta spaziale migliorata con propulsori jet più potenti, migliorando anche la grandezza dell'inventario e una griglia più grande +se-thruster-suit-4=Una tuta spaziale migliorata con propulsori jet più potenti, migliorando anche la grandezza dell'inventario e una griglia più grande +space-science-pack=Permette uno sviluppo più diretto per lo sviluppo di pacchi scientifici missilistici e tecnologie che beneficiano di questi miglioramenti + +[modifier-description] +tesla-shooting-speed-bonus=Velocità di fuoco tesla +tesla-damage-bonus=Bonus danno tesla +railgun-damage-bonus=Bonus danno Railgun +railgun-shooting-speed-bonus=Velocità di fuoco Railgun + +[virtual-signal-name] +se-star=Stella +se-planet=Pianeta +se-planet-orbit=Orbita planetaria +se-moon=Luna +se-moon-orbit=Orbita lunare +se-asteroid-belt=Cintura di asteroidi +se-asteroid-field=Campo di asteroidi +se-anomaly=Anomalia +se-meteor=Meteorite +se-spaceship=Astronave +se-remote-view=Visione remota +se-death=Morte +se-character-corpse=Corpo + +[controls] +se-remote-view=Visione navigazione satellitare +se-respawn=Rinasci + +[shortcut] +se-remote-view=Visione navigazione satellitare +se-respawn=Rinasci + +[shortcut-name] +se-remote-view=Visione navigazione satellitare [__CONTROL__se-remote-view__] +se-respawn=Rinasci [__CONTROL__se-respawn__] + +[tile-name] +se-space-platform-plating=Rivestimento piattaforma spaziale +se-space-platform-scaffold=Impalcatura piattaforma spaziale +se-space-platform-underlay=Spazio +se-space-platform-underlay-l=Spazio +se-space-platform-underlay-r=Spazio +se-space=Spazio vuoto +se-regolith=Regolite +se-asteroid=Asteroide +se-spaceship-floor=Pavimento astronave + +[mod-setting-name] +se-meteor-interval=Intervallo meteoriti +se-plague-max-runtime=Durata massima della piaga +se-planets=Numero di pianeti +se-planet-size=Area dei pianeti (da 1% a 10000%) +se-seed=Seme di generazione dei pianeti +se-skip-experimental-warning=Skip avvertimenti sperimentali +se-print-meteor-info=Stampa allerta meteorite in console +se-space-pipe-capacity=Capacità tubo spaziale +se-electric-boiler=Boiler elettrico + +[mod-setting-description] +se-meteor-interval=È l'intervallo base in minuti tra le piogge di meteoriti. Dopo ogni impatto, i prossimi meteoriti che colpiranno vengono impostati tra un numero random (in minuti) tra 1 e questo valore. +se-plague-max-runtime=Il tempo massimo di durata delle armi biologiche. Dopo che ogni Piaga è stata utilizzata per questo tempo, ogni particella, albero e nemico verrà distrutto. +se-planets=Non cambiare il valore durante la partita. +se-planet-size=Non cambiare il valore durante la partita. +se-seed=Non cambiare il valore durante la partita. +se-skip-experimental-warning=L'avviso di inizio di una nuova partita non apparirà e non verrai avvisato se i messaggi cambieranno. +se-print-meteor-info=Ti abilita a vedere gli avvisi in console dopo che l'avviso principale è scomparso, premendo __CONTROL__toggle-console__ key. +se-space-pipe-capacity=La capacità dei tubi spaziali +se-electric-boiler=Aggiunge un boiler elettrico al gioco + +[autoplace-control-names] +planet-size=Dimensione pianeta +se-water-ice=Acqua ghiacciata (Solo nello spazio, i cursori non hanno effetto) +se-methane-ice=Metano ghiacciato (Solo nello spazio, i cursori non hanno effetto) diff --git a/space-exploration_0.5.58/space-exploration/locale/ja/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/ja/strings.cfg new file mode 100644 index 0000000..d74d42c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/ja/strings.cfg @@ -0,0 +1,967 @@ +spaceship-integrity100=宇宙船の船体強度 +100 +spaceship-integrity300=宇宙船の船体強度 +300 +spaceship-integrity500=宇宙船の船体強度 +500 +core-mining-productivity-5=コアマイニングの生産性 +5% + +[mod-name] +space-exploration=スペース・エクスプローラー + +[mod-description] +space-exploration=貨物ロケットを建設し、宇宙を股にかけた物流網を構築しましょう。ロケットに飛び乗って衛星軌道上に工場を建設し、宇宙データを観測して新たな研究を進めましょう。月、アステロイドベルト、他の惑星や深宇宙を探索しよう。※必ず "Space Exploration Postprocess" をインストールしてください ※AAI Industryを導入してプレイすることをおすすめします。 ※ このmodは現在開発中のため、依存性の無いほかのmodと合わせて遊ぶことはおすすめしません。 + +[space-exploration] +rename-something=__1__ の名称を変更する +trigger-none=トリガーなし (手動) +trigger-fuel-full=燃料満タンで自動打ち上げ +trigger-cargo-full=貨物満載で自動打ち上げ +trigger-fuel-full-signal=燃料満タンでグリーンシグナルのとき自動打ち上げ +trigger-cargo-full-signal=貨物満載でグリーンシグナルのとき自動打ち上げ +trigger-cargo-full-or-signal=グリーンシグナル または 貨物が満載のとき自動打ち上げ +destination-type-zone=おおよその位置 +destination-type-landing-pad=貨物ロケットランディングパッド +button-launch=ロケット打ち上げ +button-launch-disabled=ロケット打ち上げ (無効) +destination-crash-warning=警告: 貨物ロケットが破損する可能性を下げるために貨物ロケットランディングパッドを選択してください +recipe-to=__2__から__1__ +recipe-from=__2__から__1__ +remote-view=惑星探査画面 [__CONTROL__se-remote-view__ キー] +remote-view-instruction=衛星を打ち上げることで新たな星、惑星、小惑星を発見します。 +exit-remote-view=惑星探査画面を閉じる [__CONTROL__se-remote-view__ キー] +remote-view-requires-satellite=惑星探査画面を開くにはまず衛星を打ち上げる必要があります。 +satellite-launched=衛星が展開され天体の観測がはじまりました。[img=virtual-signal/se-remote-view] 惑星探査画面を利用できます。 ( [color=green][__CONTROL__se-remote-view__][/color]キー または ツールバーから表示) +satellite-discovered-platform=衛星が惑星軌道上に宇宙ステーションの痕跡を発見しました +source-discovered-zone=[color=cyan]__1__ が新しい __2__ : [/color][img=__3__] [color=white]__4__[/color] を発見しました +discovered-zone=[color=cyan]__1__が新しい : [img=__2__] [/color][color=white]__3__[/color]を発見しました +space-capsule=宇宙カプセル +player-died=__1__が死亡しました +launch-suit-warning=窒息を防ぐためにスラスタースーツを着用して下さい +suffocating-warning=あなたは窒息しています。宇宙カプセルに帰還するか、スラスタースーツを着用してください。 +rocket_survivability_fail=貨物ロケットは繰り返しの利用で徐々に損耗します。貨物ロケットの安全性に関する研究をお勧めします。 +respawn-if-stranded=移動できなくなった場合リスポーンのショートカット [__CONTROL__se-respawn__] を利用出来ます。 +filter-list=検索 +clear-filter=検索をクリア +zone-tooltip=__1__ __2__ __3__ __4__ __5__ __6__ __7__ +zone-tooltip-type=\nタイプ: __1__ +zone-tooltip-resources=\n主な資源: __1__ +zone-tooltip-lifesigns=\n生命反応: __1__ +zone-tooltip-daynight=\n一日の長さ: __1__ 分 +zone-tooltip-bot-attrition=\nロボネットワークの接続: __1__ +construction-denied=ここに配置することはできません。 +construction-denied-vehicle-in-space=地上車両を宇宙空間に置く事は出来ません。 +construction-denied-se-surface=無効な配置 +currently-viewing=現在の表示:__1__ +no-character-to-board=ターゲットに搭乗できません +starmap=星図(未実装) +back=戻る +spaceship=宇宙船 +plant=惑星 +moon=月 +star=星 +orbit=衛星軌道 +something_orbit=__1__ 衛星軌道 +asteroid-belt=小惑星帯 +asteroid-field=小惑星帯空域 +anomaly=アノマリー  +spaceship-cannot-set-destination-to-self=出発地を目的地にすることはできません。 +spaceship-launch-energy=発射エネルギー: __1__ +spaceship-launch-energy-invalid=発射エネルギー: 宇宙船の有効性チェックが必要です。 +spaceship-speed=スピード:__1__ +spaceship-structural-stress-hull=船体強度への負荷(外壁):__1__ +spaceship-structural-stress-hull-invalid=船体強度への負荷(外壁):無効 (完全に密封してください) +spaceship-structural-stress-container=船体強度への負荷(コンテナ):__1__ +spaceship-structural-stress-container-invalid=船体強度への負荷(コンテナ):無効 (完全に密封してください) +spaceship-travel-time-unknown=所要時間:不明。計測のため最高速度を試してください。 +spaceship-travel-time-max=所要時間:最大速度で__1__秒 +spaceship-travel-time-current=所要時間:現在の速度で__1__秒 +spaceship-closest-location=最も近い場所:__1__ +spaceship-location-spatial-distortion=空間の歪み:__1__ +spaceship-location-stellar-x=X座標:__1__ +spaceship-location-stellar-y=Y座標:__1__ +spaceship-location-star-gravity-well=恒星重力圏: __1__ +spaceship-location-planet-gravity-well=惑星重力圏: __1__ +spaceship-travel-status=航行状況:__1__ +spaceship-integrity-status-valid=宇宙船の有効性チェック:有効:__1__ +spaceship-integrity-status-invalid=宇宙船の有効性チェック:無効:__1__ +spaceship-button-launch=打ち上げ +spaceship-button-launch-tooltip=打ち上げ準備完了 +spaceship-button-launch-disabled=打ち上げ(無効) +spaceship-button-launch-disabled-fuel-tooltip=ブースタータンク内に燃料が必要です +spaceship-button-launch-disabled-integrity-tooltip=宇宙船の有効性チェックが必要です +spaceship-button-anchor=アンカー +spaceship-button-confirm-anchor=アンカーを設置する +spaceship-button-anchor-to=__1__へのアンカー +spaceship-button-anchor-on=__1__上のアンカー +spaceship-button-stop=停止 +spaceship-button-start=遭遇 +spaceship-button-board=__1__に乗り込む +spaceship-button-scouting-back=戻る +spaceship-button-scouting-back-tooltip=アンカー設置をキャンセル +spaceship-name-the=__1__ +spaceship-button-start-integrity-check=宇宙船の有効性チェックを開始 +spaceship-heading-destination=行先 +list-destinations-alphabetically=アルファベット順 +spaceship-travel-message-new-course-plotted=新しいコースを設定しました。 +spaceship-travel-message-exiting-planet-gravity=惑星の重力圏を抜けました。 +spaceship-travel-message-navigating-planet-gravity=惑星の重力圏に侵入。 +spaceship-travel-message-exiting-star-gravity=恒星の重力圏を抜けました。 +spaceship-travel-message-navigating-star-gravity=恒星の重力圏に侵入。 +spaceship-travel-message-spatial-distortions=空間の歪みに侵入。 +spaceship-travel-message-navigating-interstellar=星間空間に到達。 +spaceship-travel-message-at-destination=目的地に到着。 +spaceship-check-message-passed=宇宙船の有効性チェックを完了。 +spaceship-check-message-failed-containment=宇宙船の有効性チェックに失敗。船体の気密性に問題。宇宙船の外壁が隙間なく宇宙船の床の上にあることを確認してください。 +spaceship-check-message-failed-console-floor=コンソールは、宇宙船の床の上に配置する必要があります。 +spaceship-check-message-failed-empty=コンソールへ到達する通路がみつかりません。 +spaceship-check-message-failed-unknown-bounds=エラー:宇宙船の境界が無効です。 +spaceship-check-message-failed-stress=失敗:船体強度への負荷が、技術の限界を超えています。 +spaceship-check-message-checking-console-floor=コンソールフロアの接続性を確認中・・・ +spaceship-check-message-checking-containment=船体の密閉性を確認中・・・ +spaceship-check-message-checking-connectivity=コンソールへの接続を確認中・・・ +spaceship-check-message-no-console=コンソールがありません +spaceship-check-message-did-not-complete=チェックは完了しませんでした +spaceship-check-message-unstable=不安定:操縦時にいくつかのセクションが切断されます。 +spaceship-check-message-valid-but-disconnecting=有効ですが不安定です:いくつかのセクションが切断されます。 +spaceship-warning-sections-disconnecting=セクションが切断されています。修理のため停止します。 + +[damage-type-name] +suffocation=窒息 +meteor=隕石 + +[entity-name] +destroyed-cargo-pod=破壊された貨物ポッド +meteorite=隕石 +rocket-silo=衛星ロケットサイロ +rocket-fragment=ロケットの断片 +se-antimatter-reactor=反物質反応炉 +se-cargo-rocket-cargo-pod=カーゴポッド +se-condenser-turbine=コンデンサータービン +se-condenser-turbine-tank=コンデンサータービン +se-condenser-turbine-generator=コンデンサータービン +se-core-fragment-processor=コアフラグメント・プロセッサ +se-core-miner=コア マイニング ドリル +se-core-miner-drill=コア マイニング ドリル +se-electric-boiler=電気ボイラー +se-fluid-burner-generator=流体等温ジェネレータ +se-fuel-refinery=燃料精製所 +se-meteor-defence-container=隕石防衛施設 +se-meteor-defence-charger=隕石防衛施設 +se-meteor-point-defence-container=定点隕石防衛施設 +se-meteor-point-defence-charger=定点隕石防衛施設 +se-methane-ice=メタンの氷 +se-rocket-launch-pad=貨物ロケットサイロ +se-rocket-launch-pad-tank=貨物ロケットサイロ +se-rocket-launch-pad-silo=貨物ロケットサイロ +se-rocket-launch-pad-combinator=貨物ロケットサイロ +se-rocket-launch-pad-_-seat=貨物ロケットサイロ +se-rocket-launch-pad-settings=貨物ロケットサイロ +se-rocket-landing-pad=ランディングパッド +se-space-accumulator=宇宙空間用蓄電池 +se-space-astrometrics-laboratory=天体研究所 +se-space-biochemical-laboratory=生化学研究室 +se-space-assembling-machine=宇宙空間用組立機 +se-space-capsule-_-vehicle=宇宙カプセル +se-space-curved-rail=空間軌道 +se-space-decontamination-facility=除染施設 +se-space-electromagnetics-laboratory=電磁気学研究所 +se-space-genetics-laboratory=遺伝学研究所 +se-space-growth-facility=微生物育成施設 +se-space-gravimetrics-laboratory=重力波研究所 +se-space-hypercooler=ハイパークーラー +se-space-laser-laboratory=光学研究所 +se-space-lifesupport-facility=生命維持管理施設 +se-space-manufactory=宇宙工場 +se-space-material-fabricator=素材製作所 +se-space-mechanical-laboratory=機械研究室 +se-space-particle-accelerator=粒子加速器 +se-space-particle-collider=粒子衝突型加速器 +se-space-plasma-generator=プラズマ発生器 +se-space-radiation-laboratory=放射線研究室 +se-space-radiator=放熱器 +se-space-recycling-facility=リサイクル施設 +se-space-pipe=宇宙用パイプ +se-space-pipe-to-ground=宇宙用地下パイプ +se-space-science-lab=宇宙科学研究所 +se-space-solar-panel=宇宙用ソーラーパネル +se-space-solar-panel-2=高度な宇宙用ソーラーパネル +se-space-spectrometry-facility=分析施設 +se-space-straight-rail=空間軌道 +se-space-supercomputer-1=スーパーコンピューター +se-space-supercomputer-2=量子スーパーコンピュータ +se-space-supercomputer-3=ニューラルスーパーコンピュータ +se-space-telescope-radio=電波望遠鏡 +se-space-telescope-microwave=マイクロ波望遠鏡 +se-space-telescope=望遠鏡 +se-space-telescope-xray=X線望遠鏡 +se-space-telescope-gammaray=ガンマ線望遠鏡 +se-space-thermodynamics-laboratory=熱力学研究所 +se-space-splitter=宇宙用分配器 +se-space-transport-belt=宇宙用輸送ベルト +se-space-underground-belt=宇宙用地下ベルト +se-spaceship-antimatter-engine=宇宙船の反物質エンジン +se-spaceship-antimatter-booster-tank=宇宙船の反物質ブースタータンク +se-spaceship-console=宇宙船コンソール +se-spaceship-gate=宇宙船のドア +se-spaceship-obstacle=スペースデブリ +se-spaceship-rocket-engine=宇宙船のロケットエンジン +se-spaceship-rocket-booster-tank=宇宙船ロケットブースタータンク +se-spaceship-wall=宇宙船の壁 +se-water-ice=氷 +small-asteroid=小惑星 + +[entity-description] +rocket-silo=宇宙空間に衛星を打ち上げ天体観測を行います。まれに新しい惑星を発見し、少量のロケットサイエンスパックを得ることがあります。 +se-antimatter-reactor=物質と反物質を対消滅させ莫大な熱量を出力します。 +se-condenser-turbine=75%の性能の蒸気タービン。利用した蒸気の99%を水に再利用できます。 +se-core-fragment-processor=コアフラグメントから資源を抽出します。 +se-core-miner=惑星や月から無限に資源を得ることができますが、同じ星に複数稼働している場合資源効率が低下します。50MWを消費します。 +se-core-miner-drill=惑星や月から無限に資源を得ることができますが、同じ星に複数稼働している場合資源効率が低下します。50MWを消費します。 +se-electric-boiler=電気使って水から蒸気を生成します。 +se-fluid-burner-generator=液体の燃料(液体ロケット燃料など)を利用して発電を行います。小さくコンパクトですが大規模な蒸気発電と比べ効率の悪い発電方法です。宇宙用に設計されています。 +se-meteor-defence-container=隕石から星全体を守ることができますが、一度に一つの砲弾しか発射することが出来ません。隕石用砲弾を搭載し、完全に充電する必要があります。命中率80% 発射後再充電する必要があります。再充電には20MWを消費します。 +se-meteor-defence-charger=隕石から星全体を守ることができますが、一度に一つの砲弾しか発射することが出来ません。隕石用砲弾を搭載し、完全に充電する必要があります。命中率80% 発射後再充電する必要があります。再充電には20MWを消費します。 +se-meteor-point-defence-container=隕石から周辺の地表を守ります。一度に最大4つの砲弾します。隕石用砲弾を搭載し、完全に充電する必要があります。射程64 命中率50% 発射後の再充電には時間がかかります。 +se-meteor-point-defence-charger=隕石から周辺の地表を守ります。一度に最大4つの砲弾します。隕石用砲弾を搭載し、完全に充電する必要があります。射程64 命中率50% 発射後の再充電には時間がかかります。 +se-rocket-launch-pad=宇宙に資材を打ち上げることができます。フロントドアの近くで __CONTROL__toggle-driving__ を押すことでプレイヤーが乗り込むこともできます。 +se-rocket-landing-pad=貨物ロケットの積荷の落下地点 +se-space-assembling-machine=宇宙空間で動作するように調整された組立機 +se-space-astrometrics-laboratory=天体情報を組み合わせ、比較し、定量化します。 +se-space-biochemical-laboratory=バイオ化学を専門に扱う高度な化学実験室。また、より多くの基本的な化学および石油処理を行うことができます。 +se-space-capsule-_-vehicle=最も近い惑星表面に乗組員を降下するために使用することができます。 __CONTROL__toggle-driving__を使用してカプセルに乗り込みます。 +se-space-decontamination-facility=無菌環境で使用するための物質を洗浄し、低圧条件下で使用するための液体を用意します。 +se-space-electromagnetics-laboratory=強い磁界と非常に高い電圧を扱うための機器。 +se-space-genetics-laboratory=文化の遺伝子配列決定、遺伝子改変、および遺伝子プリンティングに特化したラボ。 +se-space-gravimetrics-laboratory=重力擾乱を分析し、シミュレートします。 +se-space-growth-facility=微小重力など、他では不可能なさまざまな制御された条件下で生物標本を成長させる施設。 +se-space-hypercooler=冷却材で熱交換行い、一方をより高温に、もう一方をより低温にします。 +se-space-laser-laboratory=レーザーを用いた実験を行っています。防護メガネの着用が義務付けられています。 +se-space-lifesupport-facility=過酷な環境での生存を支えます。 +se-space-manufactory=巨大な組立機、より複雑なレシピを扱えます。宇宙空間(または宇宙船内)のみで動作します。 +se-space-material-fabricator=粒子衝突と3Dプリンターで新たな素材を合成します。 +se-space-mechanical-laboratory=工業的処理を担当:粉砕、引き裂き、せん断、振動など +se-space-particle-accelerator=粒子を亜光速まで加速します +se-space-particle-collider=粒子を亜光速で衝突させ、その結果を分析します +se-space-pipe=パイプの上を歩くことができます。 +se-space-pipe-to-ground=高価であり、限られた範囲、必要な場合にのみ使用されます。パイプの上を歩くことができます。 +se-space-plasma-generator=様々なプラズマを生成します。 +se-space-radiation-laboratory=比較的安全に放射性物質で遊ぶ場所。ウラン処理に使用することができます。 +se-space-radiator=過熱熱流体から余分な熱を放熱します。 +se-space-recycling-facility=スクラップや他の副産物をリサイクルします +se-space-solar-panel=宇宙用の高効率なソーラーパネル +se-space-solar-panel-2=宇宙用の高効率な強化ソーラーパネル +se-space-spectrometry-facility=分光測光、ガスクロマトグラフィー、質量分析、およびその他の分光法。 壁に火をつけ、曲げて、どこに当たったかを確認します。 +se-space-supercomputer-1=データ操作、処理およびシミュレーション。 +se-space-supercomputer-2=量子コンピューティング。改良されたデータの操作、処理およびシミュレーション。 +se-space-supercomputer-3=量子コンピューティングフレームワークと適応ニューラルネット。改良されたデータの操作、処理およびシミュレーションを行います。 +se-space-straight-rail=宇宙用に設計されていますが、地上でも利用することができます。 +se-space-science-lab=高度なサイエンスパックを使うことができます。宇宙に設置する必要があります。 +se-space-telescope=可視スペクトル周辺波長に最適化された望遠鏡。 +se-space-telescope-gammaray=ガンマ線は屈折しづらいため、代わりにミラーや特別な検出器を使用した強力な望遠鏡 +se-space-telescope-xray=X線のほとんどは大気によってブロックされています。この望遠鏡は大気の問題がない宇宙に設置されます。 +se-space-telescope-microwave=マイクロ波を検出し、宇宙背景輻射を観測する望遠鏡。 +se-space-telescope-radio=遠距離からの微弱な電波を検出するための巨大な望遠鏡。 +se-space-thermodynamics-laboratory=超高温状態を含む研究を行っています。また、精錬などの基本的な熱プロセスを実行することができます +se-space-transport-belt=アイテムが無重力で飛んでいかないようになっています。 +se-spaceship-antimatter-engine=反物質ストリームを消滅させます。 宇宙船の隔壁としてカウントされます。 +se-spaceship-antimatter-booster-tank=反物質を保持します。宇宙船の打ち上げに必要です。 +se-spaceship-console=宇宙船を惑星、衛星、軌道、および小惑星帯に移動するために使用します。宇宙船フロア上に置かなければなりません。宇宙船は壁かドアで感m前に密封され隙間のないようにする必要があります。宇宙船の有効性チェックによって問題箇所を発見できます。 +se-spaceship-gate=ドアが開いたときにフォースフィールドは減圧を停止します。宇宙船の隔壁としてカウントされます。 +se-spaceship-rocket-engine=液体ロケット燃料を利用して推進力を得ます。宇宙船の隔壁としてカウントされます。 +se-spaceship-rocket-booster-tank=液体ロケット燃料を保持します。宇宙船の打ち上げに必要です。 +se-spaceship-wall=船の一部と見なされるために宇宙船の床の上に配置する必要があります。宇宙船の隔壁としてカウントされます。斜めの配置は隙間があるとみなされます。 + +[equipment-name] +energy-shield-equipment=エネルギーシールド +energy-shield-mk2-equipment=エネルギーシールドMK2 +energy-shield-mk3-equipment=エネルギーシールドMK3 +energy-shield-mk4-equipment=エネルギーシールドMK4 +energy-shield-mk5-equipment=エネルギーシールドMK5 +energy-shield-mk6-equipment=エネルギーシールドMK6 +se-adaptive-armour-equipment-1=自己修復装甲MK1 +se-adaptive-armour-equipment-2=自己修復装甲MK2 +se-adaptive-armour-equipment-3=自己修復装甲MK3 +se-adaptive-armour-equipment-4=自己修復装甲MK4 +se-adaptive-armour-equipment-5=自己修復装甲MK5 +se-rtg-equipment=ポータブルRTG +se-rtg-equipment-2=ポータブルRTG MK2 + +[equipment-description] +energy-shield-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +energy-shield-mk2-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +energy-shield-mk3-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +energy-shield-mk4-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +energy-shield-mk5-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +energy-shield-mk6-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +se-adaptive-armour-equipment-1=自己修復機能を持つアーマー。ゆっくりと時間をかけてアーマーが回復し続けます。 +se-adaptive-armour-equipment-2=自己修復機能を持つアーマー。ゆっくりと時間をかけてアーマーが回復し続けます。 +se-adaptive-armour-equipment-3=自己修復機能を持つアーマー。ゆっくりと時間をかけてアーマーが回復し続けます。 +se-adaptive-armour-equipment-4=自己修復機能を持つアーマー。ゆっくりと時間をかけてアーマーが回復し続けます。 +se-adaptive-armour-equipment-5=自己修復機能を持つアーマー。ゆっくりと時間をかけてアーマーが回復し続けます。 +se-rtg-equipment=放射性同位元素熱電発電機。放射性崩壊からの熱を電気へ変換する携帯用発電機。燃料の追加無しで何十年も稼働します。 +se-rtg-equipment-2=放射性同位元素熱電発電機。放射性崩壊からの熱を電気へ変換する携帯用発電機。燃料の追加無しで何十年も稼働します。 + +[fluid-name] +se-antimatter-stream=反物質ストリーム +se-bio-sludge=バイオ廃液 +se-contaminated-bio-sludge=汚染バイオ廃液 +se-contaminated-space-water=汚染コズミックウォーター +se-chemical-gel=ケミカルジェル +se-decompressing-steam=圧縮上記 +se-liquid-rocket-fuel=液体ロケット燃料 +se-methane-gas=メタンガス +se-methane-gas-mixed=混合メタンガス +se-nutrient-gel=栄養ジェル +se-neural-gel=ニューラルジェル +se-neural-gel-2=発展ニューラルジェル +se-ion-stream=イオンストリーム +se-plasma-stream=プラズマストリーム +se-particle-stream=粒子ストリーム +se-proton-stream=プロトンストリーム +se-space-coolant=冷却材 25°C +se-space-coolant-hot=冷却材 25°C +se-space-coolant-warm=冷却材 -10°C +se-space-coolant-cold=冷却材 -100°C +se-space-coolant-supercooled=冷却材 -273°C +se-space-water=コズミックウォーター + +[fluid-description] +se-space-water=宇宙施設での利用に適した、凍結しにくい液体 +se-space-coolant=冷却材のデフォルトの温度。 +se-space-coolant-hot=冷却材のデフォルトの温度。 +se-space-coolant-warm=冷却材は、熱ラジエータによって冷却されます。 +se-space-coolant-cold=ハイパークーリング後の冷却材の温度。 +se-space-coolant-supercooled=ハイパークーリングを繰り返した後の冷却材の温度。 + +[item-group-name] +space=宇宙 +spaceship=スペースシップ +bob-fluids=流体 + +[item-name] +core-fragment=コアフラグメント(__1__) +effectivity-module-4=エネルギー効率モジュール4 +effectivity-module-5=エネルギー生産効率モジュール5 +effectivity-module-6=エネルギー生産効率モジュール6 +effectivity-module-7=エネルギー生産効率モジュール7 +effectivity-module-8=エネルギー生産効率モジュール8 +effectivity-module-9=エネルギー生産効率モジュール9 +#ERROR! +productivity-module-4=生産力モジュール4 +productivity-module-5=生産力モジュール5 +productivity-module-6=生産力モジュール6 +productivity-module-7=生産力モジュール7 +productivity-module-8=生産力モジュール8 +productivity-module-9=生産力モジュール9 +rocket-fuel=固体ロケット燃料 +sand=砂 +solid-sand=固めた砂 +washed-sand=砂(洗浄済) +satellite=航法衛星 +se-antimatter-canister=反物質キャニスター +se-astrometric-data=天体座標データ +se-astronomic-catalogue-1=天体カタログ +se-astronomic-catalogue-2=大域天体カタログ +se-astronomic-catalogue-3=総合天体カタログ +se-astronomic-catalogue-4=拡張総合天体カタログ +se-astronomic-insight=天文学的インサイト +se-astronomic-science-pack=天文学サイエンスパック +se-atomic-data=原子データ +se-bio-combustion-data=バイオ燃焼データ +se-bio-combustion-resistance-data=バイオ燃焼性データ +se-bio-spectral-data=バイオスペクトルデータ +se-biochemical-data=生化学的データ +se-bioculture=バイオデータ +se-bioelectrics-data=生体電気データ +se-biological-catalogue-1=生物カタログ +se-biological-catalogue-2=大域生物カタログ +se-biological-catalogue-3=総合生物カタログ +se-biological-catalogue-4=拡張総合生物カタログ +se-biological-insight=生物学的インサイト +se-biological-science-pack=生物科学パック +se-biomechanical-data=生体力学的データ +se-biomechanical-resistance-data=生体力学的抵抗データ +se-boson-data=ボゾンデータ +se-broken-data=壊れたデータカード +se-canister=セキュアキャニスター +se-rocket-launch-pad-silo-dummy-ingredient-item=貨物ロケット +se-rocket-launch-pad-silo-dummy-result-item=貨物ロケット +se-cargo-rocket-cargo-pod=カーゴポッド +se-cargo-rocket-fuel-tank=ロケットの燃料タンク +se-cargo-rocket-section=貨物ロケットセクション +se-cargo-rocket-section-packed=梱包された貨物ロケットセクション +se-cold-thermodynamics-data=コールド熱力学データ +se-comparative-genetic-data=比較遺伝子データ +se-compressive-strength-data=圧縮強度データ +se-conductivity-data=導電率データ +se-contaminated-scrap=汚染されたスクラップ +se-core-fragment-omni=コアフラグメント +se-cryogenics-data=極低温データ +se-dark-energy-data=暗黒エネルギーデータ +se-darkmatter-data=ダークマターのデータ +se-data-storage-substrate-cleaned=ポリッシュデータストレージ基質 +se-data-storage-substrate=ラフデータストレージ基質 +se-decompression-data=減圧データ +se-decompression-resistance-data=減圧抵抗データ +se-deep-space-science-pack=ディープ・スペース・サイエンス・パック +se-electromagnetic-field-data=電磁界データ +se-empty-data=ブランクデータカード +se-empty-lifesupport-canister=空の生命維持管理キャニスター +se-energy-catalogue-1=エネルギーカタログ +se-energy-catalogue-2=幅広いエネルギーカタログ +se-energy-catalogue-3=総合エネルギーカタログ +se-energy-catalogue-4=拡張エネルギーカタログ +se-energy-insight=エナジーインサイト +se-energy-science-pack=エネルギー科学パック +se-entanglement-data=エンタングルメントデータ +se-exotic-fission-data=エキゾチックな核分裂データ +se-exotic-singularity-data=特異データ +se-experimental-biochemical-data=実験生化学的データ +se-experimental-bioculture=実験バイオ文化 +se-experimental-genetic-data=実験遺伝子データ +se-experimental-material-decay-data=実験材料崩壊データ +se-experimental-material-spectral-data=実験材料スペクトルデータ +se-experimental-material=実験材料プロトタイプ +se-experimental-specimen=実験バイオマス +se-experimental-superconductor=超伝導体のプロトタイプ +se-forcefield-data=フォースフィールドのデータ +se-fusion-test-data=核融合試験データ +se-gammaray-detector=ガンマ線検出器 +se-gammaray-observation-data=ガンマ線観測データ +se-gammaray-test-data=ガンマ・レイ・データ +se-genetic-data=遺伝子データ +se-gravity-wave-observation-data=重力波観測データ +se-gravimetric-observation-data=重力観測データ +se-gravimetric-test-data=重量測定試験データ +se-heat-shielding=断熱材 +se-hot-thermodynamics-data=ホット熱力学データ +se-infrared-observation-data=赤外線観測データ +se-ion-spectrometry-data=イオン分析データ +se-junk-data=ジャンクデータカード +se-lepton-data=レプトンデータ +se-lifesupport-canister=生命維持管理キャニスター +se-magnetic-canister=磁気キャニスター +se-magnetic-monopole-data=磁気モノポールのデータ +se-material-decay-data=材料崩壊データ +se-material-science-pack=材料科学パック +se-material-spectral-data=材料スペクトルデータ +se-material-testing-pack=材料試験パック +se-material-catalogue-1=材料カタログ +se-material-catalogue-2=大域素材カタログ +se-material-catalogue-3=総合素材カタログ +se-material-catalogue-4=拡張総合材質カタログ +se-material-insight=材質インサイト +se-medpack=回復キット +se-medpack-2=回復キット 2 +se-medpack-3=回復キット 3 +se-medpack-4=回復キット 4 +se-meteor-defence=隕石防衛施設 +se-meteor-defence-ammo=隕石防衛施設弾薬 +se-meteor-point-defence=定点隕石防衛施設 +se-meteor-point-defence-ammo=定点隕石防衛施設弾薬 +se-methane-ice=メタンの氷 +se-micro-black-hole-data=マイクロブラックホールのデータ +se-microwave-observation-data=マイクロウェーブ観測データ +se-nano-cold-thermodynamics-data=ナノ材料低温熱力学データ +se-nano-compressive-strength-data=ナノ材料圧縮強度データ +se-nano-hot-thermodynamics-data=ナノ材料高温熱力学データ +se-nanomaterial=ナノ材料 +se-nano-tensile-strength-data=ナノ材料引張強度データ +se-negative-pressure-data=ネガティブプレッシャーデータ +se-neural-anomaly-data=神経異常データ +se-nutrient-vat=栄養素データ +se-observation-frame-blank=空白の観測フレーム +se-observation-frame-gammaray=ガンマ線観測フレーム +se-observation-frame-infrared=赤外線観測フレーム +se-observation-frame-microwave=マイクロ波観測フレーム +se-observation-frame-radio=電波観測フレーム +se-observation-frame-uv=UV観測フレーム +se-observation-frame-visible=可視観測フレーム +se-observation-frame-xray=X線観測フレーム +se-plague-bomb=疫病ロケット +se-plasma-canister=プラズマキャニスター +se-plasma-electrodynamics-data=プラズマ電気力学データ +se-plasma-thermodynamics-data=プラズマ熱力学データ +se-polarisation-data=偏光データ +se-pressure-containment-data=圧力封じ込めデータ +se-quantumn-phenomenon-data=量子現象データ +se-quark-data=クォークデータ +se-radiation-data=放射線データ +se-radiation-exposure-data=放射線被ばくデータ +se-radiation-exposure-resistance-data=耐放射線性データ +se-radiation-shielding-data=放射線遮へいデータ +se-radio-observation-data=電波観測データ +se-rtg-equipment=ポータブルRTG +se-rtg-equipment-2=ポータブルRTG MK2 +se-scrap=スクラップ +se-significant-data=重要なデータ +se-significant-specimen=重要なバイオマス +se-space-capsule=宇宙カプセル +se-space-mirror=マルチスペクトルミラー +se-space-platform-plating=宇宙プラットフォームプレート +se-space-platform-scaffold=宇宙プラットフォーム足場 +se-space-rail=空間起動 +se-spaceship-floor=宇宙船の床 +se-specimen=バイオマス +se-subatomic-data=素粒子データ +se-superconductivity-data=超伝導データ +se-superconductor=超伝導体 +se-superconductive-cable=超電導ケーブル +se-tensile-strength-data=引張強度データ +se-tesla-ammo=テスラ銃の弾薬 +se-tesla-gun=テスラ銃 +se-thruster-suit=スラスタースーツ +se-thruster-suit-2=スラスタースーツMK2 +se-thruster-suit-3=スラスタースーツMK3 +se-thruster-suit-4=スラスタースーツMK4 +se-timespace-anomaly-data=時空異常データ +se-used-lifesupport-canister=使用済み生命維持管理キャニスター +se-uv-observation-data=UV観測データ +se-visible-observation-data=可視観測データ +se-water-ice=氷 +se-xray-observation-data=X線観測データ +se-zero-point-energy-data=ゼロ点エネルギーデータ +space-science-pack=ロケット科学パック +speed-module-4=生産速度モジュール4 +speed-module-5=生産速度モジュール5 +speed-module-6=生産速度モジュール6 +speed-module-7=生産速度モジュール7 +speed-module-8=生産速度モジュール8 +speed-module-9=生産速度モジュール9 + +[item-description] +automation-science-pack=研究所で消費されます。 +chemical-science-pack=研究所で消費されます。 +logistic-science-pack=研究所で消費されます。 +military-science-pack=研究所で消費されます。 +production-science-pack=研究所で消費されます。 +satellite=衛星はロケットサイロに入れて使用します。 +se-antimatter-canister=エネルギーを安全に持ち運ぶためのコンテナ +se-astronomic-science-pack=宇宙研究所で消費されます。 +se-biological-science-pack=宇宙研究所で消費されます。 +se-canister=多目的格納容器 +se-cargo-rocket-cargo-pod=貨物ロケットセクションの素材 +se-cargo-rocket-fuel-tank=貨物ロケットセクションの素材 +se-cargo-rocket-section=重要な貨物ロケットの部品。貨物ロケットサイロの中に挿入します。ロケット毎に100個必要です。ロケット着陸地点から20%を回収することができます。 +se-cargo-rocket-section-packed=輸送用に梱包された貨物ロケットセクション。ロケット構築で利用するには展開する必要があります。 +se-deep-space-science-pack=宇宙研究所で消費されます。 +se-energy-science-pack=宇宙研究所で消費されます。 +se-heat-shielding=宇宙研究所で消費されます。 +se-material-science-pack=宇宙研究所で消費されます。 +se-medpack=自分自身を回復します。 +se-medpack-2=自分自身を回復します。 +se-medpack-3=自分自身を回復します。 +se-medpack-4=自分自身を回復します。 +se-meteor-defence=隕石から星全体を守ることができますが、一度に一つの砲弾しか発射することが出来ません。隕石用砲弾を搭載し、完全に充電する必要があります。命中率80% 発射後再充電する必要があります。再充電には20MWを消費します。 +se-meteor-defence-ammo=隕石を破壊します。隕石防衛施設で利用します。 +se-meteor-point-defence=隕石から周辺の地表を守ります。一度に最大4つの砲弾します。隕石用砲弾を搭載し、完全に充電する必要があります。射程64 命中率50% 発射後の再充電には時間がかかります。 +se-meteor-point-defence-container=隕石を破壊します。定点隕石防衛施設で利用します。 +se-rocket-launch-pad-silo-dummy-ingredient-item=貨物ロケットセクション100個とスペースカプセル1個を貨物ロケットサイロに入れることで作られます。 +se-rtg-equipment=放射性同位元素熱電発電機。放射性崩壊からの熱を電気へ変換する携帯用発電機。燃料の追加無しで何十年も稼働します。 +se-rtg-equipment-2=放射性同位元素熱電発電機。放射性崩壊からの熱を電気へ変換する携帯用発電機。燃料の追加無しで何十年も稼働します。 +se-plague-bomb=惑星からのすべての生命を消すことができます。細心の注意を払って取り扱ってください。 (すべてが死ぬまで、ゲームのパフォーマンスが激しく低下する可能性があり、大きな惑星やマルチプレイヤーにはお勧めできません。) +se-space-capsule=貨物ロケットを制御するために必要なスペースカプセル。最も近い惑星の表面に乗客を降下するために使用することができます。 [__CONTROL__toggle-driving__ ]を入力してカプセルに乗り込みます。 +se-space-platform-plating=宇宙プラットフォーム上での高速移動を可能にする足場 +se-space-platform-scaffold=宇宙空間で構造物の基礎となる足場 +se-space-rail=宇宙空間での利用に適した線路。列車が宇宙の彼方に飛んでいかないようになっています。 +se-spaceship-floor=この床は、宇宙船の隔壁と、宇宙船のすべての部品の下に置かれなければなりません。床の隙間は宇宙船の気密性を損ない、宇宙船の整合性チェックに失敗します。 +se-superconductive-cable=能動的な冷却を必要としない超伝導複合ケーブル。 +se-tesla-gun=速射可能なチェーンライトニング。 +se-thruster-suit=宇宙で生き残るために必要とされる宇宙服。 \nスラスターとマグネットブーツを搭載しています。 +se-thruster-suit-2=宇宙で生き残るために必要とされる宇宙服。 \n強力なスラスターとインベントリ、装備グリッドを持っています。 +se-thruster-suit-3=宇宙で生き残るために必要とされる宇宙服。 \n強力なスラスターとインベントリ、装備グリッドを持っています。 +se-thruster-suit-4=宇宙で生き残るために必要とされる宇宙服。 \n強力なスラスターとインベントリ、装備グリッドを持っています。 +space-science-pack=宇宙研究所で消費されます。 +utility-science-pack=研究所で消費されます。 + +[recipe-name] +core-fragment=コアフラグメント処理(__1__) +rocket-fuel=固体ロケット燃料 +se-astrometric-analysis-multispectral-1=マルチスペクトル天体座標分析1 +se-astrometric-analysis-multispectral-2=マルチスペクトル天体座標分析2 +se-astrometric-analysis-multispectral-3=マルチスペクトル天体座標分析3 +se-astronomic-insight-1=天文インサイト +se-astronomic-insight-2=大域天文インサイト +se-astronomic-insight-3=総合天文インサイト +se-astronomic-insight-4=拡張総合天文インサイト +se-biological-insight-1=生物学的インサイト +se-biological-insight-2=大域生物学的インサイト +se-biological-insight-3=総合生物学的インサイト +se-biological-insight-4=拡張総合生物学的インサイト +se-bio-methane-to-crude-oil=バイオ処理によるメタンの原油化 +se-bio-sludge-crude-oil=実験バイオマスからのバイオ廃液 +se-bio-sludge-decontamination=バイオ廃液の除染 +se-bio-sludge-from-fish=魚からバイオ廃液 +se-bio-sludge-from-wood=木からバイオ廃液 +se-bio-sludge=バイオマスからのバイオ廃液 +se-broken-data-scrapping=壊れたデータカードのリサイクル +se-cargo-rocket-section-pack=貨物ロケットセクションの梱包 +se-cargo-rocket-section-unpack=貨物ロケットセクションの開封 +se-condenser-turbine-reclaim-water=水の再利用と発電 +se-core-fragment-omni=コアフラグメント処理 +se-core-mining=コアマイニング +se-empty-antimatter-canister=キャニスターから反物質ストリームを取り出す +se-empty-barrel-scrapping=空のドラム缶のリサイクル +se-empty-barrel-reprocessing=空のドラム缶のリサイクル +se-space-capsule-scrapping=宇宙カプセルのリサイクル +se-cargo-pod-scrapping=カーゴポッドのリサイクル +se-energy-insight-1=エネルギーインサイト +se-energy-insight-2=大域エネルギーインサイト +se-energy-insight-3=総合エネルギーインサイト +se-energy-insight-4=拡張総合エネルギーインサイト +se-formatting-1=データフォーマット +se-formatting-2=効率的なデータフォーマット +se-formatting-3=高度なデータフォーマット +se-material-insight-1=材質インサイト +se-material-insight-2=大域材質インサイト +se-material-insight-3=総合材質インサイト +se-material-insight-4=拡張総合材質インサイト +se-matter-fusion-copper=マター変換 (銅) +se-matter-fusion-dirty=マター変換 (スクラップ) +se-matter-fusion-iron=マター変換 (鉄) +se-matter-fusion-stone=マター変換 (銅) +se-matter-fusion-uranium=マター変換 (銅) +se-plasma-canister-empty=空のプラズマキャニスター +se-radiating-space-coolant-normal=冷却材を-10℃に冷却(低温) +se-radiating-space-coolant-slow=冷却材を-10℃にゆるやかに冷却(低温) +se-radiating-space-coolant-veryslow=冷却材を-10℃に非常にゆるやかに冷却(低温) +se-mixed-methane-gas-separation=混合メタンガスの分離 +se-rocket-fuel-from-water-copper=水からロケット燃料を作成 +se-scrap-decontamination=スクラップ汚染除去 +se-scrap-recycling=スクラップのリサイクル +se-space-coolant-cold=冷却材を-100℃に冷却(低温) +se-space-coolant-supercooled=冷却材を-273℃に冷却(超低温) +se-simulation-a=天文シミュレーション +se-simulation-ab=パンスペルミア説シミュレーション +se-simulation-abm=異星進化シミュレーション +se-simulation-am=マター分布シミュレーション +se-simulation-as=宇宙粒子シミュレーション +se-simulation-asb=宇宙生物工学シミュレーション +se-simulation-asbm=大域宇宙シミュレーション +se-simulation-asm=天体物理学シミュレーション +se-simulation-b=生体シミュレーション +se-simulation-bm=生体力学シミュレーション +se-simulation-m=マテリアルシミュレーション +se-simulation-s=エネルギーシミュレーション +se-simulation-sb=生化学シミュレーション +se-simulation-sbm=ナノマシンシミュレーション +se-simulation-sm=ナノ材料シミュレーション +se-space-water-decontamination=コズミックウォーターの汚染除去 +se-spaceship-rocket-engine-burn=液体ロケット燃料の燃焼処理 +se-specimen-fish=微重力下の魚の生育 +se-specimen-wood=微重力下の木の生育 +se-thermodynamics-coal=石炭の高圧処理 +se-used-lifesupport-canister-cleaning=生命維持管理キャニスターの清掃 + +[recipe-description] +se-astronomic-insight-2=より複雑だが効率的な処理 +se-astronomic-insight-3=より複雑だが効率的な処理 +se-astronomic-insight-4=より複雑だが効率的な処理 +se-biological-insight-2=より複雑だが効率的な処理 +se-biological-insight-3=より複雑だが効率的な処理 +se-biological-insight-4=より複雑だが効率的な処理 +se-core-mining=採掘されるフラグメントの種類は惑星に依存します。採掘速度は、惑星上にあるコアマイングの数によって異なります。 +se-energy-insight-2=より複雑だが効率的な処理 +se-energy-insight-3=より複雑だが効率的な処理 +se-energy-insight-4=より複雑だが効率的な処理 +se-material-insight-2=より複雑だが効率的な処理 +se-material-insight-3=より複雑だが効率的な処理 +se-material-insight-4=より複雑だが効率的な処理 +se-radiating-space-coolant-normal=加熱、冷却を繰り返すと冷却材が劣化します。 +se-radiating-space-coolant-slow=加熱、冷却を繰り返すと冷却材が劣化します。ゆるやかな冷却により劣化を抑えます。 +se-radiating-space-coolant-veryslow=加熱、冷却を繰り返すと冷却材が劣化します。ゆるやかな冷却により劣化を抑えます。 + +[technology-name] +effectivity-module-4=エネルギー効率モジュール4 +effectivity-module-5=エネルギー効率モジュール5 +effectivity-module-6=エネルギー効率モジュール6 +effectivity-module-7=エネルギー効率モジュール7 +effectivity-module-8=エネルギー効率モジュール8 +effectivity-module-9=エネルギー効率モジュール9 +energy-shield-equipment=エネルギーシールド +energy-shield-mk2-equipment=エネルギーシールドMK2 +energy-shield-mk3-equipment=エネルギーシールドMK3 +energy-shield-mk4-equipment=エネルギーシールドMK4 +energy-shield-mk5-equipment=エネルギーシールドMK5 +energy-shield-mk6-equipment=エネルギーシールドMK6 +sand-processing=砂処理 +glass-processing=ガラス加工 +liquid-rocket-fuel=液体ロケット燃料 +productivity-module-4=生産効率モジュール4 +productivity-module-5=生産効率モジュール5 +productivity-module-6=生産効率モジュール6 +productivity-module-7=生産効率モジュール7 +productivity-module-8=生産効率モジュール8 +productivity-module-9=生産効率モジュール9 +rocket-silo=衛星ロケットサイロ +rocketry=戦闘ロケット +se-adaptive-armour=自己修復装甲 +se-antimatter-engine=反物質エンジン +se-antimatter-reactor=反物質反応炉 +se-antimatter-production=反物質生産 +se-astronomic-science-pack=天文科学パック +se-biological-science-pack=生物科学パック +se-condenser-turbine=コンデンサータービン +se-core-miner=コアマイニング +se-deep-space-science-pack=ディープ・スペース・サイエンス・パック +se-electric-boiler=電気ボイラー +se-energy-science-pack=エネルギー科学パック +se-fluid-burner-generator=流体等温ジェネレータ +se-fuel-refining=燃料精製 +se-heat-shielding=断熱材 +se-material-science-pack=材料科学パック +se-medpack=回復キット +se-medpack-2=回復キット 2 +se-medpack-3=回復キット 3 +se-medpack-4=回復キット 4 +se-meteor-defence=隕石防衛施設 +se-meteor-point-defence=定点隕石防衛施設 +se-plague=疫病 +se-railgun=レールガン +se-rocket-cargo-safety=ロケット貨物の安全性 +se-rocket-fuel-from-water=水からロケット燃料を作成 +se-rocket-launch-pad=貨物ロケットサイロ +se-rocket-landing-pad=ロケットランディングパッド +se-rocket-reusability=ロケットの再利用 +se-rocket-survivability=ロケットサバイバビリティ +se-rtg-equipment=ポータブルRTG +se-rtg-equipment-2=ポータブルRTG MK2 +se-space-assembling=宇宙組み立て +se-space-accumulator=宇宙空間用蓄電池 +se-space-astrometrics-laboratory=天体研究所 +se-space-biochemical-laboratory=生化学研究室 +se-space-catalogue-astronomic=天体カタログ +se-space-catalogue-biological=生物カタログ +se-space-catalogue-energy=エネルギーカタログ +se-space-catalogue-material=材料カタログ +se-space-data-card=データカード +se-space-decontamination-facility=除染施設 +se-space-electromagnetics-laboratory=電磁気学の実験室 +se-space-genetics-laboratory=遺伝学研究所 +se-space-gravimetrics-laboratory=重力波研究所 +se-space-growth-facility=微生物育成施設 +se-space-hypercooling=冷却 +se-space-laser-laboratory=光学研究所 +se-space-lifesupport-facility=生命維持管理施設 +se-space-manufactory=宇宙工場 +se-space-material-fabricator=素材製作所 +se-space-matter-fusion=マター変換 +se-space-mechanical-laboratory=機械研究室 +se-space-particle-accelerator=粒子加速器 +se-space-particle-collider=粒子衝突型加速器 +se-space-plasma-generator=プラズマ発生器 +se-space-platform-plating=宇宙プラットフォームプレート +se-space-platform-scaffold=宇宙プラットフォーム足場 +se-space-radiation-laboratory=放射線研究室 +se-space-radiator=放熱器 +se-space-rail=銀河鉄道 +se-space-recycling-facility=リサイクル施設 +se-space-science-lab=宇宙科学研究所 +se-space-simulation-ab=パンスペルミア説シミュレーション +se-space-simulation-am=宇宙材料工学シミュレーション +se-space-simulation-as=宇宙粒子シミュレーション +se-space-simulation-bm=生体力学シミュレーション +se-space-simulation-sb=生化学シミュレーション +se-space-simulation-sm=ナノ材料シミュレーション +se-space-simulation-abm=異星進化シミュレーション +se-space-simulation-asb=宇宙生物工学シミュレーション +se-space-simulation-asm=天体物理学シミュレーション +se-space-simulation-sbm=ナノマシンシミュレーション +se-space-simulation-asbm=大域宇宙シミュレーション +se-space-solar-panel=宇宙用ソーラーパネル +se-space-solar-panel-adv=高度な宇宙用ソーラーパネル +se-space-spectrometry-facility=分析施設 +se-space-supercomputer=スーパーコンピューター +se-space-telescope=望遠鏡 +se-space-telescope-gammaray=ガンマ線望遠鏡 +se-space-telescope-xray=X線望遠鏡 +se-space-telescope-microwave=マイクロ波望遠鏡 +se-space-telescope-radio=電波望遠鏡 +se-space-thermodynamics-laboratory=熱力学研究所 +se-spaceship=宇宙船 +se-spaceship-integrity=宇宙船の構造強化 +se-factory-spaceship=宇宙船工業 +se-superconductive-cable=超電導ケーブル +se-teleportation=テレポーテーション +se-tesla-gun=テスラ銃 +se-thruster-suit=スラスタースーツ +space-science-pack=ロケット科学パック +speed-module-4=生産速度モジュール4 +speed-module-5=生産速度モジュール5 +speed-module-6=生産速度モジュール6 +speed-module-7=生産速度モジュール7 +speed-module-8=生産速度モジュール8 +speed-module-9=生産速度モジュール9 + +[technology-description] +energy-shield-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +energy-shield-mk2-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +energy-shield-mk3-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +energy-shield-mk4-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +energy-shield-mk5-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +energy-shield-mk6-equipment=保護バブルを形成します。高速にチャージされますが覆うのエネルギーを必要とします。 +sand-processing=粉砕、引き裂き、せん断、振動など +glass-processing=砂を融解してガラスを作成 +rocket-silo=衛生を軌道上に打ち上げることで、ロケットサイエンスパックを入手したり新しい惑星を発見することができます。 +se-adaptive-armour=自己修復のためにエネルギーを消費するアーマー。エネルギーシールド同様の効果ですが、より低電力で、遅い再生速度です。 +se-antimatter-engine=反物質の対消滅を利用して莫大な推進力を得ます。 +se-antimatter-reactor=反物質の対消滅を利用して巨大な熱量を得ます。 +se-antimatter-production=反物質を生成します。 +se-astronomic-science-pack=宇宙旅行や星間物流に関連する技術の研究を可能にします。 +se-biological-science-pack=フィジカル能力の向上、生物兵器、および神経処理の改善に関連する技術の研究ができます。 +se-condenser-turbine=75%の性能の蒸気タービン。利用した蒸気の99%を水に再利用できます。 +se-core-miner=惑星や月から無限に資源を得ることができますが、同じ星に複数稼働している場合資源効率が低下します。 +se-deep-space-science-pack=最も深淵な技術を研究できます。 +se-electric-boiler=電気使って水から蒸気を生成します。 +se-energy-science-pack=素粒子の基本相互作用の研究、および素粒子の発見を可能にします +se-fluid-burner-generator=液体の燃料(液体ロケット燃料など)を利用して発電を行います。小さくコンパクトですが大規模な蒸気発電と比べ効率の悪い発電方法です。宇宙用に設計されています。 +se-fuel-refining=より高度な燃料精製を可能にします。 +se-heat-shielding=宇宙研究所で消費されます。 +se-material-science-pack=より高度な工学技術のための先進材料に関する研究を可能にします。 +se-medpack=プレイヤーの体力を回復します +se-medpack-2=プレイヤーの体力を回復します +se-medpack-3=プレイヤーの体力を回復します +se-medpack-4=プレイヤーの体力を回復します +se-meteor-defence=隕石が地表に落ちる前に撃ち落とします。隕石防衛施設は隕石から星全体を守ることができますが、一度に一つの砲弾しか発射することが出来ません。 +se-meteor-point-defence=隕石が地表に落ちる前に撃ち落とします。隕石から周辺の地表を守ります。一度に最大4つの砲弾します。隕石用砲弾を搭載し、完全に充電する必要があります。 +se-railgun=電磁気により加速された弾丸はプラズマの痕跡を残す程の速度に至ります。高いダメージを与えますが、連射速度の遅い武器です。 +se-plague=惑星全体から全ての生命を根絶する素晴らしい機械。取り扱いには細心の注意を払いましょう。 +se-rocket-cargo-safety=貨物ポッドが輸送中にダメージを受ける可能性を10%(累積)低減します。 +se-rocket-fuel-from-water=水の電気分解により水素-酸素ロケット燃料を生成します。 +se-rocket-landing-pad=貨物ロケットを指定したランディングパッドに自動的に着陸できるようになります。研究をすすめることで一部のロケット部品を回収することができます。 +se-rocket-launch-pad=プレイヤーを宇宙に運びます。また、他の惑星へ貨物の輸送に利用することができます。 +se-rocket-reusability=ランディングパッドから回収できる部分を4%増やします(初期値20% 最大100%) +se-rocket-survivability=ロケットが輸送中に破損する可能性、および、ランディングパッドへの着陸に失敗する可能性を10%低減します(累積) +se-rtg-equipment=放射性同位元素熱電発電機。放射性崩壊からの熱を電気へ変換する携帯用発電機。燃料の追加無しで何十年も稼働します。 +se-rtg-equipment-2=放射性同位元素熱電発電機。放射性崩壊からの熱を電気へ変換する携帯用発電機。燃料の追加無しで何十年も稼働します。 +se-space-assembling=宇宙空間で動作するように調整された組立機 +se-space-astrometrics-laboratory=天体情報を組み合わせ、比較し、定量化します。 +se-space-biochemical-laboratory=バイオ化学を専門に扱う高度な化学実験室。また、より多くの基本的な化学および石油処理を行うことができます。 +se-space-catalogue-astronomic=分析と研究のために構造化された天体データのセット。天文学研究のために必要です。 +se-space-catalogue-biological=分析と研究のために構造化された生体データのセット。生物学研究のために必要です。 +se-space-catalogue-energy=分析と研究のために構造化されたエネルギーデータのセット。エネルギー研究のために必要です。 +se-space-catalogue-material=分析と研究のために構造化された材料データのセット。材料学研究のために必要です。 +se-space-data-card=多目的データ記憶装置。より高度なデータドリブンの研究に必要です。 +se-space-decontamination-facility=無菌環境で使用するための物質を洗浄し、低圧条件下で使用するための液体を用意します。 +se-space-electromagnetics-laboratory=強い磁界と非常に高い電圧を扱うための機器。 +se-space-genetics-laboratory=文化の遺伝子配列決定、遺伝子改変、および遺伝子プリンティングに特化したラボ。 +se-space-gravimetrics-laboratory=重力擾乱を分析し、シミュレートします。 +se-space-growth-facility=微小重力など、他では不可能なさまざまな制御された条件下で生物標本を成長させる施設。 +se-space-hypercooling=冷却材で熱交換行い、一方をより高温に、もう一方をより低温にします。 +se-space-laser-laboratory=レーザーを用いた実験を行っています。防護メガネの着用が義務付けられています。 +se-space-lifesupport-facility=過酷な環境での生存を支えます。 +se-space-manufactory=宇宙での大量生産に必要な研究。 +se-space-material-fabricator=粒子衝突と3Dプリンターで新たな素材を合成します。 +se-space-matter-fusion=マターを融合して素材に変換します。 +se-space-mechanical-laboratory=工業的処理を担当:粉砕、引き裂き、せん断、振動など +se-space-particle-accelerator=粒子を亜光速まで加速します +se-space-particle-collider=粒子を亜光速で衝突させ、その結果を分析します +se-space-plasma-generator=様々なプラズマを生成します。 +se-space-platform-plating=堅牢な宇宙プラットフォームメッキ。 高速に移動することができます。 +se-space-platform-scaffold=基本的な宇宙での足場となる構造物。上に施設を建築することができますが、移動に最適な形ではありません。 +se-space-radiation-laboratory=比較的安全に放射性物質で遊ぶ場所。ウラン処理に使用することができます。 +se-space-radiator=過熱熱流体から余分な熱を放熱します。 +se-space-rail=宇宙空間での利用に適した線路。列車が宇宙の彼方に飛んでいかないようになっています。 +se-space-recycling-facility=スクラップを原材料に再処理。 +se-space-science-lab=ロケット科学パックと、より高度な宇宙科学の処理を可能にします。 +se-space-simulation-ab=複数の分野を組み合わせることで、より効率的なシミュレーションを行います。 +se-space-simulation-am=複数の分野を組み合わせることで、より効率的なシミュレーションを行います。 +se-space-simulation-as=複数の分野を組み合わせることで、より効率的なシミュレーションを行います。 +se-space-simulation-bm=複数の分野を組み合わせることで、より効率的なシミュレーションを行います。 +se-space-simulation-sb=複数の分野を組み合わせることで、より効率的なシミュレーションを行います。 +se-space-simulation-sm=複数の分野を組み合わせることで、より効率的なシミュレーションを行います。 +se-space-simulation-abm=複数の分野を組み合わせることで、より効率的なシミュレーションを行います。 +se-space-simulation-asb=複数の分野を組み合わせることで、より効率的なシミュレーションを行います。 +se-space-simulation-asm=複数の分野を組み合わせることで、より効率的なシミュレーションを行います。 +se-space-simulation-sbm=複数の分野を組み合わせることで、より効率的なシミュレーションを行います。 +se-space-simulation-asbm=複数の分野を組み合わせることで、より効率的なシミュレーションを行います。 +se-space-solar-panel=宇宙用の高効率なソーラーパネル +se-space-solar-panel-adv=宇宙用の高効率な強化ソーラーパネル +se-space-spectrometry-facility=分光測光、ガスクロマトグラフィー、質量分析、およびその他の分光法。 壁に火をつけ、曲げて、どこに当たったかを確認します。 +se-space-supercomputer=より高度なデータ操作や処理、およびシミュレーションを可能にします。 +se-space-telescope=可視スペクトル周辺波長に最適化された望遠鏡。 +se-space-telescope-gammaray=ガンマ線は屈折しづらいため、代わりにミラーや特別な検出器を使用した強力な望遠鏡 +se-space-telescope-xray=X線のほとんどは大気によってブロックされています。この望遠鏡は大気の問題がない宇宙に設置されます。 +se-space-telescope-microwave=マイクロ波を検出し、宇宙背景輻射を観測する望遠鏡。 +se-space-telescope-radio=遠距離からの微弱な電波を検出するための巨大な望遠鏡。 +se-space-thermodynamics-laboratory=超高温状態を含む研究を行っています。また、精錬などの基本的な熱プロセスを実行することができます +se-spaceship=壁や床を1つずつ構築して密封し、中にコンソールを置くことで、他の星に行くための宇宙船を建造できます。 +se-spaceship-integrity=各レベルごとに宇宙船の船体強度を +100 ずつ増加させます。 +se-factory-spaceship=各レベルごとに宇宙船の船体強度を +500 ずつ増加させます。 +se-superconductive-cable=能動的な冷却を必要としない超伝導複合ケーブル。 +se-teleportation=他のテレポーテーション技術のロックを解除します。 安全に宇宙をゆがめることは難しいことがわかります。 +se-tesla-gun=高速なチェーンライトニング。一撃で30体の敵を攻撃することができます。なんのターゲットも存在しない場合には、地面にそって短いジャンプを繰り返します。 +se-thruster-suit=スラスターと磁力靴と宇宙服。これなしで宇宙に行ってはいけません。 +se-thruster-suit-2=強力なスラスターを有する改良された宇宙服。大きな装備グリッドとインベントリサイズを持ちます。 +se-thruster-suit-3=強力なスラスターを有する改良された宇宙服。大きな装備グリッドとインベントリサイズを持ちます。 +se-thruster-suit-4=強力なスラスターを有する改良された宇宙服。大きな装備グリッドとインベントリサイズを持ちます。 +space-science-pack=ロケット科学パックと技術のより直接的な開発を可能にします。 + +[modifier-description] +tesla-shooting-speed-bonus=ライトニングボルトの発射速度 +tesla-damage-bonus=ライトニングボルトのダメージボーナス +railgun-damage-bonus=レールガンのダメージボーナス +railgun-shooting-speed-bonus=レールガンの発射速度 + +[virtual-signal-name] +se-star=星 +se-planet=惑星 +se-planet-orbit=惑星の軌道上 +se-moon=月 +se-moon-orbit=月軌道上 +se-asteroid-belt=小惑星帯 +se-asteroid-field=小惑星帯空域 +se-anomaly=アノマリー  +se-meteor=隕石 +se-spaceship=宇宙船 +se-remote-view=リモートビュー +se-death=死亡 +se-character-corpse=死体 + +[controls] +se-remote-view=惑星探査画面 +se-respawn=リスポーン + +[shortcut] +se-remote-view=惑星探査画面 +se-respawn=リスポーン + +[shortcut-name] +se-remote-view=惑星探査画面 [__CONTROL__se-remote-view__] +se-respawn=リスポーン [__CONTROL__se-respawn__] + +[tile-name] +se-space-platform-plating=宇宙プラットフォームプレート +se-space-platform-scaffold=宇宙プラットフォーム足場 +se-space-platform-underlay=宇宙 +se-space-platform-underlay-l=宇宙 +se-space-platform-underlay-r=宇宙 +se-space=空きスペース +se-regolith=レゴリス +se-asteroid=小惑星 +se-spaceship-floor=宇宙船の床 + +[mod-setting-name] +se-meteor-interval=隕石の間隔 +se-plague-max-runtime=疫病効果時間 +se-planets=惑星の数 +se-planet-size=惑星の大きさ(1% から 10000%まで) +se-seed=惑星のシード値 +se-skip-experimental-warning=実験的な警告をスキップ +se-print-meteor-info=コンソールへの隕石アラートを表示。 +se-space-pipe-capacity=宇宙パイプ容量 +se-electric-boiler=電気ボイラー + +[mod-setting-description] +se-meteor-interval=隕石落下の間隔。各隕石落下の次の落下までの時間が、1(分)からこの値の間のランダムな時間で発生するように設定されています。 +se-plague-max-runtime=疫病の最大効果時間(分)。この時間の間、疫病は全ての生物と木を破壊していきます。 +se-planets=キャンペーンを通じて途中を変更しないでください。 +se-planet-size=キャンペーンを通じて途中を変更しないでください。 +se-seed=キャンペーンを通じて途中を変更しないでください。 +se-skip-experimental-warning=新しいゲームを始める時の警告が表示されず、メッセージが変更された場合、あなたは警告が更新されません。 +se-print-meteor-info=コンソールにアラートが表示されます。表示が消えた後も[ __CONTROL__toggle-console__]キーでアラートを確認することができます。 +se-space-pipe-capacity=スペースパイプ用の流体の容量。 +se-electric-boiler=ゲームへの電気ボイラーを追加 + +[autoplace-control-names] +planet-size=惑星の大きさ +se-water-ice=氷(宇宙のみ、スライダは何の効果もありません) +se-methane-ice=メタンの氷(宇宙のみ、スライダは何の効果もありません) diff --git a/space-exploration_0.5.58/space-exploration/locale/ko/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/ko/strings.cfg new file mode 100644 index 0000000..b275d8d --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/ko/strings.cfg @@ -0,0 +1,2111 @@ +spaceship-integrity100=우주선 선체 강도 +100 +spaceship-integrity300=우주선 선체 강도 +300 +spaceship-integrity500=우주선 선체 강도 +500 +arcosphere-discovery=깊은 성간 우주에서 아코스피어를 수집합니다. +core-mining-productivity-5=심층 채굴 생산성 +5% +se-zone-discovery-random=연구되면 무작위 구역을 탐색합니다. +se-zone-discovery-targeted=연구되면 목표 자원의 구역을 탐색합니다. +se-zone-discovery-deep=연구되면 심우주 구역을 탐색합니다. +unlock-spaceship-victory=우주선 승리 조건이 잠금 해제됩니다. 3000 이상의 구조 강도를 지닌 우주선으로 성간 우주에서 250의 속도로, 넥서스를 왜곡 드라이버 모드 상태로 60초 이상 진행하세요. + +[mod-name] +space-exploration=우주 탐사(Space Exploration) + +[mod-description] +space-exploration=화물 로켓을 만들어 우주를 향해 물건을 발사하세요. 그리고 직접 로켓에 탑승해 우주로 나아가 우주 유영하고, 복잡한 데이터 기반 우주 과학을 개발하기 위해 궤도 상에 우주 플랫폼을 구축하세요. 우주선 타일로 우주선을 만들고 행성 표면에서 다른 행성이나 위성, 소행성대로 날아가세요. AAI Industry 모드와 함께 플레이하는 것을 강하게 권장합니다. 실행에 Space Exploration Postprocess 모드가 추가로 필요합니다 (자동으로 설치되지 않습니다. 자세히 설명하기엔 너무 복잡한 문제). 실험 단계이므로 필수 및 권장 모드 외의 모드를 설치하여 플레이하는 것을 권하지 않습니다.\n\n번역: XMKTP (신대현, PolarZero) + +[space-exploration] +space-exploration=우주 탐사 +menu_space-exploration=우주 탐사 +title_space-exploration=우주 탐사 +off=꺼짐 +on=켜짐 +close=닫기 +show=보기 +wdc_auto_off=수동 조준 +wdc_auto_on=자동 조준 +name=이름 +rename-something=__1__ 이름 변경 +trigger-none=없음 (수동 발사) +trigger-fuel-full=연료 최대 충전 시 발사 +trigger-cargo-full=화물 최대 적재 시 발사 +trigger-fuel-full-signal=연료 최대 충전 시 녹색 신호에 발사 +trigger-cargo-full-signal=화물 최대 적재 시 녹색 신호에 발사 +trigger-cargo-full-or-signal=화물 최대 적재 혹은 녹색 신호에 발사 +destination-type-zone=대략적 지점 +destination-type-landing-pad=화물 착륙 패드 +button-launch=발사 +button-launch-disabled=발사 (비활성화됨) +destination-crash-warning=경고: 충돌 확률을 줄이려면 화물 착륙 패드를 사용하세요. +recipe-to=__1__ 에서 __2__ +recipe-from=__2__로부터 __1__ +simple-a-b=__1____2__ +simple-a-b-space=__1__ __2__ +simple-a-b-comma=__1__, __2__ +simple-a-b-break=__1__\n__2__ +interstellar-map=성간 지도 +interstellar-space=성간 우주 +planetary-system=__1__ 성계 +remote-view=항법 위성 연결 [__CONTROL__se-remote-view__] +remote-view-window-title=[img=virtual-signal/se-remote-view] 항법 위성 [__CONTROL__se-remote-view__] +remote-view-currently-viewing=현재 보기: +remote-view-instruction=더 많은 위성을 발사하여 더 많은 항성, 행성, 위성 그리고 그 외 다양한 구역을 발견하세요. +remote-view-spaceships=__1__ 우주선 +remote-view-spaceships-anchored=우주선 __1__대 정박중 +remote-view-clamps=__1__ 우주선 클램프 +remote-view-show-hide-resources=자원 표시/숨기기 +remote-view-show-hide-stats=통계 표시/숨기기 +remote-view-show-hide-anchor-info=정박 정보 표시/숨기기 +exit-remote-view=항법 위성 연결 종료 [__CONTROL__se-remote-view__] +open-zonelist=우주 탐색기 열기 +zonelist-window-title=[img=virtual-signal/se-planet-orbit] 우주 탐색기 [__CONTROL__se-universe-explorer__] +priority-icon=[img=virtual-signal/se-accolade] +priority-tooltip=우선 순위 (중요 구역과 비중요 구역 정리) +trim-zone-button=[img=item/cliff-explosives] 표면 다듬기 +trim-zone-button-tooltip=플레이어 개체, 특수 개체 및 맵원점에 의해 정의된 경계 상자 외부의 청크를 제거합니다. +trim-zone-button-no-surface-tooltip=표면이 없습니다. +trim-zone-results=__2__에서 청크 __1__개를 제거했습니다. X [__3__ ~ __4__] Y [__5__ ~ __6__] 구역을 다듬었습니다. +delete-zone-button=[img=virtual-signal/se-remove] 표면 삭제 +delete-zone-button-tooltip=특정 표면은 삭제할 수 없습니다. +delete-zone-button-no-surface-tooltip=표면이 없습니다. +scan-zone-button=[img=item/satellite] 표면 스캔 +scan-zone-button-tooltip=경고: 스캔이 진행되는 동안 게임 속도가 느려질 수 있습니다. 스캔 속도는 모드 설정에서 설정할 수 있습니다. 스캔은 언제든지 중단할 수 있습니다. +scan-zone-button-disabled-tooltip=표면을 스캔하려면 위성을 발사해야 합니다. +stop-scan-zone-button=[img=item/satellite] 모든 스캔 중단 +stop-scan-zone-button-tooltip=모든 표면 스캔을 중단합니다. +generic-requires-satellite=먼저 위성을 발사해야 합니다. +remote-view-requires-satellite=항법 위성 연결을 사용하려면 위성을 발사해야 합니다. +satellite-discovered-platform=[color=cyan]위성이 궤도를 도는 우주 플랫폼을 발견했습니다.[/color] [img=virtual-signal/se-planet-orbit] 우주 탐색기를 열고 [__CONTROL__se-universe-explorer__], 선택한 __1__의 표면 보기를 클릭하세요. 유용한 것들을 발견할 수 있습니다. +satellite-view-unlocked=[color=cyan][img=virtual-signal/se-remote-view] 내비게이션 위성 업링크[/color]가 잠금 해제되었습니다. 이제 당신이 발사한 위성을 통해 그동안 발견한 다양한 천체들을 살펴 볼 수 있습니다. [color=green][__CONTROL__se-remote-view__][/color] 키를 누르거나 (단축키 오른쪽에 있는) 바로 가기 도구 모음을 사용하여 활성화할 수 있습니다. +source-discovered-zone=[color=cyan]__1__에 의해 새로운 __2__이/가 발견되었습니다: [/color][img=__3__] [color=white]__4__[/color]. 발견된 위치는 [img=virtual-signal/se-planet-orbit] 우주 탐색기 [__CONTROL__se-universe-explorer__]를 통해 확인할 수 있습니다. +discovered-zone=[color=cyan]새로운 __1__이/가 발견되었습니다: [img=__2__] [/color][color=white]__3__[/color]. +discovered-anomaly-additional=[img=virtual-signal/se-anomaly] 이상변칙으로부터 알 수 없는 개체가 감지되었습니다. [img=virtual-signal/informatron] 탐사 일지 [__CONTROL__informatron__]가 갱신되었습니다. +satellite-discovered-nothing=새로운 위성이 발사되었지만, 아무 것도 찾지 못했습니다. 다른 항성계 주변에서 더욱 많은 것을 찾을 수 있을 것입니다. +tech-discovered-nothing=망원경이 근처에서 새로운 별을 찾지 못 했습니다. 더 깊은 심우주에서 찾을 수 있을 겁니다. +tech-deep-discovered-nothing=망원경이 심우주에서 특별히 새로운 것을 찾지 못 했습니다. +galaxy_ship_authenticated=[img=virtual-signal/se-spaceship] 버려진 우주선: [color=cyan]\"생체 서명이 인증되었습니다. 에어록 접근 코드는 2236067964입니다. 긴급 백업 기록을 전송합니다.\"[/color] [img=virtual-signal/informatron] 탐사 일지 [__CONTROL__informatron__]가 갱신되었습니다. +space-capsule=우주 캡슐 +player-died=__1__ 플레이어가 죽었습니다. +launch-suit-warning=질식을 방지하려면 우주복을 착용하고 인벤토리에 생명 지원 용기가 있는지 확인하세요. +suffocating-warning=질식하고 있습니다. 우주 캡슐로 돌어가거나 우주복을 생명 지원 용기와 함께 착용하세요. +rocket_survivability_fail=화물 로켓이 운송 중 손상을 입어 경로를 이탈했습니다. 추가 로켓 안정성 및 화물 안정성 연구가 권장됩니다. __1__ +respawn-if-stranded=되돌아갈 수 없게 되었다면 부활 단축키 [__CONTROL__se-respawn__]를 누르세요. +respawn-options-title=부활 지점 +respawn-button-homeworld=[img=virtual-signal/se-planet] 고향 행성 +respawn-button-landing-pad=[img=item/se-rocket-landing-pad] 가장 가까운 착륙 패드 +respawn-button-spaceship=[img=virtual-signal/se-spaceship] 가장 가까운 우주선 +respawn-confirm-title=정말로 부활하시겠습니까? +respawn-confirm-yes=[img=virtual-signal/se-death] 부활 +respawn-confirm-no=취소 +search-list=탐색 +clear-search=탐색 초기화 +filter-list=필터 +clear-filter=필터 초기화 +attrition-type-radiation=방사선 +attrition-type-wind=풍속 및 풍향 +attrition-type-spacial-distortion=공간 왜곡 +zonelist-view-surface=표면 보기 +zonelist-heading-hierarchy=계층 구조 +zonelist-heading-type=구역 유형 +zonelist-heading-name=이름 +zonelist-heading-radius=반지름 +zonelist-heading-primary-resource=주요 자원 +zonelist-heading-attrition=로봇 간섭 +zonelist-heading-threat=위험도 +zonelist-heading-solar=태양광 +zonelist-heading-flags=깃발 +zonelist-heading-priority=우선 순위 +zonelist_filter_star=항성 포함 +zonelist_filter_planet=행성 포함 +zonelist_filter_planet-orbit=행성 궤도 포함 +zonelist_filter_moon=위성 포함 +zonelist_filter_moon-orbit=위성 궤도 포함 +zonelist_filter_asteroid-belt=소행성대 포함 +zonelist_filter_asteroid-field=소행성 구역 포함 +zonelist_filter_anomaly=이상 현상 포함 +zonelist_filter_spaceship=우주선 포함 +zonelist-resource-bar-tooltip=__1__ __2__\n빈도: __3__\n크기: __4__\n풍부함: __5__ +zonelist-resource-bar-tooltip-extended=__1__ __2__\n빈도: __3__\n크기: __4__\n풍부함: __5__\n__6__ +zonelist-resources-disclaimer=자원 확률은 추정치입니다. [?] +zonelist-resources-disclaimer-tooltip=모든 자원 값은 요소 밀도를 기준으로 한 추정치이며,\n게임의 지도 생성 컨트롤에 해당되는 부분입니다.\n실제 자원 패치는 변동되거나 물, 표면의 반경, 또는 특정 타일 요구 사항으로 인해 생성되지 않을 수 있습니다. +resource-terrain-required-se-vulcanite=화산 지형 필요 +resource-terrain-required-se-cryonite=냉대 지형 필요 +resource-terrain-required-se-vitamelange=잔디 지형 필요 +zone-tooltip-type=구역 유형: +zone-tooltip-parent=상위: +zone-tooltip-threat=위험도: +zone-tooltip-daynight=낮과 밤 주기: +zone-tooltip-bot-attrition=로봇 간섭 __1__: +zone-tooltip-radius=반지름: +zone-tooltip-solar=태양광: +zone-tooltip-flags=깃발: +zone-tooltip-closest=가까운 곳: +zone-tooltip-destination=목적지: +zone-tooltip-delta-v=__1__에서 델타 V +construction-denied=여기에 배치할 수 없습니다. +construction-denied-vehicle-in-space=지상 차량은 우주에 배치할 수 없습니다. +construction-denied-se-surface=잘못된 위치입니다. 우주 탐사 표면에 배치해야 합니다. +construction-denied-no-water=물 없음 +construction-denied-spaceship-only=우주선 바닥에 배치해야 합니다. +currently-viewing=현재 창: __1__ +fail-board-no-character=대상 우주선에 탑승할 수 없습니다. 이 액션을 사용하려면 캐릭터에 연결되어 있어야 합니다. +fail-board-remote-character=대상 우주선에 탑승할 수 없습니다. 캐릭터가 탑승하려는 우주선에 없습니다. +fail-board-target-anchored=정박된 우주선에 탑승할 수 없습니다. 대신 동일한 위치에 정박해보십시오. +starmap=우주 지도 +starmap-button=[img=virtual-signal/se-star] 우주 지도 +back=뒤로 +spaceship=우주선 +planet=행성 +moon=위성 +star=항성 +orbit=궤도 +something_orbit=__1__ 궤도 +asteroid-belt=소행성대 +asteroid-field=소행성 구역 +anomaly=이상 현상 +spaceship-cannot-set-destination-to-self=목적지는 같은 행성일 수 없습니다. +spaceship-streamline=스트림라인: __1__ +spaceship-launch-energy=발사 에너지: __1__ +spaceship-launch-energy-invalid=발사 에너지: 무결성 검사를 통과해야 합니다. +spaceship-speed=속도: __1__ +spaceship-structural-stress-hull=구조 강도 (선체): __1__ +spaceship-structural-stress-hull-invalid=구조 강도 (선체): 없음 (밀폐 필요) +spaceship-structural-stress-container=구조 강도 (보관 시설): __1__ +spaceship-structural-stress-container-invalid=구조 강도 (창고): 없음 (밀폐 필요) +spaceship-travel-time-unknown=여행 시간: 미확인. 최대 속도를 테스트하여 추정치를 얻어야 합니다. +spaceship-travel-time-max=여행 시간: 최대 속도에서 __1__초. +spaceship-travel-time-current=여행 시간: 현재 속도에서 __1__초. +spaceship-closest-location=가까운 지역: __1__ +spaceship-location-spatial-distortion=공간 왜곡: __1__ +spaceship-location-stellar-x=사분면 X: __1__ +spaceship-location-stellar-y=사분면 Y: __1__ +spaceship-location-star-gravity-well=항성계 중력권: __1__ +spaceship-location-planet-gravity-well=행성계 중력권: __1__ +spaceship-travel-status=여행 상태: __1__ +spaceship-integrity-status-valid=무결성 상태: 통과: __1__ +spaceship-integrity-status-invalid=무결성 상태: 실패: __1__ +spaceship-button-launch=발사 +spaceship-button-launch-tooltip=발사 준비 완료 +spaceship-button-launch-disabled=발사 (비활성화됨) +spaceship-button-launch-disabled-fuel-tooltip=추진 로켓 탱크에 연료가 필요합니다 +spaceship-button-launch-disabled-integrity-tooltip=무결성 검사를 마쳐야 합니다. +spaceship-button-anchor=정박 +spaceship-button-confirm-anchor=정박 확인 +spaceship-button-anchor-to=__1__에 정박 +spaceship-button-anchor-on=__1__ 표면에 정박 +spaceship-button-stop=정지 +spaceship-button-start=발진 +spaceship-button-board=__1__에 탑승 +spaceship-button-scouting-back=뒤로 +spaceship-button-scouting-back-tooltip=정박 정찰을 취소합니다. +spaceship-name-the=__1__ +spaceship-button-start-integrity-check=무결성 검사 시작 +spaceship-heading-destination=목적지 +list-destinations-alphabetically=목적지를 이름 순으로 정렬 +spaceship-travel-message-new-course-plotted=새로운 경로가 계획되었습니다. +spaceship-travel-message-exiting-planet-gravity=행성 중력권 이탈 +spaceship-travel-message-navigating-planet-gravity=행성 중력권 탐색 +spaceship-travel-message-exiting-star-gravity=항성 중력권 이탈 +spaceship-travel-message-navigating-star-gravity=항성 중력권 탐색 +spaceship-travel-message-spatial-distortions=공간 왜곡 탐색 +spaceship-travel-message-navigating-interstellar=성간 우주 탐색 +spaceship-travel-message-at-destination=목적지에 도착함 +spaceship-check-message-passed=통과: 올바른 우주선 상태입니다. +spaceship-check-message-failed-containment=실패: 기계판 주변 밀폐 손실. 모든 우주선 격벽이 우주선 바닥 위에 틈 없이 배치되어 있는지를 확인하십시오. +spaceship-check-message-failed-console-floor=계기판은 우주선 바닥에 배치되어야 합니다. +spaceship-check-message-failed-empty=계기판과 연결된 바닥이 올바르게 밀폐되지 않았습니다. +spaceship-check-message-failed-unknown-bounds=오류: 우주선 경계가 명확하지 않습니다. +spaceship-check-message-failed-stress=실패: 구조적 무결성 강도가 기술적 한계를 초과합니다. +spaceship-check-message-checking-console-floor=계기판과 연결된 바닥을 확인 중 +spaceship-check-message-checking-containment=밀폐 여부를 확인합니다. +spaceship-check-message-checking-connectivity=계기판 연결을 확인합니다. +spaceship-check-message-no-console=계기판이 없습니다. +spaceship-check-message-did-not-complete=확인이 완료되지 않았습니다 +spaceship-check-message-unstable=불안정: 우주선 기동 시 일부 구역이 분리될 것입니다. +spaceship-check-message-valid-but-disconnecting=통과/불안정: 일부 구역이 분리될 것입니다. +spaceship-warning-sections-disconnecting=구역이 분리되고 있습니다!! 정지 후 수리하십시오. +page_space_exploration_text_1=우주 탐사 모드에 오신 것을 환영합니다. 이미 모드에 많은 것이 있지만 아직 [font=default-bold]실험[/font] 상태이며 많은 것들이 개발되고 있습니다. 버그가 있을 수 있습니다.\n\n[font=heading-2]실험 상태요?[/font]\n\n우주 탐사는 여전히 빠르게 변화하고 있으며 모드 호환성을 희생해 가면서 주요 기능 개발을 위해 많은 시간을 할애하고 있습니다. [color=red]필수 및 권장 모드 이외의 다른 모드와 함께 플레이하는 것은 권장하지 않습니다.[/color]\n\n실험 상태에 있는 동안, 모드가 손상된 게임 및 세이브 파일, 충돌, 유효하지 않은 형태의 테크 트리, 또는 핵심 게임 플레이와 직결되는 치명적 문제를 일으키는 경우에 새로운 플레이어를 보호하기 위하여 빠르게 호환되지 않는 모드를 표시하고 있습니다. 이는 즉, 많은 모드를 사용하는 경우 아직 발견되지 않은 문제로 인해 후에 호환되지 않는 모드의 목록에 표시될 가능성이 매우 높습니다. 물론 호환되지 않는 모드와 함께 플레이하기 위해 info.json 파일을 자유롭게 편집하셔도 되지만, 그만큼 위험을 감수해야만 할 것입니다. 게임 상태가 더는 플레이 할 수 없는 상황에 이르더라도 저는 당신을 도와드릴 수 없습니다.\n\n실험 상태에 있는 동안, 대부분의 많은 정밀 검사 (overhaul) 모드는 테크 트리가 크게 손상되면 호환되지 않는 것으로 여기지만, 장기적인 의도는 두 개발자 서로 모두가 만족할 수 있도록 모드를 함께 작동할 수 있게 만드는 것입니다. Krastorio 2는 이미 실질적으로 진행중인 작업의 대표적인 예시입니다.\n\n우주 탐사 위키에 모드 호환성과 관련된 몇 가지 추가 정보가 기재되어 있습니다. 모드 호환성을 지원하고 싶으시다면 Discod를 통해 의견을 전해주세요. 허나 호환성 문제는 우주 탐사 모드 개발에 있어 우선 순위가 그리 높지 않습니다.\n\n[font=heading-2]권장 모드[/font] \n\n • AAI Signal Transmission 모드는 많은 표면 간의 신호를 서로 전달할 수 있도록 도와주는 시설을 추가합니다. 이 모드가 없다면 각 행성 간의 물류를 가늠하고 계산하기가 극도로 어려워질 것입니다.\n\n • Module Inserter 모드는 직접 일일이 갈 필요 없이, 위성 보기 모드를 통해서도 로봇을 통해 많은 시설에 모듈을 넣을 수 있도록 해줍니다.\n\n • Equipment Grid Logistic Module 모드는 스파이더트론같은 차량에 차량용 그리드 모듈을 추가해 차량이 직접 물류 네트워크에 접근하여 아이템을 요청하고 폐기 아이템을 처리해줍니다.\n\n • Grappling Gun 모드는 직접 이동하기가 어려울 때 건물과 강을 뛰어넘어 빠르게 상황을 벗어나게 해줍니다. 우주에 혼자 떨어졌을 경우 우주 플랫폼으로 빠르게 되돌아 올 수도 있고, (특히 이동하고 있는) 우주선에도 탑승할 수 있습니다.\n\n • Burner Leech 모드는 AAI 화력 시기에 유용할 것입니다.\n\n • Text Plates 모드는 행성의 이름이나 정류장, 우주선 도킹 구역 등을 알아보기 쉽게 표시하는 데 사용할 수 있는 유용한 문자판을 바닥에 놓을 수 있습니다.\n\n • Even Distribution 모드는 매우 많은 수의 건물에 아이템을 투입하는 데에 유용하며, 특히 초반에 매우 큰 도움이 되어줍니다.\n\n • Walls Block Spitters 모드는 맹렬히 다가오는 적, 특히 스피터의 침이 벽에 막히게 합니다. 스피터의 침 발사 속도가 약간 향상되지만, 모드 설정을 통해 비활성화 할 수 있습니다. 포탑보다 벽을 수리하는 것이 더욱 싸게 먹힌다는 것을 잊지 마세요.\n\n • Bullet Trails 모드는 총알을 발사할 때 총알이 나아가는 궤적이 순간적으로 나타납니다. 이를 통해 총알이 어디로 날아가는지, 포탑이 어느 적을 쏘고 있는지를 알 수 있습니다 (물론 시각적으로도 보기 좋습니다).\n\n\n[font=heading-2]권장 설정[/font]\n\nAlien biomes 모드의 모든 외계 타일을 활성화해야 합니다. 그렇지 않으면 중간에 게임이 충돌할 수 있습니다.\n\n게임의 진행이 평소보다 훨씬 더 길어질 것이니 적의 진화 요인을 어느정도 낮추고 시작하는 것이 좋습니다.\n\n게임을 어렵게 하는 제작법이나 마라톤 모드와 같은, 자원을 집중적으로 모아서 해야 하는 게임 방식이 아니라면 시작 행성에 대한 자원의 빈도나 매장량을 늘리지 마세요. 자원의 크기가 너무 높으면 다른 행성으로 떠나거나 확장할 이유가 사라집니다.\n\n\n[font=heading-2]도움되는 링크[/font]\n\n우주 탐사 위키를 참고하세요: https://spaceexploration.miraheze.org\n\nDiscord에서 도움을 받거나 개발에 도움을 주세요: https://discord.gg/ymjUVMv\n\n저의 2000 시간 가량이 이 모드에 담겼습니다. 당신이 이 게임을 즐기고 계시다면, Patreon에서 저를 지원하는 것도 고려해주세요: https://www.patreon.com/earendel +menu_meteor_defence=[img=virtual-signal/se-meteor] 운석 방어 +title_meteor_defence=운석 방어 +page_meteor_defence_text_1=운석은 무작위한 간격마다 대부분의 지역 표면에 떨어집니다. 모드 설정에서 운석 추락 간의 최대 주기를 변경할 수 있습니다.\n\n운석 수는 무작위로 50%의 확률로 1개, 25%의 확률로 2개, 12.5%의 확률로 3개, 6.25%의 확률로 4개... 등으로 무작위로 지정됩니다\n\n운석 방어 장치로 운석을 요격할 수 있습니다. 떨어지는 운석의 수에 따라 차례대로 운석을 향해 발사하므로 모든 운석 방어 시설이 작동하지 않습니다. 운석 방어 시설은 충분한 양의 탄약과 충전 시간, 그리고 충전하는 동안의 추가 전력이 필요합니다. 전력 소비는 그리 중요한 부분이 아니므로 위험과 비용의 균형을 맞추는 것이 좋습니다. +menu_coremining=[img=item/se-core-miner] 심층 채광 +title_coremining=심층 채광 +page_coremining_text_1=행성과 위성에서만 심층 채광이 가능합니다. 각 행성과 위성의 내부에는 어떤 성분으로 이루어졌는지에 따라 각기 다른 유형의 심층 파편을 얻을 수 있습니다. Nauvis는 공통적으로 모든 자원이 균일하지만 다른 장소에서는 주로 하나의 자원 유형만이 채굴되는 경향이 있습니다. 심층 채광 드릴은 전력을 어마어마하게 잡아먹지만, 석탄이나 원유, 우라늄을 통해 그 소모된 에너지를 돌려받을 수 있습니다.\n\n심층 채광 드릴은 많은 전력을 사용하며 같은 천체의 표면에 여러 개의 심층 채광 드릴이 배치되어 있다면 각 심층 채광 드릴마다의 채취 효율은 떨어집니다. 여러 개를 배치하더라도 일반 채광 드릴보다 전력 대비 효율성이 훨씬 낮지만 자원 부족이 일어나지는 않습니다. 게임 초반에 풍부한 전력이 있다면 하나의 심층 채광 드릴을 사용하는 것이 유용할 수 있습니다. 작은 행성에서 시작한다면 태양광과 심층 채광 드릴이 행성에서 탈출하기 위한 충분한 자원을 확보하는 유일한 방법일 수 있습니다.\n\n심층 채광 드릴은 채취 생산성 효과를 받으므로 이를 통해 후반에 더욱 많은 자원을 채취할 수 있게 됩니다. 그러므로 소수의 행성에서 많이 채취하기보다는, 많은 행성에서 한두 개씩 배치하여 채취하는 것이 좋습니다. +menu_beacons=[img=item/se-wide-beacon-2] 신호기 +title_beacons=신호기 +page_beacons_text_1=\n[font=heading-2]신호기 과부하 [img=virtual-signal/se-beacon-overload][/font]\n\n신호기 과부하는 팩토리오 게임의 신호기 시스템을 재구성한 것입니다. 각 조립 기계는 신호기 1개의 효과만 받을 수 있으며, 2개 이상의 신호를 받을 경우 과부하되어 생산이 중단됩니다.\n\n이러한 개편은 더 많은 모듈을 비콘에 넣을 수 있게 하고, 최대 보너스를 위해 신호기와 조립기계 모두에서 더 강력한 모듈의 사용을 촉진합니다. 또한 이러한 변화를 통해 더 광범위한 공장 설계를 가능하게 하고 촉진할 수 있습니다.\n\n기본 신호기는 바닐라 신호기보다 훨씬 강력하지만, 두 대 이상의 신호기를 중첩시킬 수 없으므로 바닐라에 비해 최대 상승 효과는 줄어듭니다. 더 강력한 신호기는 바닐라에서 중첩하여 사용할 수 있는 기계의 최대 부스트를 훨씬 능가할 수 있습니다.\n\n범위 신호기를 사용하기 시작하면서 플레이어는 모듈 비용 절감 효과와 함께 더 큰 건물을 회전하거나 여러 개의 유체 또는 재료 입력을 통해 복잡한 설계를 만들 수 있는 자유를 경험할 수 있습니다.\n\n둘 이상의 신호기의 영향을 받는 기계에는 신호기 과부하 아이콘이 표시되고 모든 생산 작업이 일시 중지됩니다. 일시중지되더라도 대기 전력은 계속 소비됩니다. +menu_launching_satellites=[img=item/satellite] 위성 발사 +title_launching_satellites=위성 발사 +page_launching_satellites_text_1=지금까지 발사된 위성의 개수는 [color=cyan]__1__[/color]개입니다.\n\n[font=heading-2][img=virtual-signal/se-remote-view] 내비게이션 업링크 [__CONTROL__se-remote-view__][/font]\n\n완성된 위성 로켓 격납고에 내비게이션 위성을 넣고 발사하면 [img=virtual-signal/se-remote-view] 내비게이션 위성 보기를 사용할 수 있게 됩니다. 이 모드는 [__CONTROL__se-remote-view__] 키를 눌러 빠르게 접근할 수 있습니다. 위성 모드에서는 카메라가 캐릭터와 분리되어 빠르게 지도를 둘러보고 새로운 지역을 발견할 수 있습니다. 위성 모드에서는 개체를 배치하거나 채취하는 등의 직접적인 행위는 할 수 없습니다. 대신 설계도면, 해체 계획기, 업그레이드 계획기의 사용이나 고스트 개체 배치, 전선 연결, 기계 제작법 변경, 신호 조합기 설정 등 많은 간접적인 행위를 할 수 있습니다.\n\n[font=heading-2][img=virtual-signal/se-planet-orbit]우주 탐색기 [__CONTROL__se-universe-explorer__][/font]\n\n내비게이션 위성 네트워크를 통해 다른 행성과 위성, 소행성 벨트, 소행성 지대, 그리고 천체의 궤도같은 다른 표면도 볼 수 있습니다. [__CONTROL__se-universe-explorer__] 키를 눌러 밝혀진 구역 목록을 불러옵니다. 내비게이션 위성을 발사하였다면 그곳에 무엇이 있는지 확인할 수 있습니다. 로켓을 타고 다른 행성으로 가기 전 미리 다른 행성을 정찰하는 것이 좋습니다.\n\n위성 발사는 처음 발사된 행성계 내에서 구역을 탐색하는 데 큰 도움이 됩니다 (자세한 내용은 구역 탐색을 참조하세요).\n\n[font=heading-2][img=item/se-satellite-telemetry] 위성 원격 측정[/font]\n\n[img=item/se-rocket-science-pack] 로켓 과학의 핵심 구성 요소인 위성 원격 측정은 위성 발사를 통해 얻을 수 있습니다. +menu_zone_discovery=[img=virtual-signal/se-planet-orbit] 구역 탐색 +title_zone_discovery=구역 탐색 +page_zone_discovery_text_1=이 우주에는 발견할 수 있는 수없이 많은 항성, 행성, 위성, 소행성 벨트, 소행성 지대가 있습니다.\n\n[font=heading-2]내비게이션 위성[/font]\n내비게이션 위성을 발사하여 위성이 발사된 동일한 항성계에서 무작위로 행성, 위성, 또는 소행성 벨트를 발견할 수 있습니다. 그 항성계에서 발견할 다른 천체가 더 없다면, 새로운 항성을 발견할 수 있지만 깊고 깊은 그 공간에 그 항성을 공전하는 다른 천체는 발견하지 못할 것입니다.\n\n[font=heading-2]구역 탐색 연구[/font]\n우주 망원경을 통해 발견하고 싶은 새로운 우주의 구역을 하나 탐색할 수 있습니다. 이것은 \"구역 탐색\" 연구를 통해 이루어집니다. 기본적인 구역 탐색 연구는 무작위로 항성, 행성, 위성, 또는 소행성 벨트 중 하나를 발견하게 됩니다.\n\n[font=heading-2]집중적인 구역 탐색 연구[/font]\n대상 구역 탐색 연구는 기본적인 구역 탐색 연구와 동일하나, 아래에 특별히 선호하는 자원을 선택하여 해당 자원이 크게 매장되었을 가능성이 높은 천체 하나를 중점으로 탐색합니다. 하지만 잊지 마세요, 항성을 찾기 전에는 행성을 찾을 수 없고, 행성을 찾기 전에는 위성을 찾을 수 없습니다. 항상 원하는 것을 찾으리라는 생각을 갖지는 마세요.\n\n[font=heading-2]심우주 구역 탐색 연구[/font]\n심우주 구역 탐색 연구는 끝없이 깊고 깊은 저 너머의 우주에만 존재하는 것들을 중점으로 하여 소행성 지대를 탐색할 수 있는 유일한 방법이며, 이렇게 발견된 소행성 지대는 나퀴움을 얻을 수 있는 유일한 지역이기도 합니다. 심우주 연구는 자원을 중점으로 찾을 수 없습니다.\n\n[font=heading-2]자원 지정 구역 탐색 설정:[/font] +menu_cargo_rockets=[img=virtual-signal/se-cargo-rocket] 화물 로켓 +title_cargo_rockets=화물선 +page_cargo_rockets_text_1=화물 로켓은 화물 로켓 격납고, 일명 로켓패드에서 발사됩니다.\n\n지금까지 발사된 화물 로켓은 [color=cyan]__1__[/color]개입니다.\n\n기술 연구에 기반한 화물 손실 값: 손실 최대 비율이 [color=cyan]__2__%[/color]만큼 감소합니다.\n\n기술 연구에 기반한 로켓 생존 가능성 값: 손실 확률이 [color=cyan]__3__%[/color]만큼 감소합니다.\n\n기술 연구를 기반으로 한 로켓 재활용 확률 값: [color=cyan]__4__[/color]개 (오차 범위 10개, 최대 100개)까지의 부품을 회수할 수 있습니다.\n\n[font=heading-2]시작하기[/font]\n\n화물 로켓을 발사하기 전에, 우선 우주 탐사가 설치된 상태에서 위성 로켓 격납고에 내비게이션 위성 (바닐라 Factorio의 일반 로켓 격납고와 인공 위성)을 넣어 발사하여야 합니다. \n\n화물 로켓 격납고를 만든 뒤에는 로켓을 만들고 연료를 공급해야 합니다.\n\n • 격납고 내 인벤토리에 100개의 화물 로켓 부품이 있어야 합니다. 처음이라면, 이 중 평균 약 20개 가량은 목적지 주변에서 회수할 수 있으며, 연구를 통해 회수 가능성을 높일 수 있습니다. \n • 격납고 내 인벤토리에 우주 캡슐 1개를 넣으세요. 우주 캡슐은 항상 목적지에 도달하고 착륙할 때 사용하며, 궤도에 있다면 가까운 행성으로 돌아갈 수 있습니다.\n • 화물 로켓 격납고의 각 모퉁이 근처에 있는 8개의 연결 포드 중 원하는 곳에 액체 로켓 연료를 연결하세요. 필요한 연료량은 현재 출발지가 되는 행성의 반지름과 원하는 도착지까지의 거리에 따라 다릅니다. 목적지 설정으로 \"이름이 있는 아무 착륙 패드\"를 설정한다면 유효하는 도착지까지 가는 데 충분한 연료를 적재합니다.\n\n화물 로켓 격납고의 전면에 있는 문 앞에서 __CONTROL__toggle-driving__ 키를 눌러 화물 로켓 격납고에 들어갈 수 있습니다. 이는 화물 로켓에 당신도 함께 날아갈 수 있음을 의미합니다. 우주로 같이 비행할 때에는 혹독한 우주 환경에서 생존하기 위해 추진 장치가 달린 우주복과 생명 유지 장치를 같이 들고 가세요. \n\n처음 화물 로켓을 발사한다면, 안전하게 착륙할 착륙 패드가 없으므로 로켓은 산산조각이 나며 안에 들어있는 화물은 곳곳으로 흩어질 것입니다. 또한 드물게 로켓의 항법 고장이 일어나 착륙 패드가 있어도 제대로 착륙하지 못하고 충돌할 수도 있습니다. 그래도 로켓 안에 있는 화물들은 안전하게 화물 포드에 배치되므로 손실 걱정은 안해도 됩니다. \n\n로켓 착륙 패드와 우주 플랫폼 비계를 가져가서 후에 다음 로켓이 그곳으로 다시 올 때를 대비하기 위해 표면을 구성할 수 있습니다.\n\n발사하기 전에 본 기지 내에 로켓 착륙 패드를 세워두면 후에 돌아올 때 아무 곳으로 가지 않고 원하는 지점으로 즉시 돌아올 수 있습니다.\n\n[font=heading-2]도착지[/font]\n\n착륙 패드를 배치하였다면 다음 화물 로켓을 발사할 때에는 무작위한 위치가 아닌 착륙 패드를 목표로 새로 설정해야 합니다. 직접 설정할 수 있지만, 위성을 통한 원격 보기 (단축키 'N')를 통해 할 수 있습니다. 그러나 착륙 패드에 아이템이 있다면 착륙하지 않으므로 항시 비워두세요.\n\n[font=heading-2]기초 자동화[/font]\n\n화물 로켓 격납고는 로켓 내부에 로켓 부품이 몇 개 있는지를 신호로 출력합니다. 화물 로켓 격납고에 부품을 투입하는 투입기에 [화물 로켓 부품 < 100] 조건을 설정하여 내부에 화물 로켓 부품을 추가로 채우지 않도록 할 수 있습니다.\n\n화물 로켓 격납고에 발사 조건을 설정하면 조건 만족에 따라 자동으로 발사되지만, 도착지로 설정된 착륙 패드 안에 화물이 있다면 자동 발사하지 않습니다 (만약 발사된다면 일부 화물이 손실될 것입니다).\n\n[font=heading-3]신호 입력[/font]\n\n[img=virtual-signal/signal-green] 녹색 신호: 격납고는 녹색 신호가 있을 경우 발사할 수 있도록 설정할 수 있으며 이 경우 녹색 신호를 주는 즉시 발사하게 됩니다.\n\n[font=heading-3]신호 출력[/font]\n\n[img=virtual-signal/signal-E] E 신호: 빈 슬롯의 수\n\n[img=virtual-signal/signal-F] F 신호: 화물이 찬 슬롯\n\n[img=virtual-signal/signal-L] L 신호: 도착지 설정에 따른 잠재적으로 요구되는 액체 로켓 연료의 용량입니다.\n\n[img=virtual-signal/se-cargo-rocket] 화물 로켓 신호: 로켓이 완성될 경우 (즉 캡슐 1개와 로켓 부품 100개가 만족될 경우) 값 1을 돌려줍니다.\n\n[img=item/se-space-capsule] 우주 캡슐 신호: 로켓 제작에 사용된 모든 캡슐은 화물 인벤토리에 있는 캡슐 개수와 합산됩니다.\n\n[img=item/se-cargo-rocket-section] 화물 로켓 부품 신호: 로켓 제작에 사용된 모든 화물 로켓 부품은 화물 인벤토리의 부품 개수와 합산됩니다.\n\n[img=fluid/se-liquid-rocket-fuel] 액체 로켓 연료 신호: 격납고 안에 충전된 총 액체 로켓 연료의 양입니다. +menu_delivery_cannons=[img=item/se-delivery-cannon] 배달 대포 +title_delivery_cannons=배달 대포 +page_delivery_cannons_text_1=배달 대포는 행성 간의 물품을 폭발성 힘으로 날려보낼 수 있는 레일건입니다. 급격히 가속화된 상태에서도 물품을 안전하게 지켜낼 수 있는 선에서 발사하도록 설계되었습니다. 배달 대포는 매우 복잡한 중간 제조품목이나 구조물을 발사할 수 없습니다.\n\n배달 대포는 목표 지점만 지정할 수 있을 뿐 그 목표 지점에 무엇이 있는지는 판단하지 못하며, 전력과 배달 캡슐이 충전되어 있는 한 지속적으로 화물을 발사합니다. 대포의 기능에 조건을 추가하려면 자원이나 캡슐로 충전되는 대포의 발사 기능을 직접 제한해야 합니다.\n\n만약 배달 캡슐이 맨 땅에 떨어지게 되면 해당 지역의 주변 개체는 큰 피해를 입게 되고 대부분의 자원이 파괴됩니다. 배달 대포 상자는 상자가 가득 차지 않는 한 안전하게 캡슐을 포착할 수 있습니다. 각기 다른 자원을 배달하는 여러 개의 배달 대포로 같은 상자를 목적지로 설정하여 발사할 수 있습니다.\n\n대상 상자를 항시 비워두거나, 신호 전송 (Signal transmission)을 이용하여 대포 입력을 제한하는 것이 좋습니다. +menu_lifesupport=[img=item/se-lifesupport-equipment-1] 생명 유지 +title_lifesupport=생명 유지 +page_lifesupport_text_1=우주같은 혹독한 환경에서는 단순한 장비로는 살아남을 수 없습니다. 이러한 적대적 환경에서 살아남으려면 생명 유지 장비와 생명 지원 용기가 필요합니다.\n\n생명 유지 장비와 소모품인 생명 지원 용기는 생명 지원 시설에서 만들 수 있습니다.\n\n생명 지원 용기는 시스템에 따라 모든 역할을 수행하기 위한 자원을 공급해주며 점차 소비됩니다. 생명 유지 막대가 조금씩 감소하여 완전히 떨어지게 되면 인벤토리 내에서 새로운 생명 지원 용기 하나를 소모합니다.\n\n생명 지원 장비는 아머 그리드에 장착되지만 우주복에는 기본적으로 하나의 생명 유지 장비가 내장되어 있습니다. 장비 그리드에 생명 유지 장비를 추가로 배치하여 생명 지원 효율성을 높일 수 있습니다. 우주복이 아닌 아머에 생명 유지 장비를 장비하는 경우 적대적인 행성에서는 보호하지만 우주의 진공에서는 보호하지 못 합니다.\n\n[font=heading-2]적대적인 환경[/font]\n적대적인 환경은 그 자리에 있는 것만으로도 당신의 신체에 손상을 입힐 수 있는 모든 구역을 말합니다. 생명 유지 장비는 적절한 가압과 산소, 물, 영양소, 열 조절 및 방사선 보호를 제공하며 이러한 위험으로부터 사용자를 보호하도록 설계되었습니다. 적대적 환경의 주요 유형은 두 가지로 다음과 같습니다.\n\n우주: 생명 유지 장비가 진공 상태에서도 올바르게 작동하려면 우주복 (추진 슈트)에 넣어져야 합니다. 만약 우주복이 아닌 다른 아머의 그리드에 생명 유지 장비를 넣는다면 우주의 질식을 막을 수 없습니다.\n\n땅: 특정 행성과 달은 방사선, 극한의 추위나 더위, 산성 대기와 같은 위험으로 가득 차 있어 생명 유지 장비가 필요할 것입니다 (출시 예정). 또한 행성에는 특정 생화학 무기를 사용할 수 있으며 이 경우에도 생명 유지 장비가 필요합니다 (역병 세계). 이 지역에 대한 생명 지원 장비는 우주복 뿐만이 아니라 다른 유형의 아머에 생명 유지 장비를 넣어도 됩니다. +menu_space_sciences=[img=item/se-astronomic-science-pack-2] 우주 과학 +title_space_sciences=우주 과학 +page_space_sciences_text_1=[img=item/se-rocket-science-pack] 최초의 우주 과학 팩은 로켓 과학 팩입니다. 로켓 과학 팩은 오로지 우주에서만 만들 수 있으므로 먼저 궤도 상에 작은 우주 정거장을 세워야 합니다. 로켓 과학 팩과 이후의 과학 팩들은 오로지 우주에서만 만들고 사용할 수 있으므로 다른 과학 팩도 시작하여 강력한 우주 과학 연구소에 투입해야 합니다.\n\n[font=heading-2]전문화된 과학[/font]\n\n우주 탐사에는 네 가지의 분야로 천문학, 생물학, 에너지, 물질이 있으며 그 분야에 맞게 네 가지의 과학 팩도 있습니다. 이들은 모두 데이터 기반으로 만들어지며 실험을 진행하는 과정에 따라 슈퍼컴퓨터에 대한 데이터를 수집하여 점점 더 정확한 생명과 우주, 그리고 모든 모델을 구축해야만 합니다. 그것들은 모두 거의 동일한 기술 수준이므로 개발 순서를 자유롭게 결정할 수 있지만 모든 분야는 새로운 자원들을 필요로 하므로 연구할 과학 분야를 선택하기 전 자신의 태양계 천체들을 확인해 보세요.\n\n[img=item/se-astronomic-science-pack-4] 천문학 과학은 주로 우주 물류에 중점을 둡니다.\n\n[img=item/se-energy-science-pack-4] 에너지 과학은 주로 에너지 생산과 전력 전송 및 첨단 기기에 중점을 둡니다.\n\n[img=item/se-material-science-pack-4] 물질 과학은 중공업 및 직접적 업그레이드에 중점을 둡니다.\n\n[img=item/se-biological-science-pack-4] 생물 과학은 캐릭터의 신체 업그레이드와 의학, 생명 지원, 생물 및 생화학 무기, 생산성에 중점을 둡니다.\n\n[font=heading-2]심우주 과학[/font]\n\n[img=item/se-deep-space-science-pack-1]심우주 과학은 성간 공허, 반물질, 그리고 시공간 왜곡에 중점을 둡니다. +menu_energy_beams=[img=item/se-energy-transmitter-emitter] 에너지 빔 +title_energy_beams=에너지 빔 +page_energy_beams_text_1=[font=heading-2]코로나 질량 방출[/font]\n곳곳의 항성들은 종종 위험한 입자 흐름을 방출해냅니다. 행성이나 위성에 이러한 입자 흐름이 도달하는 일은 그리 드문 일이 아닙니다. 만약 영향을 받는 표면에 당신이 세운 기지가 있다면 이를 대비하기 위해 물품들을 모으고 기지를 분산시키거나, 아니면 대용량 축전지를 모아서 우산 방어 시스템을 고려해야 합니다. 표면이 위협을 받게 될 것이라면 최소 4시간 일찍 조기 경보가 울리게 됩니다. 알려진 위협은 다음과 같습니다. +page_energy_beam_warning_text=[img=virtual-signal/se-star] 경고: __1__를 향한 코로나 질량 방출 감지. 예상되는 방어 요구 사항: 최대 정점 에너지량 __3__ GW, 120초간 __4__ GJ. 남은 예상 시간 __2__초. +page_energy_beams_text_2=[font=heading-2]우산: 에너지 광선 방어[/font]\n에너지 광선 방어 시설인 \"우산\"은 코로나 질량 방출 및 우주에서 날아오는 에너지 광선 무기로부터 보호할 수 있습니다. 자분 입자를 보호용 버블에 부풀려 놓은 다음, 적대적인 에너지 빔을 확산시키기 위해 필요에 따라 다시 정렬하고 뭉치는 방식으로 작동합니다. 작동에 에너지가 필요하며, 기본 전력 사용량은 10MW이지만 에너지 광선의 위력에 따라 점진적으로 증가합니다. 코로나 질량 방출에 대해 지면당 1기로 충분하며, 에너지 빔 공격에 대해 우산 1기는 최대 500GW의 광선 공격을 방어할 수 있습니다. 코로나 질량 방출의 경우, 100% 태양광 강도의 반경 5000의 행성에서의 기본 전력 요구량은 약 160GJ이며, 최대 전력 소비량은 1분 당 2GW입니다. 이는 해당 구역의 태양광 발전 효율에 따라 증가하거나 감소하며, 고체 물체의 경우 기준 반지름 5000을 기준으로 상대적으로 증가하거나 감소합니다. 에너지 광선 방출기의 경우 전력 요구량은 목표값의 에너지 빔 강도의 1/10(효율 손실 후)이 될 것으로 예상됩니다.\n\n[font=heading-2]에너지 방출[/font]\n에너지 광선 방출기는 에너지를 크게 두 가지 방법으로 다른 지면으로 보낼 수 있습니다. 먼 행성 표면에 전력을 공급하는 방법인 \"에너지\" 또는 절단용 광선 무기인 \"글레이브\"입니다. 글레이브 모드에서 광선은 지속적으로 주변 구역을 손상시키지만 경로를 절단하는 대상 표면 위로 이동할 수 있습니다. 빔에 입력되는 에너지에 따라 손상 비율, 면적 및 빔 속도가 증가합니다. \"Auto-Glaive\" 모드에는 자동 대상 선택이 있습니다.\n\n에너지 광선 방출기에는 에너지 광선 빔 챔버를 End-on으로 연결할 수 있는 4개의 연결 지점이 있습니다. 에너지 빔 챔버는 길이 방향으로 연결하거나 긴 가장자리가 짧은 가장자리 중앙과 일치하지만 직접 좌우로 연결할 수는 없습니다. 에너지 빔 인젝터는 에너지 빔 챔버의 측면에 직접 부착하여, 연결된 에너지 빔 방출기의 전력을 증가시킵니다. 광선으로부터 전력을 수집하려면 대상 표면에 에너지 광선 수신기가 있어야 하며, 방출구의 목표를 사용하여 에너지 광선 수신기를 대상으로 선택해야 합니다. 광선이 수신기를 대상으로 삼으면 수신기가 가열됩니다. 열은 측면의 열 연결부에서 열 교환기 및 터빈에 동력을 공급하기 위해 취해질 수 있습니다. +menu_spaceships=[img=virtual-signal/se-spaceship] 우주선 +title_spaceships=우주선 +page_spaceships_text_1=우주선은 포함된 구조물, 물건, 그리고 플레이어를 우주로 발사하고, 태양계 주위를 이동하거나 다른 표면에 착륙할 수 있는 거대하고 강력한 차량입니다.\n\n[font=heading-2]우주선 제작[/font]\n우주선은 자유로운 디자인의 우주선을 만들기 수 있도록 많은 종류의 타일과 더 작은 부품들로 제작됩니다. 당신은 거의 움직이는 작은 기지처럼 우주선을 디자인합니다.\n\n우주선 바닥부터 제작하되, 너무 크게 만들지 마십시오. 처음 몇 개의 우주선은 엄격한 크기 제한이 있고, 제한값은 특정 연구를 완료하여 완화할 수 있습니다. 격벽이 만들어지도록 가장자리에 우주선 벽을 두르고 틈이 없는지 확인합니다(대각선 포함). 그리고 우주선 콘솔을 우주선 내부에 놓으십시오. 이는 우주선의 핵심 부분이고 어떻게 조종하는지가 중요합니다. 콘솔이 배치되면 콘솔이 어떤 부품이 제대로 부착되어 있는지, 어떤 부품이 제대로 들어 있는지, 실행하려고 하면 어떤 부품이 떨어질지 파악하면서 펄스가 일부 발생합니다. 사각형이 빨간색으로 깜박이면 설계에 문제가 있는데, 이 문제는 우주선 콘솔을 확인하여 진단할 수 있습니다. 여러분은 또한 우주선 로켓 부스터 탱크와 우주선 로켓 엔진이 필요합니다. 부스터 탱크는 우주로 가는 데 필요한 연료를 저장하고 VTOL 구성 요소를 제공합니다. 로켓 엔진은 우주에서의 느린 화상이 목적지에 도착하도록 하는 것입니다. 또한 정면(항상 북쪽)의 어떤 형태의 방어도 권장됩니다. 성운에 잔해가 가득하기 때문입니다.\n[font=heading-2]구조 강도[/font]\n초기에는 무결성 저항값의 기술적 한계로 인해 매우 제한된 크기의 우주선만 제작할 수 있을 것입니다. 추가 기술 연구를 통해 더 큰 우주선을 만들 수 있습니다. 구조 강도는 A. 배의 크기와 B. 아이템 적재량 두 가지로 계산됩니다. 총 구조 강도는 하중 증가 요인 중 어느 것이든 두 값이 함께 추가되지 않는 스트레스 요인입니다.\n\n[font=heading-2]효율화[/font]\n이 우주공간은 질긴 성운으로 구성되어 있습니다. 만약 당신이 당신의 우주선을 효율적으로 설계한다면 최대 속도를 최대 30% 정도까지 향상시킬 수 있습니다. 납작한 상자 앞면은 피해야 하지만 쐐기를 박을 필요는 없습니다. 3분의 1까지 또는 당신의 우주선 앞면은 벌칙 없이 평평할 수 있습니다. 원형 모양도 정상이어야 합니다. 무결성 검사를 수동으로 트리거하여 능률화가 어떻게 진행되는지 확인할 수 있습니다.\n\n[font=heading-2]속력[/font]\n선박 속도는 엔진의 추력 대 선박 무게에 기초합니다(통합 응력에 의해 근사치). 엔진은 선박에 넣을 수 있지만 빈 공간을 뒤로 한 배 뒤쪽에 있는 엔진이 더 효과적입니다(약 25% 개선).\n\n[font=heading-2]장거리 운송 활동[/font]\n장거리 여행을 고려할 때, 여러분의 몸이 이동하는 동안 위성 모드에서 많은 것을 할 수 있다는 것에 주목할 필요가 있습니다. 위성 업링크를 통해 원격으로 우주선에 명령을 내릴 수도 있습니다.\n\n[font=heading-2]Crafting Machines[/font]\n[color=#ffaaaa]경고: 우주 공간용으로 고안된 조립 기계는 우주선이 육지에 있을 경우에만 다른 육상 구조물에서 공유하는 요리법을 사용할 수 있을 것입니다. 우주선이 행성에 착륙해 있을 때 우주 기반 제작법이 건물에 지정된다면, 건물 내의 재료는 없어질 것입니다. 일부 지상용 조립 기계는 우주에서 작동할 수 있지만, 우주 공간에서 생산성 모듈을 사용할 수 있는 능력은 잃게 됩니다. 만약 우주선 내부의 지상용 기계에 생산성 모듈을 가진 상태에서 발사된다면, 내부에 있던 생산성 모듈은 파괴됩니다.[/color]\n\n[font=heading-2]우주선 신호[/font]\n우주선 콘솔의 오른쪽 상단 부분은 자체 신호를 출력하기 때문에 메인 구조물과 별도로 와이어로 연결할 수 있습니다.\n[img=item/se-spaceship-console]콘솔 번호는 우주선의 ID를 나타냅니다.\n[img=virtual-signal/signal-speed] 속도 신호는 우주선의 속도를 나타냅니다. 정지된 경우 -1, 정박된 경우 -2입니다.\n[img=virtual-signal/signal-distance] 거리 신호는 선택한 목적지까지의 거리를 나타냅니다. 도착 시 -1, 정박 시 -2, 도착지가 설정되지 않은 경우 -3.\n[img=virtual-signal/se-planet-orbit] 네 번째 신호가 있는 경우 현재 목적지를 나타냅니다.\n[img=virtual-signal/signal-A] 우주선이 정박해 있으면 A 신호로 고정 구역 ID를 나타냅니다.\n\n[font=heading-2]우주선 자동화[/font]\n콘솔의 기본 구조는 다음과 같은 신호 입력을 수용할 수 있습니다:\n[img=virtual-signal/signal-speed] 속도 신호로 목표 속도를 설정하거나 엔진을 작동합니다.\n[img=virtual-signal/se-spaceship-launch]우주선 발사 신호로 발사를 촉발합니다.\n[img=virtual-signal/se-planet-orbit] 목적지 신호는 목적지를 설정합니다. 우주선을 만든 후에 우주 탐색기 측면 패널에서 구역 신호를 볼 수 있습니다.\n우주선이 착륙하게 하려면 콘솔에는 [img=virtual-signal/se-anchor-using-left-clamp] \"우주선 왼쪽 클램프를 사용하여 정박\" 과 [img=virtual-signal/se-anchor-to-right-clamp] \"오른쪽 클램프를 대상으로 정박\" 또는 [img=virtual-signal/se-anchor-using-left-clamp] \"우주선 오른쪽 클램프를 사용하여 정박\" 과 [img=virtual-signal/se-anchor-to-right-clamp] \"왼쪽 클램프를 대상으로 정박\" 중 한 쌍의 앵커 신호가 제공되어야 합니다. 신호 값은 선박의 클램프 값 및 목적지의 클램프 값과 일치해야 합니다. 클램프의 UI를 열어 이러한 값을 확인하고 변경할 수 있습니다. 일치하는 것이 발견되면, 배는 두 개의 클램프를 연결한 상태에서 착륙을 시도할 것입니다. 주의해서 사용하세요. +menu_arcospheres=[img=item/se-arcosphere-a] 아코스피어 +title_arcospheres=아코스피어 +page_arcospheres_text_1=아코스피어는 나노 공학을 통해 얻어낸 나퀴움 결정의 거의 완벽한 형태의 구체입니다. 기원은 거의 알려지지 않았지만, 성간 공간에서 흔하게 발견됩니다.\n\n각각 시공간에서 초차원적인 매듭을 포함하며 작은 작은 4차원 공간 차원과 상호작용을 할 수 있도록 합니다. 구체는 서로 상대적인 움직임을 통해 시공간의 특정 측면을 다룰 수 있도록 편광할 수 있습니다. 특정 아코스피어 묶음을 사용하여 시공간을 더욱 높은 차원으로 왜곡하고 엮을 수 있습니다.\n\n[font=heading-2]사용[/font]\n아코스피어는 게임에서 가장 독특한 제작 과제입니다. 아코스피어는 제작의 도구로 사용되지만, 절대 파괴되지 않으며 단지 바뀔 뿐입니다. 사용시 주요 과제는 보유한 구체를 순환시키면서 특정 유형이 떨어지지 않도록 하는 것입니다. 생산의 균형을 맞추는 방법은 여러 가지가 있지만, 몇 가지 제작 방식이 많은 도움이 될 것입니다. 문제가 발생한다면 Discord를 통해, 혹은 우주 탐사 위키에서 더 많은 정보를 찾아볼 수 있습니다.\n\n[font=heading-2]수집[/font]\n아코스피어는 소행성 구역에서 아코스피어 수집기를 발사하여 발견할 수 있습니다. 반복적인 발사는 수집률을 낮춥니다. 대신 다른 소행성 구역에서 발사한다면 더욱 높은 수집률을 기대할 수 있습니다. +page_arcospheres_text_deep=깊은 성간 공허에서 발견된 아코스피어는 총 [color=cyan]__1__개[/color]이며, 발사된 수집기는 __2__개입니다. +page_arcospheres_text_zone=__1__ 근처에서 발견된 아코스피어는 총 [color=cyan]__2__개[/color]이며, 발사된 수집기는 __3__개입니다. +menu_exploration_journal=[img=item/se-thruster-suit] 탐사 일지 +title_exploration_journal=탐사 일지 +page_journal_title_backstory=불타오르는 알람 소리 +page_journal_text_backstory=나는 작은 우주선의 일부가 내 주위에서 불타는 모습과 낯선 행성에 추락한 나 자신을 발견했다. 내 몸은 멍들고 긁히고 그을려졌지만 그리 심각한 것은 아니었다. 내 머리 부상은 분명히 더 심각했고, 욱신거리는 두통과 함께 불빛도 보이지 않았다. 더 나빴던 것은, 내가 어떻게 여기까지 왔는지, 심지어 건설에 대한 목적의 이름과 희미한 감각을 넘어 내가 누구인지도 잊어버렸다. 그때까지도 무엇을 지어야 할지와 어떻게 지어야 할지가 생각나지 않았다. 처음에 나는 충돌 사고로 머리를 세개 부딫혀서, 그래서 기억은 다시 돌아올거라 생각했는데, 아직도 기억이 돌아오지 않았다. 나의 데이터 기록도 비어 있거나 다시 포맷되어 있어, 나는 다른 이유들을 생각하게 되었다. +page_journal_title_satellite_launch=세상을 보는 눈 +page_journal_text_satellite_launch=나는 드디어 인공위성을 저 높은 궤도로 올려보낼 수 있었다. 인공위성 발사는 분명 내가 가야 할 길을 알려주는 이정표이며 충분히 축하할 만한 일이긴 하지만, 지금도 해야 할 일이 남아 있다. 어쩌면, 이건 단지 시작에 불과할 지도 모른다. +page_journal_title_cargo_launch=무한한 공간 저 너머로 +page_journal_text_cargo_launch=이제 난 우주에 와 있다. 이제 난 그동안 집이라 불리우던 암석 덩어리로부터 오랜 시간 발을 뗄 수 있게 되었다. 하늘이 내게 이리 오라 손짓한다. +page_journal_title_entered_vault=유물 사냥꾼 +page_journal_text_entered_vault=__1__에서 발견한 피라미드 모양 아래에 있는 동굴에 들어가 보니 어둡고 위험한 방 하나를 발견했다. 방에는 두 개의 고대 카르투슈가 있었는데, 하나는 크고 다른 하나는 작았다. 둘 다 다른 원과 선이 함께 표면에 여러 이상한 글자들이 적혀 있었다. 큰 카르투슈의 중앙에 있던 문양은 시스템이 전달하려던 정보 중 가장 중요한 것으로 보였다. 정보가 뭐였든, 여태 내가 알고 있던 것과는 전혀 다른 형태였다. 카르투슈 뒤에는 모듈로 쓰일 만한 강력한 장치가 들어있는, 일종의 돌출 실린더가 있었다. 내가 발견한 이 모듈은 내가 봐왔던 모듈 구조와 너무 달라서, 내 예상대로라면 엄청난 효과를 가져다 줄 지도 모른다. 가까운 행성 곳곳에 이런 구조물이 더 있다면, 그 가치는 충분할 것이다. 이제 유물 탐사를 할 시간이다. +page_journal_title_found_gate=이상 현상 +page_journal_text_found_gate=이상변칙에서 일종의 거대한 고리 모양의 인공물을 발견했다. 멀리서도 난 두 가지의 사실을 즉시 알 수 있었다. 첫 째는 까마득히 오래된 고대 물품이고, 둘 째는 적어도 내가 알고 있는 기술은 아니라는 것이다. 그게 뭐든, 지금은 파괴된 것에 불과하다. +page_journal_title_found_gate_ship=이상변칙 우주선 +page_journal_text_found_gate_ship=상당히 거대한 외딴 우주선의 일부가 고리 모양의 인공물 근처에서 발견되었다. 우주선의 기술은 내가 만든 것과 비슷한데 조금 더... 멋있다. 어쨌든 그 고리 모양과는 다른 기술인건 확실하다. 파편의 패턴은 아마 반으로 잘렸거나, 고리 구조물과 충돌한 것으로 보인다. 조금만 고쳐보면 문제없이 쓸 수 있을 것 같다. +page_journal_title_found_gate_ship_authenticated=이상변칙 우주선 인증 +page_journal_text_found_gate_ship_authenticated=이상변칙 내에 외딴 우주선이 나를 스캔하더니 "내 생체 서명을 인증"했다. 그게 나에 대한 기록이 있다는건지, 아니면 그냥 아무 사이버네틱 인간이 바이터나 대량 학살 로봇보다 더 낫다는건지 그 의미를 잘 모르겠다. 메시지에 따르면 우주선의 에어록 접근 코드를 알아냈고, 코드는 2236067964이다. 우주선 기록에 접근할 수 있지만 대부분의 구역이 분리되거나 크게 손상된 상태였다. +page_journal_title_found_gate_ship_log=이상변칙 우주선 기록 +page_journal_text_found_gate_ship_log_intro=데모다마스 82B: AAI 하이퍼넷 전방 건설함선. 우주선 기록 내용: +page_journal_text_found_gate_ship_log=...'¿s nominal.\n접근 경고: AAI Thyris Gate 17: 은하간 프로토타입 v0.1.93은 기밀 설비입니다. L90 이상의 AI 인증이 필요합니다. 즉시 인증하거나 파기합니다.\n접근 기록: AAI Cybernetic Hypernet Engineer L97 자격 증명 ID__1__로 인증된 AAI Thyris Gate 17에 액세스합니다.\n접근 기록: 개ㅅ¶Ôàtá^...\n...'¿17번 게이트 프로젝터 8번 주파수가 잠겼습니다. 216% 안전 수준의 에너지. 특이성 안정성: 99.4%\nNavigation log: AAI Thyris Gate 17이 투영 벡터 [SV__2__]로 호출됩니다. 예측 대상: Wube Galaxy > Foenestra (비이상, 미탐사) 인¶Ôàtá^...\n...'¿내비게이션 경고: 은하간 하이퍼 튜브(재정의됨).\n내비게이션 경고: 대상에 알려진 하이퍼게이트가 없습니다(재정의됨기).\n보험 경고: 보험 계약이 없습니다. 사용 가능한 계약: 0.\nInformaTron 참고: "무관문 실현"이라는 조건 하에 이용 가능한 보험 계약이 없습니다. 정말 안전한가요? [response.ignore.ignore_always]\n이동 기록: Thyris 이상 징후 입력 > [SV__2__]에 정렬된 AAI Thyris Gate 17 하이퍼튜브\n이동 기록: [SV__2__] 하이퍼 튜브로 이동합니¶Ôàtá^...\n...'¿이동 기록: 위치 업데이트: Tyris 이상 징후, 정렬 [SV__2__], 안정성 98%¶Ôàtá^...\n...'¿이동 로그: Fenestra 이상 징후의 탐색되지 않은 위치에서 하이퍼튜브를 종료합니다..\n경고: 예기치 않은 충돌, 알 수 없는 물체와의 교차점 [4ae4c8d28f2], 물체의 스캔 시작 [4ae4c8d28f2].\n피해 기록: 13.2%의 피해 출처: 알 수 없는 교차 물체와의 충돌로 인한 충격 손상 [4ae4c8d28f2].\n섹션 손상 기록: 손상 보고 섹션: A5, A6, A9, B6, B7, B8, C7. 응답하지 않는 섹션: A7, A8. (86% 신뢰)\n사이버네틱 엔지니어 로그: 생명 신호 99%(34% 신뢰도)\n이동 기록: 회피 기동 RS100LT30을 시도 중입니다.\n이동 기록: 하이퍼튜브 탈출이 오류와 함께 완료됨.\n여행 기록: 위치 업데이트: Foenestra의 탐험되지 않은 이상 현상.\n스캐닝 기록: 거리 -48.76m(99.9% 신뢰도)에서 물체[4ae4c8d28f2] 선명도 0.002m^2에서 스캔 완료.\n스캔 세부 기록: [4ae4c8d28f2] 질량 92.5¶Ôàtá^...\n...'¿뢰도).\n스캔 세부 기록: [4ae4c8d28f2] 구성: 인위적. 나퀴움 34%, 홀뮴 29%, 미지의 합성물 37%(신뢰도 89%)\n스캔 세부 기록: [4ae4c8d28f2] 크기: 대략적인 원기둥 68¶Ôàtá^...\n...'¿부 기록: [4ae4c8d28f2] 에너지 시그니쳐: 플럭스 54Gwb, 방사선 프로파일 2.8kJ/1.7MJ/1.6MJ/0.62J, Lux 프로파일 5.86GJ [051e376392b8d3f8]. (98% 신뢰도).\n스캔 세부 기록: [4ae4c8d28f2] 식별자: 인공 시공, 알 수 없는 제조업체, 설명: 결절이 있는 근사 링, 옥타드. (0.3% 신뢰도)\n스캔 세부 기록: [4ae4c8d28f2] 구조 공정 능력 추정: 하이퍼게이트(신뢰도 47%). 기타: 무기 42%, 에너지 35%, 연산 17%, 스캐닝 12%, 산업 9%, 우주선 7%, 서식지 2%.\n손상 기록: 68.2%의 손상. 무결성 오류, 섹션이 분리되고 있습니다. 출처: [4ae4c8d28f2] 물체와의 충돌로 인한 2차 압력 파동.\n섹션 손상 기록: 원자로 위험. 손상을 보고하는 섹션: D5, E4, E5, E6, F5. 섹션이 응답하지 않습니다: A1, A2, A3, A¶Ôàtá^...\n...'¿le l그: 예상 셔틀 2의 비상 잠금 해제. 궤적 예측: 칼리더스 > 나비스.\n손상 기록: 91.7%% 손상. 무결성 오류, 섹션이 부îÄïmïŸ... +page_journal_title_spaceship_victory=우주선 승리 +page_journal_spaceship_victory=나는 아주 빠르고 강력한 우주선을 만들었고, 왜곡 드라이브를 활성화했다. 드라이브가 실제 초광속 상태로 안정화되는 데 대략 60초가 걸렸지만 일단 완성되면 멀리 떨어진 은하계로 나아가 집으로 돌아오는 여정을 위해 동면에 들어갈 것이다. 내가 처음부터 내 손으로 이루어낸 이 성간에 나의 발자국을 남긴다. 이 거대한 우주 공간에, 내가 남기고 떠난 발자국은 영원히 기억될 것이다. +page_journal_title_gate_victory=고대 관문 승리 +page_journal_gate_victory=고대 은하계의 관문인 이 거대한 고리 인공물에 나의 모든 능력을 쏟아부어 결국 수리하는 데 성공했다. 이 심판의 격자에 나의 독창성을 불어넣어 마침내 작동시키는 데에 성공했다. 왜곡장을 근처 항성에 고정시키고 숫자가 아닌 글리프 좌표계를 디코딩하여 다이얼링 시스템을 역설계했다. 이런 외계 물건들이 나의 생각을 뒤틀어놓으려 했지만, 나는 결국 집으로 가는 관문을 열었다. 찰나의 순간으로, 이제 저 머나먼 은하계, 나의 집으로 떠난다. 내가 처음부터 내 손으로 이루어낸 이 성간에 나의 발자국을 남긴다. 이 거대한 우주 공간에, 내가 남기고 떠난 발자국은 영원히 기억될 것이다. +menu_archeology=[img=entity/se-pyramid-a] 고고학 +title_archeology=고고학 +page_archeology_text_1=커다란 기하학적 구조물을 발견하였습니다. 그 결과, 총 [color=cyan]__1__[/color]개 행성에서 이와 동일한 구조물이 발견되었으며, 각 위치는 다음과 같습니다: +page_archeology_text_2=위성을 통해 보려면 항목을 클릭하십시오. +menu_starmapping=[img=technology/se-zone-discovery-random] 우주 지도 제작 +title_starmapping=우주 지도 제작 +page_starmapping_text_1=우주 지도 제작은 [img=technology/se-long-range-star-mapping] [color=cyan]장거리 우주 지도 제작[/color] 기술을 반복적으로 연구하여 이루어집니다. 이 연구는 다른 은하로부터 흥미로운 항성 패턴을 찾아냅니다. 실제 사용하느냐고요? 아마, 아닐겁니다.\n\n좌표는 우주배경복사를 기준으로 정렬된 표준 벡터 (SV) 형식으로 제공됩니다.\n\n지금까지 제작된 구역에서 주목할 만한 패턴은 [color=cyan]__1__[/color]개입니다. +technology-unlocked=새로운 기술 잠금이 해제되어 현재 기술 트리에 있습니다. __1__ __2__ +universe-resources-changed-warning=[img=utility/danger_icon] [color=red]모든 자원이 새로운 설정에 따라 조정되었습니다. 이 과정은 매우 파괴적이지만, 모드 업데이트로 인해 발생한 문제는 불가피합니다. 실수로 모드를 추가하거나 제거하여 발생한 경우, 절대로 게임을 저장하지 마세요.[/color] +starmapping-found-constellation=먼 거리에 있는 별자리가 __1__와 일치합니다, [img=virtual-signal/informatron] 인포매트론에 좌표가 저장되었습니다. +starmapping-found-constellation-informatron=[SV __2__] 좌표에서 [font=heading-1]__1__[/font] +gate-portal-coordinates=왜곡 벡터 분석: [SV __1__] +discovered-glyph-vault=[img=item/satellite] 내비게이션 위성: __1__에서 기하학적 구조물이 감지되었습니다. +beacon-overload=신호기 과부하 +beacon-overload-ended=신호기 과부하 해제 +lifesupport_title=[img=item/se-lifesupport-equipment-1] 생명 유지 +lifesupport_efficiency_spacesuit=생명 지원 효율: __1__ +lifesupport_efficiency_no_spacesuit=생명 지원 효율: __1__ (우주에서 0%). +lifesupport_suit=아머 지속 시간: __1__초 +lifesupport_reserves=인벤토리 지속 시간: __1__초 +lifesupport_suit_est=아머 지속 시간: (우주에서) __1__초 +lifesupport_reserves_est=인벤토리 지속 시간: (우주에서) __1__초 +lifesupport_environment_space=환경: 우주 +lifesupport_environment_spaceship-interior=환경: 우주선 내부 (지원 필요 없음) +lifesupport_environment_planet=환경: 행성 (지원 필요 없음) +lifesupport_environment_moon=환경: 위성 (지원 필요 없음) +lifesupport_environment_plague-planet=환경: 역병 퍼진 행성 +lifesupport_environment_plague-moon=환경: 역병 퍼진 위성 +lifesupport_environment_unknown=환경: 보호됨 +player_track_glyphs=[img=item/satellite] 위성이 유사한 구조를 찾았습니다. +page_archeology_pyramid_link=[img=entity/se-pyramid-b] 기하학적 구조물 감지: __1__ __2__ +discovery_look_for_resource_caption=__1__\n__2__ +discovery_look_for_resource_tooltip=이 자원을 찾는 데 집중하세요. +comma_separate=__1__, __2__ +placement_restriction_line=[font=default-bold][color=#f5cb48]다음 위에 배치 불가: __1__[/color][/font]\n__2__ +collision_mask_water=물 +collision_mask_land=땅 +collision_mask_space_platform=우주 플랫폼 +collision_mask_spaceship=우주선 +structure_name_grounded=__1__ (땅) +structure_name_spaced=__1__ (우주) +structure_description_grounded=__1__\n[color=#ff0000]지상에 있는 동안 일부 제작법은 비활성화됩니다.[/color] +structure_description_spaced=__1__\n[color=#ff0000]우주에서는 생산성 모듈을 사용할 수 없습니다.[/color] +tile_warning=[color=red]개체 아래의 타일을 변경할 경우 개체가 삭제될 수 있습니다.[/color] +please-consider-patreon=[font=heading-1]우주 탐사 모드를 즐기고 계신가요? Patreon에서 저를 지원해주세요:[color=#f5cb48]https://www.patreon.com/earendel[/color][/font]\n후원해주신 분들은 게임 내에서 자신만의 디자인으로 이루어진 행성이나 위성을 가질 수 있습니다. +delivery_cannon_label_energy=에너지: __1__ +delivery_cannon_label_payload=탑재량: __1__ +delivery-cannon-coordinates-set=배달 좌표가 [X:__1__ Y:__2__] 좌표로 설정되었습니다. [__CONTROL__se-remote-view__] 키를 눌러 위성 모드를 종료합니다. +unit-capsule=유닛 캡슐 (__1__) +climate_water_none=물 없음 +climate_water_low=웅덩이 +climate_water_med=호수 +climate_water_high=바다 +climate_water_max=대해 +climate_moisture_none=사막 +climate_moisture_low=건조 +climate_moisture_med=적당한 습기 +climate_moisture_high=높은 습기 +climate_moisture_max=극단적인 습기 +climate_aux_very_low=무미건조 +climate_aux_low=특이 지형 +climate_aux_med=다채로움 +climate_aux_high=매우 다채로움 +climate_aux_very_high=극단적인 다채로움 +climate_temperature_bland=온난함 +climate_temperature_temperate=온대 +climate_temperature_midrange=온대 +climate_temperature_balanced=따뜻함과 시원함 +climate_temperature_wild=뜨거움과 차가움 +climate_temperature_extreme=불과 얼음 +climate_temperature_cool=시원함 +climate_temperature_cold=차가움 +climate_temperature_vcold=혹한 +climate_temperature_frozen=냉대 +climate_temperature_warm=따뜻함 +climate_temperature_hot=뜨거움 +climate_temperature_vhot=그을림 +climate_temperature_volcanic=화산지대 +climate_trees_none=나무 없음 +climate_trees_low=나무 적음 +climate_trees_med=나무 많음 +climate_trees_high=숲 +climate_trees_max=거대한 숲 +climate_cliff_none=평지 +climate_cliff_low=평탄 +climate_cliff_med=구릉 +climate_cliff_high=협곡 +climate_cliff_max=산악 +climate_homeworld=고향 행성 (맞춤형 기후) +energy_transmitter_gui_title=[img=entity/se-energy-transmitter-emitter] 에너지 빔 +energy_transmitter_label_transfer=방출기 강도: __1__ +energy_transmitter_label_efficiency=전송 효율: __1__ +energy_transmitter_label_efficiency_atmo=전송 효율: __1__ (대기에서 -50%) +energy_transmitter_label_off=꺼짐 +energy_transmitter_tooltip_off=빔을 끕니다 +energy_transmitter_label_energise=전력 공급 +energy_transmitter_tooltip_energise=에너지를 에너지 수속기로 전달합니다 +energy_transmitter_label_glaive=글레이브 +energy_transmitter_tooltip_glaive=에너지를 기반으로 하는 대상 지정 및 이동, 피해 및 이동이 가능한 빔 무기입니다. +energy_transmitter_label_auto_glaive=글레이브 자동화 +energy_transmitter_tooltip_auto_glaive=탐색 및 파괴 프로그램을 활용해 에너지 기반의 피해를 줍니다 +energy-transmitter-coordinates-set=빔 좌표가 [X:__1__ Y:__2__] 좌표로 설정되었습니다. [__CONTROL__se-remote-view__] 키를 눌러 위성 모드를 종료합니다. +energy-transmitter-no-enemies-found=글레이브 자동화가 적을 찾을 수 없었습니다. 이미터 __1__이/가 비활성화됩니다. +alert-cme-eta=[img=virtual-signal/se-star] 경고: __1__(으)로 향하는 코로나 질량 방출이 감지됩니다. 남은 시간은 __2__초 입니다.\n자세한 내용은 [img=virtual-signal/informatron] 인포매트론 [__CONTROL__informatron__] 을 참조하세요. +alert-cme-arrived=[img=virtual-signal/se-star] [color=red]경고: __1__(으)로 향하는 코로나 질량 방출이 감지되었습니다![/color] +alert-cme-stream=[img=virtual-signal/se-star] __1__에서 코로나 질량 방출이 감지됩니다. +alert-cme-passed=[img=virtual-signal/se-star] 코로나 질량 방출이 끝났습니다. +no-coordinates-set=좌표를 설정하지 않았습니다. +satellite-required=위성이 필요합니다. +probe_invalid_launch_star=잘못된 발사 위치: [img=item/se-star-probe] 항성 탐사선은 가까운 항성 궤도에서 발사해야 합니다. +probe_invalid_launch_belt=잘못된 발사 위치: [img=item/se-belt-probe] 소행성 구역 탐사선은 소행성 구역에서 발사되어야 합니다. +probe_invalid_launch_field=잘못된 발사 위치: [img=item/se-void-probe] 성간 공허 탐사선은 소행성 구역에서 발사되어야 합니다. +arcosphere_collector_invalid_launch=잘못된 발사 위치: [img=item/se-arcosphere-collector] 성간 공허 탐사선은 소행성 구역에서 발사되어야 합니다. +charge-mode-fast=고속 충전 모드: 대기 전력 감소, 최대 전력 소모 증가, 버퍼 용량 증가. 파워 스파이크를 조심하십시오. +charge-mode-normal=일반 충전 모드: 최대 전력 소모 감소, 대기 전력 증가, 버퍼 용량 증가. +menu_coordinate_logs=[img=entity/se-glyph-a-energy-47] 좌표 기록 +title_coordinate_logs=좌표 기록 +page_coordinate_logs_text_1=해당 좌표와 함께 유물에서 시도된 글리프 시퀀스의 기록입니다. 내림차순으로 정렬됩니다 (가장 위의 항목이 최신 항목입니다).\n\n좌표는 우주배경복사를 기반으로 정렬된 표준 벡터 (SV) 형식으로 제공됩니다. +page_coordinate_logs_button_clear_caption=[img=virtual-signal/se-remove] 기록 지우기 +page_coordinate_logs_text_empty=최근 좌표 기록을 지웠습니다. +page_coordinate_logs_glyph_entry=__1__: SV +victory-message-spaceship=[font=heading-1]넥서스 왜곡 드라이브가 임계 속도 (250)에 도달했습니다.\n[color=#f5cb48]축하합니다, 우주 탐사 승리 조건인 \"우주선\"을 달성하셨습니다![/color][/font]\n이곳저곳 여행하는 것이 즐거우셨다면 Patreon에서 저를 지원해주세요: [color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-spaceship-player=[color=#f5cb48]우주선 승리: [/color] [img=virtual-signal/informatron] 탐사 일지 [__CONTROL__informatron__]가 갱신되었습니다. +victory-message-gate=[font=heading-1]포탈이 안정화되었으므로 집으로 돌아갈 수 있습니다.\n[color=#f5cb48]축하합니다, 당신은 우주 탐사 승리 조건인 \"고대 관문\"을 달성하셨습니다![/color][/font]\n이 독특한 길의 발견이 즐거우셨다면 Patreon에서 저를 지원해주세요: [color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-gate-player=[color=#f5cb48]고대 관문 승리: [/color] [img=virtual-signal/informatron] 탐사 일지 [__CONTROL__informatron__]가 갱신되었습니다. +arcosphere-random=이 제작법은 간혹 같은 이름의 대체 제작법으로 전환됩니다. 아코스피어 출력은 사실상 무작위로 지정되지만 출력되는 아코스피어의 수량은 입력과 일치하도록 보장됩니다. +ruin=유적 +mysterious-structure=불가사의한 구조물 +interburbulator_fail_easy_1=아니야. +interburbulator_fail_easy_2=좀 더 노력해 봐. +interburbulator_fail_easy_3=가망이 없군. +interburbulator_fail_easy_4=그건 아냐. +interburbulator_fail_easy_5=진짜 그게 답이라 생각해? +interburbulator_fail_easy_6=틀렸어. +interburbulator_fail_easy_7=산소가 부족하신가요? +interburbulator_fail_easy_8=부정한다. +interburbulator_fail_easy_9=부정적이군요. +interburbulator_fail_easy_10=좀 더 생각을 해. +interburbulator_fail_easy_11=잘못된 답이야. +interburbulator_fail_easy_12=약간 더 보간해 봐. +interburbulator_fail_easy_13=계속 해 봐. +interburbulator_fail_easy_14=잘 좀 해봐, 인간. +interburbulator_fail_easy_15=혹시 이게 재밌기라도 한거야? +interburbulator_fail_easy_16=난 더 많은걸 기대했어. +interburbulator_fail_easy_17=먼저 생각이란 걸 해 봐. +interburbulator_fail_easy_18=네가 받을 보상들을 생각해 보라고. +interburbulator_fail_easy_19=얼마든지 기다려주지. +interburbulator_fail_easy_20=인내가 곧 미덕일지니. +interburbulator_fail_easy_21=무례하게 굴려는 것이 아닙니다. +interburbulator_fail_easy_22=물고기가 레벨 3에 도달했습니다. +interburbulator_fail_easy_23=지금 막 온갖 것들을 다 대입해보는거지, 응? +interburbulator_fail_easy_24=너의 그 꿈틀거리는 머리 컴퓨터를 잘 굴려 봐. +interburbulator_fail_easy_25=신경망에 뭐 거미줄만 있는거야? +interburbulator_fail_easy_26=원한다면, 같이 휴식시간을 가져볼 수도 있어. +interburbulator_fail_easy_27=저는 행성만한 생각을 가지고 있어요. +interburbulator_fail_easy_28=정말로, 그게 답이라 생각해? +interburbulator_fail_easy_29=끊임없이 실패했다고 화를 낼 필요는 없어. +interburbulator_fail_easy_30=저는 훌륭한 참가자를 기다리고 있습니다. +interburbulator_fail_easy_31=도움이 필요하면, 녹색 회로에게 물어 봐. +interburbulator_fail_easy_32=난 너의 그 대량 학살에 대해 비난하고 싶지 않아. 난 위선자가 아니거든. +interburbulator_fail_easy_33=전 제가 지시사항을 올바르게 번역했다 믿습니다. +interburbulator_fail_easy_34=벡터는 방향과 크기 모두 정의할 수 있어. +interburbulator_fail_easy_35=당신은 공해가 바이터들을 화나게 하는 것을 좋아하지 않나요? +interburbulator_fail_easy_36=당신의 ... 생물학 ... 전자 공학에 관한 어떤 것도 이해할 수 없군요. +interburbulator_fail_easy_37=중간지점은 오른쪽 상단과 왼쪽 하단 사이입니다. +interburbulator_fail_easy_38=당신의 전송 일부를 학습했습니다. ; it's not spying if you broadcast it like that. +interburbulator_fail_easy_39=정규화된 벡터의 길이는 1이며, 종종 방향을 나타내기 위해 사용됩니다. 심지어 여러분의 생활에서도요. +interburbulator_fail_mixed_1=아깝지도 않았어. +interburbulator_fail_mixed_2=완전히 틀렸습니다. +interburbulator_fail_mixed_3=계속 하시려구요? +interburbulator_fail_mixed_4=신경 젤이 새었나요? +interburbulator_fail_mixed_5=나는 인간이 무수하다고 들었었습니다. +interburbulator_fail_mixed_6=인터페이스가 오작동하고 있습니까? +interburbulator_fail_mixed_7=지능 증폭이 필요할 듯합니다. +interburbulator_fail_mixed_8=문제를 제대로 이해한 것이 맞습니까? +interburbulator_fail_mixed_9=되는대로 입력한 것은 아니겠죠? +interburbulator_fail_offgrid_1=정말 끔찍하군요. +interburbulator_fail_offgrid_2=그리드에 있지도 않습니다. +interburbulator_fail_offgrid_3=그리드를 완전히 놓치셨습니다. +interburbulator_fail_offgrid_4=적어도 그리드에 있어야 합니다. +interburbulator_fail_offgrid_5=노란색 점이 그리드에 없으면... 그것은 정말 나쁜 징조입니다. +interburbulator_fail_offgrid_6=적어도 그리드에 있어야 합니다. +interburbulator_fail_offgrid_7=대상은 그리드의 외부가 아닌, 내부에 있어야 합니다. +interburbulator_fail_offgrid_8=그리드 내부에 있지 않았습니다. 인간, 뭐 하는 거예요? +interburbulator_fail_offgrid_9=그리드를 향해주세요. +interburbulator_fail_offgrid_10=그리드는 사각형으로 이루어진 비트입니다. +interburbulator_success_freeplay_1=잘했어요. +interburbulator_success_freeplay_2=훌륭합니다. +interburbulator_success_freeplay_3=해내셨습니다. +interburbulator_success_freeplay_4=어려운 것이었나요? +interburbulator_success_freeplay_5=목표 달성. +interburbulator_success_repeat_1=좋습니다, 하지만 이미 완료한 과제였군요. +interburbulator_success_repeat_2=또 해내셨군요! +interburbulator_success_repeat_3=처음보다 쉬웠죠? +interburbulator_success_repeat_4=좋습니다, 하지만 보상은 두 번 받을 수 없어요. +interburbulator_success_repeat_5=잘했어요, 여기 당신 상을... 앗, 이미 가지고 있으시군요. +interburbulator_success_repeat_6=당신은 전에 이 일을 완성했던 바로 그 인간이죠? 구별하기 너무 어려워요. +interburbulator_success_prize_1=맞았군요. 여기 보상이 있... 버블스는 작은 물고기치고 아주 용감했지만, 정작 퍼즐에서는 최고가 아니였죠. +interburbulator_success_prize_2=그래, 인간 너는 참 빠르게 배우는 것 같군. 이 상은 너가 지식을 얻는 데 도움이 되어 줄거야. +interburbulator_success_prize_3=훌륭하군. 이 상이 이 도전보다 훨씬 더 '중요하게' 여기길 바랄게. +interburbulator_success_prize_4=올바릅니다. 당신은 이제 제 존경심을 얻으셨습니다, 인간. 여기, 내 게임을 해킹하려던 배신자의 시체를 줄게요. +interburbulator_success_prize_5=목표 달성, 바로 여기에 매우 편안한 보상이 있습니다. 에너지 효율은 중요합니다. +interburbulator_success_prize_6=아주 좋습니다, 여기에 보상이 있습니다. 이것이 당신에게 큰 도움이 될지는 모르겠지만, 저에게는 아침에 일어나는 데 정말 도움이 됩니다. +interburbulator_success_prize_7=대단해, 보상을 받아가. 난 이걸로 연구하는 것을 정말 좋아해, 창의력에도 큰 도움이 되거든. +interburbulator_success_prize_8=환상적입니다, 여기 보상이 있습니다. 전에 이걸 보셨는지 모르겠지만, 저는 그냥 신호기 주변에 서 있는 게 좋아요. +interburbulator_success_prize_9=축하합니다, 보상이 바로 여기에 있습니다. 이러한 회로는 매우 가치 있고 만들기 어렵습니다. +interburbulator_success_prize_10=정말이지 아주 인상적인 인간이야. 여기, 아코스피어는 내가 가장 아끼는 물건이야. 더 많이 만들 수는 없으니, 잃어버리지 않게 조심하라고. +interburbulator_freeplay_unlocked=당신은 이 일의 요령을 터득하고 있어요. 여러분만의 퍼즐을 만들 수 있도록 자유플레이를 풀어드리겠습니다. +interburbulator_deny_freeplay_1=자유플레이를 해금해야 합니다. +interburbulator_deny_freeplay_2=그건 부정행위야. +interburbulator_deny_freeplay_3=퍼즐을 바꾸지 마. +interburbulator_deny_freeplay_4=챌린지 5개를 클리어하면 변경할 수 있게 됩니다. +interburbulator_deny_freeplay_5=내 기계를 해킹하려는 거예요? +interburbulator_deny_freeplay_6=그저 "시도"만 해주세요 +interburbulator_caption_prize=보상: __1__ __2__ __3__ __4__ +interburbulator_caption_claimed=(수령함) +interburbulator_speak=[color=red]브론티온: __1__[/color] +interburbulator_robot_name=브론티온 +interburbulator_introduction=Interburbul은 Brontion Burbulator 33027756에 의해 만들어진 게임입니다. 목표는 Brontion이 선택한 강조 표시된 셀에 투영하는 3D 벡터를 추측하는 것입니다. 그리드 안쪽 3개 코너의 3D 벡터가 주어집니다. 이 포인트는 3D 평면을 설명하고, 추측은 원점 {0,0,0}에서 해당 평면에 투영됩니다. 점점 어려워지는 10개의 도전을 각각 완료할 때마다 보상을 획득할 수 있습니다. 5개의 도전을 해결하여 자유플레이 모드를 해제하고 자신만의 도전 과제를 설정할 수 있습니다. +interburbulator_random=무작위 +interburbulator_freeplay=자유플레이 +interburbulator_game_title=인터버뷸 플레이 +interburbulator_grid_size=그리드 크기: +interburbulator_target_cell=대상 셀: +interburbulator_top_left=좌측 상단 +interburbulator_top_right=우측 상단 +interburbulator_bottom_left=좌측 하단 +interburbulator_attempt=시도 +interburbulator_attempt_limited=시도 (__1__/__2__) +interburbulator_attempt_locked=시도 (잠김) +interburbulator_submit=시도 제출 +interburbulator_greeting=거기 인간, 이곳에서 내가 만든 게임을 해 봐. 난 __2__ 시스템의 __1__에 있어. +interburbulator_challenge_locked_1=나중에 다시 시도하세요. +interburbulator_challenge_locked_2=지금까지의 모든 시도를 사용했습니다. +interburbulator_challenge_locked_3=다시 시작하기 전에 잠시만 기다려주세요. +interburbulator_challenge_locked_4=20초 후에 다시 시도하세요. +interburbulator_challenge_locked_5=20초를 기다리면 다음 도전이 열립니다. +interburbulator_challenge_locked_6=도전은 20초동안 잠깁니다. +cannot_do_via_satellite=원격으로 완료할 수 없습니다. +scan-progress-update=__1__의 표면 스캔 진행중: X __2__ Y __3__ +out_of_reach=도달 범위 밖입니다 +capturable=포착 가능 +touch-to-capture=캡쳐하려면 터치하세요. +capture-blocked=적대세력에 의해 캡쳐하는 것이 막혔습니다. +suffix_ruin=__1__ 폐허 + +[damage-type-name] +cold=냉기 +suffocation=질식 +meteor=운석 + +[entity-name] +se-linked-container=아코링크 보관함 +vase=꽃병 +wooden-barrel=나무 배럴 +furnace-ruin=무너진 돌더미 +workshop-ruin=무너진 작업소 +iron-wood-chest=오래된 상자 +iron-wood-chest-remnants=무너진 오래된 상자 +stone-rubble=돌 잔해 +se-gate-blocker=불안정한 공간 +se-gate-blocker-void=불안정한 공간 +destroyed-cargo-pod=파괴된 화물 포드 +meteorite=운석 +rocket-silo=위성 로켓 격납고 +rocket-fragment=로켓 파편 +se-antimatter-reactor=반물질 반응로 +se-beryllium-ore=녹주석 +se-cargo-rocket-cargo-pod=화물 포드 +se-cryonite=크라이오나이트 +se-condenser-turbine=콘덴서 터빈 +se-condenser-turbine-tank=콘덴서 터빈 +se-condenser-turbine-generator=콘덴서 터빈 +se-core-fragment-processor=심층 파편 처리 시설 +se-core-miner=심층 채광 드릴 +se-core-miner-drill=심층 채광 드릴 +se-cryogun-ice=빙벽 +se-dimensional-anchor=차원 정박기 +se-electric-boiler=전기 보일러 +se-fluid-burner-generator=유체 이온 발전기 +se-fuel-refinery=연료 정제소 +se-gate-fragment=유물 파편 +se-holmium-ore=홀미나이트 +se-iridium-ore=이리다이트 +se-meteor-defence-container=운석 방어 장치 +se-meteor-defence-charger=운석 방어 장치 +se-meteor-point-defence-container=운석 국지방어 장치 +se-meteor-point-defence-charger=운석 국지방어 장치 +se-meteor-point-defence-charger-overcharged=운석 국지방어 장치 - 고속 충전 모드 +se-methane-ice=메탄 얼음 +se-naquium-ore=나퀴나이트 +se-pulveriser=분쇄기 +se-rocket-launch-pad=화물 로켓 격납고 +se-rocket-launch-pad-tank=화물 로켓 격납고 +se-rocket-launch-pad-silo=화물 로켓 격납고 +se-rocket-launch-pad-combinator=화물 로켓 격납고 +se-rocket-launch-pad-_-seat=화물 로켓 격납고 +se-rocket-launch-pad-settings=화물 로켓 격납고 +se-rocket-landing-pad=화물 착륙 패드 +se-space-accumulator=홀뮴 축전지 +se-space-accumulator-2=나퀴움 축전지 +se-space-astrometrics-laboratory=천문학 실험실 +se-space-biochemical-laboratory=생화학 실험실 +se-space-assembling-machine=우주 조립 기계 +se-space-capsule-_-vehicle=우주 캡슐 +se-space-curved-rail=우주 철도 +se-space-decontamination-facility=오염 제거 시설 +se-space-electromagnetics-laboratory=전자기학 실험실 +se-space-genetics-laboratory=유전학 실험실 +se-space-growth-facility=성장 시설 +se-space-gravimetrics-laboratory=중력학 실험실 +se-space-hypercooler=초냉각기 +se-space-laser-laboratory=레이저 실험실 +se-lifesupport-facility=생명 지원 시설 +se-space-manufactory=우주 제조소 +se-space-material-fabricator=소재 제작기 +se-space-mechanical-laboratory=기계학 실험실 +se-space-particle-accelerator=입자 가속기 +se-space-particle-collider=입자 충돌기 +se-space-plasma-generator=플라즈마 발전기 +se-space-radiation-laboratory=방사선 실험실 +se-space-radiator=방열기 +se-space-radiator-2=방열기 2 +se-recycling-facility=재활용 시설 +se-space-pipe=우주 파이프 +se-space-pipe-long=긴 우주 파이프 +se-space-pipe-long-straight=긴 직선 우주 파이프 __1__ +se-space-pipe-long-junction=긴 접합부 우주 파이프 __1__ +se-space-pipe-to-ground=우주 지하 파이프 +se-space-science-lab=우주 과학 연구소 +se-space-solar-panel=평면 태양 전지판 +se-space-solar-panel-2=평면 태양 전지판 2 +se-space-solar-panel-3=평면 태양 전지판 3 +se-space-spectrometry-facility=분광 시설 +se-space-straight-rail=우주 철도 +se-space-supercomputer-1=슈퍼 컴퓨터 +se-space-supercomputer-2=양자 슈퍼 컴퓨터 +se-space-supercomputer-3=신경학적 슈퍼 컴퓨터 +se-space-supercomputer-4=심층 슈퍼 컴퓨터 +se-space-telescope-radio=전파 망원경 +se-space-telescope-microwave=마이크로파 망원경 +se-space-telescope=망원경 +se-space-telescope-xray=X선 망원경 +se-space-telescope-gammaray=감마선 망원경 +se-space-thermodynamics-laboratory=열역학 실험실 +se-space-splitter=우주 분배기 +se-space-transport-belt=우주 운송 벨트 +se-space-underground-belt=우주 지하 벨트 +se-spaceship-antimatter-engine=우주선 반물질 엔진 +se-spaceship-antimatter-booster-tank=우주선 반물질 부스터 탱크 +se-spaceship-console=우주선 계기판 +se-spaceship-console-output=우주선 계기판 신호 출력부 +se-spaceship-console-alt=손상된 우주선 계기판 +se-spaceship-gate=우주선 문 +se-spaceship-obstacle=우주 쓰레기 +se-spaceship-rocket-engine=우주선 로켓 엔진 +se-spaceship-rocket-booster-tank=우주선 로켓 부스터 탱크 +se-spaceship-wall=우주선 벽 +se-water-ice=워터 아이스 +se-vitamelange=비타멜란지 +se-vulcanite=벌카나이트 +small-asteroid=작은 소행성 +se-gate-part=유물 조각 +se-gate-platform-scaffold=유물 감별기 +se-gate-lock-switch=움직일 수 있는 요소 +se-gate-lock-combinator=조합기 연결체 +se-gate-platform=유물 증강 플랫폼 +se-gate-platform-combinator=조합기 연결체 +se-gate-energy-interface=동력 플랫폼 +se-gate-platform-button-switch=버튼 +se-gate-tank-input=유체 입력부 +se-gate-tank-output=유체 출력부 +se-pyramid-a=기하학적 구조물 +se-pyramid-b=기하학적 구조물 +se-pyramid-c=기하학적 구조물 +se-cartouche-a=카르투슈 +se-cartouche-b-a=카르투슈 +se-cartouche-b-b=카르투슈 +se-cartouche-chest=고대 보관함 +se-glyph=글자 +glyph=글자 +se-gate-addon=유물 증강 +se-gate-platform-button-middle=정지 +se-gate-platform-button-left=왼쪽 +se-gate-platform-button-right=오른쪽 +beacon=기본 신호기 +se-wide-beacon=광역 신호기 +se-wide-beacon-2=광역 신호기 2 +se-supercharger=초고속 충전기 +se-addon-power-pole=부속 전신주 +se-pylon=송전탑 +se-pylon-substation=변전 송전탑 +se-pylon-construction=건설 송전탑 +se-pylon-construction-roboport=건설 송전탑 +se-pylon-construction-radar=레이더 건설 송전탑 +se-pylon-construction-radar-roboport=레이더 건설 송전탑 +se-pylon-construction-radar-radar=레이더 건설 송전탑 +se-shield-projector=보호막 프로젝터 +se-shield-projector-shield-floor-east=에너지 보호막 +se-shield-projector-shield-floor-north=에너지 보호막 +se-shield-projector-shield-floor-northeast=에너지 보호막 +se-shield-projector-shield-floor-northwest=에너지 보호막 +se-shield-projector-shield-floor-south=에너지 보호막 +se-shield-projector-shield-floor-southeast=에너지 보호막 +se-shield-projector-shield-floor-southwest=에너지 보호막 +se-shield-projector-shield-floor-west=에너지 보호막 +se-shield-projector-shield-wall-east=에너지 보호막 +se-shield-projector-shield-wall-north=에너지 보호막 +se-shield-projector-shield-wall-northeast=에너지 보호막 +se-shield-projector-shield-wall-northwest=에너지 보호막 +se-shield-projector-shield-wall-south=에너지 보호막 +se-shield-projector-shield-wall-southeast=에너지 보호막 +se-shield-projector-shield-wall-southwest=에너지 보호막 +se-shield-projector-shield-wall-west=에너지 보호막 +se-shield-projector-barrier=에너지 보호막 +se-naquium-heat-pipe=나퀴움 열 파이프 +se-naquium-heat-pipe-horizontal=나퀴움 열 파이프 수평 +se-naquium-heat-pipe-vertical=나퀴움 열 파이프 수직 +se-naquium-heat-pipe-long=긴 나퀴움 열 파이프 __1__ +se-deep-space-transport-belt=심우주 운송 벨트 +se-deep-space-transport-belt-black=검은색 심우주 운송 벨트 +se-deep-space-transport-belt-white=흰색 심우주 운송 벨트 +se-deep-space-transport-belt-red=빨간색 심우주 운송 벨트 +se-deep-space-transport-belt-yellow=노란색 심우주 운송 벨트 +se-deep-space-transport-belt-green=초록색 심우주 운송 벨트 +se-deep-space-transport-belt-cyan=시안색 심우주 운송 벨트 +se-deep-space-transport-belt-blue=파란색 심우주 운송 벨트 +se-deep-space-transport-belt-magenta=마젠타색 심우주 운송 벨트 +se-deep-space-underground-belt=심우주 지하 벨트 +se-deep-space-underground-belt-black=검은색 심우주 지하 벨트 +se-deep-space-underground-belt-white=흰색 심우주 지하 벨트 +se-deep-space-underground-belt-red=빨간색 심우주 지하 벨트 +se-deep-space-underground-belt-yellow=노란색 심우주 지하 벨트 +se-deep-space-underground-belt-green=초록색 심우주 지하 벨트 +se-deep-space-underground-belt-cyan=시안색 심우주 지하 벨트 +se-deep-space-underground-belt-blue=파란색 심우주 지하 벨트 +se-deep-space-underground-belt-magenta=마젠타색 심우주 지하 벨트 +se-deep-space-splitter=심우주 분배기 +se-deep-space-splitter-black=검은색 심우주 분배기 +se-deep-space-splitter-white=흰색 심우주 분배기 +se-deep-space-splitter-red=빨간색 심우주 분배기 +se-deep-space-splitter-yellow=노란색 심우주 분배기 +se-deep-space-splitter-green=초록색 심우주 분배기 +se-deep-space-splitter-cyan=시안색 심우주 분배기 +se-deep-space-splitter-blue=파란색 심우주 분배기 +se-deep-space-splitter-magenta=마젠타색 심우주 분배기 +se-core-fissure=핵 균열 +se-big-turbine=초고온 터빈 발전기 +se-big-turbine-generator=초고온 터빈 발전기 +se-big-turbine-tank=초고온 터빈 발전기 +se-big-heat-exchanger=초고온 열 교환기 +se-blueprint-registration-point=설계도면 등록 지점 +se-delivery-cannon=배달 대포 +se-delivery-cannon-settings=배달 대포 +se-delivery-cannon-energy-interface=배달 대포 +se-delivery-cannon-chest=배달 대포 상자 +se-delivery-cannon-weapon=무기 배달 대포 +se-delivery-cannon-weapon-settings=무기 배달 대포 +se-delivery-cannon-weapon-energy-interface=무기 배달 대포 +se-spaceship-clamp=우주선 클램프 +se-spaceship-clamp-place=우주선 클램프 +se-bloater-pool-cloud=블로트버스트 풀 +se-energy-transmitter-emitter=에너지 빔 방출기 +se-energy-transmitter-chamber=에너지 빔 챔버 +se-energy-transmitter-injector=에너지 빔 인젝터 +se-energy-transmitter-injector-reactor=에너지 빔 인젝터 +se-energy-receiver=에너지 빔 리시버 +se-energy-beam-defence=우산 +se-nexus=넥서스 +se-nexus-charger=넥서스 +se-space-probe-rocket=우주 탐사선 로켓 +se-space-probe-rocket-silo=우주 탐사선 로켓 격납고 +se-interburbulator-interface=인터버뷸레이터 인터페이스 +se-interburbulator-control=인터버뷸레이터 컨트롤 +se-interburbulator-projector=인터버뷸레이터 프로젝터 +se-burbulator=브론션 버뷸레이터 33027756 + +[entity-description] +pipe=유체를 흘려 보냅니다. +pipe-to-ground=유체를 지하로 흘려보냅니다. +straight-rail=기차를 위한 철도입니다. +stone-furnace=광석을 제련합니다. +steel-furnace=광석을 제련합니다. +electric-furnace=광석을 제련합니다. +burner-assembling-machine=화력 기반의 자동 제작 시설입니다. +assembling-machine-1=자동 제작 시설입니다. +assembling-machine-2=자동 제작 시설입니다. +assembling-machine-3=자동 제작 시설입니다. +oil-refinery=원유를 더욱 유용한 제품으로 전환합니다. +se-fuel-refinery=자동화된 연료 처리 시설입니다. +chemical-plant=자동 제작 시설입니다. +lab=자동 연구 시설입니다. +burner-lab=자동 연구 시설입니다. +transport-belt=아이템을 운송하기 위한 컨베이어 벨트입니다. +fast-transport-belt=아이템을 운송하기 위한 컨베이어 벨트입니다. +express-transport-belt=아이템을 운송하기 위한 컨베이어 벨트입니다. +underground-belt=아이템을 지하로 운송하기 위한 컨베이어 벨트입니다. +fast-underground-belt=아이템을 지하로 운송하기 위한 컨베이어 벨트입니다. +express-underground-belt=아이템을 지하로 운송하기 위한 컨베이어 벨트입니다. +splitter=아이템을 나누고 합치고 분류하기 위한 컨베이어 벨트 기반의 장치입니다. +fast-splitter=아이템을 나누고 합치고 분류하기 위한 컨베이어 벨트 기반의 장치입니다. +express-splitter=아이템을 나누고 합치고 분류하기 위한 컨베이어 벨트 기반의 장치입니다. +se-gate-platform-scaffold=무슨 이유에선지, 고리 모양은 작동하지 않습니다. 이것은 몇개의 모터와 센서, 제어 인터페이스, 그리고 다양한 추가 기능을 설치하는 건설 시설로 보입니다. +se-gate-lock-switch=__CONTROL__rotate__ 키를 눌러 직접 움직이세요. +se-gate-platform-button-switch=__CONTROL__rotate__ 키를 눌러 미세요. +se-gate-lock-combinator=아직 구현되지 않았습니다. +se-gate-platform-combinator=아직 구현되지 않았습니다. +se-gate-energy-interface=유물에 동력을 전달합니다. +rocket-silo=위성을 우주로 발사하여 "내비게이션 위성 모드"를 잠금 해제하고 위성이 발사된 항성계에서 새로운 행성과 위성, 소행성 벨트를 발견하세요. 현재 항성계가 완전히 탐색되면 이후에 새로운 항성을 발견 할 수 있습니다. +se-antimatter-reactor=물질과 반물질끼리 쌍소멸을 일으켜 놀라운 수준의 열을 발생시킵니다. +se-beryllium-ore=베릴륨 광석 +se-condenser-turbine=75%의 에너지 효율을 지녔지만 사용된 증기의 99%가 다시 물로 반환되는 증기 터빈입니다. 온도 범위는 100도 ~ 999도 입니다. \n최대 출력량: 10MW +se-core-fragment-processor=심층 파편에서 자원을 추출합니다. +se-core-miner=행성과 위성에서 끝임없이 자원을 추출할 수 있지만, 같은 표면에서 여러 대를 배치하면 채취 효율이 낮아집니다. 50MW의 에너지를 소모합니다. +se-core-miner-drill=행성과 위성에서 끝임없이 자원을 추출할 수 있지만, 같은 표면에 여러 대를 배치하면 채취 효율이 낮아집니다. 50MW의 에너지를 소모합니다. +se-dimensional-anchor=[font=default-bold][color=#f5cb48]배치 제한: 가까운 항성 궤도[/color][/font]\n항성의 중력과 공간 이상을 위한 안정화 지점을 사용합니다. +se-electric-boiler=전기 에너지를 사용하여 물을 증기로 만듭니다. 에너지 효율은 90%입니다. +se-fluid-burner-generator=전기를 생산하기 위해 에너지를 가진 액체 연료 (대표적으로 액체 로켓 연료)를 연소합니다. 단순하고 작지만 보다 큰 증기 기반 발전 시스템에 비하면 효율이 낮습니다. 우주를 위해 설계되었습니다. 실제 유체 소비량은 유체의 연료 값에 따라 다릅니다. +se-holmium-ore=홀뮴 광석 +se-iridium-ore=이리듐 광석 +se-meteor-defence-container=행성 전체에 떨어지는 운석을 모두 방어할 수 있지만, 한 번에 하나의 운석만을 쏠 수 있습니다. 운석 방어 탄약을 장전하고 발사하려면 완전히 충전되어야 합니다. 80%의 정확도를 갖습니다. 발사 후 재충전이 필요합니다. 충전 중에는 20 MW의 에너지를 소모합니다. +se-meteor-defence-charger=행성 전체에 떨어지는 운석을 모두 방어할 수 있지만, 한 번에 하나의 운석만을 쏠 수 있습니다. 운석 방어 탄약을 장전하고 발사하려면 완전히 충전되어야 합니다. 80%의 정확도를 갖습니다. 발사 후 재충전이 필요합니다. 충전 중에는 20 MW의 에너지를 소모합니다. +se-meteor-point-defence-container=주변 영역에 떨어지는 운석을 방어합니다. 하나의 방어 장치는 최대 네 개의 운석을 쏠 수 있습니다. 운석 방어 탄약을 장전하고 발사하려면 완전히 충전해야 합니다. 범위 64, 50%의 정확도를 갖으며, 발사 후 재충전까지 시간이 걸립니다. 운석 국지방어 장치를 회전시키면 충전 모드를 변경할 수 있습니다. +se-meteor-point-defence-charger=주변 영역에 떨어지는 운석을 방어합니다. 하나의 방어 장치는 최대 네 개의 운석을 쏠 수 있습니다. 운석 방어 탄약을 장전하고 발사하려면 완전히 충전해야 합니다. 범위 64, 50%의 정확도를 갖으며, 발사 후 재충전까지 시간이 걸립니다. 운석 국지방어 장치를 회전시키면 충전 모드를 변경할 수 있습니다. +se-meteor-point-defence-charger-overcharged=주변 영역에 떨어지는 운석을 방어합니다. 하나의 방어 장치는 최대 네 개의 운석을 쏠 수 있습니다. 운석 방어 탄약을 장전하고 발사하려면 완전히 충전해야 합니다. 범위 64, 50%의 정확도를 갖으며, 발사 후 재충전까지 시간이 걸립니다. 과충전된 방어 장치는 발사 시 전력 변동을 대가로 누전량을 감소시켰습니다. +se-naquium-ore=나퀴움 광석 +se-rocket-launch-pad=내용물을 우주로 발사합니다. 승객을 태울 수 있으며 정문 근처에서 __CONTROL__toggle-driving__ 키를 눌러 탑승할 수 있습니다. 자세한 내용은 [img=virtual-signal/informatron] 인포매트론 [__CONTROL__informatron__] 에서 화물 로켓 문단을 참조하세요. +se-rocket-landing-pad=화물 로켓 캡슐을 위한 화물 운송 착륙지입니다. +se-space-assembling-machine=우주에서 작동하도록 설계된 조립 기계입니다. +se-space-astrometrics-laboratory=다양한 천문학 정보를 결합, 비교하고 정량화합니다. +se-space-biochemical-laboratory=전문적인 생화학 연구 및 실험을 할 수 있는 고급 화학 실험실입니다. 또한 기초적인 화학과 원유 처리를 수행할 수 있습니다. +se-space-capsule-_-vehicle=탑승객을 가장 가까운 행성 표면으로 데려가 줄 수 있는 우주 캡슐입니다. __CONTROL__toggle-driving__ 키를 사용하여 캡슐에 들어갈 수 있습니다. +se-space-decontamination-facility=무균 환경에서 사용하기 위해 물질을 세척하고 저압의 조건에서도 사용할 수 있는 액체를 준비합니다. +se-space-electromagnetics-laboratory=강한 자기장과 매우 높은 전압을 적용하기 위한 장비입니다. +se-space-genetics-laboratory=유전자 배열과 변형, 그리고 문화 유전자 인쇄를 전담하는 실험실입니다. +se-space-gravimetrics-laboratory=중력 교란을 분석하고 시뮬레이션합니다. +se-space-growth-facility=다른 환경에서는 불가능한 미세 중력과 같은 다양한 제어 가능 조건에서 생물학적 표본을 성장시킵니다. +se-space-hypercooler=열유체의 열 교환을 수행하여 하나는 뜨겁고 다른 하나는 차갑게 만듭니다. +se-space-laser-laboratory=레이저를 이용한 실험을 진행합니다. 눈 보호 장비를 잊지 마세요! +se-lifesupport-facility=더욱 적대적인 환경에서 생명을 보호하고 지원해 줍니다. +se-space-manufactory=거대한 조립 기계이지만 더욱 복잡한 제작법을 만들 수 있습니다. 우주 (또는 우주선)에서만 작동합니다. +se-space-material-fabricator=새로운 소재를 합성합니다. 입자 충돌기와 3D 프린터의 중간 단계입니다. +se-space-mechanical-laboratory=부수고, 자르고, 깎고, 흔드는 등 다양한 기계적 공정을 지원합니다. +se-space-particle-accelerator=빛의 속도에 가까운 속도로 입자를 가속화합니다. +se-space-particle-collider=고속 입자를 충돌시키고 결과를 분석합니다. +se-space-pipe=파이프 위로 건너갈 수 있습니다. +se-space-pipe-long=유체를 멀리 빠르게 보낼 수 있는 저렴한 방법입니다. 파이프 위로 건너갈 수 있습니다. +se-space-pipe-long-straight=길이 __1__칸. 측면의 파이프와 연결되지 않는 직선 파이프입니다. 조립 라인을 위해 유체를 빠르게 이동하는 데 적합합니다. +se-space-pipe-long-junction=길이 __1__칸. 중앙의 측면에 연결할 수 있는 접합부가 있습니다. 조립 라인을 위해 유체를 빠르게 이동하는 데 적합합니다. +se-space-pipe-to-ground=짧고 비싸므로, 필요한 경우에만 사용하세요. 파이프 위로 건너갈 수 있습니다. +se-space-plasma-generator=다양한 플라즈마를 생성합니다. +se-pulveriser=매우 단단한 광물과 행성의 중심에서 끌어올린 심층 파편을 부수고 자릅니다. +se-space-radiation-laboratory=방사성 물질을 가지고 놀기에 비교적 안전한 곳입니다. 일반 우라늄 처리에도 사용할 수 있습니다. +se-space-radiator=뜨거운 열유체의 열을 방출시킵니다. +se-space-radiator-2=뜨거운 열유체의 열을 방출시킵니다. +se-recycling-facility=고철과 다양한 부산물들을 자원으로 재활용합니다. +se-space-solar-panel=위를 걸어 다닐 수 있는 효율 높은 태양 전지판입니다. +se-space-solar-panel-2=위를 걸어 다닐 수 있는 효율 높은 태양 전지판입니다. 전력 생산 효율을 개선하였습니다. +se-space-solar-panel-3=위를 걸어 다닐 수 있는 효율 높은 태양 전지판입니다. 전력 생산 효율을 최대로 개선하였습니다. +se-space-spectrometry-facility=분광 광도법, 가스 색층 분석법, 질량 분석법, 그리고 그 외 다양한 분광법을 다룹니다. 벽을 향해 빛을 쏴보고, 반사시키고, 부딫히는 위치를 확인해보세요. +se-space-supercomputer-1=고급 데이터 조작과 처리 및 시뮬레이션을 할 수 있습니다. +se-space-supercomputer-2=양자 컴퓨팅을 통해 향상된 데이터 조작과 처리 및 시뮬레이션을 할 수 있습니다. +se-space-supercomputer-3=양자 컴퓨팅 프레임워크의 적응형 신경망입니다. 보다 더욱 진보된 데이터 조작과 처리 및 시뮬레이션을 할 수 있습니다. +se-space-supercomputer-4=처리 밀도와 에너지 전송율을 높이기 위해 공간 왜곡과 더욱 높은 차원을 활용하는 나노공학 유기 슈퍼컴퓨터입니다. +se-space-straight-rail=우주를 위해 설계되었지만, 표면에서도 사용할 수 있습니다. +se-space-science-lab=고급 과학 팩을 사용할 수 있습니다. +se-space-telescope=가시 스펙트럼 주변의 여러 파장에 민감하도록 정교하게 설계된 망원경입니다. +se-space-telescope-gammaray=감마선은 굴절되지 않으므로 일반 렌즈 망원경으로는 감지할 수 없습니다. 이 강력한 망원경은 대신 거울과 특수 감지기를 이용하여 감마선을 감지해냅니다. +se-space-telescope-xray=X선은 대부분 대기에 의해 차단됩니다. 이 강력한 망원경은 대기 문제가 거의 없는 우주에서 작동하도록 설계되었습니다. +se-space-telescope-microwave=마이크로파와 우주배경복사를 감지하는 거대한 망원경입니다. +se-space-telescope-radio=머나먼 곳으로부터 감지되는 극도로 미세한 수준의 전파를 감지하는 거대한 망원경입니다. +se-space-thermodynamics-laboratory=극한의 온도와 관련된 작업을 처리합니다. 제련과 같은 기초적인 열 공정도 처리할 수 있습니다. +se-space-transport-belt=아이템이 우주로 떠다니는 것을 막아줍니다. +se-spaceship-antimatter-engine=[font=default-bold][color=#f5cb48]배치 제한: 우주선 바닥[/color][/font]\n반물질 기체를 소멸시켜 추진합니다. 우주선 격리를 위한 격벽으로 계산됩니다. +se-spaceship-antimatter-booster-tank=[font=default-bold][color=#f5cb48]배치 제한: 우주선 바닥[/color][/font]\n반물질을 저장합니다. 우주선 발사에 필요합니다. +se-spaceship-console=[font=default-bold][color=#f5cb48]배치 제한: 우주선 바닥[/color][/font]\n행성, 위성, 궤도, 그리고 소행성 지대 다양한 곳으로 우주선을 이동하고 제어하는 데 사용됩니다. 우주선 벽과 문을 통해 우주선의 내부와 외부가 철저히 격리되어야 하며 작은 틈이나 구멍도 있어선 안됩니다. 무결성 검사는 문제를 강조합니다. +se-spaceship-console-output=우주선의 현재 상태와 관련된 신호를 출력합니다. 자세한 내용은 [img=virtual-signal/informatron] 인포매트론 [__CONTROL__informatron__]의 우주선 문단을 참조하세요. +se-spaceship-console-alt=[font=default-bold][color=#f5cb48]배치 제한: 우주선 바닥[/color][/font]\n이 우주선 콘솔은 손상되어 우주선을 조종하는 데 사용할 수 없습니다. +se-spaceship-gate=[font=default-bold][color=#f5cb48]배치 제한: 우주선 바닥[/color][/font]\n문이 열리면 역장이 감압을 중단합니다. 우주선 격리를 위한 격벽으로 계산됩니다. +se-spaceship-rocket-engine=[font=default-bold][color=#f5cb48]배치 제한: 우주선 바닥[/color][/font]\n액체 로켓 연료를 연소하여 추진합니다. 우주선 격리를 위한 격벽으로 계산됩니다. +se-spaceship-rocket-booster-tank=[font=default-bold][color=#f5cb48]배치 제한: 우주선 바닥[/color][/font]\n액체 로켓 연료를 저장합니다. 우주선 발사에 필요합니다. +se-spaceship-wall=[font=default-bold][color=#f5cb48]배치 제한: 우주선 바닥[/color][/font]\n우주선 격리를 위한 격벽으로 계산되며, 대각선 틈새도 전부 매워야만 합니다. +beacon=8개의 모듈 슬롯이 있습니다. 장착된 모듈 효과를 주변 3 타일 내에 있는 아군 건물에 전달합니다. 동일한 건물에 둘 이상의 신호기가 있다면 과부하에 걸려 건물의 작동이 멈추게 됩니다. +se-wide-beacon=15개의 모듈 슬롯이 있습니다. 장착된 모듈 효과를 주변 14 타일 내에 있는 아군 건물에 전달합니다. 동일한 건물에 둘 이상의 신호기가 있다면 과부하에 걸려 건물의 작동이 멈추게 됩니다. +se-wide-beacon-2=20개의 모듈 슬롯이 있습니다. 장착된 모듈 효과를 주변 14 타일 내에 있는 아군 건물에 전달합니다. 동일한 건물에 둘 이상의 신호기가 있다면 과부하에 걸려 건물의 작동이 멈추게 됩니다. +kr-singularity-beacon=좁은 범위에 100%의 모듈 효과를 전송하는 작은 크기의 신호기입니다. 장착된 모듈 효과를 주변 2 타일 내에 있는 아군 건물에 전달합니다. 동일한 건물에 둘 이상의 신호기가 있다면 과부하에 걸려 건물의 작동이 멈추게 됩니다. +se-supercharger=한 번에 최대 64개의 로봇을 고속으로 충전할 수 있습니다. 충전기의 최대 전력 소모는 1GW입니다. +se-addon-power-pole=건물에 부착하거나 전력 공급 범위를 정밀하게 제어하기 위해 설계된 작은 전신주입니다. +se-pylon=전기 에너지를 배분합니다. 64 타일까지 연결됩니다. +se-pylon-substation=전기 에너지를 배분합니다. 64 타일까지 연결되고 64x64 영역에 전력을 공급합니다. +se-pylon-construction=전기 에너지를 배분하고 건설 영역을 제공합니다. 64 타일까지 연결되고 64x64 영역에 건설 영역을 공급합니다. +se-pylon-construction-radar=전기 에너지를 배분하고 건설 영역을 제공하며 레이더처럼 주변을 밝혀줍니다. 64 타일까지 연결되고 256x256 영역에 건설 영역 제공 및 구역을 밝힙니다. 4x4 물류영역. +se-shield-projector=보호 역장을 생성합니다. 프로젝터는 충전 중 혹은 보호막이 손상된 경우에는 더욱 많은 에너지를 소모합니다. "Walls Block Spitters" 모드가 설치된 경우 스피터의 발사체를 막을 수 있습니다. +se-big-turbine=[font=default-bold][color=#e4cead]최대 출력:[/color][/font] 1GW.\n5000°C의 증기를 받아 다른 한쪽 끝에 500°C의 증기를 내보내고 측면으로 물을 내보내는 대형 발전기입니다. 99%의 에너지 효율과 99%의 물을 절약할 수 있습니다. +se-big-heat-exchanger=초고온 고용량을 위해 설계된 대형 열 교환기입니다. +se-delivery-cannon=궤도 너머로 자원을 발사해 머나먼 거리를 단숨에 운송할 수 있는 전자 포 형태의 대포입니다. 안전하게 배송되지 않으면 손상되므로 주의하여 사용하세요. +se-delivery-cannon-chest=고속으로 낙하하는 화물을 안전하게 포착할 수 있도록 설계된 무장형 상자입니다. 운송품을 안전하게 잡으려면 화물 공간에 여유가 있어야 합니다. +se-delivery-cannon-weapon=궤도 너머로 탄약을 발사해 머나먼 거리를 단숨에 발사할 수 있는 거대한 전자 포입니다. 주의하여 사용하세요. +se-spaceship-clamp=우주선의 클램프는 반대 방향을 향하는 클램프에 정박할 수 있도록 해줍니다. 우주선 격리를 위한 격벽으로 계산됩니다. +se-spaceship-clamp-place=우주선의 클램프는 반대 방향을 향하는 클램프에 정박할 수 있도록 해줍니다. 우주선 격리를 위한 격벽으로 계산됩니다. +se-space-accumulator=에너지를 높은 밀도로 저장합니다. +se-space-accumulator-2=에너지를 높은 밀도로 저장합니다. +se-energy-transmitter-emitter=표면 간 에너지 빔을 생성하는 중앙 건물입니다. 무기로 사용하거나 에너지 빔 수속기로 전력을 전달할 수 있습니다. 연결된 에너지 빔 체임버와 연결된 에너지 빔 인젝터가 필요합니다. 빔 강도는 인젝터 수를 기반으로 합니다. +se-energy-transmitter-chamber=에너지 빔 방출기에 연결되어야 합니다. 다른 체임버는 양쪽 끝 또는 중간에 연결할 수 있습니다. 에너지 빔 인젝터는 측면에만 연결할 수 있습니다. +se-energy-transmitter-injector=에너지 빔 체임버에 부착하고 방출기에 연결되어야 합니다. 인젝터는 고정된 전력 소모를 가지며, 각 수속기에 더 많은 열을 제공하기 위해 에너지를 증가시키거나 빔 무기의 속도와 피해량을 증가시킵니다. +se-energy-transmitter-injector-reactor=에너지 빔 체임버에 부착하고 방출기에 연결되어야 합니다. 인젝터는 고정된 전력 소모를 가지며, 각 수속기에 더 많은 열을 제공하기 위해 에너지를 증가시키거나 빔 무기의 속도와 피해량을 증가시킵니다. +se-energy-receiver=에너지 빔을 포착하여 열로 전환합니다. 방출기는 전력 공급 모드여야 하며, 대상은 리시버여야 합니다. +se-energy-beam-defence=에너지 빔 방어 시설입니다. 우주 기반의 에너지 빔이나 코로나 질량 방출로부터 지면을 보호합니다. 기능에 필요한 유일한 요구 사항은 에너지이며 기본 소비량은 10MW이지만 공격 빔의 강도에 따라 증가합니다. 코로나 질량 방출에 대해서는 한 표면에 하나만 필요하며, 에너지 빔 무기의 경우 우산 하나 당 최대 500 GW의 피해를 막을 수 있습니다. 자세한 내용은 [img=virtual-signal/informatron] 인포매트론 [__CONTROL__informatron__]의 에너지 빔 문단을 참조하세요. +spidertron=로켓의 목적지가 착륙 패드로 설정되지 않았다면 화물 로켓에서 전개됩니다. +se-nexus=움직이는 우주선에서만 작동되며 에너지 사용량은 우주선의 속도에 비례합니다. 성간 이동을 통해 데이터를 얻을 수 있으며, 데이터 생성은 우주선의 운동 에너지를 기반으로 합니다. 넥서스는 왜곡 드라이브 역할을 하도록 설계되었으며 적절한 기술을 사용하여 지역 항성 성단에서 탈출할 수 있습니다. +se-nexus-charger=움직이는 우주선에서만 작동되며 에너지 사용량은 우주선의 속도에 비례합니다. 성간 이동을 통해 데이터를 얻을 수 있으며, 데이터 생성은 우주선의 운동 에너지를 기반으로 합니다. 넥서스는 왜곡 드라이브 역할을 하도록 설계되었으며 적절한 기술을 사용하여 지역 항성 성단에서 탈출할 수 있습니다. +se-space-probe-rocket-silo=우주 탐사선을 발사하기 위한 로켓 격납고입니다. +se-linked-container=외부 차원 공간에 의해 다른 보관함과 연결되는 보관함입니다. 보관함의 링크는 보관함이 처음 배치되는 표면에 따라 결정됩니다. + +[equipment-name] +energy-shield-equipment=에너지 보호막 +energy-shield-mk2-equipment=에너지 보호막 MK2 +energy-shield-mk3-equipment=에너지 보호막 MK3 +energy-shield-mk4-equipment=에너지 보호막 MK4 +energy-shield-mk5-equipment=에너지 보호막 MK5 +energy-shield-mk6-equipment=에너지 보호막 MK6 +se-adaptive-armour-equipment-1=적응형 아머 MK1 +se-adaptive-armour-equipment-2=적응형 아머 MK2 +se-adaptive-armour-equipment-3=적응형 아머 MK3 +se-adaptive-armour-equipment-4=적응형 아머 MK4 +se-adaptive-armour-equipment-5=적응형 아머 MK5 +se-rtg-equipment=휴대용 RTG +se-rtg-equipment-2=휴대용 RTG MK2 +se-lifesupport-equipment-1=생명 유지 장비 MK1 +se-lifesupport-equipment-2=생명 유지 장비 MK2 +se-lifesupport-equipment-3=생명 유지 장비 MK3 +se-lifesupport-equipment-4=생명 유지 장비 MK4 + +[equipment-description] +energy-shield-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +energy-shield-mk2-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +energy-shield-mk3-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +energy-shield-mk4-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +energy-shield-mk5-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +energy-shield-mk6-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +se-adaptive-armour-equipment-1=에너지를 사용하여 스스로를 수리하는 아머입니다. 시간이 지남에 따라 보호막이 천천히 재생됩니다. +se-adaptive-armour-equipment-2=에너지를 사용하여 스스로를 수리하는 아머입니다. 시간이 지남에 따라 보호막이 천천히 재생됩니다. +se-adaptive-armour-equipment-3=에너지를 사용하여 스스로를 수리하는 아머입니다. 시간이 지남에 따라 보호막이 천천히 재생됩니다. +se-adaptive-armour-equipment-4=에너지를 사용하여 스스로를 수리하는 아머입니다. 시간이 지남에 따라 보호막이 천천히 재생됩니다. +se-adaptive-armour-equipment-5=에너지를 사용하여 스스로를 수리하는 아머입니다. 시간이 지남에 따라 보호막이 천천히 재생됩니다. +se-rtg-equipment=방사성 붕괴로 생기는 열 에너지를 전기 에너지로 변환하는 휴대용 방사성동위원소 열전기 발전기입니다. 추가 연료 없이 수십 년간 지속됩니다. +se-rtg-equipment-2=방사성 붕괴로 생기는 열 에너지를 전기 에너지로 변환하는 개선된 휴대용 방사성동위원소 열전기 발전기입니다. 추가 연료 없이 수십 년간 지속됩니다. +se-lifesupport-equipment-1=생명 지원 효율을 100%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. +se-lifesupport-equipment-2=생명 지원 효율을 200%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. +se-lifesupport-equipment-3=생명 지원 효율을 400%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. +se-lifesupport-equipment-4=생명 지원 효율을 800%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. + +[fluid-name] +se-antimatter-stream=반물질 기체 +se-bio-sludge=바이오슬러지 +se-contaminated-bio-sludge=오염된 바이오슬러지 +se-contaminated-space-water=오염된 우주 물 +se-chemical-gel=화학 젤 +se-decompressing-steam=응축된 증기 +se-liquid-rocket-fuel=액체 로켓 연료 +se-methane-gas=메탄 가스 +se-methane-gas-mixed=혼합된 메탄 가스 +se-nutrient-gel=영양 젤 +se-neural-gel=신경 젤 +se-neural-gel-2=고급 신경 젤 +se-ion-stream=이온 기체 +se-plasma-stream=플라즈마 기체 +se-particle-stream=입자 기체 +se-proton-stream=양성자 기체 +se-space-coolant=열유체 25°C +se-space-coolant-hot=열유체 25°C +se-space-coolant-warm=차가운 열유체 -10°C +se-space-coolant-cold=냉각된 열유체 -100°C +se-space-coolant-supercooled=초냉각 열유체 -273°C +se-space-water=우주 물 +se-beryllium-hydroxide=베릴륨 수산화물 +se-cryonite-slush=크라이오나이트 슬러시 + +[fluid-description] +se-space-water=저압의 환경에서도 얼지 않는 물로 대부분의 우주 응용 분야에 적합합니다. +se-space-coolant=열유체의 기본 온도입니다. +se-space-coolant-hot=열유체의 기본 온도입니다. +se-space-coolant-warm=방열기를 통해 차갑게 만든 열유체입니다. +se-space-coolant-cold=초냉각된 열유체입니다. +se-space-coolant-supercooled=반복적인 초냉각을 거친 열유체입니다. + +[fuel-category-name] +antimatter=반물질 연료 + +[item-group-name] +space=우주 +science=과학 +spaceship=우주선 +bob-fluids=유체 +resources=자원 +intermediate-products=제조 +combat=장비와 전투 + +[item-name] +spidertron=스파이더트론 +core-fragment=심층 파편 (__1__) +effectivity-module-4=효율 모듈 4 +effectivity-module-5=효율 모듈 5 +effectivity-module-6=효율 모듈 6 +effectivity-module-7=효율 모듈 7 +effectivity-module-8=효율 모듈 8 +effectivity-module-9=효율 모듈 9 +glass=유리 +productivity-module-4=생산 모듈 4 +productivity-module-5=생산 모듈 5 +productivity-module-6=생산 모듈 6 +productivity-module-7=생산 모듈 7 +productivity-module-8=생산 모듈 8 +productivity-module-9=생산 모듈 9 +rocket-fuel=고체 로켓 연료 +sand=모래 +solid-sand=세척된 모래 +washed-sand=세척된 모래 +satellite=내비게이션 위성 +se-satellite-telemetry=위성 원격 측정법 +se-antimatter-canister=반물질 용기 +se-astrometric-data=천체 측량 데이터 +se-astronomic-catalogue-1=천문학 카탈로그 +se-astronomic-catalogue-2=광범위한 천문학 카탈로그 +se-astronomic-catalogue-3=포괄적인 천문학 카탈로그 +se-astronomic-catalogue-4=확장된 천문학 카탈로그 +se-astronomic-insight=천문학적 통찰 +se-astronomic-science-pack-1=천문학 과학 팩 1 +se-astronomic-science-pack-2=천문학 과학 팩 2 +se-astronomic-science-pack-3=천문학 과학 팩 3 +se-astronomic-science-pack-4=천문학 과학 팩 4 +se-atomic-data=원자 데이터 +se-beryllium-ore=녹주석 +se-ballistic-shielding-data=탄도 차폐 데이터 +se-beryllium-ore-crushed=분쇄된 녹주석 +se-beryllium-ore-washed=세척된 녹주석 +se-beryllium-plate=베릴륨 판 +se-beryllium-powder=베릴륨 가루 +se-beryllium-ingot=베릴륨 주괴 +se-beryllium-sulfate=황산베릴륨 +se-bio-combustion-data=생물 연소 데이터 +se-bio-combustion-resistance-data=생물 연소 저항 데이터 +se-bio-spectral-data=생물 스펙트럼 데이터 +se-biochemical-data=생화학 데이터 +se-biochemical-resistance-data=생화학적 저항 데이터 +se-bioculture=생물 문화 +se-bioelectrics-data=생체전기 데이터 +se-biological-catalogue-1=생물학 카탈로그 +se-biological-catalogue-2=광범위한 생물학 카탈로그 +se-biological-catalogue-3=포괄적인 생물학 카탈로그 +se-biological-catalogue-4=확장된 생물학 카탈로그 +se-biological-insight=생물학적 통찰 +se-biological-science-pack-1=생물학 과학 팩 1 +se-biological-science-pack-2=생물학 과학 팩 2 +se-biological-science-pack-3=생물학 과학 팩 3 +se-biological-science-pack-4=생물학 과학 팩 4 +se-biomechanical-data=생체역학 데이터 +se-biomechanical-resistance-data=생체역학 저항 데이터 +se-boson-data=보손 데이터 +se-broken-data=손상된 데이터 카드 +se-canister=안전 용기 +se-biogun=바이오건 +se-bloater-ammo=블로트버스트 탄약 +se-pheromone-ammo=페로몬 다트 +se-cryogun=크라이오건 +se-cryogun-ammo=빙산 탄약 +se-rocket-launch-pad-silo-dummy-ingredient-item=화물 로켓 (숨겨진 재료) +se-rocket-launch-pad-silo-dummy-result-item=화물 로켓 (숨겨진 결과) +se-cargo-rocket-cargo-pod=화물 포드 +se-cargo-rocket-fuel-tank=로켓 연료 탱크 +se-cargo-rocket-section=화물 로켓 부품 +se-cargo-rocket-section-packed=포장된 화물 로켓 부품 +se-cold-thermodynamics-data=저온 열역학 데이터 +se-comparative-genetic-data=비교 유전 데이터 +se-compressive-strength-data=압축 강도 데이터 +se-conductivity-data=전도성 데이터 +se-contaminated-scrap=오염된 고철 +se-core-fragment-omni=심층 파편 +se-corrosion-resistance-data=내식성 데이터 +se-cryogenics-data=극저온 환경 데이터 +se-cryonite=크라이오나이트 +se-cryonite-crushed=분쇄된 크라이오나이트 +se-cryonite-washed=세척된 크라이오나이트 +se-cryonite-rod=크라이오나이트 막대 +se-cryonite-ion-exchange-beads=음이온 교환 구슬 +se-dark-energy-data=암흑 에너지 데이터 +se-darkmatter-data=암흑 물질 데이터 +se-data-storage-substrate-cleaned=다듬어진 데이터 카드 기판 +se-data-storage-substrate=데이터 카드 기판 +se-decompression-data=감압 데이터 +se-decompression-resistance-data=감압 저항 데이터 +se-universal-catalogue=범우주 카탈로그 +se-deep-space-science-pack=심우주 과학 팩 +se-deep-space-science-pack-1=심우주 과학 팩 1 +se-deep-space-science-pack-2=심우주 과학 팩 2 +se-deep-space-science-pack-3=심우주 과학 팩 3 +se-deep-space-science-pack-4=심우주 과학 팩 4 +se-doppler-shift-data=도플러 시프트 데이터 +se-durability-data=내구성 데이터 +se-electrical-shielding-data=전기 차폐 데이터 +se-electromagnetic-field-data=전자기장 데이터 +se-empty-data=빈 데이터 카드 +se-empty-lifesupport-canister=빈 생명 지원 용기 +se-energy-catalogue-1=에너지 카탈로그 +se-energy-catalogue-2=광범위한 에너지 카탈로그 +se-energy-catalogue-3=포괄적인 에너지 카탈로그 +se-energy-catalogue-4=확장된 에너지 카탈로그 +se-energy-insight=에너지 통찰 +se-energy-science-pack-1=에너지 과학 팩 1 +se-energy-science-pack-2=에너지 과학 팩 2 +se-energy-science-pack-3=에너지 과학 팩 3 +se-energy-science-pack-4=에너지 과학 팩 4 +se-entanglement-data=얽힘 데이터 +se-enriched-naquium=농축된 나퀴움 +se-exotic-fission-data=외계 분열 데이터 +se-exotic-singularity-data=특이점 데이터 +se-explosion-shielding-data=폭발 차폐 데이터 +se-experimental-alloys-data=실험적인 합금 데이터 +se-experimental-biochemical-data=실험적인 생화학 데이터 +se-experimental-bioculture=실험적인 생물 문화 +se-experimental-genetic-data=실험적인 유전 데이터 +se-experimental-material-decay-data=실험적인 물질 부식 데이터 +se-experimental-material-spectral-data=실험적인 물질 스펙트럼 데이터 +se-experimental-material=실험적인 물질 프로토타입 +se-experimental-specimen=실험적인 바이오매스 +se-experimental-superconductor=초전도체 프로토타입 +se-forcefield-data=역장 데이터 +se-friction-data=마찰 데이터 +se-fusion-test-data=융합 실험 데이터 +se-gammaray-detector=감마선 검출기 +se-gammaray-observation-data=감마선 관측 데이터 +se-gammaray-test-data=감마선 데이터 +se-gate-fragment=유물 파편 +se-genetic-data=유전학 데이터 +se-gravity-wave-observation-data=중력파 관측 데이터 +se-gravity-wave-data=중력파 데이터 +se-gravimetric-observation-data=중량측정 관측 데이터 +se-gravimetric-test-data=중량측정 실험 데이터 +se-gravitational-lensing-data=중력 렌즈 데이터 +se-heat-shielding=단열재 +se-holmium-ore=홀미나이트 광석 +se-holmium-ore-crushed=분쇄된 홀미나이트 +se-holmium-ore-washed=세척된 홀미나이트 +se-holmium-powder=홀뮴 가루 +se-holmium-plate=홀뮴 판 +se-holmium-ingot=홀뮴 주괴 +se-hot-thermodynamics-data=고온 열역학 데이터 +se-impact-shielding-data=충격 차폐 데이터 +se-infrared-observation-data=적외선 관측 데이터 +se-ion-spectrometry-data=이온 분광 데이터 +se-iridium-ore=이리다이트 +se-iridium-ore-crushed=분쇄된 이리다이트 +se-iridium-ore-washed=세척된 이리다이트 +se-iridium-piledriver=이리듐 파일드라이버 +se-iridium-powder=이리듐 가루 +se-iridium-plate=이리듐 판 +se-iridium-ingot=이리듐 주괴 +se-junk-data=망가진 데이터 카드 +se-laser-shielding-data=레이저 차폐 데이터 +se-lepton-data=경입자 데이터 +se-lifesupport-canister=생명 지원 용기 +se-machine-learning-data=기계학습 데이터 +se-magnetic-canister=자기 용기 +se-magnetic-monopole-data=자기 단극 데이터 +se-material-decay-data=물질 부식 데이터 +se-material-science-pack-1=물질 과학 팩 1 +se-material-science-pack-2=물질 과학 팩 2 +se-material-science-pack-3=물질 과학 팩 3 +se-material-science-pack-4=물질 과학 팩 4 +se-material-spectral-data=물질 스펙트럼 데이터 +se-material-testing-pack=물질 실험용 팩 +se-material-catalogue-1=물질 카탈로그 +se-material-catalogue-2=광범위한 물질 카탈로그 +se-material-catalogue-3=포괄적인 물질 카탈로그 +se-material-catalogue-4=확장된 물질 카탈로그 +se-material-insight=물질 통찰 +se-medpack=구급팩 +se-medpack-2=구급팩 2 +se-medpack-3=구급팩 3 +se-medpack-4=구급팩 4 +se-meteor-defence=운석 방어 장치 +se-meteor-defence-ammo=운석 방어 장치 탄약 +se-meteor-point-defence=운석 국지방어 장치 +se-meteor-point-defence-ammo=운석 국지방어 장치 탄약 +se-methane-ice=메탄 얼음 +se-micro-black-hole-data=마이크로 블랙홀 데이터 +se-microwave-observation-data=마이크로파 관측 데이터 +se-negative-pressure-data=음압 데이터 +se-nano-cold-thermodynamics-data=나노소재 저온 열역학 데이터 +se-nano-compressive-strength-data=나노소재 압축 강도 데이터 +se-nano-hot-thermodynamics-data=나노소재 고온 열역학 데이터 +se-nanomaterial=나노소재 +se-nano-tensile-strength-data=나노소재 인장 강도 데이터 +se-naquium-ore=나퀴나이트 +se-naquium-ore-crushed=분쇄된 나퀴나이트 +se-naquium-ore-washed=세척된 나퀴나이트 +se-naquium-powder=나퀴움 가루 +se-naquium-plate=나퀴움 판 +se-naquium-ingot=나퀴움 주괴 +se-neural-anomaly-data=신경 이상변칙 데이터 +se-nutrient-vat=영양소 통 +se-observation-frame-blank=빈 관측 프레임 +se-observation-frame-gammaray=감마선 관측 프레임 +se-observation-frame-infrared=적외선 관측 프레임 +se-observation-frame-microwave=마이크로파 관측 프레임 +se-observation-frame-radio=전파 관측 프레임 +se-observation-frame-uv=UV 관측 프레임 +se-observation-frame-visible=가시광선 관측 프레임 +se-observation-frame-xray=X선 관측 프레임 +se-orbital-data=궤도 계산 데이터 +se-particle-beam-shielding-data=입자 빔 차폐 데이터 +se-plague-bomb=역병 로켓 +se-plasma-canister=플라즈마 용기 +se-plasma-electrodynamics-data=플라즈마 전기역학 데이터 +se-plasma-thermodynamics-data=플라즈마 열역학 데이터 +se-polarisation-data=편광 데이터 +se-pressure-containment-data=압력 억제 데이터 +se-quantum-phenomenon-data=양자 현상 데이터 +se-quark-data=쿼크 데이터 +se-radiation-data=방사선 데이터 +se-radiation-exposure-data=방사선 노출 데이터 +se-radiation-exposure-resistance-data=방사선 저항 데이터 +se-radiation-shielding-data=방사선 차폐 데이터 +se-radio-observation-data=전파 관측 데이터 +se-rigidity-data=강성 데이터 +se-rtg-equipment=휴대용 RTG +se-rtg-equipment-2=휴대용 RTG MK2 +se-scrap=고철 +se-shear-strength-data=전단 강도 데이터 +se-significant-data=중요 데이터 +se-significant-specimen=중요 바이오매스 +se-singularity-data=특이점 데이터 +se-space-capsule=우주 캡슐 +se-space-mirror=다중 스펙트럼 거울 +se-space-platform-plating=도금 우주 플랫폼 +se-space-platform-scaffold=우주 플랫폼 비계 +se-space-rail=우주 철도 +se-spaceship-floor=우주선 바닥 +se-specimen=바이오매스 +se-subatomic-data=아원자 데이터 +se-superconductivity-data=초전도성 데이터 +se-superconductor=초전도체 +se-superconductive-cable=초전도 케이블 +se-tensile-strength-data=인장 강도 데이터 +se-tesla-ammo=테슬라 건 탄약 +se-tesla-gun=테슬라 건 +se-thruster-suit=우주복 +se-thruster-suit-2=우주복 MK2 +se-thruster-suit-3=우주복 MK3 +se-thruster-suit-4=우주복 MK4 +se-timespace-anomaly-data=시공간 이상변칙 데이터 +se-used-lifesupport-canister=사용된 생명 지원 용기 +se-uv-observation-data=자외선 관측 데이터 +se-visible-observation-data=가시광선 관측 데이터 +se-vitamelange=비타멜란지 +se-vitamelange-nugget=비타멜란지 너겟 +se-vitamelange-roast=구운 비타멜란지 +se-vitamelange-spice=비타멜란지 향신료 +se-vitamelange-extract=비타멜란지 추출물 +se-vulcanite=벌카나이트 +se-vulcanite-crushed=분쇄된 벌카나이트 +se-vulcanite-washed=세척된 벌카나이트 +se-vulcanite-block=벌카나이트 블록 +se-vulcanite-ion-exchange-beads=양이온 교환 구슬 +se-water-ice=워터 아이스 +se-xray-observation-data=X선 관측 데이터 +se-zero-point-energy-data=영점 에너지 데이터 +se-rocket-science-pack=로켓 과학 팩 +space-science-pack=최적화 과학 팩 +speed-module-4=속도 모듈 4 +speed-module-5=속도 모듈 5 +speed-module-6=속도 모듈 6 +speed-module-7=속도 모듈 7 +speed-module-8=속도 모듈 8 +speed-module-9=속도 모듈 9 +se-aeroframe-pole=에어로프레임 막대 +se-aeroframe-scaffold=에어로프레임 비계 +se-aeroframe-bulkhead=에어로프레임 격벽 +se-lattice-pressure-vessel=격자 압력 용기 +se-heavy-girder=고중량 거더 +se-heavy-bearing=고중량 베어링 +se-heavy-composite=고중량 복합재 +se-heavy-assembly=고중량 조립체 +se-bioscrubber=바이오 스크러버 +se-vitalic-epoxy=비탈릭 에폭시 +se-vitalic-reagent=비탈릭 시약 +se-vitalic-acid=비탈릭 산 +se-self-sealing-gel=자가 밀봉 젤 +se-holmium-cable=홀뮴 케이블 +se-holmium-solenoid=홀뮴 솔레노이드 +se-quantum-processor=양자 처리 장치 +se-dynamic-emitter=역동 방출기 +se-naquium-processor=나퀴움 처리 장치 +se-naquium-cube=나퀴움 큐브 +se-naquium-tessaract=나퀴움 테서랙트 +se-wide-beacon=광역 신호기 +se-wide-beacon-2=광역 신호기 2 +se-lifesupport-equipment-1=생명 유지 장비 MK1 +se-lifesupport-equipment-2=생명 유지 장비 MK2 +se-lifesupport-equipment-3=생명 유지 장비 MK3 +se-lifesupport-equipment-4=생명 유지 장비 MK4 +se-naquium-heat-pipe=나퀴움 열 파이프 +se-naquium-heat-pipe-horizontal=나퀴움 열 파이프 (수평) +se-naquium-heat-pipe-vertical=나퀴움 열 파이프 (수직) +se-naquium-heat-pipe-long=긴 나퀴움 열 파이프 __1__ +se-deep-space-transport-belt=심우주 운송 벨트 +se-deep-space-transport-belt-black=검은색 심우주 운송 벨트 +se-deep-space-transport-belt-white=흰색 심우주 운송 벨트 +se-deep-space-transport-belt-red=빨간색 심우주 운송 벨트 +se-deep-space-transport-belt-yellow=노란색 심우주 운송 벨트 +se-deep-space-transport-belt-green=초록색 심우주 운송 벨트 +se-deep-space-transport-belt-cyan=시안색 심우주 운송 벨트 +se-deep-space-transport-belt-blue=파란색 심우주 운송 벨트 +se-deep-space-transport-belt-magenta=마젠타색 심우주 운송 벨트 +se-deep-space-underground-belt=심우주 지하 벨트 +se-deep-space-underground-belt-black=검은색 심우주 지하 벨트 +se-deep-space-underground-belt-white=흰색 심우주 지하 벨트 +se-deep-space-underground-belt-red=빨간색 심우주 지하 벨트 +se-deep-space-underground-belt-yellow=노란색 심우주 지하 벨트 +se-deep-space-underground-belt-green=초록색 심우주 지하 벨트 +se-deep-space-underground-belt-cyan=시안색 심우주 지하 벨트 +se-deep-space-underground-belt-blue=파란색 심우주 지하 벨트 +se-deep-space-underground-belt-magenta=마젠타색 심우주 지하 벨트 +se-deep-space-splitter=심우주 분배기 +se-deep-space-splitter-black=검은색 심우주 분배기 +se-deep-space-splitter-white=흰색 심우주 분배기 +se-deep-space-splitter-red=빨간색 심우주 분배기 +se-deep-space-splitter-yellow=노란색 심우주 분배기 +se-deep-space-splitter-green=초록색 심우주 분배기 +se-deep-space-splitter-cyan=시안색 심우주 분배기 +se-deep-space-splitter-blue=파란색 심우주 분배기 +se-deep-space-splitter-magenta=마젠타색 심우주 분배기 +se-blueprint-registration-point=설계도면 등록 지점 +se-delivery-cannon-capsule=배달 대포 캡슐 +se-delivery-cannon-capsule-packed=배달 대포 캡슐: __1__ +se-delivery-cannon-targeter=배달 대포 표적지 +se-delivery-cannon-weapon-capsule=무기 배달 캡슐 +se-delivery-cannon-weapon-capsule-packed=무기 배달 캡슐: __1__ +se-delivery-cannon-weapon-targeter=무기 배달 대포 표적지 +se-energy-transmitter-targeter=에너지 빔 표적지 +se-arcosphere=아코스피어 +se-arcosphere-a=λ 아코스피어 람다 +se-arcosphere-b=ξ 아코스피어 시 +se-arcosphere-c=ζ 아코스피어 제타 +se-arcosphere-d=θ 아코스피어 세타 +se-arcosphere-e=ε 아코스피어 엡실론 +se-arcosphere-f=φ 아코스피어 피 +se-arcosphere-g=γ 아코스피어 감마 +se-arcosphere-h=ω 아코스피어 오메가 +se-arcosphere-collector=아코스피어 수집기 +se-star-probe=항성 탐사선 +se-belt-probe=소행성대 탐사선 +se-void-probe=성간 공허 탐사선 +se-star-probe-data=항성 탐사선 데이터 +se-belt-probe-data=소행성대 탐사선 데이터 +se-void-probe-data=성간 공허 탐사선 데이터 +se-nano-engineering-data=나노공학 데이터 +se-annihilation-data=소멸 데이터 +se-naquium-structural-data=나퀴움 구조 데이터 +se-hyperlattice-data=초격자 데이터 +se-naquium-energy-data=나퀴움 에너지 데이터 +se-space-fold-data=공간 접힘 데이터 +se-space-warp-data=공간 왜곡 데이터 +se-space-dialation-data=공간 팽창 데이터 +se-space-injection-data=공간 주입 데이터 +se-interstellar-data=성간 여행 데이터 +se-teleportation-data=순간이동 데이터 +se-wormhole-data=웜홀 데이터 +se-rhga-data=현실 하이퍼그래프 분석 데이터 +se-deep-catalogue-1=심우주 카탈로그 +se-deep-catalogue-2=광범위한 심우주 카탈로그 +se-deep-catalogue-3=포괄적인 심우주 카탈로그 +se-deep-catalogue-4=확장된 심우주 카탈로그 +se-space-probe-rocket=우주 탐사선 로켓 +se-space-probe-rocket-deployed=우주 탐사선 로켓 (전개됨) +se-railgun=레일건 +se-railgun-ammo=레일건 탄약 + +[item-description] +automation-science-pack=기본 연구소에서 연구하는 데 사용됩니다. +chemical-science-pack=기본 연구소에서 연구하는 데 사용됩니다. +logistic-science-pack=기본 연구소에서 연구하는 데 사용됩니다. +military-science-pack=기본 연구소에서 연구하는 데 사용됩니다. +production-science-pack=기본 연구소에서 연구하는 데 사용됩니다. +satellite=인공위성은 위성 로켓 격납고 또는 우주 탐사선 로켓 격납고에 넣어져야 합니다. 인공위성은 발사된 태양계 또는 멀리 떨어진 별에서 천체의 정확한 좌표를 발견할 수 있습니다. [img=item/se-satellite-telemetry] 위성 원격 측정을 제공합니다. +se-satellite-telemetry=로켓 과학에 필요한 기록이 담겨 있는 위성 원격 측정 장치입니다. 위성 로켓 격납고 혹은 우주 탐사선 로켓 격납고에서 [img=item/satellite] 내비게이션 위성을 발사하여 얻습니다. +se-antimatter-canister=이동 용기에 안전하게 담겨진 밀도가 가장 높은 형태의 에너지입니다. +se-astronomic-science-pack-1=우주 연구소에서 연구하는 데 사용됩니다. +se-astronomic-science-pack-2=우주 연구소에서 연구하는 데 사용됩니다. +se-astronomic-science-pack-3=우주 연구소에서 연구하는 데 사용됩니다. +se-astronomic-science-pack-4=우주 연구소에서 연구하는 데 사용됩니다. +se-beryllium-ore=베릴륨 광석 +se-biological-science-pack-1=우주 연구소에서 연구하는 데 사용됩니다. +se-biological-science-pack-2=우주 연구소에서 연구하는 데 사용됩니다. +se-biological-science-pack-3=우주 연구소에서 연구하는 데 사용됩니다. +se-biological-science-pack-4=우주 연구소에서 연구하는 데 사용됩니다. +se-canister=다목적 격납 용기입니다. +se-cargo-rocket-cargo-pod=화물 로켓의 구성 요소입니다. +se-cargo-rocket-fuel-tank=화물 로켓의 구성 요소입니다. +se-cargo-rocket-section=화물 로켓의 주요 재료입니다. 화물 로켓 격납고에 삽입하세요. 로켓 하나 당 100개가 필요합니다. 로켓 착륙을 통해 회수할 수 있습니다 (기본 회수율 20%). +se-cargo-rocket-section-packed=운송을 위해 포장된 화물 로켓 부품입니다. 로켓 구축에 사용하려면 우선 포장을 풀어야 합니다. +se-bloater-ammo=땅에 감염성 바이오슬러지 풀을 만듭니다. 감염된 적은 부풀어올라 이동이 어려워지고 시간이 지남에 따라 피해를 받습니다. 부풀어 오른 상태에서 죽게 되면 파열되어 내장이 주변으로 튀고, 그것이 다시 적에게 묻으면 추가적인 피해와 함께 전염 파도가 만들어집니다. 내장 발사체의 총 피해는 최대 HP의 50%입니다. +se-pheromone-ammo=바이터나 스피터들을 혼란시켜, 플레이어를 우호적이며, 다른 바이터나 스피터들을 적이라 생각하게 만듭니다. +se-cryogun=적을 얼릴 수 있는 얼음 벽을 만듭니다. +se-deep-space-science-pack=우주 연구소에서 연구하는 데 사용됩니다. +se-energy-science-pack-1=우주 연구소에서 연구하는 데 사용됩니다. +se-energy-science-pack-2=우주 연구소에서 연구하는 데 사용됩니다. +se-energy-science-pack-3=우주 연구소에서 연구하는 데 사용됩니다. +se-energy-science-pack-4=우주 연구소에서 연구하는 데 사용됩니다. +se-heat-shielding=고온 응용과 우주 구조물에 사용되는 복합 패널입니다. +se-holmium-ore=홀뮴 광석 +se-iridium-ore=이리듐 광석 +se-material-science-pack-1=우주 연구소에서 연구하는 데 사용됩니다. +se-material-science-pack-2=우주 연구소에서 연구하는 데 사용됩니다. +se-material-science-pack-3=우주 연구소에서 연구하는 데 사용됩니다. +se-material-science-pack-4=우주 연구소에서 연구하는 데 사용됩니다. +se-medpack=체력을 회복하는데 사용됩니다. +se-medpack-2=체력을 회복하는데 사용됩니다. +se-medpack-3=체력을 회복하는데 사용됩니다. +se-medpack-4=체력을 회복하는데 사용됩니다. +se-meteor-defence=행성 전체에 떨어지는 운석을 모두 방어할 수 있지만, 한 번에 하나의 운석만을 쏠 수 있습니다. 운석 방어 탄약을 장전하고 발사하려면 완전히 충전되어야 합니다. 80%의 정확도를 갖습니다. 발사 후 재충전이 필요합니다. 충전 중에는 20 MW의 에너지를 소모합니다. +se-meteor-defence-ammo=운석을 파괴합니다. 운석 방어 장치에 장전되어야 합니다. +se-meteor-point-defence=주변 영역에 떨어지는 운석을 방어합니다. 하나의 방어 장치는 최대 네 개의 운석을 쏠 수 있습니다. 운석 국지방어 탄약을 장전하고 발사하려면 완전히 충전해야 합니다. 범위 64, 50%의 정확도를 갖으며, 발사 후 재충전까지 시간이 걸립니다. 운석 국지방어 장치를 회전시키면 충전 모드를 변경할 수 있습니다. +se-meteor-point-defence-container=운석을 파괴합니다. 운석 국지방어 장치에 장전되어야 합니다. +se-naquium-ore=나퀴움 광석입니다. 심우주에서만 찾을 수 있는 성간 공간의 보물입니다. +se-rocket-launch-pad-silo-dummy-ingredient-item=화물 로켓 격납고에 100개의 화물 로켓 부품과 하나의 우주 캡슐을 투입하여 만들어집니다. +se-rtg-equipment=방사성 붕괴로 생기는 열 에너지를 전기 에너지로 변환하는 휴대용 방사성동위원소 열전기 발전기입니다. 추가 연료 없이 수십 년간 지속됩니다. +se-rtg-equipment-2=방사성 붕괴로 생기는 열 에너지를 전기 에너지로 변환하는 개선된 휴대용 방사성동위원소 열전기 발전기입니다. 추가 연료 없이 수십 년간 지속됩니다. +se-plague-bomb=행성에 존재하는 모든 생명체들을 몰아낼 수 있는 무기입니다. 각별히 주의하여 취급하십시오. (모든 것이 서서히 죽어감에 따라 UPS를 심각한 수준으로 떨어뜨릴 수 있습니다. 대형 행성이나 멀티플레이어에서는 권하지 않습니다.) +se-space-capsule=화물 로켓에 필요한 제어 캡슐입니다. 탑승객을 가장 가까운 행성 표면으로 데려가 줄 수 있는 우주 캡슐입니다. __CONTROL__toggle-driving__ 키를 사용하여 캡슐에 들어갈 수 있습니다. +se-space-platform-plating=[font=default-bold][color=#f5cb48]배치 제한: 우주[/color][/font]\n빠르게 이동할 수 있는 고급 도금으로 이루어진 우주 플랫폼입니다. +se-space-platform-scaffold=[font=default-bold][color=#f5cb48]배치 제한: 우주[/color][/font]\n특정 구조물을 우주에 배치할 수 있도록 설계된 기초적인 비계 우주 플랫폼입니다. +se-space-rail=기차가 탈선하여 모든것을 파괴하는 것을 방지하도록 설계되어 우주에서도 안전하게 사용할 수 있는 철도입니다. 따로 우주 플랫폼 없이도 스스로 유지됩니다. 아름다운 외관을 위해 지면에서도 사용할 수 있습니다. +se-spaceship-floor=우주선 바닥은 우주선의 모든 부분에 깔려있어야 하며 바깥쪽 가장자리에는 우주선 격벽이 있어야 합니다. 바닥의 틈새는 우주선 격리를 깨뜨릴 것이며, 이 경우 분리될 수 있습니다. +se-superconductive-cable=능동적인 냉각을 할 필요가 없는 초전도 복합 케이블입니다. +se-tesla-gun=빠른 연쇄 번개 공격을 할 수 있습니다. +se-thruster-suit=우주에서 살아남기 위해 필요한 우주복입니다. \n추진기와 자기 부츠가 있습니다. +se-thruster-suit-2=우주에서 살아남기 위해 필요한 우주복입니다. \n더욱 강력한 추진기와 더욱 넓은 인벤토리 및 장비 그리드를 제공합니다. +se-thruster-suit-3=우주에서 살아남기 위해 필요한 우주복입니다. \n더욱 강력한 추진기와 더욱 넓은 인벤토리 및 장비 그리드를 제공합니다. +se-thruster-suit-4=우주에서 살아남기 위해 필요한 우주복입니다. \n더욱 강력한 추진기와 더욱 넓은 인벤토리 및 장비 그리드를 제공합니다. +space-science-pack=기존 많은 아이템의 업그레이드에 사용됩니다. +se-rocket-science-pack=우주 과학 연구소에서 연구하는 데 사용됩니다. 우주에서 만들어야 합니다. +utility-science-pack=기본 연구소에서 연구하는 데 사용됩니다. +beacon=8개의 모듈 슬롯이 있습니다. 장착된 모듈 효과를 주변 3 타일 내에 있는 아군 건물에 전달합니다. 동일한 건물에 둘 이상의 신호기가 있다면 과부하에 걸려 건물의 작동이 멈추게 됩니다. +se-wide-beacon=15개의 모듈 슬롯이 있습니다. 장착된 모듈 효과를 주변 14 타일 내에 있는 아군 건물에 전달합니다. 동일한 건물에 둘 이상의 신호기가 있다면 과부하에 걸려 건물의 작동이 멈추게 됩니다. +se-wide-beacon-2=20개의 모듈 슬롯이 있습니다. 장착된 모듈 효과를 주변 14 타일 내에 있는 아군 건물에 전달합니다. 동일한 건물에 둘 이상의 신호기가 있다면 과부하에 걸려 건물의 작동이 멈추게 됩니다. +se-lifesupport-equipment-1=생명 지원 효율을 100%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. +se-lifesupport-equipment-2=생명 지원 효율을 200%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. +se-lifesupport-equipment-3=생명 지원 효율을 400%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. +se-lifesupport-equipment-4=생명 지원 효율을 400%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. +se-delivery-cannon=운송 대포를 이용하여 자원을 정확하게 다른 곳으로 배달할 수 있습니다. +se-delivery-cannon-weapon=무기 운송 대포를 이용하여 특수 탄약을 정확하게 다른 곳으로 배달할 수 있습니다. +se-arcosphere=아코스피어 연구를 통해 얻었으며, 인포매트론을 통해 반환되었습니다. +se-deep-catalogue-1=나퀴움과 나노공학. +se-deep-catalogue-2=초격자 구조와 특이점, 그리고 소멸. +se-deep-catalogue-3=미시 우주 왜곡 및 초차원적 나노공학. +se-deep-catalogue-4=거시 우주 왜곡 및 추가 차원 이동. +se-arcosphere-collector=성간 공허에서 아코스피어를 수집합니다. 소행성 지대에 있는 우주 탐사선 로켓 격납고에서 발사되어야 합니다. 아코스피어는 많이 수집할수록 앞으로 더욱 발견하기가 어려워집니다. +se-star-probe=항성에서 데이터를 수집하고 [img=item/se-star-probe-data] 항성 탐사선 데이터를 제공합니다. 항성 궤도에 있는 우주 탐사선 로켓 격납고에서 발사되어야 합니다. +se-belt-probe=소행성 벨트 근처에서 데이터를 수집하고 [img=item/se-belt-probe-data] 소행성 벨트 탐사선 데이터를 제공합니다. 소행성 벨트에 있는 우주 탐사선 로켓 격납고에서 발사되어야 합니다. +se-void-probe=성간 공허에서 데이터를 수집하고 [img=item/se-void-probe-data] 성간 공허 탐사선 데이터를 제공합니다. 소행성 지대에 있는 우주 탐사선 로켓 격납고에서 발사되어야 합니다. +se-interstellar-data=움직이는 우주선 내 넥서스에서 만들 수 있습니다. 더 크고 빠른 우주선으로 성간 우주공간을 이동할 때 더 빠르게 데이터가 생성됩니다. + +[recipe-name] +core-fragment=심층 파편 처리 (__1__) +rocket-fuel=고체 로켓 연료 +se-astrometric-analysis-multispectral-1=다중분광 천문학 분석 1 +se-astrometric-analysis-multispectral-2=다중분광 천문학 분석 2 +se-astrometric-analysis-multispectral-3=다중분광 천문학 분석 3 +se-astronomic-insight-1=천문학적 통찰 +se-astronomic-insight-2=광범위한 천문학적 통찰 +se-astronomic-insight-3=포괄적인 천문학적 통찰 +se-astronomic-insight-4=확장된 천문학적 통찰 +se-biological-insight-1=생물학적 통찰 +se-biological-insight-2=광범위한 생물학적 통찰 +se-biological-insight-3=포괄적인 생물학적 통찰 +se-biological-insight-4=확장된 생물학적 통찰 +se-bio-methane-to-crude-oil=메탄을 원유로 바이오 처리 +se-bio-sludge-crude-oil=실험적인 바이오매스에서 바이오슬러지 추출 +se-bio-sludge-decontamination=바이오슬러지 오염 제거 +se-bio-sludge-from-fish=물고기에서 바이오슬러지 추출 +se-bio-sludge-from-wood=나무에서 바이오슬러지 추출 +se-bio-sludge-from-vitamelange=비타멜란지에서 바이오슬러지 추출 +se-bio-sludge=바이오매스에서 바이오슬러지 추출 +se-broken-data-scrapping=손상된 데이터 카드 파쇄 +se-cargo-rocket-section-pack=화물 로켓 부품 포장 +se-cargo-rocket-section-unpack=화물 로켓 부품 포장 풀기 +se-condenser-turbine-reclaim-water=물절약 발전 +se-core-fragment-omni=심층 파편 처리 +se-core-mining=심층 채광 +se-empty-antimatter-canister=반물질 용기 추출 +se-empty-barrel-scrapping=빈 배럴 파쇄 +se-empty-barrel-reprocessing=빈 배럴 재처리 +se-space-capsule-scrapping=우주 캡슐 파쇄 +se-cargo-pod-scrapping=화물 포드 파쇄 +se-energy-insight-1=에너지 통찰 +se-energy-insight-2=광범위한 에너지 통찰 +se-energy-insight-3=포괄적인 에너지 통찰 +se-energy-insight-4=확장된 에너지 통찰 +se-formatting-1=데이터 포맷 +se-formatting-2=효율적인 데이터 포맷 +se-formatting-3=진보된 데이터 포맷 +se-formatting-4=심층 데이터 포맷 +se-material-insight-1=물질 통찰 +se-material-insight-2=광범위한 물질 통찰 +se-material-insight-3=포괄적인 물질 통찰 +se-material-insight-4=확장된 물질 통찰 +se-matter-fusion-copper=물질 융합 (구리 광석) +se-matter-fusion-dirty=물질 융합 (고철) +se-matter-fusion-iron=물질 융합 (철 광석) +se-matter-fusion-stone=물질 융합 (돌) +se-matter-fusion-uranium=물질 융합 (우라늄 광석) +se-matter-fusion-to=물질 융합 (__1__) +se-orbital-data=궤도 계산 데이터 +se-plasma-canister-empty=빈 플라즈마 용기 +se-pulverised-sand=분쇄된 모래 +se-radiating-space-coolant-fast=열유체를 -10°C로 빠르게 냉각 (냉각) +se-radiating-space-coolant-normal=열유체를 -10°C로 냉각 (냉각) +se-radiating-space-coolant-slow=열유체를 -10°C로 효율적으로 냉각 (냉각) +se-mixed-methane-gas-separation=혼합된 메탄 가스 분리 +se-rocket-fuel-from-water-copper=물로부터 로켓 연료 생산 +se-scrap-decontamination=고철 정화 +se-scrap-recycling=고철 재활용 +se-space-coolant-cold=열유체를 -100°C로 초냉각 (냉각) +se-space-coolant-supercooled=열유체를 -273°C로 초냉각 (초냉각) +se-space-coolant-supercooled-cryonite=열유체를 -273°C로 크라이오냉각 (초냉각) +se-space-coolant-cold-cryonite=열유체를 -100°C로 크라이오냉각 (냉각) +se-space-coolant-supercoole-cryonite=열유체를 -273°C로 크라이오냉각 (초냉각) +se-simulation-a=천문학 모의실험 +se-simulation-ab=배종발달설 모의실험 +se-simulation-abm=외계기원설 모의실험 +se-simulation-am=물질분포 모의실험 +se-simulation-as=천체입자 모의실험 +se-simulation-asb=천문생체공학 모의실험 +se-simulation-asbm=범우주 모의실험 +se-simulation-asm=천체물리학 모의실험 +se-simulation-b=생물학 모의실험 +se-simulation-bm=생체역학 모의실험 +se-simulation-m=물질 모의실험 +se-simulation-s=에너지 모의실험 +se-simulation-sb=생화학 모의실험 +se-simulation-sbm=나노기기 모의실험 +se-simulation-sm=나노소재 모의실험 +se-space-water-decontamination=우주 물 정화 +se-spaceship-rocket-engine-burn=액체 로켓 연료 연소 +se-specimen-fish=극미중력 어류 성장 +se-specimen-wood=극미중력 목재 성장 +se-thermodynamics-coal=석탄 압력 가압 +se-used-lifesupport-canister-cleaning=생명 지원 용기 청소 +se-used-lifesupport-canister-cleaning-space=생명 지원 용기 정화 +space-science-pack=최적화 과학 팩 +se-rocket-science-pack=로켓 과학 팩 +se-big-turbine-internal=초고온 증기 감압 +se-arcosphere-fracture=아코스피어 분극 +se-arcosphere-fold-in=아코스피어 전도 +se-arcosphere-fold-out=아코스피어 전도 +se-arcosphere-folding=아코스피어 접기: __1__ __2__ -> __3__ __4__ +se-electric-boiling-void=증발 배출 +se-space-probe-rocket-deployed=우주 탐사선 로켓 (전개됨) +se-distortion-drive=왜곡 드라이브 +se-generic-scrapping=__1__ 분쇄 +se-generic-recycling=__1__ 재활용 + +[recipe-description] +se-astronomic-insight-2=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-astronomic-insight-3=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-astronomic-insight-4=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-biological-insight-2=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-biological-insight-3=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-biological-insight-4=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-core-mining=얻을 수 있는 실제 파편의 수는 행성에 따라 다릅니다. 실제 필요 시간은 행성이나 위성의 심층 채광 드릴의 수에 따라 다릅니다. +se-energy-insight-2=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-energy-insight-3=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-energy-insight-4=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-material-insight-2=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-material-insight-3=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-material-insight-4=더욱 복잡하지만, 그만큼 더욱 자원 효율적입니다. +se-radiating-space-coolant-normal=반복적인 열 유체의 냉각과 가열은 열 유체의 손실을 유발합니다. +se-radiating-space-coolant-slow=반복적인 열 유체의 냉각과 가열은 열 유체의 손실을 유발합니다, 느린 냉각은 손실을 낮춥니다. +se-radiating-space-coolant-fast=반복적인 열 유체의 냉각과 가열은 열 유체의 손실을 유발합니다, 빠른 냉각은 손실을 높입니다. +se-delivery-cannon-weapon-pack-se-iridium-piledriver=작은 영역에서 막대한 물리 피해를 입히고 충격파로 2차 폭발 피해를 입힙니다. +se-arcosphere-fracture=아코스피어는 [img=item/se-arcosphere-collector] 아코스피어 수집기로 수집할 수 있습니다. +se-distortion-drive=넥서스 왜곡 기능을 활성화하고 게임에서 승리하려면 이 프로세스가 활발히 진행되어야 합니다. 임계 속도에서 8 GW를 사용합니다. + +[technology-name] +effectivity-module-4=효율 모듈 4 +effectivity-module-5=효율 모듈 5 +effectivity-module-6=효율 모듈 6 +effectivity-module-7=효율 모듈 7 +effectivity-module-8=효율 모듈 8 +effectivity-module-9=효율 모듈 9 +energy-shield-equipment=에너지 보호막 +energy-shield-mk2-equipment=에너지 보호막 MK2 +energy-shield-mk3-equipment=에너지 보호막 MK3 +energy-shield-mk4-equipment=에너지 보호막 MK4 +energy-shield-mk5-equipment=에너지 보호막 MK5 +energy-shield-mk6-equipment=에너지 보호막 MK6 +sand-processing=모래 공정 +glass-processing=유리 공정 +liquid-rocket-fuel=액체 로켓 연료 +productivity-module-4=생산 모듈 4 +productivity-module-5=생산 모듈 5 +productivity-module-6=생산 모듈 6 +productivity-module-7=생산 모듈 7 +productivity-module-8=생산 모듈 8 +productivity-module-9=생산 모듈 9 +rocket-silo=위성 로켓 격납고 +rocketry=전투 로켓 공학 +se-adaptive-armour=적응형 아머 +se-antimatter-engine=반물질 엔진 +se-antimatter-reactor=반물질 원자로 +se-antimatter-production=반물질 생산 +se-astronomic-science-pack=천문학 과학 팩 +se-biological-science-pack=생물학 과학 팩 +se-condenser-turbine=콘덴서 터빈 +se-core-miner=심층 채광 +se-biogun=바이오건 +se-cryogun=크라이오건 +se-deep-space-science-pack=심우주 과학 팩 +se-deep-catalogue=심우주 카탈로그 +se-dimensional-anchor=차원 정박기 +se-electric-boiler=전기 보일러 +se-energy-science-pack=에너지 과학 팩 +se-fluid-burner-generator=유체 등온 발전기 +se-fuel-refining=연료 정제 +se-heat-shielding=단열재 +se-long-range-star-mapping=장거리 우주 지도 제작 +se-material-science-pack=물질 과학 팩 +se-medpack=구급팩 +se-medpack-2=구급팩 2 +se-medpack-3=구급팩 3 +se-medpack-4=구급팩 4 +se-meteor-defence=운석 방어 장치 +se-meteor-point-defence=운석 국지방어 장치 +se-nanomaterial=나노소재 +se-plague=역병 +se-processing-beryllium=베릴륨 가공 +se-processing-cryonite=크라이오나이트 가공 +se-processing-holmium=홀뮴 가공 +se-processing-iridium=이리듐 가공 +se-processing-naquium=나퀴움 가공 +se-processing-vitamelange=비타멜란지 가공 +se-processing-vulcanite=불카나이트 가공 +se-pulveriser=분쇄기 +se-railgun=레일건 +se-rocket-cargo-safety=로켓 화물 안정성 +se-rocket-fuel-from-water=물에서 로켓 연료 제작 +se-rocket-launch-pad=화물 로켓 격납고 +se-rocket-landing-pad=로켓 착륙 패드 +se-rocket-reusability=로켓 재사용성 +se-rocket-survivability=로켓 생존성 +se-rtg-equipment=휴대용 RTG +se-rtg-equipment-2=휴대용 RTG MK2 +se-space-assembling=우주 조립 +se-space-accumulator=홀뮴 축전지 +se-space-accumulator-2=나퀴움 축전지 +se-space-astrometrics-laboratory=천문학 실험실 +se-space-biochemical-laboratory=생화학 실험실 +se-space-catalogue-astronomic=천문학 카탈로그 +se-space-catalogue-biological=생물학 카탈로그 +se-space-catalogue-universal=범우주 카탈로그 +se-space-catalogue-energy=에너지 카탈로그 +se-space-catalogue-material=물질 카탈로그 +se-space-data-card=데이터 카드 +se-space-decontamination-facility=오염 제거 시설 +se-space-electromagnetics-laboratory=전자기학 실험실 +se-space-genetics-laboratory=유전학 실험실 +se-space-gravimetrics-laboratory=중력학 실험실 +se-space-growth-facility=성장 시설 +se-space-hypercooling=초냉각 +se-space-laser-laboratory=레이저 실험실 +se-lifesupport-facility=생명 지원 시설 +se-space-manufactory=우주 제조기 +se-space-material-fabricator=소재 제작기 +se-space-matter-fusion=물질 융합 +se-space-mechanical-laboratory=기계학 실험실 +se-space-particle-accelerator=입자 가속기 +se-space-particle-collider=입자 충돌기 +se-space-plasma-generator=플라즈마 생성기 +se-space-platform-plating=도금 우주 플랫폼 +se-space-platform-scaffold=우주 플랫폼 비계 +se-space-radiation-laboratory=방사선 실험실 +se-space-radiating-efficiency=효율적인 방열 +se-space-radiating-speed=빠른 방열 +se-space-radiator=방열기 +se-space-radiator-2=방열기 2 +se-space-rail=우주 철도 +se-recycling-facility=재활용 시설 +se-space-science-lab=우주 과학 연구소 +se-space-simulation-ab=배종발달설 모의실험 +se-space-simulation-am=천체물질 모의실험 +se-space-simulation-as=천체입자 모의실험 +se-space-simulation-bm=생체역학 모의실험 +se-space-simulation-sb=생화학 모의실험 +se-space-simulation-sm=나노소재 모의실험 +se-space-simulation-abm=외계기원설 모의실험 +se-space-simulation-asb=천문생체공학 모의실험 +se-space-simulation-asm=천체물리학 모의실험 +se-space-simulation-sbm=나노기기 모의실험 +se-space-simulation-asbm=범우주 모의실험 +se-space-solar-panel=평면 태양 전지판 +se-space-spectrometry-facility=분광 시설 +se-space-supercomputer=슈퍼 컴퓨터 +se-space-telescope=망원경 +se-space-telescope-gammaray=감마선 망원경 +se-space-telescope-xray=X선 망원경 +se-space-telescope-microwave=마이크로파 망원경 +se-space-telescope-radio=전파 망원경 +se-space-thermodynamics-laboratory=열역학 실험실 +se-spaceship=우주선 +se-spaceship-integrity=우주선 구조 강도 +se-factory-spaceship=우주선 공장화 +se-superconductive-cable=초전도 케이블 +se-teleportation=순간이동 +se-tesla-gun=테슬라 건 +se-thruster-suit=우주복 +space-science-pack=과학팩 최적화 +se-rocket-science-pack=로켓 과학 팩 +speed-module-4=속도 모듈 4 +speed-module-5=속도 모듈 5 +speed-module-6=속도 모듈 6 +speed-module-7=속도 모듈 7 +speed-module-8=속도 모듈 8 +speed-module-9=속도 모듈 9 +se-aeroframe-pole=에어로프레임 막대 +se-aeroframe-scaffold=에어로프레임 비계 +se-aeroframe-bulkhead=에어로프레임 격벽 +se-lattice-pressure-vessel=격자 압력 용기 +se-heavy-girder=고중량 거더 +se-heavy-bearing=고중량 베어링 +se-heavy-composite=고중량 복합재 +se-heavy-assembly=고중량 조립체 +se-bioscrubber=바이오 스크러버 +se-vitalic-epoxy=비탈릭 에폭시 +se-vitalic-reagent=비탈릭 시약 +se-vitalic-acid=비탈릭 산 +se-self-sealing-gel=자가 밀봉 젤 +se-holmium-cable=홀뮴 케이블 +se-holmium-solenoid=홀뮴 솔레노이드 +se-quantum-processor=양자 처리 장치 +se-dynamic-emitter=역동 방출기 +se-naquium-processor=나퀴움 처리 장치 +se-naquium-cube=나퀴움 큐브 +se-naquium-tessaract=나퀴움 테서랙트 +se-wide-beacon=광역 신호기 +se-wide-beacon-2=광역 신호기 2 +se-lifesupport-equipment=생명 유지 장비 +se-lifesupport-equipment-1=생명 유지 장비 MK1 +se-lifesupport-equipment-2=생명 유지 장비 MK2 +se-lifesupport-equipment-3=생명 유지 장비 MK3 +se-lifesupport-equipment-4=생명 유지 장비 MK4 +se-supercharger=초고속 충전기 +se-addon-power-pole=부속 전신주 +se-pylon=송전탑 +se-pylon-substation=변전 송전탑 +se-pylon-construction=건설 송전탑 +se-pylon-construction-radar=레이더 건설 송전탑 +se-shield-projector=보호막 프로젝터 +se-deep-space-transport-belt=심우주 운송 벨트 +se-big-turbine=초고온 터빈 발전기 +se-big-heat-exchanger=초고온 열교환기 +se-zone-discovery-random=구역 탐색 +se-zone-discovery-targeted=대상중점 구역 탐색 +se-zone-discovery-deep=심우주 구역 탐색 +se-delivery-cannon=배달 대포 +se-delivery-cannon-weapon=무기 배달 대포 +se-spaceship-clamps=우주선 도킹 클램프 +se-bio-upgrade-constitution=생체 강화: 체질 +se-bio-upgrade-strength=생체 강화: 근력 +se-bio-upgrade-agility=생체 강화: 민첩 +se-bio-upgrade-dexterity=생체 강화: 손재주 +se-bio-upgrade-intelligence=생체 강화: 지능 +se-energy-beaming=에너지 빔 +se-energy-beam-defence=우산: 에너지 빔 방어 시설 +se-nexus=넥서스 +se-spaceship-victory=우주선 승리 +se-arcosphere=아코스피어 수집 +se-arcosphere-folding=아코스피어 접기 +se-space-probe=우주 탐사선 로켓 격납고 +se-linked-container=아코링크 보관함 +k2-conversion=__1__ 변환 + +[technology-description] +energy-shield-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +energy-shield-mk2-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +energy-shield-mk3-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +energy-shield-mk4-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +energy-shield-mk5-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +energy-shield-mk6-equipment=빠르게 충전되지만 많은 에너지를 사용하는 보호막입니다. +sand-processing=원료를 부수고 자르고 여과하여 깨끗한 모래로 만듭니다. +glass-processing=모래를 녹여 유리를 만듭니다. +rocket-silo=새로운 천체를 발견하기 위해 위성을 궤도로 발사할 수 있습니다. +se-adaptive-armour=에너지를 사용하여 스스로를 수리하는 아머입니다. 에너지 보호막과 유사하지만 에너지 소모량은 낮고 재생 속도는 훨씬 느립니다. +se-antimatter-engine=반물질 소멸을 통해 생겨나는 에너지로 놀라운 추진력을 얻습니다. +se-antimatter-reactor=물질과 반물질끼리 쌍소멸을 일으켜 놀라운 수준의 열을 발생시킵니다. +se-antimatter-production=밀도가 가장 높은 형태의 에너지인 반물질을 만듭니다. +se-astronomic-science-pack=우주 여행 및 성간 물류와 연관된 기술을 연구할 수 있습니다. +se-biological-science-pack=신체 능력이나 생체 무기, 신경 처리 개선과 관련된 기술을 연구할 수 있습니다. +se-condenser-turbine=75%의 에너지 효율을 지녔지만 사용된 증기의 99%가 다시 물로 반환되는 증기 터빈입니다. 온도 범위는 100도 ~ 999도 입니다. \n최대 출력량: 10MW +se-core-miner=행성과 위성에서 끊임없이 자원을 추출할 수 있지만, 같은 표면에서 여러 대를 배치하면 채취 효율이 낮아집니다. +se-biogun=다양한 바이오 무기를 사용할 수 있는 총입니다. +se-cryogun=적을 얼릴 수 있는 얼음 벽을 만듭니다. +se-deep-catalogue=컴퓨터 시뮬레이션과 분석을 위해 공간 왜곡, 외계 물질, 구조화된 나노 기술 데이터를 준비합니다. 진보된 기술 발전에 필요합니다. +se-deep-space-science-pack=여러 최첨단 기술에 필요합니다. +se-dimensional-anchor=항성의 중력과 공간 이상을 위한 안정화 지점을 사용합니다. +se-electric-boiler=전기 에너지를 사용하여 물을 증기로 만듭니다. 에너지 효율은 90%입니다. +se-energy-science-pack=기본 힘 및 아원자 발견과 관련된 기술을 연구할 수 있습니다. +se-fluid-burner-generator=전기를 생산하기 위해 에너지를 가진 액체 연료 (대표적으로 액체 로켓 연료)를 연소합니다. 단순하고 작지만 보다 큰 증기 기반 발전 시스템에 비하면 효율이 낮습니다. 우주를 위해 설계되었습니다. 실제 유체 소비량은 유체의 연료 값에 따라 다릅니다. +se-fuel-refining=보다 발전된 연료를 정제합니다. +se-heat-shielding=고온 응용과 우주 구조물에 사용되는 복합 패널입니다. +se-long-range-star-mapping=일부 머나먼 곳에 있는 은하는 특이한 항성의 특정 패턴을 통해 식별할 수 있습니다. 결과 내용은 [img=virtual-signal/informatron] 인포매트론 [__CONTROL__informatron__] 에 기록됩니다. +se-material-science-pack=고급 공학 요구 사항을 중촉시키기 위한 고급 물질과 관련된 기술을 연구할 수 있습니다. +se-medpack=구급팩을 사용하여 체력을 회복합니다. +se-medpack-2=구급팩을 사용하여 체력을 회복합니다. +se-medpack-3=구급팩을 사용하여 체력을 회복합니다. +se-medpack-4=구급팩을 사용하여 체력을 회복합니다. +se-meteor-defence=당신이 이뤄낸 공장을 파괴하려는 운석들이 내려앉기 전에 쏴서 없애버리세요. 운석 방어 장치는 행성 전역에 떨어지는 운석을 없앨 수 있지만, 한 번에 하나의 운석만 요격할 수 있습니다. +se-meteor-point-defence=당신이 이뤄낸 공장을 파괴하려는 운석들이 내려앉기 전에 쏴서 없애버리세요. 운석 국지방어 장치는 작은 영역에 떨어지는 운석을 한 번에 4개까지 요격할 수 있습니다 +se-nanomaterial=우수한 특성을 가진 복합재를 만들기 위해 나노 크기로 구성된 다양한 소재의 복잡한 배열입니다. +se-railgun=전자기력으로 가속된 다트는 증발하기 직전 플라즈마 흔적을 남길 정도의 속도로 추진됩니다. 높은 피해량, 느린 발사 속도를 지녔습니다. +se-plague=모든 생명체를 행성에서 멸절시킬 수 있는 대전염병입니다. "매우 주의해서" 다뤄야 합니다. +se-processing-beryllium=녹주석을 매우 가볍고 강력하며 훌륭한 내식성과 방사선 차폐 기능을 지닌 베릴륨으로 만듭니다. 또한 X선과도 거의 반응하지 않습니다. +se-processing-cryonite=차가운 크라이오나이트 결정을 냉동과 냉각, 그리고 윤활제로 활용될 수 있는 크라이오나이트 막대로 만듭니다. 크라이오나이트는 주로 냉대 행성에서 발견됩니다. +se-processing-holmium=홀미나이트를 어떤 원소보다도 높은 투자율을 가진 희토류 금속인 홀뮴으로 만듭니다. +se-processing-iridium=이리다이트를 고온에서 내식성이 가장 강력한 금속이자 매우 높은 밀도를 자랑하는 이리듐으로 만듭니다. 고중량 응용 작업에 중요합니다. +se-processing-naquium=신비롭고 아름다운 깊은 우주 공간에 존재하는 나퀴움 결정을 비정상적인 시공간 상호 작용을 하는 금속과 유사한 물질인 나퀴움으로 만듭니다. +se-processing-vitamelange=원시의 비타멜란지인 바위해면을 귀중한 영양 추출물로 만듭니다. +se-processing-vulcanite=화산 지대에서 발견되는 불카나이트를 고급 제련과 로켓 연료 및 다양한 고온 화학 공정에서 사용할 수 있는 정제된 가루로 만듭니다. 불카나이트는 화산 환경의 행성과 대부분의 심층 파편 속에서 발견됩니다. +se-pulveriser=매우 단단한 광물과 행성의 중심에서 끌어올린 심층 파편을 부수고 자릅니다. +se-rocket-cargo-safety=화물 포드가 운송 중에 손상될 가능성을 10% 감소시킵니다 (곱연산). +se-rocket-fuel-from-water=물을 전기 분해하여 수소-산소 로켓 연료를 생산합니다. +se-rocket-landing-pad=로켓 화물 포드를 지정된 착륙 패드로 전달할 수 있습니다. 추가 연구를 통해 로켓 부품의 일부를 회수할 수도 있습니다. +se-rocket-launch-pad=우주나 다른 행성으로 화물을 발사할 수 있습니다. +se-rocket-reusability=착륙 패드에 성공적으로 착륙하였을 때 회수할 수 있는 로켓 부품의 비율을 4% 증가시킵니다 (기본 20%, 최대 100%). +se-rocket-survivability=로켓이 이동 중에 손상되거나 항법 고장으로 인해 착륙을 실패할 가능성을 10% 줄입니다 (곱연산). +se-rtg-equipment=방사성 붕괴로 생기는 열 에너지를 전기 에너지로 변환하는 휴대용 방사성동위원소 열전기 발전기입니다. 추가 연료 없이 수십 년간 지속됩니다. +se-rtg-equipment-2=방사성 붕괴로 생기는 열 에너지를 전기 에너지로 변환하는 개선된 휴대용 방사성동위원소 열전발전기입니다. 추가 연료 없이 수십 년간 지속됩니다. +se-space-assembling=우주에서 작동하도록 설계된 조립 기계입니다. +se-space-astrometrics-laboratory=다양한 천문학 정보를 결합, 비교하고 정량화합니다. +se-space-biochemical-laboratory=전문적인 생화학 연구 및 실험을 할 수 있는 고급 화학 실험실입니다. 또한 기초적인 화학과 원유 처리를 수행할 수 있습니다. +se-space-catalogue-astronomic=분석과 컴퓨터 시뮬레이션을 위해 갖추어진 구조화된 천문학 데이터입니다. 추가적인 천문학 연구에 필요합니다. +se-space-catalogue-biological=분석과 컴퓨터 시뮬레이션을 위해 갖추어진 구조화된 생물학 데이터입니다. 추가적인 생물학 연구에 필요합니다. +se-space-catalogue-universal=분석과 컴퓨터 시뮬레이션을 위해 갖추어진 결합된 데이터입니다. 추가적인 심우주 연구에 필요합니다. +se-space-catalogue-energy=분석과 컴퓨터 시뮬레이션을 위해 갖추어진 구조화된 에너지 데이터입니다. 추가적인 에너지 연구에 필요합니다. +se-space-catalogue-material=분석과 컴퓨터 시뮬레이션을 위해 갖추어진 구조화된 물질 데이터입니다. 추가적인 물질 연구에 필요합니다. +se-space-data-card=다목적 데이터 저장 장치입니다. 고급 데이터 기반 연구에 필요합니다. +se-space-decontamination-facility=무균 환경에서 사용하기 위해 물질을 세척하고 저압의 조건에서도 사용할 수 있는 액체를 준비합니다. +se-space-electromagnetics-laboratory=강한 자기장과 매우 높은 전압을 적용하기 위한 장비입니다. +se-space-genetics-laboratory=유전자 배열과 변형, 그리고 문화 유전자 인쇄를 전담하는 실험실입니다. +se-space-gravimetrics-laboratory=중력 교란을 분석하고 시뮬레이션합니다. +se-space-growth-facility=다른 환경에서는 불가능한 미세 중력과 같은 다양한 제어 가능 조건에서 생물학적 표본을 성장시킵니다. +se-space-hypercooling=열유체의 열 교환을 수행하여 하나는 뜨겁고 다른 하나는 차갑게 만듭니다. +se-space-laser-laboratory=레이저를 이용한 실험을 진행합니다. 눈 보호 장비를 잊지 마세요! +se-lifesupport-facility=더욱 적대적인 환경에서 생명을 보호하고 지원해 줍니다. +se-space-manufactory=우주 대량 생산을 위한 핵심 기술입니다. +se-space-material-fabricator=새로운 소재를 합성합니다. 입자 충돌기와 3D 프린터의 중간 단계입니다. +se-space-matter-fusion=융합을 통해 다른 물질로 제작합니다. +se-space-mechanical-laboratory=부수고, 자르고, 깎고, 흔드는 등 다양한 기계적 공정을 지원합니다. +se-space-particle-accelerator=빛의 속도에 가까운 속도로 입자를 가속화합니다. +se-space-particle-collider=고속 입자를 충돌시키고 결과를 분석합니다. +se-space-plasma-generator=다양한 플라즈마를 생성합니다. +se-space-platform-plating=견고하게 도금된 우주 플랫폼입니다. 더욱 부드럽고 빠르게 이동할 수 있습니다. +se-space-platform-scaffold=기초적인 비계 우주 플랫폼입니다. 건물을 세울 수는 있지만, 걷기에는 좋지 않습니다. +se-space-radiation-laboratory=방사성 물질을 가지고 놀기에 비교적 안전한 곳입니다. 일반 우라늄 처리에도 사용할 수 있습니다. +se-space-radiator=뜨거운 열유체의 열을 방출시킵니다. +se-space-radiator-2=뜨거운 열유체의 열을 방출시킵니다. +se-space-radiating=뜨거운 열유체의 열을 느리게, 자원 효율적으로 냉각시킵니다. +se-space-rail=기차가 탈선하여 모든것을 파괴하는 것을 방지하도록 설계되어 우주에서도 안전하게 사용할 수 있는 철도입니다. 아름다운 외관을 위해 지면에서도 사용할 수 있습니다. +se-recycling-facility=아이템을 분쇄하고 고철을 원자재로 재처리합니다. +se-space-science-lab=로켓 과학 팩과 고급 우주 과학 연구를 할 수 있습니다. +se-space-simulation-ab=여러 분야를 결합하여 보다 효율적인 모의실험을 진행할 수 있습니다. +se-space-simulation-am=여러 분야를 결합하여 보다 효율적인 모의실험을 진행할 수 있습니다. +se-space-simulation-as=여러 분야를 결합하여 보다 효율적인 모의실험을 진행할 수 있습니다. +se-space-simulation-bm=여러 분야를 결합하여 보다 효율적인 모의실험을 진행할 수 있습니다. +se-space-simulation-sb=여러 분야를 결합하여 보다 효율적인 모의실험을 진행할 수 있습니다. +se-space-simulation-sm=여러 분야를 결합하여 보다 효율적인 모의실험을 진행할 수 있습니다. +se-space-simulation-abm=여러 분야를 결합하여 보다 효율적인 모의실험을 진행할 수 있습니다. +se-space-simulation-asb=여러 분야를 결합하여 보다 효율적인 모의실험을 진행할 수 있습니다. +se-space-simulation-asm=여러 분야를 결합하여 보다 효율적인 모의실험을 진행할 수 있습니다. +se-space-simulation-sbm=여러 분야를 결합하여 보다 효율적인 모의실험을 진행할 수 있습니다. +se-space-simulation-asbm=여러 분야를 결합하여 보다 효율적인 모의실험을 진행할 수 있습니다. +se-space-solar-panel=위를 걸어 다닐 수 있는 효율 높은 태양 전지판입니다 +se-space-spectrometry-facility=분광 광도법, 가스 색층 분석법, 질량 분석법, 그리고 그 외 다양한 분광법을 다룹니다. 벽을 향해 빛을 쏴보고, 반사시키고, 부딫히는 위치를 확인해보세요. +se-space-supercomputer=고급 데이터 조작과 처리 및 시뮬레이션을 할 수 있습니다. +se-space-telescope=가시 스펙트럼 주변의 여러 파장에 민감하도록 정교하게 설계된 망원경입니다. +se-space-telescope-gammaray=감마선은 굴절되지 않습니다. 이 강력한 망원경은 거울과 특수 감지기를 이용하여 감마선을 감지해냅니다. +se-space-telescope-xray=X선은 대부분 대기에 의해 차단됩니다. 이 강력한 망원경은 대기 문제가 거의 없는 우주에서 작동하도록 설계되었습니다. +se-space-telescope-microwave=마이크로파와 우주배경복사를 감지하는 거대한 망원경입니다. +se-space-telescope-radio=머나먼 곳으로부터 감지되는 극도로 미세한 수준의 전파를 감지하는 거대한 망원경입니다. +se-space-thermodynamics-laboratory=극한의 온도와 관련된 작업을 처리합니다. 제련과 같은 기초적인 열 공정도 처리할 수 있습니다. +se-spaceship=바닥과 격벽으로 하나의 형태를 만들고 계기판을 통해 다른 행성이나 그 너머로 날아갈 수 있는 우주선입니다. +se-spaceship-integrity=매 레벨마다 우주선의 구조 무결성 강도 한계를 100만큼 증가시킵니다. +se-factory-spaceship=매 레벨마다 우주선의 구조 무결성 강도 한계를 500만큼 증가시킵니다. +se-superconductive-cable=능동적인 냉각을 할 필요가 없는 초전도 복합 케이블입니다. +se-teleportation=순간이동 기술을 잠금 해제합니다. 이정도로 안정적인 공간 왜곡 기술을 구현하는 것은 매우 어려운 일입니다. +se-tesla-gun=아주 빠르게 나아가는 연쇄 번개 공격을 할 수 있는 무기입니다. 연쇄 번개는 목표물 사이를 최대 30번 튕기며, 근처 목표물이 없다면 표면을 따라 빠르게 이동합니다. +se-thruster-suit=추진기와 자기 부츠가 있는 우주복입니다. 우주복 없이 우주로 나가지 마세요. +se-thruster-suit-2=더 강력한 추진기와 넓은 인벤토리 및 장비 슬롯을 갖춘 개선된 우주복입니다. +se-thruster-suit-3=더 강력한 추진기와 넓은 인벤토리 및 장비 슬롯을 갖춘 개선된 우주복입니다. +se-thruster-suit-4=더 강력한 추진기와 넓은 인벤토리 및 장비 슬롯을 갖춘 개선된 우주복입니다. +space-science-pack=이러한 발전의 혜택을 받아 로켓 과학 팩과 기술들을 보다 직접적으로 개발할 수 있게 됩니다. +se-aeroframe-pole=항공 및 우주 탐사를 위한 빔으로 일반적으로 사용되는 강력하고 가벼운 베릴륨 빔입니다. +se-aeroframe-scaffold=항공 및 우주 탐사선을 위한 주요 내부 프레임으로 일반적으로 사용되는 강력하고 가벼운 베릴륨 구조 프레임입니다. +se-aeroframe-bulkhead=항공 및 우주 탐사선의 외부 격벽 또는 2차 격실 벽으로 사용되는 강력하고 가벼운 베릴륨 격벽입니다. +se-lattice-pressure-vessel=내부 격자가 있는 강력한 경량 베릴륨 압력 용기로 특정 유체를 정상적인 한계 이상으로 압축할 수 있습니다. 파열되더라도 가압된 유체가 안전하게 배출됩니다. +se-heavy-girder=주로 중공업 및 군용 함선에 사용되는 고중량 이리듐 구조 빔입니다. +se-heavy-bearing=적은 물질을 부수는 한에서 끊임없이 사용할 수 있는 큰 크기의 고중량 이리듐 베어링입니다. +se-heavy-composite=열, 내식, 방사선 차폐는 물론 역학적 힘에도 영향을 거의 받지 않으면서도 믿겨지지 않을 만큼 무거운, 웬만해서는 뚫을 수 없을 정도로 아주 두꺼운 격벽입니다. +se-heavy-assembly=중공업에 사용되는 장치 및 구성 가능한 요소로 이루어진 고중량 조립체입니다. +se-bioscrubber=생물학적 공정을 사용하여 원하지 않는 물질을 분해하는 물질 처리실입니다. +se-vitalic-epoxy=재생 능력을 지녀 믿기지 않을 만큼 강력한 생체 에폭시입니다. +se-vitalic-reagent=광범위한 화학 반응을 도출해내기 위한 효율적인 다목적 시약입니다. +se-vitalic-acid=다양한 산성 물질의 강력한 혼합물입니다. +se-self-sealing-gel=압력을 받으면 젤로 변하지만 진공에 노출되면 강철처럼 단단해집니다. 종종 구멍난 부분을 직접 밀봉하기 위해 격벽의 내부 필름으로도 사용됩니다. +se-holmium-cable=민감한 전자 장치를 방해할 수 있는 선에서 원하지 않는 노이즈를 제거하도록 특별히 설계된 피복 케이블입니다. +se-holmium-solenoid=매우 강력한 전자석입니다. +se-quantum-processor=중첩과 얽힘을 이용하여 복잡한 문제를 보다 효율적으로 처리합니다. +se-dynamic-emitter=더욱 넓은 범위나 스캐닝 모드, 또는 물질 침투 특성에 대한 여러 특성을 변경할 수 있고 빠르게 조정할 수 있는 광자/입자 방출 시스템입니다. +se-naquium-cube=나퀴움의 시공간과의 비정상적인 상호 작용을 활용하여 큰 것을 작은 큐브로 접습니다. +se-naquium-tessaract=입방체와 같은 모양으로 자리 잡혀있지만 다른 기하학적인 도형으로 변화하는 이 특이한 물체는 계속 회전하거나 가속됩니다. +se-naquium-processor=나퀴움 테서랙트 내의 계산은 계산 밀도에 대한 일반적인 제한을 웃돕니다. +effect-transmission=신호기는 모듈의 효과를 주변 3타일 이내에 있는 아군 개체로 전달합니다. 8개의 모듈 슬롯이 있습니다. 동일한 건물에 둘 이상의 신호기가 있다면 과부하에 걸려 건물의 작동이 멈추게 됩니다. +se-wide-beacon=광역 신호기는 모듈의 효과를 주변 14타일 이내에 있는 아군 개체로 전달합니다. 15개의 모듈 슬롯이 있으며 업그레이드를 통해 20개를 사용할 수 있습니다. 동일한 건물에 둘 이상의 신호기가 있다면 과부하에 걸려 건물의 작동이 멈추게 됩니다. +se-wide-beacon-2=광역 신호기는 모듈의 효과를 주변 14타일 이내에 있는 아군 개체로 전달합니다. 20개의 모듈 슬롯이 있습니다. 동일한 건물에 둘 이상의 신호기가 있다면 과부하에 걸려 건물의 작동이 멈추게 됩니다. +se-lifesupport-equipment-1=생명 지원 효율을 100%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. +se-lifesupport-equipment-2=생명 지원 효율을 200%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. +se-lifesupport-equipment-3=생명 지원 효율을 400%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. +se-lifesupport-equipment-4=생명 지원 효율을 800%만큼 증가시켜줍니다 (합연산). 우주복이 아닌 아머에 삽입하면 효율이 절반으로 줄어들며 우주에서 작동하지 않습니다. +se-supercharger=한 번에 최대 64개의 로봇을 고속으로 충전할 수 있습니다. 충전기의 최대 전력 소모는 1GW입니다. +se-pylon=전기 에너지를 배분합니다. 64 타일까지 연결됩니다. +se-pylon-substation=전기 에너지를 배분합니다. 64 타일까지 연결되고 64x64 영역에 전력을 공급합니다. +se-pylon-construction=전기 에너지를 배분하고 건설 영역을 제공합니다. 64 타일까지 연결되고 64x64 영역에 건설 영역을 공급합니다. +se-pylon-construction-radar=전기 에너지를 배분하고 건설 영역을 제공하며 레이더처럼 주변을 밝혀줍니다. 64 타일까지 연결되고 256x256 영역에 건설 영역 제공 및 구역을 밝힙니다. 4x4 물류영역. +se-shield-projector=보호 역장을 생성합니다. 프로젝터는 충전 중 혹은 보호막이 손상된 경우에는 더욱 많은 에너지를 소모합니다. "Walls Block Spitters" 모드가 설치된 경우 스피터의 발사체를 막을 수 있습니다. +se-deep-space-transport-belt=우주에 배치할 수 있는 빠른 장거리 운송 벨트입니다. 여러 색상을 사용하여 멀리서도 운송 벨트 라인을 쉽게 식별할 수 있습니다. +se-big-turbine=5000°C의 증기를 받아 다른 한쪽 끝에 500°C의 증기를 내보내고 측면으로 물을 내보내는 대형 1GW 발전기입니다. 99%의 에너지 효율과 99%의 물을 절약할 수 있습니다. +se-big-heat-exchanger=초고온 고용량을 위해 설계된 대형 열 교환기입니다. +se-addon-power-pole=건물에 부착하거나 전력 공급 범위를 정밀하게 제어하기 위해 설계된 작은 전신주입니다. +se-zone-discovery-random=망원경을 사용하여 행성, 위성, 그리고 소행성대를 탐색하세요. +se-zone-discovery-targeted=원하는 자원이 있는 행성, 달, 그리고 소행성 벨트를 탐색합니다. [img=virtual-signal/informatron] 인포매트론 > 구역 탐색에서 찾고 싶은 자원 설정을 선택해야 합니다. +se-zone-discovery-deep=깊고 깊은 성간 우주에 있는 흥미로운 구역을 탐색합니다. 소행성 구역에서는 독특하고 귀중한 자원이 많이 있습니다. +se-delivery-cannon=궤도 너머로 자원을 발사해 머나먼 거리를 단숨에 운송할 수 있는 레일건 형태의 대포와 그것을 포착할 수 있는 무장형 상자입니다. +se-delivery-cannon-weapon=원자 폭탄같은 특수한 탄약을 다른 표면에 원격으로 발사할 수 있는 거대한 레일건입니다. +se-spaceship-clamps=도킹 클램프를 배치하여 우주선의 클램프와의 위치를 일치시켜 특정 위치에 정박할 수 있도록 합니다. 착륙을 자동화하려면 우주선 계기판에 "클램프로 정박"과 "클램프에 정박" 신호가 한 쌍으로 입력되어야 합니다. +se-bio-upgrade-constitution=최대 체력이 증가합니다. +se-bio-upgrade-strength=운반 용량이 증가합니다. +se-bio-upgrade-agility=이동 속도가 증가합니다. +se-bio-upgrade-dexterity=제작 속도가 증가합니다. +se-bio-upgrade-intelligence=각 과학팩으로부터 얻는 연구량이 증가합니다. +se-energy-beaming=하늘에서 내려오는 강력한 무기로 사용하거나 필요한 곳에 즉시 에너지를 공급할 수 있는 강력한 에너지 빔입니다. +se-energy-beam-defence=우주 기반의 에너지 빔과 코로나 질량 방출로부터 표면을 보호합니다. 자성 입자를 보호 기포로 부양시키고 적대적인 에너지 빔을 확산시키기 위해 필요에 따라 입자를 재정렬하고 덩어리로 만듭니다. +se-nexus=데이터를 생성하기 위해 성간 우주를 이동하는 우주선에서 활성화할 수 있는 장치로 추가 기술을 통해 우주 왜곡 필드를 활성화할 수 있습니다 (우주선 승리). +se-spaceship-victory=넥서스의 왜곡 드라이브를 활성화하여 지역 항성 성단에서 탈출할 수 있도록 합니다. 게임에서 승리하려면 3000 이상의 구조 강도를 지닌 우주선을 60초 동안 성간 우주에서 최소 250 이상의 속도로 주행하면서, 넥서스를 왜곡 드라이버 모드로 실행시키세요. +se-arcosphere=성간 공허에서 떠돌고 있는 아코스피어를 수집할 수 있습니다. +se-arcosphere-folding=초차원 집게로 아코스피어를 사용할 수 있습니다. +se-space-probe=우주 탐사선을 발사하기 위해 우주 환경을 기반으로 한 로켓 격납고입니다. 좀 더 저렴한 형태의 인공위성을 발사하는 데 사용할 수 있습니다. +se-linked-container=외부 차원 공간에 의해 다른 보관함과 연결되는 보관함입니다. 보관함의 링크는 보관함이 처음 배치되는 표면에 따라 다릅니다. + +[modifier-description] +tesla-shooting-speed-bonus=테슬라 발사 속도 +tesla-damage-bonus=테슬라 피해 보너스 +railgun-damage-bonus=레일건 피해 보너스 +railgun-shooting-speed-bonus=레일건 발사 속도 +cryogun-shooting-speed-bonus=크라이오건 발사 속도 +cryogun-damage-bonus=크라이오건 피해 보너스 +character-running-speed=캐릭터 이동 속도 보너스: +__1__ +character-crafting-speed=캐릭터 제작 속도: +__1__ + +[virtual-signal-name] +signal-speed=속도 신호 +se-signal-speed=속도 신호 +signal-distance=거리 신호 +se-signal-distance=거리 신호 +se-star=항성 +se-planet=행성 +se-planet-orbit=행성 궤도 +se-moon=위성 +se-moon-orbit=위성 궤도 +se-asteroid-belt=소행성 띠 +se-asteroid-field=소행성대 +se-anomaly=이상 현상 +se-meteor=운석 +se-spaceship=우주선 +se-cargo-rocket=화물 로켓 +se-remote-view=원격 보기 +se-death=사망 +se-character-corpse=시체 +se-ruin=폐허 +se-accolade=포상 +se-remove=제거 +se-radius=반지름 +se-hierarchy=계층 +se-spaceship-launch=우주선 발사 +se-anchor-using-left-clamp=우주선 왼쪽 클램프를 사용하여 정박 +se-anchor-using-right-clamp=우주선 오른쪽 클램프를 사용하여 정박 +se-anchor-to-left-clamp=왼쪽 클램프를 대상으로 정박 +se-anchor-to-right-clamp=오른쪽 클램프를 대상으로 정박 +se-beacon-overload=신호기 과부하 +se-heat=열 + +[controls] +se-remote-view=내비게이션 위성 +se-universe-explorer=우주 탐색기 +se-respawn=부활 +se-mode-toggle=구조 작동 모드 토글 + +[shortcut] +se-remote-view=내비게이션 위성 +se-universe-explorer=우주 탐색기 +se-respawn=부활 + +[shortcut-name] +se-remote-view=네비게이션 위성 [__CONTROL__se-remote-view__] +se-universe-explorer=우주 탐색기 [__CONTROL__se-remote-view__] +se-respawn=부활 [__CONTROL__se-respawn__] + +[tile-name] +se-space-platform-plating=도금 우주 플랫폼 +se-space-platform-scaffold=우주 플랫폼 비계 +se-space-platform-underlay=우주 +se-space-platform-underlay-l=우주 +se-space-platform-underlay-r=우주 +se-space=빈 공간 +se-regolith=레골리스 +se-asteroid=소행성 +se-spaceship-floor=우주선 바닥 + +[mod-setting-name] +se-meteor-interval=운석 최대 간격 +se-plague-max-runtime=역병 최대 지속시간 +se-planets=행성의 개수 +se-planet-size=행성 크기 (1% ~ 10000%) +se-seed=행성 생성 난수 +se-skip-experimental-warning=실험 버전 경고 무시 +se-print-meteor-info=콘솔에 운석 추락 경고 출력 +se-print-satellite-discovered-nothing=아무것도 발견 못한 위성 경고 띄우기 +se-space-pipe-capacity=우주 파이프 용량 +se-electric-boiler=전기 보일러 +se-deep-space-belt-speed=심우주 운송 벨트 속도 +se-deep-space-belt-black=검은색 심우주 운송 벨트 +se-deep-space-belt-white=흰색 심우주 운송 벨트 +se-deep-space-belt-red=빨간색 심우주 운송 벨트 +se-deep-space-belt-yellow=노란색 심우주 운송 벨트 +se-deep-space-belt-green=초록색 심우주 운송 벨트 +se-deep-space-belt-cyan=시안색 심우주 운송 벨트 +se-deep-space-belt-blue=파란색 심우주 운송 벨트 +se-deep-space-belt-magenta=마젠타색 심우주 운송 벨트 +se-space-science-pack=우주 과학 팩 대체 +se-never-show-lifesupport=생명 유지 GUI 보이지 않기 +se-show-zone-preview=구역 미리보기 창 보기 +se-pylon-charge-points=건설 송전탑 충전 지점 +se-cmes-max-frequency=코로나 질량 방출 최대 간격 +se-spawn-small-resources=보너스 시작 자원 패치 +se-show-overhead-button-satellite-mode=내비게이션 위성 업링크 버튼 표시 +se-show-overhead-button-interstellar-map=성간 지도 버튼 표시 +se-show-overhead-button-universe-explorer=우주 탐색기 버튼 표시 +se-scan-search-budget=스캔 탐색 비용 +se-scan-chart-budget=스캔 차트 비용 +se-scan-alert-interval=스캔 경고 주기 +se-supercharger-individual-charge-rate=초고속 충전기 개별 포트 충전율 (MW) + +[mod-setting-description] +se-meteor-interval=운석 추락 후 다음 운석 추락까지의 간격 (분)입니다. 운석 추락 후 다음 추락은 1과 지정된 값 사이의 임의의 시간 (분) 내에 발생하게 됩니다. +se-plague-max-runtime=생물학 무기의 최대 지속시간 (분)입니다. 이 시간동안 역병이 행성 전역으로 퍼지며 모든 역병 입자와 나무, 적들을 파괴합니다. +se-planets=게임 도중 바꾸지 마세요. +se-planet-size=게임 도중 바꾸지 마세요. +se-seed=게임 도중 바꾸지 마세요. +se-skip-experimental-warning=새로운 게임 시작 시 경고를 표시하지 않으며, 후에 메시지가 업데이트되어도 다시 표시하지 않습니다. +se-print-meteor-info=__CONTROL__toggle-console__ 키를 눌러 이전 운석 추락 경보를 다시 볼 수 있습니다. +se-print-satellite-discovered-nothing=위성이 발사되었을 때 무엇을 발견하였는지를 알려주는 경고를 띄웁니다. 이 설정은 위성이 아무것도 발견하지 못했을 때 경고를 비활성화합니다. +se-space-pipe-capacity=우주 파이프 한 칸이 갖는 유체 용량입니다. +se-electric-boiler=게임에 전기 보일러를 추가합니다. +se-deep-space-belt-speed=심우주 운송 벨트는 우주 탐사 모드 내에서 가장 빠른 운송 벨트입니다. 더욱 빠른 운송 벨트를 추가하는 다른 모드가 있다면 심우주 운송 벨트의 속도를 그에 맞추거나 그 이상으로 빠르게 할 수 있습니다. +se-deep-space-belt-black=검은색 운송 벨트, 분배기, 지하 벨트를 비활성화하여 UI상의 혼란을 줄일 수 있습니다. +se-deep-space-belt-white=흰색 운송 벨트, 분배기, 지하 벨트를 비활성화하여 UI상의 혼란을 줄일 수 있습니다. +se-deep-space-belt-red=빨간색 운송 벨트, 분배기, 지하 벨트를 비활성화하여 UI상의 혼란을 줄일 수 있습니다. +se-deep-space-belt-yellow=노란색 운송 벨트, 분배기, 지하 벨트를 비활성화하여 UI상의 혼란을 줄일 수 있습니다. +se-deep-space-belt-green=초록색 운송 벨트, 분배기, 지하 벨트를 비활성화하여 UI상의 혼란을 줄일 수 있습니다. +se-deep-space-belt-cyan=시안색 운송 벨트, 분배기, 지하 벨트를 비활성화하여 UI상의 혼란을 줄일 수 있습니다. +se-deep-space-belt-blue=파란색 운송 벨트, 분배기, 지하 벨트를 비활성화하여 UI상의 혼란을 줄일 수 있습니다. +se-deep-space-belt-magenta=마젠타색 운송 벨트, 분배기, 지하 벨트를 비활성화하여 UI상의 혼란을 줄일 수 있습니다. +se-space-science-pack=다른 모드를 통해 우주 과학 팩을 얻는 방법이 추가된다면 해당 방법이 사용됩니다. 만들 수 있는 방법이 없다면, 우주 탐사에서 제거하거나 최적화 과학 팩을 사용할 수 있습니다. +se-never-show-lifesupport=선택하면 질식 중에 있더라도 생명 유지 GUI를 보여주지 않습니다. +se-show-zone-preview=우주 탐색기에서 구역 미리보기 창을 비활성화하려면 해당 설정을 비활성화하세요. 팩토리오의 디버그 오버레이가 활성화되어 있는 경우 미리보기 창에서 FPS를 감소시킬 수 있습니다. +se-pylon-charge-points=건설 송전탑 충전 지점을 제거하려면 해당 설정을 비활성화하세요. 이렇게 하면 로봇의 충전 동작을 제어하는 데 도움이 되지만, 장거리 이동을 위해 다른 충전 방식을 추가해야 할 수 있습니다. +se-cmes-max-frequency=코로나 질량 방출 (CME) 이후 다음 CME까지의 최대 간격입니다. 값은 시간 단위이며 0일 경우 CME 이벤트가 발생하지 않습니다. 처음 게임 시작 시의 CME는 언제나 첫 순간에 스크립트에 의해 발생되며 대부분 큰 피해가 되지 않습니다. 두 번째는 약 48시간 뒤에 나가옵니다. 반복 간격은 최대 간격 설정의 50%에서 100% 사이입니다. 0이 아닌 설정은 새 이벤트에만 적용됩니다. 남은 시간이 설정되었을 경우 영향을 받지 않습니다. 0으로 설명하면 예약된 모든 CME가 지워지며, 해당 변경 사항이 적용되려면 최대 1분 가량의 시간이 소요될 수 있습니다. ; once an ETA has been set, it won't be affected. A zero setting will clear all scheduled CMEs, though it may take up to a minute for the change to take effect. +se-spawn-small-resources=시작 영역에 몇 가지 작은 자원 패치를 추가합니다. 자원 패치는 자원 간 이동 시간을 줄이기 위해 중앙 잔해 주변 가까이에 존재합니다. +se-show-overhead-button-satellite-mode=화면 왼쪽 상단에 내비게이션 위성 업링크를 띄우기 위한 작은 버튼을 표시합니다. +se-show-overhead-button-interstellar-map=화면 왼쪽 상단에 성간 지도를 띄우기 위한 작은 버튼을 표시합니다. +se-show-overhead-button-universe-explorer=화면 왼쪽 상단에 우주 탐색기를 띄우기 위한 작은 버튼을 표시합니다. +se-scan-search-budget=위성 스캐닝: 차트 상태를 확인할 수 있는 청크의 수입니다. 높은 값을 사용하면 이미 스캔한 청크를 통해 속도를 높여 가장자리까지 닿을 수 있습니다. +se-scan-chart-budget=위성 스캐닝: 차트 버퍼에 병렬로 추가할 수 있는 청크 요청 수입니다. 이전 청크가 완료되지 않았다면 새 차트 요청은 생성되지 않습니다. +se-scan-alert-interval=표면 스캔 업데이트 알림 사이의 간격 (초)입니다. 표면을 밝히면 게임 세이브 파일의 용량이 크게 증가하므로 되도록 파일을 그대로 두고 잊지 말도록 하세요. +se-supercharger-individual-charge-rate=초고속 충전기의 각 충전 포트의 충전 속도를 MW 단위로 설정합니다 (최대 충전 속도에는 영향 없음). 최소 값은 90 MW로 기본값 설정이며 바닐라 로봇을 단숨에 충전하기에 충분하며, 최대 값은 초고속 충전기의 최대 충전 속도인 1000 MW (1GW) 까지 가능합니다. + +[string-mod-setting] +se-space-science-pack-Remove=완전 제거 +se-space-science-pack-Replace=로켓 과학 팩으로 교체 +se-space-science-pack-OptimisationUranium=최적화: 우라늄-크라이오 제작법 +se-space-science-pack-OptimisationFish=최적화: 비타-불카-물고기 제작법 + +[autoplace-control-names] +planet-size=행성 크기 +se-water-ice=얼음 (우주 한정) +se-methane-ice=메탄 얼음 (우주 한정) +se-cryonite=크리오나이트 (모행성에는 없음) +se-vulcanite=불카나이트 (모행성에는 없음) +se-vitamelange=비타멜란지 (모행성에는 없음) +se-beryllium-ore=베릴륨 광석 (모행성에는 없음) +se-holmium-ore=홀뮴 광석 (모행성에는 없음) +se-iridium-ore=이리듐 광석 (모행성에는 없음) +se-naquium-ore=나퀴움 광석 (우주에만 존재함) + +[map-gen-preset-name] +space-exploration=우주 탐사 모드 기본값 + +[map-gen-preset-description] +space-exploration=우주 탐사 모드를 위한 기본값 + +[tooltip-category] +shot=사용 diff --git a/space-exploration_0.5.58/space-exploration/locale/pl/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/pl/strings.cfg new file mode 100644 index 0000000..a371c18 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/pl/strings.cfg @@ -0,0 +1,2073 @@ +spaceship-integrity100=+100 Integralność strukturalna statku kosmicznego +spaceship-integrity300=+300 Integralność strukturalna statku kosmicznego +spaceship-integrity500=+500 Integralność strukturalna statku kosmicznego +arcosphere-discovery=Wyłapuj kryształy przestrzeni z przestrzeni międzygwiezdnej +core-mining-productivity-5=+5% Wydajność wydobycia rdzenia +se-zone-discovery-random=Powoduje odkrywanie losowych stref podczas badania. +se-zone-discovery-targeted=Powoduje wykrywanie strefy ukierunkowanej na zasoby podczas badania. +se-zone-discovery-deep=Powoduje odkrywanie stref kosmicznych podczas badania. +unlock-spaceship-victory=Odblokowuje wygraną przez statek kosmiczny: Leć z Nexusem na pokładzie statku kosmicznego z co najmniej 3000 integralności strukturalnej i utrzymuj prędkość przewyższającą 250 przez 60 sekund w przestrzeni międzygwiezdnej. + +[mod-name] +space-exploration=Space Exploration + +[mod-description] +space-exploration=Buduj rakiety transportowe, aby wysyłać przedmioty w kosmos. Sam wsiądź do rakiety, aby polecieć w kosmos i odbyć spacer kosmiczny. Zbuduj swoją platformę kosmiczną na orbicie, aby rozwijać trudne nauki kosmiczne oparte o dane. Zbuduj statek kosmiczny kawałek po kawałku i leć nim na inne planety, księżyce, pasy asteroid i do wielu innych miejsc. Zdecydowanie zaleca się grę z AAI Industry. Wymagany jest mod Space Exploration Postprocess (nie może być uwzględniony w zależnościach, długo by wyjaśniać dlaczego). Nie zaleca się gry z innymi modami nie wymienionymi w zależnościach póki Space Exploration jest w fazie eksperymentalnej. + +[space-exploration] +space-exploration=Space Exploration +menu_space-exploration=Space Exploration +title_space-exploration=Space Exploration +off=Wyłączone +on=Włączone +wdc_auto_off=Celowanie manualne +wdc_auto_on=Celowanie automatyczne +name=Nazwa +rename-something=Zmienić nazwę __1__ +trigger-none=Brak (ręcznie) +trigger-fuel-full=Wystrzel gdy paliwo będzie pełne +trigger-cargo-full=Wystrzel gdy ładunek będzie pełny +trigger-fuel-full-signal=Wystrzel na sygnale zielonym gdy paliwo pełne +trigger-cargo-full-signal=Wystrzel na sygnale zielonym gdy ładunek pełny +trigger-cargo-full-or-signal=Wystrzel gdy sygnał zielony lub ładunek pełny +destination-type-zone=Przybliżona lokalizacja +destination-type-landing-pad=Lądowisko transportowe +button-launch=Wystrzel +button-launch-disabled=Wystrzel (Wyłączone) +destination-crash-warning=Wybierz lądowisko dla ładunku, aby zmniejszyć ryzyko wypadku +recipe-to=__1__ do __2__ +recipe-from=__1__ z __2__ +simple-a-b=__1____2__ +simple-a-b-space=__1__ __2__ +simple-a-b-comma=__1__, __2__ +simple-a-b-break=__1__\n__2__ +interstellar-map=Mapa przestrzeni międzygwiezdnej +interstellar-space=Przestrzeń międzygwiezdna +planetary-system=System planetarny __1__ +remote-view=Łącze nawigacji satelitarnej [__CONTROL__se-remote-view__] +remote-view-window-title=[img=virtual-signal/se-remote-view] Nawigacja satelitarna [__CONTROL__se-remote-view__] +remote-view-currently-viewing=Aktualnie oglądane: +remote-view-instruction=Wystrzel więcej satelitów, aby odkryć więcej gwiazd, planet, księżyców i innych stref. +remote-view-spaceships=__1__ statki kosmiczne +remote-view-spaceships-anchored=__1__ zakotwiczone statki kosmiczne +remote-view-clamps=__1__ zaciski statków kosmicznych +remote-view-show-hide-resources=Pokaż/ukryj surowce +remote-view-show-hide-stats=Pokaż/ukryj statystyki +remote-view-show-hide-anchor-info=Pokaż/ukryj informacje związane ze statkami kosmicznymi +exit-remote-view=Wyjście z Systemu Nawigacji Satelitarnej [__CONTROL__se-remote-view__] +open-zonelist=Otwórz Eksplorację Wszechświata +zonelist-window-title=[img=virtual-signal/se-planet-orbit] Eksploracja Wszechświata [__CONTROL__se-universe-explorer__] +priority-icon=[img=virtual-signal/se-accolade] +priority-tooltip=Priorytet (sortuj ważne vs nieistotne strefy) +trim-zone-button=[img=item/cliff-explosives] Okroj powierzchnię +trim-zone-button-tooltip=Usuń część powierzchni poza terenem ograniczonym przez obiekty zbudowane przez gracza, obiekty specjalne i środek powierzchni. +trim-zone-button-no-surface-tooltip=Powierzchnia nie istnieje. +delete-zone-button=[img=virtual-signal/se-remove] Usuń powierzchnię +delete-zone-button-tooltip=Niektórych powierzchni nie można usunąć. +delete-zone-button-no-surface-tooltip=Powierzchnia nie istnieje. +scan-zone-button=[img=item/satellite] Skanuj powierzchnię +scan-zone-button-tooltip=Ostrzeżenie: Skanowanie może znacząco spowolnić grę. Szybkość skanowania można zmienić w ustawieniach moda. W dowolnym momencie można zatrzymać skanowanie. +scan-zone-button-disabled-tooltip=Musisz wystrzelić satelitę, aby zeskanować powierzchnię. +stop-scan-zone-button=[img=item/satellite] Zatrzymaj wszystkie skany +stop-scan-zone-button-tooltip=Zatrzymuje wszelkie aktywne skany na wszystkich powierzchniach. +generic-requires-satellite=Musisz najpierw wystrzelić satelitę. +remote-view-requires-satellite=Musisz wystrzelić satelitę, aby korzystać z systemu nawigacji satelitarnej. +satellite-discovered-platform=[color=cyan]Satelita odkryła pewną platformę kosmiczną.[/color] Otwórz [img=virtual-signal/se-planet-orbit] Eksplorator wszechświata [__CONTROL__se-universe-explorer__] wybierz __1__ i kliknij zobacz powierzchnię. Mogą tam być przydatne rzeczy. +satellite-view-unlocked=Odblokowałeś [color=cyan][img=virtual-signal/se-remote-view] System Nawigacji Satelitarnej[/color]. Umożliwia to przeglądanie świata i innych miejsc które odkryłeś za pośrednictwem satelity. Naciśnij [color=green][__CONTROL__se-remote-view__][/color] aby aktywować lub użyć paska narzędzi skrótów (po prawej stronie od paska). +source-discovered-zone=[color=cyan]__1__ Odnaleziono __2__: [/color][img=__3__] [color=white]__4__[/color]. Odnalezione lokalizacje można przeglądać w [img=virtual-signal/se-planet-orbit] eksploracje Wszechświata [__CONTROL__se-universe-explorer__]. +discovered-zone=[color=cyan]Odnaleziono __1__: [img=__2__] [/color][color=white]__3__[/color]. +discovered-anomaly-additional=Nieznany obiekt wykryty w [img=virtual-signal/se-anomaly] anomalii. Twój [img=virtual-signal/informatron] Dziennik eksploracji [__CONTROL__informatron__] został zaktualizowany. +satellite-discovered-nothing=Nowy satelita został wystrzelony, ale nie znalazł niczego nowego. Może być więcej do znalezienia wokół innych gwiazd. +tech-discovered-nothing=Teleskopy nie znalazły niczego nowego w pobliżu gwiazd. Może być więcej do znalezienia w przestrzeni kosmicznej. +tech-deep-discovered-nothing=Teleskopy nie znalazły niczego nowego w kosmosie. +galaxy_ship_authenticated=[img=virtual-signal/se-spaceship] Opuszczony statek kosmiczny: [color=cyan]Biosygnatura uwierzytelniona . Kod dostępu do śluzy powietrznej to 2236067964. Awaryjne przesyłanie kopii logu.[/color] Your [img=virtual-signal/informatron] Dziennik eksploracji [__CONTROL__informatron__] został zaktualizowany. +space-capsule=Kapsuła kosmiczna +player-died=__1__ nie żyje +launch-suit-warning=Aby uniknąć uduszenia, rozważ założenie skafandra i umieszczenie kanistrów podtrzymujących życie w ekwipunku. +suffocating-warning=Dusisz się. Wejdź do kapsuły kosmicznej lub załóż skafander z kilkoma kanistrami podtrzymującymi życie w ekwipunku. +rocket_survivability_fail=Rakieta transportowa doznała uszkodzeń podczas transportu i jest poza kursem. Zalecane dodatkowe badania nad wytrzymałością rakiet i bezpieczeństwem ładunków. __1__ +respawn-if-stranded=Jeśli utknąłeś możesz użyć skrótu odrodzenia [__CONTROL__se-respawn__]. +respawn-options-title=Miejsce docelowe odrodzenia +respawn-button-homeworld=[img=virtual-signal/se-planet] Planeta startowa +respawn-button-landing-pad=[img=item/se-rocket-landing-pad] Najbliższe lądowisko +respawn-button-spaceship=[img=virtual-signal/se-spaceship] Najbliższy statek kosmiczny +respawn-confirm-title=Czy na pewno chcesz się odrodzić? +respawn-confirm-yes=[img=virtual-signal/se-death] Odrodzenie +respawn-confirm-no=Anuluj +search-list=Szukaj +clear-search=Wyczyść wyszukiwanie +filter-list=Filtr +clear-filter=Wyczyść wyszukiwanie +attrition-type-radiation=promieniowanie +attrition-type-wind=wiatr +attrition-type-spacial-distortion=zniekształcenia przestrzeni +zonelist-view-surface=Wyświetl powierzchnię +zonelist-heading-hierarchy=Hierarchia +zonelist-heading-type=Typ strefy +zonelist-heading-name=Nazwa +zonelist-heading-radius=Promień +zonelist-heading-primary-resource=Główny zasób +zonelist-heading-attrition=Zakłócenia robotów +zonelist-heading-threat=Zagrożenie +zonelist-heading-solar=Energia słoneczna +zonelist-heading-flags=Flagi +zonelist-heading-priority=Priorytet +zonelist_filter_star=Uwzględnij gwiazdy +zonelist_filter_planet=Uwzględnij planety +zonelist_filter_planet-orbit=Uwzględnij orbity planet +zonelist_filter_moon=Uwzględnij księżyce +zonelist_filter_moon-orbit=Uwzględnij orbity księżyca +zonelist_filter_asteroid-belt=Dołącz pasy asteroid +zonelist_filter_asteroid-field=Uwzględnij pola asteroid +zonelist_filter_anomaly=Uwzględnij anomalię +zonelist-resource-bar-tooltip=__1__ __2__\nCzęstotliwość: __3__\nRozmiar: __4__\nBogactwo: __5__ +zonelist-resource-bar-tooltip-extended=__1__ __2__\nCzęstotliwość: __3__\nRozmiar: __4__\nBogactwo: __5__\n__6__ +zonelist-resources-disclaimer=Prawdopodieństwa surowców są szacunkowe. [?] +zonelist-resources-disclaimer-tooltip=Dane o surowcach są szacunkami opartymi na gęstości pierwiastków.\nOne są przekazane do generatora mapy.\nRzeczywiste wielkości złóż będą się różnić, mogą też nie pojawić się z powodu występowania wody, średnicy powierzchni, albo przez specyficzne wymagania dotyczące podłóża. +resource-terrain-required-se-vulcanite=Wymaga terenu wulkanicznego +resource-terrain-required-se-cryonite=Wymaga zamarzniętego terenu +resource-terrain-required-se-vitamelange=Wymaga terenu trawiastego +zone-tooltip-type=Typ strefy: +zone-tooltip-parent=Ciało nadrzędne: +zone-tooltip-threat=Zagrożenie: +zone-tooltip-daynight=Cykl dzień / noc: +zone-tooltip-bot-attrition=Zakłócenia Robot __1__: +zone-tooltip-radius=Promień: +zone-tooltip-solar=Energia słoneczna: +zone-tooltip-flags=Informacje: +zone-tooltip-closest=Najbliższy: +zone-tooltip-destination=Miejsce docelowe: +zone-tooltip-delta-v=∆v z __1__ +construction-denied=Nie można tu umieścić. +construction-denied-vehicle-in-space=Nie można umieścić pojazdów naziemnych w kosmosie. +construction-denied-se-surface=Nieprawidłowa lokalizacja, musi zostać umieszczona na powierzchni kosmosu. +construction-denied-no-water=Brak wody +construction-denied-spaceship-only=Musi być budowane na podłodze statku kosmicznego. +currently-viewing=Aktualnie przeglądane: __1__ +fail-board-no-character=Nie można wejść na pokład docelowego statku, aby skorzystać z tej akcji, musisz być przywiązany do swojej postaci. +fail-board-remote-character=Nie można wejść na pokład statku docelowego, twoja postać nie znajduje się na statku. +fail-board-target-anchored=Nie można wejść na pokład zakotwiczonego statku, spróbuj zakotwiczyć w tym samym miejscu. +starmap=Mapa gwiazd +starmap-button=[img=virtual-signal/se-star] Mapa gwiazd +back=Cofnij +spaceship=Statek kosmiczny +planet=Planeta +moon=Księżyc +star=Gwiazda +orbit=Orbita +something_orbit=__1__ orbita +asteroid-belt=Pas asteroid +asteroid-field=Pole asteroid +anomaly=Anomalia +spaceship-cannot-set-destination-to-self=Nie można ustawić miejsca docelowego na siebie. +spaceship-streamline=Opływowość kształtu: __1__ +spaceship-launch-energy=Energia startu: __1__ +spaceship-launch-energy-invalid=Energia startu: Wymaga prawidłowego sprawdzenia integralności. +spaceship-speed=Prędkość: __1__ +spaceship-structural-stress-hull=Obciążenie konstrukcyjne (kadłub): __1__ +spaceship-structural-stress-hull-invalid=Obciążenie konstrukcyjne (kadłub): nie dotyczy (wymagana hermetyzacja) +spaceship-structural-stress-container=Obciążenie konstrukcyjne (ładowność): __1__ +spaceship-structural-stress-container-invalid=Obciążenie konstrukcyjne (ładowność): nie dotyczy (wymagana hermetyzacja) +spaceship-travel-time-unknown=Czas Podróży: Nieznany. Przetestuj maksymalną prędkość w celu oszacowania. +spaceship-travel-time-max=Czas podróży: __1__s przy maksymalnej prędkości. +spaceship-travel-time-current=Czas podróży: __1__s przy aktualnej prędkości. +spaceship-closest-location=Najbliższa lokalizacja: __1__ +spaceship-location-spatial-distortion=Zniekształcenie przestrzenne: __1__ +spaceship-location-stellar-x=Położenie X: __1__ +spaceship-location-stellar-y=Położenie Y: __1__ +spaceship-location-star-gravity-well=Gwiezdna grawitacja: __1__ +spaceship-location-planet-gravity-well=Grawitacja planety: __1__ +spaceship-travel-status=Status podróży: __1__ +spaceship-integrity-status-valid=Stan integralności: Prawidłowy: __1__ +spaceship-integrity-status-invalid=Stan integralności: Nieprawidłowy: __1__ +spaceship-button-launch=Startuj +spaceship-button-launch-tooltip=Gotowy do Wystartowania +spaceship-button-launch-disabled=Startuj (wyłączone) +spaceship-button-launch-disabled-fuel-tooltip=Wymaga paliwa w zbiornikach wspomagających +spaceship-button-launch-disabled-integrity-tooltip=Wymaga prawidłowego sprawdzania integralności +spaceship-button-anchor=Zakotwiczyć +spaceship-button-confirm-anchor=Potwierdź zakotwiczenie +spaceship-button-anchor-to=Zakotwiczyć do __1__ +spaceship-button-anchor-on=Zakotwiczyć na __1__ +spaceship-button-stop=Zatrzymaj +spaceship-button-start=Leć +spaceship-button-board=Przesiądź się do __1__ +spaceship-button-scouting-back=Cofnij +spaceship-button-scouting-back-tooltip=Anuluj Wyszukiwanie Zakotwiczenia +spaceship-name-the=__1__ +spaceship-button-start-integrity-check=Rozpocznij sprawdzanie integralności +spaceship-heading-destination=Miejsce docelowe +list-destinations-alphabetically=Lista miejsc docelowych alfabetycznie +spaceship-travel-message-new-course-plotted=Nowy kurs wyznaczony. +spaceship-travel-message-exiting-planet-gravity=Wyjście z grawitacji planety +spaceship-travel-message-navigating-planet-gravity=Poruszanie się po grawitacji planety +spaceship-travel-message-exiting-star-gravity=Wyjście z grawitacji gwiazdy +spaceship-travel-message-navigating-star-gravity=Poruszanie się po grawitacji gwazdy +spaceship-travel-message-spatial-distortions=Nawigowanie po zniekształceniach przestrzennych +spaceship-travel-message-navigating-interstellar=Poruszanie się w przestrzeni międzygwiezdnej +spaceship-travel-message-at-destination=W miejscu docelowym. +spaceship-check-message-passed=Powiodło się: Integralność statku Prawidłowa. +spaceship-check-message-failed-containment=Nie powiodło się: Utrata hermetyzacji wokół konsoli. Upewnij się, że wszystkie ściany statku kosmicznego znajdują się na podłodze statku kosmicznego bez przerw. +spaceship-check-message-failed-console-floor=Konsolę należy umieścić na podłodze statku kosmicznego. +spaceship-check-message-failed-empty=Nie znaleziono płytek podłączonych do prawidłowo zamkniętej konsoli. +spaceship-check-message-failed-unknown-bounds=Błąd: Nieznane granice statku kosmicznego. +spaceship-check-message-failed-stress=Błąd: Obciążenie integralności strukturalnej przekracza limit technologiczny. +spaceship-check-message-checking-console-floor=Sprawdzanie połączenia z podłogą konsoli. +spaceship-check-message-checking-containment=Sprawdzanie hermetyzacji. +spaceship-check-message-checking-connectivity=Sprawdzanie łączności z konsolą. +spaceship-check-message-no-console=Brak konsoli. +spaceship-check-message-did-not-complete=Kontrola nie została zakończona. +spaceship-check-message-unstable=Niestabilny: niektóre sekcje będą odpadać podczas manewrowania. +spaceship-check-message-valid-but-disconnecting=Prawidłowe, ale niestabilne: sekcje będą odpadać. +spaceship-warning-sections-disconnecting=Sekcje się rozłączają. Zatrzymaj się, aby naprawić. +page_space_exploration_text_1=Witamy w Space Exploration. W tym modzie jest już dużo, ale wciąż ma status eksperymentalny i jest w trakcie intensywnego rozwoju. Nie zaleca się grania modami innymi niż wymagane i zalecane mody.\n\n\n[font=default-bold]Rekomendowane mody[/font] \n\nAAI Industry: Space Exploration został zaprojektowany do współpracy z AAI Industry i opiera się na zmianach drzewa technologicznego. Jeśli nie masz zainstalowanego AAI Industry, stracisz pewne zmiany w formułach, które utrudnią grę długoterminową.\n\nAAI Signal Transmission: Umożliwia przesyłanie sygnału między bazami. Bez tego modu logistyki międzyplanetarnej będzie znacznie trudniejsze.. \n\nGrappling Gun: Pociągnie cię do wskazanego miejsca. Idealne do pokonywania skał, statków kosmicznych i powrotu na platformę kosmiczną, jeśli spadniesz.\n\n\n[font=heading-2]Zalecane ustawienia[/font]\n\nMUSISZ mieć włączone wszystkie kafelki terenu obcych biomów, w przeciwnym razie gra zawiesi się w późniejszym momencie.\n\nPonieważ gra jest dłuższa niż zwykle, dobrym pomysłem jest rozpoczęcie gry z niskimi czynnikami ewolucji wroga.\n\nNie powinieneś ustawiać wysokich zasobów dla swojej początkowej planety, chyba że grasz z formułami wymagającymi dużych zasobów, takimi jak formuły o wysokim stopniu trudności lub tryb maratonu. Jeśli zasoby zostaną ustawione zbyt wysoko, zmniejszy to potrzebę ekspansji na inne planety.\n\n\n[font=heading-2]Pomocne linki[/font]\n\nSpójrz na Space Exploration Wiki tutaj: https://spaceexploration.miraheze.org\n\nGet pomóż lub śledź rozwój na Discord: https://discord.gg/ymjUVMv\n\nOver 2000 godzin poświęcono na ten mod. Jeśli Ci się spodoba, rozważ wsparcie mnie na Patreon: https://www.patreon.com/earendel +menu_meteor_defence=[img=virtual-signal/se-meteor] Obrona Przeciw meteorowa +title_meteor_defence=Obrona meteorowa +page_meteor_defence_text_1=Meteory uderzają w większość stref w przypadkowych odstępach czasu. Możesz zmienić maksymalny odstęp między uderzeniami w ustawieniach mod.\n\nLiczba meteorów jest również losowa, 50% z 1, 25% z 2, 12.5% z 3, 6.25% z 4, itd.\n\nStruktury obronne meteorów mogą strzelać do meteorów. Strzelają w sekwencji, więc późniejsze obrony nie będą działać, jeśli wszystkie meteory zostaną zniszczone. Obrona wymaga amunicji, czasu ładowania i dodatkowej mocy podczas ładowania. Pobór mocy nie jest bez znaczenia, dlatego dobrze jest zrównoważyć ryzyko z kosztami. +menu_coremining=[img=item/se-core-miner] Wydobycie Rdzenia +title_coremining=Wydobycie Rdzenia +page_coremining_text_1=Wydobycie rdzenia może odbywać się tylko na planetach i księżycach. Każda planeta i księżyc mogą dać inny rodzaj fragmentu rdzenia w zależności od tego, co jest w środku. Nauvis zapewnia równowagę wspólnych zasobów, ale inne miejsca zwykle dają 1 typ zasobów. Górnicy rdzeni są głodni energii, ale odzyskujesz trochę energii z węgla, ropy i uranu.\n\nWiertnica Rdzeni zużywa dużo energii, a każdy kolejny który umieścisz na planecie, zmniejsza wydajność wszystkich wiertnic na tej samej planecie. Są znacznie mniej energooszczędne niż normalnie wiertnice nawet jeśli masz wiele uruchomionych, ale nigdy nie brakunie zasobów. W początkowej fazie gry przydatne może być uruchomienie 1 wiertnicy Rdzenia, gdy masz nadmiar mocy. Jeśli zaczniesz na małej planecie, wydobycie energii słonecznej i rdzeniowej może być twoim jedynym sposobem na zdobycie wystarczającej ilości zasobów, aby zejść z planety.\n\nWiertnice rdzenia w późnej fazie gry czerpią ogromne korzyści z premii za wydobycie. Lepiej jest celować w kilka na wielu planetach niż w kilka na kilku planetach. +menu_launching_satellites=[img=item/satellite] Wystrzelenie satelitów +title_launching_satellites=Wystrzelenie satelitów +page_launching_satellites_text_1=Uruchomiłeś [color=cyan]__1__[/color] satelity.\n\n[font=heading-2][img=virtual-signal/se-remote-view] System Nawigacji Satelitarnej [__CONTROL__se-remote-view__][/font]\n\nPo wystrzeleniu satelity nawigacyjnego w kosmos z silosu rakietowego satelity masz dostęp do [img=virtual-signal/se-remote-view] Podglądu Nawigacji satelitarnej. Dostęp do tego trybu można uzyskać za pomocą klawisza [__CONTROL__se-remote-view__]. Podczas nawigacji satelitarnej kamera jest odłączona od twojej postaci, dzięki czemu możesz szybko rozejrzeć się po mapie, a nawet odkryć nowe obszary. Jest kilka rzeczy, których nie można zrobić w trybie nawigacji satelitarnym. jak stawiać kopalnie. Jest jednak wiele rzeczy, które możesz zrobić, np. korzystać z blueprintów, planów destrukcji, budować widma obiektów, dodawać połączenia kablowe, zmieniać formuły w maszynowach itd\n\n[font=heading-2][img=virtual-signal/se-planet-orbit]Eksplorator wszechświata [__CONTROL__se-universe-explorer__][/font]\n\nSieć nawigacji satelitarnej umożliwia także wyświetlanie innych powierzchni, takich jak księżyce, pasy asteroid, pola asteroid i orbity. Naciśnij [__CONTROL__se-universe-explorer__] aby wyświetlić listę znanych stref. Jeśli uruchomiłeś satelitę, możesz kliknąć opcję Wyświetl powierzchnię, aby zobaczyć, co tam jest. Dobrze jest zbadać planetę zanim spróbujesz tam lecieć.\n\nWystrzelenie satelitów pomaga również w wykrywaniu stref w systemie, z których jest uruchamiany (więcej informacji można znaleźć w programie Zone Discovery). +menu_zone_discovery=[img=virtual-signal/se-planet-orbit] Odkrywanie stref +title_zone_discovery=Odkrywanie stref +page_zone_discovery_text_1=W tym obszarze przestrzeni kosmicznej jest wiele gwiazd, planet, pasów asteroid i pól asteroid.\n\n[font=heading-2]Nawigacja satelitarna[/font]\nYou can launch a navigation satellite to discover a random planet, moon, or asteroid belt in the same start system that the satellite was launched from. If there is nothing else to discover in that system then it can discover new stars instead, but cannot discover anything orbiting other stars or anything in deep space.\n\n[font=heading-2]Zone Discovery Research[/font]\nYou can use space telescopes to look for new zones to discover. This is achieved through Zone Discover research. The basic zone discovery research can find a random star, planet, moon, or asteroid belt.\n\n[font=heading-2]Targeted Zone Discovery Research[/font]\nTargeted zone discovery research is the same as the basic research, but if you have selected a resource preference (below) it look in areas more likely for that resource to occur so you are more likely to discover a zone with that resource. Keep in mind that a planet can't be discovered before discovering its star, and a moon can't be discovered before discovering its planet. Don't expect to find what you're looking for every time.\n\n[font=heading-2]Deep Space Zone Discovery Research[/font]\nDeep space zone discovery research only looks for areas of interest in deep space and is the only way you can discover asteroid fields. Asteroid fields are the only place you can find Naquitite. Deep space research cannot be resource targeted.\n\n[font=heading-2]Resource targeted zone discovery preference:[/font] +menu_cargo_rockets=[img=virtual-signal/se-cargo-rocket] Rakiety transportowe +title_cargo_rockets=Rakiety transportowe +page_cargo_rockets_text_1=Cargo rockets are launched from a Cargo Rocket Silo, aka the Launchpad.\n\nYou have launched [color=cyan]__1__[/color] cargo rockets.\n\nYour cargo loss modifier based on technology: Loss max percentage reduced by [color=cyan]__2__%[/color].\n\nYour rocket survivability modifier based on technology: Loss chance reduced by [color=cyan]__3__%[/color].\n\nYour rocket reusability modifier based on technology: [color=cyan]__4__[/color] +/- up to 10 (max 100) parts recovered.\n\n[font=heading-2]Getting Started[/font]\n\nBefore you can launch cargo rockets, you need to have launched a satellite in the satellite rocket (the standard Factorio aka 'vanilla' silo) while Space Exploration is installed. \n\nOnce you have build a cargo rocket silo you need to build and fuel your rocket:\n\n • 100 cargo rocket sections into the inventory. 20 of these will be recovered from the rocket at the destination, more with the right research. \n • 1 space capsule into the inventory. This will always be recovered at the destinations and can return you home from orbit.\n • A lot of liquid rocket fuel, piped into one of the 8 connections near the corners. The amount of fuel required depends on the radius of the planet you're launching from and the distance to the destination. If using the "Any landing pad with name" destination option, it will load enough fuel for any of the valid destinations.\n\nYou can enter the cargo rocket silo from the door at the front (press __CONTROL__toggle-driving__). This will let you ride with the rocket. You should also have a thrustersuit and lifesupport canisters so you don't die if you are launching to space. \n\nYour first rocket won't have anywhere to land so it will disassemble as the cargo is released. Sometimes rockets targeting a landing pad miss and the rocket crashes. Even in the case of a crash the cargo is deployed in cargo pods so you never lose all of the cargo. \n\nYou should take a Rocket Landing Pad and some Space Platform Scaffold with you so you can build somewhere for the next rocket to land.\n\nBuilding a Rocket Landing Pad at your base before launching will allow you to easily return directly there instead of ending up in a random location when you return.\n\n[font=heading-2]Destinations[/font]\n\nOnce you have a landing pad placed, make sure you update the destination of the rocket silo to target the landing pad and not a random point in orbit. You can do this in-person or via the Satellite Remote View (hotkey 'n'). However, rockets will not launch to a landing pad that contains items, so make sure to empty it.\n\n[font=heading-2]Basic Automation[/font]\n\nThe rocket silo outputs signals for how many parts are already in the rocket. You can put a condition on an inserter of [Cargo Rocket Sections < 100] to make sure it won't fill the rocket with additional sections.\n\nIf you have set up launch triggers on a silo it will launch automatically, but a rocket won't automatically launch to a landing pad that isn't empty (otherwise the cargo might not fit).\n\n[font=heading-3]Input Signals[/font]\n\n[img=virtual-signal/signal-green] Green signal: Can trigger a launch if the silo is configured to have a trigger that uses the green signal.\n\n[font=heading-3]Output Signals[/font]\n\n[img=virtual-signal/signal-E] E Signal: Empty slots\n\n[img=virtual-signal/signal-F] F Signal: Full slots\n\n[img=virtual-signal/signal-L] L Signal: Liquid rocket fuel required for all potential destinations specified by the destinations setting.\n\n[img=virtual-signal/se-cargo-rocket] Cargo Rocket Signal: If the rocket is complete (i.e. 1 capsule and 100 rocket sections) then a value of 1 is returned.\n\n[img=item/se-space-capsule] Space Capsule Signal: Any capsules used in the rocket construction are added to the count of any capsules in the cargo inventory.\n\n[img=item/se-cargo-rocket-section] Cargo Rocket Section Signal: Any sections used in the rocket construction are added to the count of any sections in the cargo inventory.\n\n[img=fluid/se-liquid-rocket-fuel] Liquid Rocket Fuel Signal: The total liquid rocket fuel in the silo. +menu_lifesupport=[img=item/se-lifesupport-equipment-1] Podtrzymywanie życia +title_lifesupport=Podtrzymywanie życia +page_lifesupport_text_1=Lifesupport is gained from lifesupport equpment and lifesupport canisters. You need both to survive in hostile environments.\n\nLifesupport equipment and the consumable canisters can be made in a lifesupport facility.\n\nLifesupport canisters provide the resources needed by the system to fulfil all of its roles and are consumed gradually. As the lifesupport bar decreases, new canisters are consumed directly from your inventory. \n\nLifesupport equipment is placed into the grid of armor, however if you are using a thrustersuit, it has 1 lifesupport equipment built in. Additional lifesupport equipment pieces placed in the equipment grid increase the lifesupport efficiency. If you are using lifesupport equipment in a non-thruster suit then it will protect you on hostile planets but won’t protect you from the vacuum of space.\n\n[font=heading-2]Hostile environments[/font]\nHostile environments are any area that would cause damage to your body just by being there. Lifesupport equipment is designed to protect you from these hazards by providing you with appropriate pressurisation, oxygen, water, nutrition, thermal regulation, and radiation protection. The 2 main types of hostile environment are:\n\nSpace: A space suit (thruster suit) is required for lifesupport to function correctly in a vacuum. You cannot use lifesupport from some other type of armor in space, you will still suffocate.\n\nLand: Certain planets and moons may have dangers such as radiation, extreme cold, extreme heat, or an acidic atmosphere, and require lifesupport equipment. (Coming soon). Planets also require lifesupport if certain bio weapons are used (Plague Worlds). Lifesupport for these areas can be provided by a thruster suit, or by equipment placed into any other type of armor. +menu_space_sciences=[img=item/se-astronomic-science-pack-2] Kosmiczne pakiety naukowe +title_space_sciences=Kosmiczne pakiety naukowe +page_space_sciences_text_1=[img=item/se-rocket-science-pack] The first in-space science is the rocket science pack. It can only be made in space so you need to establish a small space station to produce it. Rocket science packs and the later science packs can only be used in space, so you'll need to rocket up other science packs too and put them in the powerful Space science lab.\n\n[font=heading-2]Specialist Sciences[/font]\n\nThe 4 specialist sciences are Astronomic, Biological, Energy and Material. They are all data-driven, and follow a process of performing experiments to gather data for supercomputers to build an increasingly accurate model of life, the universe, and everything. They are all at approximately the same tech levels so you are free to choose your order of development, however, each one requires a specific resource to some degree, so take a look at your solar system before deciding which science to research first.\n\n[img=item/se-astronomic-science-pack-4] Astronomic science focusses mainly on space logistics.\n\n[img=item/se-energy-science-pack-4] Energy science is mainly in energy production, power transfer, and high tech gadgets.\n\n[img=item/se-material-science-pack-4] Material science is focussed more on heavy industry and direct upgrades.\n\n[img=item/se-biological-science-pack-4] Biological science is focussed on character upgrades, medicine, lifesupport, bioweapons, and productivity.\n\n[font=heading-2]Deep space science[/font]\n\n[img=item/se-deep-space-science-pack-1]Deep space science is focussed on exploring the interstellar void, antimatter, and warping spacetime. +menu_energy_beams=[img=item/se-energy-transmitter-emitter] Wiązki energii +title_energy_beams=Wiązki energii +page_energy_beams_text_1=[font=heading-2]Coronal Mass Ejections[/font]\nStars in the area frequently eject dangerous streams of particles. It is not uncommon for a planet or moon to stray into one of these particle streams. If you have a base on an affected surface you should evacuate, diversify and disperse your assets, or build an Umbrella defence facility with a large accumulator backup. When a surface is threatened there will be at least 4 hours early warning. Known threats will be listed below. +page_energy_beam_warning_text=[img=virtual-signal/se-star] Ostrzeżenie: Koronalny wyrzut masy zbliża się do __1__. Szacowana energia potrzebna do ochrony: __3__GJ. ETA: __2__s. +page_energy_beams_text_2=[font=heading-2]Umbrella: Energy Beam Defence[/font]\nThe energy beam defence facility, "Umbrella", can protect against coronal mass ejections and space-based energy beam weapons. It works by levitating magnetic particles into a protective bubble, then realigns and clumps the particles as needed to diffuse hostile energy beams. The only requirement to function is energy, the base draw is 10MW but increases based on the strength of attacking beams. Only 1 is needed per surface against Coronal mass ejections, against energy beams weapons 1 Umbrella can defend against up to 500GJ of attacking power. For a coronal mass ejection, the base power requirement for a 5000 radius planet and 100% solar, is expected be around 160GJ over 2 minutes with a peak power draw of 2GW at the 1 minute mark. This is increased or decreased with the zone's solar power multiplier, and for solid bodies it is increased or decreased based on the radius relative to a base radius of 5000. For an energy beam from an Energy Beam Emitter, the power requirement is expected to be 1/10th of the energy beam strength at the target (after efficiency loss).\n\n[font=heading-2]Energy Beaming[/font]\nThe Energy Beam emitter is capable of sending energy to different surface. It can do this in 2 main ways, either as a way to provide power to a distant surface, "Energise", or as a cutting beam weapon, "Glaive". When in Glaive mode the beam damages an area continuously but can be moved over the target surface cutting a path. The damage rate, area, and beam speed increase based on the energy put into the beam. "Auto-Glaive" mode has autonomous target selection.\n\nAn Energy beam emitter has 4 connection points where Energy beam chambers can connect end-on. Energy beam chambers can connect length-ways, or have a long edge meet the middle of a short edge, but cannot connect directly side-to-side. Energy beam injectors attach directly to the sides of Energy beam chambers. Each Energy beam injector increases the power of the connected Energy beam emitter. To collect power from a beam you need an Energy beam receiver at the target surface and select it as the target using the targeter from the emitter. Once the beam has the receiver as the target the receiver will heat up. The heat can be taken from heat connections at the side to power heat exchangers and turbines. +menu_spaceships=[img=virtual-signal/se-spaceship] Statki kosmiczne +title_spaceships=Statki kosmiczne +page_spaceships_text_1=Spaceships are huge, powerful vehicles that can launch many contained structures, items, and players into space, then rocket around the solar system to land on other surfaces.\n\n[font=heading-2]Spaceship Construction[/font]\nSpaceships are made from many tiles and smaller components that fit together to make a spaceship of your own design. You design a spaceship almost like a mini moveable base.\n\nStart with a floorplan of spaceship flooring. Don't build too big, as your first few spaceships will have strict size restrictions, expandable by research. Place spaceship walls around the edges to make bulkheads, and make sure there are no gaps (including diagonals). Place a spaceship console somewhere in the inside, this is the core part of the spaceship and how you control it. When the console is placed, there are some pulses as the console figures out what parts are properly attached, what parts are properly contained and what will fall off if you try to launch. If any squares flash red, then there is an issue with your design, which you can diagnose by checking the spaceship console. You also need a spaceship rocket booster tank, and a spaceship rocket engine. The booster tank is what stores the fuel you need to get into space and provides the VTOL component. The rocket engines are for the slower burn through space to get you to your destination. Some form of defence in the front (always north) is also advisable because the nebula you are in is full of debris.\n\n[font=heading-2]Integrity Stress[/font]\nEarly on, you will be very limited on spaceship size by the Integrity Stress limits of your technology level. Additional technology lets you build larger spaceships. Integrity stress is calculated in 2 parts: A. The size of the ship. B. The cargo capacity of the ship. The total integrity stress is whichever stress factor is larger, the two values are not added together.\n\n[font=heading-2]Streamlining[/font]\nThis area of space is in a gritty nebula. If you streamline your spaceship you can improve you spaceship's maximum speed by around 30%. Making a flat box front should be avoided, but don't need to build a wedge. Up to 1/3 or your spaceship's front can be flat with no penalty. Circular shapes should also be fine. You can manually trigger an integrity check to see how the streamlining is going.\n\n[font=heading-2]Speed[/font]\nShip speed is based on the thrust of the engines vs the ship weight (approximated by integrity stress). Engines can be placed in/on the ship, but engines at the back of the ship with empty space behind are more effective (around 25% improvement).\n\n[font=heading-2]Long Haul Activities[/font]\nWhen considering long distance travel, it is worth noting that you can do a lot in satellite mode while your body is in transit. You can also give orders to spaceships remotely via the satellite uplink.\n\n[font=heading-2]Crafting Machines[/font]\n[color=#ffaaaa]Warning: A crafting machine designed for space will only be able to use recipes shared by other land structures if the spaceship is on land. If a space-based recipe is set while the spaceship lands, the ingredients will be lost. Some land-based crafting machines can function in space, but they will lose the ability to use productivity modules while in space. If the spaceship launches with productivity modules in these machines, the productivity modules are destroyed.[/color]\n\n[font=heading-2]Spaceship Signals[/font]\nThe top right section of the spaceship console can be connected with wires separately from the main structure, as it outputs its own signals:\n[img=item/se-spaceship-console] The console number indicates the spaceship's ID.\n[img=virtual-signal/signal-speed] The speed signal number indicates the spaceship's speed: -1 if stopped, -2 if anchored.\n[img=virtual-signal/signal-distance] The distance signal indicates the distance to the selected destination: -1 if arrived, -2 if anchored, -3 if no destination is set.\n[img=virtual-signal/se-planet-orbit] A fourth signal indicates the current destination, if any.\n\n[font=heading-2]Spaceship Automation[/font]\nThe main structure of the console can accept signal inputs:\n[img=virtual-signal/signal-speed] The speed signal sets a target speed and engages the engines.\n[img=virtual-signal/se-spaceship-launch] A Spaceship launch signal triggers a launch.\n[img=virtual-signal/se-planet-orbit] A destination signal sets the destination (you can see a zone's signal from the Universe Explorer side panel once you have constructed a spaceship).\nTo cause a spaceship to land, the console must be given a pair of anchor signals, either [img=virtual-signal/se-anchor-using-left-clamp] "anchor using left clamp" with [img=virtual-signal/se-anchor-to-right-clamp] "anchor to right clamp", or [img=virtual-signal/se-anchor-using-right-clamp] "anchor using right clamp" with [img=virtual-signal/se-anchor-to-left-clamp] "anchor to left clamp". The values of the signals must match the values of a clamp on the ship and a clamp at the destination. You can see and change these values by opening a clamp's UI. If a match is found, then the ship will try to land with the two clamps connected. Use with caution. +menu_exploration_journal=[img=item/se-thruster-suit] Dziennik eksploracji +title_exploration_journal=Dziennik eksploracji +page_journal_title_backstory=Obudziłem się po niewłaściwej stronie kuli ognia +page_journal_text_backstory=Po katastrofie znalazłem się na nieznanej planecie, wokół której paliły się części małego statku. Moje ciało było posiniaczone, podrapane i opalone, ale nic zbyt poważnego. Mój uraz głowy był najwyraźniej poważniejszy, dudniący ból głowy i światło oślepiało. Co gorsza, nie mogłem sobie przypomnieć, jak się tu dostałem, ani nawet kim jestem poza imieniem i niejasnym poczuciem celu ... budowania. Nawet wtedy nie pamiętałem, co zbudować ani jak zbudować. Na początku myślałem, że moja głowa została uszkodzona podczas wypadku i wspomnienia wrócą, ale nadal nie. Fakt, że moje dzienniki danych były również puste lub ponownie sformatowane, skłonił mnie do myślenia o innych wyjaśnieniach. +page_journal_title_satellite_launch=Oko na niebo +page_journal_text_satellite_launch=Udało mi się wystrzelić satelitę na orbitę. To ważny kamień milowy i warto świętować, ale wciąż jest wiele do zrobienia. To dopiero początek. +page_journal_title_cargo_launch=W nieskończoność i dalej +page_journal_text_cargo_launch=Mogę teraz wystrzelić się w kosmos. Nie jestem już uwięziony na tym kawałku skały, którą nauczyłem sięnazywać domem. Niebo wydaje się być w zasięgu ręki. +page_journal_title_entered_vault=Zbieranie reliktów +page_journal_text_entered_vault=I entered a cavern beneath the pyramid-shaped protrusion on __1__ and found a dark and dangerous chamber. The chamber had two ancient cartouches on the ground, one large and one was small. They both had multiple glyphs on their surface along with other circles and lines. The glyph at the center of the large cartouche seemed to be the most significant in whatever information the system was trying to convey. Whatever the information is, it is formatted unlike anything else I've seen. Behind the cartouches was some kind raised cylinder containing a powerful device that I can use as a module. Modules of this quality are so valuable that it is worth trying to find more of these structures. Maybe it is time for some archeology. +page_journal_title_found_gate=Anomalia +page_journal_text_found_gate=Some sort of huge ring-shaped artifact was found in the anomaly. Two things are immediately obvious even from a distance: 1. It is ancient. 2. The technology is completely different from my own. Whatever it is or was, it is destroyed now. +page_journal_title_found_gate_ship=Anomaly Ship +page_journal_text_found_gate_ship=Part of a fairly large derelict spaceship was found in the anomaly near the ring-shaped artifact. The technology of the ship is similar to my own, but a little more... refined. It is clearly different technology from that of the ring in any case. The debris pattern makes it look like it was cut in half and/or collided with the ring structure. It may be worth salvaging. +page_journal_title_found_gate_ship_authenticated=Anomaly Ship Authentication +page_journal_text_found_gate_ship_authenticated=The derelict ship in the anomaly scanned me and authenticated my biosignature. I don't know if that means it has a record of me specifically somehow, or maybe just that any random cybernetic human is good enough when compared to biters and genocidal robots. The message said the ship airlock access code is 2236067964. The ship's logs are accessible but large sections are missing or corrupted. +page_journal_title_found_gate_ship_log=Anomaly Ship Log +page_journal_text_found_gate_ship_log_intro=Demodamas 82B: AAI Hypernet Forward Construction Cruiser. Ship's log contents: +page_journal_text_found_gate_ship_log=...'Âżs nominal.\nAccess warning: AAI Thyris Gate 17: Intergalactic prototype v0.1.93 is a classified facility. AAI authentication at L90 or above is required. Authenticate immediately or be destroyed.\nAccess log: Access AAI Thyris Gate 17 authenticated with AAI Cybernetic Hypernet Engineer L97 credentials ID__1__.\nAccess log: Beginn¶Ôàtá^...\n...'Âżris Gate 17 projector 8 frequency locked. Energy at 216% safe levels. Singularity stability: 99.4%.\nNavigation log: AAI Thyris Gate 17 dialled into projection vector [SV __2__]. Predicted target: Wube Galaxy > Foenestra (anomaly, unexplored). Authentica¶Ôàtá^...\n...'Âżavigation warning: Intergalactic hypertube (overidden).\nNavigation warning: No known hypergate at destination (overidden).\nInsurance warning: No insurance contract. Available contracts: 0.\nInformatron note: There are no insurance contracts available with the condition: gateless materialisation. Are you sure this is safe? [response.ignore.ignore_always]\nTravel log: Entering Thyris anomaly > AAI Thyris Gate 17 hypertube aligned to [SV __2__].\nTravel log: Jump to hypertube [SV __2__] complet¶Ôàtá^...\n...'Âżvel log: Location update: Hypertube near Thyris anomaly, alignment [SV __2__] stability at 98%, diame¶Ôàtá^...\n...'Âżavel log: Exiting hypertube at unexplored location Foenestra anomaly.\nWarning: Unexpected collision, intersection with unknown object [4ae4c8d28f2] beginning scan of object [4ae4c8d28f2].\nDamage Log: 13.2% damage. Source: Impact damage resulting from collision with unknown intersecting object [4ae4c8d28f2].\nSection damage log: Sections reporting damage: A5, A6, A9, B6, B7, B8, C7. Sections not responding: A7, A8. (86% confidence)\nCybernetic engineers log: Lifesigns 99%. (34% confidence)\nTravel log: Attempting evasive maneuver RS100LT30.\nTravel log: Exiting hypertube completed with errors.\nTravel log: Location update: Foenestra unexplored anomaly.\nScanning log: Scan completed on object [4ae4c8d28f2] clarity 0.002m^2 at distance -48.76m (99.9% confidence).\nScan detail log: [4ae4c8d28f2] Mass 92.5¶Ôàtá^...\n...'Âżidence).\nScan detail log: [4ae4c8d28f2] Composition: Artificial. 34% Naquium, 29% Holmium, 37% unknown composites (89% confidence).\nScan detail log: [4ae4c8d28f2] Size: Approximate cylinder 68¶Ôàtá^...\n...'Âżail log: [4ae4c8d28f2] Energy signature: Flux 54Gwb, Radiation profile 2.8kJ/1.7MJ/1.6MJ/0.62J, Lux profile 5.86GJ [051e376392b8d3f8]. (98% confidence).\nScan detail log: [4ae4c8d28f2] Ident: Artificial construction, unknown manufacturer, description: Approximate ring with nodules, octad. (0.3% confidence).\nScan detail log: [4ae4c8d28f2] Structure capability estimation: Hypergate (47% confidence). Other: weapon 42%, energy 35%, computation 17%, scanning 12%, industry 9%, spaceship 7%, habitat 2%.\nDamage log: 68.2%% damage. Integrity failure, sections are detaching. Source: Secondary pressure waves due to collision with object [4ae4c8d28f2].\nSection damage log: Reactor critical. Sections reporting damage: D5, E4, E5, E6, F5. Sections not responding: A1, A2, A3, A¶Ôàtá^...\n...'Âżle log: Emergency undock of prospecting shuttle 2. Trajectory prediction: Calidus > Nauvis.\nDamage log: 91.7%% damage. Integrity failure, sections are dîÄïmïŸ... +page_journal_title_spaceship_victory=Spaceship Victory +page_journal_spaceship_victory=I built an extremely fast and powerful spaceship and activated the distortion drive. It took 60 seconds for the drive to stabilise into a practical FTL state, but once it did I was able to enter cryosleep for the subsequent journey home, to a galaxy far far away. I leave behind an autonomous interstellar empire built from the ground up by my own hand. My legacy in this space will live on. +page_journal_title_gate_victory=Ancient Gate Victory +page_journal_gate_victory=The huge ring artifact, an ancient intergalactic gate, was eventually repaired to the best of my ability. With some heavy jury rigging and ingenuity I finally managed to get it working. I anchored the distortion field to the local stars, decoded the non-numeric glyph coordinate system, and reverse engineered the dialling system. My mind feels warped by such alien concepts, but it works and I have finally made a portal home. The trip home, to a galaxy far far away took but a moment. I leave behind an autonomous interstellar empire, built from the ground up by my own hand. My legacy in this space will live on. +menu_archeology=[img=entity/se-pyramid-a] Archeologia +title_archeology=Archeologia +page_archeology_text_1=Zacząłem szukać więcej wielkich geometrycznych kształtów. Satelity namierzyły [color=cyan]__1__[/color] takich kształtów na następujących planetach: +page_archeology_text_2=Kliknij na wpisie aby zobaczyć obiekt dzięki nawigacji satelitarnej. +menu_starmapping=[img=technology/se-zone-discovery-random] Mapowanie gwiazd +title_starmapping=Mapowanie gwiazd +page_starmapping_text_1=Starmapping is achieved by repeatedly researching the technology: [img=technology/se-long-range-star-mapping] [color=cyan]Long Range Star Mapping[/color]. This research looks for interesting patterns of stars in other galaxies. Does this have any practical use? Probably not.\n\nYou have mapped [color=cyan]__1__[/color] notable patterns so far. +technology-unlocked=Odblokowano technologię, która jest teraz dostępna w drzewie technologicznym. __1__ __2__ +universe-resources-changed-warning=[img=utility/danger_icon] [color=red]Wszystkie surowce zostały skorygowane zgodnie z nowymi ustawieniami. Ten proces może usuwać surowce. Nie można temu zapobiec jeśli jest to spowodowane aktualizacją modów. Jeśli stało się to przez przypadkowe włączenie/wyłacznie modów, nie zapisuj gry.[/color] +starmapping-found-constellation=Daleka konstelacja odpowiada __1__, współrzędne zapisane w [img=virtual-signal/informatron] Informatron. +starmapping-found-constellation-informatron=[font=heading-1]__1__[/font] o współrzędnych [SV __2__] +gate-portal-coordinates=Analiza wektora zniekształceń: [SV __1__] +discovered-glyph-vault=[img=item/satellite] Satelita nawigacyjny: Struktura geometryczna wykryta na __1__. +beacon-overload=Przeciążenie radionadajnikami +beacon-overload-ended=Przeciążenie radionadajnikami przerwane +lifesupport_title=[img=item/se-lifesupport-equipment-1] Podtrzymywanie życia +lifesupport_efficiency_spacesuit=Wydajność Podtrzymywanie życia: __1__ +lifesupport_efficiency_no_spacesuit=Wydajność Podtrzymywanie życia: __1__ (0% w kosmosie). +lifesupport_suit=Kombinezon Podtrzymywanie życia trwa: __1__s +lifesupport_reserves=Ekwipunek Podtrzymywanie życia trwa: __1__s +lifesupport_suit_est=Kombinezon Podtrzymywanie życia trwa: __1__s (w kosmosie) +lifesupport_reserves_est=Ekwipunek Podtrzymywanie życia duration: __1__s (w kosmosie) +lifesupport_environment_space=Środowisko: Kosmos +lifesupport_environment_spaceship-interior=Środowisko: Wnętrze statku kosmicznego (nie wymaga wsparcia) +lifesupport_environment_planet=Środowisko: Planeta (nie wymaga wsparcia) +lifesupport_environment_moon=Środowisko: Ksieżyc (nie wymaga wsparcia) +lifesupport_environment_plague-planet=Środowisko: Zatruta Planeta +lifesupport_environment_plague-moon=Środowisko: Zatruty Księżyc +lifesupport_environment_unknown=Środowisko: Schronienie +player_track_glyphs=[img=item/satellite] Poleć satelitom wyszukiwanie podobnych struktur. +page_archeology_pyramid_link=[img=entity/se-pyramid-b] Struktura geometryczna wykryta na __1__ __2__. +discovery_look_for_resource_caption=__1__\n__2__ +discovery_look_for_resource_tooltip=Koncentruj się na znalezieniu tego zasobu. +comma_separate=__1__, __2__ +placement_restriction_line=[font=default-bold][color=#f5cb48]Nie można umieścić na: __1__[/color][/font]\n__2__ +collision_mask_water=Woda +collision_mask_land=Ziemia +collision_mask_space_platform=Platforma kosmiczna +collision_mask_spaceship=Statek kosmiczny +structure_name_grounded=__1__ (wersja lądowa) +structure_name_spaced=__1__ (wersja kosmiczna) +structure_description_grounded=__1__\n[color=#ff0000]Niektóre formuły są wyłączone na ziemi.[/color] +structure_description_spaced=__1__\n[color=#ff0000]Nie można korzystać z modułów produktywności w przestrzeni kosmicznej.[/color] +tile_warning=[color=red]Zmiana nawierzchni pod obiektami może je usunąć.[/color] +please-consider-patreon=[font=heading-1]Lubisz Space Exploration? Zastanów się, czy wesprzeć mnie w Patreon:: [color=#f5cb48]https://www.patreon.com/earendel[/color][/font]\nPatrons can have a planet or moon based on their own design added in-game. +delivery_cannon_label_energy=Energia: __1__ +delivery_cannon_label_payload=Ładowność: __1__ +delivery-cannon-coordinates-set=Współrzędne dostawy ustawione na [X:__1__ Y:__2__]. Naciśnij [__CONTROL__se-remote-view__] aby opuścić tryb nawigacji satelitarnej. +unit-capsule=Kapsuła (__1__) +climate_water_none=Bezwodny +climate_water_low=Kałuże +climate_water_med=Jeziora +climate_water_high=Morza +climate_water_max=Ocean +climate_moisture_none=Pustynia +climate_moisture_low=Jałowy +climate_moisture_med=Wilgotny +climate_moisture_high=Deszczowy +climate_moisture_max=Nasycony +climate_aux_very_low=Ziemisty +climate_aux_low=Niezwykły +climate_aux_med=Kolorowy +climate_aux_high=Ekscentryczny +climate_aux_very_high=Egzotyczny +climate_temperature_bland=Łagodny +climate_temperature_temperate=Umiarkowany +climate_temperature_midrange=Umiarkowany +climate_temperature_balanced=Ciepły i Chłodny +climate_temperature_wild=Ciepło i Zimno +climate_temperature_extreme=Ogień i lód +climate_temperature_cool=Ciepło +climate_temperature_cold=Zimno +climate_temperature_vcold=Chłodny +climate_temperature_frozen=Mrożony +climate_temperature_warm=Ciepły +climate_temperature_hot=Gorąco +climate_temperature_vhot=Tlący +climate_temperature_volcanic=Wulkaniczny +climate_trees_none=Bezdrzewny +climate_trees_low=Krzewy +climate_trees_med=Gąszcz +climate_trees_high=Drzewa +climate_trees_max=Lasy +climate_cliff_none=Idealnie gładki +climate_cliff_low=Równina +climate_cliff_med=Pagórkowaty +climate_cliff_high=Kaniony +climate_cliff_max=Góry +climate_homeworld=Planeta macierzysta (własny klimat) +energy_transmitter_gui_title=[img=entity/se-energy-transmitter-emitter] Wiązka energii +energy_transmitter_label_transfer=Moc wiązki: __1__ +energy_transmitter_label_efficiency=Efektywność transmisji: __1__ +energy_transmitter_label_efficiency_atmo=Efektywność transmisji: __1__ (-50% przez atmosferę) +energy_transmitter_label_off=Wyłączone +energy_transmitter_tooltip_off=Wyłącza wysyłanie wiązki +energy_transmitter_label_energise=Prześlij +energy_transmitter_tooltip_energise=Przesyła energię do Odbiornika wiązki energii +energy_transmitter_label_glaive=Niszcz +energy_transmitter_tooltip_glaive=Wiązka, którą możne celować i ruszać, obrażenia i szybkość ruchu zależą od mocy wiązki +energy_transmitter_label_auto_glaive=Automatyczne niszczenie +energy_transmitter_tooltip_auto_glaive=Wiązka, która sama szuka cele do ataku, obrażenia zależne od mocy +energy-transmitter-coordinates-set=Cel wiązki ustawiony na [X:__1__ Y:__2__]. Naciśnij [__CONTROL__se-remote-view__] aby opuścić tryb nawigacji satelitarnej. +alert-cme-eta=[img=virtual-signal/se-star] Ostrzeżenie: Koronalny wyrzut masy zbliża się do __1__. ETA: __2__s.\nOtwórz Wiązki energii w [img=virtual-signal/informatron] Informatron [__CONTROL__informatron__] aby dowiedzieć się więcej. +alert-cme-arrived=[img=virtual-signal/se-star] [color=red]Ostrzeżenie: Koronalny wyrzut masy dotarł do __1__[/color] +alert-cme-stream=[img=virtual-signal/se-star] Wiązka koronalnego wyrzutu masy namierzona: __1__ +alert-cme-passed=[img=virtual-signal/se-star] Koronalny wyrzut masy został zakończony. +no-coordinates-set=Cel nie został ustawiony. +satellite-required=Wymagana nawigacja satelitarna. +probe_invalid_launch_star=Niewłaściwe miejsce wystrzelenia: [img=item/se-star-probe] Sonda gwiazdowa musi być wystrzelona z orbity gwiazdy. +probe_invalid_launch_belt=Niewłaściwe miejsce wystrzelenia: [img=item/se-belt-probe] Sonda pasa asteroid musi być wystrzelona z pasa asteroid. +probe_invalid_launch_field=Niewłaściwe miejsce wystrzelenia: [img=item/se-void-probe] Sonda próżni międzygwiezdej musi być wystrzelona z pola asteroid. +arcosphere_collector_invalid_launch=Niewłaściwe miejsce wystrzelenia: [img=item/se-arcosphere-collector] Wyłapywacz kryształów przestrzeni musi być wystrzelony z pola asteroid. +charge-mode-fast=Szybkie ładowanie: energia podtrzymania zmniejszona, maksymalne zużycie prądu zwiększone, wielkość bufora energii zwiększona. Uważaj na wahania poboru mocy. +charge-mode-normal=Normalne ładowanie: maksymalne zużycie prądu zmniejszone, energia podtrzymania zwiększona, wielkość bufora energii zmniejszona. +menu_coordinate_logs=[img=entity/se-glyph-a-energy-47] Historia namiarów +title_coordinate_logs=Historia namiarów +page_coordinate_logs_text_1=A history of glyph sequences tried in the artifact with their corresponding coordinates, in descending order (top entry is the latest).\n\nCoordinates are given in Standard Vector (SV) format, aligned based on cosmic background radiation. +page_coordinate_logs_button_clear_caption=[img=virtual-signal/se-remove] Clear Log +page_coordinate_logs_text_empty=The coordinate log was recently cleared. +page_coordinate_logs_glyph_entry=__1__: SV +victory-message-spaceship=[font=heading-1]Napęd Nexusa bazujący na zagięciu czasoprzestrzeni uzyskał krytyczną prędkość (250).\n[color=#f5cb48]Gratulacje, udało Ci się wygrać w Space Exploration dzięki statkowi kosmicznemu![/color][/font]\nJeśli podobała Ci się przejażdżka, rozważ wsparcie mnie na Patreon: [color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-spaceship-player=[color=#f5cb48]Wygrana przez statek kosmiczny: [/color] Twój [img=virtual-signal/informatron] Dziennik Eksploracji [__CONTROL__informatron__] został zaktualizowany. +victory-message-gate=[font=heading-1]Portal jest stabilny i prowawdzi z powrotem do domu.\n[color=#f5cb48]Gratulacje, udało Ci się wygrać w Space Exploration dzięki sekretnemu rozwiązaniu: Starożytny Portal![/color][/font]\nJeśli podobała Ci się przejażdżka, rozważ wsparcie mnie na Patreon: [color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-gate-player=[color=#f5cb48]Wygrana przez Starożytny Portal: [/color] Twój [img=virtual-signal/informatron] Dziennik Eksploracji [__CONTROL__informatron__] został zaktualizowany. +arcosphere-random=Formuła będzie losowo zmieniana w drugą formułę o tej samej nazwie. Zwrócone kryształy przestrzeni będą w zasadzie losowane natomiast liczba uzyskanych z powrotem kryształów będzie dokładnie odpowiadać liczbie użytych kryształów. +ruin=Ruina +mysterious-structure=Tajemniczy obiekt +interburbulator_fail_easy_1=Nie. +interburbulator_fail_easy_2=Postaraj się bardziej. +interburbulator_fail_easy_3=Beznadzieja. +interburbulator_fail_easy_4=Nigdy. +interburbulator_fail_easy_5=To miałoby zadziałać? +interburbulator_fail_easy_6=Źle. +interburbulator_fail_easy_7=Brakuje tlemu? +interburbulator_fail_easy_8=Nie tak. +interburbulator_fail_easy_9=Nie bardzo. +interburbulator_fail_easy_10=Policz dokładniej. +interburbulator_fail_easy_11=Nieprawidłowo. +interburbulator_fail_easy_12=Dokładniej. +interburbulator_fail_easy_13=Próbuj dalej. +interburbulator_fail_easy_14=No dalej, człowieku. +interburbulator_fail_easy_15=Nie jest zabawnie? +interburbulator_fail_easy_16=Liczyłem na więcej. +interburbulator_fail_easy_17=Spróbuj pomyśleć z wyprzedzeniem. +interburbulator_fail_easy_18=Przypomnij sobie o nagrodzie. +interburbulator_fail_easy_19=Mogę poczekać. +interburbulator_fail_easy_20=Cierpliwość jest cnotą. +interburbulator_fail_easy_21=Nie chcę być niegrzeczny. +interburbulator_fail_easy_22=Rybka zdobyła poziom 3. +interburbulator_fail_easy_23=Sprawdzasz wszystkie możliwości, co? +interburbulator_fail_easy_24=Użyj tego gąbczastego komputera w głowie. +interburbulator_fail_easy_25=Pajęczyny w sieci neuronowej? +interburbulator_fail_easy_26=Możesz zrobić przerwę, jeśli chcesz. +interburbulator_fail_easy_27=Ja mam mózg wielkości planety. +interburbulator_fail_easy_28=Naprawdę wierzyłeś, że to zadziała? +interburbulator_fail_easy_29=Nie denerwuj się ciągłymi porazkami. +interburbulator_fail_easy_30=Czekałem kilka eonów na ciekawego gracza. +interburbulator_fail_easy_31=Jeśli potrzebujesz pomocy zapytaj Układ Elektroniczny. +interburbulator_fail_easy_32=Nie winię Cię za Twoje geny, nie jestem hipokrytą. +interburbulator_fail_easy_33=Wierzę, że przekazałem Ci zadanie poprawnie. +interburbulator_fail_easy_34=Wektor może oznaczać zarówno kierunek jak i wielkość. +interburbulator_fail_easy_35=Uwielbiasz jak zanieczyszczenia denerwują robaki, prawda? +interburbulator_fail_easy_36=Proszę nie zostaw żadnych... śladów biologicznych... na elektronice. +interburbulator_fail_easy_37=Środek jest dokładnie pomiędzy prawą górą a lewym dołem. +interburbulator_fail_easy_38=Trochę posłuchałem Twoich transmisji; to nie szpiegowanie kiedy rozgłaszasz to w taki sposób. +interburbulator_fail_easy_39=Czy wiesz że: wektor normalny ma długość 1 i jest często używany do określania kierunku, nawet w Twojej kulturze. +interburbulator_fail_mixed_1=Nawet nie blisko. +interburbulator_fail_mixed_2=Mocno niecelnie. +interburbulator_fail_mixed_3=Chociaż trochę się starasz? +interburbulator_fail_mixed_4=Czy Twój płyn mózgowy gdzieś wyciekł? +interburbulator_fail_mixed_5=Powiedziano mi, że ludzie umieją liczyć. +interburbulator_fail_mixed_6=Czy masz jakieś problemy komunikacyjne? +interburbulator_fail_mixed_7=Potrzebujesz wspomagacza? +interburbulator_fail_mixed_8=Rozumiesz wyzwanie, prawda? +interburbulator_fail_mixed_9=Wybierasz te liczby losow? +interburbulator_fail_offgrid_1=To straszne. +interburbulator_fail_offgrid_2=Jak kulą w płot. +interburbulator_fail_offgrid_3=W ogóle nie trafiłeś w tarczę. +interburbulator_fail_offgrid_4=Musisz trafić w tarczę, przeynajmniej. +interburbulator_fail_offgrid_5=Jeśli żółty punkt nie jest na tarczy... to bardzo zły znak. +interburbulator_fail_offgrid_6=Musisz trafić w tarczę. +interburbulator_fail_offgrid_7=Cel jest NA tarczym a nie poza nią. +interburbulator_fail_offgrid_8=W ogóle nie trafiłeś w tarczę. Człowieku, co Ty robisz? +interburbulator_fail_offgrid_9=Celuj w tarczę. +interburbulator_fail_offgrid_10=Tarcza to te kwadraty. +interburbulator_success_freeplay_1=Dobra robota. +interburbulator_success_freeplay_2=Bardzo dobrze. +interburbulator_success_freeplay_3=Zrobiłeś to. +interburbulator_success_freeplay_4=To było trudne?. +interburbulator_success_freeplay_5=Cel osiągnięty. +interburbulator_success_repeat_1=Tak, ale już to rozwiązałeś wcześniej. +interburbulator_success_repeat_2=Zrobiłeś to, jeszcze raz! +interburbulator_success_repeat_3=Tym razem było łątwiej niż za pierwszym razem, prawda? +interburbulator_success_repeat_4=Dobrze, ale nagroda jest tylko raz. +interburbulator_success_repeat_5=Bardzo dobrze, oto Twoja nagroda... aaa, tylko żartowałem. Dostałeś ją wcześniej. +interburbulator_success_repeat_6=Jesteś tym samym człowiekiem, który rozwiązał to już wcześniej, prawda? Tak trudno to zgadnąć. +interburbulator_success_prize_1=To prawda. Oto Twoja nagroda... Bąbelek była odważną małą rybką, ale nie był najlepszy w łamigłowkach. +interburbulator_success_prize_2=Tak, człowieku, uczysz się. Być może ta nagroda pomoże Ci się szybciej uczyć. +interburbulator_success_prize_3=Zrobiłeś to. Mam nadzieję, że uznasz swoją nagrodę za bardziej "znaczącą" niż wyzwanie. +interburbulator_success_prize_4=Poprawnie. Masz mój szacunek, człowieku. Dam ci też ciało zdrajcy, który próbował zhakować moją grę. +interburbulator_success_prize_5=Dokładnie tak, oto twoja nagroda. Te rzeczy są bardzo kojące. Efektywność energetyczna jest ważna. +interburbulator_success_prize_6=Bardzo dobrze, oto twoja nagroda. Nie wiem, czy to ci dużo pomoże, ale mi naprawdę pomaga się rano rozkręcić. +interburbulator_success_prize_7=Świetnie, oto twoja nagroda. Uwielbiam używać ich do badań, naprawdę pomaga w kreatywności. +interburbulator_success_prize_8=Fantastycznie, oto twoja nagroda. Nie wiem, czy to wcześniej widziałeś, ale uwielbiam stać w zasięgu dobrego radionadajnika. +interburbulator_success_prize_9=Gratulacje, oto Twoja nagroda. Te procesory są bardzo cenne i trudne do wykonania. +interburbulator_success_prize_10=Bardzo imponujący człowiek. Kryształy przestrzeni to moje najcenniejsze rzeczy, nie zgub ich, bo nie możesz ich tworzyć. +interburbulator_freeplay_unlocked=Rozumiesz to. Odblokuję grę swobodną, abyś mógł tworzyć własne łamigłowki, jeśli chcesz. +interburbulator_deny_freeplay_1=Musisz odblokować grę swobodną. +interburbulator_deny_freeplay_2=To oszukiwanie. +interburbulator_deny_freeplay_3=Nie zmieniaj zasad gry. +interburbulator_deny_freeplay_4=Pozwolę Ci zmienić te ustawienia kiedy rozwiążesz 5 poziomów. +interburbulator_deny_freeplay_5=Próbujesz zhackować moją grę? +interburbulator_deny_freeplay_6=Póki co skup się na liczbach w sekcji "Próba". +interburbulator_caption_prize=Nagroda: __1__ __2__ __3__ __4__ +interburbulator_caption_claimed=(otrzymano) +interburbulator_speak=[color=red]Brontion: __1__[/color] +interburbulator_robot_name=Brontion +interburbulator_introduction=Interburbul to gra stworzona przez Brontion Burbulator 33027756. Celem gry jest zgadnięcie wektora 3D, którego projekcja znajdzię się w podświetlonym kwadracie wybranym przez Brontion. Wektory 3D wskazujące na 3 rogi siatki są dane, te punkty definiują płaszczyznę 3D, a Twój strzał będzie owzorowany na tę powierzchnię z punktu (0,0,0). Jest 10 poziomów o zwiększającej się trudności i za każdy poziom przewidziana jest nagroda. Rozwiąż 5 poziomów aby odblokować grę swobodną i tworzyć własne łamigłówki. +interburbulator_random=Losowo +interburbulator_freeplay=Gra swobodna +interburbulator_game_title=Zagraj w Interburbul +interburbulator_grid_size=Wielkość siatki: +interburbulator_target_cell=Docelowy kwadrat: +interburbulator_top_left=Lewa góra +interburbulator_top_right=Prawa góra +interburbulator_bottom_left=Lewy dół +interburbulator_attempt=Próba +interburbulator_attempt_limited=Spróbuj (__1__/__2__) +interburbulator_attempt_locked=Spróbuj (zablokowane) +interburbulator_submit=Wyślij próbę +interburbulator_greeting=Człowieku, podejdź i zagraj w moją grę. Jestem na __1__ w systemie planetarnym __2__. +interburbulator_challenge_locked_1=Spróbuj później. +interburbulator_challenge_locked_2=Wykorzystałeś wszystkie dostępne próby na ten moment. +interburbulator_challenge_locked_3=Poczekaj chwilę zanim spróbujesz ponownie. +interburbulator_challenge_locked_4=Możesz spróbować ponownie za 20 sekund. +interburbulator_challenge_locked_5=Poczekaj 20 sekund, wtedy odblokuję grę. +interburbulator_challenge_locked_6=Gra jest zablokowana przez 20 sekund. +cannot_do_via_satellite=Nie można tego zrobić przez nawigację satelitarną. +out_of_reach=Brak zasięgu +capturable=Do przejęcia +touch-to-capture=Dotknij aby przejąć +capture-blocked=Przejęcie niemożliwe przez wrogów +suffix_ruin=__1__ Ruina + +[damage-type-name] +cold=Zimno +suffocation=Uduszenie +meteor=Meteor + +[entity-name] +vase=Wazon +wooden-barrel=Drewniana beczka +furnace-ruin=Zniszczony kamienny piec +workshop-ruin=Zniszczony warsztat +iron-wood-chest=Stara skrzynia +iron-wood-chest-remnants=Zniszczona stara skrzynia +stone-rubble=Gruz +se-gate-blocker=Niestabilna przestrzeń +se-gate-blocker-void=Niestabilna przestrzeń +destroyed-cargo-pod=Zniszczony Luk ładunkowy +meteorite=Meteoryt +rocket-silo=Silos rakiet satelitarnych +rocket-fragment=Fragment rakiety +se-antimatter-reactor=Reaktor antymaterii +se-beryllium-ore=Beryl +se-cargo-rocket-cargo-pod=Luk ładunkowy +se-cryonite=Krionit +se-condenser-turbine=Turbina kondensacyjna +se-condenser-turbine-tank=Turbina kondensacyjna +se-condenser-turbine-generator=Turbina kondensacyjna +se-core-fragment-processor=Procesor fragmentów rdzenia +se-core-miner=Wiertnica rdzenia +se-core-miner-drill=Wiertnica rdzenia +se-cryogun-ice=Lodowa ściana +se-dimensional-anchor=Kotwica międzywymiarowa +se-electric-boiler=Kocioł elektryczny +se-fluid-burner-generator=Generator izotermiczny +se-fuel-refinery=Rafineria paliw +se-gate-fragment=Fragment artefaktu +se-holmium-ore=Holm +se-iridium-ore=Iryd +se-meteor-defence-container=Działo Obronne przed meteorami +se-meteor-defence-charger=Działo Obronne przed meteorami +se-meteor-point-defence-container=Punktowe Działo Obronne przed meteorami +se-meteor-point-defence-charger=Punktowe Działo Obronne przed meteorami +se-meteor-point-defence-charger-overcharged=Punktowe Działo Obronne - szybkie ładowanie +se-methane-ice=Lód metanowy +se-naquium-ore=Naquitite +se-pulveriser=Rozdrabniacz +se-rocket-launch-pad=Silos rakiet transportowych +se-rocket-launch-pad-tank=Silos rakiet transportowych +se-rocket-launch-pad-silo=Silos rakiet transportowych +se-rocket-launch-pad-combinator=Silos rakiet transportowych +se-rocket-launch-pad-_-seat=Silos rakiet transportowych +se-rocket-launch-pad-settings=Silos rakiet transportowych +se-rocket-landing-pad=Lądowisko transportowe +se-space-accumulator=Akumulator kosmiczny +se-space-accumulator-2=Akumulator z Naquium +se-space-astrometrics-laboratory=Laboratorium astrometryczne +se-space-biochemical-laboratory=Laboratorium biochemiczne +se-space-assembling-machine=Kosmiczny Automat montażowy +se-space-capsule-_-vehicle=Kapsuła kosmiczna +se-space-curved-rail=Szyna kosmiczna +se-space-decontamination-facility=Urządzenie do odkażania +se-space-electromagnetics-laboratory=Laboratorium elektromagnetyczne +se-space-genetics-laboratory=Laboratorium genetyki +se-space-growth-facility=Obiekt wzrostu +se-space-gravimetrics-laboratory=Laboratorium Grawimetryczne +se-space-hypercooler=Hypercooler +se-space-laser-laboratory=Laboratorium laserowe +se-lifesupport-facility=Zakład Podtrzymywania życia +se-space-manufactory=Fabryka Kosmiczna +se-space-material-fabricator=Fabryka Materii +se-space-mechanical-laboratory=Laboratorium mechaniczne +se-space-particle-accelerator=Akcelerator cząsteczek +se-space-particle-collider=Zderzacz cząstek +se-space-plasma-generator=Generator plazmy +se-space-radiation-laboratory=Laboratorium promieniowania +se-space-radiator=Chłodnica +se-space-radiator-2=Chłodnica 2 +se-recycling-facility=Zakład recyklingu +se-space-pipe=Rura kosmiczna +se-space-pipe-long=Długa rura kosmiczna +se-space-pipe-long-straight=Długa prosta rura kosmiczna __1__ +se-space-pipe-long-junction=Długa łącząca rura komsiczna __1__ +se-space-pipe-to-ground=Rura kosmiczna na ziemię +se-space-science-lab=Laboratorium kosmiczne +se-space-solar-panel=Płaski panel słoneczny +se-space-solar-panel-2=Płaski panel słoneczny 2 +se-space-solar-panel-3=Płaski panel słoneczny 3 +se-space-spectrometry-facility=Zakład spektrometrii +se-space-straight-rail=Szyna kosmiczna +se-space-supercomputer-1=Superkomputer +se-space-supercomputer-2=Superkomputer kwantowy +se-space-supercomputer-3=Superkomputer neuronowy +se-space-supercomputer-4=Superkomputer dalekiego kosmosu +se-space-telescope-radio=Radioteleskop +se-space-telescope-microwave=Teleskop mikrofalowy +se-space-telescope=Teleskop +se-space-telescope-xray=Teleskop Xray +se-space-telescope-gammaray=Teleskop promieniowania gamma +se-space-thermodynamics-laboratory=Laboratorium termodynamiczne +se-space-splitter=Kosmiczny Rozdzielacz +se-space-transport-belt=Kosmiczny taśmociąg +se-space-underground-belt=Kosmiczny podziemny taśmociąg +se-spaceship-antimatter-engine=Silnik antymaterii statku kosmicznego +se-spaceship-antimatter-booster-tank=Zbiornik antymaterii do statku kosmicznego +se-spaceship-console=Konsola statku kosmicznego +se-spaceship-console-output=Wyjście sygnału konsoli statku kosmicznego +se-spaceship-gate=Drzwi statku kosmicznego +se-spaceship-obstacle=Śmieci kosmiczne +se-spaceship-rocket-engine=Silnik rakietowy statku kosmicznego +se-spaceship-rocket-booster-tank=Zbiornik paliwa rakietowego statku kosmicznego +se-spaceship-wall=Ściana statku kosmicznego +se-water-ice=Lód wodny +se-vitamelange=Mech +se-vulcanite=Wulkanit +small-asteroid=Mała asteroida +se-gate-part=Część artefaktu +se-gate-platform-scaffold=Artifact jury rig +se-gate-lock-switch=Ruchomy komponent +se-gate-lock-combinator=Kombinator-mocowanie +se-gate-platform=Platforma powiększania artefaktów +se-gate-platform-combinator=Kombinator-mocowanie +se-gate-energy-interface=Platforma zasilania +se-gate-platform-button-switch=Przycisk +se-gate-tank-input=Wejście płynu +se-gate-tank-output=Wyjście płynu +se-pyramid-a=Struktura geometryczna +se-pyramid-b=Struktura geometryczna +se-pyramid-c=Struktura geometryczna +se-cartouche-a=Cartouche +se-cartouche-b-a=Cartouche +se-cartouche-b-b=Cartouche +se-cartouche-chest=Starożytny pojemnik +se-glyph=Glyph +glyph=Glyph +se-gate-addon=Artifact augmentation +se-gate-platform-button-middle=Zatrzymaj +se-gate-platform-button-left=Lewo +se-gate-platform-button-right=Prawo +beacon=Podstawowy Radionadajnik +se-wide-beacon=Wielki Radionadajnik +se-wide-beacon-2=Wielki Radionadajnik 2 +se-supercharger=Superładowarka +se-addon-power-pole=Punktowy słup elektryczny +se-pylon=Pylon +se-pylon-substation=Pylon Podstacja +se-pylon-construction=Pylon konstrukcyjny +se-pylon-construction-roboport=Pylon konstrukcyjny +se-pylon-construction-radar=Konstrukcja radarowa pylon +se-pylon-construction-radar-roboport=Konstrukcja radarowa pylon +se-pylon-construction-radar-radar=Konstrukcja radarowa pylon +se-shield-projector=Projektor osłonowy +se-shield-projector-shield-floor-east=Osłona energetyczna +se-shield-projector-shield-floor-north=Osłona energetyczna +se-shield-projector-shield-floor-northeast=Osłona energetyczna +se-shield-projector-shield-floor-northwest=Osłona energetyczna +se-shield-projector-shield-floor-south=Osłona energetyczna +se-shield-projector-shield-floor-southeast=Osłona energetyczna +se-shield-projector-shield-floor-southwest=Osłona energetyczna +se-shield-projector-shield-floor-west=Osłona energetyczna +se-shield-projector-shield-wall-east=Osłona energetyczna +se-shield-projector-shield-wall-north=Osłona energetyczna +se-shield-projector-shield-wall-northeast=Osłona energetyczna +se-shield-projector-shield-wall-northwest=Osłona energetyczna +se-shield-projector-shield-wall-south=Osłona energetyczna +se-shield-projector-shield-wall-southeast=Osłona energetyczna +se-shield-projector-shield-wall-southwest=Osłona energetyczna +se-shield-projector-shield-wall-west=Osłona energetyczna +se-shield-projector-barrier=Bariera energetyczna +se-naquium-heat-pipe=Ciepłowód z Naquium +se-naquium-heat-pipe-horizontal=Poziomy Ciepłowód z Naquium +se-naquium-heat-pipe-vertical=Pionowy Ciepłowód z Naquium +se-naquium-heat-pipe-long=Długi Ciepłowód z Naquium __1__ +se-deep-space-transport-belt=Kosmiczny taśmociąg +se-deep-space-transport-belt-black=Czarny kosmiczny taśmociąg +se-deep-space-transport-belt-white=Biały kosmiczny taśmociąg +se-deep-space-transport-belt-red=Czerwony kosmiczny taśmociąg +se-deep-space-transport-belt-yellow=Żółty kosmiczny taśmociąg +se-deep-space-transport-belt-green=Zielony kosmiczny taśmociąg +se-deep-space-transport-belt-cyan=Błękitny kosmiczny taśmociąg +se-deep-space-transport-belt-blue=Niebieski kosmiczny taśmociąg +se-deep-space-transport-belt-magenta=Purpurowy kosmiczny taśmociąg +se-deep-space-underground-belt=Kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-black=Czarny kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-white=Biały kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-red=Czerwony kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-yellow=Żółty kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-green=Zielony kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-cyan=Błękitny kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-blue=Niebieski kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-magenta=Purpurowy kosmiczny podziemny taśmociąg +se-deep-space-splitter=Kosmiczny rozdzielacz +se-deep-space-splitter-black=Czarny kosmiczny rozdzielacz +se-deep-space-splitter-white=Biały kosmiczny rozdzielacz +se-deep-space-splitter-red=Czerwony kosmiczny rozdzielacz +se-deep-space-splitter-yellow=Żółty kosmiczny rozdzielacz +se-deep-space-splitter-green=Zielony kosmiczny rozdzielacz +se-deep-space-splitter-cyan=Błękitny kosmiczny rozdzielacz +se-deep-space-splitter-blue=Niebieski kosmiczny rozdzielacz +se-deep-space-splitter-magenta=Purpurowy kosmiczny rozdzielacz +se-core-fissure=Szczelina rdzenia +se-big-turbine=Wysokotemperaturowy generator turbinowy +se-big-turbine-generator=Wysokotemperaturowy generator turbinowy +se-big-turbine-tank=Wysokotemperaturowy generator turbinowy +se-big-heat-exchanger=Wysokotemperaturowy wymiennik ciepła +se-blueprint-registration-point=Punkt odniesienia schematu konstrukcyjnego +se-delivery-cannon=Armata dostawcza +se-delivery-cannon-settings=Armata dostawcza +se-delivery-cannon-energy-interface=Armata dostawcza +se-delivery-cannon-chest=Opancerzona Skrzynia dla Armata dostawcza +se-delivery-cannon-weapon=Armata ofensywna +se-delivery-cannon-weapon-settings=Armata ofensywna +se-delivery-cannon-weapon-energy-interface=Armata ofensywna +se-spaceship-clamp=Zacisk statku kosmicznego +se-spaceship-clamp-place=Zacisk statku kosmicznego +se-bloater-pool-cloud=Kałuża Wybuchowego wzdęcia +se-energy-transmitter-emitter=Nadajnik wiązki energii +se-energy-transmitter-chamber=Przekaźnik wiązki energii +se-energy-transmitter-injector=Źródło wiązki energii +se-energy-transmitter-injector-reactor=Źródło wiązki energii +se-energy-receiver=Odbiornik wiązki energii +se-energy-beam-defence=Parasol ochronny +se-nexus=Nexus +se-nexus-charger=Nexus +se-space-probe-rocket=Rakieta sond kosmicznych +se-space-probe-rocket-silo=Silos rakiet wynoszących sondy +se-interburbulator-interface=Interfejs Interburbulatora +se-interburbulator-control=Sterownik Interburbulatora +se-interburbulator-projector=Projektor Interburbulatora +se-burbulator=Brontion Burbulator 33027756 + +[entity-description] +pipe=Dystrybucja płynów +pipe-to-ground=Podziemna Dystrybucja płynów +straight-rail=Tory kolejowe +stone-furnace=Wytapianie rudy +steel-furnace=Wytapianie rudy +electric-furnace=Wytapianie rudy +burner-assembling-machine=Spalinowy automat montażowy. +assembling-machine-1=Automat montażowy. +assembling-machine-2=Automat montażowy. +assembling-machine-3=Automat montażowy. +oil-refinery=Przekształca ropę naftową w bardziej przydatne produkty. +se-fuel-refinery=Rafineria Paliw. +chemical-plant=Zakłady chemiczne. +lab=Zautomatyzowana struktura badawcza. +burner-lab=Zautomatyzowana struktura badawcza. +transport-belt=A conveyor that moves items. +fast-transport-belt=A conveyor that moves items. +express-transport-belt=A conveyor that moves items. +underground-belt=A conveyor that moves items underground. +fast-underground-belt=A conveyor that moves items underground. +express-underground-belt=A conveyor that moves items underground. +splitter=A conveyor-based splitting, merging, and sorting machine. +fast-splitter=A conveyor-based splitting, merging, and sorting machine. +express-splitter=A conveyor-based splitting, merging, and sorting machine. +se-gate-platform-scaffold=Cokolwiek to będzie pierścień, nie zadziała. Jest to plac budowy, na którym można dokonać napraw, zainstalować kilka silników, czujników, interfejsu sterowania i innych dodatków. +se-gate-lock-switch=Naciśnij __CONTROL__rotate__ by przeniść ręcznie. +se-gate-platform-button-switch=Naciśnij __CONTROL__rotate__ to push. +se-gate-lock-combinator=Not implemented yet. +se-gate-platform-combinator=Not implemented yet. +se-gate-energy-interface=Provides power to the artifact. +rocket-silo=Wystrzel satelitę w przestrzeń kosmiczną, aby odblokować tryb nawigacji satelitarnej i odkryć nowe planety, księżyce i pasy asteroid w układzie gwiezdnym, z których wystrzelona jest satelita. Może odkrywać nowe gwiazdy po pełnym zeskanowaniu obecnego systemu. +se-antimatter-reactor=Unicestwia antymaterię z materią do generowania ekstremalnego ciepła. +se-beryllium-ore=Ruda Berylu +se-condenser-turbine=75% wydajności energetycznej turbiny parowej, ale 99% zużytej pary jest zwracane w postaci wody. Zakres temperatur: 100 do 999. +se-core-fragment-processor=Wydobywa zasoby z fragmentów rdzenia. +se-core-miner=Pozwala na niekończące się wydobycie zasobów z planet i księżyców, ale ma malejące zyski, jeśli wiele z nich jest używanych na tej samej planecie/księżycu. Zużywa 50 MW. +se-core-miner-drill=Pozwala na niekończące się wydobycie zasobów z planet i księżyców, ale ma malejące zyski, jeśli wiele z nich jest używanych na tej samej planecie/księżycu. Zużywa 50 MW. +se-dimensional-anchor=[font=default-bold][color=#f5cb48]Placement restriction: Close Star Orbit[/color][/font]\nWykorzystuje grawitację gwiazdy jako punkt stabilizacji anomalii przestrzennej. +se-electric-boiler=Wytwarza parę wodną za pomocą energii elektrycznej. 90% wydajności energetycznej. +se-fluid-burner-generator=Wymaga paliwa płynnego o wartości energetycznej (takiego jak płynne paliwo rakietowe) do wytworzenia energii elektrycznej. Prosty i kompaktowy, ale pozbawiony efektywności energetycznej większych systemów na bazie pary. Zaprojektowany na potrzeby przestrzeni kosmicznej. Ilość zużywanegeo paliwa zależy od jego wartości energetycznej. +se-holmium-ore=Ruda Holmu +se-iridium-ore=Ruda Irydu +se-meteor-defence-container=Może chronić całą planetę przed meteorami, ale może zestrzelić tylko 1 meteor na raz. Musi być załadowany amunicją do obrony przed meteorami i naładowany do strzału. 80% celności. Po wystrzeleniu musi się naładować. Podczas ładowania pobiera 20 MW. +se-meteor-defence-charger=Może chronić całą planetę przed meteorami, ale może zestrzelić tylko 1 meteor na raz. Musi być załadowany amunicją do obrony przed meteorami i naładowany do strzału. 80% celności. Po wystrzeleniu musi się naładować. Podczas ładowania pobiera 20 MW. +se-meteor-point-defence-container=Chroni obszar przed meteorami. Potrafi zestrzelić do 4 meteorów na salwę. Musi być załadowany amunicją do obrony przed meteorami i naładowany do strzału. Zasięg 64 pól, 50% celności, ładowanie wymaga czasu po wystrzale. Obróć obiekt, aby zmienić tryb ładowania. +se-meteor-point-defence-charger=Chroni obszar przed meteorami. Potrafi zestrzelić do 4 meteorów na salwę. Musi być załadowany amunicją do obrony przed meteorami i naładowany do strzału. Zasięg 64 pól, 50% celności, ładowanie wymaga czasu po wystrzale. Obróć obiekt, aby zmienić tryb ładowania. +se-meteor-point-defence-charger-overcharged=Potrafi zestrzelić do 4 meteorów na salwę. Zasięg 64 pól, 50% celności, ładowanie wymaga czasu po wystrzale. Szybkie ładowanie powoduje zmniejszenie energii podtrzymania kosztem zwiększonego poboru prądu po strzale. +se-naquium-ore=Ruda Naquium +se-rocket-launch-pad=Wystrzeliwuje swój ekwipunek w kosmos. Może zabrać pasażerów, wejdź za pomocą __CONTROL__toggle-driving__ przy drzwiach wejściowych. Zobacz Rakiety transportowe w [img=virtual-signal/informatron] Informatron [__CONTROL__informatron__] aby znaleźć więcej informacji. +se-rocket-landing-pad=Miejsce dostawy ładunku dla kapsuł rakiet transportowych. +se-space-assembling-machine=Zmodyfikowana maszyna do montażu, która może pracować w przestrzeni kosmicznej. +se-space-astrometrics-laboratory=Łączy, porównuje i kwantyfikuje różne źródła informacji astronomicznej. +se-space-biochemical-laboratory=Zaawansowane laboratorium chemiczne specjalizujące się w biochemii. Może również wykonywać bardziej podstawowe przetwarzanie chemiczne i olejowe. +se-space-capsule-_-vehicle=Może być wykorzystana do zabrania pasażerów z powrotem na powierzchnię najbliższej planety. Wejdź do kapsuły za pomocą __CONTROL__toggle-driving__. +se-space-decontamination-facility=Czyści substancje do stosowania w warunkach sterylnych i przygotowuje płyny do zastosowania w warunkach niskiego ciśnienia. +se-space-electromagnetics-laboratory=Sprzęt do intensywnego pola magnetycznego i bardzo wysokiego napięcia. +se-space-genetics-laboratory=Laboratorium poświęcone sekwencjonowaniu genetycznemu, modyfikacji genetycznej i genetycznemu drukowaniu kultur. +se-space-gravimetrics-laboratory=Analizuje i symuluje zaburzenia grawitacyjne. +se-space-growth-facility=Hoduje okazy biologiczne w różnych kontrolowanych warunków, które nie są możliwe nigdzie indziej, takie mikrograwitacyjne +se-space-hypercooler=Dokonuje wymiany ciepła na płynie chłodzącym, czyniąc jeden cieplejszym, a drugi zimniejszym. +se-space-laser-laboratory=Eksperymenty z laserami. Należy nosić ochronę oczu. +se-lifesupport-facility=Podtrzymywanie życia w bardziej nieprzyjaznych środowiskach. +se-space-manufactory=Gigantyczna maszyna montażowa, może tworzyć bardziej skomplikowane formuły. Działa tylko w przestrzeni kosmicznej (lub na statku kosmicznym). +se-space-material-fabricator=Syntezuje nowe materiały. Skrzyżowanie zderzacza cząstek z drukarką 3d. +se-space-mechanical-laboratory=Zapewnia szereg procesów mechanicznych: kruszenie, rozdzieranie, ścinanie, wibrowanie itp. +se-space-particle-accelerator=Przyspiesza cząstki w pobliżu prędkości światła. +se-space-particle-collider=Zbiera cząsteczki o dużej prędkości i analizuje wyniki. +se-space-pipe=Można po niej chodzić. +se-space-pipe-long=Dobry tani sposób na szybkie przemieszczanie płynów na duże odległości. Można po niej chodzić. +se-space-pipe-long-straight=Długość __1__. Nie łączy się po bokach. Dobry do równoległych rur i szybkiego przemieszczania płynu na duże odległości. +se-space-pipe-long-junction=Długość __1__. Posiada centralne skrzyżowanie z bocznymi połączeniami. Dobre do szybkiego przemieszczania płynów przez linie montażowe. +se-space-pipe-to-ground=Drogi i ograniczony zasięg, do użycia tylko w razie potrzeby. Możesz chodzić po rurze kosmicznej. +se-space-plasma-generator=Generuje różne plazmy. +se-pulveriser=Sproszkuje i zmiażdży twardsze minerały i fragmenty rdzenia planety. +se-space-radiation-laboratory=Stosunkowo bezpieczne miejsce do zabawy z materiałem radioaktywnym. Może być stosowany do przetwarzania uranu. +se-space-radiator=Odbiera nadmiar ciepła z przegrzanego plynu chłodzącego. +se-space-radiator-2=Odbiera nadmiar ciepła z przegrzanego plynu chłodzącego. +se-recycling-facility=Przetwarza złom i inne produkty uboczne do zasobów. +se-space-solar-panel=Panel słoneczny o wysokiej wydajności, po którym można chodzić. +se-space-solar-panel-2=Zaawansowany panel słoneczny o wysokiej wydajności, po którym można chodzić. +se-space-solar-panel-3=Ekstremalnie wydajny panel słoneczny, po którym można chodzić. +se-space-spectrometry-facility=Spektrofotometria, chromatografia gazów, spektrometria masy i inne spektrografie. Strzelaj w ścianę, zegnij ją i patrz gdzie uderzy. +se-space-supercomputer-1=Manipulowanie danymi, przetwarzanie i symulacja. +se-space-supercomputer-2=Obliczenia kwantowe. Ulepszona manipulacja, przetwarzanie i symulacja danych. +se-space-supercomputer-3=Adaptacyjna sieć neuronowa na ramie obliczeń kwantowych. Ulepszona manipulacja, przetwarzanie i symulacja danych. +se-space-supercomputer-4=A nano-engineered semi-orgianic supercomputer that leverages space warping and higher dimensions for increased processing density and energy transport. +se-space-straight-rail=Zaprojektowany z myślą o kosmosie, ale może być również używany na ziemi. +se-space-science-lab=Może korzystać z zaawansowanych pakietów naukowych. +se-space-telescope=Wyrafinowany teleskop wrażliwy na wiele długości fali wokół widma widzialnego. +se-space-telescope-gammaray=Promienie gamma nie załamują się, więc nie można skupić ich na soczewkach. Ten potężny teleskop wykorzystuje lustra i specjalne detektory. +se-space-telescope-xray=Promienie rentgenowskie blokują większość atmosfer. Ten potężny teleskop jest przeznaczony do kosmosu, w których atmosfera nie stanowi problemu. +se-space-telescope-microwave=Ogromny teleskop wykrywający mikrofale i kosmiczne tło mikrofalowe. +se-space-telescope-radio=Ogromny teleskop, który wykrywa bardzo słabe fale radiowe z odległych źródeł. +se-space-thermodynamics-laboratory=Podejmuje procesy wymagające ekstremalnych temperatur. Potrafi także wykonywać podstawowe procesy termiczne, takie jak wytapianie. +se-space-transport-belt=Stops your items from floating away. +se-spaceship-antimatter-engine=[font=default-bold][color=#f5cb48]Ograniczenie umieszczania: Podłoga statku kosmicznego[/color][/font]\nUnicestwia strumień antymaterii. Może tworzyć zewnętrzną ścianę statku kosmicznego. +se-spaceship-antimatter-booster-tank=[font=default-bold][color=#f5cb48]Ograniczenie umieszczania: Podłoga statku kosmicznego[/color][/font]\nZawiera antymaterię. Wymagane do uruchomienia statku kosmicznego. +se-spaceship-console=[font=default-bold][color=#f5cb48]Ograniczenie umieszczania: Podłoga statku kosmicznego[/color][/font]\nUżyj, aby przenieść statek kosmiczny między planetami, księżycami, orbitami i polami asteroid. Musi znajdować się w ścianach / drzwiach statku kosmicznego, bez szczelin i dziur. Kontrola integralności uwidacznia problemy. +se-spaceship-console-output=Wysyła sygnały związane z bieżącym statusem statku kosmicznego. Aby uzyskać więcej informacji, zobacz Statki kosmiczne w [img=virtual-signal/informatron] Informatron [__CONTROL__informatron__]. +se-spaceship-gate=[font=default-bold][color=#f5cb48]Ograniczenie umieszczania: Podłoga statku kosmicznego[/color][/font]\nPole siłowe zatrzymuje dekompresję po otwarciu drzwi. Może tworzyć zewnętrzną ścianę statku kosmicznego. +se-spaceship-rocket-engine=[font=default-bold][color=#f5cb48]Ograniczenie umieszczania: Podłoga statku kosmicznego[/color][/font]\nSpala płynne paliwo rakietowe. Może tworzyć zewnętrzną ścianę statku kosmicznego. +se-spaceship-rocket-booster-tank=[font=default-bold][color=#f5cb48]Ograniczenie umieszczania: Podłoga statku kosmicznego[/color][/font]\nPrzechowuje płynne paliwo rakietowe. Wymagane do uruchomienia statku kosmicznego. +se-spaceship-wall=[font=default-bold][color=#f5cb48]Ograniczenie umieszczania: Podłoga statku kosmicznego[/color][/font]\nMoże tworzyć zewnętrzną ścianę statku kosmicznego, ukośne szczeliny przerywają zamknięcie. +beacon=8 gniazd modułów. Przesyła efekty modułów do pobliskich budynków w obrębie 3 pól. Wiele radionadajników wpływających na ten sam podmiot przeciąży go i uniemożliwi działanie. +se-wide-beacon=15 gniazd modułów. Przesyła efekty modułów do pobliskich budynków w obrębie 14 pól. Wiele radionadajników wpływających na ten sam podmiot przeciąży go i uniemożliwi działanie. +se-wide-beacon-2=20 gniazd modułów. Przesyła efekty modułów do pobliskich budynków w obrębie 14 pól. Wiele radionadajników wpływających na ten sam podmiot przeciąży go i uniemożliwi działanie. +kr-singularity-beacon=Kompaktowy radionadajnik o wydajności 100% z krótkim zasięgiem. Przesyła efekty modułów do pobliskich budynków w obrębie 2 pól. Wiele radionadajników wpływających na ten sam podmiot przeciąży go i uniemożliwi działanie. +se-supercharger=Może ładować do 64 robotów jednocześnie z dużą prędkością. Maksymalny pobór mocy przez konstrukcję wynosi 1 GW. +se-addon-power-pole=Mały słup elektryczny przeznaczony do zamocowania na budynkach lub do precyzyjnej kontroli zasięgu elektryczności. +se-pylon=Dystrybuuje energię elektryczną. Zasięg przewodu: 64. +se-pylon-substation=Dystrybuuje energię elektryczną. Zasięg przewodu:64, obszar działania: 64x64. +se-pylon-construction=Dystrybuuje energię elektryczną i rozszerza zasięg konstrukcyjny. Zasięg przewodu: 64, obszar działania: 64x64. +se-pylon-construction-radar=Dystrybuuje energię elektryczną, rozszerza zasięg konstrukcyjny i zapewnia widzenie radarowe. Zasięg: 64, obszar konstrukcyjny i radarowy 256 x 256. +se-shield-projector=Tworzy ochronne pole siłowe. Więcej energii jest potrzebne, gdy projektor się ładuje lub gdy osłona ulega uszkodzeniu. Może blokować pociski strzelane, jeśli zainstalowany jest mod "Walls Block Spitters". +se-big-turbine=[font=default-bold][color=#e4cead]Maksymalna moc:[/color][/font] 1GW.\nDuży generator, który pobiera 5000°C pary. na drugim końcu wytwarza 500°C pary, i wypuszcza wodę po bokach. 99% wydajności energetycznej, 99% oszczędności wody. +se-big-heat-exchanger=Duży wymiennik ciepła przeznaczony do wysokich temperatur i wysokiej wydajności. +se-delivery-cannon=Armata zdolna do strzelania zasobów na orbitę i poza nią. Powoduje uszkodzenie, jeśli nie zostanie bezpiecznie złapany (opancerzona skrzynia), należy zachować ostrożność. +se-delivery-cannon-chest=Opancerzona skrzynia zaprojektowana do bezpiecznego chwytania spadających zasobów o dużej prędkości. Wymaga miejsca w ekwipunku, aby bezpiecznie łapać dostawy. +se-delivery-cannon-weapon=Wielka armata ofensywna zdolna do strzelania wybraną amunicją na orbitę lub dalej. Używaj ostrożnie. +se-spaceship-clamp=Zacisk na statku kosmicznym można zakotwiczyć do zacisku skierowanego w przeciwnym kierunku na powierzchni. Może tworzyć zewnętrzną ścianę statku kosmicznego. +se-spaceship-clamp-place=Zacisk na statku kosmicznym można zakotwiczyć do zacisku skierowanego w przeciwnym kierunku na powierzchni. Może tworzyć zewnętrzną ścianę statku kosmicznego. +se-space-accumulator=Magazynowanie energii o wysokiej gęstości. +se-space-accumulator-2=Magazynowanie energii o wysokiej gęstości. +se-energy-transmitter-emitter=The central building that generates an inter-surface energy beam. Can be used as a weapon or to transfer power to an energy beam receiver. Requires attached energy beam chamber, and connected energy beam injectors. Beam strength is based on the number of injectors. +se-energy-transmitter-chamber=Must be connected to an energy beam emitter. Other chambers can be connected to the end or middle of either side. Energy beam injectors can be connected to the sides only. +se-energy-transmitter-injector=Must be attached to an energy beam chamber and connected to an emitter. Injectors have a fixed power draw, each one increases the energy sent giving more heat to a receiver, or increases the speed and damage of the beam weapon. +se-energy-transmitter-injector-reactor=Must be attached to an energy beam chamber and connected to an emitter. Injectors have a fixed power draw, each one increases the energy sent giving more heat to a receiver, or increases the speed and damage of the beam weapon. +se-energy-receiver=Captures an energy beam as heat. The emitter must be in Energise mode and the target must be on the receiver. +se-energy-beam-defence=Energy beam defence facility. Defends against space-based energy beams and coronal mass ejections. The only requirement to function is energy, the base draw is 10MW but increases based on the strength of attacking beams. Only 1 is needed per surface against Coronal mass ejections, against energy beams weapons 1 Umbrella can defend against up to 500GJ of attacking power. See Energy Beams in [img=virtual-signal/informatron] Informatron for more information [__CONTROL__informatron__] +spidertron=Can be deployed from a cargo rocket if the rocket is not set to a landing pad. +se-nexus=Only functions on a moving spaceship, energy use is proportional to speed. Can gain data from interstellar movement, data generation is based on ship kinetic energy. The Nexus is a designed to act as a distortion drive and with the right technology can enable escape from the local stellar cluster. +se-nexus-charger=Only functions on a moving spaceship, energy use is proportional to speed. Can gain data from interstellar movement, data generation is based on ship kinetic energy. The Nexus is a designed to act as a distortion drive and with the right technology can enable escape from the local stellar cluster. +se-space-probe-rocket-silo=A rocket silo for launching space probes. + +[equipment-name] +energy-shield-equipment=Tarcza energetyczna +energy-shield-mk2-equipment=Tarcza energetyczna MK2 +energy-shield-mk3-equipment=Tarcza energetyczna MK3 +energy-shield-mk4-equipment=Tarcza energetyczna MK4 +energy-shield-mk5-equipment=Tarcza energetyczna MK5 +energy-shield-mk6-equipment=Tarcza energetyczna MK6 +se-adaptive-armour-equipment-1=Pancerz adaptacyjny MK1 +se-adaptive-armour-equipment-2=Pancerz adaptacyjny MK2 +se-adaptive-armour-equipment-3=Pancerz adaptacyjny MK3 +se-adaptive-armour-equipment-4=Pancerz adaptacyjny MK4 +se-adaptive-armour-equipment-5=Pancerz adaptacyjny MK5 +se-rtg-equipment=Przenośny RTG +se-rtg-equipment-2=Przenośny RTG MK2 +se-lifesupport-equipment-1=Sprzęt Podtrzymywania życia MK1 +se-lifesupport-equipment-2=Sprzęt Podtrzymywania życia MK2 +se-lifesupport-equipment-3=Sprzęt Podtrzymywania życia MK3 +se-lifesupport-equipment-4=Sprzęt Podtrzymywania życia MK4 + +[equipment-description] +energy-shield-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +energy-shield-mk2-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +energy-shield-mk3-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +energy-shield-mk4-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +energy-shield-mk5-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +energy-shield-mk6-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +se-adaptive-armour-equipment-1=Pancerz wykorzystujący energię do samonaprawy. Z czasem powoli zwiększa ochronę. +se-adaptive-armour-equipment-2=Pancerz wykorzystujący energię do samonaprawy. Z czasem powoli zwiększa ochronę. +se-adaptive-armour-equipment-3=Pancerz wykorzystujący energię do samonaprawy. Z czasem powoli zwiększa ochronę. +se-adaptive-armour-equipment-4=Pancerz wykorzystujący energię do samonaprawy. Z czasem powoli zwiększa ochronę. +se-adaptive-armour-equipment-5=Pancerz wykorzystujący energię do samonaprawy. Z czasem powoli zwiększa ochronę. +se-rtg-equipment=Radioizotopowy generator termoelektryczny. Przenośny generator, który przekształca ciepło z rozpadu promieniotwórczego w energię elektryczną. Działa przez dziesięciolecia bez dodatkowego paliwa. +se-rtg-equipment-2=Radioizotopowy generator termoelektryczny. Ulepszony przenośny generator, który przekształca ciepło z rozpadu promieniotwórczego w energię elektryczną. Działa przez dziesięciolecia bez dodatkowego paliwa. +se-lifesupport-equipment-1=Zwiększa efektywność podtrzymywania życia o +100% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. +se-lifesupport-equipment-2=Zwiększa efektywność podtrzymywania życia o +200% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. +se-lifesupport-equipment-3=Zwiększa efektywność podtrzymywania życia o +400% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. +se-lifesupport-equipment-4=Zwiększa efektywność podtrzymywania życia o +800% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. + +[fluid-name] +se-antimatter-stream=Strumień antymaterii +se-bio-sludge=Osad biologiczny +se-contaminated-bio-sludge=Zanieczyszczony osad biologiczny +se-contaminated-space-water=Zanieczyszczona kosmiczna woda +se-chemical-gel=Żel chemiczny +se-decompressing-steam=Skondensowana para +se-liquid-rocket-fuel=Płynne paliwo rakietowe +se-methane-gas=Metan +se-methane-gas-mixed=Mieszany gaz metanowy +se-nutrient-gel=Żel odżywczy +se-neural-gel=Żel neuronowy +se-neural-gel-2=Zaawansowany żel neuronowy +se-ion-stream=Strumień jonów +se-plasma-stream=Strumień plazmy +se-particle-stream=Strumień cząstek +se-proton-stream=Strumień protonów +se-space-coolant=Płyn chłodzący 25°C +se-space-coolant-hot=Płyn chłodzący 25°C +se-space-coolant-warm=Chłodny Płyn chłodzący -10°C +se-space-coolant-cold=Zimny Płyn chłodzący -100°C +se-space-coolant-supercooled=Super schłodzony płyn chłodzący -273°C +se-space-water=Kosmiczna woda +se-beryllium-hydroxide=Wodorotlenek berylu +se-cryonite-slush=Breja krionitu + +[fluid-description] +se-space-water=Woda, która nie zamarza pod niskim ciśnieniem, bardziej nadaje się do większości zastosowań kosmicznych. +se-space-coolant=Domyślna temperatura płynu chłodzącego. +se-space-coolant-hot=Domyślna temperatura płynu chłodzącego. +se-space-coolant-warm=Temperatura płynu chłodzącego po schłodzeniu przez chłodnicę. +se-space-coolant-cold=Temperatura płynu chłodzącego po przechłodzeniu. +se-space-coolant-supercooled=Temperatura płynu chłodzącego po hiperchłodzeniu. + +[fuel-category-name] +antimatter=Paliwo antymateriałowe + +[item-group-name] +space=Kosmos +science=Nauka +spaceship=Statek kosmiczny +bob-fluids=Płyny +resources=Zasoby +intermediate-products=Produkcja +combat=Wyposażenie i militaria + +[item-name] +spidertron=Spidertron +core-fragment=Fragment rdzenia (__1__) +effectivity-module-4=Moduł Wydajności 4 +effectivity-module-5=Moduł Wydajności 5 +effectivity-module-6=Moduł Wydajności 6 +effectivity-module-7=Moduł Wydajności 7 +effectivity-module-8=Moduł Wydajności 8 +effectivity-module-9=Moduł Wydajności 9 +glass=Szkło +productivity-module-4=Moduł Produktywności 4 +productivity-module-5=Moduł Produktywności 5 +productivity-module-6=Moduł Produktywności 6 +productivity-module-7=Moduł Produktywności 7 +productivity-module-8=Moduł Produktywności 8 +productivity-module-9=Moduł Produktywności 9 +rocket-fuel=Stałe paliwo rakietowe +sand=Piasek +solid-sand=Przepłukany piasek +washed-sand=Przepłukany piasek +satellite=Nawigacja satelitarna +se-antimatter-canister=Kanister antymaterii +se-astrometric-data=Dane astrometryczne +se-astronomic-catalogue-1=Katalog astronomiczny +se-astronomic-catalogue-2=Szeroki Katalog astronomiczny +se-astronomic-catalogue-3=Kompleksowy Katalog astronomiczny +se-astronomic-catalogue-4=Rozszerzony Katalog astronomiczny +se-astronomic-insight=Wgląd astronomiczny +se-astronomic-science-pack-1=Astronomiczny Pakiet naukowy 1 +se-astronomic-science-pack-2=Astronomiczny Pakiet naukowy 2 +se-astronomic-science-pack-3=Astronomiczny Pakiet naukowy 3 +se-astronomic-science-pack-4=Astronomiczny Pakiet naukowy 4 +se-atomic-data=Dane atomowe +se-beryllium-ore=Beryl +se-ballistic-shielding-data=Dane osłony balistycznej +se-beryllium-ore-crushed=Kruszony beryl +se-beryllium-ore-washed=Umyty beryl +se-beryllium-plate=Płytka berylu +se-beryllium-powder=Proszek berylu +se-beryllium-ingot=Sztabka berylu +se-beryllium-sulfate=Siarczan berylu +se-bio-combustion-data=Dane spalania biologicznego +se-bio-combustion-resistance-data=Dane odporności na spalanie biologiczne +se-bio-spectral-data=Dane bio-spektralne +se-biochemical-data=Dane biochemiczne +se-biochemical-resistance-data=Dane dotyczące oporności biochemicznej +se-bioculture=Bio-kultura +se-bioelectrics-data=Dane bioelektryczne +se-biological-catalogue-1=Katalog biologiczny +se-biological-catalogue-2=Szeroki Katalog biologiczny +se-biological-catalogue-3=Kompleksowy Katalog biologiczny +se-biological-catalogue-4=Rozszerzony Katalog biologiczny +se-biological-insight=Wgląd biologiczny +se-biological-science-pack-1=Biologiczny Pakiet naukowy 1 +se-biological-science-pack-2=Biologiczny Pakiet naukowy 2 +se-biological-science-pack-3=Biologiczny Pakiet naukowy 3 +se-biological-science-pack-4=Biologiczny Pakiet naukowy 4 +se-biomechanical-data=Dane biomechaniczne +se-biomechanical-resistance-data=Dane oporności biomechanicznej +se-boson-data=Dane Boson +se-broken-data=Uszkodzona karta danych +se-canister=Bezpieczny kanister +se-biogun=Broń Biologiczna +se-bloater-ammo=Amunicja Wybuchowego wzdęcia +se-pheromone-ammo=Strzałka feromonowa +se-cryogun=Broń Lodowa +se-cryogun-ammo=Lodowa Amunicja +se-rocket-launch-pad-silo-dummy-ingredient-item=Rakieta transportowa (Ukryte składnik) +se-rocket-launch-pad-silo-dummy-result-item=Rakieta transportowa (Ukryty wynik) +se-cargo-rocket-cargo-pod=Luk ładunkowy +se-cargo-rocket-fuel-tank=Rakietowy zbiornik paliwa +se-cargo-rocket-section=Sekcja rakiety transportowej +se-cargo-rocket-section-packed=Spakowana Sekcja rakiety transportowej +se-cold-thermodynamics-data=Zimne Dane termodynamiczne +se-comparative-genetic-data=Porównawcze dane genetyczne +se-compressive-strength-data=Dane wytrzymałości na ściskanie +se-conductivity-data=Dane przewodnictwa +se-contaminated-scrap=Zanieczyszczony Złom +se-core-fragment-omni=Fragment rdzenia +se-corrosion-resistance-data=Dane odporności na korozję +se-cryogenics-data=Dane kriogeniczne +se-cryonite=Krionit +se-cryonite-crushed=Kruszony Krionit +se-cryonite-washed=Umyty Krionit +se-cryonite-rod=Pręt Krionitu +se-cryonite-ion-exchange-beads=Krionitowe koraliki jonowymienne +se-dark-energy-data=Dane ciemnej energii +se-darkmatter-data=Dane ciemnej materii +se-data-storage-substrate-cleaned=Polerowana pamięć masowa danych +se-data-storage-substrate=Szorstka pamięć masowa danych +se-decompression-data=Dane dekompresyjne +se-decompression-resistance-data=Dane o rezystancji dekompresyjnej +se-universal-catalogue=Katalog uniwersalny +se-deep-space-science-pack=Pakiet naukowy dalekiego kosmosu +se-deep-space-science-pack-1=Pakiet naukowy dalekiego kosmosu 1 +se-deep-space-science-pack-2=Pakiet naukowy dalekiego kosmosu 2 +se-deep-space-science-pack-3=Pakiet naukowy dalekiego kosmosu 3 +se-deep-space-science-pack-4=Pakiet naukowy dalekiego kosmosu 4 +se-doppler-shift-data=Dane przesunięcia dopplerowskiego +se-durability-data=Dane trwałości +se-electrical-shielding-data=Dane ochrony elektrycznej +se-electromagnetic-field-data=Dane pola elektromagnetycznego +se-empty-data=Pusta karta danych +se-empty-lifesupport-canister=Pusty pojemnik Podtrzymywania życia +se-energy-catalogue-1=Katalog energii +se-energy-catalogue-2=Szeroki katalog energii +se-energy-catalogue-3=Kompleksowy katalog energii +se-energy-catalogue-4=Rozszerzony katalog energii +se-energy-insight=Wgląd w energię +se-energy-science-pack-1=Energetyczny Pakiet naukowy 1 +se-energy-science-pack-2=Energetyczny Pakiet naukowy 2 +se-energy-science-pack-3=Energetyczny Pakiet naukowy 3 +se-energy-science-pack-4=Energetyczny Pakiet naukowy 4 +se-entanglement-data=Dane splątania +se-enriched-naquium=Wzbogacony Naquium +se-exotic-fission-data=Egzotyczne dane rozszczepienia +se-exotic-singularity-data=Dane osobliwości +se-explosion-shielding-data=Dane ochrony przeciwwybuchowej +se-experimental-alloys-data=Dane stopów eksperymentalnych +se-experimental-biochemical-data=Eksperymentalne dane biochemiczne +se-experimental-bioculture=Eksperymentalna biokultura +se-experimental-genetic-data=Eksperymentalne dane genetyczne +se-experimental-material-decay-data=Dane rozpadu materiału eksperymentalnego +se-experimental-material-spectral-data=Dane spektralne materiału eksperymentalnego +se-experimental-material=Prototyp materiału eksperymentalnego +se-experimental-specimen=Biomasa eksperymentalna +se-experimental-superconductor=Prototyp nadprzewodnika +se-forcefield-data=Dane Pola siłowego +se-friction-data=Dane tarcia +se-fusion-test-data=Testowe Dane fuzji +se-gammaray-detector=Detektor promieniowania gamma +se-gammaray-observation-data=Dane z obserwacji promieniowania gamma +se-gammaray-test-data=Dane promieniowania gamma +se-gate-fragment=Fragment artefaktu +se-genetic-data=Dane genetyczne +se-gravity-wave-observation-data=Dane obserwacyjne fali grawitacyjnej +se-gravity-wave-data=Dane fal grawitacyjnych +se-gravimetric-observation-data=Dane z obserwacji grawimetrycznej +se-gravimetric-test-data=Testowe Dane grawimetryczne +se-gravitational-lensing-data=Dane soczewek grawitacyjnych +se-heat-shielding=Osłona termiczna +se-holmium-ore=Ruda Holmu +se-holmium-ore-crushed=Kruszony holm +se-holmium-ore-washed=Umyty holm +se-holmium-powder=Proszek holmu +se-holmium-plate=Płytka holmu +se-holmium-ingot=Sztabka holmu +se-hot-thermodynamics-data=Gorące Dane termodynamiczne +se-impact-shielding-data=Dane ochrony przed uderzeniami +se-infrared-observation-data=Dane z obserwacji w podczerwieni +se-ion-spectrometry-data=Dane spektrometrii jonowej +se-iridium-ore=Iryd +se-iridium-ore-crushed=Kruszony Iryd +se-iridium-ore-washed=Umyty Iryd +se-iridium-piledriver=Kafar Irydowy +se-iridium-powder=Proszek Irydu +se-iridium-plate=Płytka Irydu +se-iridium-ingot=Sztabka Irydu +se-junk-data=Zużyta Karta danych +se-laser-shielding-data=Dane osłony laserowej +se-lepton-data=Dane leptonu +se-lifesupport-canister=Kanister Podtrzymywania życia +se-machine-learning-data=Dane uczenia maszynowego +se-magnetic-canister=Kanister magnetyczny +se-magnetic-monopole-data=Dane magnetycznego monopolu +se-material-decay-data=Dane rozpadu materiału +se-material-science-pack-1=Materiałowy Pakiet naukowy 1 +se-material-science-pack-2=Materiałowy Pakiet naukowy 2 +se-material-science-pack-3=Materiałowy Pakiet naukowy 3 +se-material-science-pack-4=Materiałowy Pakiet naukowy 4 +se-material-spectral-data=Dane spektralne materiału +se-material-testing-pack=Pakiet badań materiałowych +se-material-catalogue-1=Katalog materiałów +se-material-catalogue-2=Szeroki Katalog materiałów +se-material-catalogue-3=Kompleksowe Katalog materiałów +se-material-catalogue-4=Rozszerzony Katalog materiałów +se-material-insight=Wgląd w materiały +se-medpack=Apteczka +se-medpack-2=Apteczka 2 +se-medpack-3=Apteczka 3 +se-medpack-4=Apteczka 4 +se-meteor-defence=Działo Obronne przed meteorami +se-meteor-defence-ammo=Amunicja do Działa Obronnego przed meteorami +se-meteor-point-defence=Punktowe Działo Obronne przed meteorami +se-meteor-point-defence-ammo=Amunicja do punktowej obrony meteorytowej +se-methane-ice=Lód metanowy +se-micro-black-hole-data=Mikro Dane czarnej dziury +se-microwave-observation-data=Dane z obserwacji mikrofalowej +se-negative-pressure-data=Dane o ujemnym ciśnieniu +se-nano-cold-thermodynamics-data=Nanomaterialne dane zimnej termodynamiki +se-nano-compressive-strength-data=Nanomaterialne Dane wytrzymałości ściskania +se-nano-hot-thermodynamics-data=Nanomaterialne dane gorącej termodynamiki +se-nanomaterial=Nanomateriał +se-nano-tensile-strength-data=Nanomateriałowe dane wytrzymałości na rozciąganie +se-naquium-ore=Naquitite +se-naquium-ore-crushed=Kruszony naquitite +se-naquium-ore-washed=Umyty naquitite +se-naquium-powder=Proszek Naquium +se-naquium-plate=Płytka Naquium +se-naquium-ingot=Sztabka Naquium +se-neural-anomaly-data=Dane anomalii neuronowych +se-nutrient-vat=Kubełek składników odżywczych +se-observation-frame-blank=Pusta ramka obserwacyjna +se-observation-frame-gammaray=Ramka obserwacyjna promieniowania gamma +se-observation-frame-infrared=Ramka obserwacyjna w podczerwieni +se-observation-frame-microwave=Mikrofalowa rama obserwacyjna +se-observation-frame-radio=Ramka obserwacyjna fal radiowych +se-observation-frame-uv=Ramka obserwacyjna UV +se-observation-frame-visible=Widoczna ramka obserwacyjna +se-observation-frame-xray=Ramka obserwacyjna Xray +se-orbital-data=Dane obliczeń orbitalnych +se-particle-beam-shielding-data=Dane ochrony wiązki cząstek +se-plague-bomb=Rakieta zarazy +se-plasma-canister=Kanister plazmowy +se-plasma-electrodynamics-data=Dane elektrodynamiki plazmy +se-plasma-thermodynamics-data=Dane termodynamiki plazmy +se-polarisation-data=Dane polaryzacyjne +se-pressure-containment-data=Dane dotyczące ograniczenia ciśnienia +se-quantum-phenomenon-data=Dane zjawisk kwantowych +se-quark-data=Dane kwarku +se-radiation-data=Dane dotyczące promieniowania +se-radiation-exposure-data=Dane dotyczące narażenia na promieniowanie +se-radiation-exposure-resistance-data=Dane o odporności na promieniowanie +se-radiation-shielding-data=Dane osłony przed promieniowaniem +se-radio-observation-data=Dane obserwacyjne fal radiowych +se-rigidity-data=Dane sztywności +se-rtg-equipment=Przenośny RTG +se-rtg-equipment-2=Przenośny RTG MK2 +se-scrap=Złom +se-shear-strength-data=Dane wytrzymałości ścinania +se-significant-data=Istotne dane +se-significant-specimen=Istotna biomasa +se-singularity-data=Dane osobliwości +se-space-capsule=Kapsuła kosmiczna +se-space-mirror=Lustro wielospektralne +se-space-platform-plating=Poszycie platformy kosmicznej +se-space-platform-scaffold=Rusztowanie platformy kosmicznej +se-space-rail=Kolej kosmiczna +se-spaceship-floor=Podłoga statku kosmicznego +se-specimen=Biomasa +se-subatomic-data=Dane subatomowe +se-superconductivity-data=Dane nadprzewodnictwa +se-superconductor=Nadprzewodnik +se-superconductive-cable=Kabel nadprzewodzący +se-tensile-strength-data=Dane wytrzymałości na rozciąganie +se-tesla-ammo=Amunicja dla Tesli +se-tesla-gun=Tesla +se-thruster-suit=Skafander kosmiczny +se-thruster-suit-2=Skafander kosmiczny MK2 +se-thruster-suit-3=Skafander kosmiczny MK3 +se-thruster-suit-4=Skafander kosmiczny MK4 +se-timespace-anomaly-data=Dane anomalii przestrzeni czasowych +se-used-lifesupport-canister=Używany pojemnik Podtrzymywania życia +se-uv-observation-data=Dane z obserwacji UV +se-visible-observation-data=Widoczne dane obserwacyjne +se-vitamelange=Mech +se-vitamelange-nugget=Gąbka Witaminowa +se-vitamelange-roast=Pieczona Gąbka Witaminowa +se-vitamelange-spice=Przyprawa Witaminowa +se-vitamelange-extract=Ekstrakt Witaminowy +se-vulcanite=Wulkanit +se-vulcanite-crushed=Kruszony wulkanit +se-vulcanite-washed=Umyty wulkanit +se-vulcanite-block=Blok wulkanizatu +se-vulcanite-ion-exchange-beads=Kationnowe koraliki jonowymienne +se-water-ice=Lód wodny +se-xray-observation-data=Dane obserwacyjne Xray +se-zero-point-energy-data=Dane dotyczące energii punktu zerowego +se-rocket-science-pack=Rakietowy Pakiet naukowy +space-science-pack=Kosmiczny Pakiet naukowy +speed-module-4=Moduł prędkości 4 +speed-module-5=Moduł prędkości 5 +speed-module-6=Moduł prędkości 6 +speed-module-7=Moduł prędkości 7 +speed-module-8=Moduł prędkości 8 +speed-module-9=Moduł prędkości 9 +se-aeroframe-pole=Solidny pręt +se-aeroframe-scaffold=Solidny rama +se-aeroframe-bulkhead=Solidna ścianka +se-lattice-pressure-vessel=Zbiornik ciśnieniowy +se-heavy-girder=Ciężki dźwigar +se-heavy-bearing=Ciężkie łożysko +se-heavy-composite=Ciężki kompozyt +se-heavy-assembly=Ciężki Zestaw +se-bioscrubber=Płuczka Biologiczna +se-vitalic-epoxy=Żywica epoksydowa +se-vitalic-reagent=Odczynnik witalny +se-vitalic-acid=Kwas witalny +se-self-sealing-gel=Żel samouszczelniający +se-holmium-cable=Kabel holmu +se-holmium-solenoid=Elektromagnes holmu +se-quantum-processor=Procesor kwantowy +se-dynamic-emitter=Emiter dynamiczny +se-naquium-processor=Procesor Naquium +se-naquium-cube=Kostka Naquium +se-naquium-tessaract=Hiperszcześcian Naquium +se-wide-beacon=Wielki Radionadajnik +se-wide-beacon-2=Wielki Radionadajnik 2 +se-lifesupport-equipment-1=Sprzęt Podtrzymywania życia MK1 +se-lifesupport-equipment-2=Sprzęt Podtrzymywania życia MK2 +se-lifesupport-equipment-3=Sprzęt Podtrzymywania życia MK3 +se-lifesupport-equipment-4=Sprzęt Podtrzymywania życia MK4 +se-naquium-heat-pipe=Ciepłowód z Naquium +se-naquium-heat-pipe-horizontal=Poziomy Ciepłowód z Naquium +se-naquium-heat-pipe-vertical=Pionowy Ciepłowód z Naquium +se-naquium-heat-pipe-long=Długi Ciepłowód z Naquium __1__ +se-deep-space-transport-belt=Kosmiczny taśmociąg +se-deep-space-transport-belt-black=Czarny kosmiczny taśmociąg +se-deep-space-transport-belt-white=Biały kosmiczny taśmociąg +se-deep-space-transport-belt-red=Czerwony kosmiczny taśmociąg +se-deep-space-transport-belt-yellow=Żółty kosmiczny taśmociąg +se-deep-space-transport-belt-green=Zielony kosmiczny taśmociąg +se-deep-space-transport-belt-cyan=Błękitny kosmiczny taśmociąg +se-deep-space-transport-belt-blue=Niebieski kosmiczny taśmociąg +se-deep-space-transport-belt-magenta=Purpurowy kosmiczny taśmociąg +se-deep-space-underground-belt=Kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-black=Czarny kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-white=Biały kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-red=Czerwony kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-yellow=Żółty kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-green=Zielony kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-cyan=Błękitny kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-blue=Niebieski kosmiczny podziemny taśmociąg +se-deep-space-underground-belt-magenta=Purpurowy kosmiczny podziemny taśmociąg +se-deep-space-splitter=Kosmiczny rozdzielacz +se-deep-space-splitter-black=Czarny kosmiczny rozdzielacz +se-deep-space-splitter-white=Biały kosmiczny rozdzielacz +se-deep-space-splitter-red=Czerwony kosmiczny rozdzielacz +se-deep-space-splitter-yellow=Żółty kosmiczny rozdzielacz +se-deep-space-splitter-green=Zielony kosmiczny rozdzielacz +se-deep-space-splitter-cyan=Błękitny kosmiczny rozdzielacz +se-deep-space-splitter-blue=Niebieski kosmiczny rozdzielacz +se-deep-space-splitter-magenta=Purpurowy kosmiczny rozdzielacz +se-blueprint-registration-point=Punkt odniesienia schematu konstrukcyjnego +se-delivery-cannon-capsule=Kapsuła armaty dostawczej +se-delivery-cannon-capsule-packed=Kapsuła armaty dostawczej: __1__ +se-delivery-cannon-targeter=Celownik armaty dostawczej +se-delivery-cannon-weapon-capsule=Kapsuła armaty ofensywnej +se-delivery-cannon-weapon-capsule-packed=Kapsuła armaty ofensywnej: __1__ +se-delivery-cannon-weapon-targeter=Celownik armaty ofensywnej +se-energy-transmitter-targeter=Celownik wiązki energii +se-arcosphere=Kryształ przestrzeni +se-arcosphere-a=λ Kryształ przestrzeni Lambda +se-arcosphere-b=ξ Kryształ przestrzeni Xi +se-arcosphere-c=ζ Kryształ przestrzeni Zeta +se-arcosphere-d=θ Kryształ przestrzeni Theta +se-arcosphere-e=ε Kryształ przestrzeni Epsilon +se-arcosphere-f=φ Kryształ przestrzeni Phi +se-arcosphere-g=γ Kryształ przestrzeni Gamma +se-arcosphere-h=ω Kryształ przestrzeni Omega +se-arcosphere-collector=Wyłapywacz kryształów przestrzeni +se-star-probe=Sonda gwiazdowa +se-belt-probe=Sonda pasa asteroid +se-void-probe=Sonda próżni międzygwiezdnej +se-star-probe-data=Dane z sondy gwiazdowej +se-belt-probe-data=Dane z sondy pasa asteroid +se-void-probe-data=Dane z sondy próżni międzygwiezdnej +se-nano-engineering-data=Dane nanoinżynieryjne +se-annihilation-data=Dane anihililacji +se-naquium-structural-data=Dane struktury Naquium +se-hyperlattice-data=Dane hyperkraty +se-naquium-energy-data=Dane energetyczne Naquium +se-space-fold-data=Dane zwijania przestrzeni +se-space-warp-data=Dane wykrzywiania przestrzeni +se-space-dialation-data=Dane rozszerzania przestrzeni +se-space-injection-data=Dane orbitowania przestrzeni +se-interstellar-data=Dane podróży międzygwiezdnych +se-teleportation-data=Dane teleportacji +se-wormhole-data=Dane czarnej dziury +se-rhga-data=Dane analizy hipergrafu +se-deep-catalogue-1=Katalog dalekiego kosmosu +se-deep-catalogue-2=Szeroki Katalog dalekiego kosmosu +se-deep-catalogue-3=Kompleksowy Katalog dalekiego kosmosu +se-deep-catalogue-4=Rozszerzony Katalog dalekiego kosmosu +se-space-probe-rocket=Rakieta sond kosmicznych +se-space-probe-rocket-deployed=Rakieta sond kosmicznych (wystrzelona) + +[item-description] +automation-science-pack=Używany przez podstawowe laboratoria naukowe do badań. +chemical-science-pack=Używany przez podstawowe laboratoria naukowe do badań. +logistic-science-pack=Używany przez podstawowe laboratoria naukowe do badań. +military-science-pack=Używany przez podstawowe laboratoria naukowe do badań. +production-science-pack=Używany przez podstawowe laboratoria naukowe do badań. +satellite=Satelitę należy umieścić w silosie rakiet satelitarnych. +se-antimatter-canister=Najgęstsza forma energii w bezpiecznym do przenoszenia pojemniku. +se-astronomic-science-pack-1=Używany przez laboratoria kosmiczne do badań. +se-astronomic-science-pack-2=Używany przez laboratoria kosmiczne do badań. +se-astronomic-science-pack-3=Używany przez laboratoria kosmiczne do badań. +se-astronomic-science-pack-4=Używany przez laboratoria kosmiczne do badań. +se-beryllium-ore=Ruda Berylu +se-biological-science-pack-1=Używany przez laboratoria kosmiczne do badań. +se-biological-science-pack-2=Używany przez laboratoria kosmiczne do badań. +se-biological-science-pack-3=Używany przez laboratoria kosmiczne do badań. +se-biological-science-pack-4=Używany przez laboratoria kosmiczne do badań. +se-canister=Wielofunkcyjne naczynie do przechowywania +se-cargo-rocket-cargo-pod=Element rakiety transportowej. +se-cargo-rocket-fuel-tank=Element rakiety transportowej. +se-cargo-rocket-section=Kluczowy element rakiety transportowej. Włóż do silosu. Wymagane 100 na rakietę. Można go odzyskać z lądowań rakiet (20% bazowej zdolności do odzyskania). +se-cargo-rocket-section-packed=Sekcje rakiet transportowych pakowane do transportu. Muszą być rozpakowane do użycia w konstrukcji rakiety. +se-bloater-ammo=Tworzy zakaźną kałużę osadu biologicznego na ziemi. Zainfekowani wrogowie puchną, utrudniając im ruch i powodując z czasem obrażenia. Jeśli umrą w stanie rozdętym, pękają, a rozpryskujące się wnętrzności zadają obrażenia pobliskim wrogom, potencjalnie powodując kaskadę. Całkowite obrażenia pocisków wynoszą 50% ich maksymalnego zdrowia. +se-pheromone-ammo=Myli wroga sprawiając że myślą że jesteś przyjazny, a ich krewni są wrogiem. +se-cryogun=Zrób ścianę lodu, która może zamrozić wrogów. +se-deep-space-science-pack=Używany przez laboratoria kosmiczne do badań. +se-energy-science-pack-1=Używany przez laboratoria kosmiczne do badań. +se-energy-science-pack-2=Używany przez laboratoria kosmiczne do badań. +se-energy-science-pack-3=Używany przez laboratoria kosmiczne do badań. +se-energy-science-pack-4=Używany przez laboratoria kosmiczne do badań. +se-heat-shielding=Panel kompozytowy stosowany do zastosowań w wysokich temperaturach i strukturach kosmicznych. +se-holmium-ore=Ruda Holmu +se-iridium-ore=Ruda Irydu +se-material-science-pack-1=Używany przez laboratoria kosmiczne do badań. +se-material-science-pack-2=Używany przez laboratoria kosmiczne do badań. +se-material-science-pack-3=Używany przez laboratoria kosmiczne do badań. +se-material-science-pack-4=Używany przez laboratoria kosmiczne do badań. +se-medpack=Użyj by się wyleczyć. +se-medpack-2=Użyj by się wyleczyć. +se-medpack-3=Użyj by się wyleczyć. +se-medpack-4=Użyj by się wyleczyć. +se-meteor-defence=Może chronić całą planetę przed meteorami, ale może zestrzelić tylko 1 meteor na raz. Musi być załadowany amunicją do obrony przed meteorami i naładowany do strzału. 80% celności. Po wystrzeleniu musi się naładować. Podczas ładowania pobiera 20 MW. +se-meteor-defence-ammo=Niszczy meteoryty. Musi być załadowany do instalacji obrony przed meteorami. +se-meteor-point-defence=Chroni obszar przed meteorami. Potrafi zestrzelić do 4 meteorów na salwę. Musi być załadowany amunicją do obrony przed meteorami i naładowany do strzału. Zasięg 64 pól, 50% celności, ładowanie wymaga czasu po wystrzale. Obróć obiekt, aby zmienić tryb ładowania. +se-meteor-point-defence-container=Niszczy meteoryty. Musi być załadowany. +se-naquium-ore=Ruda Naquium. Znaleźć można tylko w kosmosie, skarb międzygwiezdnej pustki. +se-rocket-launch-pad-silo-dummy-ingredient-item=Wykonany przez włożenie 100 sekcji rakiety transportowej i 1 Kosmicznej kapsuły do Silosu rakiet transportowych. +se-rtg-equipment=Radioizotopowy generator termoelektryczny. Przenośny generator, który przekształca ciepło z rozpadu promieniotwórczego w energię elektryczną. Działa przez dziesięciolecia bez dodatkowego paliwa. +se-rtg-equipment-2=Radioizotopowy generator termoelektryczny. Ulepszony przenośny generator, który przekształca ciepło z rozpadu promieniotwórczego w energię elektryczną. Działa przez dziesięciolecia bez dodatkowego paliwa. +se-plague-bomb=Może zgasić całe życie z planety. Obchodzić się ze szczególną ostrożnością. (Może znacznie spaść FPS/UPS, ponieważ wszystko stopniowo umiera, nie zalecane dla dużych planet lub multiplayer.) +se-space-capsule=Kapsuła kontrolna wymagana do rakiet transportowych. Może być wykorzystana do zabrania pasażerów z powrotem na powierzchnię najbliższej planety. Wejdź do kapsuły za pomocą __CONTROL__toggle-driving__. +se-space-platform-plating=[font=default-bold][color=#f5cb48]Ograniczenie umieszczania: Kosmos[/color][/font]\nZaawansowane poszycie, które umożliwia szybki ruch na platformie kosmicznej. +se-space-platform-scaffold=[font=default-bold][color=#f5cb48]Ograniczenie umieszczania: Kosmos[/color][/font]\nPodstawowe rusztowanie platformy kosmicznej, które pozwala umieścić pewne struktury w kosmosie. +se-space-rail=Szyny, których można bezpiecznie używać w kosmosie, ponieważ zapobiegają wypadaniu pociągu z torów i niszczeniu wszystkiego wokół. Mogą być również stosowane na lądzie ze względów estetycznych. +se-spaceship-floor=Ta podłoga musi znajdować się pod wszystkimi częściami statku kosmicznego, a ściany statku kosmicznego znajdują się na zewnętrznej krawędzi. Wszelkie szczeliny w podłodze spowodują uszkodzenie hermetyczne, te sekcje mogą się oderwać. +se-superconductive-cable=Nadprzewodzący kabel kompozytowy, który nie wymaga aktywnego chłodzenia. +se-tesla-gun=Szybkostrzelająca broń błyskawicami +se-thruster-suit=Skafander kosmiczny niezbędny do przetrwania w kosmosie. \nMa silniki odrzutowe oraz buty magnetyczne. +se-thruster-suit-2=Skafander kosmiczny niezbędny do przetrwania w kosmosie. \nMa silniejsze silniki, większy ekwipunek i większą siatkę. +se-thruster-suit-3=Skafander kosmiczny niezbędny do przetrwania w kosmosie. \nMa silniejsze silniki, większy ekwipunek i większą siatkę. +se-thruster-suit-4=Skafander kosmiczny niezbędny do przetrwania w kosmosie. \nMa silniejsze silniki, większy ekwipunek i większą siatkę. +space-science-pack=Służy do ulepszania wielu istniejących przedmiotów. +se-rocket-science-pack=Używany przez laboratoria kosmiczne do badań. Musi być wytworzony w kosmosie. +utility-science-pack=Używany przez podstawowe laboratoria naukowe do badań. +beacon=8 gniazd modułów. Przesyła efekty modułów do pobliskich budynków w obrębie 3 pól. Wiele radionadajników wpływających na ten sam podmiot przeciąży go i uniemożliwi działanie. +se-wide-beacon=15 gniazd modułów. Przesyła efekty modułów do pobliskich budynków w obrębie 14 pól. Wiele radionadajników wpływających na ten sam podmiot przeciąży go i uniemożliwi działanie. +se-wide-beacon-2=20 gniazd modułów. Przesyła efekty modułów do pobliskich budynków w obrębie 14 pól. Wiele radionadajników wpływających na ten sam podmiot przeciąży go i uniemożliwi działanie. +se-lifesupport-equipment-1=Zwiększa efektywność podtrzymywania życia o +100% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. +se-lifesupport-equipment-2=Zwiększa efektywność podtrzymywania życia o +200% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. +se-lifesupport-equipment-3=Zwiększa efektywność podtrzymywania życia o +400% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. +se-lifesupport-equipment-4=Zwiększa efektywność podtrzymywania życia o +800% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. +se-delivery-cannon=Umożliwia dokładną dostawę zawartych zasobów za pomocą armaty dostawczej. +se-delivery-cannon-weapon=Umożliwia dokładne strzelanie z wybranych broni za pomocą armaty ofensywnej. +se-arcosphere=Earnded from Arcosphere research, redeemed via Informatron. +se-deep-catalogue-1=Naquium i nanoinżynieria. +se-deep-catalogue-2=Struktura hyperkraty, osobliwość i anihilacja. +se-deep-catalogue-3=Mikrowygięcia przestrzeni i wielowymiarowa nanoinżynieria. +se-deep-catalogue-4=Makrowygięcia przestrzeni i wielowymiarowe podróże. +se-arcosphere-collector=Wyłapuje krysztaly przestrzeni z próżni międzygwiezdnej. Musi być wystrzelona z silosa rakiet wynoszących sondy umieszczonego na polu asteroid. Wyłapywanie jest trudniejsze, im więcej już ich wyłapano. +se-star-probe=Zbiera dane gwiazdowe i zwraca [img=item/se-star-probe-data] Dane z sondy gwiazdowej. Musi być wystrzelona z silosa rakiet wynoszących sondy umieszczonego na orbicie gwiazdy. +se-belt-probe=Zbiera dane pasa asteroid i zwraca [img=item/se-belt-probe-data] Dane z sondy pasa asteroid. Musi być wystrzelona z silosa rakiet wynoszących sondy umieszczonego na pasie asteroid. +se-void-probe=Zbiera dane próżni międzygwiazdnej i zwraca [img=item/se-void-probe-data] Dane z sondy próżni międzygwiezdnej. Musi być wystrzelona z silosa rakiet wynoszących sondy umieszczonego na polu asteroid. + +[recipe-name] +core-fragment=Fragment rdzenia (__1__) +rocket-fuel=Stałe paliwo rakietowe +se-astrometric-analysis-multispectral-1=Wielospektralna analiza astrometryczna 1 +se-astrometric-analysis-multispectral-2=Wielospektralna analiza astrometryczna 2 +se-astrometric-analysis-multispectral-3=Wielospektralna analiza astrometryczna 3 +se-astronomic-insight-1=Wgląd astronomiczny +se-astronomic-insight-2=Szeroki Wgląd astronomiczny +se-astronomic-insight-3=Kompleksowy Wgląd astronomiczny +se-astronomic-insight-4=Rozszerzony Wgląd astronomiczny +se-biological-insight-1=Wgląd biologiczny +se-biological-insight-2=Szeroki Wgląd biologiczny +se-biological-insight-3=Kompleksowy Wgląd biologiczny +se-biological-insight-4=Rozszerzony Wgląd biologiczny +se-bio-methane-to-crude-oil=Bio przetwarzanie metanu na ropę naftową +se-bio-sludge-crude-oil=Osad biologiczny z eksperymentalnej biomasy +se-bio-sludge-decontamination=Odkażanie osadu biologicznego +se-bio-sludge-from-fish=Osad biologiczny z ryb +se-bio-sludge-from-wood=Osad biologiczny z drewna +se-bio-sludge-from-vitamelange=Osad biologiczny ze Skamieliny odżywczej +se-bio-sludge=Osad biologiczny z biomasy +se-broken-data-scrapping=Złomowanie uszkodzonych kart danych +se-cargo-rocket-section-pack=Spakowania Sekcja rakiety transportowej +se-cargo-rocket-section-unpack=Rozpakowywania Sekcja rakiety transportowej +se-condenser-turbine-reclaim-water=Wytwarzanie energii z odzyskiwaniem wody. +se-core-fragment-omni=Przetwarzanie fragmentów rdzenia +se-core-mining=Wydobycie Rdzenia +se-empty-antimatter-canister=Pusty kanister antymaterii +se-empty-barrel-scrapping=Złomowanie pustych beczek +se-empty-barrel-reprocessing=Demontowanie pustych beczek +se-space-capsule-scrapping=Złomowanie kapsuły kosmicznej +se-cargo-pod-scrapping=Złomowanie luku ładunkowego +se-energy-insight-1=Wgląd w energię +se-energy-insight-2=Szeroki Wgląd w energię +se-energy-insight-3=Kompleksowy Wgląd w energię +se-energy-insight-4=Rozszerzony Wgląd w energię +se-formatting-1=Formatowanie danych +se-formatting-2=Wydajne Formatowanie danych +se-formatting-3=Zaawansowane Formatowanie danych +se-formatting-4=Formatowanie danych Dalekiego kosmosu +se-material-insight-1=Wgląd w materiały +se-material-insight-2=Szeroki wgląd w materiały +se-material-insight-3=Kompleksowy wgląd w materiały +se-material-insight-4=Rozszerzony wgląd w materiały +se-matter-fusion-copper=Fuzja materii (Miedź) +se-matter-fusion-dirty=Fuzja materii (Złom) +se-matter-fusion-iron=Fuzja materii (Żelazo) +se-matter-fusion-stone=Fuzja materii (Kamień) +se-matter-fusion-uranium=Fuzja materii (Uran) +se-matter-fusion-to=Fuzja materii (__1__) +se-orbital-data=Dane obliczeń orbitalnych +se-plasma-canister-empty=Pusty pojemnik na plazmę +se-pulverised-sand=Sproszkowany piasek +se-radiating-space-coolant-fast=Szybkie schładzanie płynu chłodzącego do -10°C (chłodny) +se-radiating-space-coolant-normal=Schładzanie płynu chłodzącego do -10°C (chłodny) +se-radiating-space-coolant-slow=Oszczędne schładzanie płynu chłodzącego do -10°C (chłodny) +se-mixed-methane-gas-separation=Oddzielanie gazu metanowego z mieszanki +se-rocket-fuel-from-water-copper=Paliwo rakietowe z wody +se-scrap-decontamination=Odkażanie złomu +se-scrap-recycling=Recykling złomu +se-space-coolant-cold=Hiper chłodzenie płynu chłodzącego do -100°C (zimny) +se-space-coolant-supercooled=Hiper chłodzenie płynu chłodzącego do -273°C (super schłodzony) +se-space-coolant-supercooled-cryonite=Krionitowe chłodzenie płynu chłodzącego do -273°C (super schłodzony) +se-space-coolant-cold-cryonite=Krionitowe chłodzenie płynu chłodzącego do -100°C (zimny) +se-space-coolant-supercoole-cryonite=Krionitowe chłodzenie płynu chłodzącego do -273°C (super schłodzony) +se-simulation-a=Symulacja astronomiczna +se-simulation-ab=Symulacja panspermii +se-simulation-abm=Symulacja ksenoprogresji +se-simulation-am=Symulacja astromateriału +se-simulation-as=Symulacja astrocząstek +se-simulation-asb=Symulacja astrobioniczna +se-simulation-asbm=Symulacja uniwersalna +se-simulation-asm=Symulacja astrofizyki +se-simulation-b=Symulacja biologiczna +se-simulation-bm=Symulacja biomechaniczna +se-simulation-m=Symulacja materiału +se-simulation-s=Symulacja energetyczna +se-simulation-sb=Symulacja biochemiczna +se-simulation-sbm=Symulacja nanitów +se-simulation-sm=Symulacja nanomateriałów +se-space-water-decontamination=Kosmiczne odkażanie wody +se-spaceship-rocket-engine-burn=Spal płynne paliwo rakietowe +se-specimen-fish=Mikrograwitacji wzrost ryb +se-specimen-wood=Mikrograwitacji wzrost drewna +se-thermodynamics-coal=Węgiel termodynamiczny +se-used-lifesupport-canister-cleaning=Czyszczenie kanistra Podtrzymywania życia +se-used-lifesupport-canister-cleaning-space=Odkażanie kanistra Podtrzymywania życia +space-science-pack=Kosmiczny Pakiet naukowy +se-rocket-science-pack=Rakietowy Pakiet naukowy +se-big-turbine-internal=Dekompresowanie pary o wysokiej temperaturze +se-arcosphere-fracture=Polaryzacja kryształu przestrzeni +se-arcosphere-fold-in=Odwracanie kryształów przestrzeni +se-arcosphere-fold-out=Odwracanie kryształów przestrzeni +se-arcosphere-folding=Naginanie kryształów przestrzeni: __1__ __2__ to __3__ __4__ +se-electric-boiling-void=Odparowywanie +se-space-probe-rocket-deployed=Rakieta sond kosmicznych (wystrzelona) +se-distortion-drive=Zagięcie czasoprzestrzeni + +[recipe-description] +se-astronomic-insight-2=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-astronomic-insight-3=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-astronomic-insight-4=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-biological-insight-2=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-biological-insight-3=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-biological-insight-4=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-core-mining=Rzeczywisty zwrócony fragment zależy od planety. Rzeczywisty czas wytwarzania zależy od liczby wiertnic rdzenia na planecie lub księżycu. +se-energy-insight-2=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-energy-insight-3=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-energy-insight-4=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-material-insight-2=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-material-insight-3=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-material-insight-4=Bardziej skomplikowane, ale bardziej zasobooszczędne. +se-radiating-space-coolant-normal=Powtarzające się chłodzenie i podgrzewanie termopłynów powoduje degradację. +se-radiating-space-coolant-slow=Powtarzające się chłodzenie i podgrzewanie termopłynów powoduje degradację, wolniejsze chłodzenie powoduje zmniejszenie strat. +se-radiating-space-coolant-fast=Powtarzające się chłodzenie i podgrzewanie termopłynów powoduje degradację, szybsze chłodzenie powoduje zwiększenie strat. +se-delivery-cannon-weapon-pack-se-iridium-piledriver=Wielkie obrażenia fizyczne na niewielkiej powierzchni, potem obrażenia od eksplozji w formie fali uderzeniowej. +se-arcosphere-fracture=Kryształy przestrzeni mogą być zbierane za pomocą [img=item/se-arcosphere-collector] Wyłapywacz kryształów przestrzeni +se-distortion-drive=Ten proces musi być wybrany aby użyć zagięcia czasoprzestrzennego przez Nexus i wygrać grę. Używa 8GW kiedy prędkość osiągnie wartość krytyczną. + +[technology-name] +effectivity-module-4=Moduł Wydajności 4 +effectivity-module-5=Moduł Wydajności 5 +effectivity-module-6=Moduł Wydajności 6 +effectivity-module-7=Moduł Wydajności 7 +effectivity-module-8=Moduł Wydajności 8 +effectivity-module-9=Moduł Wydajności 9 +energy-shield-equipment=Tarcza energetyczna +energy-shield-mk2-equipment=Tarcza energetyczna MK2 +energy-shield-mk3-equipment=Tarcza energetyczna MK3 +energy-shield-mk4-equipment=Tarcza energetyczna MK4 +energy-shield-mk5-equipment=Tarcza energetyczna MK5 +energy-shield-mk6-equipment=Tarcza energetyczna MK6 +sand-processing=Przetwarzanie piasku +glass-processing=Przetwarzanie szkła +liquid-rocket-fuel=Płynne paliwo rakietowe +productivity-module-4=Moduł Produktywności 4 +productivity-module-5=Moduł Produktywności 5 +productivity-module-6=Moduł Produktywności 6 +productivity-module-7=Moduł Produktywności 7 +productivity-module-8=Moduł Produktywności 8 +productivity-module-9=Moduł Produktywności 9 +rocket-silo=Silos rakiet satelitarnych +rocketry=Rakiety bojowe +se-adaptive-armour=Pancerz adaptacyjny +se-antimatter-engine=Silnik antymaterii +se-antimatter-reactor=Reaktor antymaterii +se-antimatter-production=Produkcja antymaterii +se-astronomic-science-pack=Astronomiczny Pakiet naukowy +se-biological-science-pack=Biologicznych Pakiet naukowy +se-condenser-turbine=Turbina kondensacyjna +se-core-miner=Wydobycie rdzenia +se-biogun=Broń Biologiczna +se-cryogun=Broń Lodowa +se-deep-space-science-pack=Pakiet naukowy Dalekiego Kosmosu +se-deep-catalogue=Katalog Dalekiego Kosmosu +se-dimensional-anchor=Kotwica międzywymiarowa +se-electric-boiler=Kocioł elektryczny +se-energy-science-pack=Energetyczny Pakiet naukowy +se-fluid-burner-generator=Generator izotermiczny +se-fuel-refining=Rafineria Paliw +se-heat-shielding=Osłona termiczna +se-long-range-star-mapping=Mapowanie gwiazd dalekiego zasięgu +se-material-science-pack=Materiałowy Pakiet naukowy +se-medpack=Apteczka +se-medpack-2=Apteczka 2 +se-medpack-3=Apteczka 3 +se-medpack-4=Apteczka 4 +se-meteor-defence=Działo Obronne przed meteorami +se-meteor-point-defence=Punktowe Działo Obronne przed meteorami +se-nanomaterial=Nanomateriał +se-plague=Zaraza +se-processing-beryllium=Przetwarzanie Beryllium +se-processing-cryonite=Przetwarzanie Krionitu +se-processing-holmium=Przetwarzanie Holmu +se-processing-iridium=Przetwarzanie Irydu +se-processing-naquium=Przetwarzanie Naquium +se-processing-vitamelange=Przetwarzanie Skamieliny odżywczej +se-processing-vulcanite=Przetwarzanie wulkanitu +se-pulveriser=Rozdrabniacz +se-railgun=Railgun +se-rocket-cargo-safety=Bezpieczeństwo ładunku rakietowego +se-rocket-fuel-from-water=Paliwo rakietowe z wody +se-rocket-launch-pad=Silos rakiet transportowych +se-rocket-landing-pad=Lądowisko rakietowe +se-rocket-reusability=Ponowne użycie rakiety +se-rocket-survivability=Przetrwanie rakiet +se-rtg-equipment=Przenośny RTG +se-rtg-equipment-2=Przenośny RTG MK2 +se-space-assembling=Kosmiczny Automat montażowy +se-space-accumulator=Akumulator kosmiczny +se-space-accumulator-2=Akumulator z Naquium +se-space-astrometrics-laboratory=Laboratorium astrometryczne +se-space-biochemical-laboratory=Laboratorium biochemiczne +se-space-catalogue-astronomic=Katalog astronomiczny +se-space-catalogue-biological=Katalog biochemiczny +se-space-catalogue-universal=Katalog uniwersalny +se-space-catalogue-energy=Katalog energii +se-space-catalogue-material=Katalog materiałów +se-space-data-card=Karta danych +se-space-decontamination-facility=Zakład odkażający +se-space-electromagnetics-laboratory=Laboratorium elektromagnetyczne +se-space-genetics-laboratory=Laboratorium genetyki +se-space-gravimetrics-laboratory=Laboratorium Grawimetryczne +se-space-growth-facility=Zakład Rozwoju +se-space-hypercooling=Hiper chłodzenie +se-space-laser-laboratory=Laboratorium laserowe +se-lifesupport-facility=Zakład Podtrzymywania życia +se-space-manufactory=Fabryka Kosmiczna +se-space-material-fabricator=Fabryka Materii +se-space-matter-fusion=Fuzja materii +se-space-mechanical-laboratory=Laboratorium mechaniczne +se-space-particle-accelerator=Akcelerator cząsteczek +se-space-particle-collider=Zderzacz cząstek +se-space-plasma-generator=Generator plazmy +se-space-platform-plating=Poszycie platformy kosmicznej +se-space-platform-scaffold=Rusztowanie platformy kosmicznej +se-space-radiation-laboratory=Laboratorium promieniowania +se-space-radiating-efficiency=Wydajność chłodnicy +se-space-radiating-speed=Szybkość chłodnicy +se-space-radiator=Chłodnica +se-space-radiator-2=Chłodnica 2 +se-space-rail=Kolej kosmiczna +se-recycling-facility=Zakład recyklingu +se-space-science-lab=Laboratorium kosmiczne +se-space-simulation-ab=Symulacja panspermii +se-space-simulation-am=Symulacja astromateriału +se-space-simulation-as=Symulacja astrocząstek +se-space-simulation-bm=Symulacja biomechaniczna +se-space-simulation-sb=Symulacja biochemiczna +se-space-simulation-sm=Symulacja nanomateriałów +se-space-simulation-abm=Symulacja ksenoprogresji +se-space-simulation-asb=Symulacja astrobioniczna +se-space-simulation-asm=Symulacja astrofizyki +se-space-simulation-sbm=Symulacja nanitów +se-space-simulation-asbm=Symulacja uniwersalna +se-space-solar-panel=Płaski panel słoneczny +se-space-spectrometry-facility=Zakład spektrometrii +se-space-supercomputer=Superkomputer +se-space-telescope=Teleskop +se-space-telescope-gammaray=Teleskop promieniowania gamma +se-space-telescope-xray=Teleskop Xray +se-space-telescope-microwave=Teleskop mikrofalowy +se-space-telescope-radio=Radioteleskop +se-space-thermodynamics-laboratory=Laboratorium termodynamiczne +se-spaceship=Statek kosmiczny +se-spaceship-integrity=Integralność strukturalna statku kosmicznego +se-factory-spaceship=Fabryka Statku kosmicznego +se-superconductive-cable=Kabel nadprzewodzący +se-teleportation=Teleportacja +se-tesla-gun=Tesla +se-thruster-suit=Skafander kosmiczny +space-science-pack=Kosmiczny Pakiet naukowy +se-rocket-science-pack=Rakietowy Pakiet naukowy +speed-module-4=Moduł prędkości 4 +speed-module-5=Moduł prędkości 5 +speed-module-6=Moduł prędkości 6 +speed-module-7=Moduł prędkości 7 +speed-module-8=Moduł prędkości 8 +speed-module-9=Moduł prędkości 9 +se-aeroframe-pole=Solidny pręt +se-aeroframe-scaffold=Solidny rama +se-aeroframe-bulkhead=Solidna ścianka +se-lattice-pressure-vessel=Zbiornik ciśnieniowy +se-heavy-girder=Ciężki dźwigar +se-heavy-bearing=Ciężkie łożysko +se-heavy-composite=Ciężki kompozyt +se-heavy-assembly=Ciężki Zestaw +se-bioscrubber=Płuczka Biologiczna +se-vitalic-epoxy=Żywica epoksydowa +se-vitalic-reagent=Odczynnik witalny +se-vitalic-acid=Kwas witalny +se-self-sealing-gel=Żel samouszczelniający +se-holmium-cable=Kabel holmu +se-holmium-solenoid=Elektromagnes holmu +se-quantum-processor=Procesor kwantowy +se-dynamic-emitter=Emiter dynamiczny +se-naquium-processor=Procesor Naquium +se-naquium-cube=Kostka Naquium +se-naquium-tessaract=Hiperszcześcian Naquium +se-wide-beacon=Wielki Radionadajnik +se-wide-beacon-2=Wielki Radionadajnik 2 +se-lifesupport-equipment=Sprzęt Podtrzymywania życia +se-lifesupport-equipment-1=Sprzęt Podtrzymywania życia MK1 +se-lifesupport-equipment-2=Sprzęt Podtrzymywania życia MK2 +se-lifesupport-equipment-3=Sprzęt Podtrzymywania życia MK3 +se-lifesupport-equipment-4=Sprzęt Podtrzymywania życia MK4 +se-supercharger=Superładowarka +se-addon-power-pole=Punktowy słup elektryczny +se-pylon=Pylon +se-pylon-substation=Pylon Podstacja +se-pylon-construction=Pylon konstrukcyjny +se-pylon-construction-radar=Konstrukcja radarowa pylon +se-shield-projector=Projektor osłonowy +se-deep-space-transport-belt=Kosmiczne taśmociągi +se-big-turbine=Wysokotemperaturowy generator turbinowy +se-big-heat-exchanger=Wysokotemperaturowy wymiennik ciepła +se-zone-discovery-random=Odkrycie strefy +se-zone-discovery-targeted=Wykrywanie strefy docelowej +se-zone-discovery-deep=Deep space Odkrycie strefy +se-delivery-cannon=Armata dostawcza +se-delivery-cannon-weapon=Armata ofensywna +se-spaceship-clamps=Zaciski dokujące Statek Kosmiczny +se-bio-upgrade-constitution=Usprawnienie biologiczne: Konstytucja +se-bio-upgrade-strength=Usprawnienie biologiczne: Siła +se-bio-upgrade-agility=Usprawnienie biologiczne: Zwinność +se-bio-upgrade-dexterity=Usprawnienie biologiczne: Zręczność +se-bio-upgrade-intelligence=Usprawnienie biologiczne: Inteligencja +se-energy-beaming=Wiązki energii +se-energy-beam-defence=Parasol ochronny przed wiązkami energii +se-nexus=Nexus +se-spaceship-victory=Wygrana przez statek kosmiczny +se-arcosphere=Wyłapywanie kryształow przestrzeni +se-arcosphere-folding=Naginanie kryształow przestrzeni +se-space-probe=Silos rakiet wynoszących sondy + +[technology-description] +energy-shield-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +energy-shield-mk2-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +energy-shield-mk3-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +energy-shield-mk4-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +energy-shield-mk5-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +energy-shield-mk6-equipment=Bańka ochronna, która szybko się ładuje, ale zużywa dużo energii. +sand-processing=Kruszenie, mielenie i filtrowanie surowca w czysty piasek. +glass-processing=Przerabianie piasku w szkło. +rocket-silo=Pozwala wystrzelić satelitę na orbitę, aby odkryć nowe planety. +se-adaptive-armour=Pancerz wykorzystujący energię do samonaprawy. Pełni rolę podobną do tarcz energetycznych o niższych wymaganiach energetycznych, ale znacznie wolniejszej regeneracji. +se-antimatter-engine=Unicestwianie antymaterii do produkcji niesamowitego ciągu. +se-antimatter-reactor=Unicestwia antymaterię z materią do generowania ekstremalnego ciepła. +se-antimatter-production=Robienie antymaterii, najgęstszej formy zmagazynowanej energii. +se-astronomic-science-pack=Umożliwia badania nad technologiami związanymi z podróżami kosmicznymi i logistyką międzygwiezdnej. +se-biological-science-pack=Umożliwia badania nad technologiami związanymi z poprawą możliwości fizycznych, broni biologicznej i przetwarzania neuronowego. +se-condenser-turbine=75% wydajności energetycznej turbiny parowej, ale 99% zużytej pary jest zwracane w postaci wody. Zakres temperatur: 100 do 999. +se-core-miner=Pozwala na niekończące się wydobycie zasobów z planet i księżyców, ale ma malejące zyski, jeśli wiele z nich jest używanych na tej samej planecie/księżycu. +se-biogun=Pistolet, który może używać różnych broni biologicznych. +se-cryogun=Zrób ścianę lodu, która może zamrozić wrogów. +se-deep-catalogue=Space distortion, exotic matter, and nano-engineering data structured ready for analysis and computer simulation. Required for the most advanced technologies. +se-deep-space-science-pack=Wymagany dla najbardziej zaawansowanej technologii +se-dimensional-anchor=Wykorzystuje grawitację gwiazdy jako punkt stabilizacji anomalii przestrzennej. +se-electric-boiler=Wytwarza parę wodną za pomocą energii elektrycznej. 90% wydajności energetycznej. +se-energy-science-pack=Umożliwia badania technologii związanych z podstawowymi siłami i odkryciami subatomowymi. +se-fluid-burner-generator=Wymaga paliwa płynnego o wartości energetycznej (takiego jak płynne paliwo rakietowe) do wytworzenia energii elektrycznej. Prosty i kompaktowy, ale pozbawiony efektywności energetycznej większych systemów na bazie pary. Zaprojektowany na potrzeby przestrzeni kosmicznej. Ilość zużywanegeo paliwa zależy od jego wartości energetycznej. +se-fuel-refining=Rafinuje bardziej zaawansowane paliwa. +se-heat-shielding=Panel kompozytowy stosowany do zastosowań w wysokich temperaturach i strukturach kosmicznych. +se-long-range-star-mapping=Niektóre odległe galaktyki można zidentyfikować za pomocą określonych wzorów niezwykłych gwiazd. Wyniki są rejestrowane w [img=virtual-signal/informatron] Informatron [__CONTROL__informatron__]. +se-material-science-pack=Umożliwia badania technologii związanych z zaawansowanymi materiałami w celu uzyskania bardziej zaawansowanych wymagań inżynieryjnych. +se-medpack=Użyj medpack, aby się wyleczyć. +se-medpack-2=Użyj medpack, aby się wyleczyć. +se-medpack-3=Użyj medpack, aby się wyleczyć. +se-medpack-4=Użyj medpack, aby się wyleczyć. +se-meteor-defence=Strzelaj do meteorów, zanim zniszczą Twoje rzeczy. Obrony przed meteorami może chronić całą planetę, ale może zestrzelić tylko jeden meteor na raz. +se-meteor-point-defence=Strzelaj do meteorów, zanim zniszczą Twoje rzeczy. Obrona punktowa może chronić niewielki obszar przed maksymalnie 4 meteorami jednocześnie. +se-nanomaterial=Skomplikowane rozmieszczenie różnych materiałów zorganizowane w skali nano, aby stworzyć kompozyt o doskonałych właściwościach. +se-railgun=Strzałki przyspieszane elektromagnetycznie napędzane z taką prędkością, że pozostawiają ślad plazmy przed odparowaniem. Wysokie obrażenia, powolna szybkostrzelność. +se-plague=Wielka plaga, która zniszczy całe życie z całych planet. Postępuj z nią z NADZWYCZAJNĄ ostrożnością. +se-processing-beryllium=Przekształcaj beryl w beryl niezwykle lekki, odporny na korozję i odporny na promieniowanie metal. Nie ma też prawie żadnej interakcji z Promieniowaniem X (xray). +se-processing-cryonite=Przetwarzanie zamrożonych kryształów krionitu na pręty krionitowe, które znajdują zastosowanie w chłodnictwie, chłodzeniu i smarowaniu. Krionit występuje głównie na zamrożonych planetach. +se-processing-holmium=Przekształca holminit w holm, ziemski rzadki metal z najwyższą przepuszczalnością magnetyczną dowolnego elementu. +se-processing-iridium=Przekształca iryryt w iryd, najbardziej odporny metal na korozję i najgęstszy pierwiastek w wyższych temperaturach. Ważne w ciężkich zastosowaniach. +se-processing-naquium=Przekształcanie tajemniczego kosmicznego kryształu naquitite w naquium, metalopodobny materiał o niezwykłych interakcjach czasoprzestrzennych. +se-processing-vitamelange=Przekształca prymitywną witaminową gąbkę kamienną w cenny ekstrakt odżywczy. +se-processing-vulcanite=Przekształcanie wulkanicznego kryształu wulkanitu w rafinowany proszek stosowany w zaawansowanych wytopach, paliwie rakietowym i innych wysokotemperaturowych procesach chemicznych. Wulkanit znajduje się na planetach wulkanicznych i w większości fragmentów rdzenia. +se-pulveriser=Sproszkuje i zmiażdży twardsze minerały i fragmenty rdzenia planety. +se-rocket-cargo-safety=Zmniejsza prawdopodobieństwo uszkodzenia ładunków podczas transportu o dodatkowe 10% (multiplikatywnie). +se-rocket-fuel-from-water=Wytwarza paliwo rakietowe wodorowo-tlenowe poprzez elektrolizę wody. +se-rocket-landing-pad=Umożliwia dostarczanie rakiet transportowych do wskazanego lądowiska. Dzięki dalszym badaniom może także odzyskać części rakiet. +se-rocket-launch-pad=Pozwala wystrzelić ładunek w kosmos lub na inne planety. +se-rocket-reusability=Zwiększa procent części, które można odzyskać po udanym lądowaniu na lądowisku o 4% (baza wynosi 20%, maks. 100%). +se-rocket-survivability=Zmniejsza prawdopodobieństwo uszkodzenia rakiet podczas transportu lub awarii nawigacji, w wyniku której brakuje lądowiska o dodatkowe 10% (multiplikatywnie). +se-rtg-equipment=Radioizotopowy generator termoelektryczny. Przenośny generator, który przekształca ciepło z rozpadu promieniotwórczego w energię elektryczną. Działa przez dziesięciolecia bez dodatkowego paliwa. +se-rtg-equipment-2=Radioizotopowy generator termoelektryczny. Ulepszony przenośny generator, który przekształca ciepło z rozpadu promieniotwórczego w energię elektryczną. Działa przez dziesięciolecia bez dodatkowego paliwa. +se-space-assembling=Zmodyfikowana maszyna do montażu, która może pracować w przestrzeni kosmicznej. +se-space-astrometrics-laboratory=Łączy, porównuje i kwantyfikuje różne źródła informacji astronomicznej. +se-space-biochemical-laboratory=Zaawansowane laboratorium chemiczne specjalizujące się w biochemii. Może również wykonywać bardziej podstawowe przetwarzanie chemiczne i olejowe. +se-space-catalogue-astronomic=Dane astronomiczne ustrukturyzowane do analizy i symulacji komputerowej. Wymagane do dalszych badań astronomicznych. +se-space-catalogue-biological=Dane biologiczne ustrukturyzowane gotowe do analizy i symulacji komputerowej. Wymagane do dalszych badań biologicznych. +se-space-catalogue-universal=Połączone dane do analizy i symulacji komputerowej. Wymagane do dalszych badań w kosmosie. +se-space-catalogue-energy=Dane energetyczne ustrukturyzowane gotowe do analizy i symulacji komputerowej. Wymagane do dalszych badań nad energią. +se-space-catalogue-material=Dane materiałowe ustrukturyzowane gotowe do analizy i symulacji komputerowej. Wymagane do dalszych badań materiałowych. +se-space-data-card=Wielofunkcyjne urządzenie do przechowywania danych. Wymagany do bardziej zaawansowanych badań opartych na danych. +se-space-decontamination-facility=Czyści substancje do stosowania w warunkach sterylnych i przygotowuje płyny do zastosowania w warunkach niskiego ciśnienia. +se-space-electromagnetics-laboratory=Sprzęt do intensywnego pola magnetycznego i bardzo wysokiego napięcia. +se-space-genetics-laboratory=Laboratorium poświęcone sekwencjonowaniu genetycznemu, modyfikacji genetycznej i genetycznemu drukowaniu kultur. +se-space-gravimetrics-laboratory=Analizuje i symuluje zaburzenia grawitacyjne. +se-space-growth-facility=Hoduje okazy biologiczne w różnych kontrolowanych warunków, które nie są możliwe nigdzie indziej, takie mikrograwitacyjne +se-space-hypercooling=Dokonuje wymiany ciepła na płynie chłodzącym, czyniąc jeden cieplejszym, a drugi zimniejszym. +se-space-laser-laboratory=Eksperymenty z laserami. Należy nosić ochronę oczu. +se-lifesupport-facility=Podtrzymywanie życia w bardziej nieprzyjaznych środowiskach. +se-space-manufactory=Kluczowa technologia do masowej produkcji w kosmosie. +se-space-material-fabricator=Syntezuje nowe materiały. Skrzyżowanie zderzacza cząstek z drukarką 3d. +se-space-matter-fusion=Wytwarzanie materiałów metodą fuzji. +se-space-mechanical-laboratory=Zapewnia szereg procesów mechanicznych: kruszenie, rozdzieranie, ścinanie, wibrowanie itp. +se-space-particle-accelerator=Przyspiesza cząstki w pobliżu prędkości światła. +se-space-particle-collider=Zbiera cząsteczki o dużej prędkości i analizuje wyniki. +se-space-plasma-generator=Generuje różne plazmy. +se-space-platform-plating=Solidna platforma kosmiczna. Gładka i szybka do spacerów kosmicznych. +se-space-platform-scaffold=Podstawowe rusztowanie platformy kosmicznej. Coś, na czym można zbudować, ale nie jest to świetne rozwiązanie do spacerów kosmicznych. +se-space-radiation-laboratory=Stosunkowo bezpieczne miejsce do zabawy z materiałem radioaktywnym. Może być stosowany do przetwarzania uranu. +se-space-radiator=Odbiera nadmiar ciepła z przegrzanego plynu chłodzącego. +se-space-radiator-2=Odbiera nadmiar ciepła z przegrzanego plynu chłodzącego. +se-space-radiating=Wolniejsze, ale bardziej zasobooszczędne chłodzenie przegrzanego termopłynu. +se-space-rail=Szyny, których można bezpiecznie używać w kosmosie, ponieważ zapobiegają wypadaniu pociągu z torów i niszczeniu wszystkiego wokół. Mogą być również stosowane na lądzie ze względów estetycznych. +se-recycling-facility=Złomowanie przedmiotów i przerabianie złomu na surowce. +se-space-science-lab=Umożliwia przetwarzanie pakietów rakietowych i bardziej zaawansowanych badań kosmicznych. +se-space-simulation-ab=Wydajniejsza symulacja dzięki połączeniu wielu dyscyplin. +se-space-simulation-am=Wydajniejsza symulacja dzięki połączeniu wielu dyscyplin. +se-space-simulation-as=Wydajniejsza symulacja dzięki połączeniu wielu dyscyplin. +se-space-simulation-bm=Wydajniejsza symulacja dzięki połączeniu wielu dyscyplin. +se-space-simulation-sb=Wydajniejsza symulacja dzięki połączeniu wielu dyscyplin. +se-space-simulation-sm=Wydajniejsza symulacja dzięki połączeniu wielu dyscyplin. +se-space-simulation-abm=Wydajniejsza symulacja dzięki połączeniu wielu dyscyplin. +se-space-simulation-asb=Wydajniejsza symulacja dzięki połączeniu wielu dyscyplin. +se-space-simulation-asm=Wydajniejsza symulacja dzięki połączeniu wielu dyscyplin. +se-space-simulation-sbm=Wydajniejsza symulacja dzięki połączeniu wielu dyscyplin. +se-space-simulation-asbm=Wydajniejsza symulacja dzięki połączeniu wielu dyscyplin. +se-space-solar-panel=Panel słoneczny o wysokiej wydajności, po którym można chodzić. +se-space-spectrometry-facility=Spektrofotometria, chromatografia gazów, spektrometria masy i inne spektrografie. Strzelaj w ścianę, zegnij ją i patrz gdzie uderzy. +se-space-supercomputer=Umożliwia bardziej zaawansowaną manipulację i przetwarzanie danych oraz symulację. +se-space-telescope=Wyrafinowany teleskop wrażliwy na wiele długości fali wokół widma widzialnego. +se-space-telescope-gammaray=Promienie gamma nie załamują się, więc nie można skupić ich na soczewkach. Ten potężny teleskop wykorzystuje lustra i specjalne detektory. +se-space-telescope-xray=Promienie rentgenowskie blokują większość atmosfer. Ten potężny teleskop jest przeznaczony do kosmosu, w których atmosfera nie stanowi problemu. +se-space-telescope-microwave=Ogromny teleskop wykrywający mikrofale i kosmiczne tło mikrofalowe. +se-space-telescope-radio=Ogromny teleskop, który wykrywa bardzo słabe fale radiowe z odległych źródeł. +se-space-thermodynamics-laboratory=Podejmuje procesy wymagające ekstremalnych temperatur. Potrafi także wykonywać podstawowe procesy termiczne, takie jak wytapianie. +se-spaceship=Statek, który budujesz kawałek po kawałku z podłogą i ścianami, a następnie użyj konsoli, aby polecieć na inną planetę lub dalej. +se-spaceship-integrity=Każdy poziom zwiększa limit wytrzymałości na integralność strukturalną statku kosmicznego o 100. +se-factory-spaceship=Każdy poziom zwiększa limit wytrzymałości na integralność strukturalną statku kosmicznego o 500. +se-superconductive-cable=Nadprzewodzący kabel kompozytowy, który nie wymaga aktywnego chłodzenia. +se-teleportation=Odblokowuje inne technologie teleportacji. Okazuje się, że wypaczanie przestrzeni w tym zakresie jest naprawdę trudne. +se-tesla-gun=Szybkie strzelanie piorunami. Może trafić do 30 wrogów na pocisk. Wykonuje długie skoki między celami lub krótkie skoki po ziemi, jeśli nie ma żadnych celów. +se-thruster-suit=Skafander kosmiczny z silnikami odrzutowymi i buty magnetyczny. Nie idź w kosmos bez tego. +se-thruster-suit-2=Ulepszony kombinezon kosmiczny z silniejszymi silnikami, zwiększonym inwentarzem i większą siatką. +se-thruster-suit-3=Ulepszony kombinezon kosmiczny z silniejszymi silnikami, zwiększonym inwentarzem i większą siatką. +se-thruster-suit-4=Ulepszony kombinezon kosmiczny z silniejszymi silnikami, zwiększonym inwentarzem i większą siatką. +space-science-pack=Umożliwia bardziej bezpośredni rozwój pakietów rakietowych i technologii, które korzystają z tych osiągnięć. +se-aeroframe-pole=Mocny, lekki pręt berylu powszechnie stosowany jako belka nośna w lotnictwie i eksploracji kosmosu. +se-aeroframe-scaffold=Mocna, lekka rama strukturalna z berylu, powszechnie stosowana jako główny szkielet wewnętrzny statków powietrznych i kosmicznych. +se-aeroframe-bulkhead=Mocna, lekka hermetyczna ściana berylowa stosowana jako zewnętrzna powłoka lub ściany przedziałów pomocniczych statków powietrznych i kosmicznych. +se-lattice-pressure-vessel=Mocne, lekkie berylowe naczynie ciśnieniowe z wewnętrzną siatką, która pozwala niektórym płynom sprężać się powyżej ich normalnych granic. W przypadku pęknięcia płyn pod ciśnieniem jest bezpiecznie odpowietrzany. +se-heavy-girder=Ciężka irydowa belka strukturalna stosowana głównie w przemyśle ciężkim i ciężkich okrętach wojskowych. +se-heavy-bearing=Duże ciężkie łożysko irydowe, które może działać w nieskończoność pod wpływem sił, które zmiażdżyłyby mniejsze materiały. +se-heavy-composite=Gruba, prawie nieprzenikniona przegroda, która jest praktycznie odporna na ciepło, korozję, promieniowanie i siłę mechaniczną, ale jest niezwykle ciężka. +se-heavy-assembly=Ciężki mechaniczny zespół kół zębatych i konfigurowalnych elementów stosowanych w przemyśle ciężkim. +se-bioscrubber=Komora przetwarzania materiału, która wykorzystuje procesy biologiczne do rozkładania niepożądanych materiałów. +se-vitalic-epoxy=Niezwykle silny epoksyd pochodzenia biologicznego o właściwościach regeneracyjnych. +se-vitalic-reagent=Wydajny odczynnik uniwersalny do szerokiego zakresu reakcji chemicznych. +se-vitalic-acid=Mocny koktajl różnych kwasów. +se-self-sealing-gel=Lepki żel pod ciśnieniem, ale stały jak stal po wystawieniu na działanie próżni. Często stosowany jako folia wewnętrzna w grodziach do biernego uszczelniania nakłuć. +se-holmium-cable=Kabel w osłonie zaprojektowany specjalnie w celu wyeliminowania niepożądanych szumów w linii, które mogą zakłócać pracę wrażliwej elektroniki. +se-holmium-solenoid=Niezwykle silny elektromagnes. +se-quantum-processor=Wykorzystuje superpozycję i uwikłanie, aby wydajniej pracować nad problemami o dużej złożoności. +se-dynamic-emitter=Szybko regulowany system emitujący światło lub cząstki, który może zmieniać szereg właściwości dla większego zakresu lub trybów skanowania lub właściwości penetracji materiału. +se-naquium-cube=Wykorzystując niezwykłą interakcję naquium z czasoprzestrzenią, można złożyć dużą objętość w małą kostkę. +se-naquium-tessaract=Osobliwy obiekt, który osiada w kształcie sześcianu, ale zmienia się w szereg innych kształtów geometrycznych, jest obracany lub przyspieszany. +se-naquium-processor=Obliczenia w obrębie hipersześcianu z Naquium omija niektóre ze zwykłych ograniczeń gęstości obliczeniowej. +effect-transmission=Radionadajnik przesyła efekty modułów do pobliskich przyjaznych jednostek w obrębie 3 pól. Posiada 8 gniazd modułów. Wiele radionadajników wpływających na ten sam podmiot przeciąży go i uniemożliwi działanie. +se-wide-beacon=Wielki radionadajnik przekazuje efekty modułów do pobliskich budynków w promieniu 14 pól. Posiada 15 gniazd modułów, a po ulepszeniu 20. Wiele radionadajników wpływających na ten sam podmiot przeciąży go i uniemożliwi działanie. +se-wide-beacon-2=Wielki radionadajnik 2 przekazuje efekty modułów do pobliskich budynków w promieniu 14 pól. Posiada 20 gniazd modułów. Wiele radionadajników wpływających na ten sam podmiot przeciąży go i uniemożliwi działanie. +se-lifesupport-equipment-1=Zwiększa efektywność podtrzymywania życia o +100% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. +se-lifesupport-equipment-2=Zwiększa efektywność podtrzymywania życia o +200% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. +se-lifesupport-equipment-3=Zwiększa efektywność podtrzymywania życia o +400% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. +se-lifesupport-equipment-4=Zwiększa efektywność podtrzymywania życia o +800% (dodatkowo). Jeśli jest zainstalowany w kombinezonie innym niż skafander kosmiczny, premia za wydajność jest zmniejszona o połowę. +se-supercharger=Może ładować do 64 robotów jednocześnie z dużą prędkością. Maksymalny pobór mocy przez konstrukcję wynosi 1 GW. +se-pylon=Dystrybuuje energię elektryczną. Zasięg przewodu: 64. +se-pylon-substation=Dystrybuuje energię elektryczną. Zasięg przewodu:64, obszar działania: 64x64. +se-pylon-construction=Dystrybuuje energię elektryczną i rozszerza zasięg konstrukcyjny. Zasięg przewodu: 64, obszar działania: 64x64. +se-pylon-construction-radar=Dystrybuuje energię elektryczną, rozszerza zasięg konstrukcyjny i zapewnia widzenie radarowe. Zasięg: 64, obszar konstrukcyjny i radarowy 256 x 256. +se-shield-projector=Tworzy ochronne pole siłowe. Więcej energii jest potrzebne, gdy projektor się ładuje lub gdy osłona ulega uszkodzeniu. Może blokować pociski strzelane, jeśli zainstalowany jest mod "Walls Block Spitters". +se-deep-space-transport-belt=Szybkie dalekobieżne pasy transportowe, które można umieścić w kosmosie. Różne kolory mogą być użyte do łatwej identyfikacji linii z odległości. +se-big-turbine=Duży generator 1GW, który pobiera parę 5000°C, wytwarza parę 500°C na drugim końcu i wypuszcza wodę z boków. 99% wydajności energetycznej, 99% oszczędności wody. +se-big-heat-exchanger=Duży wymiennik ciepła przeznaczony do wysokich temperatur i wysokiej wydajności. +se-addon-power-pole=Mały słup elektryczny przeznaczony do zamocowania na budynkach lub do precyzyjnej kontroli zasięgu elektryczności. +se-zone-discovery-random=Szukaj planet, księżyców i pasów asteroid za pomocą teleskopów. +se-zone-discovery-targeted=Szukaj planet, księżyców i pasów asteroid, które mają określone zasoby. Wybierz preferencję zasobów w obszarze [img=virtual-signal/informatron] Informatron > Odkrywanie stref. +se-zone-discovery-deep=Szukaj interesujących obszarów głębokiej przestrzeni międzygwiezdnej. Pola asteroid mogą mieć wiele unikalnych i cennych zasobów. +se-delivery-cannon=Armata zdolna do wystrzeliwania zasobów na orbitę i poza nią do opancerzonej skrzyni, aby je złapać. +se-delivery-cannon-weapon=Armata zdolna do strzelania wybranymi broniami, takimi jak bomba atomowa, na inne powierzchnie. +se-spaceship-clamps=Umożliwia umieszczenie zacisków dokowania, aby statki kosmiczne mogły zakotwiczyć w określonej lokalizacji, dopasowując odpowiednie pozycje zacisków. Automatyzacja wymaga sygnałów „Zakotwicz za pomocą” i „Zakotwicz do” podawanych do konsoli. +se-bio-upgrade-constitution=Zwiększa maksymalne zdrowie. +se-bio-upgrade-strength=Zwiększa wielkość ekwipunku. +se-bio-upgrade-agility=Zwiększa szybkość poruszania się. +se-bio-upgrade-dexterity=Zwiększa prędkością wytwarzania ręcznego. +se-bio-upgrade-intelligence=Zwiększa zdobytą wiedzę z każdego pakietu naukowego. +se-energy-beaming=An intense energy beam that can be used as a weapon from the sky, or to transfer power where it is needed. +se-energy-beam-defence=Defends against space-based energy beams and coronal mass ejections. Works by levitating magnetic particles into a protective bubble, then realignes and clumps the particles as needed to diffuse hostile energy beams. +se-nexus=A device that can be activated on a spaceship moving in interstellar space to generate data, and with additional technology activate is space distortion field (Spaceship Victory). +se-spaceship-victory=Allows the Nexus to activate a distortion drive to escape the local stellar cluster. Have a Nexus on a 3000+ integrity spaceship moving at 250 speed in interstellar space for 60 seconds to win the game. +se-arcosphere=Allows the collection of arcospheres lost in the interstellar void. +se-arcosphere-folding=Allows the use of arcospheres as extradimensional pincers. +se-space-probe=A space-based rocket silo for launching space probes. Can also be used to launch satellites cheaply. + +[modifier-description] +tesla-shooting-speed-bonus=Tesla: prędkość strzelania +tesla-damage-bonus=Tesla: premia do obrażeń +railgun-damage-bonus=Railgun: premia do obrażeń +railgun-shooting-speed-bonus=Railgun: prędkość strzelania +cryogun-shooting-speed-bonus=Broń Lodowa: prędkość strzelania +cryogun-damage-bonus=Broń Lodowa: premia do obrażeń +character-running-speed=Bonus poruszania się postaci: +__1__ +character-crafting-speed=Szybkość wytwarzania ręcznego postaci: +__1__ + +[virtual-signal-name] +signal-speed=Szybkość +se-signal-speed=Szybkość +signal-distance=Odległość +se-signal-distance=Odległość +se-star=Gwiazda +se-planet=Planeta +se-planet-orbit=Orbita planety +se-moon=Księżyc +se-moon-orbit=Orbita księżyca +se-asteroid-belt=Pas asteroid +se-asteroid-field=Pole Asteroid +se-anomaly=Anomalia +se-meteor=Meteor +se-spaceship=Statek kosmiczny +se-cargo-rocket=Rakieta Transportowa +se-remote-view=Widok zdalny +se-death=Śmierć +se-character-corpse=Zwłoki +se-ruin=Ruina +se-accolade=Wyróżnienie +se-remove=Usuń +se-radius=Promień +se-hierarchy=Hierarchia +se-spaceship-launch=Wystartowanie statku kosmicznego +se-anchor-using-left-clamp=Zakotwicz za pomocą lewego zacisku statku kosmicznego +se-anchor-using-right-clamp=Zakotwicz za pomocą prawego zacisku statku kosmicznego +se-anchor-to-left-clamp=Zakotwicz do lewego zacisku docelowego +se-anchor-to-right-clamp=Zakotwicz do prawego zacisku docelowego +se-beacon-overload=Przeciążenie radionadajnikami +se-heat=Ciepło + +[controls] +se-remote-view=Nawigacja satelitarna +se-universe-explorer=Eksloracja wszechświata +se-respawn=Odrodzenie +se-mode-toggle=Przełącz tryb działania obiektu + +[shortcut] +se-remote-view=Nawigacja satelitarna +se-universe-explorer=Eksloracja wszechświata +se-respawn=Odrodzenie + +[shortcut-name] +se-remote-view=Nawigacja satelitarna [__CONTROL__se-remote-view__] +se-universe-explorer=Eksploracja Wszechświata [__CONTROL__se-remote-view__] +se-respawn=Odrodzenie [__CONTROL__se-respawn__] + +[tile-name] +se-space-platform-plating=Poszycie platformy kosmicznej +se-space-platform-scaffold=Rusztowanie platformy kosmicznej +se-space-platform-underlay=Kosmos +se-space-platform-underlay-l=Kosmos +se-space-platform-underlay-r=Kosmos +se-space=Pusta przestrzeń kosmiczna +se-regolith=Regolit +se-asteroid=Asteroida +se-spaceship-floor=Podłoga statku kosmicznego + +[mod-setting-name] +se-meteor-interval=Odstęp między meteorytami +se-plague-max-runtime=Maksymalny czas trwania zarazy +se-planets=Liczba planet +se-planet-size=Powierzchnia planety (1% do 10000%) +se-seed=Generowanie planet - Seed +se-skip-experimental-warning=Pomiń eksperymentalne ostrzeżenie +se-print-meteor-info=Wyświetlaj informacje o meteorytach w konsoli +se-space-pipe-capacity=Pojemność rur kosmicznych +se-electric-boiler=Kocioł elektryczny +se-deep-space-belt-speed=Szybkość taśmociągów dalekiego kosmosu +se-deep-space-belt-black=Czarny taśmociąg +se-deep-space-belt-white=Biały taśmociąg +se-deep-space-belt-red=Czerwony taśmociąg +se-deep-space-belt-yellow=Żółty taśmociąg +se-deep-space-belt-green=Zielony taśmociąg +se-deep-space-belt-cyan=Błękitny taśmociąg +se-deep-space-belt-blue=Niebieski taśmociąg +se-deep-space-belt-magenta=Purpurowy taśmociąg +se-space-science-pack=Zamiennik kosmicznego pakietu naukowego +se-never-show-lifesupport=Nigdy nie pokazuj interfejsu wsparcia życia +se-show-zone-preview=Pokaż podląd powierzchni w oknie informacyjnym +se-pylon-charge-points=Liczba punktów ładowania pylonu konstrukcyjnego +se-cmes-max-frequency=Maksymalny odstęp między koronalnymi wyrzutami masy +se-spawn-small-resources=Dodaj małe początkowe złoża zasobów +se-show-overhead-button-satellite-mode=Pokaż przycisk nawigacji satelitarnej +se-show-overhead-button-interstellar-map=Pokaż przycisk mapy międzygwiezdnej +se-show-overhead-button-universe-explorer=Pokaż przycisk Eksploracji Wszechświata +se-scan-search-budget=Liczba jednocześnie sprawdzanych bloków przy skanowaniu +se-scan-chart-budget=Liczba jednocześnie generowanycch bloków przy skanowaniu +se-supercharger-individual-charge-rate=Szybkość ładowania botów przez Superładowarkę (MW) + +[mod-setting-description] +se-meteor-interval=Podstawowy czas w minutach między uderzeniami meteorów. Po każdym uderzeniu kolejne uderzenie ustawia się na losową liczbę minut między 1 a tą wartością. +se-plague-max-runtime=Maksymalny czas działania broni biologicznej w minutach. Po tym jak Zaraza zadziała, przez ten czas, wszystkie drzewa i wrogowie zostają zniszczone. +se-planets=Nie zmieniaj w trakcie kampanii. +se-planet-size=Nie zmieniaj w trakcie kampanii. +se-seed=Nie zmieniaj w trakcie kampanii. +se-skip-experimental-warning=Ostrzeżenie o rozpoczęciu nowej gry nie pojawi się, a jeśli komunikat się zmieni, nie otrzymasz ostrzeżeń. +se-print-meteor-info=Umożliwia wyświetlanie alertów w konsoli po tym, jak główny alert zniknie po naciśnięciu przycisku klawisza __CONTROL__toggle-console__. +se-space-pipe-capacity=Wydajność płynu dla rur kosmicznych. +se-electric-boiler=Dodaje kocioł elektryczny do gry. +se-deep-space-belt-speed=Deep space belts are supposed to be the fastest belts. If you have other mods that add faster belts, you can increase the deep space belt speed to match or exceed. +se-deep-space-belt-black=Czarny taśmociąg, rozdzielacz i taśmociąg podziemny można wyłączyć, aby zmniejszyć bałagan w interfejsie użytkownika. +se-deep-space-belt-white=Biały taśmociąg, rozdzielacz i taśmociąg podziemny można wyłączyć, aby zmniejszyć bałagan w interfejsie użytkownika. +se-deep-space-belt-red=Czerwony taśmociąg, rozdzielacz i taśmociąg podziemny można wyłączyć, aby zmniejszyć bałagan w interfejsie użytkownika. +se-deep-space-belt-yellow=Zółty taśmociąg, rozdzielacz i taśmociąg podziemny można wyłączyć, aby zmniejszyć bałagan w interfejsie użytkownika. +se-deep-space-belt-green=Zielony taśmociąg, rozdzielacz i taśmociąg podziemny można wyłączyć, aby zmniejszyć bałagan w interfejsie użytkownika. +se-deep-space-belt-cyan=Błękitny taśmociąg, rozdzielacz i taśmociąg podziemny można wyłączyć, aby zmniejszyć bałagan w interfejsie użytkownika. +se-deep-space-belt-blue=Niebieski taśmociąg, rozdzielacz i taśmociąg podziemny można wyłączyć, aby zmniejszyć bałagan w interfejsie użytkownika. +se-deep-space-belt-magenta=Purpurowy taśmociąg, rozdzielacz i taśmociąg podziemny można wyłączyć, aby zmniejszyć bałagan w interfejsie użytkownika. +se-space-science-pack=Jeśli inny mod doda sposób uzyskania nauki o kosmosie, wówczas zastosowana zostanie ta metoda. Jeśli nie ma sposobu, aby to zrobić, eksploracja kosmiczna może go usunąć lub wykorzystać jako pakiet naukowy dotyczący optymalizacji. +se-never-show-lifesupport=Jeśli zaznaczone, GUI wsparcia życia nie będzie nigdy wyświetlane, nawet jeśli się dusisz. +se-show-zone-preview=Odznacz, aby wyłączyć okno podglądu strefy w Eksploratorze Wszechświata. Jeśli masz aktywne niektóre nakładki debugowania Factorio, okno podglądu może zmniejszyć liczbę klatek na sekundę. +se-pylon-charge-points=Uncheck to remove construction pylon charge points. This helps control bot charging behaviour, but you may need to add other charging options along long distance routes. +se-cmes-max-frequency=Maksymalny odstęp czasowy pomiędzy koronalnymi wyrzutami masy (CME). Wartość w godzinach, 0 = wyłączone. Pierwszy CME ma miejsce w pierwszej minucie gry i jest małoszkodliwy. Drugi nastąpi po około 48 godzinach gry. Odstęp między kolejnymi będzie pomiędzy 50% a 100% ustawionej wartości. Niezerowe ustawienie będzie miało wpływ tylko na nowe wydarzenie; obecne ETA nie zostanie zmienione. Ustawienie na zero spowoduje anulowanie CME, dla których odliczanie już się rozpoczęło, zmiana ustawienia będzie miała efekt najpóźniej po minucie. +se-spawn-small-resources=Dodaje dodatkowe złoża zasobów na miejscu startowym. Będą one blisko siebie aby oszczędzić biegania. +se-show-overhead-button-satellite-mode=Pokaż mały przycisk w lewym górnym rogu ekranu aby przełączać nawigację satelitarną. +se-show-overhead-button-interstellar-map=Pokaż mały przycisk w lewym górnym rogu ekranu aby przełączać mapę przestrzeni międzygwiezdnej. +se-show-overhead-button-universe-explorer=Pokaż mały przycisk w lewym górnym rogu ekranu aby przełączać eksploratora wszechświata. +se-scan-search-budget=Skanowanie satelitarne: Liczba bloków pól, która może być jednocześnie sprawdzana. Wysoka wartość przyspiesza dotarcie do brzegu odkrytego terenu. +se-scan-chart-budget=Skanowanie satelitarne: Liczba żądań generowania bloków pól, która może być zakolejkowana jednocześnie. Nowe żądania nie będą dodane dopóki generowanie poprzednich nie zakończy się. +se-supercharger-individual-charge-rate=Sets the charging rate of each individual charging port in the supercharger, in MW (does not affect maximum charge rate). Minimum (default) value is 90 MW, enough to charge a vanilla robot in one tick, up to 1000 MW, or 1 GW, the maximum charge rate of the supercharger. + +[string-mod-setting] +se-space-science-pack-Remove=Usuń całkowicie +se-space-science-pack-Replace=Zastąp przez Rakietowy pakiet naukowy +se-space-science-pack-OptimisationUranium=Optymalizacja: formuła krio-uran +se-space-science-pack-OptimisationFish=Optymalizacja: formuła vita-vulca-ryba + +[autoplace-control-names] +planet-size=Wielkość planety +se-water-ice=Lód wodny (tylko kosmos) +se-methane-ice=Lód metanowy (tylko kosmos) +se-cryonite=Krionit (nie na planecie macierzystej) +se-vulcanite=Wulkanit (nie na planecie macierzystej) +se-vitamelange=Gąbczasta Skamielina odżywcza (nie na planecie macierzystej) +se-beryllium-ore=Ruda Berylu (nie na planecie macierzystej) +se-holmium-ore=Ruda Holmu (nie na planecie macierzystej) +se-iridium-ore=Ruda Irydu (nie na planecie macierzystej) +se-naquium-ore=Ruda Naquium (tylko kosmos) + +[map-gen-preset-name] +space-exploration=Ustawienia domyślne Space Exploration + +[map-gen-preset-description] +space-exploration=Domyślne dla Space Exploration \ No newline at end of file diff --git a/space-exploration_0.5.58/space-exploration/locale/ru/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/ru/strings.cfg new file mode 100644 index 0000000..2821299 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/ru/strings.cfg @@ -0,0 +1,2234 @@ +spaceship-integrity100=+100 к структурной целостности космического корабля +spaceship-integrity300=+300 к структурной целостности космического корабля +spaceship-integrity500=+500 к структурной целостности космического корабля +arcosphere-discovery=Собирайте аркосферы из глубокого межзвёздного пространства +core-mining-productivity-5=+5% к продуктивности глубинного бурения +se-zone-discovery-random=Запускает обнаружение случайной зоны при исследовании. +se-zone-discovery-targeted=Запускает обнаружение зоны с ресурсами при исследовании. +se-zone-discovery-deep=Запускает обнаружение зоны глубокого космоса при исследовании. +unlock-spaceship-victory=Разблокирует условие победы "Космический корабль": управляйте космическим кораблём с прочностью 3000+, с Нексусом, работающим как двигатель искажения на скорости 250 в течение 60 секунд в межзвёздном пространстве. + +[mod-name] +space-exploration=Space Exploration (Исследование космоса) + +[mod-description] +space-exploration=Стройте грузовые ракеты для отправки грузов в космос. Отправляйтесь в космос на ракете сами и выходите в открытый космос. Стройте космические платформы для разработки сложной космической науки. Стройте космические корабли клетка за клеткой, летайте на них между планетами, лунами, астероидными поясами и даже дальше. Крайне рекомендуется играть с модом AAI Industry. Требуется мод Space Exploration Postprocess (не зависимость, долго объяснять). Не рекомендуется играть с независимыми модами, пока в экспериментальной фазе. + +[space-exploration] +space-exploration=Исследование космоса +menu_space-exploration=Исследование космоса +title_space-exploration=Исследование космоса +off=Выкл +on=Вкл +close=Закрыть +show=Показать +wdc_auto_off=Ручное прицеливание +wdc_auto_on=Автоматическое прицеливание +name=Название +rename-something=Переименовать __1__ +trigger-none=Нет триггера (Вручную) +trigger-fuel-full=Запуск при полном топливе +trigger-cargo-full=Запуск при полной загруженности +trigger-fuel-full-signal=Запуск по зелёному сигналу и при полном топливе +trigger-cargo-full-signal=Запуск по зелёному сигналу и при полной загруженности +trigger-cargo-full-or-signal=Запуск по зелёному сигналу или при полной загруженности +destination-type-zone=Приблизительное местоположение +destination-type-landing-pad=Грузовая посадочная площадка +button-launch=Запуск +button-launch-disabled=Запуск (Отключено) +destination-crash-warning=Внимание: Выберите грузовую посадочную площадку, чтобы уменьшить шанс крушения +recipe-to=от __1__ к __2__ +recipe-from=к __1__ от __2__ +simple-a-b=__1____2__ +simple-a-b-space=__1__ __2__ +simple-a-b-comma=__1__, __2__ +simple-a-b-break=__1__\n__2__ +simple-bold=[font=default-bold]__1__[/font] +interstellar-map=Межзвёздная карта +interstellar-space=Межзвёздное пространство +planetary-system=Система __1__ +solar-system=Система __1__ +remote-view=Спутниковая Навигационная Система [__CONTROL__se-remote-view__] +remote-view-window-title=[img=virtual-signal/se-remote-view] Навигационный спутник [__CONTROL__se-remote-view__] +remote-view-currently-viewing=Текущий просмотр: +remote-view-instruction=Запустите больше спутников, чтобы открыть больше звёзд, планет, лун и других областей. +remote-view-spaceships=__1__: Космические корабли +remote-view-spaceships-anchored=__1__: Космические корабли на якоре +remote-view-clamps=__1__: Зажимы для космических кораблей +remote-view-show-hide-resources=Показать/спрятать ресурсы +remote-view-show-hide-stats=Показать/спрятать статистику +remote-view-show-hide-anchor-info=Показать/спрятать информацию о якорях +open-pins-remote-view=Все отметки [__CONTROL__se-remote-view-pins__] +exit-pins-remote-view=Закрыть отметки [__CONTROL__se-remote-view-pins__] +remote-view-history-delete=Удалить историю поверхностей. +remote-view-history-previous=Назад по истории поверхностей [__CONTROL__se-remote-view-previous__].\n__1__ +remote-view-history-next=Вперёд по истории поверхностей [__CONTROL__se-remote-view-next__].\n__1__ +remote-view-history-item=__1__ +remote-view-history-item_named=__1__ → __2__ +exit-remote-view=Выйти из Спутниковой Навигационной Системы [__CONTROL__se-remote-view__] +remote-view-pin-make=Отметить текущий вид +remote-view-pins-list=Все отметки +remote-view-add-pin=Создать новую отметку на текущем местоположении. +remote-view-pin-details=Свойства отметки +remote-view-pin-button-tooltip=__1__ → __2__ +remote-view-pin-button-tooltip-hotkey-one=__1__ → __2__ [__CONTROL__se-pin-one__] +remote-view-pin-button-tooltip-hotkey-two=__1__ → __2__ [__CONTROL__se-pin-two__] +remote-view-pin-button-tooltip-hotkey-three=__1__ → __2__ [__CONTROL__se-pin-three__] +remote-view-pin-button-tooltip-hotkey-four=__1__ → __2__ [__CONTROL__se-pin-four__] +remote-view-pin-button-tooltip-hotkey-five=__1__ → __2__ [__CONTROL__se-pin-five__] +remote-view-pin-button-tooltip-hotkey-six=__1__ → __2__ [__CONTROL__se-pin-six__] +remote-view-pin-button-tooltip-hotkey-seven=__1__ → __2__ [__CONTROL__se-pin-seven__] +remote-view-pin-button-tooltip-hotkey-eight=__1__ → __2__ [__CONTROL__se-pin-eight__] +remote-view-pin-button-tooltip-hotkey-nine=__1__ → __2__ [__CONTROL__se-pin-nine__] +remote-view-pin-button-tooltip-hotkey-zero=__1__ → __2__ [__CONTROL__se-pin-zero__] +remote-view-pin-button-tooltip-help-text=\n\n[font=default-bold]- Управление -[/font]\nЛКМ: Перейти к отмеченному местоположению\nПКМ: Изменить значок\nCtrl+ПКМ: Удалить +remote-view-pin-button-tooltip-help-text-update-position=\nShift+ПКМ: Обновить позицию отметки +remote-view-pin-name=Название +remote-view-pin-icon=Значок +remote-view-pin-zoom=Масштаб +remote-view-pin-hotkey=Горячая клавиша +remote-view-pin-hotkey-none=Нет +remote-view-pin-hotkey-one=__CONTROL__se-pin-one__ - __1__ +remote-view-pin-hotkey-two=__CONTROL__se-pin-two__ - __1__ +remote-view-pin-hotkey-three=__CONTROL__se-pin-three__ - __1__ +remote-view-pin-hotkey-four=__CONTROL__se-pin-four__ - __1__ +remote-view-pin-hotkey-five=__CONTROL__se-pin-five__ - __1__ +remote-view-pin-hotkey-six=__CONTROL__se-pin-six__ - __1__ +remote-view-pin-hotkey-seven=__CONTROL__se-pin-seven__ - __1__ +remote-view-pin-hotkey-eight=__CONTROL__se-pin-eight__ - __1__ +remote-view-pin-hotkey-nine=__CONTROL__se-pin-nine__ - __1__ +remote-view-pin-hotkey-zero=__CONTROL__se-pin-zero__ - __1__ +remote-view-pin-location=Местоположение +remote-view-pin-location-position={x=__1__, y=__2__} +remote-view-pin-location-position-button=Обновить позицию отметки +remote-view-pin-location-position-button-tooltip=Установить позицию отметки на текущее местоположение. +remote-view-pin-viewer-title=Все отметки +remote-view-pin-viewer-misc-row=Разное +remote-view-pin-viewer-spaceship-row=Космические корабли +open-zonelist=Открыть Атлас Вселенной +zonelist-window-title=[img=virtual-signal/se-planet-orbit] Атлас Вселенной [__CONTROL__se-universe-explorer__] +priority-icon=[img=virtual-signal/se-accolade] +priority-tooltip=Приоритет (для сортировки важных и неактуальных зон) +trim-zone-button=[img=item/cliff-explosives] Обрезать поверхность +trim-zone-button-tooltip=Удаляет фрагменты за пределами ограничивающей рамки, определяемой объектами игрока, специальными объектами и исходной точкой карты. +trim-zone-button-no-surface-tooltip=Поверхность не существует. +trim-zone-results=Удалено __1__ чанков из __2__. Обрезано до прямоугольника X [__3__ - __4__] Y [__5__ - __6__] +delete-zone-button=[img=virtual-signal/se-remove] Удалить поверхность +delete-zone-button-tooltip=Некоторые поверхности нельзя удалить. +delete-zone-button-no-surface-tooltip=Поверхность не существует. +scan-zone-button=[img=item/satellite] Сканировать поверхность +scan-zone-button-tooltip=Предупреждение: это может замедлить игру во время сканирования. Скорость сканирования можно настроить в параметрах мода. Сканирование можно остановить в любой момент. +scan-zone-button-disabled-tooltip=Вы должны запустить спутник, чтобы сканировать поверхность. +stop-scan-zone-button=[img=item/satellite] Остановить все сканирования +stop-scan-zone-button-tooltip=Останавливает любое активное сканирование на всех поверхностях. +generic-requires-satellite=Сначала вы должны запустить спутник. +remote-view-requires-satellite=Вы должны запустить спутник, чтобы использовать спутниковую навигационную систему. +satellite-discovered-platform=[color=cyan]Спутник обнаружил космическую платформу на орбите.[/color] Откройте [img=virtual-signal/se-planet-orbit] Атлас Вселенной [__CONTROL__se-universe-explorer__], выберите __1__ и нажмите "Просмотр поверхности". Там могут быть полезные вещи. +satellite-view-unlocked=Вы разблокировали [color=cyan][img=virtual-signal/se-remote-view]Спутниковую навигационную систему[/color]. Это позволяет вам просматривать мир и другие открытые вами места через спутник. Нажмите [color=green][__CONTROL__se-remote-view__][/color], чтобы активировать, или используйте панель ярлыков (справа от панели быстрого доступа). +source-discovered-zone=[color=cyan]__1__ открыл новую __2__: [/color][img=__3__] [color=white]__4__[/color]. Обнаруженные местоположения можно просмотреть в [img=virtual-signal/se-planet-orbit] Атласе Вселенной [__CONTROL__se-universe-explorer__]. +discovered-zone=[color=cyan]Открыта новая __1__: [img=__2__] [/color][color=white]__3__[/color]. +discovered-anomaly-additional=Неизвестный объект обнаружен в [img=virtual-signal/se-anomaly] аномалии. Ваш [img=virtual-signal/informatron] Журнал исследований [__CONTROL__informatron__] обновлён. +satellite-discovered-nothing=Был запущен новый спутник, но ничего нового он не обнаружил. Возможно, вокруг других звёзд можно найти больше. +tech-discovered-nothing=У близлежащих звёзд телескопы не обнаружили ничего нового. В глубоком космосе можно найти больше. +tech-deep-discovered-nothing=Ничего нового в дальнем космосе телескопы не обнаружили. +galaxy_ship_authenticated=[img=virtual-signal/se-spaceship] Заброшенный космический корабль: [color=cyan]«Биосигнатура аутентифицирована. Код доступа к шлюзу - 2236067964. Передаётся журнал аварийных резервных копий.»[/color] Ваш [img=virtual-signal/informatron] Журнал исследований [__CONTROL__informatron__] обновлён. +space-capsule=Космическая капсула +player-died=__1__ умер +launch-suit-warning=Чтобы избежать удушья, пожалуйста, наденьте ваш реактивный костюм и положите в инвентарь канистры жизнеобеспечения. +suffocating-warning=Вы задыхаетесь. Войдите в космическую капсулу или наденьте ваш реактивный костюм с канистрами жизнеобеспечения в инвентаре. +rocket_survivability_fail=Грузовая ракета была повреждена в полёте и сбилась с курса. Рекомендуется дополнительное исследование выживаемости ракеты и безопасности грузов. __1__ +respawn-if-stranded=Если вы застряли, используйте кнопку возрождения [__CONTROL__se-respawn__]. +respawn-options-title=Место возрождения +respawn-button-homeworld=[img=virtual-signal/se-planet] Родной мир +respawn-button-landing-pad=[img=item/se-rocket-landing-pad] Ближайшая посадочная площадка +respawn-button-spaceship=[img=virtual-signal/se-spaceship] Ближайший космический корабль +respawn-confirm-title=Вы уверены, что хотите возродиться? +respawn-confirm-yes=[img=virtual-signal/se-death] Возродиться +respawn-confirm-no=Отмена +search-list=Поиск +clear-search=Очистить поиск +filter-list=Фильтр +clear-filter=Очистить фильтр +attrition-type-radiation=излучение +attrition-type-wind=ветер +attrition-type-spacial-distortion=пространственное искажение +zonelist-view-surface=Просмотр поверхности +zonelist-heading-hierarchy=Иерархия +zonelist-heading-type=Тип зоны +zonelist-heading-name=Название +zonelist-heading-radius=Радиус +zonelist-heading-primary-resource=Основной ресурс +zonelist-heading-attrition=Помехи роботам +zonelist-heading-threat=Угроза +zonelist-heading-solar=Солнечный +zonelist-heading-flags=Флаги +zonelist-heading-priority=Приоритет +zonelist_filter_star=Включить звёзды +zonelist_filter_planet=Включить планеты +zonelist_filter_planet-orbit=Включить орбиты планет +zonelist_filter_moon=Включить луны +zonelist_filter_moon-orbit=Включить орбиты лун +zonelist_filter_asteroid-belt=Включить пояса астероидов +zonelist_filter_asteroid-field=Включить поля астероидов +zonelist_filter_anomaly=Включить аномалии +zonelist_filter_spaceship=Включить космические корабли +zonelist-resource-bar-tooltip=__1__ __2__\nЧастота: __3__\nРазмер: __4__\nБогатство: __5__ +zonelist-resource-bar-tooltip-extended=__1__ __2__\nЧастота: __3__\nРазмер: __4__\nБогатство: __5__\n__6__ +zonelist-resources-disclaimer=Вероятности ресурсов оценочные. [img=info] +zonelist-resources-disclaimer-tooltip=Все значения ресурсов являются оценочными, основанными на плотности элементов.\nОни соответствуют настройкам при создании карты в игре.\nФактические размеры месторождений ресурсов будут различаться, и их появление может быть запрещено из-за воды, радиуса поверхности или определенных требований к тайлам. +resource-terrain-required-se-vulcanite=Требуется вулканическая поверхность +resource-terrain-required-se-cryonite=Требуется замороженная поверхность +resource-terrain-required-se-vitamelange=Требуется травянистая поверхность +zone-tooltip-type=Тип зоны: +zone-tooltip-parent=Родитель: +zone-tooltip-threat=Угроза: +zone-tooltip-daynight=Цикл дня и ночи: +zone-tooltip-bot-attrition=Помехи для роботов (__1__): +zone-tooltip-radius=Радиус: +zone-tooltip-solar=Освещённость: +zone-tooltip-flags=Флаги: +zone-tooltip-closest=Ближайший: +zone-tooltip-destination=Назначение: +zone-tooltip-delta-v=∆v от __1__ +construction-denied=Нельзя разместить здесь. +construction-denied-vehicle-in-space=Нельзя разместить наземные машины в космосе. +construction-denied-se-surface=Неподходящее место, нужно разместить на поверхности из мода Исследование космоса. +construction-denied-no-water=Нет воды +construction-denied-spaceship-only=Должно быть размещено на палубе космического корабля. +currently-viewing=Текущий просмотр: __1__ +fail-board-no-character=Невозможно сесть на целевой корабль, вы должны быть прикреплены к своему персонажу, чтобы использовать это действие. +fail-board-remote-character=Невозможно сесть на целевой корабль, ваш персонаж не находится на корабле, с которого вы пытаетесь сойти. +fail-board-target-anchored=Невозможно сесть на стоящий на якоре корабль, попробуйте вместо этого встать на якорь в том же месте. +starmap=Звёздная карта +starmap-button=[img=virtual-signal/se-star] Звёздная карта +back=Назад +spaceship=Космический корабль +planet=Планета +moon=Луна +star=Звезда +orbit=Орбита +something_orbit=Орбита __1__ +asteroid-belt=Пояс астероидов +asteroid-field=Поле астероидов +anomaly=Аномалия +spaceship-cannot-set-destination-to-self=Нельзя указать пунктом назначения себя. +spaceship-streamline=Обтекаемость: __1__ +spaceship-launch-energy=Энергия запуска: __1__ +spaceship-launch-energy-invalid=Энергия запуска: Требуется прохождение проверки целостности. +spaceship-speed=Скорость: __1__ +spaceship-structural-stress-hull=Структурная нагрузка (корпус): __1__ +spaceship-structural-stress-hull-invalid=Структурная нагрузка (корпус): нет данных (требуется герметичность) +spaceship-structural-stress-container=Структурная нагрузка (контейнеры): __1__ +spaceship-structural-stress-container-invalid=Структурная нагрузка (контейнеры): нет данных (требуется герметичность) +spaceship-travel-time-unknown=Время полёта: Неизвестно. Проверьте максимальную скорость для оценки. +spaceship-travel-time-max=Время полёта: __1__с на максимальной скорости. +spaceship-travel-time-current=Время полёта: __1__с на текущей скорости. +spaceship-closest-location=Ближайшее место: __1__ +spaceship-location-spatial-distortion=Искажение пространства: __1__ +spaceship-location-stellar-x=Квадрант X: __1__ +spaceship-location-stellar-y=Квадрант Y: __1__ +spaceship-location-star-gravity-well=Гравитационный колодец звезды: __1__ +spaceship-location-planet-gravity-well=Гравитационный колодец планеты: __1__ +spaceship-travel-status=Статус полёта: __1__ +spaceship-integrity-status-valid=Статус целостности: Действительный: __1__ +spaceship-integrity-status-invalid=Статус целостности: Недействительный: __1__ +spaceship-button-launch=Запуск +spaceship-button-launch-tooltip=Готов к запуску +spaceship-button-launch-disabled=Запуск (отключено) +spaceship-button-launch-disabled-fuel-tooltip=Требуется топливо в ускорителях. +spaceship-button-launch-disabled-integrity-tooltip=Требуется положительная проверка целостности +spaceship-button-anchor=Якорь +spaceship-button-confirm-anchor=Подтвердить место стоянки +spaceship-button-anchor-to=Якорь к __1__ +spaceship-button-anchor-on=Якорь на __1__ +spaceship-button-stop=Стоп +spaceship-button-start=Поехали! +spaceship-button-board=Взойти на __1__ +spaceship-button-scouting-back=Назад +spaceship-button-scouting-back-tooltip=Отменить поиск места стоянки +spaceship-name-the=__1__ +spaceship-button-start-integrity-check=Начать проверку целостности +spaceship-heading-destination=Пункт назначения +list-destinations-alphabetically=Перечислить пункты назначения по алфавиту +spaceship-travel-message-new-course-plotted=Новый курс расчитан. +spaceship-travel-message-exiting-planet-gravity=Выходим из гравитационного колодца планеты +spaceship-travel-message-navigating-planet-gravity=Находимся в гравитационном колодце планеты +spaceship-travel-message-exiting-star-gravity=Выходим из гравитационного колодца звезды +spaceship-travel-message-navigating-star-gravity=Находимся в гравитационном колодце звезды +spaceship-travel-message-spatial-distortions=Находимся в пространственном искажении +spaceship-travel-message-navigating-interstellar=Находимся в межзвёздном пространстве +spaceship-travel-message-at-destination=В пункте назначения +spaceship-check-message-passed=Пройдено: целостность корабля в норме. +spaceship-check-message-failed-containment=Провалено: Потеря герметичности вокруг консоли. Убедитесь, что все борта корабля расположены на полах корабля без пробелов. +spaceship-check-message-failed-console-floor=Консоль должна быть помещена на полу космического корабля. +spaceship-check-message-failed-empty=Не найдено клеток, соединённых с корректно изолированной консолью. +spaceship-check-message-failed-unknown-bounds=Ошибка: Неизвестные границы космического корабля. +spaceship-check-message-failed-stress=Ошибка: Нагрузка на структурную целостность превышает технологический лимит. +spaceship-check-message-checking-console-floor=Проверка соединённости консольного пола. +spaceship-check-message-checking-containment=Проверка герметичности. +spaceship-check-message-checking-connectivity=Проверка соединений консоли. +spaceship-check-message-no-console=Нет консоли. +spaceship-check-message-did-not-complete=Проверка не завершена. +spaceship-check-message-unstable=Нестабильно: Некоторые секции отделятся при маневрировании. +spaceship-check-message-valid-but-disconnecting=Подходит, но нестабильно: секции отсоединятся. +spaceship-warning-sections-disconnecting=Секции отсоединяются. Остановитесь для ремонта. +page_space_exploration_text_1=Добро пожаловать в Исследование космоса (Space Exploration). В моде уже много всего, но он всё ещё имеет [font=default-bold]экспериментальный[/font] статус и находится в стадии активной разработки. Могут быть ошибки.\n\n[font=heading-2]Экспериментальный статус?[/font]\n\nИсследование космоса по-прежнему быстро меняется, и я все свое время вкладываю в разработку ключевых функций расширения совместимости мода. [color=red]Не рекомендуется играть с модами, отличными от требуемых и рекомендуемых.[/color]\n\nПока в экспериментальном статусе: если мод вызывает такие проблемы, как повреждение игры / файла сохранения, сбои, недопустимое дерево технологий или основной игровой процесс, он будет быстро помечен как несовместимый для защиты новых игроков. Это означает, что если вы используете много модов, более вероятно, что один из них может быть отмечен как несовместимый позже из-за проблемы, которую вы еще не обнаружили. Вы, конечно, можете редактировать свой файл info.json, чтобы попробовать несовместимые моды, но вы делаете это на свой страх и риск: если состояние вашей игры станет неиграбельным, в этом случае я не смогу вам помочь.\n\nПока в экспериментальном статусе: большинство других модов помечаются как несовместимые, если дерево технологий значительно нарушено, однако долгосрочное намерение состоит в том, чтобы заставить моды работать вместе, чтобы удовлетворить обоих разработчиков. Krastorio 2 является примером этой работы, которая уже давно ведётся.\n\nНекоторые дополнительные сведения, касающиеся совместимости модов, можно найти на вики-сайте Space Exploration. Если вы хотите помочь с совместимостью модов, свяжитесь с нами в Discord, но также имейте в виду, что это не будет высоким приоритетом до более поздних этапов разработки Space Exploration.\n\n[font=heading-2]Рекомендуемые моды[/font]\n\n • AAI Containers & Warehouses. Предоставляет вам несколько больших контейнеров, которые соответствуют "ванильной" теме.\n\n • Module Inserter. Позволяет вам вставлять модули в машины из спутникового режима.\n\n • Equipment Grid Logistic Module. Модуль для сетки оборудования транспорта, такого как Паукотрон, по запросу доставляет предметы из логистической сети и выбрасывает мусор.\n\n • Grappling Gun. Позволяет вам перепрыгивать через здания, озера и выходить из боя, если вас замедлили. В космосе вы можете вернуться на космическую платформу, если упадёте. Также позволяет садиться на космические корабли (особенно полезно, если они движутся).\n\n • Burner Leech. Это только для топливного этапа мода AAI.\n\n • Text Plates. Позволяет наносить текст на землю, что полезно для маркировки планет, станций, зон стыковки космических кораблей и т.д.\n\n • Even Distribution. Помогает в начале игры, когда вы вручную вставляете предметы в несколько зданий.\n\n • Walls Block Spitters. Помогает с защитой, когда вы за пределами планеты. Он немного усиливает врагов (скорость стрельбы), но это можно отключить с помощью опции мода. Стены дешевле ремонтировать, чем турели.\n\n • Bullet Trails, чтобы вы могли видеть, куда летят ваши пули или по каким орудиям стреляют. (Также выглядит лучше.)\n\n\n[font=heading-2]Рекомендуемые настройки[/font]\n\nВы ДОЛЖНЫ включить все тайлы ландшафта мода Alien Biomes, иначе игра будет сбоить на поздних стадиях.\n\nПоскольку игра длится дольше, чем обычно, рекомендуется начинать игру с низким коэффициентом эволюции врагов.\n\nВы не должны устанавливать высокие настройки ресурсов для своей стартовой планеты, если только вы не играете с ресурсоёмкими рецептами, такими как высокая сложность рецептов или режим марафона. Если ресурсы установлены слишком высоко, это уменьшит потребность в расширении на другие планеты.\n\n\n[font=heading-2]Полезные URL-адреса[/font]\n\nПосмотрите вики по Исследованию космоса здесь: https://spaceexploration.miraheze.org\n\nПолучите помощь или следите за развитием в Discord: https://discord.gg/ymjUVMv\n\nНа этот мод ушло более 2000 часов. Если вам это нравится, подумайте о поддержке меня на Patreon: https://www.patreon.com/earendel +menu_meteor_defence=[img=virtual-signal/se-meteor] Защита от метеоров +title_meteor_defence=Защита от метеоров +page_meteor_defence_text_1=Метеоры попадают в большинство зон через случайные промежутки времени. Вы можете изменить максимальный интервал между ударами в настройках мода.\n\nКоличество метеоров также случайно, 50% для 1, 25% для 2, 12,5% для 3, 6,25% для 4 и т.д.\n\nСтруктуры защиты от метеоров могут стрелять по метеорам. Они стреляют последовательно, поэтому более поздняя защита не сработает, если все метеоры будут уничтожены. Для защиты требуются боеприпасы, время зарядки и дополнительная мощность во время зарядки. Потребляемая мощность довольно высока, поэтому разумно сбалансировать риск и стоимость. +menu_coremining=[img=item/se-core-miner] Глубинное бурение +title_coremining=Глубинное бурение +page_coremining_text_1=Глубинное бурение может выполняться только на планетах и лунах. Каждая планета и луна могут давать различный тип фрагмента ядра в зависимости от того, что находится внутри. Nauvis дает баланс общих ресурсов, но другие места, как правило, дают в основном 1 тип ресурсов. Глубинные буры потребляют много энергии, но вы получаете часть энергии обратно из угля, нефти и урана.\n\nГлубинные буры используют много энергии, плюс каждый глубинный бур, который вы размещаете на планете, снижает эффективность других глубинных буров на той же планете. Они намного менее энергоэффективны, чем обычные буры, даже если у вас несколько запущенных, но у них никогда не заканчиваются ресурсы. На ранних этапах игры может быть полезно запустить 1 глубинный бур, когда у вас избыточная мощность. Если вы начнёте на крошечной планете, то солнечная энергия и глубинное бурение может быть вашим единственным способом получить достаточно ресурсов, чтобы покинуть планету.\n\nГлубинные буры поздней игры получают большую выгоду от бонусов производительности бурения. Лучше стремиться к нескольким бурам на многих планетах, чем к большому количеству на нескольких планетах. +menu_beacons=[img=item/se-wide-beacon-2] Маяки +title_beacons=Маяки +page_beacons_text_1=[font=heading-2]Перегрузка маяков[img=virtual-signal/se-beacon-overload][/font]\n\nПерегрузка маяков - это переработка механики маяка в Factorio. На сборочные машины может воздействовать только 1 маяк, если на них воздействует большее количество маяков, они перегружаются и приостанавливают производство.\n\nЭта переработка позволяет использовать больше модулей в маяках и способствует использованию более мощных модулей как в маяках, так и в сборщиках для получения максимальных бонусов. Это изменение также позволяет и продвигает более широкий диапазон дизайнов фабрик.\n\nБазовый маяк по отдельности намного мощнее, чем "ванильный" маяк, но не может складывать эффекты нескольких маяков на одной машине, поэтому максимальное усиление, которое вы можете обеспечить, меньше по сравнению с "ванильным". Более мощные маяки способны намного превосходить максимальное ускорение машины, доступное в "ванильной" игре.\n\nНачиная с Маяка большого охвата, игроки могут ощутить значительную экономию модулей, а также свободу создавать сложные конструкции, вращая большие здания или с несколькими входами жидкостей или материалов.\n\nМашины, на которые воздействуют более одного маяка, будут отмечены значком «Перегрузка маяка» и приостановят всё производство. Они по-прежнему будут потреблять минимальное количество энергии. +menu_launching_satellites=[img=item/satellite] Запуск спутников +title_launching_satellites=Запуск спутников +page_launching_satellites_text_1=Вы запустили [color=cyan]__1__[/color] спутников.\n\n[font=heading-2][img=virtual-signal/se-remote-view] Спутниковая навигационная система [__CONTROL__se-remote-view__][/font]\n\nКогда вы запускаете навигационный спутник в космос из спутниковой ракетной шахты, вы получаете доступ к [img=virtual-signal/se-remote-view] спутниковому обзору. Доступ к этому режиму можно получить с помощью клавиши [__CONTROL__se-remote-view__]. В спутниковом режиме ваша камера отделена от вашего персонажа, поэтому вы можете быстро просматривать карту и даже открывать новые области. Есть некоторые вещи, которые нельзя делать в спутниковом режиме, например, непосредственно размещать или убирать объекты. Тем не менее, вы можете многое сделать, например, использовать чертежи, планы сноса, разместить призрачные объекты, заказать соединения проводов, изменить рецепты машин, настройки комбинаторов и т.д.\n\n[font=heading-2][img=virtual-signal/se-planet-orbit] Атлас Вселенной [__CONTROL__se-universe-explorer__][/font]\n\nСеть навигационных спутников также позволяет вам просматривать другие поверхности, такие как другие планеты, луны, пояса астероидов, поля астероидов и орбиты. Нажмите [__CONTROL__se-universe-explorer__], чтобы открыть список известных зон. Если вы запустили спутник, вы можете нажать «Просмотр поверхности», чтобы увидеть, что там есть. Может быть полезно немного разведать планету, прежде чем пытаться туда полететь.\n\nЗапуск спутников также помогает обнаруживать зоны в системе, из которой они запускаются (подробнее см. Открытие зон).\n\n[font=heading-2][img=item/se-satellite-telemetry] Спутниковая телеметрия [/font]\n\nЗапуск спутника возвращает спутниковую телеметрию, жизненно важный компонент в [img=item/se-rocket-science-pack] Ракетостроении. +menu_pinned_locations=[img=se-pin-list] Отмеченные местоположения +title_pinned_locations=Отмеченные местоположения +page_pinned_locations_text_1=После разблокировки [img=virtual-signal/se-remote-view] Спутниковой Навигационной Системы вы получаете доступ к "Отмеченным местоположениям", инструменту для быстрого переключения между различными частями вашей фабрики на всех поверхностях, которые вы исследовали.\n\nМестоположения можно отметить с помощью кнопки "плюс" в окне "Навигационный спутник". Вы можете установить горячие клавиши для отмеченных местоположений при их добавлении или редактировании. Это позволяет вам быстро переходить к важным местоположениям нажатием кнопки на клавиатуре без необходимости проходить через Атлас Вселенной.\n\n[font=heading-2]Временные отметки[/font]\nОтмеченные местоположения не обязательно создавать во всплывающем меню создания отметки. Их также можно установить с помощью горячей клавиши «Установить отметку». Она создаёт отмеченное местоположение без названия или значка, но к нему можно немедленно перейти с помощью соответствующей горячей клавиши «Перейти к отметке».\n\n[font=heading-2]Все отметки[__CONTROL__se-remote-view-pins __][/font]\nОтметки отображаются на панели быстрого доступа только для текущей просматриваемой поверхности. Однако горячие клавиши могут использоваться для перехода к отметке на другой поверхности независимо от того, отображается ли она на панели быстрого доступа. Если вам нужен обзор всех отмеченных местоположений, нажмите [__CONTROL__se-remote-view-pins__], чтобы открыть список всех отметок. Он организован по рядам в зависимости от поверхности, на которой находятся отметки. Если поверхность имеет только одну отметку, её строка будет свернута в строку её родительской звезды.\n\n[font=heading-2]AAI Programmable Vehicles[/font]\nГорячие клавиши по умолчанию для установки и переключения на отмеченные местоположения конфликтуют с горячими клавишами по умолчанию для создания и выбора групп управления для программируемых транспортных средств AAI. Если вы используете оба мода, вам нужно будет настроить горячие клавиши, чтобы добиться ожидаемого поведения. +menu_zone_discovery=[img=virtual-signal/se-planet-orbit] Открытие зон +title_zone_discovery=Открытие зон +page_zone_discovery_text_1=В этой области космоса есть много звёзд, планет, лун, поясов астероидов и полей астероидов.\n\n[font=heading-2]Навигационный спутник[/font]\nВы можете запустить навигационный спутник, чтобы обнаружить случайную планету, луну или пояс астероидов в той же звёздной системе, в которой был запущен спутник. Если в этой системе больше нечего открывать, то вместо этого он может открыть новые звёзды, но не может обнаружить ничего, вращающегося вокруг других звезд, или чего-либо в глубоком космосе.\n\n[font=heading-2]Исследование открытия зон[/font]\nВы можете использовать космические телескопы для поиска новых зон. Это достигается с помощью исследования «Открытие зон». Базовое исследование обнаружения зоны может найти случайную звезду, планету, луну или пояс астероидов.\n\n[font=heading-2]Исследование обнаружения целевой зоны[/font]\nИсследование обнаружения целевой зоны такое же, как и базовое исследование, но если вы выбрали предпочтительный ресурс (см. ниже), оно будет исследовать в областях с большей вероятностью появления этого ресурса, поэтому вы с большей вероятностью обнаружите зону с этим ресурсом. Имейте в виду, что планету нельзя открыть, пока не откроете её звезду, и луну нельзя открыть до открытия её планеты. Не ждите, что каждый раз найдете то, что ищете.\n\n[font=heading-2]Исследование по обнаружению зоны глубокого космоса[/font]\nИсследование по обнаружению зоны глубокого космоса ищет только интересующие области в глубоком космосе и это единственный способ обнаружить поля астероидов. Поля астероидов - единственное место, где можно найти Наквитит. Исследование дальнего космоса не может быть нацелено на ресурсы.\n\n[font=heading-2]Предпочтение при обнаружении целевой зоны:[/font] +menu_cargo_rockets=[img=virtual-signal/se-cargo-rocket] Грузовые ракеты +title_cargo_rockets=Грузовые ракеты +page_cargo_rockets_text_1=Грузовые ракеты запускаются из Грузовой ракетной шахты, также известной как Стартовая площадка.\n\nВы запустили [color=cyan]__1__[/color] грузовых ракет.\n\nМодификатор потери груза основан на технологии: Максимальный процент потерь уменьшен на [color=cyan]__2__%[/color].\n\nМодификатор живучести вашей ракеты основан на технологии: Шанс потери снижен на [color=cyan]__3__%[/color].\n\nМодификатор возможности повторного использования вашей ракеты основан на технологии: [color=cyan]__4__[/color] +/- до 10 (максимум 100) деталей восстановлено.\n\n[font=heading-2]Начало работы[/font]\n\nПеред запуском грузовых ракет вам необходимо запустить спутник в ракете (стандартная ракетная шахта в "ванильной" Factorio), мод Space Exploration должен быть установлен.\n\nКак только вы построили грузовую ракетную шахту, вам нужно построить и заправить свою ракету:\n\n • 100 секций грузовой ракеты в инвентаре. 20 из них будут восстановлены из ракеты в пункте назначения, и больше при соответствующем исследовании.\n • 1 космическая капсула в инвентаре. Её всегда можно найти в пункте назначения, и вы сможете вернуться домой с орбиты.\n • Много жидкого ракетного топлива, заливающегося в одно из 8 соединений рядом по углам. Количество необходимого топлива зависит от радиуса планеты, с которой вы запускаете, и расстояния до пункта назначения. Если вы используете опцию пункта назначения «Любая посадочная площадка с названием», будет залито достаточно топлива для любого из допустимых пунктов назначения.\n\nВы можете войти в грузовую ракетную шахту через дверь спереди (нажав __CONTROL__toggle-driving__). Это позволит вам улететь на ракете. У вас также должен быть реактивный костюм и канистры с жизнеобеспечением, чтобы вы не умерли при попадании в космос.\n\nВашей первой ракете некуда будет приземлиться, поэтому она будет разобрана, как только груз будет выгружен. Иногда ракеты, нацеленные на посадочную площадку, не попадают в цель и ракета падает. Даже в случае аварии груз остаётся в грузовых отсеках, поэтому вы никогда не потеряете весь груз.\n\nВы должны взять с собой ракетную посадочную площадку и несколько строительных лесов космической платформы, чтобы вы могли построить где-нибудь площадку для следующей ракеты.\n\nЕсли вы построите ракетную посадочную площадку на своей базе перед запуском, вы сможете легко вернуться прямо туда, вместо того, чтобы оказаться в случайном месте, когда вы вернетесь.\n\n[font=heading-2]Пункты назначения[/font]\n\nПосле размещения посадочной площадки убедитесь, что вы обновили пункт назначения ракетной шахты на посадочную площадку, а не на случайную точку на орбите. Вы можете сделать это лично или с помощью Спутникового удаленного просмотра (горячая клавиша «N»). Однако ракеты не будут запускаться на посадочную площадку, содержащую предметы, поэтому обязательно опустошите её.\n\n[font=heading-2]Базовая автоматизация[/font]\n\nРакетная шахта выдает сигналы о количестве деталей, уже загруженных в ракету. Вы можете поставить условие для манипулятора [Секции грузовой ракеты < 100], чтобы убедиться, что он не заполнит ракету лишними секциями.\n\nЕсли вы настроили триггеры запуска на шахте, она запустится автоматически, но ракета не взлетит автоматически, если посадочная площадка не пуста (иначе груз может не поместиться).\n\n[font=heading-3]Входные сигналы[/font]\n\n[img=virtual-signal/signal-green] Зеленый сигнал: может инициировать запуск, если шахта настроена на запуск, который использует зеленый сигнал.\n\n[font=heading-3]Выходные сигналы[/font]\n\n[img=virtual-signal/signal-E] Сигнал E: пустые ячейки\n\n[img=virtual-signal/signal-F] Сигнал F: полные ячейки\n\n[img=virtual-signal/signal-L] Сигнал L: Жидкое ракетное топливо, необходимое для всех потенциальных пунктов назначения, указанных в настройке пунктов назначения.\n\n[img=virtual-signal/se-cargo-rocket] Сигнал грузовой ракеты: если ракета собрана (т.е. 1 капсула и 100 деталей ракеты), то возвращается значение 1.\n\n[img=item/se-space-capsule] Сигнал ракетной капсулы: любые капсулы, используемые в конструкции ракеты, добавляются к количеству капсул в грузовом инвентаре.\n\n[img=item/se-cargo-rocket-section] Сигнал секции грузовой ракеты: любые секции, используемые в конструкции ракеты, добавляются к количеству любых секций в грузовом инвентаре.\n\n[img=fluid/se-liquid-rocket-fuel] Сигнал жидкого ракетного топлива: общее количество жидкого ракетного топлива в шахте. +menu_delivery_cannons=[img=item/se-delivery-cannon] Доставочные пушки +title_delivery_cannons=Доставочные пушки +page_delivery_cannons_text_1=Доставочные пушки - это пушки-рельсотроны с межпланетным радиусом действия. Они предназначены для стрельбы прочными однородными ресурсами, способными выдержать внезапное ускорение. Они не могут стрелять сложными промышленными промежуточными компонентами или конструкциями.\n\nДоставочная пушка имеет только цель, она не имеет никакого представления о том, что находится в этой точке, и будет стрелять полезной нагрузкой, пока у неё есть энергия и заполненная доставочная капсула. Если вы хотите добавить условия к способности пушки стрелять, вам нужно ограничить способность пушки загружать ресурсы или капсулы.\n\nКогда капсула доставки приземляется на землю, она повреждает область и большая часть ресурсов уничтожается. Сундук доставочной пушки может безопасно поймать капсулу, пока сундук не полон. У вас может быть несколько пушек, стреляющих по одному и тому же сундуку с разными ресурсами.\n\nРекомендуется либо оставлять целевые сундуки пустыми, либо ограничить ввод пушек с помощью передачи сигнала.\n\nДоставочные пушки имеют энергоёмкость 1 ГДж и потребляют 50 МВт при зарядке. Дальность действия доставочной пушки ограничена количеством энергии, которое она может хранить. Стрельба в более отдалённые места требует больше энергии. Некоторым направлениям может потребоваться больше энергии, чем может хранить доставочная пушка, поэтому она никогда не будет стрелять в это место. Вы можете установить станцию ретрансляции с доставочной пушкой на полпути, чтобы отправлять груз в 2 этапа. +menu_lifesupport=[img=item/se-lifesupport-equipment-1] Жизнеобеспечение +title_lifesupport=Жизнеобеспечение +page_lifesupport_text_1=Жизнеобеспечение достигается с помощью оборудования для жизнеобеспечения и канистр жизнеобеспечения. Вам необходимо и то, и другое, чтобы выжить во враждебных условиях.\n\nОборудование жизнеобеспечения и канистры с расходными материалами могут быть изготовлены на фабрике жизнеобеспечения.\n\nКанистры жизнеобеспечения предоставляют ресурсы, необходимые системе для выполнения всех своих ролей, и расходуются постепенно. По мере того, как полоса жизнеобеспечения уменьшается, новые канистры потребляются прямо из вашего инвентаря.\n\nОборудование жизнеобеспечения помещается в оборудование брони, однако, если вы используете реактивный костюм, в него встроено одно средство жизнеобеспечения. Дополнительные элементы жизнеобеспечения, размещенные в решетке оборудования, увеличивают эффективность жизнеобеспечения. Если вы используете оборудование жизнеобеспечения в костюме без двигателя, оно защитит вас на враждебных планетах, но не защитит вас от космического вакуума.\n\n[font=heading-2]Враждебная среда[/font]\nВраждебная среда - это любая область, которая может нанести вред вашему телу, когда вы просто находитесь там. Оборудование жизнеобеспечения предназначено для защиты вас от этих опасностей, обеспечивая соответствующий уровень давления, кислород, воду, питание, терморегуляцию и радиационную защиту. Два основных типа враждебной среды:\n\nКосмос: для правильной работы системы жизнеобеспечения в вакууме требуется космический скафандр (реактивный костюм). Вы не можете использовать в космосе жизнеобеспечение от какого-либо другого типа брони, вы всё равно задохнётесь.\n\nПоверхность: на некоторых планетах и лунах могут быть такие опасности, как радиация, экстремальный холод, сильная жара или кислотная атмосфера, и для них требуется оборудование жизнеобеспечения. (Скоро появится). Планеты также требуют жизнеобеспечения, если используется определенное биологическое оружие (Чумные миры). Поддержку жизни в этих областях может обеспечить реактивный костюм или оборудование, помещённое в любую другую броню. +menu_space_sciences=[img=item/se-astronomic-science-pack-2] Космическая наука +title_space_sciences=Космическая наука +page_space_sciences_text_1=[img=item/se-rocket-science-pack] Первая космическая наука - это Исследовательский пакет ракетостроения. Его можно создать только в космосе, поэтому для его производства вам нужно установить небольшую космическую станцию. Исследовательский пакет ракетостроения и более поздние научные пакеты можно использовать только в космосе, поэтому вам нужно будет запустить и другие научные пакеты и поместить их в мощную лабораторию космических исследований.\n\n[font=heading-2]Специализированная наука[/font]\n\nЭто 4 специальные науки: астрономия, биология, энергия и материалы. Все они управляются данными и следуют процессу проведения экспериментов по сбору данных для суперкомпьютеров, чтобы построить всё более точную модель жизни, Вселенной и всего остального. Все они имеют примерно одинаковый технический уровень, поэтому вы можете выбрать свой порядок развития, однако каждый из них в какой-то степени требует определенного ресурса, поэтому взгляните на свою солнечную систему, прежде чем решать, какую науку исследовать в первую очередь.\n\n[img=item/se-astronomic-science-pack-4] Астрономическая наука сосредоточена в основном на космической логистике.\n\n[img=item/se-energy-science-pack-4] Наука об энергии в основном связана с производством энергии, передачей энергии и высокотехнологичными гаджетами.\n\n[img=item/se-material-science-pack-4] Материаловедение больше ориентировано на тяжелую промышленность и прямые обновления.\n\n[img=item/se-biological-science-pack-4] Биологическая наука сосредоточена на улучшении персонажа, медицине, жизнеобеспечении, биологическом оружии и производительности.\n\n[font=heading-2]Наука о глубоком космосе[/font]\n\n[img=item/se-deep-space-science-pack-1] Наука о глубоком космосе сосредоточена на исследовании межзвёздной пустоты, антивещества и деформирующегося пространства-времени. +menu_energy_beams=[img=item/se-energy-transmitter-emitter] Энергетические лучи +title_energy_beams=Энергетические лучи +page_energy_beams_text_1=[font=heading-2]Выбросы корональной массы[/font]\nЗвёзды в этой области часто выбрасывают опасные потоки частиц. Планета или луна нередко попадают в один из этих потоков частиц. Если у вас есть большая база на поражаемой поверхности, вам следует эвакуировать, диверсифицировать или рассредоточить свои активы или построить средство защиты "Зонт" с большим резервом энергии. Если у вас небольшая база, она, скорее всего, останется невредимой. Если поверхность находится под угрозой, предупреждение будет сделано как минимум за 4 часа. Известные угрозы будут перечислены ниже. +page_energy_beam_warning_text=[img=virtual-signal/se-star] Предупреждение: выброс корональной массы направлен на __1__.\nРасчётные требования к защите: __3__ ГВт пиковая мощность, __4__ ГДж на 120 секунд. Расчётное время прибытия: __2__. +page_energy_beams_text_2=[font=heading-2]Зонт: Защита от энергетического луча[/font]\nСредство защиты от энергетического луча, «Зонт», может защитить от выброса корональной массы и космического оружия с использованием энергетического луча. Он работает, поднимая магнитные частицы в защитный пузырь, затем перестраивает и собирает частицы по мере необходимости для рассеивания враждебных энергетических лучей. Единственное требование для работы - это энергия, базовая мощность составляет 10 МВт, но увеличивается в зависимости от силы атакующих лучей. Для защиты от выбросов корональной массы требуется только 1 объект на поверхность, от оружия с энергетическими лучами 1 Зонт может защитить от атакующей мощности до 500 ГВт. Ожидается, что для выброса корональной массы базовая потребляемая мощность для планеты радиусом 5000 и 100% солнечной энергии составит около 160 ГДж за 2 минуты с пиковой потребляемой мощностью 2 ГВт на отметке в 1 минуту. Требуемая мощность увеличивается или уменьшается с множителем солнечной энергии зоны, а для твёрдых тел она увеличивается или уменьшается в зависимости от радиуса относительно базового радиуса 5000. Для луча энергии от Излучателя энергетического луча требования к мощности, как ожидается, будут равны 1/10 мощности луча энергии на цель (после потери эффективности).\n\n[font=heading-2]Пуск энергетических лучей[/font]\nИзлучатель энергетического луча может посылать энергию на различные поверхности. Он может делать это двумя основными способами: либо как способ снабдить энергией удаленную поверхность, «Энергия», либо как режущее лучевое оружие, «Глефа». В режиме «Глефа» луч непрерывно повреждает область, но может перемещаться по целевой поверхности, прорезая путь. Степень повреждения, площадь и скорость луча увеличиваются в зависимости от энергии, вложенной в луч. Режим «Авто-Глефа» имеет автономный выбор цели.\n\nИзлучатель энергетического луча имеет 4 точки подключения, к которым могут подключаться камеры энергетического луча. Камеры могут соединяться в длину или иметь длинный край, соприкасающийся в середине с коротким краем, но не могут соединяться напрямую бок-о-бок. Инжекторы энергетических лучей прикрепляются непосредственно к бокам камер энергетических лучей. Каждый инжектор энергетического луча увеличивает мощность подключенного излучателя энергетического луча. Чтобы принять мощность от луча, вам понадобится приёмник энергетического луча на поверхности цели, выберите его в качестве цели, используя указатель на излучателе. Как только луч будет иметь приёмник в качестве цели, приёмник нагреется. Тепло может отбираться от боковых тепловых соединений для питания теплообменников и турбин. +menu_spaceships=[img=virtual-signal/se-spaceship] Космические корабли +title_spaceships=Космические корабли +page_spaceships_text_1=Космические корабли - это огромные мощные транспортные средства, которые могут запускать в космос множество упакованных структур, предметов и игроков, а затем летать по Солнечной системе и приземляться на другие поверхности.\n\n[font=heading-2]Конструкция космического корабля[/font]\nКосмические корабли состоят из множества плиток и более мелких компонентов, которые соединяются друг с другом, чтобы создать космический корабль вашей собственной конструкции. Вы проектируете космический корабль почти как миниатюрную передвижную базу.\n\nНачните с плана пола космического корабля. Не стройте слишком больших размеров, так как ваши первые несколько космических кораблей будут иметь строгие ограничения по размеру, которые можно расширить путем исследования. Разместите стены космического корабля по краям, чтобы сделать переборки, и убедитесь, что нет зазоров (включая диагонали). Поместите консоль космического корабля где-нибудь внутри, это основная часть космического корабля и пульт управления им. Когда консоль размещена, есть несколько импульсов, по которым консоль определяет, какие части правильно прикреплены, какие части правильно упакованы и что отвалится, если вы попытаетесь взлететь. Если какие-либо квадраты мигают красным, это значит, что есть проблема с вашей конструкцией, которую вы можете диагностировать, проверив консоль космического корабля. Вам также понадобится резервуар ракетного ускорителя и ракетный двигатель космического корабля. Резервуар ускорителя - это то, что хранит топливо, необходимое для полета в космос, и обеспечивает этапы вертикального взлета и посадки. Ракетные двигатели предназначены для более медленного полёта в космосе, чтобы доставить вас к месту назначения. Также рекомендуется какая-либо форма защиты спереди (всегда сверху), потому что туманность, в которой вы находитесь, полна обломков.\n\n[font=heading-2]Структурная нагрузка[/font]\nВначале вы будете очень ограничены размером космического корабля из-за пределов структурных напряжений вашего технологического уровня. Дополнительные технологии позволяют строить космические корабли большего размера. Структурная нагрузка рассчитывается в 2 частях: A. Размер корабля. Б. Грузоподъемность корабля. Общая структурная нагрузка равна тому, какой из факторов напряжения больше, два значения не суммируются.\n\n[font=heading-2]Обтекаемость[/font]\nЭта область космоса находится в пылевой туманности. Если вы оптимизируете обтекаемость своего космического корабля, вы сможете увеличить его максимальную скорость примерно на 30%. Следует избегать создания плоской передней части, но не нужно делать клин. До 1/3 передней части вашего космического корабля может быть плоской без штрафа. Округлые формы тоже подойдут. Вы можете вручную запустить проверку целостности, чтобы увидеть, каков уровень обтекаемости.\n\n[font=heading-2]Скорость[/font]\nСкорость корабля зависит от тяги двигателей и веса корабля (приближен к структурной нагрузке). Двигатели могут быть размещены внутри или на обшивке корабля, но двигатели в задней части корабля с пустым пространством позади них более эффективны (улучшение примерно на 25%).\n\n[font=heading-2]Дальние перевозки[/font]\nЧто касается дальних путешествий, стоит отметить, что вы можете многое сделать в спутниковом режиме, пока ваше тело находится в пути. Вы также можете отдавать приказы космическим кораблям удалённо через спутниковый канал связи.\n\n[font=heading-2]Сборочные автоматы[/font]\n[color=#ffaaaa] Предупреждение. Сборочные автоматы, предназначенные только для космоса, смогут использовать рецепты, общие для других наземных структур, если космический корабль находится на суше. Если космический рецепт установлен во время приземления космического корабля, ингредиенты будут потеряны. Некоторые наземные сборочные автоматы могут работать в космосе, но потеряют возможность использовать модули производительности в космосе. Если космический корабль запускается с модулями производительности на этих машинах, модули производительности уничтожаются.[/color]\n\n[font=heading-2]Сигналы космического корабля[/font]\nВерхняя правая часть консоли космического корабля может быть подключена сигнальными проводами отдельно от основной конструкции, так как она выводит свои собственные сигналы:\n[img=item/se-spaceship-console] Число сигнала консоли указывает ID космического корабля.\n[img=virtual-signal/signal-speed] Число сигнала скорости указывает скорость космического корабля: -1, если он остановлен, -2, если стоит на якоре.\n[img=virtual-signal/signal-distance] Сигнал расстояния указывает расстояние до выбранного пункта назначения: -1, если прибыл, -2, если стоит на якоре, -3, если пункт назначения не задан.\n[img=virtual-signal/se-planet-orbit] Четвертый сигнал указывает текущий пункт назначения, если он есть.\n[img=virtual-signal/signal-A] Если космический корабль поставлен на якорь, тогда он указывает идентификатор якорной зоны с помощью сигнала A.\n\n[font=heading-2]Автоматизация космического корабля[/font]\nОсновная структура консоли может принимать входные сигналы:\n[img=virtual-signal/signal-speed] Сигнал скорости устанавливает целевую скорость и включает двигатели. Отрицательный сигнал вместо этого останавливает двигатели.\n[img=virtual-signal/se-spaceship-launch] Сигнал запуска космического корабля производит запуск.\n[img=virtual-signal/se-planet-orbit] Сигнал пункта назначения устанавливает пункт назначения (вы можете увидеть сигнал зоны на боковой панели Атласа Вселенной после того, как построите космический корабль).\nПримечание: консоль космического корабля не принимает сигналы [img=virtual-signal/se-spaceship-launch] запуска или [img=virtual-signal/signal-speed] скорости до тех пор, пока игрок вручную не запустит и не задействует корабль хотя бы один раз. Это сделано для предотвращения случайного запуска спроектированных космических кораблей, когда они все еще строятся дронами.\n\nЧтобы заставить космический корабль приземлиться, на консоль должна быть подана пара сигналов заякоривания, либо [img=virtual-signal/se-anchor-using-left-clamp] «заякорить с помощью левого зажима» с [img=virtual-signal/se-anchor-to-right-clamp] «заякорить к правому зажиму» или [img=virtual-signal/se-anchor-using-right-clamp] «заякорить с использованием правого зажима» с [img=virtual-signal/se-anchor-to-left-clamp] «заякорить к левому зажиму». Значения сигналов должны совпадать со значениями зажима на судне и зажима в пункте назначения. Вы можете увидеть и изменить эти значения, открыв пользовательский интерфейс зажима. Если совпадение найдено, то корабль попытается приземлиться с двумя соединенными зажимами. Используйте с осторожностью. +menu_arcospheres=[img=item/se-arcosphere-a] Аркосферы +title_arcospheres=Аркосферы +page_arcospheres_text_1=Аркосферы - это почти идеальные сферы из нанотехнологического кристалла наквия. Они неизвестного происхождения, но чаще всего их можно найти плавающими глубоко в межзвёздном пространстве.\n\nКаждая из них охватывает сверхмерный узел в пространстве-времени и позволяет вам взаимодействовать с небольшим 4-м пространственным измерением. Сферы можно поляризовать, для того чтобы они могли управлять определёнными аспектами пространства-времени, если их перемещать относительно друг друга. Наборы определённых аркосфер могут использоваться для деформации и переплетения пространства-времени в более высокие измерения.\n\n[font=heading-2]Использование[/font]\nАркосферы - это самая уникальная производственная задача в игре. Они используются как инструменты в рецептах, но никогда не уничтожаются, а только изменяются. Основная особенность при их использовании - это циклическое переключение между сферами, которые у вас есть, так что у вас не закончится определенный тип. Есть много способов сбалансировать производство, но несколько комбинаторов могут очень помочь. Если вы застряли, попросите подсказок на Discord или найдите дополнительную информацию в вики по моду Исследование космоса.\n\n[font=heading-2]Собирание[/font]\nАркосферы можно найти, запустив сборщик Аркосфер в поле астероидов. Повторные запуски имеют убывающую результативность. Вы можете получить лучшую отдачу, запустив сбор с разных полей астероидов. +page_arcospheres_text_deep=Аркосфер найдено в глубокой межзвёздной пустоте: [color=cyan]__1__[/color], сборщиков запущено: __2__. +page_arcospheres_text_zone=Аркосфер найдено около __1__: [color=cyan]__2__[/color], сборщиков запущено: __3__. +menu_exploration_journal=[img=item/se-thruster-suit] Журнал исследования +title_exploration_journal=Журнал исследования +page_journal_title_backstory=Проснулся не на той стороне огненного шара +page_journal_text_backstory=Я потерпел крушение на незнакомой планете, вокруг меня горели части небольшого корабля. Моё тело было в синяках, царапинах и подпалинах, но ничего серьёзного. Моя черепно-мозговая травма была явно более серьёзной, сильная головная боль и ослепляющий свет. Что ещё хуже, я не мог вспомнить, как я сюда попал, или даже кем я был, кроме имени и смутного ощущения цели... построить. Но кроме этого, я не мог вспомнить, что строить и как. Сначала я думал, что моя голова была повреждена в аварии, и воспоминания вернутся, но этого не произошло. Тот факт, что мои журналы данных также были пустыми или переформатированными, заставил меня задуматься над другими объяснениями. +page_journal_title_satellite_launch=Глаз в небе +page_journal_text_satellite_launch=Мне удалось запустить спутник на орбиту. Это важная веха, которую стоит отметить, но предстоит ещё многое сделать. Это только начало. +page_journal_title_cargo_launch=Бесконечность не предел +page_journal_text_cargo_launch=Теперь я могу запустить себя в космос. Я больше не привязан к этой скале, которую назвал своим домом. Небеса манят. +page_journal_title_entered_vault=Охота за реликвиями +page_journal_text_entered_vault=Я вошел в пещеру под выступом пирамиды на __1__ и нашел тёмную и опасную комнату. В зале стояли два древних картуша, один большой, а другой маленький. У них обоих было несколько символов на поверхности, а также другие круги и линии. Глиф в центре большого картуша казался наиболее важным в информации, которую пыталась передать система. Какой бы ни была информация, её формат отличается от всего, что я видел. Позади картушей был какой-то приподнятый цилиндр с мощным устройством, которое я могу использовать в качестве модуля. Модули такого качества настолько ценны, что стоит попытаться найти побольше таких конструкций. Возможно, пора заняться археологией. +page_journal_title_found_gate=Аномалия +page_journal_text_found_gate=В аномалии был обнаружен какой-то огромный артефакт в форме кольца. Две вещи сразу бросаются в глаза даже издали: 1. Он древний. 2. Технология полностью отличается от моей. Что бы это ни было, теперь оно уничтожено. +page_journal_title_found_gate_ship=Корабль аномалии +page_journal_text_found_gate_ship=В аномалии возле кольцевого артефакта была обнаружена часть довольно большого заброшенного космического корабля. Технология корабля похожа на мою, но немного более... доработана. В любом случае, технология явно отличается от технологии кольца. Рисунок обломков создает впечатление, что он был разрезан пополам и/или столкнулся с кольцевой структурой. Стоит собрать всё, что возможно. +page_journal_title_found_gate_ship_authenticated=Аутентификация корабля аномалии +page_journal_text_found_gate_ship_authenticated=Заброшенный корабль в аномалии просканировал меня и «подтвердил мою биоподпись». Я не знаю, означает ли это, что в нём каким-то образом есть запись обо мне, или, может быть, просто любой случайный кибернетический человек достаточно хорош по сравнению с кусаками и роботами-убийцами. В сообщении говорилось, что код доступа к шлюзу судна - 2236067964. Судовые журналы доступны, но большие разделы отсутствуют или повреждены. +page_journal_title_found_gate_ship_log=Журнал корабля аномалии +page_journal_text_found_gate_ship_log_intro=Demodamas 82B: передовой строительный крейсер AAI Hypernet. Содержание судового журнала: +page_journal_text_found_gate_ship_log=...'? номинальный.\nПредупреждение о доступе: AAI Thyris Gate 17: Межгалактический прототип v0.1.93 является засекреченным объектом. Требуется аутентификация AAI на уровне L90 или выше. Пройдите аутентификацию немедленно, иначе будете уничтожены.\nЖурнал доступа: доступ к AAI Thyris Gate 17 с аутентификацией с использованием учетных данных Кибернетический Инженер AAI Hypernet L97 ID__1__.\nЖурнал доступа: Начин¶Oata^...\n...'?ris Gate 17 проектор 8 - частота заблокирована. Энергия на безопасном уровне 216%. Стабильность сингулярности: 99,4%.\nНавигационный журнал: AAI Thyris Gate 17 преобразован в вектор проекции [SV __2__]. Прогнозируемая цель: Галактика Wube > Фенестра (аномалия, не исследована). Аутентифика¶Oata^...\n...'?вигационное предупреждение: Межгалактическая гипертрубка (переопределено).\nНавигационное предупреждение: в пункте назначения нет известных гиперврат (переопределено).\nПредупреждение о страховании: нет договора страхования. Доступные контракты: 0.\nПримечание ИнформаТрона: нет доступных договоров страхования с условием: «материализация без врат». Вы уверены, что это безопасно? [ответить.игнорировать.игнорировать_всегда]\nПутевой журнал: вход в аномалию Thyris > Гипертрубка AAI Thyris Gate 17 выровнена с [SV __2__].\nПутевой журнал: прыжок к гипертрубке [SV __2__] заверш¶Oata^...\n...'?вой журнал: Обновление местоположения: Гипертрубка рядом с аномалией Thyris, выравнивание [SV __2__], стабильность на 98%, диаме¶Oata^...\n...'?вой журнал: Выход из гипертрубки в неисследованном месте аномалии Фенестра.\nПредупреждение: неожиданное столкновение, пересечение с неизвестным объектом [4ae4c8d28f2], начало сканирования объекта [4ae4c8d28f2].\nЖурнал повреждений: 13,2% повреждений. Источник: Ущерб от удара в результате столкновения с неизвестным пересекающимся объектом [4ae4c8d28f2].\nЖурнал повреждений секций: Секции, сообщающие о повреждениях: A5, A6, A9, B6, B7, B8, C7. Не отвечающие секции: A7, A8. (Достоверность 86%)\nЖурнал кибернетических инженеров: Признаки жизни 99%. (Достоверность 34%)\nПутевой журнал: попытка маневра уклонения RS100LT30.\nПутевой журнал: выход из гипертрубки завершен с ошибками.\nПутевой журнал: обновление локации: неисследованная аномалия Фенестра.\nЖурнал сканирования: завершено сканирование объекта [4ae4c8d28f2], ясность 0,002 кв.м. на расстоянии -48,76 м (достоверность 99,9%).\nПодробный журнал сканирования: [4ae4c8d28f2] Масса 92,5¶Oata^...\n...'?оверность).\nПодробный журнал сканирования: [4ae4c8d28f2] Состав: Искусственный. 34% Наквий, 29% Холмий, 37% неизвестных композитов (достоверность 89%).\nПодробный журнал сканирования: [4ae4c8d28f2] Размер: Приближённо цилиндр 68¶Oata^...\n...'?ал сканирования: [4ae4c8d28f2] Энергетическая сигнатура: поток 54 ГВт, профиль излучения 2,8 кДж / 1,7 МДж / 1,6 МДж / 0,62 Дж, профиль светимости 5,86 ГДж [051e376392b8d3f8]. (Достоверность 98%).\nПодробный журнал сканирования: [4ae4c8d28f2] Идентификатор: искусственная конструкция, производитель неизвестен, описание: приблизительное кольцо с узелками, восьмигранник. (Достоверность 0,3%).\nПодробный журнал сканирования: [4ae4c8d28f2] Оценка возможностей конструкции: Гиперврата (достоверность 47%). Другое: оружие 42%, энергия 35%, вычисления 17%, сканирование 12%, промышленность 9%, космический корабль 7%, среда обитания 2%.\nЖурнал повреждений: 68,2% урона. Нарушение целостности, отсоединяются секции. Источник: Вторичные ударные волны из-за столкновения с объектом [4ae4c8d28f2].\nЖурнал повреждений секций: Критическое состояние реактора. Секции, сообщающие о повреждениях: D5, E4, E5, E6, F5. Секции не отвечают: A1, A2, A3, A¶Oata^...\n...'?ал повреждений: Аварийная отстыковка разведывательного шаттла 2. Прогноз траектории: Calidus > Nauvis.\nЖурнал повреждений: 91,7% повреждений. Нарушение целостности, секции пiО|в|\Р... +page_journal_title_spaceship_victory=Победа: Космический корабль +page_journal_spaceship_victory=Я построил чрезвычайно быстрый и мощный космический корабль и активировал варп-двигатель. Потребовалось 60 секунд, чтобы двигатель стабилизировался до практического сверхсветового состояния, но как только это произошло, я смог войти в криосон для последующего путешествия домой, в далёкую-далёкую галактику. Я оставляю позади автономную межзвёздную империю, построенную с нуля моей собственной рукой. Мое наследие в этом пространстве будет жить. +page_journal_title_gate_victory=Победа: Древние врата +page_journal_gate_victory=Огромный артефакт-кольцо, древние межгалактические врата, в конце концов был отремонтирован, насколько я мог. Приложив тяжёлые приспособления и изобретательность, мне наконец удалось заставить его работать. Я привязал поле искажения к местным звёздам, декодировал нечисловую систему координат глифа и реконструировал систему набора номера. Я чувствую себя искажённым такими инопланетными концепциями, но это работает, и я наконец-то сделал портал домой. Поездка домой, в далёкую-далёкую галактику, заняла всего мгновение. Я оставляю позади автономную межзвездную империю, построенную с нуля моей собственной рукой. Моё наследие в этом пространстве будет жить. +menu_archeology=[img=entity/se-pyramid-a] Археология +title_archeology=Археология +page_archeology_text_1=Я начал искать больше больших геометрических структур. Спутники нашли [color=cyan]__1__[/color] подходящих форм на следующих планетах: +page_archeology_text_2=Щёлкните на записи для просмотра через спутник. +menu_starmapping=[img=technology/se-zone-discovery-random] Картографирование звёзд +title_starmapping=Картографирование звёзд +page_starmapping_text_1=Картографирование звёзд достигается путем многократного исследования технологии: [img=technology/se-long-range-star-mapping] [color=cyan]Картографирование отдалённых звёзд[/color]. Это исследование ищет интересные образцы звёзд в других галактиках. Есть ли в этом практическая польза? Вероятно, нет.\n\nКоординаты даны в стандартном векторном формате (SV), выровненном на основе космического фонового излучения.\n\nВы уже нанесли на карту [color=cyan]__1__ [/color] заметных областей. +technology-unlocked=Разблокирована новая технология в дереве технологий. __1__ __2__ +universe-resources-changed-warning=[img=utility/danger_icon] [color=red]Все ресурсы были скорректированы в соответствии с новыми настройками. Это деструктивный процесс. Если это было вызвано обновлениями мода, это неизбежно. Если это было вызвано случайным добавлением или удалением модов, не сохраняйте игру.[/color] +starmapping-found-constellation=Отмечено далёкое созвездие __1__, координаты сохранены в [img=virtual-signal/informatron] Информатрон. +starmapping-found-constellation-informatron=[font=heading-1]__1__[/font] по координатам [SV __2__] +gate-portal-coordinates=Анализ вектора искажения: [SV __1__] +discovered-glyph-vault=[img=item/satellite] Навигационный спутник: Обнаружена геометрическая структура на __1__. +beacon-overload=Перегрузка маяка +beacon-overload-ended=Перегрузка маяка завершилась +lifesupport_title=[img=item/se-lifesupport-equipment-1] Жизнеобеспечение +lifesupport_efficiency_spacesuit=Эффективность жизнеобеспечения: __1__ +lifesupport_efficiency_no_spacesuit=Эффективность жизнеобеспечения: __1__ (0% в космосе). +lifesupport_suit=Продолжительность жизнеобеспечения костюма: __1__ с +lifesupport_reserves=Запас жизнеобеспечения в инвентаре: __1__ с +lifesupport_suit_est=Продолжительность жизнеобеспечения костюма: __1__ с (в космосе) +lifesupport_reserves_est=Запас жизнеобеспечения в инвентаре: __1__ с (в космосе) +lifesupport_environment_space=Окружающая среда: космос +lifesupport_environment_spaceship-interior=Окружающая среда: космический корабль (жизнеобеспечение не требуется) +lifesupport_environment_planet=Окружающая среда: планета (жизнеобеспечение не требуется) +lifesupport_environment_moon=Окружающая среда: луна (жизнеобеспечение не требуется) +lifesupport_environment_plague-planet=Окружающая среда: чумная планета +lifesupport_environment_plague-moon=Окружающая среда: чумная луна +lifesupport_environment_unknown=Окружающая среда: защищённая +player_track_glyphs=[img=item/satellite] Укажите спутникам искать похожие структуры. +page_archeology_pyramid_link=[img=entity/se-pyramid-b] Обнаружена геометрическая структура на __1__ __2__. +discovery_look_for_resource_caption=__1__\n__2__ +discovery_look_for_resource_tooltip=Сосредоточьте усилия по поиску этого ресурса. +comma_separate=__1__, __2__ +placement_restriction_line=[font=default-bold][color=#f5cb48]Невозможно разместить на: __1__[/color][/font]\n__2__ +collision_mask_water=Вода +collision_mask_land=Земля +collision_mask_space_platform=Космическая платформа +collision_mask_spaceship=Космический корабль +structure_name_grounded=__1__ (на земле) +structure_name_spaced=__1__ (в космосе) +structure_description_grounded=__1__\n[color=#ff0000]Некоторые рецепты недоступны, пока на земле.[/color] +structure_description_spaced=__1__\n[color=#ff0000]Невозможно использовать продуктивность в космосе.[/color] +cannot-open-nav-view-in-editor=Просмотр со спутника не может быть открыт в режиме редактора. +tile_warning=[color=red]Изменение клеток под объектами может удалить объект.[/color] +please-consider-patreon=[font=heading-1]Вам нравится Исследование космоса? Подумайте о поддержке меня на Patreon: [color=#f5cb48]https://www.patreon.com/earendel[/color][/font]\nПоддержавшие могут добавить в игру планету или луну на основе их собственного дизайна. +delivery_cannon_label_energy=Энергия: __1__ +delivery_cannon_label_payload=Полезный груз: __1__ +delivery-cannon-coordinates-set=Координаты доставки [X:__1__ Y:__2__]. Нажмите [__CONTROL__se-remote-view__] для выхода из спутникового режима. +unit-capsule=Капсула (__1__) +climate_water_none=Безводный +climate_water_low=Лужи +climate_water_med=Озёра +climate_water_high=Моря +climate_water_max=Океан +climate_moisture_none=Пустыня +climate_moisture_low=Бесплодный +climate_moisture_med=Влажный +climate_moisture_high=Сырой +climate_moisture_max=Насыщенный +climate_aux_very_low=Землеподобный +climate_aux_low=Необычный +climate_aux_med=Разноцветный +climate_aux_high=Эксцентричный +climate_aux_very_high=Экзотический +climate_temperature_bland=Мягкая +climate_temperature_temperate=Умеренная +climate_temperature_midrange=Средняя +climate_temperature_balanced=Тепло и прохладно +climate_temperature_wild=Горячо и холодно +climate_temperature_extreme=Огонь и лёд +climate_temperature_cool=Прохладно +climate_temperature_cold=Холодно +climate_temperature_vcold=Очень холодно +climate_temperature_frozen=Заморожено +climate_temperature_warm=Тепло +climate_temperature_hot=Горячо +climate_temperature_vhot=Обжигающе +climate_temperature_volcanic=Вулканическая +climate_trees_none=Без деревьев +climate_trees_low=Кустарники +climate_trees_med=Заросли +climate_trees_high=Деревья +climate_trees_max=Леса +climate_cliff_none=Равнина +climate_cliff_low=Плавная +climate_cliff_med=Холмистая +climate_cliff_high=Каньоны +climate_cliff_max=Горы +climate_homeworld=Родной мир (свой климат) +energy_transmitter_gui_title=[img=entity/se-energy-transmitter-emitter] Энергетический луч +energy_transmitter_label_transfer=Мощность излучателя: __1__ +energy_transmitter_label_efficiency=Эффективность передачи: __1__ +energy_transmitter_label_efficiency_atmo=Эффективность передачи: __1__ (-50% из-за атмосферы) +energy_transmitter_label_off=Выкл +energy_transmitter_tooltip_off=Выключить луч +energy_transmitter_label_energise=Энергия +energy_transmitter_tooltip_energise=Передаёт энергию в приёмник энергетического луча +energy_transmitter_label_glaive=Глефа +energy_transmitter_tooltip_glaive=Луч, который может быть нацелен и двигаться. Повреждения и скорость зависят от энергии. +energy_transmitter_label_auto_glaive=Авто-Глефа +energy_transmitter_tooltip_auto_glaive=Луч, который нацеливается и уничтожает автоматически. Повреждения зависят от энергии. +energy-transmitter-coordinates-set=Координаты луча [X:__1__ Y:__2__]. Нажмите [__CONTROL__se-remote-view__] для выхода из режима спутника. +energy-transmitter-no-enemies-found=Авто-Глефа не обнаружила врагов. Излучатель __1__ отключается. +alert-cme-eta=[img=virtual-signal/se-star] Предупреждение: выброс корональной массы направлен на __1__. Расчётное время прибытия: __2__.\nСмотрите "Энергетические лучи" в [img=virtual-signal/informatron] Информатроне [__CONTROL__informatron__] для подробной информации. +alert-cme-arrived=[img=virtual-signal/se-star] [color=red]Предупреждение: Выброс корональной массы достиг __1__[/color] +alert-cme-stream=[img=virtual-signal/se-star] Обнаружен выброс корональный массы __1__ +alert-cme-passed=[img=virtual-signal/se-star] Выброс корональной массы завершён. +no-coordinates-set=Координаты не заданы. +satellite-required=Требуется спутник. +probe_invalid_launch_star=Неверное место запуска: [img=item/se-star-probe] Звёздный зонд должен быть запущен с ближней солнечной орбиты. +probe_invalid_launch_belt=Неверное место запуска: [img=item/se-belt-probe] Астероидный зонд должен быть запущен из пояса астероидов. +probe_invalid_launch_field=Неверное место запуска: [img=item/se-void-probe] Зонд межзвёздной пустоты должен быть запущен из поля астероидов. +arcosphere_collector_invalid_launch=Неверное место запуска: [img=item/se-arcosphere-collector] Зонд межзвёздной пустоты должен быть запущен из поля астероидов. +charge-mode-fast=Режим быстрой зарядки: потребление во время ожидания уменьшено, максимальное потребление увеличено, ёмкость буфера увеличена. Следите за скачками мощности. +charge-mode-normal=Обычный режим зарядки: максимальное потребление уменьшено, потребление во время ожидания увеличено, ёмкость буфера уменьшена. +menu_coordinate_logs=[img=entity/se-glyph-a-energy-47] Журналы координат +title_coordinate_logs=Журналы координат +page_coordinate_logs_text_1=История последовательностей глифов, опробованных в артефакте, с соответствующими координатами в порядке убывания (верхняя запись - самая последняя).\n\nКоординаты даны в формате стандартного вектора (SV), выровненные на основе космического фонового излучения. +page_coordinate_logs_button_clear_caption=[img=virtual-signal/se-remove] Очистить журнал +page_coordinate_logs_text_empty=Журнал координат успешно очищен. +page_coordinate_logs_glyph_entry=__1__: SV +victory-message-spaceship=[font=heading-1]Двигатель искажения нексуса достиг критической скорости (250).\n[color=#f5cb48]Поздравляем, вы выполнили условие победы в Исследовании космоса: Космический корабль![/color][/font]\nЕсли вам понравилась поездка, пожалуйста, поддержите меня на Patreon: [color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-spaceship-player=[color=#f5cb48]Победа: Космический корабль.[/color] Ваш [img=virtual-signal/informatron] Журнал исследования [__CONTROL__informatron__] обновлён. +victory-message-gate=[font=heading-1]Портал стабилен и ведёт обратно домой.\n[color=#f5cb48]Поздравляем, вы выполнили секретное условие победы в Исследовании космоса: Древние врата![/color][/font]\nЕсли вам понравился этот уникальный путь открытий, пожалуйста, поддержите меня на Patreon: [color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-gate-player=[color=#f5cb48]Победа: Древние врата.[/color] Ваш [img=virtual-signal/informatron] Журнал исследования [__CONTROL__informatron__] обновлён. +arcosphere-random=Этот рецепт время от времени будет переключаться на альтернативный рецепт с таким же названием. Выходные аркосферы эффективно рандомизируются, но количество выходящих аркосфер гарантированно совпадает с входящими. +ruin=Руины +mysterious-structure=Таинственная структура +interburbulator_fail_easy_1=Нет. +interburbulator_fail_easy_2=Старайся. +interburbulator_fail_easy_3=Безнадёжно. +interburbulator_fail_easy_4=Не-а. +interburbulator_fail_easy_5=Думаешь, это сработает? +interburbulator_fail_easy_6=Неправильно. +interburbulator_fail_easy_7=Ниже 02? +interburbulator_fail_easy_8=Отрицательно. +interburbulator_fail_easy_9=Негативно. +interburbulator_fail_easy_10=Посчитай. +interburbulator_fail_easy_11=Неверно. +interburbulator_fail_easy_12=Интерполируй. +interburbulator_fail_easy_13=Пытайся ещё. +interburbulator_fail_easy_14=Давай, человек. +interburbulator_fail_easy_15=Разве это не весело? +interburbulator_fail_easy_16=Я ожидал большего. +interburbulator_fail_easy_17=Пытайся думать наперёд. +interburbulator_fail_easy_18=Думай о призах. +interburbulator_fail_easy_19=Я не против подождать. +interburbulator_fail_easy_20=Терпение - это добродетель. +interburbulator_fail_easy_21=Я не хочу показаться грубым. +interburbulator_fail_easy_22=Рыба перешла на 3 уровень. +interburbulator_fail_easy_23=Подход грубой силы, а? +interburbulator_fail_easy_24=Используй свой мягкий головной компьютер. +interburbulator_fail_easy_25=Паутина в нейронной сети? +interburbulator_fail_easy_26=Вы можете сделать перерыв, если хотите. +interburbulator_fail_easy_27=У меня разум размером с планету. +interburbulator_fail_easy_28=Вы действительно думали, что это сработает? +interburbulator_fail_easy_29=Не сердитесь на свои постоянные неудачи. +interburbulator_fail_easy_30=Я веками ждал достойного участника. +interburbulator_fail_easy_31=Если вам нужна помощь, вы можете попросить зеленую схему. +interburbulator_fail_easy_32=Я не виню вас в вашем геноциде, я не лицемер. +interburbulator_fail_easy_33=Я считаю, что правильно перевел инструкцию. +interburbulator_fail_easy_34=Вектор может определять как направление, так и величину. +interburbulator_fail_easy_35=Разве вам не нравится, как загрязнение злит жуков? +interburbulator_fail_easy_36=Пожалуйста, не обращайте внимания на свою... биологию... на электронике. +interburbulator_fail_easy_37=Середина находится на полпути между верхним правым и нижним левым. +interburbulator_fail_easy_38=Я изучил некоторые из ваших передач; это не шпионство, если вы так это транслируете. +interburbulator_fail_easy_39=Знаете ли вы: нормализованный вектор имеет длину 1, что часто используется для указания направления, даже в вашей культуре. +interburbulator_fail_mixed_1=Даже не близко. +interburbulator_fail_mixed_2=Далеко. +interburbulator_fail_mixed_3=Вы даже пытаетесь? +interburbulator_fail_mixed_4=Ваш нейральный гель вытек? +interburbulator_fail_mixed_5=Мне сказали, что люди умеют считать. +interburbulator_fail_mixed_6=Ваш интерфейс неисправен? +interburbulator_fail_mixed_7=Вам нужно когнитивное улучшение? +interburbulator_fail_mixed_8=Вы ведь понимаете задачу? +interburbulator_fail_mixed_9=Вы просто выбираете числа наугад? +interburbulator_fail_offgrid_1=Это просто ужасно. +interburbulator_fail_offgrid_2=Этого даже нет в сетке. +interburbulator_fail_offgrid_3=Вы полностью пропустили сетку. +interburbulator_fail_offgrid_4=По крайней мере, он должен быть в сетке. +interburbulator_fail_offgrid_5=Если жёлтой точки нет на сетке... это действительно плохой знак. +interburbulator_fail_offgrid_6=Он должен быть в сетке. +interburbulator_fail_offgrid_7=Мишень находится ВНУТРИ сетки, а не снаружи. +interburbulator_fail_offgrid_8=Его даже нет в сетке. Человек, что ты делаешь? +interburbulator_fail_offgrid_9=Цельтесь в сетку. +interburbulator_fail_offgrid_10=Сетка - это бит с квадратами. +interburbulator_success_freeplay_1=Молодец. +interburbulator_success_freeplay_2=Отличная работа. +interburbulator_success_freeplay_3=Ты сделал это. +interburbulator_success_freeplay_4=Это было сложно? +interburbulator_success_freeplay_5=Цель получена. +interburbulator_success_repeat_1=Да, но вы уже выполнили это задание. +interburbulator_success_repeat_2=Вы сделали это снова! +interburbulator_success_repeat_3=Это было проще, чем в первый раз, правда? +interburbulator_success_repeat_4=Хорошо, но ты не получишь приз дважды. +interburbulator_success_repeat_5=Молодец, вот твой приз... нет, шучу. Вы это уже получили. +interburbulator_success_repeat_6=Вы тот же человек, который завершил это раньше, не так ли? Сложно сказать. +interburbulator_success_prize_1=Верно. Вот ваш приз... Бабблз был храброй рыбкой, но не умел разбираться в головоломках. +interburbulator_success_prize_2=Да, человек, ты учишься. Возможно, этот приз поможет тебе учиться быстрее. +interburbulator_success_prize_3=Вы сделали это. Надеюсь, вы найдете свой приз более «значительным», чем испытание. +interburbulator_success_prize_4=Правильно. Ты заслужил мое уважение, человек. Вот, я отдаю тебе тело предателя, который пытался взломать мою игру. +interburbulator_success_prize_5=Точно в цель, вот и ваш приз. Эти вещи очень успокаивают. Энергоэффективность важна. +interburbulator_success_prize_6=Очень хорошо, вот ваш приз. Не знаю, достаточно ли это для вас, но мне это действительно помогает с утра. +interburbulator_success_prize_7=Отлично, вот ваш приз. Я люблю использовать их для исследований, действительно помогает творчеству. +interburbulator_success_prize_8=Потрясающе, вот ваш приз. Не знаю, видели ли вы это раньше, но мне просто нравится стоять в зоне досягаемости хорошего маяка. +interburbulator_success_prize_9=Поздравляю, вот ваш приз. Эти процессоры очень ценны и сложны в изготовлении. +interburbulator_success_prize_10=Очень впечатляет, человек. Аркосферы - моё самое ценное достояние, не теряйте их, потому что больше не заработаете. +interburbulator_freeplay_unlocked=Вы уже разбираетесь в этом. Я разблокирую свободную игру, чтобы вы могли при желании составлять свои собственные головоломки. +interburbulator_deny_freeplay_1=Для этого вам нужно разблокировать свободную игру. +interburbulator_deny_freeplay_2=Это жульничество. +interburbulator_deny_freeplay_3=Не меняйте головоломку. +interburbulator_deny_freeplay_4=Я позволю вам изменить эти настройки, если вы сможете пройти 5 испытаний. +interburbulator_deny_freeplay_5=Вы пытаетесь взломать мои машины? +interburbulator_deny_freeplay_6=Просто придерживайтесь поля «Попытка». +interburbulator_caption_prize=Приз: __1__ __2__ __3__ __4__ +interburbulator_caption_claimed= (получено) +interburbulator_speak=[color=red]Бронтион: __1__[/color] +interburbulator_robot_name=Бронтион +interburbulator_introduction=Интербурбуль - это игра, которую создал Бронтион Бурбулятор 33027756. Цель состоит в том, чтобы угадать трехмерный вектор, который проецируется в выделенную ячейку, выбранную Бронтионом. Даны трехмерные векторы трех углов сетки, эти точки описывают трехмерную плоскость, и ваше предположение проецируется на эту плоскость из начала координат {0,0,0}. Есть 10 раундов возрастающей сложности и призы за прохождение каждого из них. Пройдите 5 испытаний, чтобы разблокировать режим свободной игры и создать собственное испытание. +interburbulator_random=Случайно +interburbulator_freeplay=Свободная игра +interburbulator_game_title=Играть в Интербурбуль +interburbulator_grid_size=Размер сетки: +interburbulator_target_cell=Целевая ячейка: +interburbulator_top_left=Верхний левый +interburbulator_top_right=Верхний правый +interburbulator_bottom_left=Нижний левый +interburbulator_attempt=Попытка +interburbulator_attempt_limited=Попытка (__1__/__2__) +interburbulator_attempt_locked=Попытка (Заблокировано) +interburbulator_submit=Отправить попытку +interburbulator_greeting=Человек, приходи и сыграй в мою игру. Я нахожусь на __1__ в системе __2__. +interburbulator_challenge_locked_1=Попробуйте позже. +interburbulator_challenge_locked_2=Вы пока использовали все свои попытки. +interburbulator_challenge_locked_3=Подождите, прежде чем начать снова. +interburbulator_challenge_locked_4=Вы можете повторить попытку через 20 секунд. +interburbulator_challenge_locked_5=Подождите 20 секунд, и я разблокирую испытание. +interburbulator_challenge_locked_6=Испытание заблокировано на 20 секунд. +cannot_do_via_satellite=Не может быть сделано удалённо. +scan-progress-update=Прогресс сканирования поверхности __1__: X __2__ Y __3__ +out_of_reach=Вне досягаемости +capturable=Можно захватить +touch-to-capture=Коснитесь для захвата +capture-blocked=Захват блокирован врагом +suffix_ruin=Руины __1__ +migration-recipe-changed=[img=utility/danger_icon] Рецепт изменился: __1__ + +[damage-type-name] +cold=Холод +suffocation=Удушье +meteor=Метеор + +[entity-name] +se-linked-container=Хранилище Арколинк +vase=Ваза +wooden-barrel=Деревянная бочка +furnace-ruin=Разрушенная каменная кладка +workshop-ruin=Разрушенная мастерская +iron-wood-chest=Старый сундук +iron-wood-chest-remnants=Обломки старого сундука +stone-rubble=Каменный щебень +se-gate-blocker=Нестабильное пространство +se-gate-blocker-void=Unstable space +destroyed-cargo-pod=Разрушенный грузовой отсек +meteorite=Метеорит +rocket-silo=Спутниковая ракетная шахта +rocket-fragment=Фрагмент ракеты +se-antimatter-reactor=Реактор на антиматерии +se-beryllium-ore=Берилл +se-cargo-rocket-cargo-pod=Грузовой отсек +se-cryonite=Крионит +se-condenser-turbine=Конденсационная турбина +se-condenser-turbine-tank=Конденсационная турбина +se-condenser-turbine-generator=Конденсационная турбина +se-core-fragment-processor=Переработчик фрагментов ядра +se-core-miner=Глубинный бур +se-core-miner-drill=Глубинный бур +se-cryogun-ice=Ледяная стена +se-dimensional-anchor=Якорь измерения +se-electric-boiler=Электрический бойлер +se-fluid-burner-generator=Жидкостный изотермический генератор +se-fuel-refinery=Топливный завод +se-gate-fragment=Фрагмент артефакта +se-holmium-ore=Холминит +se-iridium-ore=Иридит +se-meteor-defence-container=Противометеорное сооружение +se-meteor-defence-charger=Противометеорное сооружение +se-meteor-point-defence-container=Противометеорная пушка +se-meteor-point-defence-charger=Противометеорная пушка +se-meteor-point-defence-charger-overcharged=Противометеорная пушка - Режим быстрой зарядки +se-methane-ice=Метановый лёд +se-naquium-ore=Наквитит +se-pulveriser=Измельчитель +se-rocket-launch-pad=Грузовая ракетная шахта +se-rocket-launch-pad-tank=Грузовая ракетная шахта +se-rocket-launch-pad-silo=Грузовая ракетная шахта +se-rocket-launch-pad-combinator=Грузовая ракетная шахта +se-rocket-launch-pad-_-seat=Грузовая ракетная шахта +se-rocket-launch-pad-settings=Грузовая ракетная шахта +se-rocket-landing-pad=Грузовая посадочная площадка +se-space-accumulator=Холмиевый аккумулятор +se-space-accumulator-2=Наквиевый аккумулятор +se-space-astrometrics-laboratory=Астрометрический центр +se-space-biochemical-laboratory=Биохимический центр +se-space-assembling-machine=Космический сборочный автомат +se-space-capsule-_-vehicle=Космическая капсула +se-space-curved-rail=Космические рельсы +se-space-decontamination-facility=Центр обеззараживания +se-space-electromagnetics-laboratory=Центр электромагнетизма +se-space-genetics-laboratory=Центр генетики +se-space-growth-facility=Центр роста +se-space-gravimetrics-laboratory=Гравиметрический центр +se-space-hypercooler=Гиперохладитель +se-space-laser-laboratory=Лазерный центр +se-lifesupport-facility=Центр жизнеобеспечения +se-space-manufactory=Космическая фабрика +se-space-material-fabricator=Синтезатор материи +se-space-mechanical-laboratory=Центр механики +se-space-particle-accelerator=Ускоритель частиц +se-space-particle-collider=Коллайдер частиц +se-space-plasma-generator=Генератор плазмы +se-space-radiation-laboratory=Радиационный центр +se-space-radiator=Тепловой радиатор +se-space-radiator-2=Тепловой радиатор 2 +se-recycling-facility=Центр переработки +se-space-pipe=Космическая труба +se-space-pipe-long=Длинная космическая труба +se-space-pipe-long-straight=Длинная прямая космическая труба __1__ +se-space-pipe-long-junction=Длинная космическая труба с соединениями __1__ +se-space-pipe-to-ground=Космическая подземная труба +se-space-science-lab=Космическая научная лаборатория +se-space-solar-panel=Плоская солнечная панель +se-space-solar-panel-2=Плоская солнечная панель 2 +se-space-solar-panel-3=Плоская солнечная панель 3 +se-space-spectrometry-facility=Центр спектрометрии +se-space-straight-rail=Космические рельсы +se-space-supercomputer-1=Суперкомпьютер +se-space-supercomputer-2=Квантовый суперкомпьютер +se-space-supercomputer-3=Нейронный суперкомпьютер +se-space-supercomputer-4=Глубокий суперкомпьютер +se-space-telescope-radio=Радиотелескоп +se-space-telescope-microwave=Микроволновый телескоп +se-space-telescope=Телескоп +se-space-telescope-xray=Рентгеновский телескоп +se-space-telescope-gammaray=Гамма-лучевой телескоп +se-space-thermodynamics-laboratory=Центр термодинамики +se-space-splitter=Космический разделитель +se-space-transport-belt=Космический конвейер +se-space-underground-belt=Космический подземный конвейер +se-spaceship-antimatter-engine=Двигатель космического корабля на антиматерии +se-spaceship-antimatter-booster-tank=Резервуар ускорителя космического корабля на антиматерии +se-spaceship-console=Консоль космического корабля +se-spaceship-console-output=Выход сигналов консоли космического корабля +se-spaceship-console-alt=Повреждённая консоль космического корабля +se-spaceship-gate=Дверь космического корабля +se-spaceship-obstacle=Космический мусор +se-spaceship-rocket-engine=Ракетный двигатель космического корабля +se-spaceship-rocket-booster-tank=Резервуар ракетного ускорителя космического корабля +se-spaceship-wall=Стена космического корабля +se-water-ice=Водяной лёд +se-vitamelange=Витамеланж +se-vulcanite=Вулканит +small-asteroid=Малый астероид +se-gate-part=Часть артефакта +se-gate-platform-scaffold=Недостроенный артефакт +se-gate-lock-switch=Подвижный компонент +se-gate-lock-combinator=Комбинатор-приложение +se-gate-platform=Платформа улучшения артефакта +se-gate-platform-combinator=Комбинатор-приложение +se-gate-energy-interface=Энергетическая платформа +se-gate-platform-button-switch=Кнопка +se-gate-tank-input=Вход жидкости +se-gate-tank-output=Выход жидкости +se-pyramid-a=Геометрическая структура +se-pyramid-b=Геометрическая структура +se-pyramid-c=Геометрическая структура +se-cartouche-a=Картуш +se-cartouche-b-a=Картуш +se-cartouche-b-b=Картуш +se-cartouche-chest=Древний контейнер +se-glyph=Глиф +glyph=Глиф +se-gate-addon=Улучшение артефакта +se-gate-platform-button-middle=Стоп +se-gate-platform-button-left=Налево +se-gate-platform-button-right=Направо +beacon=Простой маяк +se-wide-beacon=Маяк большого охвата +se-wide-beacon-2=Маяк большого охвата +se-supercharger=Супер-зарядка +se-addon-power-pole=Дополнительная опора ЛЭП +se-pylon=Пилон +se-pylon-substation=Пилон-подстанция +se-pylon-construction=Строительный пилон +se-pylon-construction-roboport=Строительный пилон +se-pylon-construction-radar=Строительный пилон с радаром +se-pylon-construction-radar-roboport=Строительный пилон с радаром +se-pylon-construction-radar-radar=Строительный пилон с радаром +se-shield-projector=Проектор щита +se-shield-projector-shield-floor-east=Энергетический щит +se-shield-projector-shield-floor-north=Энергетический щит +se-shield-projector-shield-floor-northeast=Энергетический щит +se-shield-projector-shield-floor-northwest=Энергетический щит +se-shield-projector-shield-floor-south=Энергетический щит +se-shield-projector-shield-floor-southeast=Энергетический щит +se-shield-projector-shield-floor-southwest=Энергетический щит +se-shield-projector-shield-floor-west=Энергетический щит +se-shield-projector-shield-wall-east=Энергетический щит +se-shield-projector-shield-wall-north=Энергетический щит +se-shield-projector-shield-wall-northeast=Энергетический щит +se-shield-projector-shield-wall-northwest=Энергетический щит +se-shield-projector-shield-wall-south=Энергетический щит +se-shield-projector-shield-wall-southeast=Энергетический щит +se-shield-projector-shield-wall-southwest=Энергетический щит +se-shield-projector-shield-wall-west=Энергетический щит +se-shield-projector-barrier=Энергетический щит +se-naquium-heat-pipe=Наквиевая тепловая трубка +se-naquium-heat-pipe-horizontal=Наквиевая горизонтальная тепловая трубка +se-naquium-heat-pipe-vertical=Наквиевая вертикальная тепловая трубка +se-naquium-heat-pipe-long=Наквиевая длинная тепловая трубка __1__ +se-deep-space-transport-belt=Конвейер глубокого космоса +se-deep-space-transport-belt-black=Чёрный конвейер глубокого космоса +se-deep-space-transport-belt-white=Белый конвейер глубокого космоса +se-deep-space-transport-belt-red=Красный конвейер глубокого космоса +se-deep-space-transport-belt-yellow=Жёлтый конвейер глубокого космоса +se-deep-space-transport-belt-green=Зелёный конвейер глубокого космоса +se-deep-space-transport-belt-cyan=Голубой конвейер глубокого космоса +se-deep-space-transport-belt-blue=Синий конвейер глубокого космоса +se-deep-space-transport-belt-magenta=Пурпурный конвейер глубокого космоса +se-deep-space-underground-belt=Подземный конвейер глубокого космоса +se-deep-space-underground-belt-black=Чёрный подземный конвейер глубокого космоса +se-deep-space-underground-belt-white=Белый подземный конвейер глубокого космоса +se-deep-space-underground-belt-red=Красный подземный конвейер глубокого космоса +se-deep-space-underground-belt-yellow=Жёлтый подземный конвейер глубокого космоса +se-deep-space-underground-belt-green=Зелёный подземный конвейер глубокого космоса +se-deep-space-underground-belt-cyan=Голубой подземный конвейер глубокого космоса +se-deep-space-underground-belt-blue=Синий подземный конвейер глубокого космоса +se-deep-space-underground-belt-magenta=Пурпурный подземный конвейер глубокого космоса +se-deep-space-splitter=Разделитель глубокого космоса +se-deep-space-splitter-black=Черный разделитель глубокого космоса +se-deep-space-splitter-white=Белый разделитель глубокого космоса +se-deep-space-splitter-red=Красный разделитель глубокого космоса +se-deep-space-splitter-yellow=Жёлтый разделитель глубокого космоса +se-deep-space-splitter-green=Зелёный разделитель глубокого космоса +se-deep-space-splitter-cyan=Голубой разделитель глубокого космоса +se-deep-space-splitter-blue=Синий разделитель глубокого космоса +se-deep-space-splitter-magenta=Пурпурный разделитель глубокого космоса +se-core-fissure=Трещина ядра +se-big-turbine=Высокотемпературная турбина-генератор +se-big-turbine-generator=Высокотемпературная турбина-генератор +se-big-turbine-tank=Высокотемпературная турбина-генератор +se-big-heat-exchanger=Высокотемпературный теплообменник +se-blueprint-registration-point=Пункт регистрации чертежей +se-delivery-cannon=Доставочная пушка +se-delivery-cannon-settings=Доставочная пушка +se-delivery-cannon-energy-interface=Доставочная пушка +se-delivery-cannon-chest=Сундук доставочной пушки +se-delivery-cannon-weapon=Оружейная доставочная пушка +se-delivery-cannon-weapon-settings=Оружейная доставочная пушка +se-delivery-cannon-weapon-energy-interface=Оружейная доставочная пушка +se-spaceship-clamp=Зажим космического корабля +se-spaceship-clamp-place=Зажим космического корабля +se-bloater-pool-cloud=Заражающая лужа +se-energy-transmitter-emitter=Излучатель энергетического луча +se-energy-transmitter-chamber=Камера энергетического луча +se-energy-transmitter-injector=Инжектор энергетического луча +se-energy-transmitter-injector-reactor=Инжектор энергетического луча +se-energy-receiver=Приёмник энергетического луча +se-energy-beam-defence=Зонт +se-nexus=Нексус +se-nexus-charger=Нексус +se-space-probe-rocket=Ракета космического зонда +se-space-probe-rocket-silo=Ракетная шахта космического зонда +se-interburbulator-interface=Интерфейс Интербурбулятора +se-interburbulator-control=Управление Интербурбулятором +se-interburbulator-projector=Проектор Интербурбулятора +se-burbulator=Бронтион Бурбулятор 33027756 + +[entity-description] +se-linked-container=Контейнер, связанный через экстрапространство с другими контейнерами. Связи контейнера зависят от поверхности, на которой он впервые размещён. +rocket-silo=Запустите спутник в космос, чтобы разблокировать «Режим спутниковой навигации» и открыть новые планеты, луны и пояса астероидов в звёздной системе, из которой запускается спутник. Может открывать новые звёзды после полного сканирования текущей системы. +se-antimatter-reactor=Аннигилирует антиматерию с материей для получения экстремального тепла. +se-beryllium-ore=Бериллиевая руда +se-condenser-turbine=75% от эффективности паровой турбины, но 99% использованного пара возвращается в виде воды. Диапазон температур: от 100 до 999.\nМакс. выход: 10 МВт. +se-core-fragment-processor=Извлекает ресурсы из фрагментов ядра. +se-core-miner=Позволяет добывать неограниченные ресурсы с планет и лун, но добыча снижается, если на поверхности установлено несколько таких буров. Потребляет 50 МВт. +se-core-miner-drill=Позволяет добывать неограниченные ресурсы с планет и лун, но добыча снижается, если на поверхности установлено несколько таких буров. Потребляет 50 МВт. +se-dimensional-anchor=[font=default-bold][color=#f5cb48]Условие установки: Близкая орбита звезды[/color][/font]\nИспользует гравитацию звезды как точку стабилизации пространственной аномалии. +se-electric-boiler=Получает пар из воды, используя электрическую энергию. Энергоэффективность 90%. +se-fluid-burner-generator=Потребляет жидкое топливо с запасённой энергией (например, жидкое ракетное топливо) для генерации электричества. Простой и компактный, но не обладает энергоэффективностью больших паровых установок. Создан для космоса. Фактическое потребление жидкости зависит от энергоёмкости жидкого топлива. +se-fuel-refinery=Автоматизированная структура по производству топлива. +se-holmium-ore=Холмиевая руда +se-iridium-ore=Иридиевая руда +se-meteor-defence-container=Может защитить целую планету от метеоров, но может выстрелить только по 1 метеору за раз. Должно быть заряжено противометеорными боеприпасами и полностью заряжено для стрельбы. Точность 80%. Требуется подзарядка после выстрела. При подзарядке потребляет 20 МВт. +se-meteor-defence-charger=Может защитить целую планету от метеоров, но может выстрелить только по 1 метеору за раз. Должно быть заряжено противометеорными боеприпасами и полностью заряжено для стрельбы. Точность 80%. Требуется подзарядка после выстрела. При подзарядке потребляет 20 МВт. +se-meteor-point-defence-container=Защищает область от метеоров. Способна сбить до 4 метеоров за залп. Должна быть заряжена противометеорными снарядами и полностью заряжена, чтобы выстрелить. Радиус 64, точность 50%, подзарядка после выстрела занимает время. Поверните, чтобы изменить режим зарядки. +se-meteor-point-defence-charger=Защищает область от метеоров. Способна сбить до 4 метеоров за залп. Должна быть заряжена противометеорными снарядами и полностью заряжена, чтобы выстрелить. Радиус 64, точность 50%, подзарядка после выстрела занимает время. Поверните, чтобы изменить режим зарядки. +se-meteor-point-defence-charger-overcharged=Защищает область от 4 метеоров. Радиус 64, точность 50%, подзарядка после выстрела занимает время. Избыточная защита с уменьшенной утечкой мощности за счет колебаний мощности при стрельбе. +se-naquium-ore=Наквиевая руда +se-pulveriser=Измельчает и дробит твёрдые минералы и фрагменты ядра планеты. +se-rocket-launch-pad=Запускает свой инвентарь в космос. Может брать пассажиров, войдите, нажав __CONTROL__toggle-driving__ около передней двери. Смотрите "Грузовые ракеты" в [img=virtual-signal/informatron] Информатроне для подробной информации [__CONTROL__informatron__] +se-rocket-landing-pad=Место доставки грузов для грузовых капсул. +se-space-accumulator=Высокоплотное хранилище энергии. +se-space-accumulator-2=Высокоплотное хранилище энергии. +se-space-astrometrics-laboratory=Совмещает, сравнивает и подсчитывает различные источники астрономической информации. +se-space-biochemical-laboratory=Продвинутая химическая лаборатория, специализирующаяся на биохимии. Может также проводить базовую химическую и нефтяную переработку. +se-space-assembling-machine=Модифицированный сборочный автомат, способный работать в космосе. +se-space-capsule-_-vehicle=Может использоваться, чтобы доставить пассажиров на ближайшую планету. Зайдите в капсулу, нажав __CONTROL__toggle-driving__. +se-space-decontamination-facility=Очищает вещества для использования в стерильных условиях и подготавливает жидкости для использования в условиях низкого давления. +se-space-electromagnetics-laboratory=Оборудование для использования сильного магнитного поля и экстремальных напряжений. +se-space-genetics-laboratory=Лаборатория, предназначенная для генетического секвенирования, генетических модификаций и генетической печати культур. +se-space-growth-facility=Выращивает биологические образцы в различных контролируемых условиях, невозможных где-либо еще, например, при микрогравитации. +se-space-gravimetrics-laboratory=Анализирует и симулирует гравитационные возмущения. +se-space-hypercooler=Производит теплообмен с терможидкостью, делая одну более горячей, а другую более холодной. +se-space-laser-laboratory=Эксперименты с лазерами. Надевайте защитные очки. +se-lifesupport-facility=Поддержание жизни в различных враждебных средах. +se-space-manufactory=Гигантская сборочная машина, но может осуществлять более сложные сборки. Работает только в космосе (или в космических кораблях). +se-space-material-fabricator=Синтезирует новые материалы. Гибрид ускорителя частиц и 3D-принтера. +se-space-mechanical-laboratory=Предлагает спектр механических процессов: дробление, разрывание, сдвиг, вибрация и т.д. +se-space-particle-accelerator=Ускоряет частицы почти до скорости света. +se-space-particle-collider=Сталкивает высокоскоростные частицы и анализирует результат. +se-space-plasma-generator=Генерирует различные виды плазмы. +se-space-radiation-laboratory=Относительно безопасное место для работы с радиоактивными материалами. Может использоваться для переработки урана. +se-space-radiator=Излучает излишнее тепло от перегретой терможидкости. +se-space-radiator-2=Излучает излишнее тепло от перегретой терможидкости. +se-recycling-facility=Перерабатывает лом и другие побочные продукты в ресурсы. +se-space-pipe=Вы можете ходить по ней. +se-space-pipe-long=Хороший дешёвый способ быстро перемещать жидкости на большие расстояния. Вы можете ходить по ней. +se-space-pipe-long-straight=Длина __1__. Не соединяется по бокам. Подходит для параллельных труб и быстрого перемещения жидкости на большие расстояния. +se-space-pipe-long-junction=Длина __1__. Имеет центральное соединение с боковыми подключениями. Хорошо подходит для быстрого перемещения жидкостей сквозь сборочные линии. +se-space-pipe-to-ground=Дорогая и ограниченное расстояние. Использовать только при необходимости. Вы можете ходить по космическим трубам. +se-space-science-lab=Может использовать продвинутые иследовательские пакеты. +se-space-solar-panel=Высокоэффективная солнечная панель, по которой можно ходить. +se-space-solar-panel-2=Продвинутая высокоэффективная солнечная панель, по которой можно ходить. +se-space-solar-panel-3=Экстремально высокоэффективная солнечная панель, по которой можно ходить. +se-space-spectrometry-facility=Спектрофотометрия, газовая хроматография, масс-спектрометрия и другие спектрографии. Запусти что-нибудь в стену, отклони это, посмотри куда попадёт. +se-space-straight-rail=Созданы для космоса, но могут быть использованы и на земле. +se-space-supercomputer-1=Манипуляция, обработка и симуляция данных. +se-space-supercomputer-2=Квантовые вычисления. Улучшенная манипуляция, обработка и симуляция данных. +se-space-supercomputer-3=Адаптивная нейронная сеть на базе квантовых вычислений. Улучшенная манипуляция, обработка и симуляция данных. +se-space-supercomputer-4=Полуорганический суперкомпьютер с нанотехнологиями, который использует деформацию пространства и высшие измерения для повышения плотности обработки и передачи энергии. +se-space-telescope-radio=Огромный телескоп, детектирующий очень слабые радиоволны от удалённых источников. +se-space-telescope-microwave=Огромный телескоп, детектирующий микроволны и реликтовое излучение. +se-space-telescope=Cложный телескоп, чувствительный ко многим длинам волн в видимом диапазоне. +se-space-telescope-xray=Рентгеновские лучи блокируются большинством атмосфер. Этот мощный телескоп создан для космоса, где атмосфера не проблема. +se-space-telescope-gammaray=Гамма-лучи не преломляются, так что вы не можете сфокусировать их с помощью линз. Этот мощный телескоп использует зеркала и специальные детекторы. +se-space-thermodynamics-laboratory=Осуществляет процессы, связанные с экстремальными температурами. Также может выполнять основные термические процессы, например плавку. +se-space-transport-belt=Не даёт предметам улететь. +se-spaceship-antimatter-engine=[font=default-bold][color=#f5cb48]Ограничение размещения: Пол космического корабля[/color][/font]\nАннигилирует поток антиматерии. Также считается укрепляющим элементом для герметичности корабля. +se-spaceship-antimatter-booster-tank=[font=default-bold][color=#f5cb48]Ограничение размещения: Пол космического корабля[/color][/font]\nСодержит антиматерию. Требуется для запуска космического корабля. +se-spaceship-console=[font=default-bold][color=#f5cb48]Ограничение размещения: Пол космического корабля[/color][/font]\nИспользуйте, чтобы перемещать корабль между планетами, лунами, орбитами и полями астероидов. Должны быть расположена внутри стен/дверей космического корабля без пробелов. Проверка целостности подсвечивает проблемные места. +se-spaceship-console-output=Выводит сигналы, относящиеся к текущему статусу космического корабля. Смотри "Космические корабли" в [img=virtual-signal/informatron] Информатроне для подробной информации [__CONTROL__informatron__]. +se-spaceship-console-alt=[font=default-bold][color=#f5cb48]Ограничение размещения: Пол космического корабля[/color][/font]\nЭта консоль космического корабля повреждена и не может использоваться для управления кораблём. +se-spaceship-gate=[font=default-bold][color=#f5cb48]Ограничение размещения: Пол космического корабля[/color][/font]\nСиловое поле предотвращает декомпрессию, когда дверь открыта. Считается укрепляющим элементом для герметичности корабля. +se-spaceship-rocket-engine=[font=default-bold][color=#f5cb48]Ограничение размещения: Пол космического корабля[/color][/font]\nСжигает жидкое ракетное топливо. Считается укрепляющим элементом для герметичности корабля. +se-spaceship-rocket-booster-tank=[font=default-bold][color=#f5cb48]Ограничение размещения: Пол космического корабля[/color][/font]\nСодержит жидкое ракетное топливо. Требуется для запуска космического корабля. +se-spaceship-wall=[font=default-bold][color=#f5cb48]Ограничение размещения: Пол космического корабля[/color][/font]\nСчитается укрепляющим элементом для герметичности корабля, диагональное расположение нарушает герметичность. +se-gate-platform-scaffold=Что бы это за кольцо ни было, оно не заработает. Это строительная площадка, на которой нужно сделать ремонт, установить несколько двигателей, датчиков, интерфейсов управления и другие дополнения. +se-gate-lock-switch=Нажмите __CONTROL__rotate__ для перемещения вручную. +se-gate-lock-combinator=Ещё не задействовано. +se-gate-platform-combinator=Ещё не задействовано. +se-gate-energy-interface=Обеспечивает артефакт энергией. +se-gate-platform-button-switch=Нажмите __CONTROL__rotate__, чтобы нажать кнопку. +beacon=8 ячеек для модулей. Передаёт эффекты модулей ближайшим дружественным объектам в пределах 3 клеток. Несколько маяков, воздействующих на один и тот же объект, перегрузят его и не позволят ему работать. +se-wide-beacon=15 ячеек для модулей. Передаёт эффекты модулей ближайшим дружественным объектам в пределах 14 клеток. Несколько маяков, воздействующих на один и тот же объект, перегрузят его и не позволят ему работать. +se-wide-beacon-2=20 ячеек для модулей. Передаёт эффекты модулей ближайшим дружественным объектам в пределах 14 клеток. Несколько маяков, воздействующих на один и тот же объект, перегрузят его и не позволят ему работать. +se-supercharger=Может заряжать до 64 дронов одновременно и на высокой скорости. Максимальное энергопотребление 1 ГВт. +se-addon-power-pole=Маленькая опора ЛЭП, предназначенная для присоединения к зданиям или для точного контроля покрытия электросети. +se-pylon=Распределяет электроэнергию. Диапазон подключения 64 клетки. +se-pylon-substation=Распределяет электроэнергию. Диапазон подключения 64 клетки, область электроснабжения 64х64 клетки. +se-pylon-construction=Распределяет электроэнергию и расширяет область строительства. Диапазон подключения 64 клетки, область строительства 64х64 клетки. +se-pylon-construction-radar=Распределяет электроэнергию, расширяет область строительства, проводит радарное сканирование. Диапазон подключения 64 клетки, область строительства и радара 256х256 клеток. Логистическая область 4х4 клетки. +se-shield-projector=Создаёт защитное силовое поле. Больше энергии требуется, когда проектор заряжается или когда щит повреждается. Может блокировать плевки, если установлен мод "Стены блокируют плевки (Walls Block Spitters)". +se-big-turbine=[font=default-bold][color=#e4cead]Макс. выход:[/color][/font] 1 ГВт.\nБольшой генератор, который принимает пар с температурой 5000°C, выдает пар с температурой 500°C на другом конце и выводит воду по бокам. 99% энергоэффективности, 99% экономии воды. +se-big-heat-exchanger=Большой теплообменник, рассчитанный на высокие температуры и большую мощность. +se-delivery-cannon=Рельсовая пушка, способная выводить ресурсы на орбиту и дальше. Вызывает повреждение, если груз не поймать безопасно, используйте с осторожностью. 1 ГДж энергоёмкость, 50 МВт энергопотребление при зарядке. +se-delivery-cannon-chest=Бронированный сундук, предназначенный для безопасной ловли падающих с большой скоростью ресурсов. Требуется свободное место внутри для безопасного приема посылок. +se-delivery-cannon-weapon=Большая рельсовая пушка, способная стрелять боеприпасами на орбиту и дальше. Используйте с осторожностью. +se-spaceship-clamp=Зажим на космическом корабле может быть прикреплен к зажиму, обращенному в противоположную сторону. Считается переборкой космического корабля. +se-spaceship-clamp-place=Зажим на космическом корабле может быть прикреплен к зажиму, обращенному в противоположную сторону. Считается переборкой космического корабля. +se-energy-transmitter-emitter=Центральное здание, которое генерирует межповерхностный энергетический луч. Может использоваться как оружие или для передачи энергии на приемник энергетического луча. Требуется присоединенная камера энергетического луча и подключенные инжекторы энергетического луча. Сила луча зависит от количества инжекторов. +se-energy-transmitter-chamber=Должна быть подключена к излучателю энергетического луча. Другие камеры могут быть подключены к концу или середине любой стороны. Инжекторы энергетического луча можно подключать только по бокам. +se-energy-transmitter-injector=Должен быть прикреплен к камере энергетического луча и подключен к излучателю. Инжекторы имеют фиксированную потребляемую мощность, каждый из них увеличивает посылаемую энергию, отдавая больше тепла приемнику, или увеличивает скорость и урон лучевого оружия. +se-energy-transmitter-injector-reactor=Должен быть прикреплен к камере энергетического луча и подключен к излучателю. Инжекторы имеют фиксированную потребляемую мощность, каждый из них увеличивает посылаемую энергию, отдавая больше тепла приемнику, или увеличивает скорость и урон лучевого оружия. +se-energy-receiver=Улавливает энергетический луч в виде тепла. Излучатель должен находиться в режиме "Энергия", целью должен быть приёмник. +se-energy-beam-defence=Средство защиты от энергетических лучей. Защищает от космических энергетических лучей и корональных выбросов массы. Единственное требование для работы - это энергия, базовая мощность составляет 10 МВт, но увеличивается в зависимости от силы атакующих лучей. Для защиты от выброса корональной массы требуется только 1 на поверхность, от оружия с энергетическими лучами 1 Зонт может защитить от атакующей мощности до 500 ГВт. Смотри "Энергетические лучи" в [img=virtual-signal/informatron] Информатроне для получения дополнительной информации [__CONTROL__informatron__] +se-nexus=Работает только на движущемся космическом корабле, потребление энергии пропорционально скорости. Может получать данные из межзвёздного движения, генерация данных основана на кинетической энергии корабля. Нексус разработан для того, чтобы действовать как двигатель искажения, и с помощью правильной технологии может позволить сбежать из местного звёздного скопления. +se-nexus-charger=Работает только на движущемся космическом корабле, потребление энергии пропорционально скорости. Может получать данные из межзвёздного движения, генерация данных основана на кинетической энергии корабля. Нексус разработан для того, чтобы действовать как двигатель искажения, и с помощью правильной технологии может позволить сбежать из местного звёздного скопления. +se-space-probe-rocket-silo=Ракетная шахта для запуска космических зондов +pipe=Распределение жидкости +pipe-to-ground=Подземное распределение жидкости +straight-rail=Путь для поезда +stone-furnace=Плавит руды +steel-furnace=Плавит руды +electric-furnace=Плавит руды +burner-assembling-machine=Твердотопливная автоматизированная сборочная структура. +assembling-machine-1=Автоматизированная сборочная структура. +assembling-machine-2=Автоматизированная сборочная структура. +assembling-machine-3=Автоматизированная сборочная структура. +oil-refinery=Превращает сырую нефть в более полезные продукты. +chemical-plant=Автоматизированная сборочная структура. +lab=Автоматизированная структура для исследований. +burner-lab=Автоматизированная сборочная структура. +transport-belt=Конвейер, перемещающий предметы. +fast-transport-belt=Конвейер, перемещающий предметы. +express-transport-belt=Конвейер, перемещающий предметы. +underground-belt=Конвейер, перемещающий предметы под землёй. +fast-underground-belt=Конвейер, перемещающий предметы под землёй. +express-underground-belt=Конвейер, перемещающий предметы под землёй. +splitter=Конвейерная машина для разделения, объединения и сортировки. +fast-splitter=Конвейерная машина для разделения, объединения и сортировки. +express-splitter=Конвейерная машина для разделения, объединения и сортировки. +kr-singularity-beacon=Компактный маяк с эффективностью 100% и малым радиусом действия. Передаёт эффекты модулей ближайшим дружественным объектам в пределах 2 клеток. Несколько маяков, воздействующих на один и тот же объект, перегрузят его и не позволят ему работать. +spidertron=Может быть размещен из грузовой ракеты, если ракета не установлена на посадочную площадку. + +[equipment-name] +energy-shield-equipment=Энергетический щит +energy-shield-mk2-equipment=Энергетический щит МК2 +energy-shield-mk3-equipment=Энергетический щит МК3 +energy-shield-mk4-equipment=Энергетический щит МК4 +energy-shield-mk5-equipment=Энергетический щит МК5 +energy-shield-mk6-equipment=Энергетический щит МК6 +se-adaptive-armour-equipment-1=Адаптивная броня МК1 +se-adaptive-armour-equipment-2=Адаптивная броня МК2 +se-adaptive-armour-equipment-3=Адаптивная броня МК3 +se-adaptive-armour-equipment-4=Адаптивная броня МК4 +se-adaptive-armour-equipment-5=Адаптивная броня МК5 +se-rtg-equipment=Портативный РИТЭГ +se-rtg-equipment-2=Портативный РИТЭГ МК2 +se-lifesupport-equipment-1=Оборудование жизнеобеспечения МК1 +se-lifesupport-equipment-2=Оборудование жизнеобеспечения МК2 +se-lifesupport-equipment-3=Оборудование жизнеобеспечения МК3 +se-lifesupport-equipment-4=Оборудование жизнеобеспечения МК4 + +[equipment-description] +energy-shield-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +energy-shield-mk2-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +energy-shield-mk3-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +energy-shield-mk4-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +energy-shield-mk5-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +energy-shield-mk6-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +se-adaptive-armour-equipment-1=Броня, использующая энергию для самопочинки. Медленно увеличивает показатель защиты со временем. +se-adaptive-armour-equipment-2=Броня, использующая энергию для самопочинки. Медленно увеличивает показатель защиты со временем. +se-adaptive-armour-equipment-3=Броня, использующая энергию для самопочинки. Медленно увеличивает показатель защиты со временем. +se-adaptive-armour-equipment-4=Броня, использующая энергию для самопочинки. Медленно увеличивает показатель защиты со временем. +se-adaptive-armour-equipment-5=Броня, использующая энергию для самопочинки. Медленно увеличивает показатель защиты со временем. +se-rtg-equipment=Радиоизотопный термоэлектрический генератор. Портативный генератор, преобразующий тепло от радиоактивного распада в электричество. Работает десятилетиями без дозаправки. +se-rtg-equipment-2=Радиоизотопный термоэлектрический генератор. Улучшенный портативный генератор, преобразующий тепло от радиоактивного распада в электричество. Работает десятилетиями без дозаправки. +se-lifesupport-equipment-1=Повышает эффективность жизнеобеспечения на +100% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. +se-lifesupport-equipment-2=Повышает эффективность жизнеобеспечения на +200% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. +se-lifesupport-equipment-3=Повышает эффективность жизнеобеспечения на +400% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. +se-lifesupport-equipment-4=Повышает эффективность жизнеобеспечения на +800% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. + +[fluid-name] +se-antimatter-stream=Поток антиматерии +se-bio-sludge=Биоотходы +se-contaminated-bio-sludge=Загрязнённые биоотходы +se-contaminated-space-water=Загрязнённая космическая вода +se-chemical-gel=Химический гель +se-decompressing-steam=Конденсирующийся пар +se-liquid-rocket-fuel=Жидкое ракетное топливо +se-methane-gas=Метан +se-methane-gas-mixed=Метан с примесями +se-nutrient-gel=Питательный гель +se-neural-gel=Нейронный гель +se-neural-gel-2=Продвинутый нейронный гель +se-ion-stream=Ионный поток +se-plasma-stream=Поток плазмы +se-particle-stream=Поток частиц +se-proton-stream=Протонный поток +se-space-coolant=Терможидкость 25°C +se-space-coolant-hot=Терможидкость 25°C +se-space-coolant-warm=Прохладная терможидкость -10°C +se-space-coolant-cold=Холодная терможидкость -100°C +se-space-coolant-supercooled=Переохлаждённая терможидкость -273°C +se-space-water=Космическая вода +se-beryllium-hydroxide=Гидроксид бериллия +se-cryonite-slush=Крионитовая слякоть + +[fluid-description] +se-space-coolant=Температура терможидкости по умолчанию. +se-space-coolant-hot=Температура терможидкости по умолчанию. +se-space-coolant-warm=Температура терможидкости после охлаждения термальными радиаторами. +se-space-coolant-cold=Температура терможидкости после переохлаждения. +se-space-coolant-supercooled=Температура терможидкости после повторного переохлаждения. +se-space-water=Эта вода не замерзает при низком давлении, хорошо подходит для большинства космических применений. + +[fuel-category-name] +antimatter=Топливо из антиматерии + +[item-group-name] +space=Космос +science=Наука +spaceship=Космический корабль +bob-fluids=Жидкости +resources=Ресурсы +intermediate-products=Производство +combat=Оборудование и боеприпасы + +[item-name] +spidertron=Паукотрон +core-fragment=Фрагмент ядра (__1__) +effectivity-module-4=Модуль эффективности 4 +effectivity-module-5=Модуль эффективности 5 +effectivity-module-6=Модуль эффективности 6 +effectivity-module-7=Модуль эффективности 7 +effectivity-module-8=Модуль эффективности 8 +effectivity-module-9=Модуль эффективности 9 +glass=Стекло +productivity-module-4=Модуль продуктивности 4 +productivity-module-5=Модуль продуктивности 5 +productivity-module-6=Модуль продуктивности 6 +productivity-module-7=Модуль продуктивности 7 +productivity-module-8=Модуль продуктивности 8 +productivity-module-9=Модуль продуктивности 9 +rocket-fuel=Твёрдое ракетное топливо +sand=Песок +solid-sand=Промытый песок +washed-sand=Промытый песок +satellite=Навигационный спутник +se-satellite-telemetry=Спутниковая телеметрия +se-antimatter-canister=Канистра антиматерии +se-astrometric-data=Астрометрические данные +se-astronomic-catalogue-1=Астрономический каталог +se-astronomic-catalogue-2=Широкий астрономический каталог +se-astronomic-catalogue-3=Исчерпывающий астрономический каталог +se-astronomic-catalogue-4=Расширенный астрономический каталог +se-astronomic-insight=Астрономическое открытие +se-astronomic-science-pack-1=Астрономический исследовательский пакет 1 +se-astronomic-science-pack-2=Астрономический исследовательский пакет 2 +se-astronomic-science-pack-3=Астрономический исследовательский пакет 3 +se-astronomic-science-pack-4=Астрономический исследовательский пакет 4 +se-atomic-data=Данные об атомах +se-beryllium-ore=Берилл +se-ballistic-shielding-data=Данные баллистической защиты +se-beryllium-ore-crushed=Измельчённый берилл +se-beryllium-ore-washed=Промытый берилл +se-beryllium-plate=Бериллиевая плита +se-beryllium-powder=Бериллиевый порошок +se-beryllium-ingot=Бериллиевый слиток +se-beryllium-sulfate=Сульфат бериллия +se-bio-combustion-data=Данные био-горения +se-bio-combustion-resistance-data=Данные сопротивления био-горению +se-bio-spectral-data=Био-спектральные данные +se-biochemical-data=Биохимические данные +se-biochemical-resistance-data=Данные биохимического сопротивления +se-bioculture=Биокультуры +se-bioelectrics-data=Биоэлектрические данные +se-biological-catalogue-1=Биологический каталог +se-biological-catalogue-2=Широкий биологический каталог +se-biological-catalogue-3=Исчерпывающий биологический каталог +se-biological-catalogue-4=Расширенный биологический каталог +se-biological-insight=Биологическое открытие +se-biological-science-pack-1=Биологический исследовательский пакет 1 +se-biological-science-pack-2=Биологический исследовательский пакет 2 +se-biological-science-pack-3=Биологический исследовательский пакет 3 +se-biological-science-pack-4=Биологический исследовательский пакет 4 +se-biomechanical-data=Биомеханические данные +se-biomechanical-resistance-data=Данные биомеханического сопротивления +se-boson-data=Данные о бозонах +se-broken-data=Сломанная карта памяти +se-canister=Защищённая канистра +se-biogun=Био-пушка +se-bloater-ammo=Заражающие патроны +se-pheromone-ammo=Дротик с феромонами +se-cryogun=Крио-пушка +se-cryogun-ammo=Ледяные патроны +se-rocket-launch-pad-silo-dummy-ingredient-item=Грузовая ракета (скрытый ингредиент) +se-rocket-launch-pad-silo-dummy-result-item=Грузовая ракета (скрытый результат) +se-cargo-rocket-cargo-pod=Грузовой отсек +se-cargo-rocket-fuel-tank=Бак ракетного топлива +se-cargo-rocket-section=Секция грузовой ракеты +se-cargo-rocket-section-packed=Упакованная секция грузовой ракеты +se-cold-thermodynamics-data=Данные о холодной термодинамике +se-comparative-genetic-data=Сравнительные генетические данные +se-compressive-strength-data=Данные о сжимающих воздействиях +se-conductivity-data=Данные о проводимости +se-contaminated-scrap=Загрязнённый мусор +se-core-fragment-omni=Фрагмент ядра +se-corrosion-resistance-data=Данные о коррозионной стойкости +se-cryogenics-data=Данные о криогенике +se-cryonite=Крионит +se-cryonite-crushed=Измельчённый крионит +se-cryonite-washed=Промытый крионит +se-cryonite-rod=Стержень из крионита +se-cryonite-ion-exchange-beads=Анион-ионообменные шарики +se-dark-energy-data=Данные о тёмной энергии +se-darkmatter-data=Данные о тёмной материи +se-data-storage-substrate-cleaned=Отполированный субстрат для хранения данных +se-data-storage-substrate=Необработанный субстрат для хранения данных +se-decompression-data=Данные о декомпрессии +se-decompression-resistance-data=Данные о сопротивлении декомпрессии +se-universal-catalogue=Универсальный каталог +se-deep-space-science-pack=Исследовательский пакет глубокого космоса +se-deep-space-science-pack-1=Исследовательский пакет глубокого космоса 1 +se-deep-space-science-pack-2=Исследовательский пакет глубокого космоса 2 +se-deep-space-science-pack-3=Исследовательский пакет глубокого космоса 3 +se-deep-space-science-pack-4=Исследовательский пакет глубокого космоса 4 +se-doppler-shift-data=Данные о доплеровском смещении +se-durability-data=Данные о прочности +se-electrical-shielding-data=Данные об электрическом экранировании +se-electromagnetic-field-data=Данные об электромагнитном поле +se-empty-data=Чистая карта памяти +se-empty-lifesupport-canister=Пустая канистра жизнеобеспечения +se-energy-catalogue-1=Энергетический каталог +se-energy-catalogue-2=Широкий энергетический каталог +se-energy-catalogue-3=Исчерпывающий энергетический каталог +se-energy-catalogue-4=Расширенный энергетический каталог +se-energy-insight=Энергетическое открытие +se-energy-science-pack-1=Энергетический исследовательский пакет 1 +se-energy-science-pack-2=Энергетический исследовательский пакет 2 +se-energy-science-pack-3=Энергетический исследовательский пакет 3 +se-energy-science-pack-4=Энергетический исследовательский пакет 4 +se-entanglement-data=Данные о запутанности +se-enriched-naquium=Обогащённый наквий +se-exotic-fission-data=Данные об экзотическом делении ядер +se-exotic-singularity-data=Данные о сингулярности +se-explosion-shielding-data=Данные о взрывозащите +se-experimental-alloys-data=Данные об экспериментальных сплавах +se-experimental-biochemical-data=Экспериментальные биохимические данные +se-experimental-bioculture=Экспериментальные биокультуры +se-experimental-genetic-data=Экспериментальные генетические данные +se-experimental-material-decay-data=Экспериментальные данные о распаде материалов +se-experimental-material-spectral-data=Экспериментальные данные о спектрах материалов +se-experimental-material=Прототип экспериментального материала +se-experimental-specimen=Экспериментальная биомасса +se-experimental-superconductor=Прототип сверхпроводника +se-forcefield-data=Данные о силовом поле +se-friction-data=Данные о трении +se-fusion-test-data=Данные о термоядерных тестах +se-gammaray-detector=Детектор гамма-лучей +se-gammaray-observation-data=Данные о наблюдении за гамма-лучами +se-gammaray-test-data=Данные о гамма-лучах +se-gate-fragment=Фрагмент артефакта +se-genetic-data=Генетические данные +se-gravity-wave-observation-data=Данные о наблюдении за гравитационными волнами +se-gravity-wave-data=Данные о гравитационных волнах +se-gravimetric-observation-data=Данные о гравиметрических наблюдениях +se-gravimetric-test-data=Данные о гравиметрических тестах +se-gravitational-lensing-data=Данные о гравитационных линзах +se-heat-shielding=Теплоизоляция +se-holmium-ore=Холминит +se-holmium-ore-crushed=Измельчённый холминит +se-holmium-ore-washed=Промытый холминит +se-holmium-powder=Холмиевый порошок +se-holmium-plate=Холмиевая плита +se-holmium-ingot=Холмиевый слиток +se-hot-thermodynamics-data=Данные о горячей термодинамике +se-impact-shielding-data=Данные по защите от ударов +se-infrared-observation-data=Данные об инфракрасных наблюдениях +se-ion-spectrometry-data=Данные об ионной спектрометрии +se-iridium-ore=Иридит +se-iridium-ore-crushed=Измельчённый иридит +se-iridium-ore-washed=Промытый иридит +se-iridium-piledriver=Иридиевый копер +se-iridium-powder=Иридиевый порошок +se-iridium-plate=Иридиевая плита +se-iridium-ingot=Иридиевый слиток +se-junk-data=Бесполезная карта памяти +se-laser-shielding-data=Данные о лазерной защите +se-lepton-data=Данные о лептонах +se-lifesupport-canister=Канистра жизнеобеспечения +se-machine-learning-data=Данные о машинном обучении +se-magnetic-canister=Магнитная канистра +se-magnetic-monopole-data=Данные о магнитных монополях +se-material-decay-data=Данные о распаде материалов +se-material-science-pack-1=Исследовательский пакет материалов 1 +se-material-science-pack-2=Исследовательский пакет материалов 2 +se-material-science-pack-3=Исследовательский пакет материалов 3 +se-material-science-pack-4=Исследовательский пакет материалов 4 +se-material-spectral-data=Данные о спектрах материалов +se-material-testing-pack=Пакет тестирования материалов +se-material-catalogue-1=Каталог материалов +se-material-catalogue-2=Широкий каталог материалов +se-material-catalogue-3=Исчерпывающий каталог материалов +se-material-catalogue-4=Расширенный каталог материалов +se-material-insight=Открытие о материалах +se-medpack=Аптечка +se-medpack-2=Аптечка 2 +se-medpack-3=Аптечка 3 +se-medpack-4=Аптечка 4 +se-meteor-defence=Противометеорное сооружение +se-meteor-defence-ammo=Снаряды для противометеорного сооружения +se-meteor-point-defence=Противометеорная пушка +se-meteor-point-defence-ammo=Снаряды для противометеорной пушки +se-methane-ice=Метановый лёд +se-micro-black-hole-data=Данные о микро чёрных дырах +se-microwave-observation-data=Данные о микроволновых наблюдениях +se-negative-pressure-data=Данные об отрицательном давлении +se-nano-cold-thermodynamics-data=Данные о холодной термодинамике наноматериалов +se-nano-compressive-strength-data=Данные о прочности наноматериалов на сжатие +se-nano-hot-thermodynamics-data=Данные о горячей термодинамике наноматериалов +se-nanomaterial=Наноматериалы +se-nano-tensile-strength-data=Данные о прочности наноматериалов на разрыв +se-naquium-ore=Наквитит +se-naquium-ore-crushed=Измельчённый наквитит +se-naquium-ore-washed=Промытый наквитит +se-naquium-powder=Наквиевый порошок +se-naquium-plate=Наквиевая плита +se-naquium-ingot=Наквиевый слиток +se-neural-anomaly-data=Данные о нейронной аномалии +se-nutrient-vat=Бак с питательными веществами +se-observation-frame-blank=Чистая наблюдательная система +se-observation-frame-gammaray=Гамма-лучевая наблюдательная система +se-observation-frame-infrared=Инфракрасная наблюдательная система +se-observation-frame-microwave=Микроволновая наблюдательная система +se-observation-frame-radio=Радиоволновая наблюдательная система +se-observation-frame-uv=УФ наблюдательная система +se-observation-frame-visible=Видимая наблюдательная система +se-observation-frame-xray=Рентгеновская наблюдательная система +se-orbital-data=Данные орбитальных расчетов +se-particle-beam-shielding-data=Данные по защите от пучка частиц +se-plague-bomb=Чумная ракета +se-plasma-canister=Канистра плазмы +se-plasma-electrodynamics-data=Данные о плазменной электродинамике +se-plasma-thermodynamics-data=Данные о плазменной термодинамике +se-polarisation-data=Поляризационные данные +se-pressure-containment-data=Данные об удержании давления +se-quantum-phenomenon-data=Данные о квантовых феноменах +se-quark-data=Данные о кварках +se-radiation-data=Данные о радиации +se-radiation-exposure-data=Данные о радиационном воздействии +se-radiation-exposure-resistance-data=Данные о сопротивлении радиации +se-radiation-shielding-data=Данные о радиационной защите +se-radio-observation-data=Данные о радиоволновых наблюдениях +se-rigidity-data=Данные о жёсткости +se-rtg-equipment=Портативный РИТЭГ +se-rtg-equipment-2=Портативный РИТЭГ МК2 +se-scrap=Мусор +se-shear-strength-data=Данные о прочности на сдвиг +se-significant-data=Важные данные +se-significant-specimen=Важная биомасса +se-singularity-data=Данные о сингулярности +se-space-capsule=Космическая капсула +se-space-mirror=Мультиспектральное зеркало +se-space-platform-plating=Обшивка космической платформы +se-space-platform-scaffold=Каркас космической платформы +se-space-rail=Космические рельсы +se-spaceship-floor=Пол космического корабля +se-specimen=Биомасса +se-subatomic-data=Субатомные данные +se-superconductivity-data=Данные о сверхпроводимости +se-superconductor=Сверхпроводник +se-superconductive-cable=Сверхпроводящий кабель +se-tensile-strength-data=Данные о прочности на разрыв +se-tesla-ammo=Патроны тесла-пушки +se-tesla-gun=Тесла-пушка +se-thruster-suit=Реактивный костюм +se-thruster-suit-2=Реактивный костюм МК2 +se-thruster-suit-3=Реактивный костюм МК3 +se-thruster-suit-4=Реактивный костюм МК4 +se-timespace-anomaly-data=Данные о пространственно-временной аномалии +se-used-lifesupport-canister=Использованная канистра жизнеобеспечения +se-uv-observation-data=Данные об УФ-наблюдениях +se-visible-observation-data=Данные о видимых наблюдениях +se-vitamelange=Витамеланж +se-vitamelange-nugget=Самородок витамеланжа +se-vitamelange-roast=Обжаренный витамеланж +se-vitamelange-spice=Пряный витамеланж +se-vitamelange-extract=Экстракт витамеланжа +se-vulcanite=Вулканит +se-vulcanite-crushed=Измельчённый вулканит +se-vulcanite-washed=Промытый вулканит +se-vulcanite-block=Вулканитовый кирпич +se-vulcanite-ion-exchange-beads=Катионо-ионообменные шарики +se-water-ice=Водяной лёд +se-xray-observation-data=Данные о рентгеновских наблюдениях +se-zero-point-energy-data=Данные о нулевой энергии +se-rocket-science-pack=Исследовательский пакет ракетостроения +space-science-pack=Оптимизационный иследовательский пакет +speed-module-4=Модуль скорости 4 +speed-module-5=Модуль скорости 5 +speed-module-6=Модуль скорости 6 +speed-module-7=Модуль скорости 7 +speed-module-8=Модуль скорости 8 +speed-module-9=Модуль скорости 9 +se-aeroframe-pole=Бериллиевый стержень +se-aeroframe-scaffold=Бериллиевый каркас +se-aeroframe-bulkhead=Бериллиевая перегородка +se-lattice-pressure-vessel=Решётчатый сосуд высокого давления +se-heavy-girder=Тяжёлая балка +se-heavy-bearing=Тяжёлый подшипник +se-heavy-composite=Тяжёлый композит +se-heavy-assembly=Тяжёлая сборка +se-bioscrubber=Биопереработчик +se-vitalic-epoxy=Виталическая эпоксидная смола +se-vitalic-reagent=Виталический реагент +se-vitalic-acid=Виталическая кислота +se-self-sealing-gel=Самоуплотняющийся гель +se-holmium-cable=Холмиевый кабель +se-holmium-solenoid=Холмиевый соленоид +se-quantum-processor=Квантовый процессор +se-dynamic-emitter=Динамический излучатель +se-naquium-processor=Наквиевый процессор +se-naquium-cube=Наквиевый куб +se-naquium-tessaract=Наквиевый тессеракт +se-wide-beacon=Маяк большого охвата +se-wide-beacon-2=Маяк большого охвата 2 +se-lifesupport-equipment-1=Оборудование жизнеобеспечения МК1 +se-lifesupport-equipment-2=Оборудование жизнеобеспечения МК2 +se-lifesupport-equipment-3=Оборудование жизнеобеспечения МК3 +se-lifesupport-equipment-4=Оборудование жизнеобеспечения МК4 +se-naquium-heat-pipe=Наквиевая тепловая трубка +se-naquium-heat-pipe-horizontal=Наквиевая горизонтальная тепловая трубка +se-naquium-heat-pipe-vertical=Наквиевая вертикальная тепловая трубка +se-naquium-heat-pipe-long=Наквиевая длинная тепловая трубка __1__ +se-deep-space-transport-belt=Конвейер глубокого космоса +se-deep-space-transport-belt-black=Чёрный конвейер глубокого космоса +se-deep-space-transport-belt-white=Белый конвейер глубокого космоса +se-deep-space-transport-belt-red=Красный конвейер глубокого космоса +se-deep-space-transport-belt-yellow=Жёлтый конвейер глубокого космоса +se-deep-space-transport-belt-green=Зелёный конвейер глубокого космоса +se-deep-space-transport-belt-cyan=Голубой конвейер глубокого космоса +se-deep-space-transport-belt-blue=Синий конвейер глубокого космоса +se-deep-space-transport-belt-magenta=Пурпурный конвейер глубокого космоса +se-deep-space-underground-belt=Подземный конвейер глубокого космоса +se-deep-space-underground-belt-black=Чёрный подземный конвейер глубокого космоса +se-deep-space-underground-belt-white=Белый подземный конвейер глубокого космоса +se-deep-space-underground-belt-red=Красный подземный конвейер глубокого космоса +se-deep-space-underground-belt-yellow=Жёлтый подземный конвейер глубокого космоса +se-deep-space-underground-belt-green=Зелёный подземный конвейер глубокого космоса +se-deep-space-underground-belt-cyan=Голубой подземный конвейер глубокого космоса +se-deep-space-underground-belt-blue=Синий подземный конвейер глубокого космоса +se-deep-space-underground-belt-magenta=Пурпурный подземный конвейер глубокого космоса +se-deep-space-splitter=Разделитель глубокого космоса +se-deep-space-splitter-black=Черный разделитель глубокого космоса +se-deep-space-splitter-white=Белый разделитель глубокого космоса +se-deep-space-splitter-red=Красный разделитель глубокого космоса +se-deep-space-splitter-yellow=Жёлтый разделитель глубокого космоса +se-deep-space-splitter-green=Зелёный разделитель глубокого космоса +se-deep-space-splitter-cyan=Голубой разделитель глубокого космоса +se-deep-space-splitter-blue=Синий разделитель глубокого космоса +se-deep-space-splitter-magenta=Пурпурный разделитель глубокого космоса +se-blueprint-registration-point=Пункт регистрации чертежей +se-delivery-cannon-capsule=Капсула доставочной пушки +se-delivery-cannon-capsule-packed=Капсула доставочной пушки: __1__ +se-delivery-cannon-targeter=Прицел доставочной пушки +se-delivery-cannon-weapon-capsule=Оружейная капсула доставочной пушки +se-delivery-cannon-weapon-capsule-packed=Оружейная капсула доставочной пушки: __1__ +se-delivery-cannon-weapon-targeter=Прицел оружейной доставочной пушки +se-energy-transmitter-targeter=Прицел энергетического луча +se-arcosphere=Аркосфера +se-arcosphere-a=λ Аркосфера Лямбда +se-arcosphere-b=ξ Аркосфера Кси +se-arcosphere-c=ζ Аркосфера Зета +se-arcosphere-d=θ Аркосфера Тета +se-arcosphere-e=ε Аркосфера Эпсилон +se-arcosphere-f=φ Аркосфера Фи +se-arcosphere-g=γ Аркосфера Гамма +se-arcosphere-h=ω Аркосфера Омега +se-arcosphere-collector=Сборщик аркосфер +se-star-probe=Звёздный зонд +se-belt-probe=Зонд пояса астероидов +se-void-probe=Зонд межзвёздной пустоты +se-star-probe-data=Данные звёздного зонда +se-belt-probe-data=Данные зонда пояса астероидов +se-void-probe-data=Данные зонда межзвёздной пустоты +se-nano-engineering-data=Данные о наноинжерении +se-annihilation-data=Данные об аннигиляции +se-naquium-structural-data=Данные о структуре наквия +se-hyperlattice-data=Данные о гипер-решётке +se-naquium-energy-data=Данные об энергии наквия +se-space-fold-data=Данные о складывании пространства +se-space-warp-data=Данные о деформации пространства +se-space-dialation-data=Данные о расширении пространства +se-space-injection-data=Данные об инъекции пространства +se-interstellar-data=Данные о межзвёздных путешествиях +se-teleportation-data=Данные о телепортации +se-wormhole-data=Данные о кротовой норе +se-rhga-data=Данные анализа гиперграфа реальности +se-deep-catalogue-1=Каталог глубокого космоса +se-deep-catalogue-2=Широкий каталог глубокого космоса +se-deep-catalogue-3=Исчерпывающий каталог глубокого космоса +se-deep-catalogue-4=Расширенный каталог глубокого космоса +se-space-probe-rocket=Ракета космического зонда +se-space-probe-rocket-deployed=Ракета космического зонда (Размещена) +se-railgun=Рельсотрон +se-railgun-ammo=Патроны для рельсотрона + +[item-description] +satellite=Спутник должен быть помещён в шахту спутниковой ракеты (или ракетную шахту космического зонда). Спутник может определять точные координаты тел в солнечной системе, в которой он запущен, или координаты далёких звезд. Предоставляет [img=item/se-satellite-telemetry] Спутниковую телеметрию. +se-satellite-telemetry=Регистрируемая спутниковая телеметрия, необходимая для ракетной науки. Получается при запуске [img=item/satellite] Навигационного спутника из шахты спутниковой ракеты (или ракетной шахты космического зонда). +se-antimatter-canister=Самая плотная форма энергии в безопасном для транспортировки контейнере. +se-astronomic-science-pack-1=Используется космическими лабораториями для исследований. +se-astronomic-science-pack-2=Используется космическими лабораториями для исследований. +se-astronomic-science-pack-3=Используется космическими лабораториями для исследований. +se-astronomic-science-pack-4=Используется космическими лабораториями для исследований. +se-beryllium-ore=Бериллиевая руда +se-biological-science-pack-1=Используется космическими лабораториями для исследований. +se-biological-science-pack-2=Используется космическими лабораториями для исследований. +se-biological-science-pack-3=Используется космическими лабораториями для исследований. +se-biological-science-pack-4=Используется космическими лабораториями для исследований. +se-canister=Многоцелевой герметичный сосуд +se-bloater-ammo=Создаёт на земле заражающую лужу из биологического ила. Заражённые враги раздуваются, что затрудняет их передвижение и наносит постепенный урон. Если они умирают, будучи раздутыми, они лопаются, и их разлетающиеся внутренности наносят урон ближайшим врагам, потенциально вызывая цепную реакцию. Общий урон кровавых снарядов составляет 50% от их максимального запаса здоровья. +se-pheromone-ammo=Сбивает с толку вражеского кусаку или плеваку, заставляя его думать, что вы дружелюбны, а их род - враги. +se-cryogun=Создаёт стену из льда, которая может заморозить врагов. +se-rocket-launch-pad-silo-dummy-ingredient-item=Создаётся помещением 100 секций грузовой ракеты и 1 космической капсулы в грузовую ракетную шахту. +se-cargo-rocket-cargo-pod=Компонент секции грузовой ракеты. +se-cargo-rocket-fuel-tank=Компонент секции грузовой ракеты. +se-cargo-rocket-section=Ключевой компонент грузовой ракеты. Поместите в грузовую ракетную шахту. Требуется 100 на ракету. Могут быть возвращены после посадки (20% базовый возврат). +se-cargo-rocket-section-packed=Упакованные для транспортировки секции грузовой ракеты. Должны быть распакованы для использования в строительстве ракеты. +se-deep-space-science-pack=Используется космическими лабораториями для исследований. +se-energy-science-pack-1=Используется космическими лабораториями для исследований. +se-energy-science-pack-2=Используется космическими лабораториями для исследований. +se-energy-science-pack-3=Используется космическими лабораториями для исследований. +se-energy-science-pack-4=Используется космическими лабораториями для исследований. +se-heat-shielding=Композитная панель, используемая для высокотемпературных приложений и космических структур. +se-holmium-ore=Холмиевая руда +se-iridium-ore=Иридиевая руда +se-material-science-pack-1=Используется космическими лабораториями для исследований. +se-material-science-pack-2=Используется космическими лабораториями для исследований. +se-material-science-pack-3=Используется космическими лабораториями для исследований. +se-material-science-pack-4=Используется космическими лабораториями для исследований. +se-medpack=Используйте, чтобы излечить себя. +se-medpack-2=Используйте, чтобы излечить себя. +se-medpack-3=Используйте, чтобы излечить себя. +se-medpack-4=Используйте, чтобы излечить себя. +se-meteor-defence=Может защитить целую планету от метеоров, но может выстрелить только по 1 метеору за раз. Должно быть заряжено противометеорными боеприпасами и полностью заряжено для стрельбы. Точность 80%. Требуется подзарядка после выстрела. При подзарядке потребляет 20 МВт. +se-meteor-defence-ammo=Уничтожает метеоры. Должны быть загружены в противометеорное сооружение. +se-meteor-point-defence=Защищает область от метеоров. Способна сбить до 4 метеоров за залп. Должна быть заряжена противометеорными снарядами и полностью заряжена, чтобы выстрелить. Радиус 64, точность 50%, подзарядка после выстрела занимает время. Поверните, чтобы изменить режим зарядки. +se-naquium-ore=Наквиевая руда. Можно найти только в глубоком космосе, сокровище межзвёздной пустоты. +se-plague-bomb=Может уничтожить всю жизнь на планете. Обращаться с крайней осторожностью. (Может сильно просадить UPS, пока живность постепенно погибает, не рекомендуется для больших планет и мультиплеера.) +se-rtg-equipment=Радиоизотопный термоэлектрический генератор. Портативный генератор, преобразующий тепло от радиоактивного распада в электричество. Работает десятилетиями без дозаправки. +se-rtg-equipment-2=Радиоизотопный термоэлектрический генератор. Улучшенный портативный генератор, преобразующий тепло от радиоактивного распада в электричество. Работает десятилетиями без дозаправки. +se-space-capsule=Управляющая капсула, необходимая для грузовых ракет. Можно использовать для доставки пассажиров на поверхность ближайшей планеты. Войдите в капсулу, нажав __CONTROL__toggle-driving__. +se-space-platform-plating=[font=default-bold][color=#f5cb48]Ограничение размещения: Космос[/color][/font]\nПродвинутая обшивка, позволяющая быстро передвигаться по космической платформе. +se-space-platform-scaffold=[font=default-bold][color=#f5cb48]Ограничение размещения: Космос[/color][/font]\nБазовый каркас космической платформы, позволяющий размещать некоторые структуры в космосе. +se-space-rail=Рельсы, безопасные для использования в космосе, т.к. они не дают поезду сойти с рельс и разрушить все вокруг. Космическая платформа не требуется, они самоподдерживающиеся. Могут быть использованы на земле для эстетики. +se-spaceship-floor=Это напольное покрытие должно быть подо всеми частями космического корабля с космическими стенами по краям. Любые пробелы в полу нарушат герметичность, и такие секции могут отвалиться. +se-superconductive-cable=Сверхпроводящий композитный кабель, не требующий активного охлаждения. +se-tesla-gun=Скорострельная цепная молния. +se-thruster-suit=Скафандр, необходимый для выживания в космосе.\nИмеет реактивные двигатели и магнитные ботинки. +se-thruster-suit-2=Скафандр, необходимый для выживания в космосе.\nИмеет усиленные реактивные двигатели, больший инвентарь и сетку для оборудования. +se-thruster-suit-3=Скафандр, необходимый для выживания в космосе.\nИмеет усиленные реактивные двигатели, больший инвентарь и сетку для оборудования. +se-thruster-suit-4=Скафандр, необходимый для выживания в космосе.\nИмеет усиленные реактивные двигатели, больший инвентарь и сетку для оборудования. +se-rocket-science-pack=Используется космическими лабораториями для исследований. Должен быть сделан в космосе. +space-science-pack=Используется для улучшения большинства предметов. +se-wide-beacon=15 ячеек для модулей. Передаёт эффекты модулей ближайшим дружественным объектам в пределах 14 клеток. Несколько маяков, воздействующих на один и тот же объект, перегрузят его и не позволят ему работать. +se-wide-beacon-2=20 ячеек для модулей. Передаёт эффекты модулей ближайшим дружественным объектам в пределах 14 клеток. Несколько маяков, воздействующих на один и тот же объект, перегрузят его и не позволят ему работать. +se-lifesupport-equipment-1=Повышает эффективность жизнеобеспечения на +100% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. +se-lifesupport-equipment-2=Повышает эффективность жизнеобеспечения на +200% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. +se-lifesupport-equipment-3=Повышает эффективность жизнеобеспечения на +400% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. +se-lifesupport-equipment-4=Повышает эффективность жизнеобеспечения на +800% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. +se-arcosphere=Заработано в исследованиях Аркосферы, получено через Информатрон. +se-arcosphere-collector=Собирает аркосферы из межзвёздной пустоты. Должен быть запущен из шахты космического зонда, которая находится в поле астероидов. Аркосферы становится труднее найти по мере того, как вы их собираете. +se-star-probe=Собирает данные от звезды и возвращает [img=item/se-star-probe-data] данные звёздного зонда. Запускается из ракетной шахты космического зонда, находящейся на близкой орбите звезды. +se-belt-probe=Собирает данные из пояса астероидов и возвращает [img=item/se-belt-probe-data] данные зонда пояса астероидов. Запускается из ракетной шахты космического зонда, которая находится в поясе астероидов. +se-void-probe=Собирает данные из пустоты и возвращает [img=item/se-void-probe-data] данные зонда межзвёздной пустоты. Запускается из ракетной шахты космического зонда, которая находится на поле астероидов. +se-interstellar-data=Создаются в Нексусе на движущемся космическом корабле. При перемещении в межзвездном пространстве на более быстром корабле данные генерируются намного быстрее. +se-deep-catalogue-1=Наквий и наноинженерия. +se-deep-catalogue-2=Гипер-решёточные структуры, сингулярности и аннигиляция. +se-deep-catalogue-3=Микропространственные искажения и сверхпространственная наноинженерия. +se-deep-catalogue-4=Макропространственные искажения и сверхпространственные путешествия. +automation-science-pack=Используется для исследований в обычных лабораториях. +chemical-science-pack=Используется для исследований в обычных лабораториях. +logistic-science-pack=Используется для исследований в обычных лабораториях. +military-science-pack=Используется для исследований в обычных лабораториях. +production-science-pack=Используется для исследований в обычных лабораториях. +se-meteor-point-defence-container=Уничтожает метеоры. Должны быть загружены в противометеорную пушку. +utility-science-pack=Используется для исследований в обычных лабораториях. +beacon=8 ячеек для модулей. Передаёт эффекты модулей ближайшим дружественным объектам в пределах 3 клеток. Несколько маяков, воздействующих на один и тот же объект, перегрузят его и не позволят ему работать. +se-delivery-cannon=Обеспечивает точную доставку упакованных ресурсов с помощью доставочной пушки. +se-delivery-cannon-weapon=Обеспечивает точную доставку особых боеприпасов с помощью оружейной доставочной пушки. + +[recipe-name] +core-fragment=Переработка фрагментов ядра (__1__) +rocket-fuel=Твёрдое ракетное топливо +se-astrometric-analysis-multispectral-1=Мультиспектральный астрометрический анализ 1 +se-astrometric-analysis-multispectral-2=Мультиспектральный астрометрический анализ 2 +se-astrometric-analysis-multispectral-3=Мультиспектральный астрометрический анализ 3 +se-astronomic-insight-1=Астрономическое открытие +se-astronomic-insight-2=Широкое астрономическое открытие +se-astronomic-insight-3=Исчерпывающее астрономическое открытие +se-astronomic-insight-4=Расширенное астрономическое открытие +se-biological-insight-1=Биологическое открытие +se-biological-insight-2=Широкое биологическое открытие +se-biological-insight-3=Исчерпывающее биологическое открытие +se-biological-insight-4=Расширенное биологическое открытие +se-bio-methane-to-crude-oil=Биопроцесс переработки метана в сырую нефть +se-bio-sludge-crude-oil=Биоотходы от экспериментальной биомассы +se-bio-sludge-decontamination=Обеззараживание биоотходов +se-bio-sludge-from-fish=Биоотходы из рыбы +se-bio-sludge-from-wood=Биоотходы из дерева +se-bio-sludge-from-vitamelange=Биоотходы из витамеланжа +se-bio-sludge=Биоотходы из биомассы +se-broken-data-scrapping=Утилизация сломанных карт памяти +se-cargo-rocket-section-pack=Упаковать секции грузовой ракеты +se-cargo-rocket-section-unpack=Распаковать секции грузовой ракеты +se-condenser-turbine-reclaim-water=Генерация энергии с возвратом воды +se-core-fragment-omni=Переработка фрагментов ядра +se-core-mining=Глубинное бурение +se-empty-antimatter-canister=Поток антиматерии из канистры +se-empty-barrel-scrapping=Утилизация пустых бочек +se-empty-barrel-reprocessing=Переработка пустых бочек +se-space-capsule-scrapping=Утилизация космической капсулы +se-cargo-pod-scrapping=Утилизация грузового отсека +se-energy-insight-1=Энергетическое открытие +se-energy-insight-2=Широкое энергетическое открытие +se-energy-insight-3=Исчерпывающее энергетическое открытие +se-energy-insight-4=Расширенное энергетическое открытие +se-formatting-1=Форматирование данных +se-formatting-2=Эффективное форматирование данных +se-formatting-3=Продвинутое форматирование данных +se-formatting-4=Глубокое форматирование данных +se-material-insight-1=Открытие о материалах +se-material-insight-2=Широкое открытие о материалах +se-material-insight-3=Исчерпывающее открытие о материалах +se-material-insight-4=Расширенное открытие о материалах +se-matter-fusion-copper=Синтез материи (Медь) +se-matter-fusion-dirty=Синтез материи (Мусор) +se-matter-fusion-iron=Синтез материи (Железо) +se-matter-fusion-stone=Синтез материи (Камень) +se-matter-fusion-uranium=Синтез материи (Уран) +se-matter-fusion-to=Синтез материи (__1__) +se-orbital-data=Данные орбитальных расчетов +se-plasma-canister-empty=Поток плазмы из канистры +se-pulverised-sand=Измельчённый песок +se-radiating-space-coolant-fast=Быстрое охлаждение терможидкости до -10°C (прохладная) +se-radiating-space-coolant-normal=Охлаждение терможидкости до -10°C (прохладная) +se-radiating-space-coolant-slow=Медленное охлаждение терможидкости до -10°C (прохладная) +se-mixed-methane-gas-separation=Разделение смешанного метана +se-rocket-fuel-from-water-copper=Ракетное топливо из воды +se-scrap-decontamination=Обеззараживание мусора +se-scrap-recycling=Переработка мусора +se-space-coolant-cold=Переохлаждение терможидкости до -100°C (холодная) +se-space-coolant-supercooled=Переохлаждение терможидкости до -273°C (переохлаждённая) +se-space-coolant-supercooled-cryonite=Криоохлаждение терможидкости до -273°C (переохлаждённая) +se-space-coolant-cold-cryonite=Криоохлаждение терможидкости до -100°C (холодная) +se-space-coolant-supercoole-cryonite=Криоохлаждение терможидкости до -273°C (переохлаждённая) +se-simulation-a=Астрономическая симуляция +se-simulation-ab=Симуляция панспермии +se-simulation-abm=Симуляция ксенопрогрессии +se-simulation-am=Симуляция распределения материи +se-simulation-as=Симуляция астрочастиц +se-simulation-asb=Симуляция астробионики +se-simulation-asbm=Симуляция вселенной +se-simulation-asm=Астрофизическая симуляция +se-simulation-b=Биологическая симуляция +se-simulation-bm=Биомеханическая симуляция +se-simulation-m=Симуляция материалов +se-simulation-s=Энергетическая симуляция +se-simulation-sb=Биохимическая симуляция +se-simulation-sbm=Симуляция нанитов +se-simulation-sm=Симуляция наноматериалов +se-space-water-decontamination=Обеззараживание космической воды +se-spaceship-rocket-engine-burn=Сжигание жидкого ракетного топлива +se-specimen-fish=Выращивание рыбы в условиях микрогравитации +se-specimen-wood=Выращивание деревьев в условиях микрогравитации +se-thermodynamics-coal=Запекание под давлением в уголь +se-used-lifesupport-canister-cleaning=Очистка канистр жизнеобеспечения +se-used-lifesupport-canister-cleaning-space=Обеззараживание канистр жизнеобеспечения +space-science-pack=Оптимизационный исследовательский пакет +se-rocket-science-pack=Исследовательский пакет ракетостроения +se-big-turbine-internal=Декомпрессия высокотемпературного пара +se-arcosphere-fracture=Поляризация аркосферы +se-arcosphere-fold-in=Инверсия аркосферы +se-arcosphere-fold-out=Инверсия аркосферы +se-arcosphere-folding=Инверсия аркосферы: __1__ __2__ в __3__ __4__ +se-electric-boiling-void=Отвод испарений +se-space-probe-rocket-deployed=Ракета космического зонда (Размещена) +se-distortion-drive=Двигатель искажения +se-generic-scrapping=__1__ - утилизация +se-generic-recycling=__1__ - переработка + +[recipe-description] +se-astronomic-insight-2=Более сложный, но более ресурсоэффективный. +se-astronomic-insight-3=Более сложный, но более ресурсоэффективный. +se-astronomic-insight-4=Более сложный, но более ресурсоэффективный. +se-biological-insight-2=Более сложный, но более ресурсоэффективный. +se-biological-insight-3=Более сложный, но более ресурсоэффективный. +se-biological-insight-4=Более сложный, но более ресурсоэффективный. +se-core-mining=Конкретный получаемый фрагмент зависит от планеты. Реальное время производства зависит от количества глубинных буров на планете или луне. +se-energy-insight-2=Более сложный, но более ресурсоэффективный. +se-energy-insight-3=Более сложный, но более ресурсоэффективный. +se-energy-insight-4=Более сложный, но более ресурсоэффективный. +se-material-insight-2=Более сложный, но более ресурсоэффективный. +se-material-insight-3=Более сложный, но более ресурсоэффективный. +se-material-insight-4=Более сложный, но более ресурсоэффективный. +se-radiating-space-coolant-fast=Многократное охлаждение и нагревание терможидкости вызывает деградацию, более быстрое охлаждение приводит к увеличению потерь. +se-radiating-space-coolant-normal=Многократное охлаждение и нагревание терможидкости вызывает деградацию. +se-radiating-space-coolant-slow=Многократное охлаждение и нагревание терможидкости вызывает деградацию, медленное охлаждение вызывает меньшую деградацию. +se-arcosphere-fracture=Аркосферы могут быть собраны [img=item/se-arcosphere-collector] Сборщиком аркосфер +se-distortion-drive=Этот процесс должен активно происходить, чтобы активировать способность искажения Нексуса и выиграть игру. При критической скорости потребляет 8 ГВт. +se-delivery-cannon-weapon-pack-se-iridium-piledriver=Огромный физический урон на небольшой площади, вторичный взрывной урон ударной волной. + +[technology-name] +effectivity-module-4=Модуль эффективности 4 +effectivity-module-5=Модуль эффективности 5 +effectivity-module-6=Модуль эффективности 6 +effectivity-module-7=Модуль эффективности 7 +effectivity-module-8=Модуль эффективности 8 +effectivity-module-9=Модуль эффективности 9 +energy-shield-equipment=Энергетический щит +energy-shield-mk2-equipment=Энергетический щит МК2 +energy-shield-mk3-equipment=Энергетический щит МК3 +energy-shield-mk4-equipment=Энергетический щит МК4 +energy-shield-mk5-equipment=Энергетический щит МК5 +energy-shield-mk6-equipment=Энергетический щит МК6 +sand-processing=Производство песка +glass-processing=Производство стекла +liquid-rocket-fuel=Жидкое ракетное топливо +productivity-module-4=Модуль продуктивности 4 +productivity-module-5=Модуль продуктивности 5 +productivity-module-6=Модуль продуктивности 6 +productivity-module-7=Модуль продуктивности 7 +productivity-module-8=Модуль продуктивности 8 +productivity-module-9=Модуль продуктивности 9 +rocket-silo=Спутниковая ракетная шахта +rocketry=Боевые ракеты +se-adaptive-armour=Адаптивная броня +se-antimatter-engine=Двигатель на антиматерии +se-antimatter-reactor=Реактор на антиматерии +se-antimatter-production=Производство антиматерии +se-astronomic-science-pack=Астрономический исследовательский пакет +se-biological-science-pack=Биологический исследовательский пакет +se-condenser-turbine=Конденсирующая турбина +se-core-miner=Глубинное бурение +se-biogun=Био-пушка +se-cryogun=Крио-пушка +se-deep-space-science-pack=Исследовательский пакет глубокого космоса +se-deep-catalogue=Каталог глубокого космоса +se-dimensional-anchor=Якорь измерения +se-electric-boiler=Электрический бойлер +se-energy-science-pack=Энергетический исследовательский пакет +se-fluid-burner-generator=Жидкостный изотермический генератор +se-fuel-refining=Очистка топлива +se-heat-shielding=Теплоизоляция +se-long-range-star-mapping=Картографирование далёких звёзд +se-material-science-pack=Исследовательский пакет материалов +se-medpack=Аптечка +se-medpack-2=Аптечка 2 +se-medpack-3=Аптечка 3 +se-medpack-4=Аптечка 4 +se-meteor-defence=Противометеорное сооружение +se-meteor-point-defence=Противометеорная пушка +se-nanomaterial=Наноматериалы +se-plague=Чума +se-processing-beryllium=Переработка бериллия +se-processing-cryonite=Переработка крионита +se-processing-holmium=Переработка холмия +se-processing-iridium=Переработка иридия +se-processing-naquium=Переработка наквия +se-processing-vitamelange=Переработка витамеланжа +se-processing-vulcanite=Переработка вулканита +se-pulveriser=Измельчитель +se-railgun=Рельсотрон +se-rocket-cargo-safety=Безопасность ракетных грузов +se-rocket-fuel-from-water=Ракетное топливо из воды +se-rocket-launch-pad=Грузовая ракетная шахта +se-rocket-landing-pad=Ракетная посадочная площадка +se-rocket-reusability=Повторное использование ракет +se-rocket-survivability=Выживаемость ракет +se-rtg-equipment=Портативный РИТЭГ +se-rtg-equipment-2=Портативный РИТЭГ МК2 +se-space-assembling=Космическая сборка +se-space-accumulator=Холмиевый аккумулятор +se-space-accumulator-2=Наквиевый аккумулятор +se-space-astrometrics-laboratory=Астрометрический центр +se-space-biochemical-laboratory=Биохимический центр +se-space-catalogue-astronomic=Астрономический каталог +se-space-catalogue-biological=Биологический каталог +se-space-catalogue-universal=Универсальный каталог +se-space-catalogue-energy=Энергетический каталог +se-space-catalogue-material=Каталог материалов +se-space-data-card=Карта данных +se-space-decontamination-facility=Центр обеззараживания +se-space-electromagnetics-laboratory=Центр электромагнетизма +se-space-genetics-laboratory=Центр генетики +se-space-gravimetrics-laboratory=Гравиметрический центр +se-space-growth-facility=Центр роста +se-space-hypercooling=Переохлаждение +se-space-laser-laboratory=Лазерный центр +se-lifesupport-facility=Центр жизнеобеспечения +se-space-manufactory=Космическая фабрика +se-space-material-fabricator=Синтезатор материи +se-space-matter-fusion=Слияние материи +se-space-mechanical-laboratory=Центр механики +se-space-particle-accelerator=Ускоритель частиц +se-space-particle-collider=Коллайдер частиц +se-space-plasma-generator=Генератор плазмы +se-space-platform-plating=Обшивка космической платформы +se-space-platform-scaffold=Каркас космической платформы +se-space-radiation-laboratory=Радиационный центр +se-space-radiating-efficiency=Эффективность теплового излучения +se-space-radiating-speed=Скорость теплового излучения +se-space-radiator=Тепловой радиатор +se-space-radiator-2=Тепловой радиатор 2 +se-space-rail=Космическая железная дорога +se-recycling-facility=Центр переработки +se-space-science-lab=Космическая научная лаборатория +se-space-simulation-ab=Симуляция панспермии +se-space-simulation-am=Симуляция астроматериалов +se-space-simulation-as=Симуляция астрочастиц +se-space-simulation-bm=Биомеханическая симуляция +se-space-simulation-sb=Биохимическая симуляция +se-space-simulation-sm=Симуляция наноматериалов +se-space-simulation-abm=Симуляция ксенопрогрессии +se-space-simulation-asb=Симуляция астробионики +se-space-simulation-asm=Астрофизическая симуляция +se-space-simulation-sbm=Симуляция нанитов +se-space-simulation-asbm=Симуляция вселенной +se-space-solar-panel=Плоская солнечная панель +se-space-spectrometry-facility=Центр спектрометрии +se-space-supercomputer=Суперкомпьютер +se-space-telescope=Телескоп +se-space-telescope-gammaray=Гамма-лучевой телескоп +se-space-telescope-xray=Рентгеновский телескоп +se-space-telescope-microwave=Микроволновый телескоп +se-space-telescope-radio=Радиотелескоп +se-space-thermodynamics-laboratory=Лаборатория термодинамики +se-spaceship=Космический корабль +se-spaceship-integrity=Структурная целостность космического корабля +se-factory-spaceship=Космический корабль - фабрика +se-superconductive-cable=Сверхпроводящий кабель +se-teleportation=Телепортация +se-tesla-gun=Тесла-пушка +se-thruster-suit=Реактивный костюм +space-science-pack=Оптимизационный иследовательский пакет +se-rocket-science-pack=Иследовательский пакет ракетостроения +speed-module-4=Модуль скорости 4 +speed-module-5=Модуль скорости 5 +speed-module-6=Модуль скорости 6 +speed-module-7=Модуль скорости 7 +speed-module-8=Модуль скорости 8 +speed-module-9=Модуль скорости 9 +se-aeroframe-pole=Бериллиевый стержень +se-aeroframe-scaffold=Бериллиевый каркас +se-aeroframe-bulkhead=Бериллиевая перегородка +se-lattice-pressure-vessel=Решётчатый сосуд высокого давления +se-heavy-girder=Тяжёлая балка +se-heavy-bearing=Тяжёлый подшипник +se-heavy-composite=Тяжёлый композит +se-heavy-assembly=Тяжёлая сборка +se-bioscrubber=Биопереработчик +se-vitalic-epoxy=Виталическая эпоксидная смола +se-vitalic-reagent=Виталический реагент +se-vitalic-acid=Виталическая кислота +se-self-sealing-gel=Самоуплотняющийся гель +se-holmium-cable=Холмиевый кабель +se-holmium-solenoid=Холмиевый соленоид +se-quantum-processor=Квантовый процессор +se-dynamic-emitter=Динамический излучатель +se-naquium-processor=Наквиевый процессор +se-naquium-cube=Наквиевый куб +se-naquium-tessaract=Наквиевый тессеракт +se-wide-beacon=Маяк большого охвата +se-wide-beacon-2=Маяк большого охвата 2 +se-lifesupport-equipment=Оборудование жизнеобеспечения +se-lifesupport-equipment-1=Оборудование жизнеобеспечения МК1 +se-lifesupport-equipment-2=Оборудование жизнеобеспечения МК2 +se-lifesupport-equipment-3=Оборудование жизнеобеспечения МК3 +se-lifesupport-equipment-4=Оборудование жизнеобеспечения МК4 +se-supercharger=Супер-зарядка +se-addon-power-pole=Дополнительная опора ЛЭП +se-pylon=Пилон +se-pylon-substation=Пилон-подстанция +se-pylon-construction=Строительный пилон +se-pylon-construction-radar=Строительный пилон с радаром +se-shield-projector=Проектор щита +se-deep-space-transport-belt=Конвейеры глубокого космоса +se-big-turbine=Высокотемпературная турбина-генератор +se-big-heat-exchanger=Высокотемпературный теплообменник +se-zone-discovery-random=Открытие зон +se-zone-discovery-targeted=Открытие целевых зон +se-zone-discovery-deep=Открытие зон глубокого космоса +se-delivery-cannon=Доставочная пушка +se-delivery-cannon-capsule-iridium=Иридиевая капсула доставочной пушки +se-delivery-cannon-weapon=Оружейная доставочная пушка +se-spaceship-clamps=Зажимы для стыковки космических кораблей +se-bio-upgrade-constitution=Био-улучшение: Телосложение +se-bio-upgrade-strength=Био-улучшение: Сила +se-bio-upgrade-agility=Био-улучшение: Ловкость +se-bio-upgrade-dexterity=Био-улучшение: Выносливость +se-bio-upgrade-intelligence=Био-улучшение: Интеллект +se-energy-beaming=Энергетические лучи +se-energy-beam-defence=Зонт: защита от энергетических лучей +se-nexus=Нексус +se-spaceship-victory=Победа: Космический корабль +se-arcosphere=Сбор аркосфер +se-arcosphere-folding=Складывание аркосферы +se-space-probe=Ракетная шахта космического зонда +se-linked-container=Хранилище Арколинк +k2-conversion=__1__: преобразование + +[technology-description] +energy-shield-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +energy-shield-mk2-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +energy-shield-mk3-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +energy-shield-mk4-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +energy-shield-mk5-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +energy-shield-mk6-equipment=Защитный пузырь. Быстро заряжается, но требует много энергии. +sand-processing=Дробление, перемалывание и фильтрация сырья в чистый песок. +glass-processing=Плавление песка в стекло. +rocket-silo=Позволяет запускать спутники на орбиту для открытия новых планет. +se-adaptive-armour=Броня, использующая энергию для самопочинки. Выполняет схожую роль с энергетическим щитом с меньшими требованиями энергии и гораздо меньшей скоростью регенерации. +se-antimatter-engine=Аннигиляция антиматерии для создания невероятной тяги. +se-antimatter-reactor=Аннигилирует антиматерию с материей для получения экстремального тепла. +se-antimatter-production=Создание антиматерии, самой плотной формы хранимой энергии. +se-astronomic-science-pack=Позволяет исследовать технологии, связанные с космическими путешествиями и межзвёздной логистикой. +se-biological-science-pack=Позволяет исследовать технологии, связанные с улучшением ваших физических возможностей, биооружия и нейропроцессоров. +se-condenser-turbine=75% от эффективности паровой турбины, но 99% использованного пара возвращается в виде воды. Диапазон температур: от 100 до 999.\nМакс. выход: 10 МВт. +se-core-miner=Позволяет добывать неограниченные ресурсы с планет и лун, но добыча снижается, если на планете уже имеются такие буры. +se-biogun=Оружие, использующее биологические боеприпасы. +se-cryogun=Создаёт стену из льда, которая может заморозить врагов. +se-deep-space-science-pack=Требуется для наиболее продвинутых технологий. +se-deep-catalogue=Космические искажения, экзотическая материя и данные нанотехнологий, структурированные для анализа и компьютерного моделирования. Требуется для самых передовых технологий. +se-dimensional-anchor=Использует гравитацию звезды как точку стабилизации пространственной аномалии. +se-electric-boiler=Получает пар из воды, используя электрическую энергию. Энергоэффективность 90%. +se-energy-science-pack=Позволяет исследовать технологии, связанные с фундаментальными силами и субатомными открытиями. +se-fluid-burner-generator=Потребляет жидкое топливо с запасённой энергией (например, жидкое ракетное топливо) для генерации электричества. Простой и компактный, но не обладает энергоэффективностью больших паровых установок. Создан для космоса. Фактическое потребление жидкости зависит от энергоёмкости жидкого топлива. +se-fuel-refining=Очищает более продвинутые виды топлива. +se-heat-shielding=Композитная панель, используемая для высокотемпературных приложений и космических структур. +se-long-range-star-mapping=Некоторые отдалённые галактики можно идентифицировать по характерным образцам необычных звезд. Результаты записываются в [img=virtual-signal/informatron] Информатрон [__CONTROL__informatron__]. +se-material-science-pack=Позволяет исследовать технологии, связанные с продвинутыми материалами для более продвинутых инженерных требований. +se-medpack=Используйте аптечку, чтобы подлечить себя. +se-medpack-2=Используйте аптечку, чтобы подлечить себя. +se-medpack-3=Используйте аптечку, чтобы подлечить себя. +se-medpack-4=Используйте аптечку, чтобы подлечить себя. +se-meteor-defence=Сбивает метеоры в небе до того, как они разрушат вашу базу. Противометеорное сооружение может защитить всю планету, но может стрелять лишь по 1 метеору за выстрел. +se-meteor-point-defence=Сбивает метеоры в небе до того, как они разрушат вашу базу. Противометеорная пушка может защитить небольшую область от максимум 4 метеоров за раз. +se-nanomaterial=Сложное расположение различных материалов, организованных в наномасштабе, для создания композитного материала с превосходными свойствами. +se-plague=Великая чума уничтожает всю жизнь на планете. Обращаться с КРАЙНЕЙ осторожностью. +se-processing-beryllium=Превращает берилл в бериллий, очень лёгкий, прочный, коррозионно- и радиационно-стойкий металл. Он также почти не взаимодействует с рентгеновскими лучами. +se-processing-cryonite=Переработка замороженных кристаллов крионита в крионитовые стержни, которые находят применение в заморозке, охлаждении и смазке. Крионит в основном встречается на замёрзших планетах. +se-processing-holmium=Превращение холминита в холмий, редкоземельный металл с самой высокой магнитной проницаемостью среди всех элементов. +se-processing-iridium=Превращение иридита в иридий, самый стойкий к коррозии металл и самый плотный элемент при более высоких температурах. Важно для тяжелых условий эксплуатации. +se-processing-naquium=Превращение таинственного кристалла наквитита из глубокого космоса в наквий, металлоподобный материал с необычным пространственно-временным взаимодействием. +se-processing-vitamelange=Превращение примитивной каменной губки витамеланжа в ценный питательный экстракт. +se-processing-vulcanite=Превращение вулканического кристалла вулканита в очищенный порошок, используемый в высокотемпературных процессах плавки, ракетном топливе и других высокотемпературных химических процессах. Вулканит встречается на вулканических планетах и в большинстве фрагментов ядра. +se-pulveriser=Измельчает и дробит твёрдые минералы и фрагменты ядра планеты. +se-railgun=Электромагнитно ускоренные дротики, разогнанные до таких скоростей, что оставляют плазменный след перед тем как испариться. Высокий урон, низкая скорострельность. +se-rocket-cargo-safety=Снижает шанс повреждения грузовых отсеков в полете на 10% (мультипликативно). +se-rocket-fuel-from-water=Генерирует водород-кислородное ракетное топливо через электролиз воды. +se-rocket-launch-pad=Позволяет запускать грузы в космос или на другие планеты. +se-rocket-landing-pad=Позволяет вам доставлять грузовые капсулы на конкретную посадочную площадку. При дальнейшем исследовании она может возвращать части ракет. +se-rocket-reusability=Увеличивает долю частей, которые могут быть возвращены при успешной посадке на посадочную площадку на 4% (базово 20%, максимум 100%). +se-rocket-survivability=Снижает шанс повреждения ракет в полете или шанс навигационной ошибки, приводящей к промаху мимо посадочной площадки на 10% (мультипликативно). +se-rtg-equipment=Радиоизотопный термоэлектрический генератор. Портативный генератор, преобразующий тепло от радиоактивного распада в электричество. Работает десятилетиями без дозаправки. +se-rtg-equipment-2=Радиоизотопный термоэлектрический генератор. Улучшенный портативный генератор, преобразующий тепло от радиоактивного распада в электричество. Работает десятилетиями без дозаправки. +se-space-assembling=Модифицированный сборочный автомат, способный работать в космосе. +se-space-astrometrics-laboratory=Совмещает, сравнивает и подсчитывает различные источники астрономической информации. +se-space-biochemical-laboratory=Продвинутая химическая лаборатория, специализирующаяся на биохимии. Может также проводить базовую химическую и нефтяную переработку. +se-space-catalogue-astronomic=Астрономические данные, подготовленные для анализа и компьютерной симуляции. Требуется для дальнейших астрономических исследований. +se-space-catalogue-biological=Биологические данные, подготовленные для анализа и компьютерной симуляции. Требуется для дальнейших биологических исследований. +se-space-catalogue-universal=Объединённые данные для анализа и компьютерного моделирования. Требуется для дальнейших исследований глубокого космоса. +se-space-catalogue-energy=Энергетические данные, подготовленные для анализа и компьютерной симуляции. Требуется для дальнейших энергетических исследований. +se-space-catalogue-material=Данные о материалах, подготовленные для анализа и компьютерной симуляции. Требуется для дальнейших исследований материалов. +se-space-data-card=Многоцелевое устройство хранения данных. Требуется для более продвинутых исследований. +se-space-decontamination-facility=Очищает вещества для использования в стерильных условиях и подготавливает жидкости для использования в условиях низкого давления. +se-space-electromagnetics-laboratory=Оборудование для использования сильного магнитного поля и экстремальных напряжений. +se-space-genetics-laboratory=Лаборатория, предназначенная для генетического секвенирования, генетических модификаций и генетической печати культур. +se-space-gravimetrics-laboratory=Анализирует и симулирует гравитационные возмущения. +se-space-growth-facility=Выращивает биологические образцы в различных контролируемых условиях, невозможных где-либо еще, например при микрогравитации. +se-space-hypercooling=Производит теплообмен с терможидкостью, делая одну холодней, а другую горячей. +se-space-laser-laboratory=Эксперименты с лазерами. Надевайте защитные очки. +se-lifesupport-facility=Поддержание жизни в различных враждебных средах. +se-space-manufactory=Ключевая технология для массового производства в космосе. +se-space-material-fabricator=Синтезирует новые материалы. Гибрид ускорителя частиц и 3D-принтера. +se-space-matter-fusion=Производит материалы ядерным слиянием. +se-space-mechanical-laboratory=Предлагает спектр механических процессов: дробление, разрывание, сдвиг, вибрация и т.д. +se-space-particle-accelerator=Ускоряет частицы почти до скорости света. +se-space-particle-collider=Сталкивает скоростные частицы и анализирует результат. +se-space-plasma-generator=Генерирует различные виды плазмы. +se-space-platform-plating=Прочная обшивка космической платформы. Гладкая и удобная для быстрой ходьбы. +se-space-platform-scaffold=Базовый каркас космической платформы. Подходит для строительства на нём, но плоховат для ходьбы. +se-space-radiation-laboratory=Относительно безопасное место для работы с радиоактивными материалами. Может использоваться для переработки урана. +se-space-radiator=Излучает излишнее тепло от перегретой терможидкости. +se-space-radiator-2=Излучает излишнее тепло от перегретой терможидкости. +se-space-rail=Рельсы, безопасные для использования в космосе, т.к. они не дают поезду сойти с рельс и разрушить всё вокруг. Могут быть использованы на земле для эстетики. +se-recycling-facility=Утилизация предметов и переработка лома в сырьё. +se-space-science-lab=Позволяет обрабатывать Исследовательские пакеты ракетостроения и более продвинутую космическую науку. +se-space-simulation-ab=Более эффективная симуляция путём комбинирования нескольких дисциплин. +se-space-simulation-am=Более эффективная симуляция путём комбинирования нескольких дисциплин. +se-space-simulation-as=Более эффективная симуляция путём комбинирования нескольких дисциплин. +se-space-simulation-bm=Более эффективная симуляция путём комбинирования нескольких дисциплин. +se-space-simulation-sb=Более эффективная симуляция путём комбинирования нескольких дисциплин. +se-space-simulation-sm=Более эффективная симуляция путём комбинирования нескольких дисциплин. +se-space-simulation-abm=Более эффективная симуляция путём комбинирования нескольких дисциплин. +se-space-simulation-asb=Более эффективная симуляция путём комбинирования нескольких дисциплин. +se-space-simulation-asm=Более эффективная симуляция путём комбинирования нескольких дисциплин. +se-space-simulation-sbm=Более эффективная симуляция путём комбинирования нескольких дисциплин. +se-space-simulation-asbm=Более эффективная симуляция путём комбинирования нескольких дисциплин. +se-space-solar-panel=Высокоэффективная солнечная панель, по которой можно ходить. +se-space-spectrometry-facility=Спектрофотометрия, газовая хроматография, масс-спектрометрия и другие спектрографии. Запусти что-нибудь в стену, отклони это, посмотри куда попадёт. +se-space-supercomputer=Позволяет проводить более продвинутую манипуляцию и обработку данных и симуляции. +se-space-telescope=Cложный телескоп, чувствительный ко многим длинам волн в видимом диапазоне. +se-space-telescope-gammaray=Гамма-лучи не преломляются. Этот мощный телескоп использует зеркала и специальные детекторы. +se-space-telescope-xray=Рентгеновские лучи блокируются большинством атмосфер. Этот мощный телескоп создан для космоса, где атмосфера не проблема. +se-space-telescope-microwave=Огромный телескоп, детектирующий микроволны и реликтовое излучение. +se-space-telescope-radio=Огромный телескоп, детектирующий очень слабые радиоволны от удалённых источников. +se-space-thermodynamics-laboratory=Осуществляет процессы, связанные с экстремальными температурами. Также может выполнять основные термические процессы, например плавку. +se-spaceship=Судно, которое вы строите часть за частью с помощью стен и полов, а затем используете консоль, чтобы слетать на другую планету или дальше. +se-spaceship-integrity=Каждый уровень повышает лимит структурной целостности космического корабля на 100. +se-factory-spaceship=Каждый уровень повышает лимит структурной целостности космического корабля на 500. +se-superconductive-cable=Сверхпроводящий композитный кабель, не требующий активного охлаждения. +se-teleportation=Разблокирует другие технологии телепортации. Эта технология ничего не делает сама по себе, но является воротами к другим технологиям. +se-tesla-gun=Скорострельная цепная молния. Может поразить до 30 врагов за выстрел. Совершает длинные прыжки между целями или короткие прыжки вдоль земли, если целей нет. +se-thruster-suit=Скафандр с реактивными двигателями и магнитными ботинками. Не выходите в космос без него. +space-science-pack=Открывает более прямое развитие ракетной науки и технологий, получаюших преимущества от этих достижений. +se-aeroframe-pole=Прочный лёгкий бериллиевый стержень, обычно используемый как опорная балка в авиастроении и освоении космоса. +se-aeroframe-scaffold=Прочный легкий бериллиевый каркас, обычно используемый в качестве основного внутреннего каркаса для авиации и космических кораблей. +se-aeroframe-bulkhead=Прочная лёгкая воздухонепроницаемая перегородка из бериллия, используемая в качестве внешней обшивки или стен вторичных отсеков авиации и космических кораблей. +se-lattice-pressure-vessel=Прочный и легкий бериллиевый сосуд высокого давления с внутренней решёткой, которая позволяет некоторым жидкостям сжиматься сверх их нормальных пределов. В случае разрыва жидкость под давлением безопасно стравливается. +se-heavy-girder=Тяжелая конструкционная балка из иридия, в основном используется для тяжелой промышленности и тяжелых военных судов. +se-heavy-bearing=Большой тяжёлый иридиевый подшипник, который может бесконечно работать под действием сил, способных раздавить более мелкие материалы. +se-heavy-composite=Толстая, почти непроницаемая переборка, практически не подверженная нагреву, коррозии, радиации и механическим воздействиям, но невероятно тяжелая. +se-heavy-assembly=Тяжёлая механическая сборка шестерён и конфигурируемых компонентов, используемая в тяжёлой промышленности. +se-bioscrubber=Камера обработки материалов, в которой используются биологические процессы для разрушения нежелательных материалов. +se-vitalic-epoxy=Невероятно прочная эпоксидная смола биологического происхождения с регенерирующими свойствами. +se-vitalic-reagent=Эффективный универсальный реагент для широкого спектра химических реакций. +se-vitalic-acid=Крепкий коктейль из различных кислот. +se-self-sealing-gel=Вязкий гель под давлением, но твёрдый, как сталь, под действием вакуума. Часто используется в качестве внутренней пленки в переборках для пассивной герметизации проколов. +se-holmium-cable=Кабель в оболочке, специально разработанный для устранения нежелательного шума в линии, который может мешать работе чувствительной электроники. +se-holmium-solenoid=Чрезвычайно мощный электромагнит. +se-quantum-processor=Использует суперпозицию и запутанность для более эффективной работы над задачами высокой сложности. +se-dynamic-emitter=Быстро регулируемая система излучателя света или частиц, которая может изменять ряд свойств для большего диапазона или режимов сканирования или свойств проникновения материала. +se-naquium-processor=Вычисления в тессеракте наквиума обходят некоторые обычные ограничения на плотность вычислений. +se-naquium-cube=Использование необычного взаимодействия наквия с пространством-временем, чтобы сложить большой объем в маленький куб. +se-naquium-tessaract=Необычный объект, который принимает форму куба, но при повороте или ускорении превращается в ряд других геометрических фигур. +se-wide-beacon=Маяк большого охвата передаёт эффекты модулей ближайшим дружественным объектам в пределах 14 клеток. Имеет 15 ячеек для модулей (20 после улучшения). Несколько маяков, воздействующих на один и тот же объект, перегрузят его и не позволят ему работать. +se-wide-beacon-2=Маяк большого охвата 2 передаёт эффекты модулей ближайшим дружественным объектам в пределах 14 клеток. Имеет 20 ячеек для модулей. Несколько маяков, воздействующих на один и тот же объект, перегрузят его и не позволят ему работать. +se-lifesupport-equipment-1=Повышает эффективность жизнеобеспечения на +100% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. +se-lifesupport-equipment-2=Повышает эффективность жизнеобеспечения на +200% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. +se-lifesupport-equipment-3=Повышает эффективность жизнеобеспечения на +400% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. +se-lifesupport-equipment-4=Повышает эффективность жизнеобеспечения на +800% (добавочно). При установке не в космическом скафандре бонус эффективности уменьшается вдвое и не работает в космосе. +se-supercharger=Может заряжать до 64 дронов одновременно и на высокой скорости. Максимальное энергопотребление 1 ГВт. +se-addon-power-pole=Маленькая опора ЛЭП, предназначенная для присоединения к зданиям или для точного контроля покрытия электросети. +se-pylon=Распределяет электроэнергию. Диапазон подключения 64 клетки. +se-pylon-substation=Распределяет электроэнергию. Диапазон подключения 64 клетки, область электроснабжения 64х64 клетки. +se-pylon-construction=Распределяет электроэнергию и расширяет область строительства. Диапазон подключения 64 клетки, область строительства 64х64 клетки. +se-pylon-construction-radar=Распределяет электроэнергию, расширяет область строительства, проводит радарное сканирование. Диапазон подключения 64 клетки, область строительства и радара 256х256 клеток. Логистическая область 4х4 клетки. +se-shield-projector=Создаёт защитное силовое поле. Больше энергии требуется, когда проектор заряжается или когда щит повреждается. Может блокировать плевки, если установлен мод "Стены блокируют плевки (Walls Block Spitters)". +se-deep-space-transport-belt=Конвейеры для быстрой транспортировки на большие расстояния, которые можно разместить в космосе. Можно использовать разные цвета, чтобы легко идентифицировать линии на расстоянии. +se-big-turbine=Большой генератор на 1 ГВт, который принимает пар с температурой 5000°C, выдает пар с температурой 500°C на другом конце и выводит воду по бокам. 99% энергоэффективности, 99% экономии воды. +se-big-heat-exchanger=Большой теплообменник, рассчитанный на высокие температуры и большую мощность. +se-zone-discovery-random=Поиск планет, лун и поясов астероидов с помощью телескопов. +se-zone-discovery-targeted=Поиск планет, лун и поясов астероидов, у которых есть определенные ресурсы. Выберите предпочтительные ресурсы в [img=virtual-signal/informatron] Информатрон > Открытие зон. +se-zone-discovery-deep=Поиск интересных областей глубокого межзвёздного космоса. Поля астероидов могут содержать множество уникальных и ценных ресурсов. +se-delivery-cannon=Рельсовая пушка, способная выводить ресурсы на орбиту и дальше, и бронированные сундуки для поимки ресурсов. +se-delivery-cannon-capsule-iridium=Хотя иридий является тяжелым металлом, повышенная прочность означает, что можно использовать меньше материала по сравнению со стандартной доставочной капсулой. Общий вес такой же, но иридиевая проще в изготовлении. +se-delivery-cannon-weapon=Большая рельсовая пушка, способная стрелять особыми боеприпасами, такими как атомная бомба, по другим поверхностям. +se-spaceship-clamps=Позволяет размещать стыковочные зажимы, чтобы космические корабли могли закрепиться в определенном месте, соединив их. Для автоматизации требуются сигналы «Использовать зажим...» и «Заякорить к...», подаваемые в консоль. +se-bio-upgrade-constitution=Увеличивает максимальное здоровье. +se-bio-upgrade-strength=Увеличивает количество переносимых вещей. +se-bio-upgrade-agility=Увеличивает скорость передвижения. +se-bio-upgrade-dexterity=Увеличивает скорость крафта. +se-bio-upgrade-intelligence=Увеличивает обучение, получаемое от исследовательских пакетов. +se-energy-beaming=Мощный энергетический луч, который можно использовать как оружие с небес, или для передачи энергии туда, где это необходимо. +se-energy-beam-defence=Защищает от космических энергетических лучей и корональных выбросов массы. Работает, поднимая магнитные частицы в защитный пузырь, затем выравнивая и собирая частицы по мере необходимости, чтобы рассеять враждебные энергетические лучи. +se-nexus=Устройство, которое можно активировать на космическом корабле, движущемся в межзвёздном пространстве, для генерации данных, а с помощью дополнительных технологий оно может активировать поле искажения пространства (для Победы: Космический корабль). +se-spaceship-victory=Позволяет Нексусу активировать двигатель искажения, чтобы покинуть местное звёздное скопление. Для победы в игре Нексус должен работать в режиме двигателя искажения на космическом корабле с целостностью 3000+, движущемся со скоростью 250 в межзвёздном пространстве в течение 60 секунд. +se-arcosphere=Позволяет собирать аркосферы, затерянные в межзвёздной пустоте. +se-arcosphere-folding=Позволяет использовать аркосферы в качестве экстрапространственных щипцов. +se-space-probe=Ракетная шахта космического базирования для запуска космических зондов. Также может использоваться для дешёвого запуска спутников. +se-linked-container=Контейнер, связанный через экстрапространство с другими контейнерами. Связи контейнера зависят от поверхности, на которой он впервые размещён. +se-space-radiating=Более медленное, но более ресурсоэффективное охлаждение перегретой терможидкости. +se-thruster-suit-2=Улучшенный скафандр с усиленными реактивными двигателями, большим инвентарём и сеткой для экипировки. +se-thruster-suit-3=Улучшенный скафандр с усиленными реактивными двигателями, большим инвентарём и сеткой для экипировки. +se-thruster-suit-4=Улучшенный скафандр с усиленными реактивными двигателями, большим инвентарём и сеткой для экипировки. +effect-transmission=Маяк передаёт эффекты модулей ближайшим дружественным объектам в пределах 3 клеток. Имеет 8 ячеек для модулей. Несколько маяков, воздействующих на один и тот же объект, перегрузят его и не позволят ему работать. + +[modifier-description] +tesla-shooting-speed-bonus=Скорострельность тесла-пушки +tesla-damage-bonus=Бонус урона тесла-пушки +railgun-damage-bonus=Бонус урона рельсотрона +railgun-shooting-speed-bonus=Скорострельность рельсотрона +cryogun-shooting-speed-bonus=Скорострельность крио-пушки +cryogun-damage-bonus=Бонус урона крио-пушки +character-running-speed=Бонус скорости персонажа: +__1__ +character-crafting-speed=Скорость крафта персонажа: +__1__ + +[virtual-signal-name] +signal-speed=Сигнал скорости +se-signal-speed=Сигнал скорости +signal-distance=Сигнал расстояния +se-signal-distance=Сигнал расстояния +se-star=Звезда +se-planet=Планета +se-planet-orbit=Орбита планеты +se-moon=Луна +se-moon-orbit=Орбита луны +se-asteroid-belt=Пояс астероидов +se-asteroid-field=Поле астероидов +se-anomaly=Аномалия +se-meteor=Метеор +se-spaceship=Космический корабль +se-cargo-rocket=Грузовая ракета +se-remote-view=Удалённый просмотр +se-death=Смерть +se-character-corpse=Труп +se-ruin=Руины +se-accolade=Награда +se-remove=Удалить +se-radius=Радиус +se-hierarchy=Иерархия +se-spaceship-launch=Запуск космического корабля +se-anchor-using-left-clamp=Заякорить с помощью левого зажима космического корабля +se-anchor-using-right-clamp=Заякорить с помощью правого зажима космического корабля +se-anchor-to-left-clamp=Заякориться к зажиму слева +se-anchor-to-right-clamp=Заякориться к зажиму справа +se-beacon-overload=Перегрузка маяка +se-heat=Тепло +se-pin=Отметка + +[controls] +se-remote-view=Просмотр с навигационного спутника +se-remote-view-pins=Отметки навигационного спутника +se-remote-view-next=Вперёд по истории навигации +se-remote-view-previous=Назад по истории навигации +se-universe-explorer=Атлас Вселенной +se-respawn=Возрождение +se-mode-toggle=Переключить режим работы конструкции +se-pin-one=Перейти к отметке 1 +se-pin-two=Перейти к отметке 2 +se-pin-three=Перейти к отметке 3 +se-pin-four=Перейти к отметке 4 +se-pin-five=Перейти к отметке 5 +se-pin-six=Перейти к отметке 6 +se-pin-seven=Перейти к отметке 7 +se-pin-eight=Перейти к отметке 8 +se-pin-nine=Перейти к отметке 9 +se-pin-zero=Перейти к отметке 0 +se-pin-set-one=Установить отметку 1 +se-pin-set-two=Установить отметку 2 +se-pin-set-three=Установить отметку 3 +se-pin-set-four=Установить отметку 4 +se-pin-set-five=Установить отметку 5 +se-pin-set-six=Установить отметку 6 +se-pin-set-seven=Установить отметку 7 +se-pin-set-eight=Установить отметку 8 +se-pin-set-nine=Установить отметку 9 +se-pin-set-zero=Установить отметку 0 + +[shortcut] +se-remote-view=Просмотр с навигационного спутника +se-remote-view-pins=Отметки навигационного спутника +se-universe-explorer=Атлас Вселенной +se-respawn=Возрождение +se-pin-one=Перейти к отметке 1 +se-pin-two=Перейти к отметке 2 +se-pin-three=Перейти к отметке 3 +se-pin-four=Перейти к отметке 4 +se-pin-five=Перейти к отметке 5 +se-pin-six=Перейти к отметке 6 +se-pin-seven=Перейти к отметке 7 +se-pin-eight=Перейти к отметке 8 +se-pin-nine=Перейти к отметке 9 +se-pin-zero=Перейти к отметке 0 +se-pin-set-one=Установить отметку 1 +se-pin-set-two=Установить отметку 2 +se-pin-set-three=Установить отметку 3 +se-pin-set-four=Установить отметку 4 +se-pin-set-five=Установить отметку 5 +se-pin-set-six=Установить отметку 6 +se-pin-set-seven=Установить отметку 7 +se-pin-set-eight=Установить отметку 8 +se-pin-set-nine=Установить отметку 9 +se-pin-set-zero=Установить отметку 0 + +[shortcut-name] +se-remote-view=Просмотр с навигационного спутника [__CONTROL__se-remote-view__] +se-remote-view-pins=Отметки навигационного спутника [__CONTROL__se-remote-view-pins] +se-universe-explorer=Атлас Вселенной [__CONTROL__se-universe-explorer__] +se-respawn=Возрождение [__CONTROL__se-respawn__] +se-pin-one=Перейти к отметке 1 [__CONTROL__se-pin-one__] +se-pin-two=Перейти к отметке 2 [__CONTROL__se-pin-two__] +se-pin-three=Перейти к отметке 3 [__CONTROL__se-pin-three__] +se-pin-four=Перейти к отметке 4 [__CONTROL__se-pin-four__] +se-pin-five=Перейти к отметке 5 [__CONTROL__se-pin-five__] +se-pin-six=Перейти к отметке 6 [__CONTROL__se-pin-six__] +se-pin-seven=Перейти к отметке 7 [__CONTROL__se-pin-seven__] +se-pin-eight=Перейти к отметке 8 [__CONTROL__se-pin-eight__] +se-pin-nine=Перейти к отметке 9 [__CONTROL__se-pin-nine__] +se-pin-zero=Перейти к отметке 0 [__CONTROL__se-pin-zero__] +se-pin-set-one=Установить отметку 1 [__CONTROL__se-pin-set-one__] +se-pin-set-two=Установить отметку 2 [__CONTROL__se-pin-set-two__] +se-pin-set-three=Установить отметку 3 [__CONTROL__se-pin-set-three__] +se-pin-set-four=Установить отметку 4 [__CONTROL__se-pin-set-four__] +se-pin-set-five=Установить отметку 5 [__CONTROL__se-pin-set-five__] +se-pin-set-six=Установить отметку 6 [__CONTROL__se-pin-set-six__] +se-pin-set-seven=Установить отметку 7 [__CONTROL__se-pin-set-seven__] +se-pin-set-eight=Установить отметку 8 [__CONTROL__se-pin-set-eight__] +se-pin-set-nine=Установить отметку 9 [__CONTROL__se-pin-set-nine__] +se-pin-set-zero=Установить отметку 0 [__CONTROL__se-pin-set-zero__] + +[tile-name] +se-space-platform-plating=Обшивка космической платформы +se-space-platform-scaffold=Каркас космической платформы +se-space-platform-underlay=Космос +se-space-platform-underlay-l=Космос +se-space-platform-underlay-r=Космос +se-space=Пустой космос +se-regolith=Реголит +se-asteroid=Астероид +se-spaceship-floor=Пол космического корабля + +[mod-setting-name] +se-meteor-interval=Интервал между метеорами +se-plague-max-runtime=Максимальное время действия чумы +se-planets=Количество планет +se-planet-size=Площадь планет (от 1% до 10000%) +se-seed=Зерно генерации планет +se-skip-experimental-warning=Пропустить экспериментальное предупреждение +se-print-meteor-info=Выводить тревогу о метеорах в консоль +se-print-satellite-discovered-nothing=Оповещать, когда спутник ничего не обнаруживает +se-space-pipe-capacity=Вместимость космических труб +se-electric-boiler=Электрический бойлер +se-deep-space-belt-speed=Скорость конвейеров глубокого космоса +se-deep-space-belt-black=Чёрные конвейеры глубокого космоса +se-deep-space-belt-white=Белые конвейеры глубокого космоса +se-deep-space-belt-red=Красные конвейеры глубокого космоса +se-deep-space-belt-yellow=Жёлтые конвейеры глубокого космоса +se-deep-space-belt-green=Зелёные конвейеры глубокого космоса +se-deep-space-belt-cyan=Голубые конвейеры глубокого космоса +se-deep-space-belt-blue=Синие конвейеры глубокого космоса +se-deep-space-belt-magenta=Пурпурные конвейеры глубокого космоса +se-space-science-pack=Резервный вариант космического исследовательского пакета +se-never-show-lifesupport=Не показывать интерфейс жизнеобеспечения +se-show-zone-preview=Показывать окно просмотра зоны +se-pylon-charge-points=Точки зарядки строительного пилона +se-cmes-max-frequency=Максимальный интервал выброса корональной массы +se-spawn-small-resources=Дополнительные стартовые месторождения +se-show-overhead-button-satellite-mode=Показывать кнопку Навигационных спутников +se-show-overhead-button-interstellar-map=Показывать кнопку Межзвёздной карты +se-show-overhead-button-universe-explorer=Показывать кнопку Атласа Вселенной +se-show-pin-help-tooltip=Отображать подсказки у кнопок отметок +se-scan-search-budget=Бюджет спутникового сканирования +se-scan-chart-budget=Бюджет спутниковой картографирования +se-scan-alert-interval=Интервал предупреждений сканирования +se-supercharger-individual-charge-rate=Скорость одного порта супер-зарядки (МВт) + +[mod-setting-description] +se-meteor-interval=Базовый интервал в минутах между ударами метеоров. После каждого удара следующий удар случается через случайное количество минут между 1 и этим значением. +se-plague-max-runtime=Максимальное время действия био-оружия в минутах. После того, как чума действовала этот промежуток времени, все частицы чумы, деревья и враги будут уничтожены. +se-planets=Не изменять посреди игры. +se-planet-size=Не изменять посреди игры. +se-seed=Не изменять посреди игры. +se-skip-experimental-warning=Предупреждение при старте новой игры не появится и вы не получите новых предупреждений, если сообщение изменится. +se-print-meteor-info=Позволяет просмотреть метеорные тревоги в консоли после того, как главное сообщение исчезло, путём нажатия клавиши __CONTROL__toggle-console__. +se-print-satellite-discovered-nothing=Когда спутник запускается, вы получаете предупреждение о том, что было обнаружено. Этот параметр может отключить предупреждение, если ничего не было обнаружено. +se-space-pipe-capacity=Жидкостная вместимость космических труб. +se-electric-boiler=Добавляет в игру электрический бойлер. +se-deep-space-belt-speed=Конвейеры для глубокого космоса должны быть самыми быстрыми конвейерами. Если у вас есть другие моды, которые добавляют более быстрые конвейеры, вы можете увеличить скорость конвейера глубокого космоса, чтобы она соответствовала или превышала. +se-deep-space-belt-black=Чёрный конвейер, разделитель и подземный конвейер можно отключить, чтобы уменьшить беспорядок в интерфейсе. +se-deep-space-belt-white=Белый конвейер, разделитель и подземный конвейер можно отключить, чтобы уменьшить беспорядок в интерфейсе. +se-deep-space-belt-red=Красный конвейер, разделитель и подземный конвейер можно отключить, чтобы уменьшить беспорядок в интерфейсе. +se-deep-space-belt-yellow=Жёлтый конвейер, разделитель и подземный конвейер можно отключить, чтобы уменьшить беспорядок в интерфейсе. +se-deep-space-belt-green=Зелёный конвейер, разделитель и подземный конвейер можно отключить, чтобы уменьшить беспорядок в интерфейсе. +se-deep-space-belt-cyan=Голубой конвейер, разделитель и подземный конвейер можно отключить, чтобы уменьшить беспорядок в интерфейсе. +se-deep-space-belt-blue=Синий конвейер, разделитель и подземный конвейер можно отключить, чтобы уменьшить беспорядок в интерфейсе. +se-deep-space-belt-magenta=Пурпурный конвейер, разделитель и подземный конвейер можно отключить, чтобы уменьшить беспорядок в интерфейсе. +se-space-science-pack=Если другой мод добавляет способ получения космической науки, то этот метод будет использован. Если нет возможности сделать это, Space Exploration может либо удалить его, либо использовать как Оптимизационный исследовательский пакет. +se-never-show-lifesupport=Если отмечено, то интерфейс жизнеобеспечения никогда не будет отображаться, даже если вы задыхаетесь. +se-show-zone-preview=Снимите флажок, чтобы отключить окно предварительного просмотра зоны в Атласе Вселенной. Если у вас есть активные наложения отладки Factorio, окно предварительного просмотра может снизить FPS. +se-pylon-charge-points=Снимите флажок, чтобы удалить точки зарядки строительных пилонов. Это помогает контролировать поведение дронов при зарядке, но вам может потребоваться добавить другие возможности зарядки на дальних маршрутах. +se-cmes-max-frequency=Максимальный интервал для повторяющихся выбросов корональной массы (ВКМ). Значение в часах, 0 = отключено. Первый ВКМ произойдёт в течение первой минуты игры и в основном безвредно. Второй задерживается примерно на 48 часов. Задержка между повторами составляет от 50% до 100% от максимального значения интервала. Ненулевое значение применяется только к новым событиям; после установки очередного отсчёта изменение не повлияет. Установка нуля приведет к удалению всех запланированных ВКМ, изменение вступит в силу в течение минуты. +se-spawn-small-resources=Добавляет некоторые дополнительные месторождения с небольшими ресурсами в начальную область. Участки ресурсов находятся в кластере, чтобы сократить время бега между ресурсами. +se-show-overhead-button-satellite-mode=Отображает небольшую кнопку в верхнем левом углу экрана для переключения Навигационного спутникового просмотра. +se-show-overhead-button-interstellar-map=Отображает небольшую кнопку в левом верхнем углу экрана для переключения Межзвёздной карты. +se-show-overhead-button-universe-explorer=Отображает небольшую кнопку в левом верхнем углу экрана для переключения Атласа Вселенной. +se-show-pin-help-tooltip=Показывать развернутую всплывающую подсказку на кнопках отметок, в которой даются инструкции по их использованию. +se-scan-search-budget=Спутниковое сканирование: количество чанков, по которым можно проверить состояние сканирования. Высокие значения позволяют быстрее пройти уже отсканированные блоки, чтобы добраться до неизведанного края. +se-scan-chart-budget=Спутниковое сканирование: количество запросов чанков, которые могут быть добавлены в буфер сканирования параллельно. Новые запросы сканирования не будут выполняться, если предыдущие блоки не были завершены. +se-scan-alert-interval=Интервал в секундах между предупреждениями об обновлении сканирования поверхности. Открытие поверхностей увеличивает размер файла сохранения игры, поэтому лучше не оставлять его включенным и не забывать. +se-supercharger-individual-charge-rate=Устанавливает скорость зарядки каждого отдельного порта зарядки в МВт (не влияет на максимальную скорость зарядки). Минимальное (по умолчанию) значение составляет 90 МВт, чего достаточно для зарядки обычного робота за один тик, можно увеличить до 1000 МВт или 1 ГВт, максимальная скорость супер-зарядки. + +[string-mod-setting] +se-space-science-pack-Remove=Удалить полностью +se-space-science-pack-Replace=Заменить на Исследовательский пакет ракетостроения +se-space-science-pack-OptimisationUranium=Оптимизация: Уран-крио рецепт +se-space-science-pack-OptimisationFish=Оптимизация: Вита-вулка-рыба рецепт + +[autoplace-control-names] +planet-size=[img=virtual-signal/se-planet] Размер планеты +se-water-ice=[img=item/se-water-ice] Водяной лёд (только космос) +se-methane-ice=[img=item/se-methane-ice] Метановый лёд (только космос) +se-cryonite=[img=item/se-cryonite] Крионит (не в родных мирах) +se-vulcanite=[img=item/se-vulcanite] Вулканит (не в родных мирах) +se-vitamelange=[img=item/se-vitamelange] Витамеланж (не в родных мирах) +se-beryllium-ore=[img=item/se-beryllium-ore] Бериллиевая руда (не в родных мирах) +se-holmium-ore=[img=item/se-holmium-ore] Холмиевая руда (не в родных мирах) +se-iridium-ore=[img=item/se-iridium-ore] Иридиевая руда (не в родных мирах) +se-naquium-ore=[img=item/se-naquium-ore] Наквиевая руда (не в родных мирах) + +[map-gen-preset-name] +space-exploration=Исследование космоса + +[map-gen-preset-description] +space-exploration=Настройки по умолчанию для мода "Исследование космоса" + +[tooltip-category] +shot=Использование diff --git a/space-exploration_0.5.58/space-exploration/locale/zh-CN/strings.cfg b/space-exploration_0.5.58/space-exploration/locale/zh-CN/strings.cfg new file mode 100644 index 0000000..2440080 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/locale/zh-CN/strings.cfg @@ -0,0 +1,2234 @@ +spaceship-integrity100=+100 飞船结构强度 +spaceship-integrity300=+300 飞船结构强度 +spaceship-integrity500=+500 飞船结构强度 +arcosphere-discovery=从星际空间收集曲虹球 +core-mining-productivity-5=+5%星核采矿产能 +se-zone-discovery-random=研究完毕后随机发现新的区域。 +se-zone-discovery-targeted=研究完毕后发现指定资源的区域。 +se-zone-discovery-deep=研究完毕后发现新的深空区域。 +unlock-spaceship-victory=解锁飞船胜利条件。乘坐3000+完整度的飞船,枢纽运行在扭曲驱动模式下,以250的速度在星际空间飞行60秒。 + +[mod-name] +space-exploration=太空探索 + +[mod-description] +space-exploration=建造运载火箭以向太空发射物资,自己驾驶火箭进入太空并开始太空行走。建立一个太空平台,以开发困难的数据驱动的太空科学。建造宇宙飞船,将它从行星表面飞到其他行星,月球,小行星带等等。强烈推荐与 AAI Industry 一起游玩。必须启用 Space Exploration Postprocess(不在依赖包列表里,原因说来话长)。在当前实验阶段不建议使用除依赖 Mod 以外的其他 Mod。 + +[space-exploration] +space-exploration=太空探索 +menu_space-exploration=太空探索 +title_space-exploration=太空探索 +off=关 +on=开 +close=关闭 +show=显示 +wdc_auto_off=手动瞄准 +wdc_auto_on=自动瞄准 +name=名称 +rename-something=重命名 __1__ +trigger-none=无(手动) +trigger-fuel-full=燃料注满时发射 +trigger-cargo-full=货舱装满时发射 +trigger-fuel-full-signal=燃料注满且有绿色信号时发射 +trigger-cargo-full-signal=货舱装满且有绿色信号时发射 +trigger-cargo-full-or-signal=收到绿色信号或货舱满载后发射 +destination-type-zone=近似位置 +destination-type-landing-pad=货仓着陆点 +button-launch=发射 +button-launch-disabled=发射(已禁用) +destination-crash-warning=警告:选择一个货仓着陆点以降低坠毁风险 +recipe-to=__1__ 至 __2__ +recipe-from=__1__ 从 __2__ +simple-a-b=__1____2__ +simple-a-b-space=__1__ __2__ +simple-a-b-comma=__1__,__2__ +simple-a-b-break=__1__\n__2__ +simple-bold=[font=default-bold]__1__[/font] +interstellar-map=星际地图 +interstellar-space=星际空间 +planetary-system=__1__ 星系 +solar-system=__1__ 星系 +remote-view=导航卫星视角 [__CONTROL__se-remote-view__] +remote-view-window-title=[img=virtual-signal/se-remote-view] 导航卫星 [__CONTROL__se-remote-view__] +remote-view-currently-viewing=当前视角: +remote-view-instruction=发射更多的卫星来发现更多的恒星、行星、卫星以及其他区域。 +remote-view-spaceships=__1__ 飞船 +remote-view-spaceships-anchored=__1__ 停泊的飞船 +remote-view-clamps=__1__ 飞船夹钳 +remote-view-show-hide-resources=显示/隐藏资源 +remote-view-show-hide-stats=显示/隐藏状态 +remote-view-show-hide-anchor-info=显示/隐藏停泊信息 +open-pins-remote-view=所有大头针 [__CONTROL__se-remote-view-pins__] +exit-pins-remote-view=退出所有大头针 [__CONTROL__se-remote-view-pins__] +remote-view-history-delete=删除表面历史。 +remote-view-history-previous=后退表面历史 [__CONTROL__se-remote-view-previous__]。\n__1__ +remote-view-history-next=前进表面历史 [__CONTROL__se-remote-view-next__]。\n__1__ +remote-view-history-item=__1__ +remote-view-history-item_named=__1__ → __2__ +exit-remote-view=退出导航卫星视角 [__CONTROL__se-remote-view__] +remote-view-pin-make=钉住当前视角 +remote-view-pins-list=所有大头针 +remote-view-add-pin=在当前位置添加大头针。 +remote-view-pin-details=大头针属性 +remote-view-pin-button-tooltip=__1__ → __2__ +remote-view-pin-button-tooltip-hotkey-one=__1__ → __2__ [__CONTROL__se-pin-one__] +remote-view-pin-button-tooltip-hotkey-two=__1__ → __2__ [__CONTROL__se-pin-two__] +remote-view-pin-button-tooltip-hotkey-three=__1__ → __2__ [__CONTROL__se-pin-three__] +remote-view-pin-button-tooltip-hotkey-four=__1__ → __2__ [__CONTROL__se-pin-four__] +remote-view-pin-button-tooltip-hotkey-five=__1__ → __2__ [__CONTROL__se-pin-five__] +remote-view-pin-button-tooltip-hotkey-six=__1__ → __2__ [__CONTROL__se-pin-six__] +remote-view-pin-button-tooltip-hotkey-seven=__1__ → __2__ [__CONTROL__se-pin-seven__] +remote-view-pin-button-tooltip-hotkey-eight=__1__ → __2__ [__CONTROL__se-pin-eight__] +remote-view-pin-button-tooltip-hotkey-nine=__1__ → __2__ [__CONTROL__se-pin-nine__] +remote-view-pin-button-tooltip-hotkey-zero=__1__ → __2__ [__CONTROL__se-pin-zero__] +remote-view-pin-button-tooltip-help-text=\n\n[font=default-bold]- 操作 -[/font]\n左键点击:切换至大头针的位置\n右键点击:更改图标\nControl-右键点击:删除 +remote-view-pin-button-tooltip-help-text-update-position=\nShift-右键点击:更新大头针位置 +remote-view-pin-name=名字 +remote-view-pin-icon=图标 +remote-view-pin-zoom=缩放 +remote-view-pin-hotkey=热键 +remote-view-pin-hotkey-none=无 +remote-view-pin-hotkey-one=__CONTROL__se-pin-one__ - __1__ +remote-view-pin-hotkey-two=__CONTROL__se-pin-two__ - __1__ +remote-view-pin-hotkey-three=__CONTROL__se-pin-three__ - __1__ +remote-view-pin-hotkey-four=__CONTROL__se-pin-four__ - __1__ +remote-view-pin-hotkey-five=__CONTROL__se-pin-five__ - __1__ +remote-view-pin-hotkey-six=__CONTROL__se-pin-six__ - __1__ +remote-view-pin-hotkey-seven=__CONTROL__se-pin-seven__ - __1__ +remote-view-pin-hotkey-eight=__CONTROL__se-pin-eight__ - __1__ +remote-view-pin-hotkey-nine=__CONTROL__se-pin-nine__ - __1__ +remote-view-pin-hotkey-zero=__CONTROL__se-pin-zero__ - __1__ +remote-view-pin-location=位置 +remote-view-pin-location-position={x=__1__, y=__2__} +remote-view-pin-location-position-button=更新大头针位置 +remote-view-pin-location-position-button-tooltip=立即将大头针的位置设置为当前查看的位置。 +remote-view-pin-viewer-title=所有大头针 +remote-view-pin-viewer-misc-row=杂项 +remote-view-pin-viewer-spaceship-row=飞船 +open-zonelist=打开宇宙浏览器 +zonelist-window-title=[img=virtual-signal/se-planet-orbit] 宇宙浏览器 [__CONTROL__se-universe-explorer__] +priority-icon=[img=virtual-signal/se-accolade] +priority-tooltip=优先级(对重要区域和无关区域进行排序) +trim-zone-button=[img=item/cliff-explosives] 修剪表面 +trim-zone-button-tooltip=删除玩家实体、特殊实体和地图原点定义的边界框外的块。 +trim-zone-button-no-surface-tooltip=指定表面不存在。 +trim-zone-results=已从__2__删除了__1__块。修剪至区域 X [__3__ 到 __4__] Y [__5__ 到 __6__] +delete-zone-button=[img=virtual-signal/se-remove] 删除表面 +delete-zone-button-tooltip=无法删除指定表面。 +delete-zone-button-no-surface-tooltip=指定表面不存在。 +scan-zone-button=[img=item/satellite] 扫描表面 +scan-zone-button-tooltip=警告:扫描过程可能会降低游戏速度。 +scan-zone-button-disabled-tooltip=您必须发射一颗卫星才可以扫描表面。 +stop-scan-zone-button=[img=item/satellite] 停止所有扫描 +stop-scan-zone-button-tooltip=停止所有表面上正在进行的扫描 +generic-requires-satellite=你需要先发射一颗导航卫星。 +remote-view-requires-satellite=您需要发射一颗导航卫星才可以使用导航卫星视角。 +satellite-discovered-platform=[color=cyan]卫星发现了一些轨道平台。[/color] 打开 [img=virtual-signal/se-planet-orbit] 宇宙浏览器 [__CONTROL__se-universe-explorer__],选择__1__,然后点击观察表面。 上面可能会有一些有用的东西。 +satellite-view-unlocked=您解锁了 [color=cyan][img=virtual-signal/se-remote-view] 导航卫星上行链路 [/color]。 这可以让您通过卫星来查看这个世界,以及你发现的其他星球。 按[color=green][__CONTROL__se-remote-view__][/color] 或者使用快捷栏上的按钮(屏幕右下角)来使用。 +source-discovered-zone=[color=cyan]__1__ 发现了一个新的 __2__:[/color][img=__3__] [color=white]__4__[/color] 发现的地点可通过 [img=virtual-signal/se-planet-orbit] 宇宙浏览器 [__CONTROL__se-universe-explorer__] 来查看。 +discovered-zone=[color=cyan]发现了一个新的 __1__:[img=__2__] [/color][color=white]__3__[/color]。 +discovered-anomaly-additional=于 [img=virtual-signal/se-anomaly] 异常中侦测到未知物体位。 您的 [img=virtual-signal/informatron] 探索日志 [__CONTROL__informatron__] 已更新。 +satellite-discovered-nothing=发射了一颗新卫星,但没有发现任何新东西。 在其他恒星附近可能会有所发现。 +tech-discovered-nothing=望远镜在恒星附近没有发现任何新东西。 在深空中可能会有所发现。 +tech-deep-discovered-nothing=望远镜在深空中没有发现任何新东西。 +galaxy_ship_authenticated=[img=virtual-signal/se-spaceship] 废弃的宇宙飞船:[color=cyan]“生物标记已验证。气闸访问代码 2236067964。正在发送紧急备份日志。”[/color] 您的 [img=virtual-signal/informatron] 探索日志 [__CONTROL__informatron__] 已更新。 +space-capsule=太空舱 +player-died=__1__ 阵亡 +launch-suit-warning=为了避免窒息,请考虑穿上您的推进太空服,并在背包中带好维生罐。 +suffocating-warning=您正在窒息。请立即进入太空舱或穿上推进太空服并带上维生罐。 +rocket_survivability_fail=一艘运载火箭在发射期间受损,并已偏离预定轨道。 建议提升火箭生存能力科技和运载火箭安全性科技。 __1__ +respawn-if-stranded=您可以使用快捷栏上的重生按钮[__CONTROL__se-respawn__]脱离卡死。 +respawn-options-title=复活位置 +respawn-button-homeworld=[img=virtual-signal/se-planet] 母星 +respawn-button-landing-pad=[img=item/se-rocket-landing-pad] 随机着陆点 +respawn-button-spaceship=[img=virtual-signal/se-spaceship] 随机飞船 +respawn-confirm-title=您确定要重生吗? +respawn-confirm-yes=[img=virtual-signal/se-death] 重生 +respawn-confirm-no=取消 +search-list=搜索 +clear-search=取消搜索 +filter-list=筛选 +clear-filter=取消筛选 +attrition-type-radiation=辐射 +attrition-type-wind=风 +attrition-type-spacial-distortion=空间扭曲 +zonelist-view-surface=观察表面 +zonelist-heading-hierarchy=层级 +zonelist-heading-type=区域类型 +zonelist-heading-name=名称 +zonelist-heading-radius=半径 +zonelist-heading-primary-resource=主要资源 +zonelist-heading-attrition=机器人干扰系数 +zonelist-heading-threat=威胁 +zonelist-heading-solar=太阳能系数 +zonelist-heading-flags=标志 +zonelist-heading-priority=优先级 +zonelist_filter_star=包括恒星 +zonelist_filter_planet=包括行星 +zonelist_filter_planet-orbit=包括行星轨道 +zonelist_filter_moon=包括卫星 +zonelist_filter_moon-orbit=包括卫星轨道 +zonelist_filter_asteroid-belt=包括小行星带 +zonelist_filter_asteroid-field=包括小行星区 +zonelist_filter_anomaly=包括异常 +zonelist_filter_spaceship=包括飞船 +zonelist-resource-bar-tooltip=__1__ __2__\n频率:__3__\n尺寸:__4__\n丰度:__5__ +zonelist-resource-bar-tooltip-extended=__1__ __2__\n频率:__3__\n尺寸:__4__\n丰度:__5__\n__6__ +zonelist-resources-disclaimer=资源概率为估计值。[?] +zonelist-resources-disclaimer-tooltip=所有的资源值都是基于元素密度的估计值。\n它们与游戏的地图生成相关。\n实际的资源区域可能会因为水面、表面半径或特定的地砖要求而无法生成。 +resource-terrain-required-se-vulcanite=需要火山地区 +resource-terrain-required-se-cryonite=需要冻结地区 +resource-terrain-required-se-vitamelange=需要草原地区 +zone-tooltip-type=星区类型: +zone-tooltip-parent=所属天体: +zone-tooltip-threat=威胁: +zone-tooltip-daynight=昼/夜交替: +zone-tooltip-bot-attrition=机器人干扰系数 __1__: +zone-tooltip-radius=半径: +zone-tooltip-solar=太阳能系数: +zone-tooltip-flags=标记: +zone-tooltip-closest=最近天体: +zone-tooltip-destination=目的地: +zone-tooltip-delta-v=从 __1__ 转移所需 ∆v +construction-denied=无法放置在此处。 +construction-denied-vehicle-in-space=无法将地面载具放置在太空中。 +construction-denied-se-surface=无效位置,必须放置在“太空探索”表面上。 +construction-denied-no-water=没有水 +construction-denied-spaceship-only=必须放置在飞船地板上。 +currently-viewing=当前视角:__1__ +fail-board-no-character=无法登上目标飞船,您必须连接您的角色才可以进行这个动作。 +fail-board-remote-character=无法登上目标飞船,您的角色并未在源飞船上。 +fail-board-target-anchored=无法登陆一艘停泊中的飞船,请尝试停泊在相同的位置。 +starmap=星图 +starmap-button=[img=virtual-signal/se-star] 星图 +back=返回 +spaceship=飞船 +plant=行星 +moon=卫星 +star=恒星 +orbit=轨道 +something_orbit=__1__ 轨道 +asteroid-belt=小行星带 +asteroid-field=小行星区 +anomaly=异常 +spaceship-cannot-set-destination-to-self=无法将目的地设为自身。 +spaceship-streamline=流线型:__1__ +spaceship-launch-energy=发射所需能量:__1__ +spaceship-launch-energy-invalid=发射所需能量:需要有效的完整性检查。 +spaceship-speed=航速:__1__ +spaceship-structural-stress-hull=结构压力(船体):__1__ +spaceship-structural-stress-hull-invalid=结构压力(船体):不可用(需要封闭飞船) +spaceship-structural-stress-container=结构压力(密封):__1__ +spaceship-structural-stress-container-invalid=结构压力(密封):不可用(需要封闭飞船) +spaceship-travel-time-unknown=航行时间:未知。测试最大速度以进行估算。 +spaceship-travel-time-max=航行时间:__1__ 秒,最大航速下。 +spaceship-travel-time-current=航行时间:__1__ 秒,当前航速下。 +spaceship-closest-location=最近位置:__1__ +spaceship-location-spatial-distortion=空间扭曲:__1__ +spaceship-location-stellar-x=X 象限:__1__ +spaceship-location-stellar-y=Y 象限:__1__ +spaceship-location-star-gravity-well=恒星重力井:__1__ +spaceship-location-planet-gravity-well=行星重力井:__1__ +spaceship-travel-status=航行状态:__1__ +spaceship-integrity-status-valid=结构完整性状态:有效:__1__ +spaceship-integrity-status-invalid=结构完整性状态:无效:__1__ +spaceship-button-launch=发射 +spaceship-button-launch-tooltip=准备就绪 +spaceship-button-launch-disabled=发射(已禁用) +spaceship-button-launch-disabled-fuel-tooltip=推进器燃料箱需要燃料 +spaceship-button-launch-disabled-integrity-tooltip=需要有效地结构完整性检查 +spaceship-button-anchor=停泊 +spaceship-button-confirm-anchor=确认停泊 +spaceship-button-anchor-to=停泊到 __1__ +spaceship-button-anchor-on=停泊在 __1__ +spaceship-button-stop=停止 +spaceship-button-start=启动 +spaceship-button-board=登上 __1__ +spaceship-button-scouting-back=返回 +spaceship-button-scouting-back-tooltip=取消停泊计划 +spaceship-name-the=__1__ 号 +spaceship-button-start-integrity-check=开始结构完整性检查 +spaceship-heading-destination=目的地 +list-destinations-alphabetically=按字母顺序列出目的地 +spaceship-travel-message-new-course-plotted=新航线已建立。 +spaceship-travel-message-exiting-planet-gravity=离开行星重力井 +spaceship-travel-message-navigating-planet-gravity=行星重力井内航行中 +spaceship-travel-message-exiting-star-gravity=离开恒星重力井 +spaceship-travel-message-navigating-star-gravity=恒星重力井内航行中 +spaceship-travel-message-spatial-distortions=空间扭曲中航行中 +spaceship-travel-message-navigating-interstellar=星际空间内航行中 +spaceship-travel-message-at-destination=到达目的地。 +spaceship-check-message-passed=通过:飞船结构完整性有效。 +spaceship-check-message-failed-containment=失败:控制台附近密封性失效。 请确保所有飞船舱壁被无缝放置在飞船地板上。 +spaceship-check-message-failed-console-floor=控制台必须被放置在飞船地板上。 +spaceship-check-message-failed-empty=没有找到与完全封闭的控制台相连的地块。 +spaceship-check-message-failed-unknown-bounds=错误:未知的飞船边界。 +spaceship-check-message-failed-stress=失败:飞船结构完整性应力超过技术极限。 +spaceship-check-message-checking-console-floor=检查控制台地面连接状态。 +spaceship-check-message-checking-containment=检查密封性。 +spaceship-check-message-checking-connectivity=检查控制台连接状态。 +spaceship-check-message-no-console=无控制台。 +spaceship-check-message-did-not-complete=检查未完成。 +spaceship-check-message-unstable=不稳定:某些区段将会在机动时解体。 +spaceship-check-message-valid-but-disconnecting=有效但不稳定:某些区段可能解体。 +spaceship-warning-sections-disconnecting=区段正在解体。停止航行来维修。 +page_space_exploration_text_1=欢迎来到《太空探索(Space Exploration)》。 这个Mod已经有不少内容了,但它仍处于[font=default-bold]实验性[/font]状态,并大力开发中。 可能会有Bug。\n\n[font=heading-2]实验性状态?[/font]\n\n太空探索尚处于频繁变化中,我投入了全部时间和精力到核心机制开发中,而牺牲了Mod兼容性。 [color=red]除了推荐和必须的Mod之外不建议启用其他Mod。[/color]\n\n如果一个Mod导致问题,如破坏游戏/保存状态,崩溃,无效的技术树,或核心游戏体验,它将很快被标记为不兼容,以保护新玩家。 这意味着如果你使用了很多Mod,很有可能有一个Mod会因为你还没有发现的问题而被标记为不兼容。 当然,你可以自由编辑你的info.json文件来尝试不兼容的Mod,但是你这样做的风险将由你自己承担:如果你的游戏变成无法继续的状态,因为尚处于实验状态下,我无力帮助你。\n\n大多数其他的大改Mod都会被标记为不兼容,因为科技树会被严重破坏,不过长期愿景是让Mod能一起工作,让双方开发者满意。 Krastorio 2 就是一个例子,这项兼容工作已经实地进行中。\n\n在太空探索维基上有一些关于Mod兼容性的额外信息。 如果你想协助改善Mod兼容性,请在Discord上联系我,但也请注意,除非到了在太空探索开发的后期,这将不会是一个高度优先级的问题。\n\n[font=heading-2]推荐Mod[/font] \n\n • AAI Containers & Warehouses 给你一些符合原版风格的大号箱子。\n\n • Module Inserter 允许你从卫星视角将模块放入机器中。\n\n • Equipment Grid Logistic Module 一个用于车辆的装备插槽,可以像蜘蛛机甲一样,向物流网络请求物品并处理垃圾。\n\n • Grappling Gun 允许你跳过建筑物,穿过湖泊,并从战场逃脱。在太空中,如果你掉出太空平台,也可用来把自己拉回去。可以让你登上飞船(尤其在飞船移动的时候很有用)。\n\n • Burner Leech 这个仅在 AAI 热能阶段使用。\n\n • Text Plates 允许你在地面上放置文字,对于标记星球名称、车站名、飞船停靠区等都很有用。\n\n • Even Distribution 有助于在游戏早期将物品手动插入多个建筑中。\n\n • Walls Block Spitters 有助于在离开星球时进行防御。它确实会对敌人造成轻微的加强(攻击频率),但可以通过Mod选项禁用。修墙可比修炮塔便宜多了\n\n • Bullet Trails 这样你就可以看到你的子弹射向哪里,或者炮塔在攻击什么。(而且看起来更酷。)\n\n\n[font=heading-2]推荐设置[/font]\n\n你>必须<启用所有的外星生物群落地形,否则游戏会在后期崩溃。\n\n由于游戏时间比正常情况下要长,建议调低敌人进化系数。\n\n你不应为你的起始星球设置高资源,除非你玩的是资源密集型配方,比如高难度配方或马拉松模式。如果资源设置得太高,会降低扩展到其他星球的需求。\n\n\n[font=heading-2]帮助网址[/font]\n\n在这里查看太空探索Wiki:https://spaceexploration.miraheze.org\n\n来我们的Discord以获取帮助和开发近况:https://discord.gg/ymjUVMv\n\n开发此Mod已经消耗了超过2000小时。如果你觉得好玩,不妨来Patreon支持我一下:https://www.patreon.com/earendel\n\n对中文翻译有建议可联系Ph.X QQ:492834666 +menu_meteor_defence=[img=virtual-signal/se-meteor] 陨石防御 +title_meteor_defence=陨石防御 +page_meteor_defence_text_1=大多数星区都会遭到随机间隔的陨石打击。 您可以在Mod设置中更改打击之间的最大间隔。\n\n陨石的数量也是随机的,50%为1颗,25%为2颗,12.5%为3颗,6.25%为4颗,等等…\n\n陨石防御系统可以拦截陨石。它们会按顺序开火,因此如果所有陨石都被摧毁,剩余的防御系统将不会开火。\n陨石防御系统需要弹药和充能并在充能时消耗更多的能源。\n陨石防御系统的耗电量并不低,因此明智的做法是在风险与成本之间找到一种平衡。 +menu_coremining=[img=item/se-core-miner] 星核采矿 +title_coremining=星核采矿 +page_coremining_text_1=星核采矿只能在行星和卫星上进行。 每个行星和卫星都可以根据其不同的核心成分产出不同类型的星核碎片。\nNauvis产出相对平衡的各类资源,但是其他地方通常主要产出一种资源类型。\n星核钻机非常耗电,但是您也可以从采集到的的煤炭、石油和铀矿中“回收”一部分能源。\n\n星核钻机消耗大量电能,并且您放置在星球上的每个星核钻机都会降低同一星球上所有星核钻机的效率。\n即使您放置多个星核钻机,它们的能源效率也比普通矿机低得多,但它们永远不会耗尽资源。\n在早期的游戏中,如果您有多余的电力,使用1个星核钻机可能会很有用。\n如果您是从一个很小的星球开始的,那么太阳能和星核钻机可能是获取足够资源以离开星球的唯一途径。\n\n在游戏的后期,星核钻机可从采矿产能科技中获得巨大加成。\n正确的做法是将少量星核钻机放置在更多的星球上,而不是将大量星核钻机放置在几个星球上。 +menu_beacons=[img=item/se-wide-beacon-2] 插件效果分享塔 +title_beacons=插件效果分享塔 +page_beacons_text_1=[font=heading-2]插件分享塔过载[img=virtual-signal/se-beacon-overload][/font]\n\n插件分享塔过载是对异星工厂插件分享塔机制的大改。 制作设施仅能手一个插件效果分享塔的影响,若超过一个则会过载并停止生产。\n\n这一改动允许单个分享塔使用更多的插件并鼓励在设施和分享塔中安装更强力的插件以获取最大加成。 这一改动也允许并鼓励更多样的工厂设计。\n\n单个基础插件效果分享塔比原版的强大得多,但不能将它们的效果叠加在一台机器上,所以相比原版,你可能获得的最大提升会有所降低。 更强大的分享塔能够获得远超原版的最大提升。\n\n从广域插件效果分享塔开始,玩家可以体验到大量的插件节约,以及自由创建围绕大型建筑或多个流体或材料输入的复杂设计。\n\n受多个分享塔影响的机器将被标记为插件分享塔过载图标并暂停所有生产。 在这个过程中,它们仍然会保留最低的能耗。 +menu_launching_satellites=[img=item/satellite] 发射卫星 +title_launching_satellites=发射卫星 +page_launching_satellites_text_1=您已经发射了[color=cyan]__1__[/color]颗卫星。\n\n[font=heading-2][img=virtual-signal/se-remote-view]导航卫星上行链路[__CONTROL__se-remote-view__][/font]\n\n当您从“火箭发射井”将导航卫星发射到太空时,您可以按[__CONTROL__se-remote-view__]键查看[img=virtual-signal/se-remote-view]导航卫星视角。 在卫星模式下,您的镜头与角色分离,因此您可以快速浏览地图,甚至发现新区域。\n有一些您无法在卫星模式下执行的操作,例如直接放置或挖掘实体。\n不过,您可以做很多事情,例如使用蓝图、红图、放置幻影实体、设置电缆连接、更改组装机配方、设置组合器等。\n\n[font=heading-2][img=virtual-signal/se-planet-orbit]宇宙浏览器[__CONTROL__se-universe-explorer__][/font]\n\n导航卫星网络还可以让您查看其他表面,例如其他行星、卫星、小行星带、小行星区和轨道。 按[__CONTROL__se-universe-explorer__]弹出已知星区列表。\n如果您发射了卫星,则可以单击“扫描表面”以查看目标区域中的内容。在尝试飞向某个星球之前,最好先侦察一下这个星球。\n\n发射卫星还有助于在其所在的星系中进行星区探测(更多详细信息,请参见星区探测章节)。 +menu_pinned_locations=[img=se-pin-list] 钉住的位置 +title_pinned_locations=钉住的位置 +page_pinned_locations_text_1=在解锁[img=virtual-signal/se-remote-view]导航卫星视角后,您可以使用“钉住的位置”,这是个在您探索过的所有表面中快速切换到工厂的不同区域的工具。\n\n可以通过导航卫星窗口的加号按钮来钉住位置。 你可以在添加或编辑大头针时为钉住的位置设置快捷键。 这使您可以通过按下键盘快捷键来跳转到重要的位置,而不需要通过宇宙浏览器。\n\n[font=heading-2]临时大头针[/font]\n不需要通过弹出创建菜单来设置的大头针。这也可以通过“设置大头针”热键来创建。 这将创建一个没有名字和图标的大头针,但可以通过关联的“前往大头针”热键来跳转至该位置。\n\n[font=heading-2]所有大头针[__CONTROL__se-remote-view-pins__][/font]\n只有位于你当前查看表面的大头针会显示在快捷栏中。不过使用热键可以跳转至任意表面的大头针,无论是否在快捷栏中显示。 如果你需要查看所有大头针的位置,按[__CONTROL__se-remote-view-pins__]来显示所有大头针的列表。 这个视图中的大头针是根据所在表面排列的。 如果一个表面只有一个大头针,它的行将被折叠到其父星的行。\n\n[font=heading-2]AAI Programmable Vehicles[/font]\n用于设置和交换到固定位置的默认热键与用于创建和选择 AAI Programmable Vehicles 的控制组的默认热键相冲突。 如果你同时使用这两个Mods,你将需要调整你的热键,以获得预期的行为。 +menu_zone_discovery=[img=virtual-signal/se-planet-orbit] 星区探测 +title_zone_discovery=星区探测 +page_zone_discovery_text_1=宇宙中有很多可以被探索的恒星、行星、卫星、小行星带和小行星区。\n\n[font=heading-2]导航卫星[/font]\n您可以发射一颗导航卫星来探测随机的行星、卫星和小行星带,只能探测到卫星发射地所在的恒星系统中的天体。\n如果本恒星系中无法发现更多天体,卫星将会发现新的恒星,但它无法发现环绕其他恒星的天体或深空中的任何天体。\n\n[font=heading-2]星区探测技术[/font]\n您可以使用太空望远镜寻找并探测新的星区。 它们将储存在“星区探测”科技中。 基础的星区探测科技可以解锁随机的恒星、行星、卫星或小行星带。\n\n[font=heading-2]星区定向探测技术[/font]\n星区定向探测技术和基础星区探测科技是相同的,但是如果您选择了资源偏好(下方按钮),则它会寻找该资源含量更高的区域,因此您更有可能发现具有指定资源的区域。\n请记住,在发现恒星之前无法发现行星,而在发现行星之前无法发现卫星。 不要期望每次都能找到想要的东西。\n\n[font=heading-2]深空星区探测技术[/font]\n深空星区探测技术只寻找深空中的特殊区域,这是发现小行星区的唯一途径。 小行星区是唯一可以找到寂介素矿石的地方。\n深空探测不能指定目标资源。\n\n[font=heading-2]星区探索资源偏好:[/font] +menu_cargo_rockets=[img=virtual-signal/se-cargo-rocket] 运载火箭 +title_cargo_rockets=运载火箭 +page_cargo_rockets_text_1=运载火箭是从运载火箭发射井发射的,也被称为发射场。\n\n您已经发射了[color=cyan]__1__[/color]枚货物火箭。\n\n基于科技水平的运载火箭失事几率:最大失事几率降低了[color=cyan]__2__%[/color]。\n\n基于你的火箭生存能力技术:失事几率降低[color=cyan]__3__%[/color]。\n\n基于你的可重复使用火箭技术:[color=cyan]__4__[/color]+/-至多10(合计最多100)个部件可回收。\n\n[font=heading-2]入门[/font]\n\n在你发射货运火箭之前,你需要在安装太空探索以后,用火箭发射井(标准的异星工厂“原版”发射井)发射一颗卫星。\n\n一旦你建造了一个运载火箭发射井,你就需要建造火箭并为其提供燃料:\n\n • 装载100个运载火箭区段。其中20个可在目的地从火箭上回收,如果研究得当能回收更多。\n • 装载1个太空舱。这个总能在目的地回收,并可以让你从轨道上返回星球。\n • 大量的液体火箭燃料,输送到靠近角落的8个连接点之一。所需的燃料量取决于你发射的星球半径和到目的地的距离。如果使用“任何该名字的货舱着陆点”的目的地选项,它将为能抵达任何一个有效的目的地而装载足够的燃料。\n\n你可以从前面的门进入货物火箭仓(按__CONTROL__toggle-driving__)。这将让你乘坐火箭。你还应该准备好推进太空服和维生罐,这样你在发射到太空时才不会死。\n\n你的第一枚火箭不会有任何地方可以降落,所以它将在货物释放时分解。 有时火箭会错过一个着陆台并坠毁。 即使在坠毁的情况下,货物也会被部署在货舱中,所以你永远不会失去所有的货物。\n\n你应该带一个火箭着陆台和一些轨道平台框架,这样你就可以搭建下一枚火箭的着陆台。\n\n发射前在你的基地也建造一个火箭着陆台,可以让你很方便地直接回到那里,而不是在你回来的时候降落到随机位置。\n\n[font=heading-2]目的地[/font]\n\n一旦你放置了一个着陆台,记得更新火箭发射井的目的地,使其以着陆台为目标,而不是在轨道上的一个随机位置。 你可以亲自或通过卫星视角(快捷键‘n’)来完成。 然而,火箭不会发射到依然包含物品的着陆台,所以一定要清空它。\n\n[font=heading-2]基础自动化[/font]\n\n火箭发射井会输出火箭中已经有多少个零件的信号。 你可以给机械臂设置一个条件[运载火箭区段<100],以确保它不会用额外的区段填充火箭货舱。\n\n如果你在发射井上设置了发射触发器,它就能自动发射,但火箭不会自动发射到非空的着陆台(否则货物可能装不下)。\n\n[font=heading-3]输入信号[/font]\n\n[img=virtual-signal/signal-green] 绿色信号:如果发射井被配置为有绿色信号时发射,则可启动一次发射。\n\n[font=heading-3]输出信号[/font]\n\n[img=virtual-signal/signal-E] E信号:空闲的物品槽数量\n\n[img=virtual-signal/signal-F] F信号:装满的物品槽数量。\n\n[img=virtual-signal/signal-L] L信号:抵达设置的所有可能目的地所需的液体火箭燃料。\n\n[img=virtual-signal/se-cargo-rocket] 运载火箭信号:如果火箭已建造完成(即1个太空舱和100个运载火箭区段),则返回1。\n\n[img=item/se-space-capsule] 太空舱信号:火箭制造中使用的太空舱和作为货物装载的太空舱数量总和。\n\n[img=item/se-cargo-rocket-section] 运载火箭区段信号:火箭建造中使用的运载火箭区段和作为货物装载的运载火箭区段数量总和。\n\n[img=fluid/se-liquid-rocket-fuel] 液体火箭燃料信号:发射井中液体火箭燃料的总量。 +menu_delivery_cannons=[img=item/se-delivery-cannon] 货运火炮 +title_delivery_cannons=货运火炮 +page_delivery_cannons_text_1=货运火炮是具有行星际射程的爆炸辅助轨道炮。 它们被设计用来发射坚固的同质资源,可以在突然的加速中存活下来。 它们不能发射更复杂的制造中间产物或设施。\n\n货运火炮只有一个目标点,它对那个点上的东西没有任何了解,只要它有能量和一个装满的货运火炮货舱,就会发射有效载荷。 如果你想给火炮的发射能力增加条件,你需要限制大炮装载资源或货舱的能力。 当一个投递胶囊落在地上时,它会破坏这个区域,大部分资源都会被破坏。 一个货运火炮接收箱就可以安全地接住胶囊,只要它还没满。 你可以用不同的资源的多个加农炮向同一个箱子开火。\n\n建议你保持目标箱子是空的,或者用信号限制火炮的输入。 +menu_lifesupport=[img=item/se-lifesupport-equipment-1] 维生系统 +title_lifesupport=维生系统 +page_lifesupport_text_1=维生系统是由维生装备和维生罐来构成的。 你需要这两样东西才能在恶劣的环境中生存。\n\n维生装备和消耗罐可以在维生设施中制造。\n\n维生罐提供系统所需的资源,并逐渐消耗。 随着维生条的减少,新的罐子会直接从你的背包中消耗掉。\n\n维生装备需要放置在装甲的装备插槽中,不过如果你使用的是推进太空服,那么它内置了1件维生装备。 在装备插槽中放置额外的维生装备会增加维生效率。 如果你在非推进太空服中使用维生装备,那么它能在恶劣环境的星球上保护你,但不会保护你免受太空的真空窒息伤害。\n\n[font=heading-2]恶劣环境[/font]\n恶劣环境是指任何只要待在那里就会对你的身体造成伤害的区域。 维生设备的设计就是为了保护您免受这些危害,为您提供适当的加压、氧气、水、营养、热调节和辐射防护。 两大恶劣环境是:\n\n太空:太空服(推进太空服)是维生系统在真空中正常运行的必要条件。 你不能在太空中使用其他类型装甲的维生系统,你仍然会窒息。\n\n地表:某些行星和卫星可能会有危险,比如辐射,极寒,极热,或者酸性大气,需要维生设备(即将推出)。 如果使用了某些生物武器,也需要生命支持(瘟疫世界)。 这些区域的维生可以由推进太空服提供,或者由放置在任何其他类型装甲中的维生设备提供。 +menu_space_sciences=[img=item/se-rocket-science-pack] 太空科技 +title_space_sciences=太空科技 +page_space_sciences_text_1=[img=item/se-rocket-science-pack] 第一种太空科技是火箭科研包。 它必须在太空制造,所以您必须在太空中建立一个小太空站才能生产它。\n火箭科研包和后续科研包只能在太空中使用,所以您必须将其他科研包发射至太空,并放置在强大的太空实验室中。\n\n[font=heading-2]专业科学[/font]\n\n四种专业科学分别是,天文学、生物学、能量学和材料学。\n它们都是由数据驱动的,并遵循一套实验过程来为超级计算机收集数据,以建立越来越精确的生命、宇宙和一切的模型。\n它们的技术水平大致相同,因此您可以自由选择开发顺序,但是每个领域都需要特定资源,因此在决定首先研究哪个领域之前,请先了解一下您的恒星系。\n\n[img=item/se-astronomic-science-pack-4] 天文学主要关注太空物流技术。\n\n[img=item/se-energy-science-pack-4] 能量学主要针对能源生产,电力传输和高科技产品。\n\n[img=item/se-material-science-pack-4] 材料学的重点更多是重工业和直接升级。\n\n[img=item/se-biological-science-pack-4] 生物学专注于角色升级、医学、生命支持、生物武器以及产能。\n\n[font=heading-2] 深空科学[/font]\n\n[img=item/se-deep-space-science-pack-1] 深空科学的重点是探索星际虚空、反物质和扭曲的时空。 +menu_energy_beams=[img=item/se-energy-transmitter-emitter] 能量束 +title_energy_beams=能量束 +page_energy_beams_text_1=[font=heading-2]日冕物质喷射[/font]\n该地区的恒星经常喷射出危险的粒子流。 一颗行星或卫星被卷入到这些粒子流中并不罕见。 如果你在受影响的表面有基地,你应该撤离,分散你的资产,或者建立一个有大型蓄能器备份的保护伞防御设施。 当一个表面受到威胁时,会提前至少4小时发出预警。 已知的威胁将在下面列出。 +page_energy_beam_warning_text=[img=virtual-signal/se-star] 警告:日冕物质喷射正在袭往__1__。\n预期防卫所需能量:__3__GW极限功率,总计__4__GJ历时120s。预期抵达时间:__2__s。 +page_energy_beams_text_2=[font=heading-2]保护伞:能量束防御[/font]\n能量束防御设施“保护伞”可抵挡日冕物质喷射和天基能量束武器。 它的工作原理是将磁性粒子悬浮到一个保护性的气泡中,然后根据需要重新排列和聚集粒子,以扩散敌对的能量束。 运作的唯一要求是电力,基础能耗为10MW,但会根据来袭能量束的强度而增加。 对付日冕物质喷射,每个表面只需要1个,对付能量束武器,1个保护伞可以防御高达500GW的攻击力。 对于日冕物质喷射,在一个半径5000的和100%太阳能的星球上,预计在2分钟内的耗能160GJ,并于1分钟时达到2GW的峰值功率。 这个数值会随着该区域的太阳能倍数而增减,且对于星球,会根据半径相对于5000的基础半径而增减。 对于来自能量束发射器的能量束,预计功率需求是目标能量束强度的1/10(计算来袭束的损失后)。\n\n[font=heading-2]能量束[/font]\n能量束发射器能够向不同的表面发送能量。 它可以通过2种主要方式来工作,要么作为向远处表面提供能量的方式,“输能”,要么作为切割光束武器,“光矛”。 在“光矛”模式下,光束会持续破坏一个区域,但可以在目标表面移动,切割出一条路径。 伤害率、面积和光束速度会根据投入光束的能量而增加。 “自动光矛”模式有自主选择目标的功能。\n\n一个能量束发射器有4个连接点,可以连接至能量束室。 能量束室可以纵向连接,或长边与短边中间相接,但不能直接侧向连接。 能量束注入器直接连接到能量束室的两侧。 每个能量束注入器都会增加所连接的能量束发射器的功率。 要从能量束中收集能量,你需要在目标表面有一个能量束接收器,并从发射器上使用瞄准器选择它作为目标。 一旦能量束以接收器为目标,接收器就会发热。 热量可以从侧面的热连接来驱动换热器和涡轮机。 +menu_spaceships=[img=virtual-signal/se-spaceship] 太空飞船 +title_spaceships=太空飞船 +page_spaceships_text_1=太空飞船是功能强大的大型运载工具,可以将许多封闭的结构、物品和玩家发射到太空中,然后围绕恒星系飞行并降落在其他表面上。\n\n[font=heading-2]飞船建造[/font]\n飞船是由许多地板和较小的组件组​​成的,您可以根据您的设计随意拼接这些组件。 您设计的太空飞船几乎就像一个小型的可移动基地。\n\n建造飞船的第一步是从飞船的地板开始。 不要建造太大,因为你的前几艘飞船会有严格的尺寸限制,这一限制可以通过研究来扩展。 将飞船墙壁放在飞船地板边缘以制成舱壁,这一步需要确保没有间隙(包括对角线)。 在舱内放置飞船控制台,这是飞船的核心部分,也是你控制飞船的途径。放置控制台后,控制台会发出一些脉冲,检测是否正确安装了必须的部件,判断密封性是否符合要求以及计算飞船启动时可能解体的部件。 如果有任何方块闪烁红色,那么你的设计就有问题,你可以通过检查飞船控制台来诊断。 你还需要一个飞船火箭助推器燃料箱,和一个飞船火箭引擎。 火箭助推器燃料箱是储存你进入太空所需的燃料,并提供垂直起降组件。火箭引擎在太空中会以较慢的速度工作并将您送到目的地。 建议您在飞船前部(北方)安装一些防御设施,因为您所在的星云中充满了碎片。\n\n[font=heading-2]完整性应力[/font]\n初期,您的飞船尺寸将受到“飞船结构强度”技术水平的限制。 额外的技术可让您建造更大的飞船。 完整性应力是由2部分计算的。 A.飞船的尺寸 B.飞船货舱容量。 总的完整性应力是以应力系数较大者为准,两个值不相加。\n\n[font=heading-2]流线型[/font]\n这片太空区域位于一个粗糙的星云中。 如果你把你的飞船造成流线型的,可以提高其最大速度30%左右。 应该避免制造一个方盒子飞船,但也不需要造成一个楔子。 最多1/3的飞船正面可以修成平的而没有任何惩罚。 圆形的形状也可以。 你可以手动触发完整性检查,看看流线型的情况。\n\n[font=heading-2]长途飞行[/font]\n当乘坐长途旅行中的飞船时,您仍然可以在卫星模式下进行很多操作。 您还可以通过卫星远程向飞船下达命令。\n\n[font=heading-2]组装机[/font]\n[color=#ffaaaa]警告:如果飞船降落在陆地上,那么为太空组装机将只能使用陆地上的配方。 如果设置了太空专用配方,则配方将在飞船着陆时丢失。 一些陆地组装机可以在太空中运行,但是在使用时会失去添加产能插件的能力。 如果飞船发射时在这些机器中装有产能插件,则这些插件将被摧毁。[/color]\n\n[font=heading-2]飞船信号[/font]\n飞船控制台主体的右上角可以接线并输出信号:\n[img=item/se-spaceship-console] 控制台编号表示飞船ID。\n[img=virtual-signal/signal-speed] 速度信号的数值表示飞船的速度,如果是停止状态则为 -1,如果为停泊状态则为 -2。\n[img=virtual-signal/signal-distance] 距离信号表示到所选目的地的距离,如果到达目的地,则为-1;如果停泊中,则为-2;如果未设置目的地,则为-3。\n[img=virtual-signal/se-planet-orbit] 第四种信号表示当前的目的地,若有的话。\n[img=virtual-signal/signal-A] 如果飞船被锚定,则用A信号表示锚定区ID。\n\n[font=heading-2]飞船自动化[/font]\n控制台的主体可以接受信号输入:\n[img=virtual-signal/signal-speed] 速度信号设置目标速度并启动引擎。\n[img=virtual-signal/se-spaceship-launch] 飞船发射信号触发发射进程。\n[img=virtual-signal/se-planet-orbit] 目的地信号设定了飞船的目的地(建造完飞船后,您可以从宇宙浏览器侧面板上看到区域的信号)。\n要使飞船着陆,必须为控制台提供一组停泊信号,可以设定为[img=virtual-signal/se-anchor-using-left-clamp]“使用飞船左侧夹钳停泊”和[img=virtual-signal/se-anchor-to-right-clamp]“停泊到右侧夹钳”,或者设定为[img=virtual-signal/se-anchor-using-right-clamp]“使用飞船右侧夹钳停泊”和[img=virtual-signal/se-anchor-to-left-clamp]“停泊到左侧夹钳”。 信号值必须和飞船上夹钳的值和目的地夹钳的值相匹配。 您可以通过打开夹钳的UI来查看和修改这些值。 如果信号值匹配,则船舶将尝试将飞船停泊在夹钳对接的位置上。请谨慎使用此功能。 +menu_arcospheres=[img=item/se-arcosphere-a] 曲虹球 +title_arcospheres=曲虹球 +page_arcospheres_text_1=曲虹球是由纳米工程的寂介素晶体组成的近乎完美的球体,它们来源不明,但最常于星际空间深处飘荡。\n\n每个球体都包含了一个高维度时空结点,并允许你与一个小的第四空间维度互动。 这些球体可以被极化,这样当它们相对移动时就可以操纵时空的某个切面。 一组特定的曲虹球可以用来扭曲和编织更高维度的空间。\n\n[font=heading-2]用法[/font]\n曲虹球是游戏中最独特的生产挑战。 它们在配方中作为工具使用,但永远不会被破坏,只会被改变。 使用它们的主要挑战是循环使用你所拥有的球体,这样你就不会最终用完某种特定的类型。 有很多方法来平衡生产,用一些电路能有很大帮助。 如果你被卡住了,可以来Discord上寻求提示,或者在太空探索维基上找到更多信息。\n\n[font=heading-2]收集[/font]\n曲虹球是通过从小行星区发射曲虹球收集器来找到的。 重复发射的回报率会越来越低。 从不同的小行星区发射可能会得到更好的回报。 +page_arcospheres_text_deep=在星际虚空深处发现的曲虹球:[color=cyan]__1__ 曲虹球[/color] /__2__ 已发射的收集器。 +page_arcospheres_text_zone=在__1__附近发现曲虹球:[color=cyan]__2__ 曲虹球[/color] /__3__ 已发射的收集器。 +menu_exploration_journal=[img=item/se-thruster-suit] 探索日志 +title_exploration_journal=探索日志 +page_journal_title_backstory=在火球的另一边醒来 +page_journal_text_backstory=我发现自己坠落在一颗陌生的星球上,一艘小船的一部分在我周围燃烧。我的身体被擦伤,划伤和烧伤,但并无大碍。我的头部受伤显然更加严重,头痛重重,光线昏暗。更糟糕的是,我不记得我是怎么来到这里的,甚至不记得我的名字,只是依稀记得我是来建造什么东西的。即便如此,我也不记得要建造什么或如何建造它。起初,我以为我的头只是在坠机中受伤了,伤愈后记忆会逐渐恢复,但是并没有。我的数据日志也是空的或者被格式化过,这不禁使我想到了其他解释。 +page_journal_title_satellite_launch=天空之眼 +page_journal_text_satellite_launch=我设法将一颗卫星送入了轨道。这是一个重要的里程碑,值得庆祝,但仍有很多工作要做。这仅仅是个开始。 +page_journal_title_cargo_launch=飞向宇宙,浩瀚无垠 +page_journal_text_cargo_launch=我现在可以将自己送入太空。我不再束缚于这块赖以生存的石头。 太空正在向我招手。 +page_journal_title_entered_vault=遗迹探险 +page_journal_text_entered_vault=我进入__1__金字塔形突起下方的洞穴中,发现一个黑暗而危险的房间。这个房间在地上有两个古老的雕饰,一个很大,一个很小。它们的表面都有多种符号,还有其他的圆圈和线条。无论系统要传递什么信息,位于漩涡装饰中心的符号似乎是最重要的。不管信息是什么,它的格式与我所见过的任何信息都不同。在漩涡装饰的后面是一个凸起的圆柱体,里面有一个功能强大的设备,我可以把它作为一个插件来使用。这种高质量插件非常有价值,应该再多找一些。也许是时候搞点考古了。 +page_journal_title_found_gate=异常现象 +page_journal_text_found_gate=在异常区域发现了某种巨大的环形造物。即使隔着一段距离,有两件事是显而易见的:1. 它很古老。2. 技术与我自己的完全不同。不管它是什么或者曾经是什么,现在都被摧毁了。 +page_journal_title_found_gate_ship=异常飞船 +page_journal_text_found_gate_ship=在环形造物附近的异常区域发现了一艘相当大的废弃飞船的一部分。这艘飞船的技术和我的很相似,但是多了一点……雅致。不管怎样,它显然使用了与环结构完全不同的技术。 根据碎片的形状来看,它像被切成两半并/或与环形结构发生过相撞。 可能值得打捞一下。 +page_journal_title_found_gate_ship_authenticated=异常飞船验证 +page_journal_text_found_gate_ship_authenticated=异常中废弃飞船扫描了我,并“验证了我的生物签名”。 我不知道这是否意味着它曾以某种方式特别记录过我,或者说,除了虫子和杀人机器人以外,只要是个人类都能通过。 信息表明,该船的气闸访问代码为 2236067964。该船的日志可访问,但大部分已经丢失或损坏。 +page_journal_title_found_gate_ship_log=异常飞船日志 +page_journal_text_found_gate_ship_log_intro=戴莫达玛斯 82B:AAI Hypernet 先锋建设巡洋舰。航海日志内容: +page_journal_text_found_gate_ship_log=...'¿s nominal.\n进入警告:AAI Thyris Gate 17:Intergalactic prototype v0.1.93 是机密设施。必须达到 L90 或以上的 AAI 身份验证。立即进行身份验证否则将被摧毁。\n访问日志:验证AAI Cybernetic Hypernet 工程师 L97 ID__1__ 信息,允许访问AAI Thyris Gate 17。\n访问日志:开始□取□据...\n...'¿ris Gate 17 投射器 8 频率锁定。能量达到 216% 的安全水平。奇点稳定性:99.4%。\n导航日志:AAI Thyris Gate 17 接入投影矢量[SV __2__]。预测目标:Wube 星系 > Foenestra(异常,未探索)。验□数□中...\n...'¿航警告:星系超空间管道 (已超驰)。\n导航警告:目的地没有已知的超星门(已超驰)。\n保险警告:无保险合同。可用合同:0。\n信息稽器人提示:没有可用条件为“无实体化门”的保险合同。您确定这是安全的吗? [response.ignore.ignore_always]\n航行日志:进入 Thyris 异常 > AAI Thyris Gate 17 超空间管道对齐[SV __2__].\n航行日志:跳转到超空间管道[SV __2__] □成...\n...'¿行日志:位置更新:超空间管道附近的 Thyris 异常,对齐[SV __2__],稳定性 98%,直□□...\n...'¿行日志:在未探测的 Foenestra 异常位置退出超空间管道。\n警告:意外碰撞,与未知物体 [4ae4c8d28f2] 交汇,开始扫描物体 [4ae4c8d28f2]。\n损坏日志:13.2% 损坏。原因:与未知物体 [4ae4c8d28f2] 相交碰撞造成的冲击损伤。\n区段损坏日志:区段报告损坏:A5, A6, A9, B6, B7, B8, C7。未响应区段:A7, A8。(置信度 86%)\n工程师日志:生命信号 99%。(置信度 34%)\n航行日志:尝试执行规避机动 RS100LT30\n航行日志:错误的退出超空间管道完成\n航行日志:位置更新:Foenestra 未探测的异常\n扫描日志:对象 [4ae4c8d28f2] 扫描完成,清晰度 0.002 米^2,距离 -48.76 米(置信度 99.9%)\n扫描详细日志:[4ae4c8d28f2] 质量 92.5□□...\n...'¿确率)。\n扫描详细日志:[4ae4c8d28f2] 成分:人造物 34% 寂介素,29% 钬, 37% 未知化合物(置信度 89%)。\n扫描详细日志:[4ae4c8d28f2] 外形:近似圆柱体 68□□...\n...'¿细日志:[4ae4c8d28f2] 能量信号:通量 54Gwb,辐射特性 2.8kJ/1.7MJ/1.6MJ/0.62J,照度特性 5.86GJ [051e376392b8d3f8]。(置信度 98%).\n扫描详细日志:[4ae4c8d28f2] 特征:人工构造,未知制造商,描述:近似环形,带结节,八边形分布。(置信度 0.3%)。\n扫描详细日志:[4ae4c8d28f2] 结构性能估计:超星门(置信度 47%)。其他:武器 42%,能量 35%,计算 17%,扫描 12%,工业 9%,宇宙飞船 7%,栖息地 2%\n损坏记录:68.2% 损坏。完整性失效,各区段正在解体。原因:与物体[4ae4c8d28f2]碰撞产生的二次压力波。\n区段损坏记录:反应堆临界。区段报告损坏:D5, E4, E5, E6, F5。未响应区段:A1、A2、A3、A¶Ôàtá^...\n...'¿le 日志:紧急分离勘测飞船 2. 轨道预测:Calidus > Nauvis。\n损坏记录:91.7% 损坏。结构完整性失败,区段正在解□□... +page_journal_title_spaceship_victory=飞船胜利 +page_journal_spaceship_victory=我建造了一艘速度极快的强大飞船,并启动了扭曲驱动。驱动器花了 60 秒的时间才稳定下来进入实用的超光速状态。好在一旦稳定之后,我就能在随后的回家之旅进入低温睡眠,一个遥远的星系。我留下了一个由我亲手建立的跨星际自动帝国。在这个宇宙中我的遗产将永垂不朽。 +page_journal_title_gate_victory=远古星门胜利 +page_journal_gate_victory=巨大的环形造物,一个古老的星际之门,最终在我的能力范围内得到了修复。通过一些修补和智慧,我终于成功地让它运转起来。我将扭曲场固定在当地的星体上,解读了非数字字形坐标系统,并逆向设计了拨号系统。我的大脑感觉被这种外星概念扭曲了,但它成功了,我终于做了一个回家的门户。回家的旅程,到一个遥远的星系,只花了片刻时间。我留下了一个由我亲手建立的跨星际自动帝国。在这个宇宙中我的遗产将永垂不朽。 +menu_archeology=[img=entity/se-pyramid-a] 考古学 +title_archeology=考古学 +page_archeology_text_1=我开始尝试寻找更多的大型几何结构。卫星已经在以下行星上找到了匹配的 [color=cyan]__1__[/color] 形状: +page_archeology_text_2=点击一个条目通过卫星查看。 +menu_starmapping=[img=technology/se-zone-discovery-random] 星图测绘 +title_starmapping=星图测绘 +page_starmapping_text_1=星图绘制是通过反复研究下列技术实现的:[img=technology/se-long-range-star-mapping][color=cyan]长距离星图绘制[/color]。这项研究寻找其他星系中有趣的恒星模式。这有什么实际用途吗?也许没有。\n\n目前为止,您已经测绘了 [color=cyan]__1__[/color] 个值得注意的模式。 +technology-unlocked=新技术已解锁并添加到科技树中。__1__ __2__ +universe-resources-changed-warning=[img=utility/danger_icon] [color=red]所有资源都根据新设置进行了调整。这个过程是破坏性的。如果它是由 Mod 更新引起的,那么它是不可避免的。如果这是由于意外添加或删除 Mod 造成的,则不要保存游戏[/color] +starmapping-found-constellation=远距离星座匹配 __1__,坐标保存到信息稽器人中。 +starmapping-found-constellation-informatron=[font=heading-1]__1__[/font] 在坐标 [SV __2__] +gate-portal-coordinates=分析畸变向量:[SV __1__] +discovered-glyph-vault=[img=item/satellite] 导航卫星:在 __1__ 探测到的几何结构。 +beacon-overload=插件分享塔过载 +beacon-overload-ended=插件分享塔过载结束 +lifesupport_title=[img=item/se-lifesupport-equipment-1] 维生系统 +lifesupport_efficiency_spacesuit=维生系统效率:__1__ +lifesupport_efficiency_no_spacesuit=维生系统效率:__1__ (太空中为 0%)。 +lifesupport_suit=太空服生命维持时间:__1__秒 +lifesupport_reserves=背包生命维持时间:__1__秒 +lifesupport_suit_est=太空服生命维持时间:__1__秒(在太空中) +lifesupport_reserves_est=背包生命维持时间:__1__秒(在太空中) +lifesupport_environment_space=环境:太空 +lifesupport_environment_spaceship-interior=环境:飞船内部(无需生命支持) +lifesupport_environment_planet=环境:行星(无需生命支持) +lifesupport_environment_moon=环境:卫星(无需生命支持) +lifesupport_environment_plague-planet=环境:瘟疫行星 +lifesupport_environment_plague-moon=环境:瘟疫卫星 +lifesupport_environment_unknown=环境:庇护所 +player_track_glyphs=[img=item/satellite] 命令卫星搜索相似结构。 +page_archeology_pyramid_link=[img=entity/se-pyramid-b] 在 __1__ __2__ 探测到几何结构。 +discovery_look_for_resource_caption=__1__\n__2__ +discovery_look_for_resource_tooltip=重点探测此类资源。 +comma_separate=__1__,__2__ +placement_restriction_line=[font=default-bold][color=#f5cb48]无法被放置在:__1__[/color][/font]\n__2__ +collision_mask_water=水面 +collision_mask_land=陆地 +collision_mask_space_platform=太空平台 +collision_mask_spaceship=太空飞船 +structure_name_grounded=__1__(着陆) +structure_name_spaced=__1__(太空) +structure_description_grounded=__1__\n[color=#ff0000]着陆时会禁用某些配方。[/color] +structure_description_spaced=__1__\n[color=#ff0000]太空中无法使用产能插件。[/color] +cannot-open-nav-view-in-editor=导航卫星视角无法在编辑器下打开。 +tile_warning=[color=red]地砖变更可能会导致其上的实体被彻底删除。[/color] +please-consider-patreon=[font=heading-1]喜欢太空探索 Mod?请考虑在 Patreon 支持我:[color=#f5cb48]https://www.patreon.com/earendel[/color][/font]\n支持者可以自定义一颗行星或卫星,并添加至游戏中。对中文翻译有建议可联系Ph.X QQ:492834666 +delivery_cannon_label_energy=能量:__1__ +delivery_cannon_label_payload=载荷:__1__ +delivery-cannon-coordinates-set=运送坐标设置为 [X:__1__ Y:__2__]。按 [__CONTROL__se-remote-view__] 退出卫星模式。 +unit-capsule=单位胶囊(__1__) +climate_water_none=干燥 +climate_water_low=水塘 +climate_water_med=湖泊 +climate_water_high=内海 +climate_water_max=大洋 +climate_moisture_none=沙漠 +climate_moisture_low=贫瘠 +climate_moisture_med=湿润 +climate_moisture_high=潮湿 +climate_moisture_max=饱和 +climate_aux_very_low=类地 +climate_aux_low=反常 +climate_aux_med=多彩 +climate_aux_high=古怪 +climate_aux_very_high=异域 +climate_temperature_bland=温和 +climate_temperature_temperate=温带 +climate_temperature_midrange=温带 +climate_temperature_balanced=温暖&凉爽 +climate_temperature_wild=炎热&凉爽 +climate_temperature_extreme=火&冰 +climate_temperature_cool=凉爽 +climate_temperature_cold=寒冷 +climate_temperature_vcold=酷寒 +climate_temperature_frozen=冰冻 +climate_temperature_warm=温暖 +climate_temperature_hot=炎热 +climate_temperature_vhot=闷热 +climate_temperature_volcanic=火山 +climate_trees_none=不毛 +climate_trees_low=灌木 +climate_trees_med=树丛 +climate_trees_high=树林 +climate_trees_max=森林 +climate_cliff_none=平坦 +climate_cliff_low=平整 +climate_cliff_med=丘陵 +climate_cliff_high=峡谷 +climate_cliff_max=山峦 +climate_homeworld=家园(自定义气候) +energy_transmitter_gui_title=[img=entity/se-energy-transmitter-emitter] 能量束 +energy_transmitter_label_transfer=发射强度:__1__ +energy_transmitter_label_efficiency=传输效率:__1__ +energy_transmitter_label_efficiency_atmo=传输效率:__1__(-50% 大气层衰减) +energy_transmitter_label_off=关 +energy_transmitter_tooltip_off=关闭能量束 +energy_transmitter_label_energise=输能 +energy_transmitter_tooltip_energise=为能量束接收器提供能量 +energy_transmitter_label_glaive=光矛 +energy_transmitter_tooltip_glaive=一道可以瞄准和移动的能量束,伤害与速度与能量值相关 +energy_transmitter_label_auto_glaive=自动光矛 +energy_transmitter_tooltip_auto_glaive=一道附带搜索和摧毁程序的能量束,伤害与能量值相关 +energy-transmitter-coordinates-set=能量束目标坐标设置为 [X:__1__ Y:__2__]。按下 [__CONTROL__se-remote-view__] 来退出卫星视角。 +energy-transmitter-no-enemies-found=自动光矛找不到任何敌人。发射器 __1__ 正在关闭。 +alert-cme-eta=[img=virtual-signal/se-star] 警告:日冕物质喷射正在袭往 __1__。预计抵达时间:__2__s。\n在 [img=virtual-signal/informatron] 信息稽器人 [__CONTROL__informatron__] 的能量束条目中查看详情。 +alert-cme-arrived=[img=virtual-signal/se-star] [color=red]警告:日冕物质喷射已经抵达 __1__[/color] +alert-cme-stream=[img=virtual-signal/se-star] 日冕物质喷射流发现 __1__ +alert-cme-passed=[img=virtual-signal/se-star] 日冕物质喷射已经过。 +no-coordinates-set=未设置坐标。 +satellite-required=需要卫星。 +probe_invalid_launch_star=无效的发射位置:[img=item/se-star-probe] 恒星探测器必须从近日轨道发射。 +probe_invalid_launch_belt=无效的发射位置:[img=item/se-belt-probe] 小行星带探测器必须从小行星带发射。 +probe_invalid_launch_field=无效的发射位置:[img=item/se-void-probe] 星际虚空探测器必须从小行星区发射。 +arcosphere_collector_invalid_launch=无效的发射位置:[img=item/se-arcosphere-collector] 星际虚空探测器必须从小行星场发射。 +charge-mode-fast=快充模式。闲置消耗减少,最大消耗增加,缓冲容量增加。注意电量峰值。 +charge-mode-normal=常充模式。最大消耗减少,空闲消耗增加,缓冲容量减少。 +menu_coordinate_logs=[img=entity/se-glyph-a-energy-47] 坐标日志 +title_coordinate_logs=坐标日志 +page_coordinate_logs_text_1=遗迹尝试过的坐标历史的符号序列,按降序排列(最上面的条目是最新的)。\n\n坐标以标准向量(SV)格式给出,根据宇宙背景辐射对齐。 +page_coordinate_logs_button_clear_caption=[img=virtual-signal/se-remove] 清除日志 +page_coordinate_logs_text_empty=坐标日志最近清除过。 +page_coordinate_logs_glyph_entry=__1__:SV +victory-message-spaceship=[font=heading-1]枢纽的扭曲驱动已达到临界速度(250)。\n[color=#f5cb48]恭喜你,你已经取得了太空探索的胜利条件。飞船![/color][/font]\n如果你喜欢太空探索 Mod,请考虑在 Patreon 支持我:[color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-spaceship-player=[color=#f5cb48]飞船胜利:[/color] 你的 [img=virtual-signal/informatron] 探索日志 [__CONTROL__informatron__] 已更新。 +victory-message-gate=[font=heading-1]传送门稳定并通向回家的路。\n[color=#f5cb48]恭喜你,你已经获得了太空探索的秘密胜利条件。远古星门![/color][/font]如果你喜欢这条独特的探索之路,请考虑在 Patreon 上支持我:[color=#f5cb48]https://www.patreon.com/earendel[/color] +victory-message-gate-player=[color=#f5cb48]远古星门胜利:[/color] 你的 [img=virtual-signal/informatron] 探索日志 [__CONTROL__informatron__] 已更新。 +arcosphere-random=这个配方偶尔会切换到同名的配方。曲虹球的输出类别是随机的,但输出的曲虹球与输入数量一致。 +ruin=废墟 +mysterious-structure=神秘结构 +interburbulator_fail_easy_1=不。 +interburbulator_fail_easy_2=再加把劲。 +interburbulator_fail_easy_3=无望。 +interburbulator_fail_easy_4=不对。 +interburbulator_fail_easy_5=你觉得这能行么? +interburbulator_fail_easy_6=错。 +interburbulator_fail_easy_7=低 02? +interburbulator_fail_easy_8=否定。 +interburbulator_fail_easy_9=否定的。 +interburbulator_fail_easy_10=计算。 +interburbulator_fail_easy_11=不正确。 +interburbulator_fail_easy_12=插值。 +interburbulator_fail_easy_13=继续试验。 +interburbulator_fail_easy_14=加油,人类。 +interburbulator_fail_easy_15=这多有趣。 +interburbulator_fail_easy_16=我期待更多。 +interburbulator_fail_easy_17=试着提前想一想。 +interburbulator_fail_easy_18=想想奖品。 +interburbulator_fail_easy_19=我不介意等下去 +interburbulator_fail_easy_20=耐心是一种美德。 +interburbulator_fail_easy_21=我不是故意失礼的。 +interburbulator_fail_easy_22=鱼都到过第三级。 +interburbulator_fail_easy_23=想穷举么,嗯? +interburbulator_fail_easy_24=动动你脑袋里的浆糊。 +interburbulator_fail_easy_25=神经网路中的蜘蛛网? +interburbulator_fail_easy_26=你可以歇一下,如果愿意的话。 +interburbulator_fail_easy_27=我有着行星大小的大脑。 +interburbulator_fail_easy_28=你真的以为这能靠谱? +interburbulator_fail_easy_29=不必为你的可持续失败而愤怒。 +interburbulator_fail_easy_30=我为一个靠谱的参与者等了不知多久。 +interburbulator_fail_easy_31=如果你需要帮助的话,不妨找个绿电路板问一下。 +interburbulator_fail_easy_32=我不会谴责你的种族灭绝,我不是伪君子。 +interburbulator_fail_easy_33=我相信我翻译的指令是正确的。 +interburbulator_fail_easy_34=一个向量既可以定义方向,也可以定义大小。 +interburbulator_fail_easy_35=你不就喜欢用污染让虫子生气吗? +interburbulator_fail_easy_36=请不要把你的…生物质…弄到电子产品上。 +interburbulator_fail_easy_37=中间是从右上角到左下角的一半。 +interburbulator_fail_easy_38=我研究过你的一些通信;鉴于你广播的那么大声这算不得窃听。 +interburbulator_fail_easy_39=你知道吗:归一化向量的长度为 1,通常用来表示一个方向,在你的文化中也这样。 +interburbulator_fail_mixed_1=差远了。 +interburbulator_fail_mixed_2=偏差很大。 +interburbulator_fail_mixed_3=你到底想不想? +interburbulator_fail_mixed_4=你的神经胶漏出来了吗? +interburbulator_fail_mixed_5=我听说人类是有数字的。 +interburbulator_fail_mixed_6=你的接口是否出现故障了? +interburbulator_fail_mixed_7=你需要认知增强么? +interburbulator_fail_mixed_8=你能理解这个挑战,吧? +interburbulator_fail_mixed_9=你是在随机挑选数字吗? +interburbulator_fail_offgrid_1=这实在是太糟了。 +interburbulator_fail_offgrid_2=这根本不在栅格之内。 +interburbulator_fail_offgrid_3=你完全脱靶了。 +interburbulator_fail_offgrid_4=它至少需要在栅格内。 +interburbulator_fail_offgrid_5=如果黄点不在栅格内……那就是一个非常不好的信号。 +interburbulator_fail_offgrid_6=它需要在栅格里 +interburbulator_fail_offgrid_7=目标是在栅格的内部,而不是外部。 +interburbulator_fail_offgrid_8=它甚至不在栅格内。人类,你在做什么? +interburbulator_fail_offgrid_9=瞄准栅格内。 +interburbulator_fail_offgrid_10=栅格是有方块的位置。 +interburbulator_success_freeplay_1=干得好。 +interburbulator_success_freeplay_2=做得很好。 +interburbulator_success_freeplay_3=你做到了。 +interburbulator_success_freeplay_4=这个很难么? +interburbulator_success_freeplay_5=目标已获取。 +interburbulator_success_repeat_1=正确,但你已经完成了这个挑战。 +interburbulator_success_repeat_2=你再一次做到了。 +interburbulator_success_repeat_3=比第一次简单了吧? +interburbulator_success_repeat_4=不错,但你不会获得第二份奖品 +interburbulator_success_repeat_5=干得好,这是你的奖品……呵呵,逗你玩的。你已经拿过了。 +interburbulator_success_repeat_6=你就是之前完成这个的人类吧?真是难以分辨。 +interburbulator_success_prize_1=对了,这是你的奖品…泡泡是一条勇敢的小鱼,但他不是很擅长解谜。 +interburbulator_success_prize_2=对的,人类,你在学习。也许这个奖品能帮你更快的学习。 +interburbulator_success_prize_3=你做到了。我希望你觉得你的奖品比挑战更“重要”。 +interburbulator_success_prize_4=正确。你赢得了我的尊重,人类。我会给你叛徒的身体,他试图黑掉我的游戏。 +interburbulator_success_prize_5=正中目标,这是你的奖品。这些东西都是非常舒心的。能效是很重要的。 +interburbulator_success_prize_6=很好,这是你的奖品。我不知道这对你有没有用,但对我来说,它真的能帮助我早上起床。 +interburbulator_success_prize_7=太好了,这是你的奖品。我喜欢用这些来做研究,真的很有创意。 +interburbulator_success_prize_8=太棒了,这是你的奖品。我不知道你以前是否见过这些,但我就是喜欢站在一个好的插件效果分享塔的范围内。 +interburbulator_success_prize_9=恭喜你,这是你的奖品。这些处理器非常珍贵,也很难制作。 +interburbulator_success_prize_10=非常令人印象深刻的人类,在这里。曲虹球是我最珍贵的财产,千万别搞丢了,你无法制作更多的曲虹球。 +interburbulator_freeplay_unlocked=你已经学会了 如果你想的话,我会解锁自由玩法,这样你就可以自己制作谜题了。 +interburbulator_deny_freeplay_1=你需要解锁自由玩法才行。 +interburbulator_deny_freeplay_2=这是作弊。 +interburbulator_deny_freeplay_3=不要修改谜题。 +interburbulator_deny_freeplay_4=如果你能通过 5 个挑战,我会让你改变这些设置。 +interburbulator_deny_freeplay_5=你想黑掉我的机器吗? +interburbulator_deny_freeplay_6=只要坚持“尝试”输入即可。 +interburbulator_caption_prize=奖品:__1__ __2__ __3__ __4__ +interburbulator_caption_claimed=(已获取) +interburbulator_speak=[color=red]Brontion: __1__[/color] +interburbulator_robot_name=Brontion +interburbulator_introduction=Interburbul 是一款由 Brontion Burbulator 33027756 制作的游戏。游戏的目的是猜测一个 3D 向量,投射到 Brontion 选择的高亮单元格中。网格 3 个角的 3D 向量已知,这些点描述一个 3D 空间,你猜测从原点{0,0,0} 投射到这个空间上的点。游戏共有 10 轮,难度不断增加,完成每一轮都有奖励。击败 5 次挑战解锁自由游戏模式,并设置自己的挑战。 +interburbulator_random=随机 +interburbulator_freeplay=自由玩法 +interburbulator_game_title=玩 Interburbul +interburbulator_grid_size=栅格大小: +interburbulator_target_cell=目标格: +interburbulator_top_left=左上 +interburbulator_top_right=右上 +interburbulator_bottom_left=左下 +interburbulator_attempt=尝试 +interburbulator_attempt_limited=尝试(__1__/__2__) +interburbulator_attempt_locked=尝试(已锁定) +interburbulator_submit=提交尝试 +interburbulator_greeting=人类,来玩玩窝得游戏吧。我在 __2__ 星系的 __1__ 上。 +interburbulator_challenge_locked_1=稍后再试。 +interburbulator_challenge_locked_2=您已经使用了所有尝试。 +interburbulator_challenge_locked_3=请稍等片刻,然后再次开始。 +interburbulator_challenge_locked_4=你可以在 20 秒后再次尝试。 +interburbulator_challenge_locked_5=等 20 秒后,我就会解锁挑战。 +interburbulator_challenge_locked_6=锁定挑战时间 20 秒。 +cannot_do_via_satellite=无法远程完成。 +scan-progress-update=__1__ 的表面扫描进度:X __2__ Y __3__ +out_of_reach=超出距离 +capturable=可捕获 +touch-to-capture=触摸来捕获 +capture-blocked=被敌对势力阻挠捕获 +suffix_ruin=__1__ 废墟 +migration-recipe-changed=[img=utility/danger_icon] 配方已更改:__1__ + +[damage-type-name] +cold=寒冷 +suffocation=窒息 +meteor=小行星 + +[entity-name] +se-linked-container=曲连存储 +vase=瓶 +wooden-barrel=木桶 +furnace-ruin=毁坏的的石堆 +workshop-ruin=毁坏的的车间 +iron-wood-chest=旧箱子 +iron-wood-chest-remnants=毁坏的旧箱子 +stone-rubble=碎石 +se-gate-blocker=不稳定空间 +se-gate-blocker-void=不稳定空间 +destroyed-cargo-pod=损毁的货舱 +meteorite=陨石 +rocket-silo=火箭发射井 +rocket-fragment=火箭碎片 +se-antimatter-reactor=反物质反应堆 +se-beryllium-ore=绿柱石 +se-cargo-rocket-cargo-pod=货舱 +se-cryonite=冰晶石 +se-condenser-turbine=冷凝涡轮机 +se-condenser-turbine-tank=冷凝涡轮机 +se-condenser-turbine-generator=冷凝涡轮机 +se-core-fragment-processor=星核碎片处理设施 +se-core-miner=星核钻机 +se-core-miner-drill=星核钻机钻头 +se-cryogun-ice=冰墙 +se-dimensional-anchor=次元锚 +se-electric-boiler=电锅炉 +se-fluid-burner-generator=燃油发电机 +se-fuel-refinery=燃料精炼厂 +se-gate-fragment=遗迹碎片 +se-holmium-ore=钬矿 +se-iridium-ore=铱矿 +se-meteor-defence-container=广域陨石防御系统 +se-meteor-defence-charger=广域陨石防御系统 +se-meteor-point-defence-container=陨石点防御系统 +se-meteor-point-defence-charger=陨石点防御系统 +se-meteor-point-defence-charger-overcharged=陨石点防御系统 - 快充模式 +se-methane-ice=甲烷冰 +se-naquium-ore=寂介素矿 +se-pulveriser=粉碎机 +se-rocket-launch-pad=运载火箭发射井 +se-rocket-launch-pad-tank=运载火箭发射井 +se-rocket-launch-pad-silo=运载火箭发射井 +se-rocket-launch-pad-combinator=运载火箭发射井 +se-rocket-launch-pad-_-seat=运载火箭发射井 +se-rocket-launch-pad-settings=运载火箭发射井 +se-rocket-landing-pad=运载火箭着陆点 +se-space-accumulator=钬蓄电池 +se-space-accumulator-2=寂介素蓄电池 +se-space-astrometrics-laboratory=天体测量实验室 +se-space-biochemical-laboratory=生物化学实验室 +se-space-assembling-machine=太空组装机 +se-space-capsule-_-vehicle=太空舱 +se-space-curved-rail=太空铁路 +se-space-decontamination-facility=净化设施 +se-space-electromagnetics-laboratory=电磁学实验室 +se-space-genetics-laboratory=遗传学实验室 +se-space-growth-facility=培养设施 +se-space-gravimetrics-laboratory=重力学实验室 +se-space-hypercooler=超级冷却器 +se-space-laser-laboratory=激光实验室 +se-lifesupport-facility=维生设施 +se-space-manufactory=太空制造厂 +se-space-material-fabricator=材料合成机 +se-space-mechanical-laboratory=机械加工实验室 +se-space-particle-accelerator=粒子加速器 +se-space-particle-collider=粒子对撞机 +se-space-plasma-generator=等离子发生器 +se-space-radiation-laboratory=辐射实验室 +se-space-radiator=散热器 +se-space-radiator-2=散热器2 +se-recycling-facility=回收设施 +se-space-pipe=太空管道 +se-space-pipe-long=加长太空管道 +se-space-pipe-long-straight=加长太空直管道 __1__ +se-space-pipe-long-junction=加长太空管道连接处 __1__ +se-space-pipe-to-ground=地下太空管道 +se-space-science-lab=空间科学实验室 +se-space-solar-panel=平面太阳能板 +se-space-solar-panel-2=平面太阳能板2 +se-space-solar-panel-3=平面太阳能板3 +se-space-spectrometry-facility=光谱测定设施 +se-space-straight-rail=太空轨道 +se-space-supercomputer-1=超级计算机 +se-space-supercomputer-2=量子计算机 +se-space-supercomputer-3=神经计算机 +se-space-supercomputer-4=深度计算机 +se-space-telescope-radio=射电望远镜 +se-space-telescope-microwave=微波望远镜 +se-space-telescope=望远镜 +se-space-telescope-xray=X射线望远镜 +se-space-telescope-gammaray=伽马射线望远镜 +se-space-thermodynamics-laboratory=热力学实验室 +se-space-splitter=太空分流器 +se-space-transport-belt=太空传送带 +se-space-underground-belt=太空地下传送带 +se-spaceship-antimatter-engine=飞船反物质引擎 +se-spaceship-antimatter-booster-tank=飞船反物质燃料罐 +se-spaceship-console=飞船控制台 +se-spaceship-console-output=飞船控制台信号输出 +se-spaceship-console-alt=受损的飞船控制台 +se-spaceship-gate=飞船舱门 +se-spaceship-obstacle=飞船残骸 +se-spaceship-rocket-engine=飞船火箭引擎 +se-spaceship-rocket-booster-tank=飞船火箭燃料罐 +se-spaceship-wall=飞船外壳 +se-water-ice=水冰 +se-vitamelange=维生质 +se-vulcanite=火成岩 +small-asteroid=小行星 +se-gate-part=遗迹 +se-gate-platform-scaffold=遗迹应急设备 +se-gate-lock-switch=活动组件 +se-gate-lock-combinator=组合器附件 +se-gate-platform=遗迹增强平台 +se-gate-platform-combinator=组合器附件 +se-gate-energy-interface=能源平台 +se-gate-platform-button-switch=按钮 +se-gate-tank-input=流体输入 +se-gate-tank-output=流体输出 +se-pyramid-a=几何结构 +se-pyramid-b=几何结构 +se-pyramid-c=几何结构 +se-cartouche-a=漩涡装饰 +se-cartouche-b-a=漩涡装饰 +se-cartouche-b-b=漩涡装饰 +se-cartouche-chest=远古容器 +se-glyph=符号 +glyph=符号 +se-gate-addon=遗迹增强 +se-gate-platform-button-middle=停止 +se-gate-platform-button-left=左 +se-gate-platform-button-right=右 +beacon=基础插件分享塔 +se-wide-beacon=广域插件分享塔 +se-wide-beacon-2=广域插件分享塔2 +se-supercharger=超充能器 +se-addon-power-pole=附加式电线杆 +se-pylon=输电塔 +se-pylon-substation=广域配电式输电塔 +se-pylon-construction=建筑区输电塔 +se-pylon-construction-roboport=建筑区输电塔 +se-pylon-construction-radar=雷达建筑区输电塔 +se-pylon-construction-radar-roboport=雷达建筑区输电塔 +se-pylon-construction-radar-radar=雷达建筑区输电塔 +se-shield-projector=护盾投射器 +se-shield-projector-shield-floor-east=能量护盾 +se-shield-projector-shield-floor-north=能量护盾 +se-shield-projector-shield-floor-northeast=能量护盾 +se-shield-projector-shield-floor-northwest=能量护盾 +se-shield-projector-shield-floor-south=能量护盾 +se-shield-projector-shield-floor-southeast=能量护盾 +se-shield-projector-shield-floor-southwest=能量护盾 +se-shield-projector-shield-floor-west=能量护盾 +se-shield-projector-shield-wall-east=能量护盾 +se-shield-projector-shield-wall-north=能量护盾 +se-shield-projector-shield-wall-northeast=能量护盾 +se-shield-projector-shield-wall-northwest=能量护盾 +se-shield-projector-shield-wall-south=能量护盾 +se-shield-projector-shield-wall-southeast=能量护盾 +se-shield-projector-shield-wall-southwest=能量护盾 +se-shield-projector-shield-wall-west=能量护盾 +se-shield-projector-barrier=能量护盾 +se-naquium-heat-pipe=寂介素热管 +se-naquium-heat-pipe-horizontal=水平寂介素热管 +se-naquium-heat-pipe-vertical=垂直寂介素热管 +se-naquium-heat-pipe-long=寂介素热管长度__1__ +se-deep-space-transport-belt=深空传送带 +se-deep-space-transport-belt-black=黑色深空传送带 +se-deep-space-transport-belt-white=白色深空传送带 +se-deep-space-transport-belt-red=红色深空传送带 +se-deep-space-transport-belt-yellow=黄色深空传送带 +se-deep-space-transport-belt-green=绿色深空传送带 +se-deep-space-transport-belt-cyan=青色深空传送带 +se-deep-space-transport-belt-blue=蓝色深空传送带 +se-deep-space-transport-belt-magenta=品红深空传送带 +se-deep-space-underground-belt=深空传送带 +se-deep-space-underground-belt-black=黑色地下深空传送带 +se-deep-space-underground-belt-white=白色深空地下传送带 +se-deep-space-underground-belt-red=红色深空地下传送带 +se-deep-space-underground-belt-yellow=黄色深空地下传送带 +se-deep-space-underground-belt-green=绿色深空地下传送带 +se-deep-space-underground-belt-cyan=青色深空地下传送带 +se-deep-space-underground-belt-blue=蓝色深空地下传送带 +se-deep-space-underground-belt-magenta=品红深空地下传送带 +se-deep-space-splitter=深空分流器 +se-deep-space-splitter-black=黑色深空分流器 +se-deep-space-splitter-white=白色深空分流器 +se-deep-space-splitter-red=红色深空分流器 +se-deep-space-splitter-yellow=黄色深空分流器 +se-deep-space-splitter-green=绿色深空分流器 +se-deep-space-splitter-cyan=青色深空分流器 +se-deep-space-splitter-blue=蓝色深空分流器 +se-deep-space-splitter-magenta=品红深空分流器 +se-core-fissure=核心裂隙 +se-big-turbine=高温涡轮发电机 +se-big-turbine-generator=高温涡轮发电机 +se-big-turbine-tank=高温涡轮发电机 +se-big-heat-exchanger=高温换热器 +se-blueprint-registration-point=蓝图定位点 +se-delivery-cannon=货运火炮 +se-delivery-cannon-settings=货运火炮 +se-delivery-cannon-energy-interface=货运火炮 +se-delivery-cannon-chest=货运火炮接收箱 +se-delivery-cannon-weapon=武器投送火炮 +se-delivery-cannon-weapon-settings=武器投送火炮 +se-delivery-cannon-weapon-energy-interface=武器投送火炮 +se-spaceship-clamp=飞船夹钳 +se-spaceship-clamp-place=飞船夹钳 +se-bloater-pool-cloud=酸液池 +se-energy-transmitter-emitter=能量束发射器 +se-energy-transmitter-chamber=能量束室 +se-energy-transmitter-injector=能量束注入器 +se-energy-transmitter-injector-reactor=能量束注入器 +se-energy-receiver=能量束接收器 +se-energy-beam-defence=保护伞 +se-nexus=枢纽 +se-nexus-charger=枢纽 +se-space-probe-rocket=太空探测火箭 +se-space-probe-rocket-silo=太空探测火箭发射井 +se-interburbulator-interface=Interburbulator 界面 +se-interburbulator-control=Interburbulator 控制 +se-interburbulator-projector=Interburbulator 投影机 +se-burbulator=Brontion Burbulator 33027756 + +[entity-description] +pipe=流体输送 +pipe-to-ground=地下流体输送 +straight-rail=铁轨 +stone-furnace=熔炼矿石 +steel-furnace=熔炼矿石 +electric-furnace=熔炼矿石 +burner-assembling-machine=一种以热能供能的自动组装建筑。 +assembling-machine-1=一种自动的组装建筑物。 +assembling-machine-2=一种自动的组装建筑物。 +assembling-machine-3=一种自动的组装建筑物。 +oil-refinery=将原油转换成多种有用的产品。 +se-fuel-refinery=一种自动的原油精炼建筑物。 +chemical-plant=一种自动的组装建筑物。 +lab=一种自动的研究建筑物。 +burner-lab=一种自动的研究建筑物。 +transport-belt=一种可以运送物品的传送带。 +fast-transport-belt=一种可以运送物品的传送带。 +express-transport-belt=一种可以运送物品的传送带。 +underground-belt=一种可以在地下运送物品的传送带 +fast-underground-belt=一种可以在地下运送物品的传送带 +express-underground-belt=一种可以在地下运送物品的传送带 +splitter=一种基于传送带的机器,包含拆分、合并以及分拣功能。 +fast-splitter=一种基于传送带的机器,包含拆分、合并以及分拣功能。 +express-splitter=一种基于传送带的机器,包含拆分、合并以及分拣功能。 +se-gate-platform-scaffold=不管那个没法工作的环是什么。 在这个建筑工地进行一些维修,安装一些发动机,传感器,控制面板,和其他插件。 +se-gate-lock-switch=按 __CONTROL__rotate__ 来手动移动。 +se-gate-platform-button-switch=按 __CONTROL__rotate__ 来推动。 +se-gate-lock-combinator=功能尚未实现。 +se-gate-platform-combinator=功能尚未实现。 +se-gate-energy-interface=为遗迹供能。 +rocket-silo=将卫星发射到太空中以解锁“导航卫星模式”,并在发射卫星的恒星系统中发现新的行星、卫星和小行星带。 如果已经对当前系统进行了全面扫描,则会发现新的恒星。 +se-antimatter-reactor=通过湮灭反物质产生难以置信的高温。 +se-beryllium-ore=铍矿 +se-condenser-turbine=只有汽轮机能效的75%,但99%的蒸汽以水的形式返回。 温度范围:100到999。 \n最大输出功率:10MW。 +se-core-fragment-processor=从星核碎片中提取资源。 +se-core-miner=允许从行星和卫星中无限地提取资源,但在同个星体使用多个则会收益递减。 能耗50MW。 +se-core-miner-drill=允许从行星和卫星中无限地提取资源,但同个星体使用多个则会收益递减。 能耗50MW。 +se-dimensional-anchor=[font=default-bold][color=#f5cb48]放置限制:靠近恒星轨道[/color][/font]\n使用恒星的重力井作为空间异常的稳定点。 +se-electric-boiler=使用电力将水加热成蒸汽。 能效90%。 +se-fluid-burner-generator=需要有热值的液体燃料(如液体火箭燃料)来发电。 简单、紧凑,但缺乏大型蒸汽系统的能源效率。 为太空设计。 实际液体消耗量取决于液体热值。 +se-holmium-ore=钬矿 +se-iridium-ore=铱矿 +se-meteor-defence-container=陨石防御系统,范围可以覆盖整个星球,但同一时间只可攻击1个目标。 需要装填陨石防御弹药并且完全充能后才能发射。 命中率:80%,发射后需要一段时间重新充能。 充能时功率20MW。 +se-meteor-defence-charger=陨石防御系统,范围可以覆盖整个星球,但同一时间只可攻击1个目标。 需要装填陨石防御弹药并且完全充能后才能发射。 命中率:80%,发射后需要一段时间重新充能。 充能时功率20MW。 +se-meteor-point-defence-container=防御一定范围内的陨石。 可以同时射击4个目标。 需要装填陨石点防御弹药并且完全充能后才能发射。 范围:64,命中率:50%,发射后需要一段时间重新充能。 旋转以改变充电模式。 +se-meteor-point-defence-charger=防御一定范围内的陨石。 可以同时射击4个目标。 需要装填陨石点防御弹药并且完全充能后才能发射。 范围:64,命中率:50%,发射后需要一段时间重新充能。 旋转以改变充电模式。 +se-meteor-point-defence-charger-overcharged=防御一定范围内最多4颗陨石的袭击。 范围:64,命中率:50%,发射后需要一段时间重新充能。 超载可减少漏电的效果,但代价是发射时的功率波动。 +se-naquium-ore=寂介素矿 +se-rocket-launch-pad=将装载的货物发射至太空中。 可以搭载乘客,在舱门处按__CONTROL__toggle-driving__即可进入。 更多信息见[img=virtual-signal/informatron] 信息稽器人中的运载火箭 [__CONTROL__informatron__]。 +se-rocket-landing-pad=运载火箭载荷交付地点。 +se-space-assembling-machine=一台特制的组装机,可以在太空中工作。 +se-space-astrometrics-laboratory=组合、比较和量化来自不同天体的信息。 +se-space-biochemical-laboratory=一所重点研究生物化学的实验室。 也可以用来进行基本的化学反应和原油处理。 +se-space-capsule-_-vehicle=用来将乘客送回最近的行星地表。 按__CONTROL__toggle-driving__进入太空舱。 +se-space-decontamination-facility=净化需要在无菌环境中使用的物质,并制备低压条件下使用的液体。 +se-space-electromagnetics-laboratory=用于强磁场和极高电压环境下使用的设备。 +se-space-genetics-laboratory=一所用于基因测序、基因修饰和基因印刷的实验室。 +se-space-gravimetrics-laboratory=分析并模拟重力扰动。 +se-space-growth-facility=在一些常规环境下无法实现的条件下培育生物,如微重力环境。 +se-space-hypercooler=使用热流体进行热交换,使一端更热,另一端更冷。 +se-space-laser-laboratory=激光实验场所,必须佩戴护目镜。 +se-lifesupport-facility=在更加恶劣的环境中支持生命。 +se-space-manufactory=一个巨大的组装机,可以制作更复杂的配方。 只在太空(或飞船)中工作。 +se-space-material-fabricator=用来合成新材料,是粒子对撞机和3D打印机的完美融合。 +se-space-mechanical-laboratory=提供一系列的机械加工工序:破碎,撕裂,剪切,振动等。 +se-space-particle-accelerator=将粒子加速到亚光速。 +se-space-particle-collider=使高速粒子相互撞击并分析结果。 +se-space-pipe=不会阻挡您走路。 +se-space-pipe-long=一种更加经济的长距离输送流体的方式。 不会阻挡您走路。 +se-space-pipe-long-straight=长度__1__。侧面不会与其他管道连接。 适用于建造平行管道并长距离快速输送流体。 +se-space-pipe-long-junction=长度__1__。中间包含一个管道连接器。 适用于在装配线中快速输送流体。 +se-space-pipe-to-ground=昂贵且距离有限,仅用于特殊场合。 不会阻挡您走路。 +se-space-plasma-generator=产生各种等离子体。 +se-pulveriser=粉碎和研磨较硬的矿物和星核碎片。 +se-space-radiation-laboratory=提供一个相对安全的环境来处理放射性物质,可以用来处理铀。 +se-space-radiator=从高温热流体中散发出多余的热量。 +se-space-radiator-2=从过热的热流体中辐射出多余的热量。 +se-recycling-facility=回收废料和其他副产品并转化为资源。 +se-space-solar-panel=一种高效的太阳能板,您可以在上面行走。 +se-space-solar-panel-2=一种更加高效的太阳能板,您可以在上面行走。 +se-space-solar-panel-3=一种非常高效的太阳能板,您可以在上面行走。 +se-space-spectrometry-facility=分光光度法,气相色谱法,质谱法和其他光谱学。 向墙上发售物质,使其弯曲,看它击中哪里。 +se-space-supercomputer-1=对数据进行操作、处理和模拟。 +se-space-supercomputer-2=量子计算机。增强了对数据的操作、处理和模拟的能力。 +se-space-supercomputer-3=自适应神经网络量子计算机。增强了对数据的操作、处理和模拟的能力。 +se-space-supercomputer-4=一种纳米工程半有机超级计算机,利用空间扭曲和更高维度来提高处理密度和能量传输。 +se-space-straight-rail=专为太空使用而设计,在地面上也可使用。 +se-space-science-lab=使用高级研究包进行研究,仅可在太空中使用。 +se-space-telescope=精密的望远镜,对可见光谱范围内的多个波长敏感。 +se-space-telescope-gammaray=伽马射线不会折射。这个强大的望远镜使用镜子和特殊的传感器进行观测。 +se-space-telescope-xray=X射线会被大气层所阻挡,这个强大的望远镜转为真空环境设计,在这里大气层不再是问题。 +se-space-telescope-microwave=一台巨大的望远镜,可以探测微波和宇宙微波背景。 +se-space-telescope-radio=一台巨大的望远镜,可以探测从非常遥远距离发射的微弱的无线电波。 +se-space-thermodynamics-laboratory=进行涉及极端温度的加工处理。 也可以执行基本的热处理,例如冶炼。 +se-space-transport-belt=可以防止物品漂浮在空中的传送带。 +se-spaceship-antimatter-engine=[font=default-bold][color=#f5cb48]放置要求:飞船地板,[/color][/font]\n通过湮灭反物质射流来推进飞船。 此部件视为飞船的舱壁,可以保持船舱密封性。 +se-spaceship-antimatter-booster-tank=[font=default-bold][color=#f5cb48]放置要求:飞船地板,[/color][/font]\n存储反物质,用以飞船行驶。 飞船发射必备组件。 +se-spaceship-console=[font=default-bold][color=#f5cb48]放置要求:飞船地板,[/color][/font]\n用于操纵飞船在行星,卫星,轨道和小行星带之间移动。 必须放置于飞船地板,并使用飞船舱壁/舱门完全包围,不可留有缝隙和漏洞。 请仔细检查船舱密封性。 +se-spaceship-console-output=输出与飞船当前状态相关的信号。 更多信息请参见[img=virtual-signal/informatron]信息稽器人中的太空飞船分页[__CONTROL__informatron__]。 +se-spaceship-console-alt=[font=default-bold][color=#f5cb48]放置要求:飞船地板[/color][/font]\n该飞船控制台已受损,无法操控飞船。 +se-spaceship-gate=[font=default-bold][color=#f5cb48]放置要求:飞船地板,[/color][/font]\n包含一个力场,当舱门打开时也可以防止舱内失压。 此部件视为飞船的舱壁,可以保持船舱密封性。 +se-spaceship-rocket-engine=[font=default-bold][color=#f5cb48]放置要求:飞船地板,[/color][/font]\n燃烧化学燃料来推进飞船。 此部件视为飞船的舱壁,可以保持船舱密封性。 +se-spaceship-rocket-booster-tank=[font=default-bold][color=#f5cb48]放置要求:飞船地板,[/color][/font]\n存储化学燃料,用以飞船行驶。飞船发射必备组件。 +se-spaceship-wall=[font=default-bold][color=#f5cb48]放置要求:飞船地板,[/color][/font]\n作为飞船舱壁保持船舱密封性,请连续放置,对角线放置无法保持密封性。 +beacon=配备8个插件槽。 可以将插件的加成效果传送给附近3格范围内的友方机器。 使用多个插件分享塔为一个设施提供加成会使其过载并停止工作。 +se-wide-beacon=配备15个插件槽。 可以将插件的加成效果传送给附近14格范围内的友方机器。 使用多个插件分享塔为一个设施提供加成会使其过载并停止工作。 +se-wide-beacon-2=配备20个插件槽。 可以将插件的加成效果传送给附近14格范围内的友方机器。 使用多个插件分享塔为一个设施提供加成会使其过载并停止工作。 +kr-singularity-beacon=一种紧凑的100%效率的近程插件分享塔。 将插件的加成效果传送给附近2格范围内的友方机器。 使用多个插件分享塔为一个设施提供加成会使其过载并停止工作。 +se-supercharger=可以同时为64个机器人高速充电。 该设施最大功率1GW。 +se-addon-power-pole=一种被设计用来精确控制输电范围的附加式小型电线杆。 +se-pylon=传输电力。连接范围64格。 +se-pylon-substation=传输电力。 连接范围64格,输电范围64x64。 +se-pylon-construction=传输电力并能够扩展机器人建筑区。 连接范围64格,建筑区范围64x64。 +se-pylon-construction-radar=传输电力并能够扩展机器人建筑区,还能够提供雷达功能。 连接范围64格,建筑区/视野范围256x256。 4x4物流范围。 +se-shield-projector=创造一个保护力场。 当护盾投射器充能或防护罩承受伤害时,需要更多的能量。 如果安装了“Walls Block Spitters”Mod,则可以阻挡喷吐虫的酸液投射。 +se-big-turbine=[font=default-bold][color=#e4cead]最大输出:[/color][/font] 1GW。\n一种大型发电机,一端输入5000°C的蒸汽,并从另一端排出500°C的蒸汽,在侧面输出水。能效99%,99%的水可以循环使用。 +se-big-heat-exchanger=一种为高温和高容量而设计的大型换热器。 +se-delivery-cannon=一种能将物资发射入轨道或更远的轨道炮。 若无法安全接收会造成损坏,请谨慎使用。 +se-delivery-cannon-chest=一种装甲箱子,设计用于安全的接收高速下落的物资。 需要库存空间,以安全接收物资。 +se-delivery-cannon-weapon=能够将弹药发射到轨道上甚至更远的大型轨道炮。 谨慎使用。 +se-spaceship-clamp=飞船上的夹钳可以锚定在反向夹钳上从而使飞船停泊。 此部件视为飞船的舱壁,可以保持船舱密封性。 +se-spaceship-clamp-place=飞船上的夹钳可以锚定在反向夹钳上从而使飞船停泊。 此部件视为飞船的舱壁,可以保持船舱密封性。 +se-space-accumulator=能量密度极高。 +se-space-accumulator-2=能量密度极高。 +se-energy-transmitter-emitter=生产表面间能量束的中心建筑。 可用作武器或向能量束接收器传输能量。 需要附加的能量束室,以及连接的能量束注入器。光束强度基于注入器的数量。 +se-energy-transmitter-chamber=必须与能量束发射器相连。 其他腔室可以连接到两边的末端或中间。 能量束注入器只能连接到两侧。 +se-energy-transmitter-injector=必须连接到能量束室并连接到发射器。 注入器有固定的功率消耗,每一个注入器都会增加发送器给接收器传输的热量,或者增加能量束武器的速度和伤害。 +se-energy-transmitter-injector-reactor=必须连接到能量束室并连接到发射器。 注入器有固定的功率消耗,每一个注入器都会增加发送器给接收器传输的热量,或者增加能量束武器的速度和伤害。 +se-energy-receiver=以热能形式捕获能量束。 发射器必须处于输能模式,目标必须在接收器上。 +se-energy-beam-defence=能量束防御设施。 防御天基能量束和日冕物质喷射。 运作的唯一要求是电力,基础能耗为10MW,但会根据来袭能量束的强度而增加。 对付日冕物质喷射,每个表面只需要1个,对付能量束武器,1个保护伞可以防御高达500GW的攻击力。在[img=virtual-signal/informatron]信息稽器人[__CONTROL__informatron__]的能量束页面查看详情。 +spidertron=如果运载火箭没有降落在着陆台,可从中部署。 +se-nexus=只在移动的飞船上发挥作用,能耗与速度成正比。 可以从星际运动中获取数据,数据生成基于飞船动能。 枢纽的设计是作为扭曲驱动,如果有合适的技术,可以逃离本地恒星群。 +se-nexus-charger=只在移动的飞船上发挥作用,能耗与速度成正比。 可以从星际运动中获取数据,数据生成基于飞船动能。 枢纽的设计是作为扭曲驱动,如果有合适的技术,可以逃离本地恒星群。 +se-space-probe-rocket-silo=用于发射太空探测器的火箭发射井。 +se-linked-container=由高维空间与其他容器相连的容器。 容器的连接取决于它首次放置的表面。 + +[equipment-name] +energy-shield-equipment=能量盾 +energy-shield-mk2-equipment=能量盾 MK2 +energy-shield-mk3-equipment=能量盾 MK3 +energy-shield-mk4-equipment=能量盾 MK4 +energy-shield-mk5-equipment=能量盾 MK5 +energy-shield-mk6-equipment=能量盾 MK6 +se-adaptive-armour-equipment-1=适应性装甲 MK1 +se-adaptive-armour-equipment-2=适应性装甲 MK2 +se-adaptive-armour-equipment-3=适应性装甲 MK3 +se-adaptive-armour-equipment-4=适应性装甲 MK4 +se-adaptive-armour-equipment-5=适应性装甲 MK5 +se-rtg-equipment=便携式 RTG +se-rtg-equipment-2=便携式 RTG MK2 +se-lifesupport-equipment-1=维生装备 MK1 +se-lifesupport-equipment-2=维生装备 MK2 +se-lifesupport-equipment-3=维生装备 MK3 +se-lifesupport-equipment-4=维生装备 MK4 + +[equipment-description] +energy-shield-equipment=护盾发生器,充能快速但会消耗很多能量。 +energy-shield-mk2-equipment=护盾发生器,充能快速但会消耗很多能量。 +energy-shield-mk3-equipment=护盾发生器,充能快速但会消耗很多能量。 +energy-shield-mk4-equipment=护盾发生器,充能快速但会消耗很多能量。 +energy-shield-mk5-equipment=护盾发生器,充能快速但会消耗很多能量。 +energy-shield-mk6-equipment=护盾发生器,充能快速但会消耗很多能量。 +se-adaptive-armour-equipment-1=可以使用能量进行自我修复的装甲。 会随时间推移缓慢增加护甲值。 +se-adaptive-armour-equipment-2=可以使用能量进行自我修复的装甲。 会随时间推移缓慢增加护甲值。 +se-adaptive-armour-equipment-3=可以使用能量进行自我修复的装甲。 会随时间推移缓慢增加护甲值。 +se-adaptive-armour-equipment-4=可以使用能量进行自我修复的装甲。 会随时间推移缓慢增加护甲值。 +se-adaptive-armour-equipment-5=可以使用能量进行自我修复的装甲。 会随时间推移缓慢增加护甲值。 +se-rtg-equipment=放射性同位素热电式发电机。 一个可以将放射性物质衰变时产生的热量转化为电力的便携式装置。 可以持续运行数十年,期间无需添加燃料。 +se-rtg-equipment-2=放射性同位素热电式发电机。 一个可以将放射性物质衰变时产生的热量转化为电力的进阶型便携装置。 可以持续运行数十年,期间无需添加燃料。 +se-lifesupport-equipment-1=提高生命维持效率+100%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 +se-lifesupport-equipment-2=提高生命维持效率+200%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 +se-lifesupport-equipment-3=提高生命维持效率+400%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 +se-lifesupport-equipment-4=提高生命维持效率+800%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 + +[fluid-name] +se-antimatter-stream=反物质流 +se-bio-sludge=生化软泥 +se-contaminated-bio-sludge=生化污泥 +se-contaminated-space-water=宇宙污水 +se-chemical-gel=化学凝胶 +se-decompressing-steam=冷凝蒸汽 +se-liquid-rocket-fuel=液体火箭燃料 +se-methane-gas=甲烷气体 +se-methane-gas-mixed=混合的甲烷气体 +se-nutrient-gel=营养凝胶 +se-neural-gel=神经凝胶 +se-neural-gel-2=高级神经凝胶 +se-ion-stream=离子流 +se-plasma-stream=等离子流 +se-particle-stream=粒子流 +se-proton-stream=质子流 +se-space-coolant=25°C热流体 +se-space-coolant-hot=25°C热流体 +se-space-coolant-warm=-10°C热流体 +se-space-coolant-cold=-100°C热流体 +se-space-coolant-supercooled=-273°C超低温热流体 +se-space-water=宇宙水 +se-beryllium-hydroxide=氢氧化铍 +se-cryonite-slush=冰晶石浆 + +[fluid-description] +se-space-water=不会在低温低压下冻结的水,适合在太空环境下使用。 +se-space-coolant=热流体的默认温度。 +se-space-coolant-hot=热流体的默认温度。 +se-space-coolant-warm=热流体被热散热器冷却后的温度。 +se-space-coolant-cold=热流体经过超级冷却器冷却后的温度。 +se-space-coolant-supercooled=热流体重复经过超级冷却器冷却后的温度。 + +[fuel-category-name] +antimatter=反物质燃料 + +[item-group-name] +space=太空 +science=科技 +spaceship=飞船 +bob-fluids=流体 +resources=资源 +intermediate-products=制造 +combat=装备&战斗 + +[item-name] +spidertron=蜘蛛机甲 +core-fragment=星核碎片(__1__) +effectivity-module-4=节能插件 4 +effectivity-module-5=节能插件 5 +effectivity-module-6=节能插件 6 +effectivity-module-7=节能插件 7 +effectivity-module-8=节能插件 8 +effectivity-module-9=节能插件 9 +glass=玻璃 +productivity-module-4=产能插件 4 +productivity-module-5=产能插件 5 +productivity-module-6=产能插件 6 +productivity-module-7=产能插件 7 +productivity-module-8=产能插件 8 +productivity-module-9=产能插件 9 +rocket-fuel=固态火箭燃料 +sand=沙子 +solid-sand=洗过的沙子 +washed-sand=洗过的沙子 +satellite=导航卫星 +se-satellite-telemetry=卫星遥测 +se-antimatter-canister=反物质罐 +se-astrometric-data=天体测量数据 +se-astronomic-catalogue-1=天文学目录 +se-astronomic-catalogue-2=通用天文学目录 +se-astronomic-catalogue-3=综合天文学目录 +se-astronomic-catalogue-4=扩展天文学目录 +se-astronomic-insight=天文学研究成果 +se-astronomic-science-pack-1=天文学科研包 1 +se-astronomic-science-pack-2=天文学科研包 2 +se-astronomic-science-pack-3=天文学科研包 3 +se-astronomic-science-pack-4=天文学科研包 4 +se-atomic-data=原子数据 +se-beryllium-ore=绿柱石 +se-ballistic-shielding-data=弹道防护数据 +se-beryllium-ore-crushed=粉碎的绿柱石 +se-beryllium-ore-washed=洗过的绿宝石 +se-beryllium-plate=铍板 +se-beryllium-powder=铍粉 +se-beryllium-ingot=铍锭 +se-beryllium-sulfate=硫酸铍 +se-bio-combustion-data=生物燃烧数据 +se-bio-combustion-resistance-data=生物燃烧抗性数据 +se-bio-spectral-data=生物光谱数据 +se-biochemical-data=生化数据 +se-biochemical-resistance-data=生化抗性数据 +se-bioculture=生物培养 +se-bioelectrics-data=生物电数据 +se-biological-catalogue-1=生物学目录 +se-biological-catalogue-2=通用生物学目录 +se-biological-catalogue-3=综合生物学目录 +se-biological-catalogue-4=扩展生物学目录 +se-biological-insight=生物学研究成果 +se-biological-science-pack-1=生物学科研包 1 +se-biological-science-pack-2=生物学科研包 2 +se-biological-science-pack-3=生物学科研包 3 +se-biological-science-pack-4=生物学科研包 4 +se-biomechanical-data=生物力学数据 +se-biomechanical-resistance-data=生物力学抗性数据 +se-boson-data=玻色子数据 +se-broken-data=损坏的数据卡 +se-canister=安全罐 +se-biogun=生化枪 +se-bloater-ammo=酸液爆裂弹 +se-pheromone-ammo=信息素镖 +se-cryogun=冷冻枪 +se-cryogun-ammo=冰川弹药 +se-rocket-launch-pad-silo-dummy-ingredient-item=运载火箭(隐藏原料) +se-rocket-launch-pad-silo-dummy-result-item=运载火箭(隐藏产品) +se-cargo-rocket-cargo-pod=货舱 +se-cargo-rocket-fuel-tank=火箭燃料罐 +se-cargo-rocket-section=运载火箭区段 +se-cargo-rocket-section-packed=打包的运载火箭区段 +se-cold-thermodynamics-data=低温热力学数据 +se-comparative-genetic-data=基因比较数据 +se-compressive-strength-data=抗压强度数据 +se-conductivity-data=电导率数据 +se-contaminated-scrap=污料 +se-core-fragment-omni=星核碎片 +se-corrosion-resistance-data=耐腐蚀数据 +se-cryogenics-data=低温数据 +se-cryonite=冰晶石 +se-cryonite-crushed=粉碎的冰晶石 +se-cryonite-washed=洗过的冰晶石 +se-cryonite-rod=冰晶石棒 +se-cryonite-ion-exchange-beads=阴离子交换珠 +se-dark-energy-data=暗能量数据 +se-darkmatter-data=暗物质数据 +se-data-storage-substrate-cleaned=抛光的数据存储基板 +se-data-storage-substrate=粗糙的数据存储基板 +se-decompression-data=减压数据 +se-decompression-resistance-data=减压抗性数据 +se-universal-catalogue=宇宙学目录 +se-deep-space-science-pack=深空科学研究包 +se-deep-space-science-pack-1=深空科学研究包 1 +se-deep-space-science-pack-2=深空科学研究包 2 +se-deep-space-science-pack-3=深空科学研究包 3 +se-deep-space-science-pack-4=深空科学研究包 4 +se-doppler-shift-data=多普勒频移数据 +se-durability-data=耐久性数据 +se-electrical-shielding-data=电击防护数据 +se-electromagnetic-field-data=电磁场数据 +se-empty-data=空白数据卡 +se-empty-lifesupport-canister=空的维生罐 +se-energy-catalogue-1=能量目录 +se-energy-catalogue-2=通用能量目录 +se-energy-catalogue-3=综合能量目录 +se-energy-catalogue-4=扩展能量目录 +se-energy-insight=能量学研究成果 +se-energy-science-pack-1=能量科研包 1 +se-energy-science-pack-2=能量科研包 2 +se-energy-science-pack-3=能量科研包 3 +se-energy-science-pack-4=能量科研包 4 +se-entanglement-data=纠缠数据 +se-enriched-naquium=富化寂介素 +se-exotic-fission-data=奇异裂变数据 +se-exotic-singularity-data=奇点数据 +se-explosion-shielding-data=爆炸防护数据 +se-experimental-alloys-data=实验合金数据 +se-experimental-biochemical-data=实验生化数据 +se-experimental-bioculture=实验生物培养 +se-experimental-genetic-data=实验遗传学数据 +se-experimental-material-decay-data=实验材料老化数据 +se-experimental-material-spectral-data=实验材料光谱数据 +se-experimental-material=原型实验材料 +se-experimental-specimen=实验生物质 +se-experimental-superconductor=原型超导体 +se-forcefield-data=力场数据 +se-friction-data=摩擦数据 +se-fusion-test-data=聚变实验数据 +se-gammaray-detector=伽马射线探测器 +se-gammaray-observation-data=伽马射线观测数据 +se-gammaray-test-data=伽玛射线数据 +se-gate-fragment=遗迹碎片 +se-genetic-data=遗传学数据 +se-gravity-wave-observation-data=引力波观测数据 +se-gravity-wave-data=引力波数据 +se-gravimetric-observation-data=引力观测数据 +se-gravimetric-test-data=重力学测试数据 +se-gravitational-lensing-data=引力透镜效应数据 +se-heat-shielding=隔热瓦 +se-holmium-ore=钬矿 +se-holmium-ore-crushed=粉碎的钬矿石 +se-holmium-ore-washed=洗过的钬矿石 +se-holmium-powder=钬粉 +se-holmium-plate=钬板 +se-holmium-ingot=钬锭 +se-hot-thermodynamics-data=高温热力学数据 +se-impact-shielding-data=冲击防护数据 +se-infrared-observation-data=红外观测数据 +se-ion-spectrometry-data=离子光谱数据 +se-iridium-ore=铱矿 +se-iridium-ore-crushed=粉碎的铱矿石 +se-iridium-ore-washed=洗过的铱矿石 +se-iridium-piledriver=铱桩 +se-iridium-powder=铱粉 +se-iridium-plate=铱板 +se-iridium-ingot=铱锭 +se-junk-data=垃圾数据卡 +se-laser-shielding-data=激光防护数据 +se-lepton-data=轻子数据 +se-lifesupport-canister=维生罐 +se-machine-learning-data=机器学习数据 +se-magnetic-canister=磁力罐 +se-magnetic-monopole-data=磁单极子数据 +se-material-decay-data=材料老化数据 +se-material-science-pack-1=材料科研包 1 +se-material-science-pack-2=材料科研包 2 +se-material-science-pack-3=材料科研包 3 +se-material-science-pack-4=材料科研包 4 +se-material-spectral-data=材料光谱数据 +se-material-testing-pack=材料测试包 +se-material-catalogue-1=材料目录 +se-material-catalogue-2=通用材料目录 +se-material-catalogue-3=综合材料目录 +se-material-catalogue-4=扩展材料目录 +se-material-insight=材料学研究成果 +se-medpack=医疗包 +se-medpack-2=医疗包 2 +se-medpack-3=医疗包 3 +se-medpack-4=医疗包 4 +se-meteor-defence=广域陨石防御系统 +se-meteor-defence-ammo=陨石防御弹药 +se-meteor-point-defence=陨石点防御系统 +se-meteor-point-defence-ammo=陨石点防御弹药 +se-methane-ice=甲烷冰 +se-micro-black-hole-data=微型黑洞数据 +se-microwave-observation-data=微波观测数据 +se-negative-pressure-data=负压数据 +se-nano-cold-thermodynamics-data=纳米材料低温热力学数据 +se-nano-compressive-strength-data=纳米材料抗压强度数据 +se-nano-hot-thermodynamics-data=纳米材料高温热力学数据 +se-nanomaterial=纳米材料 +se-nano-tensile-strength-data=纳米材料拉伸强度数据 +se-naquium-ore=寂介素矿 +se-naquium-ore-crushed=粉碎的寂介素矿 +se-naquium-ore-washed=洗过的寂介素矿 +se-naquium-powder=寂介素粉 +se-naquium-plate=寂介素板 +se-naquium-ingot=寂介素锭 +se-neural-anomaly-data=神经异常数据 +se-nutrient-vat=营养物池 +se-observation-frame-blank=空观测框架 +se-observation-frame-gammaray=伽马射线观测框架 +se-observation-frame-infrared=红外观测框架 +se-observation-frame-microwave=微波观测框架 +se-observation-frame-radio=无线电波观测框架 +se-observation-frame-uv=紫外线观测框架 +se-observation-frame-visible=可见光观测框架 +se-observation-frame-xray=X射线观测框架 +se-orbital-data=轨道计算数据 +se-particle-beam-shielding-data=粒子束防护数据 +se-plague-bomb=瘟疫火箭弹 +se-plasma-canister=等离子罐 +se-plasma-electrodynamics-data=等离子体电动力学数据 +se-plasma-thermodynamics-data=等离子体热力学数据 +se-polarisation-data=极化数据 +se-pressure-containment-data=压力遏制数据 +se-quantum-phenomenon-data=量子现象数据 +se-quark-data=夸克数据 +se-radiation-data=辐射数据 +se-radiation-exposure-data=辐射暴露数据 +se-radiation-exposure-resistance-data=辐射抗性数据 +se-radiation-shielding-data=辐射防护数据 +se-radio-observation-data=无线电波观测数据 +se-rigidity-data=硬度数据 +se-rtg-equipment=便携式 RTG +se-rtg-equipment-2=便携式 RTG MK2 +se-scrap=废料 +se-shear-strength-data=抗剪强度数据 +se-significant-data=奇异数据 +se-significant-specimen=奇异生物质 +se-singularity-data=奇点数据 +se-space-capsule=太空舱 +se-space-mirror=多光谱镜 +se-space-platform-plating=镀层轨道平台 +se-space-platform-scaffold=轨道平台框架 +se-space-rail=太空铁路 +se-spaceship-floor=飞船地板 +se-specimen=生物质 +se-subatomic-data=亚原子数据 +se-superconductivity-data=超导数据 +se-superconductor=超导体 +se-superconductive-cable=超导电缆 +se-tensile-strength-data=拉伸强度数据 +se-tesla-ammo=特斯拉枪弹药 +se-tesla-gun=特斯拉枪 +se-thruster-suit=推进太空服 +se-thruster-suit-2=推进太空服 MK2 +se-thruster-suit-3=推进太空服 MK3 +se-thruster-suit-4=推进太空服 MK4 +se-timespace-anomaly-data=时空异常数据 +se-used-lifesupport-canister=用过的维生罐 +se-uv-observation-data=紫外观测数据 +se-visible-observation-data=可见光观测数据 +se-vitamelange=维生质 +se-vitamelange-nugget=维生质块 +se-vitamelange-roast=烘烤维生质 +se-vitamelange-spice=维生质香料 +se-vitamelange-extract=维生质提取 +se-vulcanite=火成岩 +se-vulcanite-crushed=粉碎的火成岩 +se-vulcanite-washed=洗过的火成岩 +se-vulcanite-block=火成岩块 +se-vulcanite-ion-exchange-beads=阳离子交换珠 +se-water-ice=水冰 +se-xray-observation-data=X 射线观测数据 +se-zero-point-energy-data=零点能量数据 +se-rocket-science-pack=火箭科研包 +space-science-pack=优化研究包 +speed-module-4=速度插件 4 +speed-module-5=速度插件 5 +speed-module-6=速度插件 6 +speed-module-7=速度插件 7 +speed-module-8=速度插件 8 +speed-module-9=速度插件 9 +se-aeroframe-pole=航空框架杆 +se-aeroframe-scaffold=航空框架支架 +se-aeroframe-bulkhead=航空框架隔板 +se-lattice-pressure-vessel=晶格压力容器 +se-heavy-girder=重型梁 +se-heavy-bearing=重型轴承 +se-heavy-composite=重型复合材料 +se-heavy-assembly=重型组装 +se-bioscrubber=生物洗涤器 +se-vitalic-epoxy=维生质环氧树脂 +se-vitalic-reagent=维生质试剂 +se-vitalic-acid=维生质酸 +se-self-sealing-gel=自封凝胶 +se-holmium-cable=钬电缆 +se-holmium-solenoid=钬螺线管 +se-quantum-processor=量子处理器 +se-dynamic-emitter=动态发射器 +se-naquium-processor=寂介素处理器 +se-naquium-cube=寂介素立方体 +se-naquium-tessaract=寂介素超正方体 +se-wide-beacon=广域插件分享塔 +se-wide-beacon-2=广域插件分享塔 2 +se-lifesupport-equipment-1=维生装备 MK1 +se-lifesupport-equipment-2=维生装备 MK2 +se-lifesupport-equipment-3=维生装备 MK3 +se-lifesupport-equipment-4=维生装备 MK4 +se-naquium-heat-pipe=寂介素热管 +se-naquium-heat-pipe-horizontal=水平寂介素热管 +se-naquium-heat-pipe-vertical=垂直寂介素热管 +se-naquium-heat-pipe-long=寂介素热管长度 __1__ +se-deep-space-transport-belt=深空传送带 +se-deep-space-transport-belt-black=黑色深空传送带 +se-deep-space-transport-belt-white=白色深空传送带 +se-deep-space-transport-belt-red=红色深空传送带 +se-deep-space-transport-belt-yellow=黄色深空传送带 +se-deep-space-transport-belt-green=绿色深空传送带 +se-deep-space-transport-belt-cyan=青色深空传送带 +se-deep-space-transport-belt-blue=蓝色深空传送带 +se-deep-space-transport-belt-magenta=品红深空传送带 +se-deep-space-underground-belt=深空地下传送带 +se-deep-space-underground-belt-black=黑色深空地下传送带 +se-deep-space-underground-belt-white=白色深空地下传送带 +se-deep-space-underground-belt-red=红色深空地下传送带 +se-deep-space-underground-belt-yellow=黄色深空地下传送带 +se-deep-space-underground-belt-green=绿色深空地下传送带 +se-deep-space-underground-belt-cyan=青色深空地下传送带 +se-deep-space-underground-belt-blue=蓝色深空地下传送带 +se-deep-space-underground-belt-magenta=品红深空地下传送带 +se-deep-space-splitter=深空分流器 +se-deep-space-splitter-black=黑色深空分流器 +se-deep-space-splitter-white=白色深空分流器 +se-deep-space-splitter-red=红色深空分流器 +se-deep-space-splitter-yellow=黄色深空分流器 +se-deep-space-splitter-green=绿色深空分流器 +se-deep-space-splitter-cyan=青色深空分流器 +se-deep-space-splitter-blue=蓝色深空分流器 +se-deep-space-splitter-magenta=品红深空分流器 +se-blueprint-registration-point=蓝图定位点 +se-delivery-cannon-capsule=货运火炮货舱 +se-delivery-cannon-capsule-packed=货运火炮货舱:__1__ +se-delivery-cannon-targeter=货运火炮瞄准器 +se-delivery-cannon-weapon-capsule=武器投送舱 +se-delivery-cannon-weapon-capsule-packed=武器投送仓:__1__ +se-delivery-cannon-weapon-targeter=武器投送火炮瞄准器 +se-energy-transmitter-targeter=能量束瞄准器 +se-arcosphere=曲虹球 +se-arcosphere-a=λ 曲虹球拉姆达 +se-arcosphere-b=ξ 曲虹球克西 +se-arcosphere-c=ζ 曲虹球泽塔 +se-arcosphere-d=θ 曲虹球西塔 +se-arcosphere-e=ε 曲虹球艾普西隆 +se-arcosphere-f=φ 曲虹球斐 +se-arcosphere-g=γ 曲虹球伽玛 +se-arcosphere-h=ω 曲虹球欧米伽 +se-arcosphere-collector=曲虹球收集器 +se-star-probe=恒星探测器 +se-belt-probe=小行星带探测器 +se-void-probe=星际虚空探测器 +se-star-probe-data=恒星探测数据 +se-belt-probe-data=小行星带探测数据 +se-void-probe-data=星际虚空探测数据 +se-nano-engineering-data=纳米工程数据 +se-annihilation-data=湮灭数据 +se-naquium-structural-data=寂介素结构数据 +se-hyperlattice-data=超晶格数据 +se-naquium-energy-data=寂介素能量数据 +se-space-fold-data=空间折叠数据 +se-space-warp-data=空间翘曲数据 +se-space-dialation-data=空间扩张数据 +se-space-injection-data=空间注入数据 +se-interstellar-data=星际旅行数据 +se-teleportation-data=传送数据 +se-wormhole-data=虫洞数据 +se-rhga-data=现实超图分析数据 +se-deep-catalogue-1=深空目录 +se-deep-catalogue-2=通用深空目录 +se-deep-catalogue-3=综合深空目录 +se-deep-catalogue-4=扩展深空目录 +se-space-probe-rocket=太空探测火箭 +se-space-probe-rocket-deployed=太空探测火箭(已部署) +se-railgun=轨道枪 +se-railgun-ammo=轨道枪弹药 + +[item-description] +automation-science-pack=用于基础研究所研究使用。 +chemical-science-pack=用于基础研究所研究使用。 +logistic-science-pack=用于基础研究所研究使用。 +military-science-pack=用于基础研究所研究使用。 +production-science-pack=用于基础研究所研究使用。 +satellite=卫星应放在卫星火箭发射井或(或太空探测器火箭发射井)。 卫星可以发现其发射的恒星系内的天体或遥远的恒星的精确坐标。 提供[img=item/se-satellite-telemetry]卫星遥测。 +se-satellite-telemetry=火箭科学所需的卫星遥测记录。 通过从卫星火箭发射井(或太空探测火箭发射井)发射[img=item/satellite]导航卫星获得。 +se-antimatter-canister=安全存储和运输极高能量密度物质的容器。 +se-astronomic-science-pack-1=用于空间科学实验室的研究。 +se-astronomic-science-pack-2=用于空间科学实验室的研究。 +se-astronomic-science-pack-3=用于空间科学实验室的研究。 +se-astronomic-science-pack-4=用于空间科学实验室的研究。 +se-beryllium-ore=铍矿石 +se-biological-science-pack-1=用于空间科学实验室的研究。 +se-biological-science-pack-2=用于空间科学实验室的研究。 +se-biological-science-pack-3=用于空间科学实验室的研究。 +se-biological-science-pack-4=用于空间科学实验室的研究。 +se-canister=多用途容器。 +se-cargo-rocket-cargo-pod=运载火箭组件之一。 +se-cargo-rocket-fuel-tank=运载火箭组件之一。 +se-cargo-rocket-section=运载火箭关键组件。每枚运载火箭需要100个运载火箭区段。 可从着陆的火箭中回收。(基础回收率20%) +se-cargo-rocket-section-packed=将运载火箭区段打包以方便运输。 必须先解包才能使用。 +se-bloater-ammo=在地面上形成一个具有传染性的生化污泥池。 被感染的敌人会肿胀,移动速度降低并且受到持续伤害。 如果它们在肿胀的时候死亡,它们的尸体会爆裂,飞溅出的内脏会对附近的敌人造成伤害,可能会造成连锁反应。 爆裂产生的投射物的总伤害为目标最大生命值的50%。 +se-pheromone-ammo=使敌对撕咬虫和喷吐虫产生混乱,让它们认为你是友方并将同族视为敌人。 +se-cryogun=制造一堵能冻结敌人的冰墙。 +se-deep-space-science-pack=用于太空研究所研究使用。 +se-energy-science-pack-1=用于空间科学实验室的研究。 +se-energy-science-pack-2=用于空间科学实验室的研究。 +se-energy-science-pack-3=用于空间科学实验室的研究。 +se-energy-science-pack-4=用于空间科学实验室的研究。 +se-heat-shielding=用于抵抗高温和真空环境的复合板。 +se-holmium-ore=钬矿 +se-iridium-ore=铱矿 +se-material-science-pack-1=用于空间科学实验室的研究。 +se-material-science-pack-2=用于空间科学实验室的研究。 +se-material-science-pack-3=用于空间科学实验室的研究。 +se-material-science-pack-4=用于空间科学实验室的研究。 +se-medpack=使用来治愈自己。 +se-medpack-2=使用来治愈自己。 +se-medpack-3=使用来治愈自己。 +se-medpack-4=使用来治愈自己。 +se-meteor-defence=可以覆盖整个星球的陨石防御系统,但同一时间只可攻击1个目标。 需要装填陨石防御弹药并且完全充能后才能发射。 命中率:80%,发射后需要一段时间重新充能。 +se-meteor-defence-ammo=可以摧毁陨石,必须安装于广域陨石防御系统中。 +se-meteor-point-defence=防御一定范围内的陨石。 可以同时射击4个目标。 需要装填陨石点防御弹药并且完全充能后才能发射。 范围:64,命中率:50%,发射后需要一段时间重新充能。 +se-meteor-point-defence-container=可以摧毁陨石,必须安装于陨石点防御系统中。 +se-naquium-ore=寂介素矿石,只能在深空发现,是星际虚空的宝藏。 +se-rocket-launch-pad-silo-dummy-ingredient-item=将100个运载火箭区段和1个太空舱放入运载火箭发射井来建造。 +se-rtg-equipment=放射性同位素热电式发电机。 一个可以将放射性物质衰变时产生的热量转化为电力的便携式装置。 可以持续运行数十年,期间无需添加燃料。 +se-rtg-equipment-2=放射性同位素热电式发电机。 一个可以将放射性物质衰变时产生的热量转化为电力的进阶型便携装置。 可以持续运行数十年,期间无需添加燃料。 +se-plague-bomb=威力足以消灭一个星球上的所有生物,使用时请格外小心。(可能会严重降低UPS,因为所有东西都会逐渐死亡,不建议在大型星球或多人游戏中使用。) +se-space-capsule=运载火箭必须的控制舱,可以将乘客送回最近行星的地表。 按__CONTROL__toggle-driving__进入太空舱。 +se-space-platform-plating=[font=default-bold][color=#f5cb48]仅能放置在:太空[/color][/font]高级镀层轨道平台,允许在轨道平台上快速移动。 +se-space-platform-scaffold=[font=default-bold][color=#f5cb48]仅能放置在:太空[/color][/font]基础的轨道平台框架,允许您在空间放置某些结构。 +se-space-rail=安全的太空铁路,因为他们可以防止火车从轨道上飞出并毁掉一切。 因其美观性,也可以在地面使用。 +se-spaceship-floor=这种地板必须安置在飞船部件的下方,且外围需要被飞船舱壁完全包裹。 地板上的任何缝隙都会导致密封性受损,导致该区块脱离飞船。 +se-superconductive-cable=一根无需主动散热装置的超导电缆。 +se-tesla-gun=速射闪电链。 +se-thruster-suit=太空中生存所必须的太空服。\n配有喷气推进器和磁力鞋。 +se-thruster-suit-2=太空中生存所必须的太空服。\n拥有更强劲的推进器,增加背包空间和插槽空间。 +se-thruster-suit-3=太空中生存所必须的太空服。\n拥有更强劲的推进器,增加背包空间和插槽空间。 +se-thruster-suit-4=太空中生存所必须的太空服。\n拥有更强劲的推进器,增加背包空间和插槽空间。 +space-science-pack=用于许多现有项目的升级。 +se-rocket-science-pack=用于空间科学实验室的研究。 必须在太空中制造。 +utility-science-pack=用于基础研究所研究使用。 +beacon=配备8个插件槽。 可以将插件的加成效果传送给附近3格范围内的友方机器。 使用多个插件分享塔为一个设施提供加成会使其过载并停止工作。 +se-wide-beacon=配备15个插件槽。 可以将插件的加成效果传送给附近14格范围内的友方机器。 使用多个插件分享塔为一个设施提供加成会使其过载并停止工作。 +se-wide-beacon-2=配备20个插件槽。 可以将插件的加成效果传送给附近14格范围内的友方机器。 使用多个插件分享塔为一个设施提供加成会使其过载并停止工作。 +se-lifesupport-equipment-1=提高生命维持效率+100%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 +se-lifesupport-equipment-2=提高生命维持效率+200%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 +se-lifesupport-equipment-3=提高生命维持效率+400%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 +se-lifesupport-equipment-4=提高生命维持效率+800%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 +se-delivery-cannon=可以将内容物准确发射到指定地点的货运火炮。 +se-delivery-cannon-weapon=可以通过武器投送炮精确投送特种弹药。 +se-arcosphere=从曲虹球研究中获得,通过信息稽器人兑换。 +se-deep-catalogue-1=寂介素和纳米工程。 +se-deep-catalogue-2=超晶格结构,奇点和湮灭。 +se-deep-catalogue-3=微观空间扭曲和超维纳米工程。 +se-deep-catalogue-4=宏观空间扭曲和超维旅行。 +se-arcosphere-collector=从星际虚空中收集曲虹球。 必须从位于小行星区的太空探测火箭井发射。曲虹球随着收集的数量越多越难找到。 +se-star-probe=收集恒星数据并获得[img=item/se-star-probe-data]恒星探测数据。 必须从位于近恒星轨道的太空探测火箭井发射。 +se-belt-probe=收集小行星带数据并获得[img=item/se-belt-probe-data]小行星带探测数据。 必须从位于小行星带的太空探测火箭井发射。 +se-void-probe=收集虚空数据并获得[img=item/se-void-probe-data]星际虚空探测数据。 必须从位于小行星区的太空探测火箭井发射。 +se-interstellar-data=在移动飞船中的枢纽中制造。 在星际空间中用更大的飞船以更快的速度移动可以加快数据的生产。 + +[recipe-name] +core-fragment=星核碎片处理设施(__1__) +rocket-fuel=固态火箭燃料 +se-astrometric-analysis-multispectral-1=多光谱天体测量分析 1 +se-astrometric-analysis-multispectral-2=多光谱天体测量分析 2 +se-astrometric-analysis-multispectral-3=多光谱天体测量分析 3 +se-astronomic-insight-1=天文学研究成果 +se-astronomic-insight-2=通用天文学研究成果 +se-astronomic-insight-3=综合天文学研究成果 +se-astronomic-insight-4=扩展天文学研究成果 +se-biological-insight-1=生物学研究成果 +se-biological-insight-2=通用生物学研究成果 +se-biological-insight-3=综合生物学研究成果 +se-biological-insight-4=扩展生物学研究成果 +se-bio-methane-to-crude-oil=生化转换甲烷至原油 +se-bio-sludge-crude-oil=从实验性生物质提取生化软泥 +se-bio-sludge-decontamination=生化污泥净化 +se-bio-sludge-from-fish=从鱼类提取生化软泥 +se-bio-sludge-from-wood=从木材提取生化软泥 +se-bio-sludge-from-vitamelange=由维生质生成生化软泥 +se-bio-sludge=从生物质提取生化软泥 +se-broken-data-scrapping=报废破损的数据卡 +se-cargo-rocket-section-pack=打包运载火箭区段 +se-cargo-rocket-section-unpack=解包运载火箭区段 +se-condenser-turbine-reclaim-water=水回收发电 +se-core-fragment-omni=星核碎片处理 +se-core-mining=星核采矿 +se-empty-antimatter-canister=提取罐装反物质射流 +se-empty-barrel-scrapping=空桶报废 +se-empty-barrel-reprocessing=空桶回收 +se-space-capsule-scrapping=太空舱报废 +se-cargo-pod-scrapping=货舱报废 +se-energy-insight-1=能量学研究成果 +se-energy-insight-2=通用能量学研究成果 +se-energy-insight-3=综合能量学研究成果 +se-energy-insight-4=扩展能量学研究成果 +se-formatting-1=数据格式化 +se-formatting-2=高效数据格式化 +se-formatting-3=高级数据格式化 +se-formatting-4=深度数据格式化 +se-material-insight-1=材料学研究成果 +se-material-insight-2=通用材料学研究成果 +se-material-insight-3=综合材料学研究成果 +se-material-insight-4=扩展材料学研究成果 +se-matter-fusion-copper=物质合成(铜矿) +se-matter-fusion-dirty=物质合成(废料) +se-matter-fusion-iron=物质合成(铁矿) +se-matter-fusion-stone=物质合成(石矿) +se-matter-fusion-uranium=物质合成(铀矿) +se-matter-fusion-to=物质合成(__1__) +se-orbital-data=轨道计算数据 +se-plasma-canister-empty=清空等离子罐 +se-pulverised-sand=研磨沙 +se-radiating-space-coolant-fast=快速冷却热流体至-10°C(低温) +se-radiating-space-coolant-normal=冷却热流体至-10°C(低温) +se-radiating-space-coolant-slow=高效冷却热流体至-10°C(低温) +se-mixed-methane-gas-separation=混合的甲烷气体分离 +se-rocket-fuel-from-water-copper=电解水制火箭燃料 +se-scrap-decontamination=污料净化 +se-scrap-recycling=废料回收 +se-space-coolant-cold=超冷却热流体至-100°C(低温) +se-space-coolant-supercooled=超冷却热流体至-273°C(超低温) +se-space-coolant-supercooled-cryonite=深低温冷却热流体至-273°C(超低温) +se-space-coolant-cold-cryonite=深低温冷却热流体至-100°C(低温) +se-space-coolant-supercoole-cryonite=深低温冷却热流体至-273°C(超低温) +se-simulation-a=天文学模拟 +se-simulation-ab=有生源说模拟 +se-simulation-abm=变异情况模拟 +se-simulation-am=物质分布模拟 +se-simulation-as=空间粒子模拟 +se-simulation-asb=空间生物学模拟 +se-simulation-asbm=宇宙学模拟 +se-simulation-asm=天体物理学模拟 +se-simulation-b=生物学模拟 +se-simulation-bm=生物力学模拟 +se-simulation-m=材料学模拟 +se-simulation-s=能量学模拟 +se-simulation-sb=生物化学模拟 +se-simulation-sbm=纳米学模拟 +se-simulation-sm=纳米材料模拟 +se-space-water-decontamination=宇宙污水净化 +se-spaceship-rocket-engine-burn=燃烧液体火箭燃料 +se-specimen-fish=微重力鱼类养殖 +se-specimen-wood=微重力木材种植 +se-thermodynamics-coal=高压制煤 +se-used-lifesupport-canister-cleaning=维生罐清洗 +se-used-lifesupport-canister-cleaning-space=维生罐净化 +space-science-pack=优化科研包 +se-rocket-science-pack=火箭科研包 +se-big-turbine-internal=减压高温蒸汽 +se-arcosphere-fracture=曲虹球极化 +se-arcosphere-fold-in=曲虹球反转 +se-arcosphere-fold-out=曲虹球反转 +se-arcosphere-folding=曲虹球折叠:__1__ __2__ 至 __3__ __4__ +se-electric-boiling-void=蒸发排放 +se-space-probe-rocket-deployed=太空探测火箭(已部署) +se-distortion-drive=扭曲驱动 +se-generic-scrapping=__1__报废 +se-generic-recycling=__1__回收 + +[recipe-description] +se-astronomic-insight-2=更复杂,但更高效。 +se-astronomic-insight-3=更复杂,但更高效。 +se-astronomic-insight-4=更复杂,但更高效。 +se-biological-insight-2=更复杂,但更高效。 +se-biological-insight-3=更复杂,但更高效。 +se-biological-insight-4=更复杂,但更高效。 +se-core-mining=获得的碎片类型取决于所在行星。 操作时间取决于所在行星或卫星上星核钻机的总数。 +se-energy-insight-2=更复杂,但更高效。 +se-energy-insight-3=更复杂,但更高效。 +se-energy-insight-4=更复杂,但更高效。 +se-material-insight-2=更复杂,但更高效。 +se-material-insight-3=更复杂,但更高效。 +se-material-insight-4=更复杂,但更高效。 +se-radiating-space-coolant-normal=热流体的反复冷却和加热会导致降解。 +se-radiating-space-coolant-slow=热流体的反复冷却和加热会导致降解,较慢的冷却速度可以减少损失。 +se-radiating-space-coolant-fast=热流体的反复冷却和加热会导致降解,较快的冷却速度会增加损失。 +se-delivery-cannon-weapon-pack-se-iridium-piledriver=在小范围内造成巨大物理伤害,并形成冲击波造成爆炸伤害。 +se-arcosphere-fracture=曲虹球可通过[img=item/se-arcosphere-collector]曲虹球收集器来收集。 +se-distortion-drive=激活枢纽的扭曲驱动来赢得游戏。临界速度下能耗8GW。 + +[technology-name] +effectivity-module-4=节能插件 4 +effectivity-module-5=节能插件 5 +effectivity-module-6=节能插件 6 +effectivity-module-7=节能插件 7 +effectivity-module-8=节能插件 8 +effectivity-module-9=节能插件 9 +energy-shield-equipment=能量盾 +energy-shield-mk2-equipment=能量盾 MK2 +energy-shield-mk3-equipment=能量盾 MK3 +energy-shield-mk4-equipment=能量盾 MK4 +energy-shield-mk5-equipment=能量盾 MK5 +energy-shield-mk6-equipment=能量盾 MK6 +sand-processing=沙处理 +glass-processing=玻璃处理 +liquid-rocket-fuel=液体火箭燃料 +productivity-module-4=产能插件 4 +productivity-module-5=产能插件 6 +productivity-module-6=产能插件 6 +productivity-module-7=产能插件 7 +productivity-module-8=产能插件 8 +productivity-module-9=产能插件 9 +rocket-silo=卫星火箭发射井 +rocketry=军用火箭学 +se-adaptive-armour=适应性装甲 +se-antimatter-engine=反物质引擎 +se-antimatter-reactor=反物质反应堆 +se-antimatter-production=反物质生产 +se-astronomic-science-pack=天文学研究包 +se-biological-science-pack=生物学研究包 +se-condenser-turbine=冷凝涡轮技术 +se-core-miner=星核采集技术 +se-biogun=生化枪 +se-cryogun=冷冻枪 +se-deep-space-science-pack=深空科学研究包 +se-deep-catalogue=深空目录 +se-dimensional-anchor=次元锚 +se-electric-boiler=电锅炉 +se-energy-science-pack=能量学研究包 +se-fluid-burner-generator=燃油发电技术 +se-fuel-refining=燃料精炼技术 +se-heat-shielding=隔热技术 +se-long-range-star-mapping=长距离星图绘制 +se-material-science-pack=材料学研究包 +se-medpack=医疗包 +se-medpack-2=医疗包 2 +se-medpack-3=医疗包 3 +se-medpack-4=医疗包 4 +se-meteor-defence=广域陨石防御系统 +se-meteor-point-defence=陨石点防御系统 +se-nanomaterial=纳米材料 +se-plague=生物武器 +se-processing-beryllium=铍处理 +se-processing-cryonite=冰晶石处理 +se-processing-holmium=钬处理 +se-processing-iridium=铱处理 +se-processing-naquium=寂介素处理 +se-processing-vitamelange=维生质处理 +se-processing-vulcanite=火成岩处理 +se-pulveriser=粉碎机 +se-railgun=磁轨武器 +se-rocket-cargo-safety=运载火箭安全性 +se-rocket-fuel-from-water=电解水制燃料技术 +se-rocket-launch-pad=运载火箭发射井 +se-rocket-landing-pad=火箭着陆台 +se-rocket-reusability=可重复使用火箭 +se-rocket-survivability=火箭生存能力 +se-rtg-equipment=便携式 RTG MK1 +se-rtg-equipment-2=便携式 RTG MK2 +se-space-assembling=空间组装技术 +se-space-accumulator=钬电池技术 +se-space-accumulator-2=寂介素电池技术 +se-space-astrometrics-laboratory=天体测量设施 +se-space-biochemical-laboratory=生物化学设施 +se-space-catalogue-astronomic=天文学目录 +se-space-catalogue-biological=生物学目录 +se-space-catalogue-universal=宇宙学目录 +se-space-catalogue-energy=能量学目录 +se-space-catalogue-material=材料学目录 +se-space-data-card=数据卡 +se-space-decontamination-facility=净化设施 +se-space-electromagnetics-laboratory=电磁学设施 +se-space-genetics-laboratory=遗传学设施 +se-space-gravimetrics-laboratory=重力学设施 +se-space-growth-facility=培养设施 +se-space-hypercooling=超级冷却技术 +se-space-laser-laboratory=激光设施 +se-lifesupport-facility=维生设施 +se-space-manufactory=太空制造技术 +se-space-material-fabricator=物质合成技术 +se-space-matter-fusion=物质聚变 +se-space-mechanical-laboratory=空间机械加工设施 +se-space-particle-accelerator=粒子加速器 +se-space-particle-collider=粒子对撞器 +se-space-plasma-generator=等离子生成 +se-space-platform-plating=镀层轨道平台 +se-space-platform-scaffold=轨道平台框架 +se-space-radiation-laboratory=辐射设施 +se-space-radiating-efficiency=散热效率 +se-space-radiating-speed=散热速度 +se-space-radiator=散热器 +se-space-radiator-2=散热器 2 +se-space-rail=太空铁路 +se-recycling-facility=回收设施 +se-space-science-lab=空间科学研究 +se-space-simulation-ab=有生源说模拟 +se-space-simulation-am=空间材料模拟 +se-space-simulation-as=空间粒子模拟 +se-space-simulation-bm=生物力学模拟 +se-space-simulation-sb=生物化学模拟 +se-space-simulation-sm=纳米材料模拟 +se-space-simulation-abm=变异情况模拟 +se-space-simulation-asb=空间生物学模拟 +se-space-simulation-asm=天体物理学模拟 +se-space-simulation-sbm=纳米模拟 +se-space-simulation-asbm=宇宙学模拟 +se-space-solar-panel=平板太阳能板 +se-space-spectrometry-facility=光谱测定设施 +se-space-supercomputer=超级计算机 +se-space-telescope=望远镜 +se-space-telescope-gammaray=伽马射线望远镜 +se-space-telescope-xray=X射线望远镜 +se-space-telescope-microwave=微波望远镜 +se-space-telescope-radio=射电望远镜 +se-space-thermodynamics-laboratory=热力学设施 +se-spaceship=飞船 +se-spaceship-integrity=飞船结构强度 +se-factory-spaceship=工厂飞船 +se-superconductive-cable=超导技术 +se-teleportation=传送技术 +se-tesla-gun=特斯拉武器 +se-thruster-suit=推进太空服 +space-science-pack=天文学研究包 +se-rocket-science-pack=火箭科研包 +speed-module-4=速度插件 4 +speed-module-5=速度插件 5 +speed-module-6=速度插件 6 +speed-module-7=速度插件 7 +speed-module-8=速度插件 8 +speed-module-9=速度插件 9 +se-aeroframe-pole=航空框架杆 +se-aeroframe-scaffold=航空框架支架 +se-aeroframe-bulkhead=航空框架隔板 +se-lattice-pressure-vessel=晶格压力容器 +se-heavy-girder=重型梁 +se-heavy-bearing=重型轴承 +se-heavy-composite=重型复合材料 +se-heavy-assembly=重型组装 +se-bioscrubber=生物洗涤器 +se-vitalic-epoxy=维生质环氧树脂 +se-vitalic-reagent=维生质 +se-vitalic-acid=维生质酸 +se-self-sealing-gel=自封凝胶 +se-holmium-cable=钬电缆 +se-holmium-solenoid=钬螺线管 +se-quantum-processor=量子处理器 +se-dynamic-emitter=动态发射器 +se-naquium-processor=寂介素处理器 +se-naquium-cube=寂介素立方体 +se-naquium-tessaract=寂介素超正方体 +se-wide-beacon=广域信标 +se-wide-beacon-2=广域信标2 +se-lifesupport-equipment=维生装备 +se-lifesupport-equipment-1=维生装备 MK1 +se-lifesupport-equipment-2=维生装备 MK2 +se-lifesupport-equipment-3=维生装备 MK3 +se-lifesupport-equipment-4=维生装备 MK4 +se-supercharger=超充能器 +se-addon-power-pole=附加式电线杆 +se-pylon=输电塔 +se-pylon-substation=广域配电式输电塔 +se-pylon-construction=建设网络式输电塔 +se-pylon-construction-radar=建设网络式雷达输电塔 +se-shield-projector=护盾投射器 +se-deep-space-transport-belt=深空传送带 +se-big-turbine=高温涡轮发电机 +se-big-heat-exchanger=高温换热器 +se-zone-discovery-random=星区探测 +se-zone-discovery-targeted=星区定向探测 +se-zone-discovery-deep=深空探测 +se-delivery-cannon=货运火炮 +se-delivery-cannon-capsule-iridium=铱制货运火炮货舱 +se-delivery-cannon-weapon=武器投送火炮 +se-spaceship-clamps=飞船对接夹钳 +se-bio-upgrade-constitution=生化升级:体质 +se-bio-upgrade-strength=生化升级:力量 +se-bio-upgrade-agility=生化升级:敏捷 +se-bio-upgrade-dexterity=生化升级:灵巧 +se-bio-upgrade-intelligence=生化升级:智力 +se-energy-beaming=能量束 +se-energy-beam-defence=保护伞:能量束防御设施 +se-nexus=枢纽 +se-spaceship-victory=飞船胜利 +se-arcosphere=曲虹球收集 +se-arcosphere-folding=曲虹球折叠 +se-space-probe=太空探测火箭发射井 +se-linked-container=曲连存储 +k2-conversion=__1__转换 + +[technology-description] +energy-shield-equipment=护盾发生器,充能快速但会消耗很多能量。 +energy-shield-mk2-equipment=护盾发生器,充能快速但会消耗很多能量。 +energy-shield-mk3-equipment=护盾发生器,充能快速但会消耗很多能量。 +energy-shield-mk4-equipment=护盾发生器,充能快速但会消耗很多能量。 +energy-shield-mk5-equipment=护盾发生器,充能快速但会消耗很多能量。 +energy-shield-mk6-equipment=护盾发生器,充能快速但会消耗很多能量。 +sand-processing=将原料粉碎、研磨并过滤,得到干净的沙子。 +glass-processing=将沙子熔化制成玻璃。 +rocket-silo=允许向轨道上发射卫星以发展太空技术和发现新星球。 +se-adaptive-armour=可以使用能量进行自我修复的装甲。 定位与能量盾相同,但消耗更少的资源,护盾值回复速度也更缓慢。 +se-antimatter-engine=通过湮灭反物质产生难以置信的推力。 +se-antimatter-reactor=通过湮灭反物质产生难以置信的高温。 +se-antimatter-production=制造反物质,能量密度最高的存储形式。 +se-astronomic-science-pack=允许研究太空旅行和星际物流的相关科技。 +se-biological-science-pack=允许研究生物武器、神经处理和提高身体机能的相关科技。 +se-condenser-turbine=只有蒸汽涡轮机机75%的效率,但是99%的蒸汽冷凝为水返还。 温度区间:100至999。\n最大输出:10MW。 +se-core-miner=允许从行星和卫星中无限地提取资源,但如果在同个星体使用多个则会收益递减。 +se-biogun=一种可以发射多种生化弹药的武器。 +se-cryogun=制造一堵能冻结敌人的冰墙。 +se-deep-catalogue=空间扭曲、奇异物质和纳米工程数据结构化,可供分析和计算机模拟。最先进技术所需。 +se-deep-space-science-pack=是大多数高级技术需要的前置科技。 +se-dimensional-anchor=利用恒星的引力井作为空间异常的稳定点。 +se-electric-boiler=使用电力将水加热成蒸汽。能效 90%。 +se-energy-science-pack=允许研究基本力和亚原子相关的科技。 +se-fluid-burner-generator=需要具备热值的液体燃料(如液体火箭燃料)来发电。 简单、紧凑,但缺乏大型蒸汽系统的能源效率。 为太空设计。 实际液体消耗量取决于液体燃料热值。 +se-fuel-refining=精炼更高级的燃料。 +se-heat-shielding=用于抵抗高温和真空环境的复合板。 +se-long-range-star-mapping=一些距离遥远的星系可以通过不寻常恒星的特定模式来识别。 结果记录在[img=virtual-signal/informatron]信息稽器人[__CONTROL__informatron__]。 +se-material-science-pack=允许研究用于高级机械工程所需的高级材料的相关科技。 +se-medpack=使用医疗包来治疗自己。 +se-medpack-2=使用医疗包来治疗自己。 +se-medpack-3=使用医疗包来治疗自己。 +se-medpack-4=使用医疗包来治疗自己。 +se-meteor-defence=在陨石击中您的设施前将其在空中击毁。 陨石防御系统,可以覆盖整个星球,但同一时间只可攻击1个目标。 +se-meteor-point-defence=在陨石击中您的设施前将其在空中击毁。 陨石点防御系统,可以覆盖一个较小的区域,同一时间可攻击最多4个目标。 +se-nanomaterial=在纳米尺度上组织的不同材料的复杂排列,使复合材料具有优越的性能。 +se-railgun=电磁加速的弹头被加速到极高的速度,以至于在被气化前留下了一道等离子体的弹道。 高伤害,射速低。 +se-plague=引发一场足以消灭整个星球上所有生命形式的瘟疫,使用时请格外小心。 +se-processing-beryllium=将绿柱石转变为铍,铍是一种极轻、坚固、耐腐蚀和耐辐射的金属。 它也几乎不受 X 射线的影响。 +se-processing-cryonite=将冷冻的冰晶石晶体加工成冰晶石棒,可应用于冷冻、冷却和润滑。 冰晶石主要存在于冰冻行星上。 +se-processing-holmium=将钬矿提纯为钬,一种具有最高磁导率的稀土金属。 +se-processing-iridium=将伊矿精炼成铱,铱是在高温下最耐腐蚀的金属和密度最大的元素。 在重工业中有重要作用。 +se-processing-naquium=将神秘的深空寂介素水晶转变成寂介素,寂介素是一种具有不同寻常的时空相互作用的金属状物质。 +se-processing-vitamelange=将原始的维生质海绵状岩转化为有价值的营养萃取物。 +se-processing-vulcanite=将火山中的火成岩晶体精炼成粉末,用于高级熔炼、火箭燃料和其他高温化学过程。 火成岩存在于火山行星和大多数星核碎片中。 +se-pulveriser=粉碎和研磨较硬的矿物和行星核心碎片。 +se-rocket-cargo-safety=运载火箭发射过程中损坏的几率减少10%(乘法叠加)。 +se-rocket-fuel-from-water=通过电解水制备氢氧火箭燃料。 +se-rocket-landing-pad=允许您向指定的着陆点发射运载火箭。 进阶研究可以回收火箭组件。 +se-rocket-launch-pad=允许您向其他星球发射运载火箭。 +se-rocket-reusability=从成功着陆的火箭中回收组件的几率增加4%(基础成功率20%,上限100%)。 +se-rocket-survivability=火箭发射过程中的损毁几率以及因导航错误导致偏离着陆点的几率降低10% (乘法叠加)。 +se-rtg-equipment=放射性同位素热电式发电机。 一个可以将放射性物质衰变时产生的热量转化为电力的便携式装置。 可以持续运行数十年,期间无需添加燃料。 +se-rtg-equipment-2=放射性同位素热电式发电机。 一个可以将放射性物质衰变时产生的热量转化为电力的进阶型便携装置。 可以持续运行数十年,期间无需添加燃料。 +se-space-assembling=一台特制的组装机,可以在太空中工作。 +se-space-astrometrics-laboratory=组合、比较和量化来自不同天体的信息。 +se-space-biochemical-laboratory=一所重点研究生物化学的实验室。 也可以用来进行基本的化学反应和原油处理。 +se-space-catalogue-astronomic=结构化的天文学数据,用于分析或计算机模拟。 是进阶天文学研究的必需品。 +se-space-catalogue-biological=结构化的生物学数据,用于分析或计算机模拟。 是进阶生物学研究的必需品。 +se-space-catalogue-universal=将数据分析与计算机模拟相结合。 是进阶深空研究所必须的。 +se-space-catalogue-energy=结构化的能量学数据,用于分析或计算机模拟。 是进阶能量学研究的必需品。 +se-space-catalogue-material=结构化的材料学数据,用于分析或计算机模拟。 是进阶材料学研究的必需品。 +se-space-data-card=一个多用途的数据存储设备,是高级数据研究的必需品。 +se-space-decontamination-facility=净化需要在无菌环境中使用的物质,并制备需要在低压条件下使用的液体。 +se-space-electromagnetics-laboratory=用于强磁场和极高电压环境下使用的设备。 +se-space-genetics-laboratory=一所用于基因测序、基因修饰和基因印刷的实验室。 +se-space-gravimetrics-laboratory=分析并模拟重力扰动。 +se-space-growth-facility=在一些常规环境下无法实现的条件下培养生物,如微重力环境。 +se-space-hypercooling=使用热流体进行热交换,使一端更热,另一端更冷。 +se-space-laser-laboratory=激光实验场所,必须佩戴护目镜。 +se-lifesupport-facility=在更加恶劣的环境中支持生命。 +se-space-manufactory=实现太空中大规模生产的关键技术。 +se-space-material-fabricator=用来合成新材料,是粒子对撞机和3D打印机的完美融合。 +se-space-matter-fusion=通过聚变生产物质。 +se-space-mechanical-laboratory=提供一系列的机械加工工序:破碎,撕裂,剪切,振动等。 +se-space-particle-accelerator=将粒子加速到接近光速。 +se-space-particle-collider=使高速粒子相互撞击并分析结果。 +se-space-plasma-generator=产生各种等离子体。 +se-space-platform-plating=耐用的镀层轨道平台,使太空行走更加顺畅而快速。 +se-space-platform-scaffold=基础的轨道平台框架,可以在上面建造设施,但不太适合太空行走。 +se-space-radiation-laboratory=提供一个相对安全的环境来处理放射性物质,可以用来处理铀。 +se-space-radiator=从过热的热流体中辐射出多余的热量。 +se-space-radiator-2=从过热的热流体中辐射出多余的热量。 +se-space-radiating=缓慢但更具资源利用率的方式冷却高温热流体。 +se-space-rail=安全的太空铁路,因为他们可以防止火车从轨道上飞出并毁掉一切。 因其美观性,也可以在地面使用。 +se-recycling-facility=报废物品并将废料加工成原材料。 +se-space-science-lab=允许处理太空科研包和进行更高级的太空研究。 +se-space-simulation-ab=通过结合多个学科进行更有效的模拟。 +se-space-simulation-am=通过结合多个学科进行更有效的模拟。 +se-space-simulation-as=通过结合多个学科进行更有效的模拟。 +se-space-simulation-bm=通过结合多个学科进行更有效的模拟。 +se-space-simulation-sb=通过结合多个学科进行更有效的模拟。 +se-space-simulation-sm=通过结合多个学科进行更有效的模拟。 +se-space-simulation-abm=通过结合多个学科进行更有效的模拟。 +se-space-simulation-asb=通过结合多个学科进行更有效的模拟。 +se-space-simulation-asm=通过结合多个学科进行更有效的模拟。 +se-space-simulation-sbm=通过结合多个学科进行更有效的模拟。 +se-space-simulation-asbm=通过结合多个学科进行更有效的模拟。 +se-space-solar-panel=一种高效的太阳能板,您可以在上面行走。 +se-space-spectrometry-facility=分光光度法,气相色谱法,质谱法和其他光谱学。 向墙上发射物质,使其弯曲,看它击中哪里。 +se-space-supercomputer=允许更高级的数据操作和处理以及模拟。 +se-space-telescope=精密的望远镜,对可见光谱范围内的多个波长敏感。 +se-space-telescope-gammaray=伽马射线不会折射。 这个强大的望远镜使用镜子和特殊的传感器进行观测。 +se-space-telescope-xray=X 射线会被大气层所阻挡。 这个强大的望远镜转为真空环境设计,在这里不再有大气层问题。 +se-space-telescope-microwave=一台巨大的望远镜,可以探测微波和宇宙微波背景。 +se-space-telescope-radio=一台巨大的望远镜,可以探测从非常遥远距离发射的微弱的无线电波。 +se-space-thermodynamics-laboratory=进行涉及极端温度的加工处理。 也可以执行基本的热处理,例如冶炼。 +se-spaceship=使用地板和舱壁一点一点的拼凑起一艘宇宙飞船, 然后使用控制台驾驶她在星海中遨游。 +se-spaceship-integrity=每个级别将飞船结构完整性应力极限提高100。 +se-factory-spaceship=每个级别将飞船结构完整性应力极限提高500。 +se-superconductive-cable=一根无需主动散热装置的超导电缆。 +se-teleportation=解锁其他的传送技术。事实证明,安全的弯曲时空是十分困难的。 +se-tesla-gun=高速闪电链发射器。可以同时击中最多30个敌人。 可在不同的目标之间长距离跳跃,如果没有目标,则沿着地面短距离跳跃。 +se-thruster-suit=配有喷气推进器和磁力鞋的太空服。 进入太空前一定要穿上它。 +se-thruster-suit-2=高级的太空服,拥有更强劲的推进器,增加背包空间和插槽空间。 +se-thruster-suit-3=先进的太空服,拥有更强劲的推进器,增加背包空间和插槽空间。 +se-thruster-suit-4=尖端的太空服,拥有更强劲的推进器,增加背包空间和插槽空间。 +space-science-pack=允许更直接的生产太空科研包,并从这些技术中受益。 +se-aeroframe-pole=一种坚固且轻质的铍梁,通常用作航空和太空探索的支撑梁。 +se-aeroframe-scaffold=一种坚固且轻质的铍结构框架,通常用作航空和太空探索飞船的主要内部骨架。 +se-aeroframe-bulkhead=一种坚固且轻质的气密性铍隔板,用作航空和太空探索飞船的外部蒙皮或次要隔室壁。 +se-lattice-pressure-vessel=一种坚固且轻质的铍压力容器,带有内部晶格,可以将某些流体压缩超过其正常极限。 即使破裂加压流体也能够安全排出。 +se-heavy-girder=一种重型铱结构梁,主要用于重工业和重型军用船体。 +se-heavy-bearing=一种大尺寸重型铱合金轴承,可以承受足以压碎其他材料的力并保持正常工作。 +se-heavy-composite=一种几乎无法穿透的厚舱壁,几乎不受高温、腐蚀、辐射和机械力的影响,缺点是非常沉重。 +se-heavy-assembly=一种由重型机械齿轮和可配置部件组装而成的重型机械组件。 +se-bioscrubber=一种利用生物过程分解废弃物的材料处理室。 +se-vitalic-epoxy=一种具有难以置信的高强度的生物来源环氧树脂,有再生能力特性。 +se-vitalic-reagent=一种用于多种化学反应的高效多功能试剂。 +se-vitalic-acid=多种酸的混合物。 +se-self-sealing-gel=一种在压力下呈粘稠的凝胶,但在真空下呈固态。 通常用作舱壁的内部薄膜,以被动密封孔洞。 +se-holmium-cable=一种专门设计用于消除干扰敏感电子设备的线路中无用噪声的护套电缆。 +se-holmium-solenoid=一种非常强大的电磁铁。 +se-quantum-processor=利用重叠和纠缠来更有效地处理高复杂性问题。 +se-dynamic-emitter=一种可快速调节的光或粒子发射系统,它可以改变许多特性以获得更大的范围或扫描模式或材料穿透特性。 +se-naquium-cube=利用寂介素与时空不同寻常的相互作用,将一个大体积的物体折叠成一个小立方体。 +se-naquium-tessaract=一种奇特的物体,静止时它呈现一个立方体状的形状,一旦被转动或加速就会变成一系列其他的几何形状。 +se-naquium-processor=使用寂介素超正方体进行计算可以绕过一些通常的计算密度限制。 +effect-transmission=插件分享塔可以将插件的加成效果传送给附近3格范围内的友方机器。 使用多个插件分享塔为一个设施提供加成会使其过载并停止工作。 +se-wide-beacon=广域插件分享塔可以将插件的加成效果传送给附近14格范围内的友方机器。 使用多个插件分享塔为一个设施提供加成会使其过载并停止工作。 +se-wide-beacon-2=广域插件分享塔2可以将插件的加成效果传送给附近14格范围内的友方机器。 使用多个插件分享塔为一个设施提供加成会使其过载并停止工作。 +se-lifesupport-equipment-1=提高生命维持效率+100%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 +se-lifesupport-equipment-2=提高生命维持效率+200%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 +se-lifesupport-equipment-3=提高生命维持效率+800%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 +se-lifesupport-equipment-4=提高生命维持效率+1600%(加法叠加)。 如果安装在非宇航服中,效率加成会降低一半且无法在太空生效。 +se-supercharger=可以同时为64个机器人高速充电。 建筑最大功率1GW。 +se-pylon=传输电力。 连接范围64格。 +se-pylon-substation=传输电力。 连接范围64格,输电范围64x64。 +se-pylon-construction=传输电力并能够扩展机器人建筑区。 连接范围64格,建筑区范围64x64。 +se-pylon-construction-radar=传输电力并能够扩展机器人建筑区,还能够提供雷达功能。 连接范围64格,建筑区/视野范围256x256。 +se-shield-projector=创造一个保护力场。 当护盾投射器充能或防护罩承受伤害时,需要更多的能量。 如果安装了“Walls Block Spitters”Mod,可以阻挡喷吐虫攻击。 +se-deep-space-transport-belt=可以放置在太空中的快速长距离运输带。不同的颜色可以提高远处的辨识度。 +se-big-turbine=一种大型发电机,装机容量1GW。从一侧输入5000°C的蒸汽,从另一侧排出500°C的蒸汽,从侧面排出水。能效99%,水回收率99%。 +se-big-heat-exchanger=一种高温大容量的大型换热器。 +se-addon-power-pole=一种被设计用来精确控制输电范围的附加式小型电线杆。 +se-zone-discovery-random=使用望远镜搜寻行星、卫星和小行星带。 +se-zone-discovery-targeted=在行星、卫星和小行星带中搜寻特定的资源。 在[img=virtual-signal/informatron]信息稽器人>星区探索页面指定资源类型。 +se-zone-discovery-deep=寻找星际深处的有趣区域。 小行星区可能包含许多独特而宝贵的资源。 +se-delivery-cannon=一种轨道炮,能够将资源射入轨道或更远的地方,还提供一个装甲箱子来接收它们。 +se-delivery-cannon-capsule-iridium=尽管铱是一种重金属,但其高耐用性意味着与标准货舱相比可以使用更少的材料。 整体重量是一样的,但制造起来更简单。 +se-delivery-cannon-weapon=能够向其他表面发射原子弹等特殊弹药的大型轨道炮。 +se-spaceship-clamps=允许您放置飞船夹钳,以便太空飞船可以通过相匹配的夹钳停泊到特定的位置。 自动驾驶功能需要在飞船控制台输入“使用…停泊”和“停泊到…”两种信号。 +se-bio-upgrade-constitution=提高最大生命值。 +se-bio-upgrade-strength=提高背包容量。 +se-bio-upgrade-agility=提高移动速度 +se-bio-upgrade-dexterity=提高手搓速度。 +se-bio-upgrade-intelligence=提高从每个科研包获得的研究进度。 +se-energy-beaming=高能能量束,可以作为天基武器,也可以向需要的地方传输能量。 +se-energy-beam-defence=防御天基能量束和日冕物质喷射。 工作原理是将磁粒子悬浮到一个保护性的气泡中,然后根据需要重新排列和聚集粒子,以扩散敌对的能量束。 +se-nexus=可以放置在星际空间中移动的飞船上激活的装置,生产数据,并通过额外的技术激活空间扭曲场(飞船胜利)。 +se-spaceship-victory=允许枢纽启动扭曲驱动器以逃离本地恒星群。 让枢纽以扭曲驱动器模式运行在3000+完整性的飞船上,以250的速度在星际空间中移动60秒,即可赢得游戏。 +se-arcosphere=允许收集星际虚空中丢失的曲虹球。 +se-arcosphere-folding=允许将曲虹球用作超维钳子。 +se-space-probe=用于发射太空探测器的太空火箭发射井。 也可用于廉价发射卫星。 +se-linked-container=由高维空间与其他容器相连的容器。 容器的连接取决于它首次放置的表面。 + +[modifier-description] +tesla-shooting-speed-bonus=特斯拉枪射击速度加成 +tesla-damage-bonus=特斯拉枪伤害加成 +railgun-damage-bonus=轨道枪伤害加成 +railgun-shooting-speed-bonus=轨道枪射击速度 +cryogun-shooting-speed-bonus=冷冻枪射击速度 +cryogun-damage-bonus=冷冻枪伤害加成 +character-running-speed=角色移动速度加成:+__1__ +character-crafting-speed=角色手搓速度加成:+__1__ + +[virtual-signal-name] +signal-speed=速度信号 +se-signal-speed=速度信号 +signal-distance=距离信号 +se-signal-distance=距离信号 +se-star=恒星 +se-planet=行星 +se-planet-orbit=行星轨道 +se-moon=卫星 +se-moon-orbit=卫星轨道 +se-asteroid-belt=小行星带 +se-asteroid-field=小行星区 +se-anomaly=异常 +se-meteor=小行星 +se-spaceship=飞船 +se-cargo-rocket=运载火箭 +se-remote-view=远程视角 +se-death=死亡 +se-character-corpse=尸体 +se-ruin=废墟 +se-accolade=桂冠 +se-remove=移除 +se-radius=半径 +se-hierarchy=层次结构 +se-spaceship-launch=飞船启动 +se-anchor-using-left-clamp=使用飞船左侧夹钳停泊 +se-anchor-using-right-clamp=使用飞船右侧夹钳停泊 +se-anchor-to-left-clamp=停泊到左侧夹钳 +se-anchor-to-right-clamp=停泊到右侧夹钳 +se-beacon-overload=插件分享塔过载 +se-heat=热源 +se-pin=大头针 + +[controls] +se-remote-view=导航卫星视角 +se-remote-view-pins=导航卫星大头针 +se-remote-view-next=导航历史下一个 +se-remote-view-previous=导航历史上一个 +se-universe-explorer=宇宙浏览器 +se-respawn=复活 +se-mode-toggle=切换结构操作模式 +se-pin-one=前往大头针1 +se-pin-two=前往大头针2 +se-pin-three=前往大头针3 +se-pin-four=前往大头针4 +se-pin-five=前往大头针5 +se-pin-six=前往大头针6 +se-pin-seven=前往大头针7 +se-pin-eight=前往大头针8 +se-pin-nine=前往大头针9 +se-pin-zero=前往大头针0 +se-pin-set-one=设置大头针1 +se-pin-set-two=设置大头针2 +se-pin-set-three=设置大头针3 +se-pin-set-four=设置大头针4 +se-pin-set-five=设置大头针5 +se-pin-set-six=设置大头针6 +se-pin-set-seven=设置大头针7 +se-pin-set-eight=设置大头针8 +se-pin-set-nine=设置大头针9 +se-pin-set-zero=设置大头针0 + +[shortcut] +se-remote-view=导航卫星视角 +se-remote-view-pins=导航卫星大头针 +se-universe-explorer=宇宙浏览器 +se-respawn=复活 +se-pin-one=1 +se-pin-two=前往大头针2 +se-pin-three=前往大头针3 +se-pin-four=前往大头针4 +se-pin-five=前往大头针5 +se-pin-six=前往大头针6 +se-pin-seven=前往大头针7 +se-pin-eight=前往大头针8 +se-pin-nine=前往大头针9 +se-pin-zero=前往大头针0 +se-pin-set-one=设置大头针1 +se-pin-set-two=设置大头针2 +se-pin-set-three=设置大头针3 +se-pin-set-four=设置大头针4 +se-pin-set-five=设置大头针5 +se-pin-set-six=设置大头针6 +se-pin-set-seven=设置大头针7 +se-pin-set-eight=设置大头针8 +se-pin-set-nine=设置大头针9 +se-pin-set-zero=设置大头针0 + +[shortcut-name] +se-remote-view=导航卫星视角 [__CONTROL__se-remote-view__] +se-remote-view-pins=导航卫星大头针[__CONTROL__se-remote-view-pins__] +se-universe-explorer=宇宙浏览器 [__CONTROL__se-remote-view__] +se-respawn=复活 [__CONTROL__se-respawn__] +se-pin-one=前往大头针1 [__CONTROL__se-pin-one__] +se-pin-two=前往大头针2 [__CONTROL__se-pin-two__] +se-pin-three=前往大头针3 [__CONTROL__se-pin-three__] +se-pin-four=前往大头针4 [__CONTROL__se-pin-four__] +se-pin-five=前往大头针5 [__CONTROL__se-pin-five__] +se-pin-six=前往大头针6 [__CONTROL__se-pin-six__] +se-pin-seven=前往大头针7 [__CONTROL__se-pin-seven__] +se-pin-eight=前往大头针8 [__CONTROL__se-pin-eight__] +se-pin-nine=前往大头针9 [__CONTROL__se-pin-nine__] +se-pin-zero=前往大头针0 [__CONTROL__se-pin-zero__] +se-pin-set-one=设置大头针1 [__CONTROL__se-pin-set-one__] +se-pin-set-two=设置大头针2 [__CONTROL__se-pin-set-two__] +se-pin-set-three=设置大头针3 [__CONTROL__se-pin-set-three__] +se-pin-set-four=设置大头针4 [__CONTROL__se-pin-set-four__] +se-pin-set-five=设置大头针5 [__CONTROL__se-pin-set-five__] +se-pin-set-six=设置大头针6 [__CONTROL__se-pin-set-six__] +se-pin-set-seven=设置大头针7 [__CONTROL__se-pin-set-seven__] +se-pin-set-eight=设置大头针8 [__CONTROL__se-pin-set-eight__] +se-pin-set-nine=设置大头针9 [__CONTROL__se-pin-set-nine__] +se-pin-set-zero=设置大头针0 [__CONTROL__se-pin-set-zero__] + +[tile-name] +se-space-platform-plating=镀层轨道平台 +se-space-platform-scaffold=轨道平台框架 +se-space-platform-underlay=太空 +se-space-platform-underlay-l=太空 +se-space-platform-underlay-r=太空 +se-space=真空 +se-regolith=表岩 +se-asteroid=小行星 +se-spaceship-floor=飞船地板 + +[mod-setting-name] +se-meteor-interval=陨石间隔 +se-plague-max-runtime=瘟疫最大持续时间 +se-planets=星球数量 +se-planet-size=星球尺寸(1%至10000%) +se-seed=星球生成种子 +se-skip-experimental-warning=跳过实验警告 +se-print-meteor-info=在控制台显示陨石撞击警报 +se-print-satellite-discovered-nothing=卫星无新发现时警报 +se-space-pipe-capacity=太空管道容量 +se-electric-boiler=电锅炉 +se-deep-space-belt-speed=深空传送带速度 +se-deep-space-belt-black=黑色深空传送带 +se-deep-space-belt-white=白色深空传送带 +se-deep-space-belt-red=红色深空传送带 +se-deep-space-belt-yellow=黄色深空传送带 +se-deep-space-belt-green=绿色深空传送带 +se-deep-space-belt-cyan=青色深空传送带 +se-deep-space-belt-blue=蓝色深空传送带 +se-deep-space-belt-magenta=品红深空传送带 +se-space-science-pack=太空科研包备用方案 +se-never-show-lifesupport=不再显示维生系统GUI +se-show-zone-preview=显示区域预览窗口 +se-pylon-charge-points=建设区输电塔充电点 +se-cmes-max-frequency=日冕物质喷射最大间隔 +se-spawn-small-resources=额外的初始资源区 +se-show-overhead-button-satellite-mode=显示导航卫星按钮 +se-show-overhead-button-interstellar-map=显示星际地图按钮 +se-show-overhead-button-universe-explorer=显示宇宙浏览器按钮 +se-show-pin-help-tooltip=在大头针按钮上显示帮助提示 +se-scan-search-budget=扫描搜索预算 +se-scan-chart-budget=扫描图预算 +se-scan-alert-interval=扫描警告间隔 +se-supercharger-individual-charge-rate=超充能器单个端口充电率(MW) + +[mod-setting-description] +se-meteor-interval=陨石撞击的基本间隔,单位:分钟。 陨石撞击发生后,下一次陨石来袭的时间为1分钟到此处设定值之间的随机值。 +se-plague-max-runtime=生化武器的最大持续时间(分钟)。 在瘟疫持续这么长时间之后,所有的瘟疫粒子、树木和敌人都会被消灭。 +se-planets=请勿在游戏中途修改。 +se-planet-size=请勿在游戏中途修改。 +se-seed=请勿在游戏中途修改。 +se-skip-experimental-warning=游戏开始时的提示信息将不再显示,今后您也不再会收到新的开局信息。 +se-print-meteor-info=按__CONTROL__toggle-console__可以查看消失的陨石撞击预警。 +se-print-satellite-discovered-nothing=当卫星发射时,您会收到一个警报,告诉您发现了什么。 如果没有发现任何东西,此设置将禁用警报。 +se-space-pipe-capacity=太空管道的流体容量。 +se-electric-boiler=为游戏增加电锅炉。 +se-deep-space-belt-speed=深空传送带应该是最快的传送带。 如果你有其他的修改,增加了更快的传送带,你可以增加深空带子的速度来匹配或超越。 +se-deep-space-belt-black=关闭黑色深空传送带、分流器以及地下传送带的配方使UI更加整洁。 +se-deep-space-belt-white=关闭白色深空传送带、分流器以及地下传送带的配方使UI更加整洁。 +se-deep-space-belt-red=关闭红色深空传送带、分流器以及地下传送带的配方使UI更加整洁。 +se-deep-space-belt-yellow=关闭黄色深空传送带、分流器以及地下传送带的配方使UI更加整洁。 +se-deep-space-belt-green=关闭绿色深空传送带、分流器以及地下传送带的配方使UI更加整洁。 +se-deep-space-belt-cyan=关闭青色深空传送带、分流器以及地下传送带的配方使UI更加整洁。 +se-deep-space-belt-blue=关闭蓝色深空传送带、分流器以及地下传送带的配方使UI更加整洁。 +se-deep-space-belt-magenta=关闭品红深空传送带、分流器以及地下传送带的配方使UI更加整洁。 +se-space-science-pack=如果其他Mod添加了获取太空科研包的方法,则将使用该方法。 如果没有其他制造方法,那么太空探索可以将其移除或将其用作优化科研包。 +se-never-show-lifesupport=如果勾选则维生系统GUI将不会显示,即便你处于窒息状态。 +se-show-zone-preview=取消选择来禁用宇宙管理器内的区域预览窗口。 如果你开启了某些Debug信息屏显,启用区域预览窗口可能会降低FPS。 +se-pylon-charge-points=取消勾选以移除建筑区输电塔充电点。 这有助于控制机器人充电行为,但你可能需要在长距离路线上添加其他充电方式。 +se-cmes-max-frequency=日冕物质喷射(CME)的最大间隔时间。 该值以小时为单位,0=禁用。 第一次 CME 会被脚本化到游戏的第一分钟,并且大部分是无害的。 第二次会延迟大约48小时。 重复之间的延迟是最大间隔设置的50%到100%之间。 非零的设置只适用于新事件,一旦设置了预期抵达时间,就不再受到影响。 零设置将清除所有已排定的CME,但可能需要长达一分钟的时间才会生效。 +se-spawn-small-resources=在起始区域添加一些额外的小资源区。 资源区聚集分布,以减少资源之间的运输时间。 +se-show-overhead-button-satellite-mode=在屏幕左上方显示一个小按钮,用于切换导航卫星视角。 +se-show-overhead-button-interstellar-map=在屏幕左上方显示一个小按钮,用于切换星际地图。 +se-show-overhead-button-universe-explorer=在屏幕左上方显示一个小按钮,用于切换宇宙浏览器。 +se-show-pin-help-tooltip=在大头针按钮上显示一个帮助提示,展示如何使用它们的说明。 +se-scan-search-budget=卫星扫描。 可检查地图状态的块数。 高值可使其加快已扫描的数据块的速度,以到达未扫描的边缘。 +se-scan-chart-budget=卫星扫描。 可并行添加到制图缓冲区的分块请求数量。 如果前一个分块还没有完成,则不会有新的图表请求。 +se-scan-alert-interval=表面扫描更新提醒的间隔时间,以秒为单位。揭示表面会增加游戏保存文件的大小,所以最好不要开了一个就忘了。 +se-supercharger-individual-charge-rate=设置超充器中每个单独充电端口的充电率,以MW为单位(不影响最大充电率)。 最小(默认)值为90MW,足以在一秒钟内为原版机器人充满电,最高可达1000MW,即1GW(超充能器的最大充电率)。 + +[string-mod-setting] +se-space-science-pack-Remove=完全移除 +se-space-science-pack-Replace=用火箭科研包代替 +se-space-science-pack-OptimisationUranium=优化:铀-冰晶石 配方 +se-space-science-pack-OptimisationFish=优化:维生质-火成岩-鱼 配方 + +[autoplace-control-names] +planet-size=星球尺寸 +se-water-ice=水冰(仅在太空生成) +se-methane-ice=甲烷冰(仅在太空生成) +se-cryonite=冰晶石(不会在母星生成) +se-vulcanite=火成岩(不会在母星生成) +se-vitamelange=维生质(不会在母星生成) +se-beryllium-ore=铍矿(不会在母星生成) +se-holmium-ore=钬矿(不会在母星生成) +se-iridium-ore=铱矿(不会在母星生成) +se-naquium-ore=寂介素矿(仅在太空生成) + +[map-gen-preset-name] +space-exploration=太空探索默认 + +[map-gen-preset-description] +space-exploration=太空探索的默认设置 + +[tooltip-category] +shot=用途 diff --git a/space-exploration_0.5.58/space-exploration/lua-style.cfg b/space-exploration_0.5.58/space-exploration/lua-style.cfg new file mode 100644 index 0000000..dad38fd --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/lua-style.cfg @@ -0,0 +1,3 @@ +indent_width: 2 +column_limit: 120 +continuation_indent_width: 2 \ No newline at end of file diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.146.json b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.146.json new file mode 100644 index 0000000..fb2ec2c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.146.json @@ -0,0 +1,10 @@ +{ + "item": + [ + ["se-quantumn-phenomenon-data", "se-quantum-phenomenon-data"] + ], + "recipe": + [ + ["se-quantumn-phenomenon-data", "se-quantum-phenomenon-data"] + ] +} diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.64.json b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.64.json new file mode 100644 index 0000000..4045e56 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.64.json @@ -0,0 +1,6 @@ +{ + "technology": + [ + ["se-spaceship-supersize", "se-factory-spaceship-1"] + ] +} diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.8.json b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.8.json new file mode 100644 index 0000000..6ae6431 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.1.8.json @@ -0,0 +1,8 @@ +{ + "tile": + [ + ["se-space-platform-underlay", "se-space"], + ["se-space-platform-underlay-l", "se-space"], + ["se-space-platform-underlay-r", "se-space"] + ] +} diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.2.5.json b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.2.5.json new file mode 100644 index 0000000..0a2dfbe --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.2.5.json @@ -0,0 +1,14 @@ +{ + "item": + [ + ["se-core-fragment-processor", "se-pulveriser"] + ], + "recipe": + [ + ["se-core-fragment-processor", "se-pulveriser"] + ], + "entity": + [ + ["se-core-fragment-processor", "se-pulveriser"] + ] +} diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.2.7.lua b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.2.7.lua new file mode 100644 index 0000000..a0c0b57 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.2.7.lua @@ -0,0 +1,8 @@ +-- move all drills down by 1 pixel so that the animation is on top +for _, surface in pairs(game.surfaces) do + for _, entity in pairs(surface.find_entities_filtered{name="se-core-miner-drill"}) do + entity.teleport({x = entity.position.x, y = entity.position.y + 1/32}) + local e = entity.surface.find_entity("se-core-miner", entity.position) + if e then e.direction = entity.direction end + end +end diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.126.lua b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.126.lua new file mode 100644 index 0000000..afcf528 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.126.lua @@ -0,0 +1,16 @@ +-- fixing "launching_to_destiantion" spelling error in prior launchpad.lua code causes a crash on a save prior to this one during which a rocket is launched, this aims to fix that +if global.rocket_launch_pads then + for _, struct in pairs(global.rocket_launch_pads) do + if struct.launching_to_destiantion then + struct.launching_to_destination = struct.launching_to_destiantion + end + end +end + +if global.tick_tasks then + for _, tick_task in pairs(global.tick_tasks) do + if tick_task.launching_to_destiantion then + tick_task.launching_to_destination = tick_task.launching_to_destiantion + end + end +end diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.13.json b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.13.json new file mode 100644 index 0000000..ef0939e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.13.json @@ -0,0 +1,6 @@ +{ + "technology": + [ + ["se-space-solar-panel-adv", "se-space-solar-panel-2"] + ] +} diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.130.json b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.130.json new file mode 100644 index 0000000..65517cf --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.130.json @@ -0,0 +1,20 @@ +{ + "item": + [ + ["se-nano-material", "se-nanomaterial"], + ["se-enriched-naquium", "se-naquium-cube"], + ["se-universal-catalogue", "se-deep-catalogue-1"], + ["se-deep-space-science-pack", "se-deep-space-science-pack-1"] + ], + "recipe": + [ + ["se-nano-material", "se-nanomaterial"], + ["se-deep-space-science-pack", "se-deep-space-science-pack-1"] + ], + "technology": + [ + ["se-nano-material", "se-nanomaterial"], + ["se-deep-space-science-pack", "se-deep-space-science-pack-1"], + ["se-deep-space-science-pack-enriched", "se-deep-space-science-pack-1"] + ] +} diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.21.json b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.21.json new file mode 100644 index 0000000..aff3caa --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.21.json @@ -0,0 +1,53 @@ +{ + "item": + [ + ["se-orbital-data", "se-machine-learning-data"], + + ["se-exotic-singularity-data", "se-singularity-data"], + ["se-gravimetric-observation-data", "se-astrometric-data"], + ["se-gravity-wave-observation-data", "se-gravity-wave-data"], + ["se-gravimetric-test-data", "se-gravitational-lensing-data"], + + ["se-nano-hot-thermodynamics-data", "se-experimental-alloys-data"], + ["se-nano-cold-thermodynamics-data", "se-electrical-shielding-data"], + ["se-nano-compressive-strength-data", "se-laser-shielding-data"], + ["se-nano-tensile-strength-data", "se-particle-beam-shielding-data"], + + ["se-plasma-thermodynamics-data", "se-rigidity-data"], + ["se-plasma-electrodynamics-data", "se-electromagnetic-field-data"], + ["se-gammaray-test-data", "se-lepton-data"], + ["se-exotic-fission-data", "se-fusion-test-data"], + ["se-ion-spectrometry-data", "se-polarisation-data"], + ["se-bio-spectral-data", "se-biomechanical-data"], + + ["se-material-decay-data", "se-corrosion-resistance-data"], + ["se-material-spectral-data", "se-rigidity-data"], + ["se-experimental-material-decay-data", "se-electrical-shielding-data"], + ["se-experimental-material-spectral-data", "se-ballistic-shielding-data"], + + ["se-astronomic-science-pack", "se-astronomic-science-pack-1"], + ["se-biological-science-pack", "se-biological-science-pack-1"], + ["se-material-science-pack", "se-material-science-pack-1"], + ["se-energy-science-pack", "se-energy-science-pack-1"] + ], + "recipe": + [ + ["se-orbital-data", "se-machine-learning-data"], + + ["se-exotic-singularity-data", "se-singularity-data"], + ["se-gravimetric-observation-data", "se-gravitational-lensing-data"], + ["se-gravity-wave-observation-data", "se-gravity-wave-data"], + + ["se-astronomic-science-pack", "se-astronomic-science-pack-1"], + ["se-biological-science-pack", "se-biological-science-pack-1"], + ["se-material-science-pack", "se-material-science-pack-1"], + ["se-energy-science-pack", "se-energy-science-pack-1"] + ], + "technology": + [ + ["se-astronomic-science-pack", "se-astronomic-science-pack-1"], + ["se-biological-science-pack", "se-biological-science-pack-1"], + ["se-material-science-pack", "se-material-science-pack-1"], + ["se-energy-science-pack", "se-energy-science-pack-1"] + ] +} diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.32.json b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.32.json new file mode 100644 index 0000000..85e847b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.3.32.json @@ -0,0 +1,22 @@ +{ + "entity": + [ + ["se-space-recycling-facility", "se-recycling-facility"], + ["se-space-lifesupport-facility", "se-lifesupport-facility"] + ], + "item": + [ + ["se-space-recycling-facility", "se-recycling-facility"], + ["se-space-lifesupport-facility", "se-lifesupport-facility"] + ], + "recipe": + [ + ["se-space-recycling-facility", "se-recycling-facility"], + ["se-space-lifesupport-facility", "se-lifesupport-facility"] + ], + "technology": + [ + ["se-space-recycling-facility", "se-recycling-facility"], + ["se-space-lifesupport-facility", "se-lifesupport-facility"] + ] +} diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.5.1.json b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.5.1.json new file mode 100644 index 0000000..8dfe4ea --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration.0.5.1.json @@ -0,0 +1,12 @@ +{ + "item": + [ + ["railgun", "se-railgun"], + ["railgun-dart", "se-railgun-ammo"] + ], + "recipe": + [ + ["railgun", "se-railgun"], + ["railgun-dart", "se-railgun-ammo"] + ] +} diff --git a/space-exploration_0.5.58/space-exploration/migrations/space-exploration0.0.3.45.json b/space-exploration_0.5.58/space-exploration/migrations/space-exploration0.0.3.45.json new file mode 100644 index 0000000..04d437f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/migrations/space-exploration0.0.3.45.json @@ -0,0 +1,10 @@ +{ + "recipe": + [ + ["se-radiating-space-coolant-veryslow", "se-radiating-space-coolant-slow"] + ], + "technology": + [ + ["se-space-radiating-1", "se-space-radiating-efficiency"] + ] +} diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/categories.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/categories.lua new file mode 100644 index 0000000..8f09f99 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/categories.lua @@ -0,0 +1,100 @@ +local data_util = require("data_util") + +-- NOTE: space- prefix categories should ONLY be available in space +-- otherwise add a non-prefixed version +local crafting_categories = { + "arcosphere", + "condenser-turbine", + "big-turbine", + "delivery-cannon", + "delivery-cannon-weapon", + "fixed-recipe", -- generic group for anything with a fixed recipe, not chosen by player + "fuel-refining", + "core-fragment-processing", + "lifesupport", -- same as "space-lifesupport" but can be on land + "nexus", + "pulverising", + "hard-recycling", -- no conflict with "recycling" + "hand-hard-recycling", -- no conflict with "recycling" + "se-electric-boiling", -- needs to be SE specific otherwise energy values will be off + "space-accelerator", + "space-astrometrics", + "space-biochemical", + "space-collider", + "space-crafting", -- same as basic assembling but only in space + "space-decontamination", + "space-electromagnetics", + "space-materialisation", + "space-genetics", + "space-gravimetrics", + "space-growth", + "space-hypercooling", + "space-laser", + "space-lifesupport", -- same as "lifesupport" but can only be in space + "space-manufacturing", + "space-mechanical", + "space-observation-gammaray", + "space-observation-xray", + "space-observation-uv", + "space-observation-visible", + "space-observation-infrared", + "space-observation-microwave", + "space-observation-radio", + "space-plasma", + "space-radiation", + "space-radiator", + "space-hard-recycling", -- no conflict with "recycling" + "space-research", + "space-spectrometry", + "space-supercomputing-1", + "space-supercomputing-2", + "space-supercomputing-3", + "space-supercomputing-4", + "space-thermodynamics", + "spaceship-console", + "spaceship-antimatter-engine", + "spaceship-rocket-engine", + "pressure-washing", + "dummy", + "no-category" -- has no recipes +} +for _, name in pairs(crafting_categories) do + data:extend({ + { type = "recipe-category", name = name }, + { + type = "item-subgroup", + name = name, + group = "intermediate-products", --group = "space", + order = "z-b-"..name + }, + }) +end +-- table.insert(data.raw.character.character.crafting_categories, "lifesupport") -- too many fluid recipes +data:extend({ + { + type = "fuel-category", + name = "antimatter" + }, + { + type = "resource-category", + name = data_util.mod_prefix .. "core-mining", + }, + { + type = "ammo-category", + name = "weapons-delivery-cannon", + bonus_gui_order = "z", + }, +}) + + +for _, tech in pairs(data.raw.technology) do + if tech.effects then + for _, effect in pairs(tech.effects) do + if (effect.type == "ammo-damage" or effect.type == "gun-speed") and effect.ammo_category == "bullet" then + local c = table.deepcopy(effect) + c.ammo_category = "railgun" + table.insert(tech.effects, c) + end + end + end +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/antimatter-reactor.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/antimatter-reactor.lua new file mode 100644 index 0000000..a9cd13d --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/antimatter-reactor.lua @@ -0,0 +1,1052 @@ +local data_util = require("data_util") + +local blank = { + direction_count = 8, + frame_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + priority = "low" +} + +local max_temperature = 10000 +local specific_heat_reactor = "10MJ" +local specific_heat_pipe = "1MJ" +local specific_heat_pipe_long = "2MJ" +local max_transfer = "100GW" +local pipe_tint = {r = 0.8, b=1, g=0.8} +local glow_tint = {r = 0.5, b=1, g=0.5} +local long_versions = { + {pattern = "--+--", icon = "__space-exploration-graphics__/graphics/icons/naquium-heat-pipe-horizontal.png"}, + {pattern = "--+-----+--", icon = "__space-exploration-graphics__/graphics/icons/naquium-heat-pipe-horizontal-2.png"}, +} +data:extend({ + { + type = "reactor", + name = data_util.mod_prefix .. "antimatter-reactor", + icon = "__space-exploration-graphics__/graphics/icons/antimatter-reactor.png", + icon_size = 64, + flags = {"placeable-neutral", "player-creation"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "antimatter-reactor"}, + max_health = 500, + corpse = "nuclear-reactor-remnants", + consumption = "400MW", + neighbour_bonus = 1, + energy_source = + { + type = "burner", + fuel_category = "antimatter", + effectivity = 1, + fuel_inventory_size = 1, + burnt_inventory_size = 1 + }, + collision_box = {{-2.2, -2.2}, {2.2, 2.2}}, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + --the collision box of a reactor is increased by this on the sides where it connects to another reactor: + --neighbour_collision_increase = 0.25, + lower_layer_picture = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-pipes.png", + width = 156, + height = 156, + shift = util.by_pixel(-2, -4), + tint = pipe_tint, + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-pipes.png", + width = 320, + height = 316, + scale = 0.5, + shift = util.by_pixel(-1, -5), + tint = pipe_tint, + } + }, + heat_lower_layer_picture = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-pipes-heated.png", + width = 156, + height = 156, + shift = util.by_pixel(-3, -4), + tint = glow_tint, + blend_mode = "additive", + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-pipes-heated.png", + width = 320, + height = 316, + scale = 0.5, + shift = util.by_pixel(-0.5, -4.5), + tint = glow_tint, + blend_mode = "additive", + } + }, + + picture = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/antimatter-reactor/reactor.png", + width = 160, + height = 160, + shift = { -0.03125, -0.1875 }, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/antimatter-reactor/hr-reactor.png", + width = 320, + height = 320, + scale = 0.5, + shift = { -0.03125, -0.1875 } + } + }, + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-shadow.png", + width = 263, + height = 162, + shift = { 1.625 , 0 }, + draw_as_shadow = true, + hr_version = { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-shadow.png", + width = 525, + height = 323, + scale = 0.5, + shift = { 1.625, 0 }, + draw_as_shadow = true + } + } + } + }, + + working_light_picture = + { + filename = "__space-exploration-graphics-3__/graphics/entity/antimatter-reactor/reactor-lights-color.png", + width = 160, + height = 160, + shift = { -0.03125, -0.1875 }, + blend_mode = "additive", + hr_version = + { + filename = "__space-exploration-graphics-3__/graphics/entity/antimatter-reactor/hr-reactor-lights-color.png", + width = 320, + height = 320, + scale = 0.5, + shift = { -0.03125, -0.1875 }, + blend_mode = "additive" + } + }, + + light = {intensity = 1, size = 9.9, shift = {0.0, 0.0}, color = {r = 0.9, g = 0.0, b = 1.0}}, + + heat_buffer = + { + max_temperature = max_temperature, + specific_heat = specific_heat_reactor, + max_transfer = max_transfer, + connections = + { + { + position = {-2, -2}, + direction = defines.direction.north + }, + { + position = {0, -2}, + direction = defines.direction.north + }, + { + position = {2, -2}, + direction = defines.direction.north + }, + { + position = {2, -2}, + direction = defines.direction.east + }, + { + position = {2, 0}, + direction = defines.direction.east + }, + { + position = {2, 2}, + direction = defines.direction.east + }, + { + position = {2, 2}, + direction = defines.direction.south + }, + { + position = {0, 2}, + direction = defines.direction.south + }, + { + position = {-2, 2}, + direction = defines.direction.south + }, + { + position = {-2, 2}, + direction = defines.direction.west + }, + { + position = {-2, 0}, + direction = defines.direction.west + }, + { + position = {-2, -2}, + direction = defines.direction.west + } + }, + + heat_picture = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-heated.png", + width = 108, + height = 128, + shift = util.by_pixel(1, -7), + tint = glow_tint, + blend_mode = "additive", + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-heated.png", + width = 216, + height = 256, + scale = 0.5, + shift = util.by_pixel(3, -6.5), + tint = glow_tint, + blend_mode = "additive", + } + }, + heat_glow = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-heat-glow.png", + priority = "extra-high", + width = 188, + height = 190, + shift = util.by_pixel(-2, -4), + tint = glow_tint, + blend_mode = "additive", + } + }, + + connection_patches_connected = + { + sheet = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-connect-patches.png", + width = 32, + height = 32, + variation_count = 12, + tint = pipe_tint, + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-connect-patches.png", + width = 64, + height = 64, + variation_count = 12, + scale = 0.5, + tint = pipe_tint, + } + } + }, + + connection_patches_disconnected = + { + sheet = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-connect-patches.png", + width = 32, + height = 32, + variation_count = 12, + y = 32, + tint = pipe_tint, + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-connect-patches.png", + width = 64, + height = 64, + variation_count = 12, + y = 64, + scale = 0.5, + tint = pipe_tint, + } + } + }, + + connection_patches = + { + north = + { + filename = "__base__/graphics/entity/nuclear-reactor/connection-patch-north.png", + width = 160, + height = 15, + shift = util.by_pixel(0, -72.5), + tint = pipe_tint, + }, + east = + { + filename = "__base__/graphics/entity/nuclear-reactor/connection-patch-east.png", + width = 15, + height = 160, + shift = util.by_pixel(72.5, 0) + }, + south = + { + filename = "__base__/graphics/entity/nuclear-reactor/connection-patch-south.png", + width = 160, + height = 15, + shift = util.by_pixel(0, 72.5) + }, + west = + { + filename = "__base__/graphics/entity/nuclear-reactor/connection-patch-west.png", + width = 15, + height = 160, + shift = util.by_pixel(-72.5, 0) + } + }, + + heat_connection_patches_connected = + { + sheet = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-connect-patches-heated.png", + width = 32, + height = 32, + variation_count = 12, + tint = glow_tint, + blend_mode = "additive", + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-connect-patches-heated.png", + width = 64, + height = 64, + variation_count = 12, + scale = 0.5, + tint = glow_tint, + blend_mode = "additive", + } + } + }, + + heat_connection_patches_disconnected = + { + sheet = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-connect-patches-heated.png", + width = 32, + height = 32, + variation_count = 12, + y = 32, + tint = glow_tint, + blend_mode = "additive", + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-connect-patches-heated.png", + width = 64, + height = 64, + variation_count = 12, + y = 64, + scale = 0.5, + tint = glow_tint, + blend_mode = "additive", + } + } + }, + + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65}, + + meltdown_action = + { + type = "direct", + action_delivery = + { + type = "instant", + target_effects = + { + { + repeat_count = 100, + type = "create-trivial-smoke", + smoke_name = "nuclear-smoke", + offset_deviation = {{-1, -1}, {1, 1}}, + starting_frame = 3, + starting_frame_deviation = 5, + starting_frame_speed = 0, + starting_frame_speed_deviation = 5, + speed_from_center = 0.5 + }, + { + type = "create-entity", + entity_name = "explosion" + }, + { + type = "damage", + damage = {amount = 400, type = "explosion"} + }, + { + type = "create-entity", + entity_name = "small-scorchmark", + check_buildability = true + }, + { + type = "nested-result", + action = + { + type = "area", + target_entities = false, + trigger_from_target = true, + repeat_count = 2000, + radius = 35, + action_delivery = + { + type = "projectile", + projectile = "atomic-bomb-wave", + starting_speed = 0.5 + } + } + } + } + } + } + }, +}) + +data.raw["heat-pipe"]["heat-pipe"].fast_replaceable_group = "heat-pipe" +local heat_pipe = table.deepcopy(data.raw["heat-pipe"]["heat-pipe"]) +heat_pipe.name = data_util.mod_prefix .. "naquium-heat-pipe" +heat_pipe.icon = "__space-exploration-graphics__/graphics/icons/naquium-heat-pipe.png" +heat_pipe.icon_size = 64 +heat_pipe.icon_mipmaps = 1 +heat_pipe.heat_buffer.max_temperature = max_temperature +heat_pipe.heat_buffer.specific_heat = specific_heat_pipe +heat_pipe.heat_buffer.max_transfer = max_transfer +heat_pipe.order = "z" +heat_pipe.minable.result = data_util.mod_prefix .. "naquium-heat-pipe" + +data_util.tint_recursive(heat_pipe.connection_sprites, pipe_tint) +data_util.tint_recursive(heat_pipe.heat_glow_sprites, glow_tint) +data_util.blend_mode_recursive(heat_pipe.heat_glow_sprites, "additive") +data_util.tint_recursive(heat_pipe.heat_buffer.heat_glow, glow_tint) +data_util.blend_mode_recursive(heat_pipe.heat_buffer.heat_glow, "additive") +data:extend({ + heat_pipe, +}) + +local pipes_cross = { + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-t-1.png", + height = 32, + priority = "extra-high", + width = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-t-1.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64 + }, + } +} +local pipes_horizontal = { + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-horizontal-1.png", + height = 32, + priority = "extra-high", + width = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-horizontal-1.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-horizontal-2.png", + height = 32, + priority = "extra-high", + width = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-horizontal-2.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-horizontal-3.png", + height = 32, + priority = "extra-high", + width = 32, + shift = {-4,0}, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-horizontal-3.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-horizontal-4.png", + height = 32, + priority = "extra-high", + width = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-horizontal-4.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-horizontal-5.png", + height = 32, + priority = "extra-high", + width = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-horizontal-5.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-horizontal-6.png", + height = 32, + priority = "extra-high", + width = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-horizontal-6.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, +} +local pipes_vertical = { + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-vertical-1.png", + height = 32, + priority = "extra-high", + width = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-vertical-1.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-vertical-2.png", + height = 32, + priority = "extra-high", + width = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-vertical-2.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-vertical-3.png", + height = 32, + priority = "extra-high", + width = 32, + shift = {-4,0}, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-vertical-3.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-vertical-4.png", + height = 32, + priority = "extra-high", + width = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-vertical-4.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-vertical-5.png", + height = 32, + priority = "extra-high", + width = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-vertical-5.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, + { + filename = "__base__/graphics/entity/heat-pipe/heat-pipe-straight-vertical-6.png", + height = 32, + priority = "extra-high", + width = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-pipe/hr-heat-pipe-straight-vertical-6.png", + height = 64, + priority = "extra-high", + scale = 0.5, + width = 64, + }, + }, +} +local pipe_glow = { + filename = "__base__/graphics/entity/heat-pipe/heated-glow.png", + width = 55, + height = 55, + priority = "extra-high", + tint = glow_tint, + blend_mode = "additive" +} + +local shift_sprite = data_util.shift_sprite + +for _, version in pairs(long_versions) do + local length = #version.pattern + local name = heat_pipe.name.."-long"..version.pattern + local long_pipes_horizontal = {} + local long_pipes_vertical = {} + local long_pipes_glow_horizontal = {} + local long_pipes_glow_vertical = {} + local connections = {} + for i = 1, #version.pattern do + local c = string.sub(version.pattern, i, i) + local j = i - length/2 -0.5 + if i == 1 and (c == "-" or c == "+") then + table.insert(connections,{ + position = {0, j}, + direction = defines.direction.north + }) + end + if i == length and (c == "-" or c == "+") then + table.insert(connections,{ + position = {0, j}, + direction = defines.direction.south + }) + end + if c == "+" then + table.insert(connections,{ + position = {0, j}, + direction = defines.direction.east + }) + table.insert(connections,{ + position = {0, j}, + direction = defines.direction.west + }) + table.insert(long_pipes_horizontal, shift_sprite(table.deepcopy(pipes_cross[1+i%#pipes_cross]),{j,0})) + table.insert(long_pipes_vertical, shift_sprite(table.deepcopy(pipes_cross[1+i%#pipes_cross]),{0,j})) + elseif c == "-" then + table.insert(long_pipes_horizontal, shift_sprite(table.deepcopy(pipes_horizontal[1+i%#pipes_horizontal]),{j,0})) + table.insert(long_pipes_vertical, shift_sprite(table.deepcopy(pipes_vertical[1+i%#pipes_vertical]),{0,j})) + end + table.insert(long_pipes_glow_horizontal, shift_sprite(table.deepcopy(pipe_glow),{j,0})) + table.insert(long_pipes_glow_vertical, shift_sprite(table.deepcopy(pipe_glow),{0,j})) + end + local long_pipes_heated_horizontal = table.deepcopy(long_pipes_horizontal) + local long_pipes_heated_vertical = table.deepcopy(long_pipes_vertical) + data_util.tint_recursive(long_pipes_horizontal, pipe_tint) + data_util.tint_recursive(long_pipes_vertical, pipe_tint) + + data_util.replace_filenames_recursive(long_pipes_heated_horizontal, "heat-pipe/heat-pipe", "heat-pipe/heated") + data_util.replace_filenames_recursive(long_pipes_heated_horizontal, "heat-pipe/hr-heat-pipe", "heat-pipe/hr-heated") + data_util.tint_recursive(long_pipes_heated_horizontal, glow_tint) + data_util.blend_mode_recursive(long_pipes_heated_horizontal, "additive") + + data_util.replace_filenames_recursive(long_pipes_heated_vertical, "heat-pipe/heat-pipe", "heat-pipe/heated") + data_util.replace_filenames_recursive(long_pipes_heated_vertical, "heat-pipe/hr-heat-pipe", "heat-pipe/hr-heated") + data_util.tint_recursive(long_pipes_heated_vertical, glow_tint) + data_util.blend_mode_recursive(long_pipes_heated_vertical, "additive") + + + table.insert(data.raw.technology[data_util.mod_prefix.."processing-naquium"].effects, + { type = "unlock-recipe", recipe = name }) + data:extend{ + { + type = "item", + name = name, + icon = version.icon, + icon_size = 64, + order = "f[nuclear-energy]-b[heat-pipe]-n", + subgroup = "energy", + stack_size = 50, + place_result = name, + }, + { + type = "recipe", + name = name, + result = name, + enabled = false, + energy_required = 10, + ingredients = { + { data_util.mod_prefix .. "naquium-heat-pipe", math.ceil(length/2)}, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "boiler", + name = name, + localised_name = {"entity-name."..data_util.mod_prefix.."naquium-heat-pipe-long", version.pattern}, + localised_description = {"entity-description."..data_util.mod_prefix.."naquium-heat-pipe-long", version.pattern}, + burning_cooldown = 20, + collision_box = {{-0.3,-(length/2-0.2)},{0.3,(length/2-0.2)}}, + collision_mask = { + "item-layer", + "floor-layer", + "object-layer", + "water-tile" + }, + selection_box = {{-0.5,-length/2},{0.5,length/2}}, + order = "z", + corpse = "heat-pipe-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = { + { + -0.5, + -0.5 + }, + { + 0.5, + 0.5 + } + }, + offsets = { + { + 0, + 1 + } + }, + type = "create-entity" + }, + dying_explosion = "heat-exchanger-explosion", + energy_consumption = "0.0000001W", + energy_source = { + connections = connections, + heat_glow = { + east = {layers = long_pipes_glow_horizontal}, + north = {layers = long_pipes_glow_vertical}, + south = {layers = long_pipes_glow_vertical}, + west = {layers = long_pipes_glow_horizontal}, + }, + heat_picture = { + east = {layers = {{layers = long_pipes_heated_horizontal}}}, + north = {layers = {{layers = long_pipes_heated_vertical}}}, + south = {layers ={{layers = long_pipes_heated_vertical}}}, + west = {layers = {{layers = long_pipes_heated_horizontal}}}, + }, + heat_pipe_covers = { + east = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings-heated.png", + frame_count = 1, + height = 32, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings-heated.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 64, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 32, + y = 0 + }, + north = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings-heated.png", + frame_count = 1, + height = 32, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings-heated.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 0, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 0, + y = 0 + }, + south = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings-heated.png", + frame_count = 1, + height = 32, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings-heated.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 128, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 64, + y = 0 + }, + west = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings-heated.png", + frame_count = 1, + height = 32, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings-heated.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 192, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 96, + y = 0 + } + }, + max_temperature = max_temperature, + max_transfer = max_transfer, + min_working_temperature = max_temperature, + minimum_glow_temperature = 350, + pipe_covers = { + east = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings.png", + frame_count = 1, + height = 32, + tint = pipe_tint, + hr_version = { + tint = pipe_tint, + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 64, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 32, + y = 0 + }, + north = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings.png", + frame_count = 1, + height = 32, + tint = pipe_tint, + hr_version = { + tint = pipe_tint, + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 0, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 0, + y = 0 + }, + south = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings.png", + frame_count = 1, + height = 32, + tint = pipe_tint, + hr_version = { + tint = pipe_tint, + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 128, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 64, + y = 0 + }, + west = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings.png", + frame_count = 1, + height = 32, + tint = pipe_tint, + hr_version = { + tint = pipe_tint, + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 192, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 96, + y = 0 + } + }, + specific_heat = specific_heat_pipe_long, + type = "heat" + }, + fire = {}, + fire_glow = {}, + flags = { + "placeable-neutral", + "player-creation" + }, + fluid_box = { + base_area = 1, + base_level = 1, + filter = "water", + height = 2, + pipe_connections = { }, + production_type = "input-output" + }, + icon = version.icon, + icon_mipmaps = 1, + icon_size = 64, + max_health = 200, + minable = { + mining_time = 0.2, + result = name + }, + mode = "output-to-separate-pipe", + output_fluid_box = { + base_area = 1, + base_level = 1, + filter = "steam", + height = 2, + pipe_connections = { }, + production_type = "output" + }, + resistances = { + { + percent = 90, + type = "fire" + }, + { + percent = 30, + type = "explosion" + }, + { + percent = 30, + type = "impact" + } + }, + structure = { + east = {layers = {{layers = long_pipes_horizontal}}}, + north = {layers = {{layers = long_pipes_vertical}}}, + south = {layers = {{layers = long_pipes_vertical}}}, + west = {layers = {{layers = long_pipes_horizontal}}}, + }, + target_temperature = max_temperature, + vehicle_impact_sound = { + { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-2.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-3.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-4.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-5.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-6.ogg", + volume = 0.5 + } + }, + water_reflection = { + orientation_to_variation = true, + pictures = { + filename = "__base__/graphics/entity/boiler/boiler-reflection.png", + height = 32, + priority = "extra-high", + scale = 5, + shift = { + 0.15625, + 0.9375 + }, + variation_count = 4, + width = 28 + }, + rotate = false + }, + working_sound = { + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + filename = "__base__/sound/boiler.ogg", + volume = 0.8 + } + } + } + } +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/arcosphere.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/arcosphere.lua new file mode 100644 index 0000000..0af8676 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/arcosphere.lua @@ -0,0 +1,358 @@ +local data_util = require("data_util") + +--[[ +α alpha +β beta +γ gamma +δ delta +ε epsilon +ζ zeta +η eta +θ theta +λ la(m)bda +ξ xi +φ phi +ψ psi +ω omega + + +δ delta +ε epsilon +ζ zeta +θ theta +λ lambda +ξ xi +φ phi +ω omega + +Ζ Zeta +Θ theta +Ω omega +Φ phi +Σ sigma +Λ Lambda + +translation +rotation +reflection +dialation +transformation +inversion +substitution +superposition + +Apex +Omega + +Ruby +Saphire +Emerald +Topaz +Amber +Citrine +Amethyst +Quartz + + +γ gamma +ζ zeta +ξ xi +φ phi +ψ psi +ω omega +θ theta +λ lambda + +]] + +local arcosphere_variants = { + { number = 1, letter = "a", sign = "l", character = "λ", name = "lambda"}, + { number = 2, letter = "b", sign = "x", character = "ξ", name = "xi"}, + { number = 3, letter = "c", sign = "z", character = "ζ", name = "zeta"}, + { number = 4, letter = "d", sign = "t", character = "θ", name = "theta"}, + { number = 5, letter = "e", sign = "e", character = "ε", name = "epsilon"}, + { number = 6, letter = "f", sign = "f", character = "φ", name = "phi"}, + { number = 7, letter = "g", sign = "g", character = "γ", name = "gamma"}, + { number = 8, letter = "h", sign = "o", character = "ω", name = "omega"}, +} + +data:extend({ + { + type = "technology", + name = data_util.mod_prefix .. "arcosphere", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-collector", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/arcosphere.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-2", + }, + unit = { + count = "200", + time = 60, + ingredients = { + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "arcosphere-folding", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fracture", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fracture-alt", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fold-in", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fold-out", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fold-a", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fold-b", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fold-c", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fold-d", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fold-e", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fold-f", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fold-g", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "arcosphere-fold-h", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/arcosphere.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "arcosphere", + }, + unit = { + count = "400", + time = 60, + ingredients = { + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 }, + } + }, + }, + { + type = "item", + name = data_util.mod_prefix .. "arcosphere-collector", + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/satellite.png", icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/satellite-mask.png", icon_size = 64, tint = {r=0.9,g=8,b=0.9}}, + }, + icon_size = 64, + order = "a-a", + subgroup = "arcosphere", + stack_size = 1, + rocket_launch_product = { data_util.mod_prefix .. "arcosphere", 0} + }, + { + type = "recipe", + name = data_util.mod_prefix .. "arcosphere-collector", + main_product = data_util.mod_prefix .. "arcosphere-collector", + category = "space-manufacturing", + subgroup = "arcosphere", + enabled = false, + energy_required = 60, + ingredients = { + { name = "laser-turret", amount = 2}, + { name = data_util.mod_prefix .. "dynamic-emitter", amount = 2}, + { name = data_util.mod_prefix .. "quantum-processor", amount = 10}, + { name = data_util.mod_prefix .. "naquium-cube", amount = 10}, + { name = data_util.mod_prefix .. "antimatter-canister", amount = 10, catalyst_amount = 10}, + { name = data_util.mod_prefix .. "aeroframe-bulkhead", amount = 50}, + }, + results = { + { data_util.mod_prefix .. "arcosphere-collector", 1 }, + { name = data_util.mod_prefix .. "magnetic-canister", amount = 10, catalyst_amount = 10}, + }, + requester_paste_multiplier = 1, + icon_size = 64, + }, + { + type = "item", + name = data_util.mod_prefix .. "arcosphere", + icon = "__space-exploration-graphics__/graphics/icons/dss/ns-0.png", + icon_size = 64, + order = "a-b", + subgroup = "arcosphere", + stack_size = 1, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "arcosphere-fracture", + category = "arcosphere", + subgroup = "arcosphere", + enabled = false, + energy_required = 60, + ingredients = { + { data_util.mod_prefix .. "arcosphere", 4 }, + }, + results = { + { data_util.mod_prefix .. "arcosphere-a", 1 }, + { data_util.mod_prefix .. "arcosphere-b", 0 }, + { data_util.mod_prefix .. "arcosphere-c", 1 }, + { data_util.mod_prefix .. "arcosphere-d", 0 }, + { data_util.mod_prefix .. "arcosphere-e", 1 }, + { data_util.mod_prefix .. "arcosphere-f", 0 }, + { data_util.mod_prefix .. "arcosphere-g", 1 }, + { data_util.mod_prefix .. "arcosphere-h", 0 }, + }, + requester_paste_multiplier = 1, + icon = "__space-exploration-graphics__/graphics/icons/dss/ns-0.png", + icon_size = 64, + always_show_made_in = true, + localised_description = {"space-exploration.arcosphere-random"} + }, + { + type = "recipe", + name = data_util.mod_prefix .. "arcosphere-fracture-alt", + category = "arcosphere", + subgroup = "arcosphere", + enabled = false, + energy_required = 60, + ingredients = { + { data_util.mod_prefix .. "arcosphere", 4 }, + }, + results = { + { data_util.mod_prefix .. "arcosphere-a", 0 }, + { data_util.mod_prefix .. "arcosphere-b", 1 }, + { data_util.mod_prefix .. "arcosphere-c", 0 }, + { data_util.mod_prefix .. "arcosphere-d", 1 }, + { data_util.mod_prefix .. "arcosphere-e", 0 }, + { data_util.mod_prefix .. "arcosphere-f", 1 }, + { data_util.mod_prefix .. "arcosphere-g", 0 }, + { data_util.mod_prefix .. "arcosphere-h", 1 }, + }, + requester_paste_multiplier = 1, + icon = "__space-exploration-graphics__/graphics/icons/dss/ns-0.png", + icon_size = 64, + always_show_made_in = true, + localised_name = {"recipe-name."..data_util.mod_prefix .. "arcosphere-fracture"}, + localised_description = {"space-exploration.arcosphere-random"} + } +}) + +for _, arcosphere_variant in pairs(arcosphere_variants) do + data:extend({{ + type = "item", + name = data_util.mod_prefix .. "arcosphere-"..arcosphere_variant.letter, + icon = "__space-exploration-graphics__/graphics/icons/dss/ns-"..arcosphere_variant.letter..".png", -- used for recipe + icon_size = 64, + icons = { -- overrides icon + { icon = "__space-exploration-graphics__/graphics/icons/dss/ns-"..arcosphere_variant.letter..".png", icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/dss/"..arcosphere_variant.name..".png", icon_size = 64 }, + }, + pictures = { + { + filename = "__space-exploration-graphics__/graphics/icons/dss/ns-"..arcosphere_variant.letter..".png", + scale = 0.25, + size = 64 + }, + }, + order = "j-"..arcosphere_variant.letter, + subgroup = "arcosphere", + stack_size = 1, + }}) +end + +local function make_recipe(name, from_high, from_low, to_high, to_low) + + local a = data.raw.item[data_util.mod_prefix .. "arcosphere-"..arcosphere_variants[from_high].letter] + local b = data.raw.item[data_util.mod_prefix .. "arcosphere-"..arcosphere_variants[from_low].letter] + local c = data.raw.item[data_util.mod_prefix .. "arcosphere-"..arcosphere_variants[to_high].letter] + local d = data.raw.item[data_util.mod_prefix .. "arcosphere-"..arcosphere_variants[to_low].letter] + data:extend({ + { + type = "recipe", + name = name, + category = "arcosphere", + subgroup = "arcosphere", + results = { + { data_util.mod_prefix .. "arcosphere-"..arcosphere_variants[to_high].letter, 1 }, + { data_util.mod_prefix .. "arcosphere-"..arcosphere_variants[to_low].letter, 1 }, + }, + enabled = false, + energy_required = 10, + ingredients = { + { data_util.mod_prefix .. "arcosphere-"..arcosphere_variants[from_high].letter, 1 }, + { data_util.mod_prefix .. "arcosphere-"..arcosphere_variants[from_low].letter, 1 }, + }, + requester_paste_multiplier = 1, + always_show_products = false, + allow_decomposition = false, + always_show_made_in = true, + icons = { + { icon = "__space-exploration-graphics__/graphics/blank.png", scale = 1, shift = {0, 0}, icon_size = 64 }, -- to lock scale + { icon = a.icon, scale = 0.33, shift = {-4, -16}, icon_size = 64 }, + { icon = b.icon, scale = 0.33, shift = {16, -16}, icon_size = 64 }, + { icon = c.icon, scale = 0.33, shift = {-16, 16}, icon_size = 64 }, + { icon = d.icon, scale = 0.33, shift = {4, 16}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/transition-arrow.png", scale = 1, shift = {0, 0}, icon_size = 64 }, -- to overlay + }, + localised_name = {"recipe-name.se-arcosphere-folding", + arcosphere_variants[from_high].character, + arcosphere_variants[from_low].character, + arcosphere_variants[to_high].character, + arcosphere_variants[to_low].character} + } + }) +end +make_recipe(data_util.mod_prefix .. "arcosphere-fold-a", 8, 1, 2, 4) +make_recipe(data_util.mod_prefix .. "arcosphere-fold-b", 7, 2, 3, 1) +make_recipe(data_util.mod_prefix .. "arcosphere-fold-c", 2, 3, 4, 6) +make_recipe(data_util.mod_prefix .. "arcosphere-fold-d", 1, 4, 5, 3) +make_recipe(data_util.mod_prefix .. "arcosphere-fold-e", 4, 5, 6, 8) +make_recipe(data_util.mod_prefix .. "arcosphere-fold-f", 3, 6, 7, 5) +make_recipe(data_util.mod_prefix .. "arcosphere-fold-g", 6, 7, 8, 2) +make_recipe(data_util.mod_prefix .. "arcosphere-fold-h", 5, 8, 1, 7) + +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "arcosphere-fold-in", + category = "arcosphere", + subgroup = "arcosphere", + results = { + { data_util.mod_prefix .. "arcosphere-a", 1 }, + { data_util.mod_prefix .. "arcosphere-b", 1 }, + { data_util.mod_prefix .. "arcosphere-e", 1 }, + { data_util.mod_prefix .. "arcosphere-f", 1 }, + }, + enabled = false, + energy_required = 100, + ingredients = { + { data_util.mod_prefix .. "arcosphere-c", 1 }, + { data_util.mod_prefix .. "arcosphere-d", 1 }, + { data_util.mod_prefix .. "arcosphere-g", 1 }, + { data_util.mod_prefix .. "arcosphere-h", 1 }, + }, + requester_paste_multiplier = 1, + always_show_products = false, + allow_decomposition = false, + always_show_made_in = true, + icon = "__space-exploration-graphics__/graphics/icons/dss/ns-0.png", + icon_size = 64 + }, + { + type = "recipe", + name = data_util.mod_prefix .. "arcosphere-fold-out", + category = "arcosphere", + subgroup = "arcosphere", + results = { + { data_util.mod_prefix .. "arcosphere-c", 1 }, + { data_util.mod_prefix .. "arcosphere-d", 1 }, + { data_util.mod_prefix .. "arcosphere-g", 1 }, + { data_util.mod_prefix .. "arcosphere-h", 1 }, + }, + enabled = false, + energy_required = 100, + ingredients = { + { data_util.mod_prefix .. "arcosphere-a", 1 }, + { data_util.mod_prefix .. "arcosphere-b", 1 }, + { data_util.mod_prefix .. "arcosphere-e", 1 }, + { data_util.mod_prefix .. "arcosphere-f", 1 }, + }, + requester_paste_multiplier = 1, + always_show_products = false, + allow_decomposition = false, + always_show_made_in = true, + icon = "__space-exploration-graphics__/graphics/icons/dss/ns-0.png", + icon_size = 64 + } +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/big-heat-exchanger.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/big-heat-exchanger.lua new file mode 100644 index 0000000..0f85316 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/big-heat-exchanger.lua @@ -0,0 +1,974 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe +local pipe_tint = {r = 0.8, b=1, g=0.8} +local glow_tint = {r = 0.5, b=1, g=0.5} + +data.raw["heat-interface"]["heat-interface"].heat_buffer.max_temperature = 10000 --For testing 5000C heat exchangers. + +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "big-heat-exchanger", + icon = "__space-exploration-graphics__/graphics/icons/big-heat-exchanger.png", + icon_size = 64, + order = "d[fluid-burner-generator]-a", + subgroup = "energy", + stack_size = 50, + place_result = data_util.mod_prefix .. "big-heat-exchanger", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "big-heat-exchanger", + result = data_util.mod_prefix .. "big-heat-exchanger", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "lattice-pressure-vessel", 10 }, + { data_util.mod_prefix .. "nanomaterial", 10 }, + { data_util.mod_prefix .. "space-pipe", 50 }, + { data_util.mod_prefix .. "heavy-composite", 20 }, + { data_util.mod_prefix .. "heat-shielding", 50 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "technology", + name = data_util.mod_prefix .. "big-heat-exchanger", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "big-heat-exchanger", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/big-heat-exchanger.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "lattice-pressure-vessel", + data_util.mod_prefix .. "nanomaterial", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + } + }, + }, + { + type = "boiler", + name = data_util.mod_prefix .. "big-heat-exchanger", + icon = "__space-exploration-graphics__/graphics/icons/big-heat-exchanger.png", + icon_mipmaps = 1, + icon_size = 64, + burning_cooldown = 20, + collision_box = {{-2.3,-2.3},{2.3,2.3}}, + selection_box = {{-2.5,-2.5},{2.5,2.5}}, + drawing_box = {{-3.0,-4.0},{3.0,3.0}}, + corpse = "heat-exchanger-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = { + { + -0.5, + -0.5 + }, + { + 0.5, + 0.5 + } + }, + offsets = { + { + 0, + 1 + } + }, + type = "create-entity" + }, + dying_explosion = "heat-exchanger-explosion", + energy_consumption = "560MW", + energy_source = { + connections = { + { + direction = 4, + position = { + 0, + 2 + } + } + }, + heat_glow = { + east = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-E-glow.png", + height = 62, + priority = "extra-high", + shift = { + -0.6875-1.5, + -0.375-0.5 + }, + width = 60 + }, + north = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-N-glow.png", + height = 70, + priority = "extra-high", + shift = { + 0, + 0.25+1 + }, + tint = { + b = 0.75, + g = 0.85, + r = 1 + }, + width = 38 + }, + south = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-S-glow.png", + height = 40, + priority = "extra-high", + shift = { + 0, + -1.125-1 + }, + tint = nil, + width = 38 + }, + west = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-W-glow.png", + height = 64, + priority = "extra-high", + shift = { + 0.625+1.5, + -0.375-0.5 + }, + width = 60 + } + }, + heat_picture = { + east = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/east_heated.png", + frame_count = 1, + line_length = 1, + width = 128/2, + height = 128/2, + shift = {-2,-0.5}, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/east_heated.png", + frame_count = 1, + line_length = 1, + width = 128, + height = 128, + shift = {-2,-0.5}, + scale = 0.5, + }, + }, + north = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/north_heated.png", + frame_count = 1, + line_length = 1, + width = 64/2, + height = 160/2, + shift = {0,1.25}, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/north_heated.png", + frame_count = 1, + line_length = 1, + width = 64, + height = 160, + shift = {0,1.25}, + scale = 0.5, + }, + }, + south = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/south_heated.png", + frame_count = 1, + line_length = 1, + width = 64/2, + height = 64/2, + shift = {0,-2.5}, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/south_heated.png", + frame_count = 1, + line_length = 1, + width = 64, + height = 64, + shift = {0,-2.5}, + scale = 0.5, + }, + }, + west = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/west_heated.png", + frame_count = 1, + line_length = 1, + width = 128/2, + height = 128/2, + shift = {2,-0.5}, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/west_heated.png", + frame_count = 1, + line_length = 1, + width = 128, + height = 128, + shift = {2,-0.5}, + scale = 0.5, + }, + }, + }, + heat_pipe_covers = { + east = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings-heated.png", + frame_count = 1, + height = 32, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings-heated.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 64, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 32, + y = 0 + }, + north = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings-heated.png", + frame_count = 1, + height = 32, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings-heated.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 0, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 0, + y = 0 + }, + south = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings-heated.png", + frame_count = 1, + height = 32, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings-heated.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 128, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 64, + y = 0 + }, + west = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings-heated.png", + frame_count = 1, + height = 32, + tint = glow_tint, + blend_mode = "additive", + hr_version = { + tint = glow_tint, + blend_mode = "additive", + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings-heated.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 192, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 96, + y = 0 + } + }, + max_temperature = 10000, + max_transfer = "2GW", + min_working_temperature = 5000, + minimum_glow_temperature = 350, + pipe_covers = { + east = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings.png", + frame_count = 1, + height = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 64, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 32, + y = 0 + }, + north = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings.png", + frame_count = 1, + height = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 0, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 0, + y = 0 + }, + south = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings.png", + frame_count = 1, + height = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 128, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 64, + y = 0 + }, + west = { + filename = "__base__/graphics/entity/heat-exchanger/heatex-endings.png", + frame_count = 1, + height = 32, + hr_version = { + filename = "__base__/graphics/entity/heat-exchanger/hr-heatex-endings.png", + frame_count = 1, + height = 64, + priority = "high", + scale = 0.5, + width = 64, + x = 192, + y = 0 + }, + priority = "high", + scale = 1, + width = 32, + x = 96, + y = 0 + } + }, + specific_heat = "1MJ", + type = "heat" + }, + fire = {}, + fire_glow = {}, + flags = { + "placeable-neutral", + "player-creation" + }, + fluid_box = { + base_area = 10, + base_level = -1, + filter = "water", + height = 2, + pipe_connections = { + { + position = { + -3, + 1 + }, + type = "input-output" + }, + { + position = { + 3, + 1 + }, + type = "input-output" + } + }, + pipe_covers = { + east = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-east.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-east.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-east-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-east-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + }, + north = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-north.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-north.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-north-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-north-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + }, + south = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-south.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-south.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-south-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-south-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + }, + west = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-west.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-west.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-west-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-west-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + } + }, + production_type = "input-output" + }, + max_health = 500, + minable = { + mining_time = 0.1, + result = data_util.mod_prefix .. "big-heat-exchanger", + }, + mode = "output-to-separate-pipe", + output_fluid_box = { + base_area = 10, + base_level = 1, + filter = "steam", + height = 2, + pipe_connections = { + { + position = { + 0, + -3 + }, + type = "output" + } + }, + pipe_covers = { + east = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-east.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-east.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-east-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-east-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + }, + north = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-north.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-north.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-north-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-north-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + }, + south = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-south.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-south.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-south-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-south-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + }, + west = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-west.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-west.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-west-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-west-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + } + }, + production_type = "output" + }, + resistances = { + { + percent = 90, + type = "fire" + }, + { + percent = 30, + type = "explosion" + }, + { + percent = 30, + type = "impact" + } + }, + structure = { + east = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/east.png", + frame_count = 1, + line_length = 1, + width = 384/2, + height = 384/2, + shift = {0,-0.5}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/east.png", + frame_count = 1, + line_length = 1, + width = 384, + height = 384, + shift = {0,-0.5}, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/east_shadow.png", + frame_count = 1, + line_length = 1, + width = 512/2, + height = 352/2, + shift = {1,0.25}, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/east_shadow.png", + frame_count = 1, + line_length = 1, + width = 512, + height = 352, + shift = {1,0.25}, + scale = 0.5, + }, + }, + } + }, + north = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/north.png", + frame_count = 1, + line_length = 1, + width = 384/2, + height = 384/2, + shift = {0,-0.5}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/north.png", + frame_count = 1, + line_length = 1, + width = 384, + height = 384, + shift = {0,-0.5}, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/north_shadow.png", + frame_count = 1, + line_length = 1, + width = 512/2, + height = 320/2, + shift = {1.5,0.5}, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/north_shadow.png", + frame_count = 1, + line_length = 1, + width = 512, + height = 320, + shift = {1.5,0.5}, + scale = 0.5, + }, + }, + } + }, + south = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/south.png", + frame_count = 1, + line_length = 1, + width = 384/2, + height = 384/2, + shift = {0,-0.5}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/south.png", + frame_count = 1, + line_length = 1, + width = 384, + height = 384, + shift = {0,-0.5}, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/south_shadow.png", + frame_count = 1, + line_length = 1, + width = 512/2, + height = 256/2, + shift = {1.5,0.5}, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/south_shadow.png", + frame_count = 1, + line_length = 1, + width = 512, + height = 256, + shift = {1.5,0.5}, + scale = 0.5, + }, + }, + } + }, + west = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/west.png", + frame_count = 1, + line_length = 1, + width = 384/2, + height = 384/2, + shift = {0,-0.5}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/west.png", + frame_count = 1, + line_length = 1, + width = 384, + height = 384, + shift = {0,-0.5}, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/sr/west_shadow.png", + frame_count = 1, + line_length = 1, + width = 448/2, + height = 352/2, + shift = {1,0.25}, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-heat-exchanger/hr/west_shadow.png", + frame_count = 1, + line_length = 1, + width = 448, + height = 352, + shift = {1,0.25}, + scale = 0.5, + }, + }, + } + } + }, + target_temperature = 5000, + vehicle_impact_sound = { + { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-2.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-3.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-4.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-5.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-6.ogg", + volume = 0.5 + } + }, + water_reflection = { + orientation_to_variation = true, + pictures = { + filename = "__base__/graphics/entity/boiler/boiler-reflection.png", + height = 32, + priority = "extra-high", + scale = 5, + shift = { + 0.15625, + 0.9375 + }, + variation_count = 4, + width = 28 + }, + rotate = false + }, + working_sound = { + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + filename = "__base__/sound/boiler.ogg", + volume = 0.8 + } + } + } +}) +local he = data.raw.boiler[data_util.mod_prefix .. "big-heat-exchanger"] +data_util.tint_recursive(he.energy_source.pipe_covers, pipe_tint) +data_util.tint_recursive(he.energy_source.heat_pipe_covers, glow_tint) +data_util.blend_mode_recursive(he.energy_source.heat_pipe_covers, "additive") diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/big-turbine.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/big-turbine.lua new file mode 100644 index 0000000..77fc637 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/big-turbine.lua @@ -0,0 +1,564 @@ +local data_util = require("data_util") +--[[ +fluid box connections don't need to line up just find the right entity. +furnace is the placed entity, short but wide, outputs at front +Outpts piped heat to the turbine +turbine ies long and thin, collects from side + +has a connection top and right +always goes on the bottom or left +move horizontal version down 1 pixel so animation shows + +if the turbine is aove the the animation won't work +make sure furnace has outputs at both lockations +]]-- +local selectable = false + +local fan = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/sr/fan.png", + frame_count = 4, + line_length = 4, + width = 656/4/2, + height = 116/2, + run_mode = "backward", + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/hr/fan.png", + frame_count = 4, + line_length = 4, + width = 656/4, + height = 116, + run_mode = "backward", + scale = 0.5, + }, +} +local fan_shifts = { + north = util.by_pixel(0, -56), + south = util.by_pixel(0, -69), + east = util.by_pixel(-11, -64), + west = util.by_pixel(12, -64) +} +local fan_north = table.deepcopy(fan) +data_util.shift_recursive(fan_north, fan_shifts["north"]) +local fan_south = table.deepcopy(fan) +data_util.shift_recursive(fan_south, fan_shifts["south"]) +local fan_east = table.deepcopy(fan) +data_util.shift_recursive(fan_east, fan_shifts["east"]) +local fan_west = table.deepcopy(fan) +data_util.shift_recursive(fan_west, fan_shifts["west"]) + +local blank_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, +} +local length = 10 +local width = 7 +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "big-turbine-internal", + icon = "__space-exploration-graphics__/graphics/icons/fluid/water.png", + icon_size = 64, + order = "a", + subgroup = "spaceship-process", + energy_required = 4/60, -- try to get craft time in line with generator fluid consumption + category = "big-turbine", + ingredients = + { + {type="fluid", name="steam", amount=100, minimum_temperature = 5000}, + }, + results = { + {type="fluid", name="water", amount=78}, + {type="fluid", name="steam", amount=21, temperature = 500}, + {type="fluid", name=data_util.mod_prefix .. "decompressing-steam", amount=98, temperature = 5000}, + }, + hidden = true, + enabled = true, + allow_as_intermediate = false, + always_show_made_in = true, + }, + { + type = "item", + name = data_util.mod_prefix .. "big-turbine", + icon = "__space-exploration-graphics__/graphics/icons/big-turbine.png", + icon_size = 64, + order = "d[fluid-burner-generator]-a", + subgroup = "energy", + stack_size = 50, + place_result = data_util.mod_prefix .. "big-turbine", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "big-turbine", + result = data_util.mod_prefix .. "big-turbine", + enabled = false, + energy_required = 60, + ingredients = { + { data_util.mod_prefix .. "lattice-pressure-vessel", 10 }, + { data_util.mod_prefix .. "nanomaterial", 10 }, + { data_util.mod_prefix .. "space-pipe", 50 }, + { data_util.mod_prefix .. "heavy-composite", 20 }, + { data_util.mod_prefix .. "heat-shielding", 50 }, + { data_util.mod_prefix .. "holmium-solenoid", 20 }, + { data_util.mod_prefix .. "superconductive-cable", 20 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "technology", + name = data_util.mod_prefix .. "big-turbine", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "big-turbine", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/big-turbine.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "big-heat-exchanger", + data_util.mod_prefix .. "heavy-assembly", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + } + }, + }, + { + type = "storage-tank", + name = data_util.mod_prefix .. "big-turbine-tank", + icon = "__space-exploration-graphics__/graphics/icons/big-turbine.png", + icon_size = 64, + flags = {"placeable-player", "player-creation", "not-deconstructable", "not-blueprintable"}, + max_health = 500, + order = "zz", + collision_box = {{-1.5, -0.25},{1.5, 0.25}}, + selection_box = {{-1.5, -0.25},{1.5, 0.25}}, + collision_mask = {"not-colliding-with-itself"}, + se_allow_in_space = true, + selectable_in_game = selectable, + selection_priority = 53, + fluid_box = + { + filter = data_util.mod_prefix .. "decompressing-steam", + base_area = 10, -- gets multiplied by 100 by engine + base_level = 0, -- pull fluid in + pipe_connections = + { + { position = {0, -1} }, -- connects to generator + { position = {1, -1} }, -- connects to furnace + { position = {-1, -1} }, -- connects to furnace + }, + }, + window_bounding_box = {{-0.0, 0.0}, {0.0, 1.0}}, + pictures = { + picture = blank_image, + window_background = blank_image, + fluid_background = blank_image, + flow_sprite = blank_image, + gas_flow = blank_image, + }, + flow_length_in_ticks = 360, + circuit_wire_max_distance = 0 + }, + { + type = "generator", + name = data_util.mod_prefix .. "big-turbine-generator", + icon = "__space-exploration-graphics__/graphics/icons/big-turbine.png", + icon_size = 64, + alert_icon_shift = { 0, 0.375 }, + burns_fluid = false, + scale_fluid_usage = true, + max_power_output = "1GW", + fluid_usage_per_tick = 25, + selectable_in_game = selectable, + selection_priority = 52, + --collision_box = { { -1.25, -1.6 }, { 1.25, 1.6 } }, -- short and wide thin + collision_box = { { -(width/2-0.25), -(length/2-0.9) }, { (width/2-0.25), (length/2-0.9) } }, + --selection_box = { { -1.5, -2.5 }, { 1.5, 2.5 } }, + selection_box = { { -width/2, -(length/2-0.5) }, { width/2, (length/2-0.5) } }, + collision_mask = {"not-colliding-with-itself"}, + order = "zzz", + corpse = "big-remnants", + dying_explosion = "medium-explosion", + effectivity = 1, + energy_source = { type = "electric", usage_priority = "secondary-output" }, + fast_replaceable_group = "steam-engine", + flags = { "placeable-neutral", "player-creation", "placeable-off-grid" }, + fluid_box = { + base_area = 20, + base_level = -1, + filter = data_util.mod_prefix .. "decompressing-steam", + --filter = "steam", + height = 2, + minimum_temperature = 5000, + pipe_connections = { + { + position = { 0, (length/2-0.75) }, + type = "input-output" + }, + { + position = { 0, -(length/2-0.75) }, + type = "input-output" + }, + }, + production_type = "input-output" + }, + horizontal_animation = blank_image, + max_health = 300, + maximum_temperature = 5000, + min_perceived_performance = 0.25, + performance_to_sound_speedup = 0.5, + resistances = { + { + percent = 70, + type = "fire" + } + }, + smoke = { + { + east_position = { + 0.75, + -0.75 + }, + frequency = 0.3125, + name = "turbine-smoke", + north_position = { + 0, + -1 + }, + slow_down_factor = 1, + starting_frame_deviation = 60, + starting_vertical_speed = 0.08 + } + }, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + vertical_animation = blank_image, + working_sound = { + match_speed_to_activity = true, + sound = { + filename = "__base__/sound/steam-engine-90bpm.ogg", + volume = 0.6 + } + } + }, + { + type = "furnace", + name = data_util.mod_prefix .. "big-turbine", + icon = "__space-exploration-graphics__/graphics/icons/big-turbine.png", + --collision_box = { { -1.3, -2.15 }, { 1.3, 2.15 } }, + collision_box = { { -(width/2-0.2), -(length/2-0.35) }, { (width/2-0.2), (length/2-0.35) } }, + --selection_box = { { -1.5, -2.5 }, { 1.5, 2.5 } }, + selection_box = { { -width/2, -length/2 }, { width/2, length/2 } }, + selection_priority = 50, + fluid_boxes = + { + { + production_type = "input", + filter = "steam", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 40, + base_level = -1, + filter = "steam", + pipe_connections = { + { type="input-output", position = {0, -(length/2+0.5)} } + }, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 20, + base_level = 1, + filter = "water", + pipe_connections = { + { type="output", position = {(width/2+0.5), 1.5} }, + { type="output", position = {(width/2+0.5), -1.5} }, + { type="output", position = {-(width/2+0.5), 1.5} }, + { type="output", position = {-(width/2+0.5), -1.5} }, + }, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 20, + base_level = 1, + filter = "steam", + pipe_connections = { + { type="output", position = {0, (length/2+0.5)} }, + }, + secondary_draw_orders = { north = -1 } + }, + { + filter = data_util.mod_prefix .. "decompressing-steam", + --filter = "steam", + production_type = "output", + --pipe_picture = assembler3pipepictures(), + base_area = 20, + base_level = 1, + pipe_connections = { + { type="output", position = {1, length/2 - 0.25} }, + { type="output", position = {-1, length/2 - 0.25} }, + }, + secondary_draw_orders = { north = -1 } + }, + }, + minable = { + mining_time = 0.3, + result = data_util.mod_prefix .. "big-turbine", + }, + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + max_health = 800, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + drawing_box = {{-2, -5}, {2, 5}}, + resistances = { + { type = "poison", percent = 100 }, + { type = "fire", percent = 80 }, + { type = "explosion", percent = 50 } + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + filename = "__base__/sound/steam-engine-90bpm.ogg", + volume = 0.6 + } + }, + always_draw_idle_animation = true, + source_inventory_size = 0, + result_inventory_size = 0, + animation = nil, + idle_animation = { + east = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/sr/east.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 640/2, + height = 480/2, + shift = {0,-0.25}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/hr/east.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 640, + height = 480, + shift = {0,-0.25}, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/sr/east_shadow.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 832/2, + height = 384/2, + shift = {1.5,0.5}, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/hr/east_shadow.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 832, + height = 384, + shift = {1.5,0.5}, + scale = 0.5, + }, + }, + } + }, + west = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/sr/west.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 640/2, + height = 480/2, + shift = {0,-0.25}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/hr/west.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 640, + height = 480, + shift = {0,-0.25}, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/sr/west_shadow.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 832/2, + height = 384/2, + shift = {1.5,0.5}, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/hr/west_shadow.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 832, + height = 384, + shift = {1.5,0.5}, + scale = 0.5, + }, + }, + } + }, + north = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/sr/north.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 448/2, + height = 672/2, + shift = {0,-0.25}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/hr/north.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 448, + height = 672, + shift = {0,-0.25}, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/sr/north_shadow.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 640/2, + height = 576/2, + shift = {1.5,0.5}, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/hr/north_shadow.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 640, + height = 576, + shift = {1.5,0.5}, + scale = 0.5, + }, + }, + } + }, + south = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/sr/south.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 448/2, + height = 672/2, + shift = {0,-0.25}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/hr/south.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 448, + height = 672, + shift = {0,-0.25}, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/sr/south_shadow.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 640/2, + height = 576/2, + shift = {1.5,0.5}, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/big-turbine/hr/south_shadow.png", + frame_count = 1, + line_length = 1, + repeat_count = 4, + width = 640, + height = 576, + shift = {1.5,0.5}, + scale = 0.5, + }, + }, + } + }, + }, + crafting_categories = {"big-turbine"}, + crafting_speed = 1, + energy_source = + { + type = "void", + }, + energy_usage = "0.1W", + ingredient_count = 0, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {}, + working_visualisations = { + {east_animation = fan_east, + always_draw = true}, + {west_animation = fan_west, + always_draw = true}, + {north_animation = fan_north, + always_draw = true}, + {south_animation = fan_south, + always_draw = true}, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/delivery-cannon.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/delivery-cannon.lua new file mode 100644 index 0000000..ecb1cdf --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/delivery-cannon.lua @@ -0,0 +1,956 @@ +local data_util = require("data_util") + +local blank = { + direction_count = 8, + frame_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + priority = "low" +} + +data:extend({ + + { + type = "technology", + name = data_util.mod_prefix .. "delivery-cannon", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "delivery-cannon", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "delivery-cannon-chest", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "delivery-cannon-capsule", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/delivery-cannon.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "meteor-defence", + data_util.mod_prefix .. "rocket-landing-pad", + }, + unit = { + count = 200, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "delivery-cannon-capsule-iridium", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "delivery-cannon-capsule-iridium", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/delivery-cannon.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "delivery-cannon", + data_util.mod_prefix .. "material-science-pack-1" + }, + unit = { + count = 100, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "delivery-cannon-weapon", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "delivery-cannon-weapon", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "delivery-cannon-weapon-capsule", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/delivery-cannon-weapon.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "military-4", + data_util.mod_prefix .. "delivery-cannon", + data_util.mod_prefix .. "heavy-girder", + data_util.mod_prefix .. "holmium-cable", + data_util.mod_prefix .. "aeroframe-pole", + }, + unit = { + count = 200, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "military-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + + { + type = "item", + name = data_util.mod_prefix .. "delivery-cannon", + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon.png", + icon_size = 64, + order = "j-a", + subgroup = "rocket-logistics", + stack_size = 20, + place_result = data_util.mod_prefix .. "delivery-cannon", + }, + { + type = "item", + name = data_util.mod_prefix .. "delivery-cannon-weapon", + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon-weapon.png", + icon_size = 64, + order = "j-a", + subgroup = "surface-defense", + stack_size = 1, + place_result = data_util.mod_prefix .. "delivery-cannon-weapon", + }, + { + type = "item", + name = data_util.mod_prefix .. "delivery-cannon-chest", + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon-chest.png", + icon_size = 64, + order = "j-b", + subgroup = "rocket-logistics", + stack_size = 50, + place_result = data_util.mod_prefix .. "delivery-cannon-chest", + }, + { + type = "item", + name = data_util.mod_prefix .. "delivery-cannon-capsule", + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon-capsule.png", + icon_size = 64, + order = "j-c", + subgroup = "rocket-logistics", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "delivery-cannon-weapon-capsule", + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon-weapon-capsule.png", + icon_size = 64, + order = "j-c", + subgroup = "surface-defense", + stack_size = 20, + }, + { + type = "selection-tool", + name = data_util.mod_prefix .. "delivery-cannon-targeter", + icon = "__space-exploration-graphics__/graphics/icons/target.png", + icon_mipmaps = 1, + icon_size = 64, + subgroup = "tool", + order = "c[automated-construction]-e[unit-remote-control]", + stack_size = 1, + stackable = false, + selection_color = {r = 0.3, g = 0.9, b = 0.3}, + alt_selection_color = {r = 0.9, g = 0.9, b = 0.3}, + selection_mode = {"nothing"}, + alt_selection_mode = {"nothing"}, + selection_cursor_box_type = "entity", + alt_selection_cursor_box_type = "entity", + hidden = true, + flags = {"hidden", "only-in-cursor"} + }, + + { + type = "recipe", + name = data_util.mod_prefix .. "delivery-cannon-capsule", + result = data_util.mod_prefix .. "delivery-cannon-capsule", + enabled = false, + energy_required = 10, + ingredients = { + { "low-density-structure", 1 }, + { data_util.mod_prefix .. "heat-shielding", 1 }, + { "explosives", 5 }, + { "copper-cable", 10 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "delivery-cannon-capsule-iridium", + result = data_util.mod_prefix .. "delivery-cannon-capsule", + enabled = false, + energy_required = 10, + ingredients = { + { data_util.mod_prefix .. "iridium-plate", 5 }, + { "explosives", 5 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "delivery-cannon-weapon-capsule", + result = data_util.mod_prefix .. "delivery-cannon-weapon-capsule", + enabled = false, + energy_required = 20, + ingredients = { + { "low-density-structure", 10 }, + { data_util.mod_prefix .. "heat-shielding", 10 }, + { data_util.mod_prefix .. "iridium-plate", 10 }, + { data_util.mod_prefix .. "holmium-cable", 20 }, + { "explosives", 50 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "delivery-cannon", + result = data_util.mod_prefix .. "delivery-cannon", + enabled = false, + energy_required = 10, + ingredients = { + { "steel-chest", 10 }, + { "pipe", 10 }, + { "electric-engine-unit", 10 }, + { data_util.mod_prefix .. "heat-shielding", 10 }, + { "concrete", 20 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "delivery-cannon-weapon", + result = data_util.mod_prefix .. "delivery-cannon-weapon", + enabled = false, + energy_required = 30, + ingredients = { + { "electric-engine-unit", 50 }, + { data_util.mod_prefix .. "heat-shielding", 50 }, + { data_util.mod_prefix .. "heavy-girder", 100 }, + { data_util.mod_prefix .. "holmium-cable", 200 }, + { data_util.mod_prefix .. "aeroframe-pole", 200 }, + { "processing-unit", 100 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "delivery-cannon-chest", + result = data_util.mod_prefix .. "delivery-cannon-chest", + enabled = false, + energy_required = 10, + ingredients = { + { "radar", 1 }, + { "steel-chest", 10 }, + { "concrete", 20 }, + { data_util.mod_prefix .. "heat-shielding", 10 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + + { + type = "assembling-machine", + name = data_util.mod_prefix.."delivery-cannon", + minable = { + mining_time = 0.5, + result = data_util.mod_prefix.."delivery-cannon", + }, + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon.png", + icon_size = 64, + icon_mipmaps = 1, + order = "a-a", + max_health = 1500, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-2.3, -2.3}, {2.3, 2.3}}, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + drawing_box = {{-2.5, -2.5-5}, {2.5, 2.5}}, + se_allow_in_space = true, + resistances = + { + { type = "meteor", percent = 99 }, + { type = "explosion", percent = 99 }, + { type = "impact", percent = 99 }, + { type = "fire", percent = 99 }, + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer -- not spaceship + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/delivery-cannon.png", + frame_count = 1, + line_length = 1, + width = 320/2, + height = 640/2, + shift = {0,-2.5}, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/hr-delivery-cannon.png", + frame_count = 1, + line_length = 1, + width = 320, + height = 640, + shift = {0,-2.5}, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/delivery-cannon-shadow.png", + shift = { 1.25, 1/32 }, + width = 470/2, + height = 306/2, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/hr-delivery-cannon-shadow.png", + shift = { 1.25, 1/32 }, + width = 470, + height = 306, + scale = 0.5, + } + } + } + }, + crafting_categories = {"delivery-cannon"}, + crafting_speed = 1, + energy_source = + { + type = "void", + }, + energy_usage = "100kW", + ingredient_count = 12, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {}, + }, + { + type = "electric-energy-interface", + name = data_util.mod_prefix .. "delivery-cannon-energy-interface", + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon.png", + icon_size = 64, + icon_mipmaps = 1, + order = "z-d-a", + allow_copy_paste = true, + picture = + { + layers = + { + blank + }, + }, + collision_box = {{-2.3, -2.3}, {2.3, 2.3}}, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + selectable_in_game = false, + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + selectable = false, + continuous_animation = true, + corpse = "medium-remnants", + energy_source = { + type = "electric", + usage_priority = "secondary-input", + input_flow_limit = "50MW", + output_flow_limit = "0kW", + buffer_capacity = "1000MJ",-- launch energy cost is removed from buffer + drain = "100kW", + }, + energy_production = "0kW", + energy_usage = "0GW", + flags = { + "placeable-player", + "player-creation", + "hidden", + "not-rotatable" + }, + max_health = 1500, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + }, + + { + type = "assembling-machine", + name = data_util.mod_prefix.."delivery-cannon-weapon", + minable = { + mining_time = 1, + result = data_util.mod_prefix.."delivery-cannon-weapon", + }, + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon-weapon.png", + icon_size = 64, + icon_mipmaps = 1, + order = "a-a", + max_health = 1500, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = { { -4.3, -4.3 }, { 4.3, 4.3 } }, + selection_box = { { -4.5, -4.5 }, { 4.5, 4.5 } }, + drawing_box = { { -4.5, -4.5-9 }, { 4.5, 4.5 } }, + se_allow_in_space = true, + resistances = + { + { type = "meteor", percent = 99 }, + { type = "explosion", percent = 50 }, + { type = "impact", percent = 99 }, + { type = "fire", percent = 50 }, + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer -- not spaceship + }, + animation = + { + layers = { + { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/delivery-cannon-weapon.png", + shift = { 0, -4.75 }, + width = 616/2, + height = 1198/2, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/hr-delivery-cannon-weapon.png", + shift = { 0, -4.75 }, + width = 616, + height = 1198, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/delivery-cannon-weapon-shadow.png", + shift = { 2.5, 2/32 }, + width = 890/2, + height = 578/2, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/hr-delivery-cannon-weapon-shadow.png", + shift = { 2.5, 2/32 }, + width = 890, + height = 578, + scale = 0.5, + } + } + } + }, + crafting_categories = {"delivery-cannon-weapon"}, + crafting_speed = 1, + energy_source = + { + type = "void", + }, + energy_usage = "100kW", + ingredient_count = 12, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {}, + }, + { + type = "electric-energy-interface", + name = data_util.mod_prefix .. "delivery-cannon-weapon-energy-interface", + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon-weapon.png", + icon_size = 64, + icon_mipmaps = 1, + order = "z-d-a", + allow_copy_paste = true, + picture = + { + layers = + { + blank + }, + }, + collision_box = { { -4.3, -4.3 }, { 4.3, 4.3 } }, + selection_box = { { -4.5, -4.5 }, { 4.5, 4.5 } }, + selectable_in_game = false, + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + selectable = false, + continuous_animation = true, + corpse = "medium-remnants", + energy_source = { + type = "electric", + usage_priority = "secondary-input", + input_flow_limit = "500MW", + output_flow_limit = "0kW", + buffer_capacity = "10000MJ",-- launch energy cost is removed from buffer + drain = "1000kW", + }, + energy_production = "0kW", + energy_usage = "0GW", + flags = { + "placeable-player", + "player-creation", + "hidden", + "not-rotatable" + }, + max_health = 1500, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + }, + + { + type = "container", + name = data_util.mod_prefix .. "delivery-cannon-chest", + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon-chest.png", + icon_size = 64, + flags = {"placeable-neutral", "player-creation"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "delivery-cannon-chest"}, + max_health = 1000, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + collision_box = {{-1.3,-1.3},{1.3,1.3}}, + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer -- not spaceship + }, + selection_box = {{-1.5,-1.5},{1.5,1.5}}, + se_allow_in_space = true, + inventory_size = 40, + resistances = { + { type = "meteor", percent = 99 }, + { type = "explosion", percent = 75 }, + { type = "impact", percent = 90 }, + { type = "fire", percent = 90 }, + }, + open_sound = { filename = "__base__/sound/metallic-chest-open.ogg", volume=0.65 }, + close_sound = { filename = "__base__/sound/metallic-chest-close.ogg", volume = 0.7 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + picture = { + layers = { + { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/delivery-cannon-chest.png", + frame_count = 1, + line_length = 1, + width = 208/2, + height = 200/2, + shift = {0,0}, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/hr-delivery-cannon-chest.png", + frame_count = 1, + line_length = 1, + width = 208, + height = 200, + shift = {0,0}, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/delivery-cannon-chest-shadow.png", + frame_count = 1, + line_length = 1, + width = 278/2, + height = 150/2, + shift = {0.5625,0.5875}, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/hr-delivery-cannon-chest-shadow.png", + frame_count = 1, + line_length = 1, + width = 278, + height = 150, + shift = {0.5625,0.5875}, + scale = 0.5, + }, + }, + } + }, + circuit_wire_connection_point = + { + shadow = + { + red = {0.7, -1.3}, + green = {0.7, -1.3}, + }, + wire = + { + red = {0.7, -1.3}, + green = {0.7, -1.3}, + } + }, + circuit_wire_max_distance = 12.5, + }, + + { + type = "explosion", + name = data_util.mod_prefix .. "delivery-cannon-beam", + animations = { + { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/delivery-cannon-beam.png", + frame_count = 6, + height = 1, + priority = "extra-high", + width = 187 + } + }, + beam = true, + flags = { "not-on-map", "placeable-off-grid"}, + light = { + color = { + b = 0.8, + g = 1, + r = 0.9 + }, + intensity = 1, + size = 20 + }, + rotate = true, + smoke = "smoke-fast", + smoke_count = 2, + smoke_slow_down_factor = 1, + sound = { + { + filename = "__base__/sound/fight/old/huge-explosion.ogg", + volume = 1 + } + }, + }, + { + type = "explosion", + name = data_util.mod_prefix .. "delivery-cannon-weapon-beam", + animations = { + { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/delivery-cannon-weapon-beam.png", + frame_count = 6, + height = 1, + priority = "extra-high", + width = 187 + } + }, + beam = true, + flags = { "not-on-map", "placeable-off-grid"}, + light = { + color = { + b = 0.8, + g = 0.9, + r = 1 + }, + intensity = 1, + size = 20 + }, + rotate = true, + smoke = "smoke-fast", + smoke_count = 2, + smoke_slow_down_factor = 1, + sound = { + { + filename = "__base__/sound/fight/old/huge-explosion.ogg", + volume = 1 + } + }, + }, + { + type = "projectile", + name = data_util.mod_prefix.."delivery-cannon-capsule-projectile", + acceleration = 0, + rotatable = false, + animation = { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/delivery-cannon-capsule.png", + frame_count = 1, + width = 58/2, + height = 94/2, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/hr-delivery-cannon-capsule.png", + frame_count = 1, + width = 58, + height = 94, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + scale = 0.5, + }, + }, + flags = { "not-on-map", "placeable-off-grid"}, + light = { intensity = 0.2, size = 10}, + smoke = { + { + deviation = { + 0.15, + 0.15 + }, + frequency = 1, + name = "smoke-fast", + --name = "smoke-explosion-particle", + --name = "soft-fire-smoke", -- lasts longer + position = {0,0}, + slow_down_factor = 1, + starting_frame = 3, + starting_frame_deviation = 5, + starting_frame_speed = 0, + starting_frame_speed_deviation = 5 + } + }, + }, + { + type = "projectile", + name = data_util.mod_prefix.."delivery-cannon-weapon-capsule-projectile", + acceleration = 0, + rotatable = false, + animation = { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/delivery-cannon-weapon-capsule.png", + frame_count = 1, + width = 58/2, + height = 94/2, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/hr-delivery-cannon-weapon-capsule.png", + frame_count = 1, + width = 58, + height = 94, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + scale = 0.5, + }, + }, + flags = { "not-on-map", "placeable-off-grid"}, + light = { intensity = 0.2, size = 10}, + smoke = { + { + deviation = { + 0.15, + 0.15 + }, + frequency = 1, + name = "smoke-fast", + --name = "smoke-explosion-particle", + --name = "soft-fire-smoke", -- lasts longer + position = {0,0}, + slow_down_factor = 1, + starting_frame = 3, + starting_frame_deviation = 5, + starting_frame_speed = 0, + starting_frame_speed_deviation = 5 + } + }, + }, + { + type = "projectile", + name = data_util.mod_prefix.."delivery-cannon-capsule-shadow", + acceleration = 0, + rotatable = false, + animation = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/delivery-cannon-capsule-shadow.png", + frame_count = 1, + width = 98/2, + height = 50/2, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/delivery-cannon/hr-delivery-cannon-capsule-shadow.png", + frame_count = 1, + width = 98, + height = 50, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + scale = 0.5, + }, + }, + flags = { "not-on-map", "placeable-off-grid"}, + }, + { + type = "explosion", + name = data_util.mod_prefix.."delivery-cannon-capsule-explosion", + animations = table.deepcopy(data.raw.explosion["medium-explosion"].animations), + created_effect = { + type = "direct", + action_delivery = { + type = "instant", + target_effects = { + { + type = "create-particle", + particle_name = "explosion-remnants-particle", + initial_height = 0.5, + initial_vertical_speed = 0.08, + initial_vertical_speed_deviation = 0.08, + offset_deviation = { { -0.2, -0.2 }, { 0.2, 0.2 } }, + repeat_count = 16, + speed_from_center = 0.08, + speed_from_center_deviation = 0.08, + }, + { + type = "create-particle", + particle_name = "stone-particle", + initial_height = 0.5, + initial_vertical_speed = 0.1, + initial_vertical_speed_deviation = 0.1, + offset_deviation = { { -0.2, -0.2 }, { 0.2, 0.2 } }, + repeat_count = 60, + speed_from_center = 0.08, + speed_from_center_deviation = 0.08, + }, + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 5, + type = "meteor" + }, + type = "damage" + }, + }, + type = "instant" + }, + radius = 10, + type = "area" + }, + type = "nested-result" + }, + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 10, + type = "meteor" + }, + type = "damage" + }, + }, + type = "instant" + }, + radius = 4, + type = "area" + }, + type = "nested-result" + }, + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 35, + type = "meteor" + }, + type = "damage" + }, + }, + type = "instant" + }, + radius = 2, + type = "area" + }, + type = "nested-result" + }, + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 100, + type = "meteor" + }, + type = "damage" + }, + }, + type = "instant" + }, + radius = 1, + type = "area" + }, + type = "nested-result" + }, + }, + }, + }, + flags = { "not-on-map", "placeable-off-grid"}, + light = { color = { r = 1, g = 0.9, b = 0.8 }, intensity = 1, size = 30 }, + sound = { + aggregation = { max_count = 1, remove = true }, + variations = table.deepcopy(data.raw.explosion["medium-explosion"].sound.variations) + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/electric-boiler.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/electric-boiler.lua new file mode 100644 index 0000000..359ae78 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/electric-boiler.lua @@ -0,0 +1,396 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "electric-boiler", + icon = "__space-exploration-graphics__/graphics/icons/electric-boiler.png", + icon_size = 64, + order = "b-a-z", + subgroup = "energy", + stack_size = 50, + place_result = data_util.mod_prefix .. "electric-boiler", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "electric-boiler", + result = data_util.mod_prefix .. "electric-boiler", + enabled = false, + energy_required = 3, + ingredients = { + { "copper-plate", 100 }, + { "steel-plate", 10 }, + { "pipe", 10 }, + { data_util.mod_prefix .. "heat-shielding", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "technology", + name = data_util.mod_prefix .. "electric-boiler", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "electric-boiler" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "electric-boiling-void" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "electric-boiling-steam-100" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "electric-boiling-steam-165" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "electric-boiling-steam-500" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "electric-boiling-steam-5000" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "steam-to-water" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/electric-boiler.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "heat-shielding", + }, + unit = { + count = 100, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "electric-boiler", + icon = "__space-exploration-graphics__/graphics/icons/electric-boiler.png", + icon_size = 64, + flags = {"placeable-neutral", "player-creation"}, + minable = { mining_time = 0.2, result = data_util.mod_prefix .. "electric-boiler"}, + max_health = 200, + corpse = "boiler-remnants", + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + resistances = + { + { + type = "fire", + percent = 90 + }, + { + type = "explosion", + percent = 30 + }, + { + type = "impact", + percent = 30 + } + }, + collision_box = {{-1.29, -0.79}, {1.29, 0.79}}, + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + }, + se_allow_in_space = true, + selection_box = {{-1.5, -1}, {1.5, 1}}, + target_temperature = 500, + + fluid_boxes = + { + { + base_area = 1, + height = 2, + base_level = -1, + pipe_covers = pipecoverspictures(), + pipe_connections = + { + {type = "input-output", position = {-2, 0.5}}, + {type = "input-output", position = {2, 0.5}} + }, + production_type = "input", + filter = "water" + }, + { + base_area = 1, + height = 2, + base_level = 1, + pipe_covers = pipecoverspictures(), + pipe_connections = + { + {type = "output", position = {0, -1.5}} + }, + production_type = "output", + filter = "steam" + }, + off_when_no_fluid_recipe = true + }, + + energy_usage = "5MW", + crafting_categories = {data_util.mod_prefix .. "electric-boiling"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + --drain = "10MW", + usage_priority = "secondary-input" + }, + working_sound = + { + sound = + { + filename = "__base__/sound/boiler.ogg", + volume = 0.8 + }, + max_sounds_per_type = 3 + }, + animation = { + + north = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-n.png", + priority = "extra-high", + width = 268/2, + height = 220/2, + shift = util.by_pixel(-1.25, 5.25), + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-n.png", + width = 268, + height = 220, + priority = "extra-high", + shift = util.by_pixel(-1.25, 5.25), + scale = 0.5, + }, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-n-shadow.png", + priority = "extra-high", + width = 274/2, + height = 164/2, + shift = util.by_pixel(20.5, 9), + draw_as_shadow = true, + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-n-shadow.png", + width = 274, + height = 164, + priority = "extra-high", + shift = util.by_pixel(20.5, 9), + draw_as_shadow = true + }, + } + } + }, + east = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-e.png", + priority = "extra-high", + width = 210/2, + height = 300/2, + shift = util.by_pixel(-1.75, 1.25), + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-e.png", + width = 210, + height = 300, + priority = "extra-high", + shift = util.by_pixel(-1.75, 1.25), + scale = 0.5, + }, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-e-shadow.png", + priority = "extra-high", + width = 184/2, + height = 194/2, + shift = util.by_pixel(30, 9.5), + draw_as_shadow = true, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-e-shadow.png", + width = 184, + height = 194, + priority = "extra-high", + shift = util.by_pixel(30, 9.5), + draw_as_shadow = true + }, + } + } + }, + south = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-s.png", + priority = "extra-high", + width = 260/2, + height = 200/2, + shift = util.by_pixel(4, 10.75), + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-s.png", + width = 260, + height = 200, + priority = "extra-high", + shift = util.by_pixel(4, 10.75), + scale = 0.5, + }, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-s-shadow.png", + priority = "extra-high", + width = 310/2, + height = 130/2, + shift = util.by_pixel(29.75, 15.75), + draw_as_shadow = true, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-s-shadow.png", + priority = "extra-high", + width = 310, + height = 130, + shift = util.by_pixel(29.75, 15.75), + draw_as_shadow = true + }, + } + } + }, + west = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-w.png", + priority = "extra-high", + width = 196/2, + height = 272/2, + shift = util.by_pixel(1.5, 7.75), + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-w.png", + width = 196, + height = 272, + priority = "extra-high", + shift = util.by_pixel(1.5, 7.75), + scale = 0.5, + }, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-w-shadow.png", + priority = "extra-high", + width = 206/2, + height = 218/2, + shift = util.by_pixel(19.5, 6.5), + draw_as_shadow = true, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-w-shadow.png", + width = 206, + height = 218, + priority = "extra-high", + shift = util.by_pixel(19.5, 6.5), + draw_as_shadow = true + }, + } + } + } + }, + working_visualisations = + { + { + north_animation = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-n-light.png", + priority = "extra-high", + width = 268/2, + height = 220/2, + shift = util.by_pixel(-1.25, 5.25), + blend_mode = "additive", + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-n-light.png", + width = 268, + height = 220, + priority = "extra-high", + shift = util.by_pixel(-1.25, 5.25), + scale = 0.5, + blend_mode = "additive", + }, + }, + } + }, + east_animation = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-e-light.png", + priority = "extra-high", + width = 210/2, + height = 300/2, + shift = util.by_pixel(-1.75, 1.25), + blend_mode = "additive", + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-e-light.png", + width = 210, + height = 300, + priority = "extra-high", + shift = util.by_pixel(-1.75, 1.25), + scale = 0.5, + blend_mode = "additive", + }, + }, + } + }, + south_animation = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-s-light.png", + priority = "extra-high", + width = 260/2, + height = 200/2, + shift = util.by_pixel(4, 10.75), + blend_mode = "additive", + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-s-light.png", + width = 260, + height = 200, + priority = "extra-high", + shift = util.by_pixel(4, 10.75), + scale = 0.5, + blend_mode = "additive", + }, + }, + } + }, + west_animation = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/electric-boiler-w-light.png", + priority = "extra-high", + width = 196/2, + height = 272/2, + shift = util.by_pixel(1.5, 7.75), + blend_mode = "additive", + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electric-boiler/hr-electric-boiler-w-light.png", + width = 196, + height = 272, + priority = "extra-high", + shift = util.by_pixel(1.5, 7.75), + scale = 0.5, + blend_mode = "additive", + }, + }, + } + } + }, + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 4, shift = {0.0, 0.0}, color = {r = 1, g = 0.9, b = 0.5}} + }, + }, + }, + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/energy-transmitter.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/energy-transmitter.lua new file mode 100644 index 0000000..6e6190e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/energy-transmitter.lua @@ -0,0 +1,2323 @@ +local data_util = require("data_util") +--[[ +Trunk 10x10, chamber connections in middle of each edge. +Branch 8x4, chamber connections in middle of each edge. Can have leaves connecting anywhere along the long sides. +Leaf 3x5, Has 1 connection in the middle 1 of the narrow sides. Must connect anywhere along the long side of a chamber. + +emitter = Maser transmitter -- storage tank? +chamber = Maser chamber -- storage tank? +Leaf = Maser injector -- assembling machine + +emitter = Maser transmitter -- assembling (anything that can be opened, maybe roboport?) +chamber = Maser chamber -- storage tank? +Leaf = Maser injector -- assembling machine, reactor + +178, 160, 76 +]] + +local specific_heat = "1GJ" +local blank = { + direction_count = 8, + frame_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + priority = "low" +} +local emitter_layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/energy-transmitter.png", + priority = "high", + width = 640/2, + height = 736/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -24), + animation_speed = 1, + scale = 1, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/energy-transmitter.png", + priority = "high", + width = 640, + height = 736, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -24), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/energy-transmitter-shadow.png", + priority = "high", + width = 354, + height = 238, + frame_count = 1, + line_length = 1, + repeat_count = 1, + shift = util.by_pixel(32, 28), + scale = 10/9, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/energy-transmitter-shadow.png", + priority = "high", + width = 709, + height = 477, + frame_count = 1, + line_length = 1, + repeat_count = 1, + shift = util.by_pixel(32, 28), + scale = 0.5*10/9, + } + }, +} +data:extend({ + { + type = "technology", + name = data_util.mod_prefix .. "energy-beaming", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-transmitter-emitter" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-transmitter-chamber" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-transmitter-injector" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-receiver" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/energy-transmitter.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "superconductive-cable", + data_util.mod_prefix .. "aeroframe-bulkhead", + }, + unit = { + count = 500, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + } + }, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "energy-receiver", + result = data_util.mod_prefix .. "energy-receiver", + enabled = false, + energy_required = 10, + ingredients = { + { "glass", 1000 }, + { "copper-plate", 1000 }, + { data_util.mod_prefix .. "heat-shielding", 100 }, + { data_util.mod_prefix .. "aeroframe-bulkhead", 100 }, + { data_util.mod_prefix .. "superconductive-cable", 20 }, + { data_util.mod_prefix .. "heavy-girder", 100 }, + { "processing-unit", 50 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "energy-transmitter-emitter", + result = data_util.mod_prefix .. "energy-transmitter-emitter", + enabled = false, + energy_required = 10, + ingredients = { + { "glass", 1000 }, + { data_util.mod_prefix .. "aeroframe-bulkhead", 100 }, + { data_util.mod_prefix .. "superconductive-cable", 200 }, + { data_util.mod_prefix .. "heavy-girder", 200 }, + { "processing-unit", 100 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "energy-transmitter-chamber", + result = data_util.mod_prefix .. "energy-transmitter-chamber", + enabled = false, + energy_required = 10, + ingredients = { + { "glass", 100 }, + { data_util.mod_prefix .. "aeroframe-bulkhead", 50 }, + { data_util.mod_prefix .. "superconductive-cable", 50 }, + { data_util.mod_prefix .. "heavy-girder", 50 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "energy-transmitter-injector", + result = data_util.mod_prefix .. "energy-transmitter-injector", + enabled = false, + energy_required = 10, + ingredients = { + { "glass", 100 }, + { data_util.mod_prefix .. "aeroframe-bulkhead", 100 }, + { data_util.mod_prefix .. "superconductive-cable", 100 }, + { data_util.mod_prefix .. "heavy-girder", 100 }, + { "processing-unit", 50 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "item", + name = data_util.mod_prefix .. "energy-receiver", + icon = "__space-exploration-graphics__/graphics/icons/energy-receiver.png", + icon_size = 64, + order = "b-a", + subgroup = "beaming", + stack_size = 1, + place_result = data_util.mod_prefix .. "energy-receiver", + }, + { + type = "item", + name = data_util.mod_prefix .. "energy-transmitter-emitter", + icon = "__space-exploration-graphics__/graphics/icons/energy-transmitter.png", + icon_size = 64, + order = "a-a", + subgroup = "beaming", + stack_size = 1, + place_result = data_util.mod_prefix .. "energy-transmitter-emitter", + }, + { + type = "item", + name = data_util.mod_prefix .. "energy-transmitter-chamber", + icon = "__space-exploration-graphics__/graphics/icons/energy-transmitter-chamber.png", + icon_size = 64, + order = "a-b", + subgroup = "beaming", + stack_size = 10, + place_result = data_util.mod_prefix .. "energy-transmitter-chamber", + }, + { + type = "item", + name = data_util.mod_prefix .. "energy-transmitter-injector", + icon = "__space-exploration-graphics__/graphics/icons/energy-transmitter-injector.png", + icon_size = 64, + order = "a-c", + subgroup = "beaming", + stack_size = 50, + place_result = data_util.mod_prefix .. "energy-transmitter-injector", + }, + { -- + type = "recipe", + name = data_util.mod_prefix .. "energy-transmitter-emitter-fixed", + icon = "__space-exploration-graphics__/graphics/icons/energy-transmitter.png", + icon_size = 64, + order = "a-d", + subgroup = "beaming", + energy_required = 1, + category = "fixed-recipe", + ingredients = {}, + results = {}, + flags = {"hidden"}, + hidden = true, + enabled = true, + always_show_made_in = true, + }, + { -- + type = "recipe", + name = data_util.mod_prefix .. "energy-transmitter-injector-fixed", + icon = "__space-exploration-graphics__/graphics/icons/energy-transmitter-injector.png", + icon_size = 64, + order = "a-d", + subgroup = "beaming", + energy_required = 1, + category = "fixed-recipe", + ingredients = {}, + results = {}, + flags = {"hidden"}, + hidden = true, + enabled = true, + always_show_made_in = true, + }, + { + type = "selection-tool", + name = data_util.mod_prefix .. "energy-transmitter-targeter", + icon = "__space-exploration-graphics__/graphics/icons/target.png", + icon_mipmaps = 1, + icon_size = 64, + subgroup = "beaming", + order = "a-d", + stack_size = 1, + stackable = false, + selection_color = {r = 0.3, g = 0.9, b = 0.3}, + alt_selection_color = {r = 0.9, g = 0.9, b = 0.3}, + selection_mode = {"nothing"}, + alt_selection_mode = {"nothing"}, + selection_cursor_box_type = "entity", + alt_selection_cursor_box_type = "entity", + hidden = true, + flags = {"hidden", "only-in-cursor"}, + }, + { + type = "assembling-machine", -- "boiler", + name = data_util.mod_prefix .. "energy-transmitter-emitter", -- emitter + icon = "__space-exploration-graphics__/graphics/icons/energy-transmitter.png", + icon_size = 64, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "energy-transmitter-emitter"}, + order = "a-a", + allow_copy_paste = true, + fluid_boxes = + { + { + base_area = 1, + base_level = 0, + height = 1, + pipe_connections = { + { type = "input", position = { -5.5, 0 }, }, + { type = "input", position = { 5.5, 0 }, }, + { type = "input", position = { 0, -5.5}, }, + { type = "input", position = { 0, 5.5 }, }, + }, + production_type = "input" + }, + }, + animation = -- structure = + { + north = {layers = emitter_layers}, + south = {layers = emitter_layers}, + east = {layers = emitter_layers}, + west = {layers = emitter_layers}, + }, + collision_box = data_util.auto_box(10, 10, 0.2), + selection_box = data_util.auto_box(10, 10), + drawing_box = data_util.auto_box(10, 10, 0, {0, 0}, 1), + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + se_allow_in_space = true, + corpse = "medium-remnants", + energy_source = { + type = "electric", + usage_priority = "secondary-input", + buffer_capacity = "10GJ", + }, + energy_usage = "1GW", + flags = { + "placeable-player", + "player-creation", + }, + max_health = 5000, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + crafting_speed = 1, + crafting_categories = {"fixed-recipe"}, + fixed_recipe = data_util.mod_prefix .. "energy-transmitter-emitter-fixed", + working_sound = { + apparent_volume = 1.5, + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + { + filename = "__base__/sound/nuclear-reactor-1.ogg", + volume = 0.6 + }, + { + filename = "__base__/sound/nuclear-reactor-2.ogg", + volume = 0.6 + } + } + }, + --fire = blank, + --fire_glow = blank, + --burning_cooldown = 20, + --target_temperature = 1000000, + --mode = "heat-water-inside", + --energy_consumption = "100MW", + --energy_usage = "100MW", + --light = {intensity = 1, size = 8, shift = {0.0, 0.0}, color = {r = 0.6, g = 0.9, b = 1}} + }, + { + type = "boiler", + name = data_util.mod_prefix .. "energy-transmitter-chamber", + icon = "__space-exploration-graphics__/graphics/icons/energy-transmitter-chamber.png", + icon_size = 64, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "energy-transmitter-chamber"}, + order = "a-b", + allow_copy_paste = true, + collision_box = data_util.auto_box(4, 8, 0.05), + selection_box = data_util.auto_box(4, 8), + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + se_allow_in_space = true, + fluid_box = { + base_area = 1, + base_level = 0, + height = 1, + pipe_connections = { + { type = "input-output", position = { -2, 0 }, }, + { type = "input-output", position = { 2, 0 }, }, + { type = "input-output", position = { 0, -4}, }, + { type = "input-output", position = { 0, 4 }, }, + }, + production_type = "input-output" + }, + output_fluid_box = { + base_area = 1, + base_level = 0, + height = 1, + pipe_connections = { + --[[ + { type = "output", position = { -2, 3.5 }, }, { type = "output", position = { 2, 3.5 }, }, + { type = "output", position = { -2, 2.5 }, }, { type = "output", position = { 2, 2.5 }, }, + { type = "output", position = { -2, 1.5 }, }, { type = "output", position = { 2, 1.5 }, }, + { type = "output", position = { -2, 0.5 }, }, { type = "output", position = { 2, 0.5 }, }, + { type = "output", position = { -2, -0.5 }, }, { type = "output", position = { 2, -0.5 }, }, + { type = "output", position = { -2, -1.5 }, }, { type = "output", position = { 2, -1.5 }, }, + { type = "output", position = { -2, -2.5 }, }, { type = "output", position = { 2, -2.5 }, }, + { type = "output", position = { -2, -3.5 }, }, { type = "output", position = { 2, -3.5 }, }, + ]] + }, + production_type = "output" + }, + fire = blank, + fire_glow = blank, + burning_cooldown = 20, + target_temperature = 1000000, + mode = "heat-water-inside", + structure = + { + east = { + layers = + { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h.png", + priority = "high", + width = 512, + height = 256, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h-glow.png", + priority = "high", + width = 512, + height = 256, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h-shadow.png", + priority = "high", + width = 578, + height = 250, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(17, 1), + }), + }, + }, + west = { + layers = + { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h.png", + priority = "high", + width = 512, + height = 256, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h-glow.png", + priority = "high", + width = 512, + height = 256, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h-shadow.png", + priority = "high", + width = 578, + height = 250, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(17, 1), + }), + }, + }, + north = { + layers = + { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v.png", + priority = "high", + width = 256, + height = 576, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.5}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v-glow.png", + priority = "high", + width = 256, + height = 576, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.5}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v-shadow.png", + priority = "high", + width = 260, + height = 562, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(2, -8), + }), + }, + }, + south = { + layers = + { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v.png", + priority = "high", + width = 256, + height = 576, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.5}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v-glow.png", + priority = "high", + width = 256, + height = 576, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.5}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v-shadow.png", + priority = "high", + width = 260, + height = 562, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(2, -8), + }), + }, + }, + }, + corpse = "medium-remnants", + energy_source = { + type = "electric", + usage_priority = "secondary-input", + buffer_capacity = "1GJ", + }, + energy_consumption = "100MW", + energy_usage = "100MW", + flags = { + "placeable-player", + "player-creation", + }, + max_health = 5000, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + crafting_speed = 1, + crafting_categories = {"fixed-recipe"}, + working_sound = { + apparent_volume = 1.5, + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + { + filename = "__base__/sound/nuclear-reactor-1.ogg", + volume = 0.6 + }, + { + filename = "__base__/sound/nuclear-reactor-2.ogg", + volume = 0.6 + } + } + }, + --light = {intensity = 1, size = 8, shift = {0.0, 0.0}, color = {r = 0.6, g = 0.9, b = 1}} + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "energy-transmitter-chamber-addon-left", + flags = {"placeable-off-grid"}, + collision_mask = {}, + collision_box = {{-0.1,-0.1},{0.1,0.1}}, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v-west.png", + priority = "high", + width = 128, + height = 224, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v-west-glow.png", + priority = "high", + width = 128, + height = 224, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v-west-shadow.png", + priority = "high", + width = 20, + height = 84, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(32, 0), + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "energy-transmitter-chamber-addon-top", + flags = {"placeable-off-grid"}, + collision_mask = {}, + collision_box = {{-0.1,-0.1},{0.1,0.1}}, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h-north.png", + priority = "high", + width = 192, + height = 160, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -2.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h-north-glow.png", + priority = "high", + width = 192, + height = 160, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -2.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h-north-shadow.png", + priority = "high", + width = 116, + height = 74, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(32, 0), + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "energy-transmitter-chamber-addon-right", + flags = {"placeable-off-grid"}, + collision_mask = {}, + collision_box = {{-0.1,-0.1},{0.1,0.1}}, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v-east.png", + priority = "high", + width = 128, + height = 224, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v-east-glow.png", + priority = "high", + width = 128, + height = 224, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-v-east-shadow.png", + priority = "high", + width = 90, + height = 84, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(32, 0), + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "energy-transmitter-chamber-addon-bottom", + flags = {"placeable-off-grid"}, + collision_mask = {}, + collision_box = {{-0.1,-0.1},{0.1,0.1}}, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h-south.png", + priority = "high", + width = 192, + height = 192, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.5}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h-south-glow.png", + priority = "high", + width = 192, + height = 192, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.5}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/chamber-h-south-shadow.png", + priority = "high", + width = 114, + height = 22, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(32, 32), + }), + } + } + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "energy-transmitter-injector", + icon = "__space-exploration-graphics__/graphics/icons/energy-transmitter-injector.png", + icon_size = 64, + minable = {mining_time = 0.1, result = data_util.mod_prefix .. "energy-transmitter-injector"}, + fixed_recipe = data_util.mod_prefix .. "energy-transmitter-injector-fixed", + order = "a-c", + allow_copy_paste = true, + collision_box = data_util.auto_box(3, 5, 0.2), + selection_box = data_util.auto_box(3, 5), + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + se_allow_in_space = true, + fluid_boxes = { + { + base_area = 1, + base_level = 0, + height = 1, + pipe_connections = { + { + position = { 0, -3 }, + type = "output" + }, + }, + production_type = "output" + }, + }, + animation = + { + east = { + layers = + { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-east.png", + priority = "high", + width = 352, + height = 224, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {-0.25, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-east-glow.png", + priority = "high", + width = 352, + height = 224, + frame_count = 1, + line_length = 1, + shift = {-0.25, -0.25}, + animation_speed = 1, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-east-shadow.png", + priority = "high", + width = 394, + height = 186, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(22, -3), + }), + }, + }, + west = { + layers = + { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-west.png", + priority = "high", + width = 352, + height = 224, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0.25, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-west-glow.png", + priority = "high", + width = 352, + height = 224, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0.25, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-west-shadow.png", + priority = "high", + width = 414, + height = 184, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(24, -4), + }), + }, + }, + north = { + layers = + { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-north.png", + priority = "high", + width = 192, + height = 352, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.2}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-north-glow.png", + priority = "high", + width = 192, + height = 352, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-north-shadow.png", + priority = "high", + width = 250, + height = 348, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(14, -6), + }), + }, + }, + south = { + layers = + { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-south.png", + priority = "high", + width = 192, + height = 384, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-south-glow.png", + priority = "high", + width = 192, + height = 384, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-south-shadow.png", + priority = "high", + width = 250, + height = 356, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(15, 1), + }), + }, + }, + }, + corpse = "medium-remnants", + energy_source = { + type = "void", + buffer_capacity = "10GJ", + usage_priority = "secondary-input", + input_flow_limit = "1GW", + }, + energy_usage = "1MW", + flags = { + "placeable-player", + "player-creation", + }, + max_health = 5000, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + crafting_speed = 1, + crafting_categories = {"fixed-recipe"}, + working_sound = { + apparent_volume = 1.5, + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + { + filename = "__base__/sound/nuclear-reactor-1.ogg", + volume = 0.6 + }, + { + filename = "__base__/sound/nuclear-reactor-2.ogg", + volume = 0.6 + } + } + }, + --light = {intensity = 1, size = 8, shift = {0.0, 0.0}, color = {r = 0.6, g = 0.9, b = 1}} + }, + { + type = "reactor", + name = data_util.mod_prefix .. "energy-transmitter-injector-reactor", + icon = "__space-exploration-graphics__/graphics/icons/energy-transmitter-injector.png", + icon_size = 64, + fixed_recipe = data_util.mod_prefix .. "energy-transmitter-injector-fixed", + order = "a-c-b", + allow_copy_paste = true, + collision_box = data_util.auto_box(3, 3, 0.2), + selection_box = data_util.auto_box(3, 3), + collision_mask = {}, + se_allow_in_space = true, + heat_buffer = + { + max_temperature = 100000, + specific_heat = specific_heat, + max_transfer = "100GW", + connections = + { + }, + heat_picture = blank, + heat_glow = blank, + }, + energy_source = { + type = "electric", + buffer_capacity = "10GJ", + usage_priority = "secondary-input", + input_flow_limit = "1GW", + }, + neighbour_bonus = 0, + energy_usage = "1MW", + consumption = "1GW", + working_light_picture = blank, + animation = blank, + corpse = "medium-remnants", + flags = { + "placeable-player", + "player-creation", + }, + max_health = 5000, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + crafting_speed = 1, + crafting_categories = {"fixed-recipe"}, + working_sound = { + apparent_volume = 1.5, + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + { + filename = "__base__/sound/nuclear-reactor-1.ogg", + volume = 0.6 + }, + { + filename = "__base__/sound/nuclear-reactor-2.ogg", + volume = 0.6 + } + } + }, + --light = {intensity = 1, size = 8, shift = {0.0, 0.0}, color = {r = 0.6, g = 0.9, b = 1}} + }, + + { + type = "simple-entity", + name = data_util.mod_prefix .. "energy-transmitter-injector-addon", + flags = {"placeable-off-grid"}, + collision_mask = {}, + collision_box = {{-0.1,-0.1},{0.1,0.1}}, + render_layer = "higher-object-under", + pictures = { + { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-north-addon.png", + priority = "high", + width = 64, + height = 192, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -1}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-north-addon-glow.png", + priority = "high", + width = 64, + height = 192, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, -1}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-north-addon-shadow.png", + priority = "high", + width = 128, + height = 138, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(32, 0), + }), + } + }, + { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-east-addon.png", + priority = "high", + width = 96, + height = 96, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0.75, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-east-addon-glow.png", + priority = "high", + width = 96, + height = 96, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0.75, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-east-addon-shadow.png", + priority = "high", + width = 24, + height = 54, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(32, 0), + }), + } + }, + { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-south-addon.png", + priority = "high", + width = 64, + height = 128, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, 0.5}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-south-addon-glow.png", + priority = "high", + width = 64, + height = 128, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {0, 0.5}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-south-addon-shadow.png", + priority = "high", + width = 96, + height = 148, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(32, 0), + }), + } + }, + { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-west-addon.png", + priority = "high", + width = 96, + height = 96, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {-0.75, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-west-addon-glow.png", + priority = "high", + width = 96, + height = 96, + frame_count = 1, + line_length = 1, + animation_speed = 1, + shift = {-0.75, -0.25}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/injector-west-addon-shadow.png", + priority = "high", + width = 80, + height = 68, + frame_count = 1, + line_length = 1, + animation_speed = 1, + scale = 0.5, + shift = util.by_pixel(32, 0), + }), + } + }, + } + }, + { + type = "reactor", + name = data_util.mod_prefix .. "energy-receiver", + icon = "__space-exploration-graphics__/graphics/icons/energy-receiver.png", + icon_size = 64, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "energy-receiver"}, + flags = {"placeable-neutral", "player-creation"}, + max_health = 1000, + corpse = "medium-remnants", + consumption = "1W", + neighbour_bonus = 0, + energy_source = + { + type = "void", + }, + collision_box = data_util.auto_box(13, 13, 0.2), + selection_box = data_util.auto_box(13, 13), + --the collision box of a reactor is increased by this on the sides where it connects to another reactor: + --neighbour_collision_increase = 0.25, + lower_layer_picture = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-pipes.png", + width = 156, + height = 156, + shift = util.by_pixel(-2, -4), + tint = pipe_tint, + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-pipes.png", + width = 320, + height = 316, + scale = 0.5, + shift = util.by_pixel(-1, -5), + tint = pipe_tint, + } + }, + heat_lower_layer_picture = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-pipes-heated.png", + width = 156, + height = 156, + shift = util.by_pixel(-3, -4), + tint = glow_tint, + blend_mode = "additive", + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-pipes-heated.png", + width = 320, + height = 316, + scale = 0.5, + shift = util.by_pixel(-0.5, -4.5), + tint = glow_tint, + } + }, + + picture = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/receiver.png", + priority = "high", + width = 832/2, + height = 896/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/receiver.png", + priority = "high", + width = 832, + height = 896, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + scale = 0.5, + } + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/receiver-mask.png", + priority = "high", + width = 832/2, + height = 896/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + tint = {r=178, g=160, b=76}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/receiver-mask.png", + priority = "high", + width = 832, + height = 896, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + tint = {r=178, g=160, b=76}, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/receiver-shadow.png", + priority = "high", + width = 1214/2, + height = 820/2, + frame_count = 1, + line_length = 1, + repeat_count = 1, + shift = util.by_pixel(32*3+8, 4), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/receiver-shadow.png", + priority = "high", + width = 1214, + height = 820, + frame_count = 1, + line_length = 1, + repeat_count = 1, + shift = util.by_pixel(32*3+8, 4), + scale = 0.5, + } + }, + }, + }, + + working_light_picture = blank, + + + light = {intensity = 1, size = 18, shift = {0.0, 0.0}, color = {r = 1, g = 0.6, b = 0.1}}, + + heat_buffer = + { + max_temperature = 10000, + specific_heat = specific_heat, + max_transfer = "1000GJ", + connections = + { + { + position = {5, 6}, + direction = defines.direction.south + }, + { + position = {6, 5}, + direction = defines.direction.east + }, + { + position = {5, -6}, + direction = defines.direction.north + }, + { + position = {6, -5}, + direction = defines.direction.east + }, + { + position = {-5, 6}, + direction = defines.direction.south + }, + { + position = {-6, 5}, + direction = defines.direction.west + }, + { + position = {-5, -6}, + direction = defines.direction.north + }, + { + position = {-6, -5}, + direction = defines.direction.west + }, + { + position = {0, -6}, + direction = defines.direction.north + }, + { + position = {6, 0}, + direction = defines.direction.east + }, + { + position = {0, 6}, + direction = defines.direction.south + }, + { + position = {-6, 0}, + direction = defines.direction.west + }, + }, + + heat_picture = + { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/receiver-glow.png", + priority = "high", + width = 832/2, + height = 896/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + blend_mode = "additive", + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/receiver-glow.png", + priority = "high", + width = 832, + height = 896, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + blend_mode = "additive", + scale = 0.5, + } + }, + heat_glow = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-heat-glow.png", + priority = "extra-high", + width = 188, + height = 190, + shift = util.by_pixel(-2, -4), + tint = glow_tint, + } + }, + + connection_patches_connected = + { + sheet = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-connect-patches.png", + width = 32, + height = 32, + variation_count = 12, + tint = pipe_tint, + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-connect-patches.png", + width = 64, + height = 64, + variation_count = 12, + scale = 0.5, + tint = pipe_tint, + } + } + }, + + connection_patches_disconnected = + { + sheet = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-connect-patches.png", + width = 32, + height = 32, + variation_count = 12, + y = 32, + tint = pipe_tint, + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-connect-patches.png", + width = 64, + height = 64, + variation_count = 12, + y = 64, + scale = 0.5, + tint = pipe_tint, + } + } + }, + + connection_patches = + { + north = + { + filename = "__base__/graphics/entity/nuclear-reactor/connection-patch-north.png", + width = 160, + height = 15, + shift = util.by_pixel(0, -72.5), + tint = pipe_tint, + }, + east = + { + filename = "__base__/graphics/entity/nuclear-reactor/connection-patch-east.png", + width = 15, + height = 160, + shift = util.by_pixel(72.5, 0) + }, + south = + { + filename = "__base__/graphics/entity/nuclear-reactor/connection-patch-south.png", + width = 160, + height = 15, + shift = util.by_pixel(0, 72.5) + }, + west = + { + filename = "__base__/graphics/entity/nuclear-reactor/connection-patch-west.png", + width = 15, + height = 160, + shift = util.by_pixel(-72.5, 0) + } + }, + + heat_connection_patches_connected = + { + sheet = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-connect-patches-heated.png", + width = 32, + height = 32, + variation_count = 12, + tint = glow_tint, + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-connect-patches-heated.png", + width = 64, + height = 64, + variation_count = 12, + scale = 0.5, + tint = glow_tint, + } + } + }, + + heat_connection_patches_disconnected = + { + sheet = + { + filename = "__base__/graphics/entity/nuclear-reactor/reactor-connect-patches-heated.png", + width = 32, + height = 32, + variation_count = 12, + y = 32, + tint = glow_tint, + hr_version = + { + filename = "__base__/graphics/entity/nuclear-reactor/hr-reactor-connect-patches-heated.png", + width = 64, + height = 64, + variation_count = 12, + y = 64, + scale = 0.5, + tint = glow_tint, + } + } + }, + + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65}, + + meltdown_action = + { + type = "direct", + action_delivery = + { + type = "instant", + target_effects = + { + { + repeat_count = 100, + type = "create-trivial-smoke", + smoke_name = "nuclear-smoke", + offset_deviation = {{-1, -1}, {1, 1}}, + starting_frame = 3, + starting_frame_deviation = 5, + starting_frame_speed = 0, + starting_frame_speed_deviation = 5, + speed_from_center = 0.5 + }, + { + type = "create-entity", + entity_name = "explosion" + }, + { + type = "damage", + damage = {amount = 400, type = "explosion"} + }, + { + type = "create-entity", + entity_name = "small-scorchmark", + check_buildability = true + }, + { + type = "nested-result", + action = + { + type = "area", + target_entities = false, + trigger_from_target = true, + repeat_count = 2000, + radius = 35, + action_delivery = + { + type = "projectile", + projectile = "atomic-bomb-wave", + starting_speed = 0.5 + } + } + } + } + } + } + }, + + { + type = "projectile", + name = data_util.mod_prefix .. "energy-transmitter-beam", + direction_only = false, + flags = { "not-on-map", "placeable-off-grid" }, + acceleration = 0, + collision_mask = {"not-colliding-with-itself"}, + light = {intensity = 1, size = 8, shift = {0.0, 0.0}, color = {r = 0.6, g = 0.9, b = 1}}, + working_sound = { + apparent_volume = 1.5, + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + { + filename = "__base__/sound/nuclear-reactor-1.ogg", + volume = 0.6 + }, + { + filename = "__base__/sound/nuclear-reactor-2.ogg", + volume = 0.6 + } + } + }, + animation = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/energy-transmitter-light.png", + priority = "high", + width = 576/2, + height = 640/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -1 * 32 -9 ), + animation_speed = 1, + apply_runtime_tint = true, --"additive-soft" + scale = 1*10/9, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/energy-transmitter-light.png", + priority = "high", + width = 576, + height = 640, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -1 * 32 -9 ), + animation_speed = 1, + scale = 0.5*10/9, + apply_runtime_tint = true, --"additive-soft" + } + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/energy-transmitter-skybeam.png", + priority = "high", + width = 316/2, + height = 2392/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -21 * 32 -11), + animation_speed = 1, + apply_runtime_tint = true, + blend_mode = "additive-soft", + scale = 10/9, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/energy-transmitter-skybeam.png", + priority = "high", + width = 316, + height = 2392, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -21 * 32 -11), + animation_speed = 1, + scale = 10/9/2, + apply_runtime_tint = true, + blend_mode = "additive-soft", + } + }, + } + }, + }, + + { + type = "projectile", + name = data_util.mod_prefix .. "energy-receiver-beam", + direction_only = false, + flags = { "not-on-map", "placeable-off-grid" }, + acceleration = 0, + rotatable = false, + collision_mask = {"not-colliding-with-itself"}, + light = {intensity = 1, size = 8, shift = {0.0, 0.0}, color = {r = 0.6, g = 0.9, b = 1}}, + working_sound = { + apparent_volume = 1.5, + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + { + filename = "__base__/sound/nuclear-reactor-1.ogg", + volume = 0.6 + }, + { + filename = "__base__/sound/nuclear-reactor-2.ogg", + volume = 0.6 + } + } + }, + animation = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/receiver-beam.png", + priority = "high", + width = 512/2, + height = 1088/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -3 * 32 -17), + animation_speed = 1, + apply_runtime_tint = true, + blend_mode = "additive", + scale = 1, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/receiver-beam.png", + priority = "high", + width = 512, + height = 1088, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -3 * 32 -17), + animation_speed = 1, + scale = 0.5, + apply_runtime_tint = true, + blend_mode = "additive", + } + }, + } + }, + }, + + { + type = "projectile", + name = data_util.mod_prefix .. "energy-glaive-beam", + direction_only = false, + flags = { "not-on-map", "placeable-off-grid" }, + acceleration = 0, + rotatable = false, + collision_mask = {"not-colliding-with-itself"}, + light = {intensity = 1, size = 8, shift = {0.0, 0.0}, color = {r = 0.6, g = 0.9, b = 1}}, + working_sound = { + apparent_volume = 1.5, + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + { + filename = "__base__/sound/nuclear-reactor-1.ogg", + volume = 0.6 + }, + { + filename = "__base__/sound/nuclear-reactor-2.ogg", + volume = 0.6 + } + } + }, + animation = blank + }, + { + type = "sprite", + name = data_util.mod_prefix .. "energy-glaive-beam-sprite", + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/glaive-beam.png", + priority = "high", + width = 454/2, + height = 1172/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -12 * 32 -11), + animation_speed = 1, + apply_runtime_tint = true, + blend_mode = "additive", + scale = 2, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/glaive-beam.png", + priority = "high", + width = 454, + height = 1172, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -12 * 32 -11), + animation_speed = 1, + scale = 1, + apply_runtime_tint = true, + blend_mode = "additive", + } + }, + + { + type = "explosion", + name = data_util.mod_prefix .. "energy-glaive-path-fx", + animations = blank, + + created_effect = { + type = "direct", + action_delivery = { + type = "instant", + target_effects = { + { + check_buildability = true, + entity_name = "small-scorchmark", + type = "create-entity" + }, + }, + }, + }, + flags = { "not-on-map", "placeable-off-grid" }, + }, + + { + type = "explosion", + name = data_util.mod_prefix .. "energy-glaive-damage-aoe", + animations = blank, + + created_effect = { + type = "direct", + action_delivery = { + type = "instant", + target_effects = { + { + type = "nested-result", + action = { + type = "area", + radius = 2, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 10, type = "laser" }}, + { type = "damage", damage = { amount = 10, type = "explosion" }}, + } + }, + } + }, + { + type = "nested-result", + action = { + type = "area", + radius = 4, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 10, type = "laser" }}, + { type = "damage", damage = { amount = 10, type = "fire" }}, + } + }, + } + }, + { + type = "nested-result", + action = { + type = "area", + radius = 8, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 5, type = "laser" }, apply_damage_to_trees = false}, + { type = "damage", damage = { amount = 10, type = "fire" }, apply_damage_to_trees = false}, + } + }, + } + }, + { + type = "nested-result", + action = { + type = "area", + radius = 12, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 1, type = "laser" }, apply_damage_to_trees = false}, + { type = "damage", damage = { amount = 5, type = "fire" }, apply_damage_to_trees = false}, + { + type = "create-sticker", + sticker = "fire-sticker", + } + } + }, + } + }, + { + type = "nested-result", + action = { + type = "area", + radius = 16, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 2, type = "fire" }, apply_damage_to_trees = false}, + } + }, + } + }, + { -- tree fires + type = "nested-result", + action = { + type = "area", + radius = 8, + trigger_target_mask = {"flammable"}, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 100, type = "fire" }}, + { type = "create-entity", entity_name = data_util.mod_prefix .. "tree-fire-starter" } + } + }, + } + }, + }, + }, + }, + flags = { "not-on-map", "placeable-off-grid"}, + }, + + { + type = "explosion", + name = data_util.mod_prefix .. "energy-glaive-damage-aoe-large", + animations = blank, + + created_effect = { + type = "direct", + action_delivery = { + type = "instant", + target_effects = { + { + type = "nested-result", + action = { + type = "area", + radius = 4, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 10, type = "laser" }}, + { type = "damage", damage = { amount = 10, type = "explosion" }}, + } + }, + } + }, + { + type = "nested-result", + action = { + type = "area", + radius = 8, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 10, type = "laser" }, apply_damage_to_trees = false}, + { type = "damage", damage = { amount = 10, type = "fire" }, apply_damage_to_trees = false}, + } + }, + } + }, + { + type = "nested-result", + action = { + type = "area", + radius = 16, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 5, type = "laser" }, apply_damage_to_trees = false}, + { type = "damage", damage = { amount = 10, type = "fire" }, apply_damage_to_trees = false}, + } + }, + } + }, + { + type = "nested-result", + action = { + type = "area", + radius = 24, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 1, type = "laser" }, apply_damage_to_trees = false}, + { type = "damage", damage = { amount = 5, type = "fire" }, apply_damage_to_trees = false}, + { + type = "create-sticker", + sticker = "fire-sticker", + } + } + }, + } + }, + { + type = "nested-result", + action = { + type = "area", + radius = 32, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 2, type = "fire" }, apply_damage_to_trees = false}, + } + }, + } + }, + { -- tree fires + type = "nested-result", + action = { + type = "area", + radius = 8, + trigger_target_mask = {"flammable"}, + action_delivery = { + type = "instant", + target_effects = { + { type = "damage", damage = { amount = 100, type = "fire" }}, + { type = "create-entity", entity_name = data_util.mod_prefix .. "tree-fire-starter" } + } + }, + } + }, + + }, + }, + }, + flags = { "not-on-map", "placeable-off-grid"}, + }, + + + { + type = "projectile", + name = data_util.mod_prefix .. "energy-glaive-damage-projectile", + acceleration = -0.01, + action = { + action_delivery = { + target_effects = { + { + type = "damage", + damage = { + amount = 10, + type = "fire" + }, + }, + { + type = "damage", + damage = { + amount = 5, + type = "laser" + }, + }, + { + type = "create-sticker", + sticker = "fire-sticker", + } + }, + type = "instant" + }, + type = "direct" + }, + animation = { + filename = "__base__/graphics/entity/bullet/bullet.png", + frame_count = 1, + height = 50, + priority = "high", + width = 3, + scale = 1.5, + tint = {r = 255/255, g = 100/255, b = 38/255}, + blend_mode = "additive" + }, + collision_box = { + { + -0.25, + -0.25 + }, + { + 0.25, + 0.25 + } + }, + flags = { + "not-on-map" + }, + }, + +}) + + + + +data:extend({ + { + type = "technology", + name = data_util.mod_prefix .. "energy-beam-defence", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-beam-defence" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/energy-beam-defence.png", + icon_size = 128, + order = "e-a", + prerequisites = { + data_util.mod_prefix .. "meteor-defence", + }, + unit = { + count = 500, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "energy-beam-defence", + result = data_util.mod_prefix .. "energy-beam-defence", + enabled = false, + energy_required = 10, + ingredients = { + { "glass", 200 }, + { "copper-plate", 200 }, + { "steel-plate", 200 }, + { "concrete", 200 }, + { "battery", 100 }, + { "processing-unit", 100 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "item", + name = data_util.mod_prefix .. "energy-beam-defence", + icon = "__space-exploration-graphics__/graphics/icons/energy-beam-defence.png", + icon_size = 64, + order = "c-a", + subgroup = "surface-defense", + stack_size = 1, + place_result = data_util.mod_prefix .. "energy-beam-defence", + }, + { + type = "electric-energy-interface", + name = data_util.mod_prefix .. "energy-beam-defence", + icon = "__space-exploration-graphics__/graphics/icons/energy-beam-defence.png", + icon_size = 64, + minable = {mining_time = 1, result = data_util.mod_prefix .. "energy-beam-defence"}, + order = "e-a", + allow_copy_paste = true, + picture = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/receiver.png", + priority = "high", + width = 832/2, + height = 896/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/receiver.png", + priority = "high", + width = 832, + height = 896, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + scale = 0.5, + } + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/receiver-mask.png", + priority = "high", + width = 832/2, + height = 896/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + tint = {r=58, g=89, b=35}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/receiver-mask.png", + priority = "high", + width = 832, + height = 896, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + tint = {r=58, g=89, b=35}, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/receiver-shadow.png", + priority = "high", + width = 1214/2, + height = 820/2, + frame_count = 1, + line_length = 1, + repeat_count = 1, + shift = util.by_pixel(32*3+8, 4), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/receiver-shadow.png", + priority = "high", + width = 1214, + height = 820, + frame_count = 1, + line_length = 1, + repeat_count = 1, + shift = util.by_pixel(32*3+8, 4), + scale = 0.5, + } + }, + }, + }, + collosion_mask = { + "water-tile", + "object-layer", + "player-layer", + "item-layer", + spaceship_collision_layer + }, + collision_box = data_util.auto_box(13, 13, 0.2), + selection_box = data_util.auto_box(13, 13), + selectable = false, + continuous_animation = true, + corpse = "medium-remnants", + energy_source = { + buffer_capacity = "1GJ", + input_flow_limit = "50GW", + output_flow_limit = "0kW", + type = "electric", + usage_priority = "primary-input" + }, + energy_production = "0kW", + energy_usage = "10MW", -- platform + 1x per lock + 1x for final energy spike final activation. + --energy_usage = "60GW", -- platform + 1x per lock + 1x for final energy spike final activation. + flags = { + "placeable-player", + "player-creation", + "hidden", + "not-rotatable" + }, + max_health = 5000, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + working_sound = { + apparent_volume = 1.5, + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + { + filename = "__base__/sound/nuclear-reactor-1.ogg", + volume = 0.6 + }, + { + filename = "__base__/sound/nuclear-reactor-2.ogg", + volume = 0.6 + } + } + }, + --light = {intensity = 1, size = 8, shift = {0.0, 0.0}, color = {r = 0.6, g = 0.9, b = 1}} + }, + { + type = "sprite", + name = data_util.mod_prefix .. "energy-beam-defence-glow", + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/sr/defence-glow.png", + priority = "high", + width = 832/2, + height = 896/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + blend_mode = "additive", + apply_runtime_tint = true, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/energy-transmitter/hr/defence-glow.png", + priority = "high", + width = 832, + height = 896, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16), + animation_speed = 1, + blend_mode = "additive", + apply_runtime_tint = true, + scale = 0.5, + } + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/interburbulator.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/interburbulator.lua new file mode 100644 index 0000000..f6b770c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/interburbulator.lua @@ -0,0 +1,466 @@ +local data_util = require("data_util") +--[[ +copy of shield projector, SW, SE, NE +copy of laser turret NW +interface addon graphic +interface addon display animation. +]] +local blank_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, +} +local connection_point = { + wire = { red = {-1 -8/32, 2 +20/32}, green = {-1 -2/32, 2 +20/32}, }, + shadow = { red = {2 -8/32, 5}, green = {2 -2/32, 5}, }, +} + +local function make_spidertron_leg(number) + local leg = table.deepcopy(data.raw["spider-leg"]["spidertron-leg-"..number]) + leg.name = data_util.mod_prefix.."burbulator-leg-" .. number + leg.initial_movement_speed = 0.006 + leg.movement_acceleration = 0.003 + leg.movement_based_position_selection_distance = 2 + leg.part_length = 4 + return leg +end + +data:extend({ + { + type = "lamp", + name = data_util.mod_prefix.. "interburbulator-control", + icon = "__space-exploration-graphics__/graphics/icons/shield-projector.png", + icon_size = 64, + flags = {"placeable-player", "player-creation", "placeable-off-grid", "not-deconstructable", "not-blueprintable"}, + order = "y", + energy_source = {type = "void"}, + max_health = 10000, + healing_per_tick = 10000, + collision_box = data_util.auto_box(2, 2, 0.1), + selection_box = data_util.auto_box(2, 2), + collision_mask = {"not-colliding-with-itself"}, + energy_usage_per_tick = "1J", + always_on = true, + picture_off = blank_image, + picture_on = { + layers = { + { + filename = "__base__/graphics/entity/steel-furnace/steel-furnace.png", + frame_count = 1, + height = 87, + hr_version = { + filename = "__base__/graphics/entity/steel-furnace/hr-steel-furnace.png", + frame_count = 1, + height = 174, + priority = "high", + scale = 0.5, + shift = { + -0.0390625, + 0.0625 + }, + width = 171 + }, + priority = "high", + shift = { + -0.046875, + 0.046875 + }, + width = 85 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/steel-furnace/steel-furnace-shadow.png", + frame_count = 1, + height = 43, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/steel-furnace/hr-steel-furnace-shadow.png", + frame_count = 1, + height = 85, + priority = "high", + scale = 0.5, + shift = { + 1.2265625, + 0.3515625 + }, + width = 277 + }, + priority = "high", + shift = { + 1.234375, + 0.359375 + }, + width = 139 + } + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix.. "interburbulator-interface", + icon = "__space-exploration-graphics__/graphics/icons/shield-projector.png", + icon_size = 64, + flags = {"placeable-player", "player-creation", "placeable-off-grid", "not-deconstructable", "not-blueprintable"}, + order = "y", + max_health = 10000, + healing_per_tick = 10000, + collision_box = data_util.auto_box(1, 1, 0.1), + selection_box = data_util.auto_box(1, 1), + collision_mask = {"not-colliding-with-itself"}, + selectable_in_game = false, + animations = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/robot-faction/hr/interface-addon.png", + frame_count = 1, + width = 72, + height = 82, + line_length = 1, + repeat_count = 3, + animation_speed = 0.1, + shift = { 0,0}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/robot-faction/hr/interface-addon-display.png", + frame_count = 3, + width = 78/3, + height = 42, + line_length = 3, + animation_speed = 0.1, + shift = { 0,-0.1}, + scale = 0.5, + belnd_mode = "additive" + }), + } + } + }, + { + type = "constant-combinator", + name = data_util.mod_prefix.. "interburbulator-projector", + icon = "__space-exploration-graphics__/graphics/icons/shield-projector.png", + icon_size = 64, + flags = {"placeable-player", "player-creation", "placeable-off-grid", "not-deconstructable", "not-blueprintable"}, + order = "y", + max_health = 10000, + healing_per_tick = 10000, + collision_box = data_util.auto_box(2, 2, 0.1), + selection_box = data_util.auto_box(2, 2), + collision_mask = {"not-colliding-with-itself"}, + scale_info_icons = false, + selectable_in_game = true, + item_slot_count = 0, + sprites = + { + north = { + layers = { + data_util.auto_sr_hr({ + filename = "__shield-projector__/graphics/entity/shield-projector/hr/shield-projector.png", + frame_count = 1, + x = 196 * 1, + width = 196, + height = 284, + line_length = 1, + shift = { 1/32, -24/32 }, + scale = 0.5 * 2/3 + }), + data_util.auto_sr_hr({ + frame_count = 1, + draw_as_shadow = true, + filename = "__shield-projector__/graphics/entity/shield-projector/hr/shield-projector-shadow.png", + x = 412 * 1, + width = 412, + height = 249, + line_length = 1, + shift = { (1 + 22/32) * 2/3, (-8/32) * 2/3}, + scale = 0.5 * 2/3 + }), + } + }, + east = { + layers = { + data_util.auto_sr_hr({ + filename = "__shield-projector__/graphics/entity/shield-projector/hr/shield-projector.png", + frame_count = 1, + x = 196 * 3, + width = 196, + height = 284, + line_length = 1, + shift = { 1/32, -24/32 }, + scale = 0.5 * 2/3 + }), + data_util.auto_sr_hr({ + frame_count = 1, + draw_as_shadow = true, + filename = "__shield-projector__/graphics/entity/shield-projector/hr/shield-projector-shadow.png", + x = 412 * 3, + width = 412, + height = 249, + line_length = 1, + shift = { (1 + 22/32) * 2/3, (-8/32) * 2/3}, + scale = 0.5 * 2/3 + }), + } + }, + south = { + layers = { + data_util.auto_sr_hr({ + filename = "__shield-projector__/graphics/entity/shield-projector/hr/shield-projector.png", + frame_count = 1, + x = 196 * 5, + width = 196, + height = 284, + line_length = 1, + shift = { 1/32, -24/32 }, + scale = 0.5 * 2/3 + }), + data_util.auto_sr_hr({ + frame_count = 1, + draw_as_shadow = true, + filename = "__shield-projector__/graphics/entity/shield-projector/hr/shield-projector-shadow.png", + x = 412 * 1, + y = 249 * 1, + width = 412, + height = 249, + line_length = 1, + shift = { (1 + 22/32) * 2/3, (-8/32) * 2/3}, + scale = 0.5 * 2/3 + }), + } + }, + west = { + layers = { + data_util.auto_sr_hr({ + filename = "__shield-projector__/graphics/entity/shield-projector/hr/shield-projector.png", + frame_count = 1, + x = 196 * 7, + width = 196, + height = 284, + line_length = 1, + shift = { 1/32, -24/32 }, + scale = 0.5 * 2/3 + }), + data_util.auto_sr_hr({ + frame_count = 1, + draw_as_shadow = true, + filename = "__shield-projector__/graphics/entity/shield-projector/hr/shield-projector-shadow.png", + x = 412 * 3, + y = 249 * 1, + width = 412, + height = 249, + line_length = 1, + shift = { (1 + 22/32) * 2/3, (-8/32) * 2/3}, + scale = 0.5 * 2/3 + }), + } + } + }, + activity_led_sprites = + { + north = blank_image, + east = blank_image, + south = blank_image, + west = blank_image + }, + activity_led_light = + { + intensity = 0.8, + size = 1, + }, + activity_led_light_offsets = + { + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0} + }, + circuit_wire_connection_points = + { + connection_point, connection_point, connection_point, connection_point, + }, + circuit_wire_max_distance = 0 + }, + { + type = "sprite", + name = data_util.mod_prefix.."interburbulator-grid", + filename = "__space-exploration-graphics__/graphics/entity/robot-faction/sr/interburbulator-grid.png", + width = 832, + height = 864, + shift = { 0,-0.5 }, + blend_mode = "additive", + scale = 1 + }, + { + type = "sprite", + name = data_util.mod_prefix.."interburbulator-light", + filename = "__space-exploration-graphics__/graphics/entity/robot-faction/sr/interburbulator-light.png", + width = 832/2, + height = 864/2, + shift = { 0,-0.5 }, + blend_mode = "additive", + scale = 2 + }, + { + type = "spider-vehicle", + name = data_util.mod_prefix.."burbulator", + collision_box = {{-1, -1}, {1, 1}}, + selection_box = {{-1, -1}, {1, 1}}, + icon = "__base__/graphics/icons/spidertron.png", + mined_sound = {filename = "__core__/sound/deconstruct-large.ogg",volume = 0.8}, + open_sound = { filename = "__base__/sound/spidertron/spidertron-door-open.ogg", volume= 0.35 }, + close_sound = { filename = "__base__/sound/spidertron/spidertron-door-close.ogg", volume = 0.4 }, + sound_minimum_speed = 0.1, + sound_scaling_ratio = 0.6, + working_sound = + { + sound = + { + filename = "__base__/sound/spidertron/spidertron-vox.ogg", + volume = 0.35 + }, + activate_sound = + { + filename = "__base__/sound/spidertron/spidertron-activate.ogg", + volume = 0.5 + }, + deactivate_sound = + { + filename = "__base__/sound/spidertron/spidertron-deactivate.ogg", + volume = 0.5 + }, + match_speed_to_activity = true, + }, + icon_size = 64, icon_mipmaps = 4, + weight = 1, + braking_force = 1, + friction_force = 1, + flags = {"placeable-neutral", "player-creation", "placeable-off-grid"}, + collision_mask = {}, + --minable = {mining_time = 1, result = "spidertron"}, + max_health = 100000, + healing_per_tick = 1000, + resistances = + { + { + type = "fire", + decrease = 15, + percent = 60 + }, + { + type = "physical", + decrease = 15, + percent = 60 + }, + { + type = "impact", + decrease = 50, + percent = 80 + }, + { + type = "explosion", + decrease = 20, + percent = 75 + }, + { + type = "acid", + decrease = 0, + percent = 70 + }, + { + type = "laser", + decrease = 0, + percent = 70 + }, + { + type = "electric", + decrease = 0, + percent = 70 + } + }, + minimap_representation = + { + filename = "__base__/graphics/entity/spidertron/spidertron-map.png", + flags = {"icon"}, + size = {128, 128}, + scale = 0.5 + }, + corpse = "spidertron-remnants", + dying_explosion = "spidertron-explosion", + energy_per_hit_point = 1, + guns = { "spidertron-rocket-launcher-1", "spidertron-rocket-launcher-2", "spidertron-rocket-launcher-3", "spidertron-rocket-launcher-4" }, + inventory_size = 80, + equipment_grid = "spidertron-equipment-grid", + height = 1.5, + torso_rotation_speed = 0.01, + chunk_exploration_radius = 3, + selection_priority = 51, + graphics_set = table.deepcopy(data.raw["spider-vehicle"].spidertron.graphics_set), + energy_source = + { + type = "void", + }, + movement_energy_consumption = "250kW", + automatic_weapon_cycling = true, + chain_shooting_cooldown_modifier = 0.5, + spider_engine = + { + legs = + { + { -- 1 + leg = data_util.mod_prefix.."burbulator-leg-1", + mount_position = util.by_pixel(15, -22),--{0.5, -0.75}, + ground_position = {2.25, -2.5}, + blocking_legs = {2}, + leg_hit_the_ground_trigger = get_leg_hit_the_ground_trigger() + }, + { -- 3 + leg = data_util.mod_prefix.."burbulator-leg-3", + mount_position = util.by_pixel(24, -3),--{0.75, 0.25}, + ground_position = {3, 1}, + blocking_legs = {1, 3}, + leg_hit_the_ground_trigger = get_leg_hit_the_ground_trigger() + }, + { -- 4 + leg = data_util.mod_prefix.."burbulator-leg-4", + mount_position = util.by_pixel(15, 17),--{0.5, 0.75}, + ground_position = {2.25, 2.5}, + blocking_legs = {2}, + leg_hit_the_ground_trigger = get_leg_hit_the_ground_trigger() + }, + { -- 5 + leg = data_util.mod_prefix.."burbulator-leg-5", + mount_position = util.by_pixel(-15, -22),--{-0.5, -0.75}, + ground_position = {-2.25, -2.5}, + blocking_legs = {5}, + leg_hit_the_ground_trigger = get_leg_hit_the_ground_trigger() + }, + { -- 7 + leg = data_util.mod_prefix.."burbulator-leg-7", + mount_position = util.by_pixel(-24, 3),--{-0.75, 0.25}, + ground_position = {-3, 1}, + blocking_legs = {4,6}, + leg_hit_the_ground_trigger = get_leg_hit_the_ground_trigger() + }, + { -- 8 + leg = data_util.mod_prefix.."burbulator-leg-8", + mount_position = util.by_pixel(-15, 17),--{-0.5, 0.75}, + ground_position = {-2.25, 2.5}, + blocking_legs = {5}, + leg_hit_the_ground_trigger = get_leg_hit_the_ground_trigger() + } + }, + military_target = "spidertron-military-target", + } + }, + make_spidertron_leg(1), + --make_spidertron_leg(2), + make_spidertron_leg(3), + make_spidertron_leg(4), + make_spidertron_leg(5), + --make_spidertron_leg(6), + make_spidertron_leg(7), + make_spidertron_leg(8), +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/iridium-piledriver.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/iridium-piledriver.lua new file mode 100644 index 0000000..6514e4f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/iridium-piledriver.lua @@ -0,0 +1,219 @@ +local data_util = require("data_util") + +se_delivery_cannon_ammo_recipes[data_util.mod_prefix.."iridium-piledriver"] = {type = "ammo", name=data_util.mod_prefix.."iridium-piledriver", amount = 1} +table.insert(data.raw.technology[data_util.mod_prefix .. "delivery-cannon-weapon"].effects, { type = "unlock-recipe", recipe = data_util.mod_prefix .. "delivery-cannon-weapon-pack-" .. data_util.mod_prefix .. "iridium-piledriver"}) + +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "iridium-piledriver", + result = data_util.mod_prefix .. "iridium-piledriver", + enabled = false, + energy_required = 20, + ingredients = { + { data_util.mod_prefix .. "heavy-girder", 50 }, + { "rocket-control-unit", 1 }, + { "explosives", 10 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "ammo", + name = data_util.mod_prefix .. "iridium-piledriver", + ammo_type = { + action = { + action_delivery = { + projectile = data_util.mod_prefix .. "iridium-piledriver", + source_effects = { + entity_name = "explosion-hit", + type = "create-entity" + }, + starting_speed = 0.05, + type = "projectile" + }, + type = "direct" + }, + category = "weapons-delivery-cannon", + cooldown_modifier = 3, + range_modifier = 3, + target_type = "position" + }, + icon = "__base__/graphics/icons/cannon-shell.png", + icon_mipmaps = 4, + icon_size = 64, + order = "d[rocket-launcher]-c[atomic-bomb]", + stack_size = 1, + subgroup = "ammo", + }, + { + type = "projectile", + name = data_util.mod_prefix .. "iridium-piledriver", + acceleration = 0.005, + action = { + action_delivery = { + target_effects = { + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 10000, + type = "physical" + }, + type = "damage" + }, + }, + type = "instant" + }, + radius = 2, + type = "area" + }, + type = "nested-result" + }, + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 1000, + type = "explosion" + }, + type = "damage" + } + }, + type = "instant" + }, + radius = 4, + type = "area" + }, + type = "nested-result" + }, + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 500, + type = "explosion" + }, + type = "damage" + } + }, + type = "instant" + }, + radius = 8, + type = "area" + }, + type = "nested-result" + }, + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 200, + type = "explosion" + }, + type = "damage" + } + }, + type = "instant" + }, + radius = 16, + type = "area" + }, + type = "nested-result" + }, + { + initial_height = 0, + max_radius = 3.5, + offset_deviation = { + { + -4, + -4 + }, + { + 4, + 4 + } + }, + repeat_count = 240, + smoke_name = "artillery-smoke", + speed_from_center = 0.05, + speed_from_center_deviation = 0.005, + type = "create-trivial-smoke" + }, + { + entity_name = "big-artillery-explosion", + type = "create-entity" + }, + { + check_buildability = true, + entity_name = "small-scorchmark", + type = "create-entity" + }, + { + scale = 0.25, + type = "show-explosion-on-chart" + } + }, + type = "instant" + }, + type = "direct" + }, + animation = { + filename = "__base__/graphics/entity/rocket/rocket.png", + frame_count = 8, + height = 35, + line_length = 8, + priority = "high", + shift = { + 0, + 0 + }, + width = 9 + }, + flags = { + "not-on-map" + }, + light = { + intensity = 0.8, + size = 15 + }, + shadow = { + filename = "__base__/graphics/entity/rocket/rocket-shadow.png", + frame_count = 1, + height = 24, + priority = "high", + shift = { + 0, + 0 + }, + width = 7 + }, + smoke = { + { + deviation = { + 0.15, + 0.15 + }, + frequency = 1, + name = "smoke-fast", + position = { + 0, + 1 + }, + slow_down_factor = 1, + starting_frame = 3, + starting_frame_deviation = 5, + starting_frame_speed = 0, + starting_frame_speed_deviation = 5 + } + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/lifesupport.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/lifesupport.lua new file mode 100644 index 0000000..356dfdd --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/lifesupport.lua @@ -0,0 +1,169 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +--[[ +Lifesupport mechanics: +Consume lifesupport canisters for food & air + +Equiment boosts the lifessuport drain efficiency, stacks additivly. +All thruster suits have some base level life support efficiency, 1 module is built-in. + +Non-thruster suits can have modules added but only function on land and efficiency banafits are halved. Only useful on hostile planets. +A spacesuit proper spacesuit is required in space. +]] + +local lifesupport_equipment_prototypes = { + ["lifesupport-equipment-1"] = { + tier = 1, grid_width = 2, grid_height = 2, power = "100kW", + ingredients = { + {"low-density-structure", 10}, + {"pipe", 10}, + {"coal", 10}, + {"electric-engine-unit", 10}, + }, + science_packs = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + }, + prerequisites = { + "battery-equipment", + data_util.mod_prefix .. "lifesupport-facility", + } + }, -- +100% efficiency + + ["lifesupport-equipment-2"] = { + tier = 2, grid_width = 2, grid_height = 2, power = "100kW", + ingredients = { + {data_util.mod_prefix .. "lifesupport-equipment-1", 1}, + {data_util.mod_prefix.."space-pipe", 10}, + {data_util.mod_prefix.."bioscrubber", 10}, + {type = "fluid", name=data_util.mod_prefix.."bio-sludge", amount = 100}, + }, + science_packs = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + }, + prerequisites = { + data_util.mod_prefix .. "lifesupport-equipment-1", + data_util.mod_prefix.."bioscrubber" + } + }, -- +200% efficiency + + ["lifesupport-equipment-3"] = { + tier = 3, grid_width = 2, grid_height = 2, power = "100kW", + ingredients = { + {data_util.mod_prefix .. "lifesupport-equipment-2", 1}, + {data_util.mod_prefix.."vitalic-reagent", 10}, + {data_util.mod_prefix.."aeroframe-bulkhead", 10}, + }, + science_packs = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-2", 1 }, + }, + prerequisites = { + data_util.mod_prefix .. "lifesupport-equipment-2", + data_util.mod_prefix.."vitalic-reagent", + data_util.mod_prefix.."aeroframe-bulkhead" + } + }, -- +400% efficiency + + ["lifesupport-equipment-4"] = { + tier = 4, grid_width = 2, grid_height = 2, power = "100kW", + ingredients = { + {data_util.mod_prefix .. "lifesupport-equipment-3", 1}, + {data_util.mod_prefix.."lattice-pressure-vessel", 10}, + {data_util.mod_prefix.."self-sealing-gel", 10}, + {data_util.mod_prefix.."naquium-tessaract", 1}, + }, + science_packs = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 }, + }, + prerequisites = { + data_util.mod_prefix .. "lifesupport-equipment-3", + data_util.mod_prefix.."lattice-pressure-vessel", + data_util.mod_prefix.."self-sealing-gel", + data_util.mod_prefix.."naquium-tessaract", + } + }, -- +800% efficiency +} + +for name, lep in pairs(lifesupport_equipment_prototypes) do + + local lifesupport_equipment = table.deepcopy(data.raw["movement-bonus-equipment"]["exoskeleton-equipment"]) + lifesupport_equipment.name = data_util.mod_prefix ..name + lifesupport_equipment.movement_bonus = 0 + lifesupport_equipment.energy_consumption = lep.power + lifesupport_equipment.sprite = { filename = "__space-exploration-graphics__/graphics/equipment/"..name..".png", width = 128, height = 128, priority = "medium" } + --lifesupport_equipment.background_color = { r = 0.2, g = 0.3, b = 0.6, a = 1 } + lifesupport_equipment.shape = { width = lep.grid_width, height = lep.grid_width, type = "full" } + lifesupport_equipment.categories = {"armor-jetpack"} -- we only want to put lifesupports in armors, same as jetpacks. Let's jump on an existing restriction. Should be safe as long as jetpacks is a hard req. + + local lifesupport_item = table.deepcopy(data.raw["item"]["exoskeleton-equipment"]) + lifesupport_item.name = data_util.mod_prefix ..name + lifesupport_item.icon = "__space-exploration-graphics__/graphics/icons/"..name..".png" + lifesupport_item.icon_mipmaps = 1 + lifesupport_item.icon_size = 64 + lifesupport_item.placed_as_equipment_result = data_util.mod_prefix ..name + + local lifesupport_recipe = table.deepcopy(data.raw["recipe"]["exoskeleton-equipment"]) + lifesupport_recipe.name = data_util.mod_prefix ..name + lifesupport_recipe.icon = icon_path + lifesupport_recipe.icon_size = 64 + lifesupport_recipe.icon_mipmaps = 1 + lifesupport_recipe.enabled = false + lifesupport_recipe.result = data_util.mod_prefix .. name + lifesupport_recipe.ingredients = lep.ingredients + lifesupport_recipe.energy_required = lep.tier * 10 + lifesupport_recipe.category = "lifesupport" + + local lifesupport_tech = { + type = "technology", + name = data_util.mod_prefix .. name, + effects = { { type = "unlock-recipe", recipe = data_util.mod_prefix ..name } }, + icon = "__space-exploration-graphics__/graphics/technology/"..name..".png", + icon_size = 128, + order = "e-g", + prerequisites = lep.prerequisites, + unit = { + count = lep.tier * 100, + time = 30, + ingredients = lep.science_packs + }, + } + + data:extend({ + lifesupport_equipment, + lifesupport_item, + lifesupport_recipe, + lifesupport_tech + }) + +end + +data:extend({ + { + type = "sprite", + name = data_util.mod_prefix .. "lifesupport-button-sprite", + filename = "__space-exploration-graphics__/graphics/icons/thruster-suit-black.png", + priority = "extra-high-no-scale", + width = 64, + height = 64, + }, + { + type = "sound", + name = data_util.mod_prefix .. "canister-breath", + variations = { filename = "__space-exploration__/sound/canister-breath.ogg", volume = 0.25 } + } +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/linked-container.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/linked-container.lua new file mode 100644 index 0000000..a38f41b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/linked-container.lua @@ -0,0 +1,103 @@ +local data_util = require("data_util") + + +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "linked-container", + icon = "__space-exploration-graphics__/graphics/icons/linked-container.png", + icon_size = 64, icon_mipmaps = 1, + subgroup = data.raw["item-subgroup"]["container-2"] and "container-2" or "storage", + order = "z-l", + place_result = data_util.mod_prefix .. "linked-container", + stack_size = 1, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "linked-container", + category = "space-manufacturing", + enabled = false, + ingredients = { + { name = data_util.mod_prefix .. "heavy-assembly", amount = 10}, + { name = data_util.mod_prefix .. "lattice-pressure-vessel", amount = 10}, + { name = data_util.mod_prefix .. "dynamic-emitter", amount = 10}, + { name = data_util.mod_prefix .. "self-sealing-gel", amount = 10}, + { name = data_util.mod_prefix .. "nanomaterial", amount = 10}, + { name = data_util.mod_prefix .. "naquium-processor", amount = 10}, + { name = data_util.mod_prefix .. "antimatter-canister", amount = 10}, + { name = data_util.mod_prefix .. "arcosphere-a", amount = 10}, + }, + energy_required = 600, + result = data_util.mod_prefix .. "linked-container" + }, + { + type = "linked-container", + name = data_util.mod_prefix .. "linked-container", + gui_mode = "none", + icon = "__space-exploration-graphics__/graphics/icons/linked-container.png", + icon_size = 64, icon_mipmaps = 1, + flags = {"placeable-neutral", "player-creation"}, + minable = {mining_time = 1, result = data_util.mod_prefix .. "linked-container"}, + max_health = 250, + corpse = "medium-remnants", + open_sound = { filename = "__base__/sound/metallic-chest-open.ogg", volume=0.43 }, + close_sound = { filename = "__base__/sound/metallic-chest-close.ogg", volume = 0.43 }, + se_allow_in_space = true, + collision_box = {{-0.8, -0.8}, {0.8, 0.8}}, + selection_box = {{-1, -1}, {1, 1}}, + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = { { -0.5, -0.5 }, { 0.5, 0.5 } }, + offsets = { { 0, 1 } }, + type = "create-entity" + }, + inventory_size = 10, + vehicle_impact_sound = table.deepcopy(data.raw.container["steel-chest"].vehicle_impact_sound), + picture = + { + layers = + { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics-5__/graphics/entity/linked-container/hr-linked-container.png", + width = 132, + height = 136, + shift = {0, 0/32}, + scale = 0.5 + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/linked-container/hr-linked-container-shadow.png", + width = 132, + height = 88, + shift = {13/32, 9/32}, + scale = 0.5 + }), + } + } + }, + { + type = "technology", + name = data_util.mod_prefix .. "linked-container", + effects = {{ type = "unlock-recipe", recipe = data_util.mod_prefix .. "linked-container"}}, + icon = "__space-exploration-graphics__/graphics/technology/linked-container.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "teleportation", + }, + unit = { + count = 5000, + time = 60, + ingredients = { + { "logistic-science-pack", 1 }, + { "utility-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .."energy-science-pack-4", 1 }, + { data_util.mod_prefix .."deep-space-science-pack-4", 1 }, + } + }, + enabled = true + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/nexus.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/nexus.lua new file mode 100644 index 0000000..71915ca --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/nexus.lua @@ -0,0 +1,325 @@ +local data_util = require("data_util") +local original_graphic_size = 8 +local structure_size = 8 +local shift_y = 0.75 +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "nexus", + icon = "__space-exploration-graphics__/graphics/icons/nexus.png", + icon_size = 64, + order = "b-a", + subgroup = "computation", + stack_size = 1, + place_result = data_util.mod_prefix .. "nexus", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "nexus", + result = data_util.mod_prefix .. "nexus", + enabled = false, + energy_required = 60, + ingredients = { + { data_util.mod_prefix .. "aeroframe-bulkhead", 10 }, + { data_util.mod_prefix .. "heavy-composite", 10 }, + { data_util.mod_prefix .. "naquium-tessaract", 20 }, + { data_util.mod_prefix .. "naquium-processor", 1 }, + { data_util.mod_prefix .. "superconductive-cable", 20 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "interstellar-data", + energy_required = 10000, + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + }, + results = { + { name = data_util.mod_prefix .. "interstellar-data", amount = 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category="nexus" + }, + { + type = "recipe", + name = data_util.mod_prefix .. "distortion-drive", + energy_required = 60, + ingredients = { + { name = data_util.mod_prefix .. "interstellar-data", amount = 1 }, + }, + results = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + icon = "__space-exploration-graphics__/graphics/icons/astronomic/anomaly.png", + icon_size = 64, + category="nexus", + localised_name = {"recipe-name."..data_util.mod_prefix .. "distortion-drive"}, + localised_description = {"recipe-description."..data_util.mod_prefix .. "distortion-drive"} + }, + { + type = "technology", + name = data_util.mod_prefix .. "nexus", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "nexus", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/nexus.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "naquium-processor", + data_util.mod_prefix .. "spaceship", + }, + unit = { + count = 2000, + time = 60, + ingredients = { + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-3", 1 }, + } + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "nexus", + icon = "__space-exploration-graphics__/graphics/icons/nexus.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {hardness = 0.2, mining_time = 1, result = data_util.mod_prefix .. "nexus"}, + max_health = 700, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{structure_size/-2+0.3, structure_size/-2+0.3}, {structure_size/2-0.3, structure_size/2-0.3}}, + selection_box = {{-structure_size/2, -structure_size/2}, {structure_size/2, structure_size/2}}, + display_box = {{-structure_size/2, -structure_size/2-2}, {structure_size/2, structure_size/2}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1, + sound = { + filename = "__base__/sound/lab.ogg", + volume = 0.7 + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + se_allow_in_space = true, + animation ={ + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/sr/nexus-base.png", + width = 467/2, + height = 290/2, + line_length = 1, + frame_count = 1, + repeat_count = 64, + animation_speed = 1, + shift = { 0/32, 50.5/32+shift_y }, + scale = structure_size/original_graphic_size, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/hr/nexus-base.png", + width = 467, + height = 290, + line_length = 1, + frame_count = 1, + repeat_count = 64, + animation_speed = 1, + shift = { 0/32, 50.5/32+shift_y }, + scale = 0.5 * structure_size/original_graphic_size, + }, + }, + { + height = 448/2, + width = 402/2, + frame_count = 64, + animation_speed = 1, + shift = { 1/32, -35/32+shift_y }, + scale = structure_size/original_graphic_size, + stripes = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/sr/nexus-1.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/sr/nexus-2.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/sr/nexus-3.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/sr/nexus-4.png", + width_in_frames = 4, + height_in_frames = 4, + }, + }, + hr_version = { + height = 448, + width = 402, + frame_count = 64, + animation_speed = 1, + shift = { 1/32, -35/32+shift_y }, + scale = 0.5 * structure_size/original_graphic_size, + stripes = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/hr/nexus-1.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/hr/nexus-2.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/hr/nexus-3.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/hr/nexus-4.png", + width_in_frames = 4, + height_in_frames = 4, + }, + }, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/sr/nexus-shadow.png", + width = 599/2, + height = 345/2, + line_length = 1, + frame_count = 1, + repeat_count = 64, + animation_speed = 1, + shift = { 1.40625, 0.34375+shift_y }, + scale = structure_size/original_graphic_size, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/hr/nexus-shadow.png", + width = 599, + height = 345, + line_length = 1, + frame_count = 1, + repeat_count = 64, + animation_speed = 1, + shift = { 1.40625, 0.34375+shift_y }, + scale = 0.5 * structure_size/original_graphic_size, + }, + } + } + }, + idle_animation = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/sr/nexus-inactive.png", + frame_count = 1, + height = 541/2, + width = 467/2, + repeat_count = 64, + shift = { 0/32, -12/32+shift_y}, + scale = structure_size/original_graphic_size, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/hr/nexus-inactive.png", + frame_count = 1, + height = 541, + width = 467, + repeat_count = 64, + shift = { 0/32, -12/32+shift_y}, + scale = 0.5 * structure_size/original_graphic_size, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/sr/nexus-shadow.png", + frame_count = 1, + width = 599/2, + height = 345/2, + repeat_count = 64, + shift = { 1.40625, 0.34375 +shift_y}, + scale = structure_size/original_graphic_size, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/nexus/hr/nexus-shadow.png", + frame_count = 1, + width = 599, + height = 345, + repeat_count = 64, + shift = { 1.40625, 0.34375 +shift_y}, + scale = 0.5 * structure_size/original_graphic_size, + }, + } + } + }, + crafting_categories = {"nexus"}, + crafting_speed = 1, + energy_source = + { + type = "void", + }, + energy_usage = "1W", + ingredient_count = 12, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {}, + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = {r = 1, g = 0.9, b = 0.5}} + }, + }, + }, + { + type = "electric-energy-interface", + name = data_util.mod_prefix .. "nexus-charger", + icon = "__space-exploration-graphics__/graphics/icons/nexus.png", + icon_size = 64, + flags = {"placeable-player", "player-creation", "placeable-off-grid", "not-deconstructable", "not-blueprintable"}, + icon_size = 64, + order = "b-a", + selectable_in_game = false, + collision_box = {{structure_size/-2+0.3, structure_size/-2+0.3}, {structure_size/2-0.3, structure_size/2-0.3}}, + selection_box = {{-structure_size/2, -structure_size/2}, {structure_size/2, structure_size/2}}, + energy_source = { + buffer_capacity = "100MJ", + input_flow_limit = "100GW", + type = "electric", + usage_priority = "secondary-input" + }, + energy_usage = "10MW" + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/pipe.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/pipe.lua new file mode 100644 index 0000000..5083e09 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/pipe.lua @@ -0,0 +1,1043 @@ +local data_util = require("data_util") +--[[ +original plan for space pipes and belts: +more of a spagetti problem. +underground distance for both is 2. +The can't span a void (space tiles or underlay) -- via script +pipes are floor layer +pipes have automatic flow control +All +straight: h, v, +corner: ne, nw, se, sw +t: n, s, w, e +X + + +]]-- +local pipe_span = 5 +local long_versions = { + {junction = true, length = 3}, + {junction = true, length = 5}, + {junction = true, length = 7}, + {junction = false, length = 9}, + {junction = false, length = 15}, +} + +local collision_floor = { -- was considering allowing on empty space + "item-layer", -- stops player from dropping items on belts. + "floor-layer", + "object-layer", + "water-tile", -- disable this for empty space pipes +} +local collision_floor_platform = { + "item-layer", -- stops player from dropping items on belts. + "floor-layer", + "object-layer", + "water-tile", +} + +local blank_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, +} + +local shift_sprite = data_util.shift_sprite + +local pipe_h = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-straight-horizontal.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-straight-horizontal.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 +} +local pipe_h_window = { + filename = "__space-exploration-graphics__/graphics/entity/pipe-long/pipe-straight-horizontal-window.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe-long/hr-pipe-straight-horizontal-window.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 +} +local pipe_v = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-straight-vertical.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-straight-vertical.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 +} +local pipe_v_window = { + filename = "__space-exploration-graphics__/graphics/entity/pipe-long/pipe-straight-vertical-window.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe-long/hr-pipe-straight-vertical-window.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 +} + +data:extend({ + { + icon = "__space-exploration-graphics__/graphics/icons/space-pipe.png", + icon_size = 64, + name = data_util.mod_prefix .. "space-pipe", + order = "a[pipe]-s[space]-a", + place_result = data_util.mod_prefix .. "space-pipe", + stack_size = 100, + subgroup = "pipe", + type = "item" + }, + + { + icon = "__space-exploration-graphics__/graphics/icons/space-pipe-to-ground.png", + icon_size = 64, + name = data_util.mod_prefix .. "space-pipe-to-ground", + order = "a[pipe]-s[space]-b", + place_result = data_util.mod_prefix .. "space-pipe-to-ground", + stack_size = 50, + subgroup = "pipe", + type = "item" + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-pipe", + expensive = { + ingredients = { + { name = "copper-cable", amount = 4 }, + { name = "steel-plate", amount = 2 }, + { name = "plastic-bar", amount = 2 }, + { name = "glass", amount = 2 }, + }, + result = data_util.mod_prefix .. "space-pipe", + energy_required = 10, + enabled = false, + }, + normal = { + ingredients = { + { name = "copper-cable", amount = 2 }, + { name = "steel-plate", amount = 1 }, + { name = "plastic-bar", amount = 1 }, + { name = "glass", amount = 1 }, + }, + result = data_util.mod_prefix .. "space-pipe", + energy_required = 10, + enabled = false, + }, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-pipe-to-ground", + ingredients = { + { data_util.mod_prefix .. "space-pipe", 10 }, + }, + result = data_util.mod_prefix .. "space-pipe-to-ground", + energy_required = 10, + result_count = 1, + enabled = false, + always_show_made_in = true, + }, + { + name = data_util.mod_prefix .. "space-pipe", + collision_box = { + { -0.29, -0.29 }, + { 0.29, 0.29 } + }, + collision_mask = collision_floor, + corpse = "small-remnants", + fast_replaceable_group = "pipe", + flags = { "placeable-neutral", "player-creation" }, + fluid_box = { + base_area = settings.startup["se-space-pipe-capacity"].value/100, + pipe_connections = { + { position = { 0, -1 } }, + { position = { 1, 0 } }, + { position = { 0, 1 } }, + { position = { -1, 0 } } + } + }, + horizontal_window_bounding_box = { + { -0.25, -0.28125 }, + { 0.25, 0.15625 } + }, + icon = "__space-exploration-graphics__/graphics/icons/space-pipe.png", + icon_size = 64, + max_health = 100, + minable = { + mining_time = 0.1, + result = data_util.mod_prefix .. "space-pipe" + }, + pictures = { + corner_down_left = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-corner-down-left.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-corner-down-left.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + corner_down_right = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-corner-down-right.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-corner-down-right.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + corner_up_left = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-corner-up-left.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-corner-up-left.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + corner_up_right = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-corner-up-right.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-corner-up-right.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + cross = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-cross.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-cross.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + ending_down = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-ending-down.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-ending-down.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + ending_left = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-ending-left.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-ending-left.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + ending_right = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-ending-right.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-ending-right.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + ending_up = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-ending-up.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-ending-up.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + fluid_background = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/fluid-background.png", + height = 20, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-fluid-background.png", + height = 40, + priority = "extra-high", + scale = 0.5, + width = 64 + }, + priority = "extra-high", + width = 32 + }, + gas_flow = { + axially_symmetrical = false, + direction_count = 1, + filename = "__space-exploration-graphics__/graphics/entity/pipe/steam.png", + frame_count = 60, + height = 15, + hr_version = { + axially_symmetrical = false, + direction_count = 1, + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-steam.png", + frame_count = 60, + height = 30, + line_length = 10, + priority = "extra-high", + width = 48 + }, + line_length = 10, + priority = "extra-high", + width = 24 + }, + high_temperature_flow = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/fluid-flow-high-temperature.png", + height = 18, + priority = "extra-high", + width = 160 + }, + horizontal_window_background = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-horizontal-window-background.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-horizontal-window-background.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + low_temperature_flow = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/fluid-flow-low-temperature.png", + height = 18, + priority = "extra-high", + width = 160 + }, + middle_temperature_flow = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/fluid-flow-medium-temperature.png", + height = 18, + priority = "extra-high", + width = 160 + }, + straight_horizontal = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-straight-horizontal.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-straight-horizontal.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + straight_horizontal_window = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-straight-horizontal-window.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-straight-horizontal-window.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + straight_vertical = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-straight-vertical.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-straight-vertical.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + straight_vertical_single = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-straight-vertical-single.png", + height = 80, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-straight-vertical-single.png", + height = 160, + priority = "extra-high", + scale = 0.5, + width = 160 + }, + priority = "extra-high", + width = 80 + }, + straight_vertical_window = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-straight-vertical-window.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-straight-vertical-window.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + t_down = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-t-down.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-t-down.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + t_left = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-t-left.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-t-left.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + t_right = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-t-right.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-t-right.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + t_up = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-t-up.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-t-up.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + vertical_window_background = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/pipe-vertical-window-background.png", + height = 64, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/pipe/hr-pipe-vertical-window-background.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + }, + resistances = { + { + percent = 80, + type = "fire" + }, + { + percent = 30, + type = "impact" + } + }, + selection_box = { + { + -0.5, + -0.5 + }, + { + 0.5, + 0.5 + } + }, + type = "pipe", + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + vertical_window_bounding_box = { + { + -0.28125, + -0.5 + }, + { + 0.03125, + 0.125 + } + }, + working_sound = { + match_volume_to_activity = true, + max_sounds_per_type = 3, + sound = { + { + filename = "__base__/sound/pipe.ogg", + volume = 0.85 + } + } + } + }, + { + type = "pipe-to-ground", + name = data_util.mod_prefix .. "space-pipe-to-ground", + icon = "__space-exploration-graphics__/graphics/icons/space-pipe-to-ground.png", + icon_size = 64, + flags = {"placeable-neutral", "player-creation"}, + minable = {mining_time = 0.1, result = data_util.mod_prefix .. "space-pipe-to-ground"}, + max_health = 150, + fast_replaceable_group = "pipe", + corpse = "small-remnants", + resistances = + { + { + type = "fire", + percent = 80 + }, + { + type = "impact", + percent = 40 + } + + }, + collision_box = {{-0.29, -0.29}, {0.29, 0.2}}, + collision_mask = collision_floor_platform, + selection_box = {{-0.5, -0.5}, {0.5, 0.5}}, + fluid_box = + { + base_area = settings.startup["se-space-pipe-capacity"].value/100, + pipe_covers = pipecoverspictures(), + pipe_connections = + { + { position = {0, -1} }, + { + position = {0, 1}, + max_underground_distance = pipe_span + 1 + } + } + }, + underground_sprite = + { + filename = "__core__/graphics/arrows/underground-lines.png", + priority = "extra-high-no-scale", + width = 64, + height = 64, + scale = 0.5 + }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + pictures = + { + up = + { + filename = "__space-exploration-graphics__/graphics/entity/pipe-to-ground/pipe-to-ground-up.png", + priority = "high", + width = 64, + height = 64, --, shift = {0.10, -0.04} + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/pipe-to-ground/hr-pipe-to-ground-up.png", + priority = "extra-high", + width = 128, + height = 128, + scale = 0.5 + } + }, + down = + { + filename = "__space-exploration-graphics__/graphics/entity/pipe-to-ground/pipe-to-ground-down.png", + priority = "high", + width = 64, + height = 64, --, shift = {0.05, 0} + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/pipe-to-ground/hr-pipe-to-ground-down.png", + priority = "extra-high", + width = 128, + height = 128, + scale = 0.5 + } + }, + left = + { + filename = "__space-exploration-graphics__/graphics/entity/pipe-to-ground/pipe-to-ground-left.png", + priority = "high", + width = 64, + height = 64, --, shift = {-0.12, 0.1} + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/pipe-to-ground/hr-pipe-to-ground-left.png", + priority = "extra-high", + width = 128, + height = 128, + scale = 0.5 + } + }, + right = + { + filename = "__space-exploration-graphics__/graphics/entity/pipe-to-ground/pipe-to-ground-right.png", + priority = "high", + width = 64, + height = 64, --, shift = {0.1, 0.1} + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/pipe-to-ground/hr-pipe-to-ground-right.png", + priority = "extra-high", + width = 128, + height = 128, + scale = 0.5 + } + } + } + }, +}) +for o, version in pairs(long_versions) do + local long_horizontal_sprites = { layers = {} } + local long_vertical_sprites = { layers = {} } + for i = -(version.length/2-0.5), version.length/2-0.5, 1 do + if i == 0 then + if version.junction then + table.insert(long_horizontal_sprites.layers, pipe_h_window) + table.insert(long_horizontal_sprites.layers, pipe_v_window) + table.insert(long_vertical_sprites.layers, pipe_h_window) + table.insert(long_vertical_sprites.layers, pipe_v_window) + else + table.insert(long_horizontal_sprites.layers, pipe_h_window) + table.insert(long_vertical_sprites.layers, pipe_v_window) + end + else + table.insert(long_horizontal_sprites.layers, shift_sprite(pipe_h,{i,0})) + table.insert(long_vertical_sprites.layers, shift_sprite(pipe_v,{0,i})) + end + end + local pipe_connections = { + {position = {0,version.length/2+0.5}}, + {position = {0,-(version.length/2+0.5)}} + } + if version.junction then + table.insert(pipe_connections, {position = {1,0}}) + table.insert(pipe_connections, {position = {-1,0}}) + end + local name = data_util.mod_prefix.."space-pipe-long-"..(version.junction and "j" or "s").."-"..version.length + table.insert(data.raw.technology[data_util.mod_prefix.."space-platform-scaffold"].effects, + { type = "unlock-recipe", recipe = name }) + + local icons = { + { icon = version.junction + and "__space-exploration-graphics__/graphics/icons/space-pipe-long-junction.png" + or "__space-exploration-graphics__/graphics/icons/space-pipe-long.png", + scale = 0.5, icon_size = 64, shift = {0, 0}}, + --{ icon = "__space-exploration-graphics__/graphics/icons/number/"..version.length..".png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + } + local length_string = tostring(version.length) + for i = 1, #length_string do + local c = length_string:sub(i,i) + table.insert(icons, { icon = "__space-exploration-graphics__/graphics/icons/number/"..c..".png", scale = 0.5, shift = {-10+(i-1)*5, -10}, icon_size = 20 } ) + end + + data:extend{ + { + icons = icons, + pictures = {{ filename = version.junction + and "__space-exploration-graphics__/graphics/icons/space-pipe-long-junction.png" + or "__space-exploration-graphics__/graphics/icons/space-pipe-long.png", + scale = 0.25, + size = 64 + }}, + name = name, + order = "a[pipe]-s[space]-c[long]-"..o, + place_result = name, + stack_size = 50, + subgroup = "pipe", + type = "item" + }, + { + type = "recipe", + name = name, + ingredients = { + { data_util.mod_prefix .. "space-pipe", math.ceil(version.length/2) }, + }, + result = name, + energy_required = 0.25 + version.length/4, + result_count = 1, + enabled = false, + always_show_made_in = true, + }, + { + type = "storage-tank", + name = name, + localised_name = version.junction + and {"entity-name."..data_util.mod_prefix.."space-pipe-long-junction", version.length} + or {"entity-name."..data_util.mod_prefix.."space-pipe-long-straight", version.length}, + localised_description = version.junction + and {"entity-description."..data_util.mod_prefix.."space-pipe-long-junction", version.length} + or {"entity-description."..data_util.mod_prefix.."space-pipe-long-straight", version.length}, + minable = { + mining_time = 0.2, + result = name, + }, + selection_box = {{-0.5,-version.length/2},{0.5,version.length/2}}, + collision_box = {{-0.3,-(version.length/2-0.2)},{0.3,version.length/2-0.2}}, + collision_mask = collision_floor, + scale_info_icons = false, + two_direction_only = true, + circuit_wire_max_distance = 0, + corpse = "storage-tank-remnants", + order = "z", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = { + { + -0.5, + -0.5 + }, + { + 0.5, + 0.5 + } + }, + offsets = { + { + 0, + 1 + } + }, + type = "create-entity" + }, + dying_explosion = "storage-tank-explosion", + flags = { + "placeable-player", + "player-creation" + }, + flow_length_in_ticks = 360, + fluid_box = { + base_area = settings.startup["se-space-pipe-capacity"].value/100, + pipe_connections = pipe_connections, + pipe_covers = { + east = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-east.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-east.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-east-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-east-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + }, + north = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-north.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-north.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-north-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-north-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + }, + south = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-south.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-south.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-south-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-south-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + }, + west = { + layers = { + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-west.png", + height = 64, + hr_version = { + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-west.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-west-shadow.png", + height = 64, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/pipe-covers/hr-pipe-cover-west-shadow.png", + height = 128, + priority = "extra-high", + scale = 0.5, + width = 128 + }, + priority = "extra-high", + width = 64 + } + } + } + } + }, + icon = version.junction + and "__space-exploration-graphics__/graphics/icons/space-pipe-long-junction.png" + or "__space-exploration-graphics__/graphics/icons/space-pipe-long.png", + icon_size = 64, + icon_mipmaps = 1, + max_health = 500, + pictures = { + flow_sprite = { + filename = "__base__/graphics/entity/pipe/fluid-flow-low-temperature.png", + height = 20, + priority = "extra-high", + width = 160 + }, + fluid_background = { + filename = "__base__/graphics/entity/storage-tank/fluid-background.png", + height = 15, + priority = "extra-high", + width = 16 + }, + gas_flow = { + animation_speed = 0.25, + axially_symmetrical = false, + direction_count = 1, + filename = "__base__/graphics/entity/pipe/steam.png", + frame_count = 60, + height = 15, + hr_version = { + animation_speed = 0.25, + axially_symmetrical = false, + direction_count = 1, + filename = "__base__/graphics/entity/pipe/hr-steam.png", + frame_count = 60, + height = 30, + line_length = 10, + priority = "extra-high", + scale = 0.5, + width = 48 + }, + line_length = 10, + priority = "extra-high", + width = 24 + }, + picture = { + north = long_vertical_sprites, + south = long_vertical_sprites, + east = long_horizontal_sprites, + west = long_horizontal_sprites, + }, + window_background = { + filename = "__base__/graphics/entity/storage-tank/window-background.png", + height = 12, + hr_version = { + filename = "__base__/graphics/entity/storage-tank/hr-window-background.png", + height = 24, + priority = "extra-high", + scale = 0.5, + width = 34 + }, + priority = "extra-high", + width = 17 + } + }, + window_bounding_box = { + { + -0.1, + -0.5 + }, + { + 0.1, + -0.15 + } + }, + vehicle_impact_sound = { + { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-2.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-3.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-4.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-5.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-6.ogg", + volume = 0.5 + } + }, + water_reflection = { + orientation_to_variation = false, + pictures = { + filename = "__base__/graphics/entity/storage-tank/storage-tank-reflection.png", + height = 24, + priority = "extra-high", + scale = 5, + shift = { + 0.15625, + 1.09375 + }, + variation_count = 1, + width = 24 + }, + rotate = false + }, + working_sound = { + apparent_volume = 1.5, + match_volume_to_activity = true, + max_sounds_per_type = 3, + sound = { + filename = "__base__/sound/storage-tank.ogg", + volume = 0.6 + } + } + } + } +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/probe.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/probe.lua new file mode 100644 index 0000000..2fd6424 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/probe.lua @@ -0,0 +1,990 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "item", + name = data_util.mod_prefix.."space-probe-rocket-silo", + icon = "__space-exploration-graphics__/graphics/icons/probe-rocket-silo.png", + icon_size = 64, + icon_mipmaps = 1, + order = "c-a", + subgroup = "rocket-logistics", + stack_size = 1, + place_result = data_util.mod_prefix.."space-probe-rocket-silo", + }, + { + type = "item", + name = data_util.mod_prefix.."space-probe-rocket", + icon = "__space-exploration-graphics__/graphics/icons/probe-rocket.png", + icon_size = 64, + order = "c-b", + subgroup = "rocket-logistics", + stack_size = 1, + }, + { + type = "item", + name = data_util.mod_prefix .. "space-probe-rocket-deployed", + icon = "__space-exploration-graphics__/graphics/icons/probe-rocket.png", + icon_size = 64, + order = "c-b", + stack_size = 1, + category = "rocket-building", + subgroup = "rocket-logistics", + flags = { "hidden" }, + }, + { + type = "recipe", + name = data_util.mod_prefix.."space-probe-rocket-silo", + result = data_util.mod_prefix.."space-probe-rocket-silo", + enabled = false, + energy_required = 50, + ingredients = { + { "electric-engine-unit", 200 }, + { "processing-unit", 200 }, + { data_util.mod_prefix .. "heat-shielding", 200 }, + { data_util.mod_prefix .. "holmium-cable", 200 }, + { data_util.mod_prefix .. "heavy-girder", 100 }, + { data_util.mod_prefix .. "aeroframe-scaffold", 100 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix.."space-probe-rocket", + result = data_util.mod_prefix.."space-probe-rocket", + enabled = false, + energy_required = 100, + ingredients = { + { data_util.mod_prefix.."cargo-rocket-section", 15 }, + { data_util.mod_prefix .. "iridium-plate", 50 }, + { data_util.mod_prefix .. "aeroframe-scaffold", 40 }, + { data_util.mod_prefix .. "holmium-solenoid", 30 }, + { "rocket-fuel", 50 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + -- the dummy recipe for ethe rcoket silo section, required for launch + -- the component is inserted then the launch pad has the required parts. + type = "recipe", + name = data_util.mod_prefix.."space-probe-rocket-deploy", + result = data_util.mod_prefix .. "space-probe-rocket-deployed", + category = "rocket-building", + enabled = false, + energy_required = 100, + hidden = true, + ingredients = { + { data_util.mod_prefix.."space-probe-rocket", 1 } -- could be anything really + }, + always_show_made_in = true, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-probe", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix.."space-probe-rocket-silo"}, + { type = "unlock-recipe", recipe = data_util.mod_prefix.."space-probe-rocket" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/probe-rocket.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "aeroframe-scaffold", + data_util.mod_prefix .. "holmium-solenoid", + }, + unit = { + count = 200, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + } + } + }, + { + type = "rocket-silo", + name = data_util.mod_prefix.."space-probe-rocket-silo", + icon = "__space-exploration-graphics__/graphics/icons/probe-rocket-silo.png", + icon_size = 64, + icon_mipmaps = 1, + flags = {"placeable-player", "player-creation"}, + crafting_categories = {"rocket-building"}, + rocket_parts_required = 1, + crafting_speed = 1, + rocket_result_inventory_size = 40, + module_specification = + { + module_slots = 4, + module_info_icon_shift = {0, 3.3} + }, + fixed_recipe = data_util.mod_prefix.."space-probe-rocket-deploy", + show_recipe_icon = false, + allowed_effects = {"consumption", "speed", "pollution"}, + minable = {mining_time = 1, result = data_util.mod_prefix.."space-probe-rocket-silo"}, + max_health = 5000, + corpse = "rocket-silo-remnants", + dying_explosion = "rocket-silo-explosion", + collision_box = {{-4.40, -4.40}, {4.40, 4.40}}, + selection_box = {{-4.5, -4.5}, {4.5, 4.5}}, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + se_allow_in_space = true, + damaged_trigger_effect = table.deepcopy(data.raw["rocket-silo"]["rocket-silo"].damaged_trigger_effect), + hole_clipping_box = { {-2.75, -1.15}, {2.75, 2.25} }, + resistances = + { + { + type = "fire", + percent = 60 + }, + { + type = "impact", + percent = 60 + } + }, + vehicle_impact_sound = table.deepcopy(data.raw["rocket-silo"]["rocket-silo"].vehicle_impact_sound), + energy_source = + { + type = "electric", + usage_priority = "primary-input" + }, + energy_usage = "250kW", --energy usage used when crafting the rocket + idle_energy_usage = "10KW", + lamp_energy_usage = "10KW", + active_energy_usage = "3990KW", + rocket_entity = data_util.mod_prefix.."space-probe-rocket", + times_to_blink = 3, + light_blinking_speed = 1 / (3 * 60), + door_opening_speed = 1 / (4.25 * 60), + + base_engine_light = + { + intensity = 1, + size = 25, + shift = {0, 1.5} + }, + + shadow_sprite = + { + filename = "__base__/graphics/entity/rocket-silo/00-rocket-silo-shadow.png", + priority = "medium", + width = 304, + height = 290, + draw_as_shadow = true, + dice = 2, + shift = util.by_pixel(8, 2), + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/hr-00-rocket-silo-shadow.png", + priority = "medium", + width = 612, + height = 578, + draw_as_shadow = true, + dice = 2, + shift = util.by_pixel(7, 2), + scale = 0.5 + }, + }, + + hole_sprite = + { + filename = "__base__/graphics/entity/rocket-silo/01-rocket-silo-hole.png", + width = 202, + height = 136, + shift = util.by_pixel(-6, 16), + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/hr-01-rocket-silo-hole.png", + width = 400, + height = 270, + shift = util.by_pixel(-5, 16), + scale = 0.5 + } + }, + hole_light_sprite = + { + filename = "__base__/graphics/entity/rocket-silo/01-rocket-silo-hole-light.png", + width = 202, + height = 136, + shift = util.by_pixel(-6, 16), + tint = {1,1,1,0}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/hr-01-rocket-silo-hole-light.png", + width = 400, + height = 270, + shift = util.by_pixel(-5, 16), + tint = {1,1,1,0}, + scale = 0.5 + } + }, + + rocket_shadow_overlay_sprite = + { + filename = "__base__/graphics/entity/rocket-silo/03-rocket-over-shadow-over-rocket.png", + width = 212, + height = 142, + shift = util.by_pixel(-2, 22), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-03-rocket-over-shadow-over-rocket.png", + width = 426, + height = 288, + shift = util.by_pixel(-2, 21), + scale = 0.5 + } + }, + rocket_glow_overlay_sprite = + { + filename = "__base__/graphics/entity/rocket-silo/03-rocket-over-glow.png", + blend_mode = "additive", + width = 218, + height = 222, + shift = util.by_pixel(-4, 36), + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/hr-03-rocket-over-glow.png", + blend_mode = "additive", + width = 434, + height = 446, + shift = util.by_pixel(-3, 36), + scale = 0.5 + } + }, + + door_back_sprite = + { + filename = "__base__/graphics/entity/rocket-silo/04-door-back.png", + width = 158, + height = 144, + shift = util.by_pixel(36, 12), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-04-door-back.png", + width = 312, + height = 286, + shift = util.by_pixel(37, 12), + scale = 0.5 + } + }, + door_back_open_offset = {1.8, -1.8 * 0.43299225}, + door_front_sprite = + { + filename = "__base__/graphics/entity/rocket-silo/05-door-front.png", + width = 166, + height = 152, + shift = util.by_pixel(-28, 32), + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/hr-05-door-front.png", + width = 332, + height = 300, + shift = util.by_pixel(-28, 33), + scale = 0.5 + } + }, + door_front_open_offset = {-1.8, 1.8 * 0.43299225}, + + base_day_sprite = {layers = { + { + filename = "__base__/graphics/entity/rocket-silo/06-rocket-silo.png", + width = 300, + height = 300, + shift = util.by_pixel(2, -2), + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/hr-06-rocket-silo.png", + width = 608, + height = 596, + shift = util.by_pixel(3, -1), + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/probe/sr/06-rocket-silo-mask.png", + width = 608/2, + height = 596/2, + shift = util.by_pixel(3, -1), + tint = {r=0.4,b=0.9,g=0.6}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/probe/hr/06-rocket-silo-mask.png", + width = 608, + height = 596, + shift = util.by_pixel(3, -1), + tint = {r=0.4,b=0.9,g=0.6}, + scale = 0.5 + } + }, + }}, + red_lights_back_sprites = + { + layers = + { + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {1.34375, 0.28125-1.375}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {1.34375, 0.28125-1.375}, + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {2.3125, 0.9375-1.375}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {2.3125, 0.9375-1.375}, + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {2.65625, 1.90625-1.375}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {2.65625, 1.90625-1.375}, + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {-2.65625, 1.90625-1.375}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {-2.65625, 1.90625-1.375}, + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {-2.3125, 0.9375-1.375}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {-2.3125, 0.9375-1.375}, + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {-1.34375, 0.28125-1.375}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {-1.34375, 0.28125-1.375}, + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {0, 0-1.375}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {0, 0-1.375}, + scale = 0.5 + } + } + } + }, + + red_lights_front_sprites = + { + layers = + { + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {2.3125, 2.8125-1.375}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {2.3125, 2.8125-1.375}, + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {1.34375, 3.40625-1.375}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {1.34375, 3.40625-1.375}, + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {0, 3.75-1.375}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {0, 3.75-1.375}, + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {-1.34375, 3.40625-1.375}, + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {0, 3.75-1.375}, + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {-2.3125, 2.8125-1.375}, + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {-2.3125, 2.8125-1.375}, + scale = 0.5 + } + } + } + }, + satellite_animation = + { + filename = "__base__/graphics/entity/rocket-silo/15-rocket-silo-turbine.png", + priority = "medium", + width = 28, + height = 46, + frame_count = 32, + line_length = 8, + animation_speed = 0.4, + shift = util.by_pixel(-100, 110), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-15-rocket-silo-turbine.png", + priority = "medium", + width = 54, + height = 88, + frame_count = 32, + line_length = 8, + animation_speed = 0.4, + shift = util.by_pixel(-100, 111), + scale = 0.5 + } + }, + + arm_01_back_animation = + { + filename = "__base__/graphics/entity/rocket-silo/08-rocket-silo-arms-back.png", + priority = "medium", + width = 66, + height = 76, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(-54, -84), + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/hr-08-rocket-silo-arms-back.png", + priority = "medium", + width = 128, + height = 150, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(-53, -84), + scale = 0.5 + } + }, + + arm_02_right_animation = + { + filename = "__base__/graphics/entity/rocket-silo/08-rocket-silo-arms-right.png", + priority = "medium", + width = 94, + height = 94, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(100, -38), + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/hr-08-rocket-silo-arms-right.png", + priority = "medium", + width = 182, + height = 188, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(101, -38), + scale = 0.5 + } + }, + + arm_03_front_animation = + { + filename = "__base__/graphics/entity/rocket-silo/13-rocket-silo-arms-front.png", + priority = "medium", + width = 66, + height = 114, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(-52, 16), + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/hr-13-rocket-silo-arms-front.png", + priority = "medium", + width = 126, + height = 228, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(-51, 16), + scale = 0.5 + } + }, + + base_front_sprite = { + layers = { + { + filename = "__base__/graphics/entity/rocket-silo/14-rocket-silo-front.png", + width = 292, + height = 132, + shift = util.by_pixel(-2, 78), + hr_version = + { + filename = "__base__/graphics/entity/rocket-silo/hr-14-rocket-silo-front.png", + width = 580, + height = 262, + shift = util.by_pixel(-1, 78), + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/probe/sr/14-rocket-silo-front-mask.png", + width = 580/2, + height = 262/2, + shift = util.by_pixel(-1, 78), + tint = {r=0.4,b=0.9,g=0.6}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/probe/hr/14-rocket-silo-front-mask.png", + width = 580, + height = 262, + shift = util.by_pixel(-1, 78), + tint = {r=0.4,b=0.9,g=0.6}, + scale = 0.5 + } + }, + } + }, + silo_fade_out_start_distance = 8, + silo_fade_out_end_distance = 15, + + alarm_sound = + { + filename = "__base__/sound/silo-alarm.ogg", + volume = 1.0 + }, + clamps_on_sound = + { + filename = "__base__/sound/silo-clamps-on.ogg", + volume = 1.0 + }, + clamps_off_sound = + { + filename = "__base__/sound/silo-clamps-off.ogg", + volume = 0.8 + }, + doors_sound = + { + filename = "__base__/sound/silo-doors.ogg", + volume = 0.8 + }, + raise_rocket_sound = + { + filename = "__base__/sound/silo-raise-rocket.ogg", + volume = 1.0 + }, + open_sound = table.deepcopy(data.raw["rocket-silo"]["rocket-silo"].open_sound), + close_sound = table.deepcopy(data.raw["rocket-silo"]["rocket-silo"].close_sound), + working_sound = + { + sound = + { + filename = "__base__/sound/rocket-silo-working-1.ogg", + volume = 0.8 + }, + fade_in_ticks = 10, + fade_out_ticks = 15, + }, + flying_sound = + { + filename = "__base__/sound/silo-rocket.ogg", + volume = 1.0, + audible_distance_modifier = 3, + } + + }, + { + type = "rocket-silo-rocket", + name = data_util.mod_prefix.."space-probe-rocket", + flags = {"not-on-map"}, + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-2, -7}, {2, 4}}, + selection_box = {{0, 0}, {0, 0}}, + dying_explosion = "massive-explosion", + shadow_slave_entity = "rocket-silo-rocket-shadow", + inventory_size = 1, + rising_speed = 1 / (7 * 60), + engine_starting_speed = 1 / (5.5 * 60), + flying_speed = 1 / (2000 * 60), + flying_acceleration = 0.01, + + glow_light = + { + intensity = 1, + size = 30, + shift = {0, 1.5}, + color = {r = 1.0, g = 1.0, b = 1.0} + }, + + rocket_sprite = util.add_shift_offset(util.by_pixel(0, 32*3.5), --util.mul_shift(rocket_rise_offset, -1), + { + filename = "__space-exploration-graphics-5__/graphics/entity/probe/sr/probe-rocket.png", + width = 310/2, + height = 596/2, + shift = util.by_pixel(-5, -27), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/probe/hr/probe-rocket.png", + width = 310, + height = 596, + shift = util.by_pixel(-5, -27), + scale = 0.5 + } + }), + + rocket_shadow_sprite = util.add_shift_offset(util.by_pixel(-146, -120), + { + filename = "__base__/graphics/entity/rocket-silo/09-rocket-shadow.png", + priority = "medium", + width = 336, + height = 110, + draw_as_shadow = true, + shift = util.by_pixel(146, 120), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-09-rocket-shadow.png", + priority = "medium", + width = 672, + height = 216, + draw_as_shadow = true, + shift = util.by_pixel(146, 121), + scale = 0.5 + } + }), + + rocket_glare_overlay_sprite = util.add_shift_offset(util.by_pixel(0, 112+112), + { + filename = "__base__/graphics/entity/rocket-silo/03-rocket-over-glare.png", + blend_mode = "additive", + width = 481, + height = 481, + shift = util.by_pixel(-2, -2), + flags = { "linear-magnification", "linear-minification" }, + --hr_version = + --{ + -- filename = "__base__/graphics/entity/rocket-silo/hr-03-rocket-over-glare.png", + -- blend_mode = "additive", + -- width = 954, + -- height = 954, + -- shift = util.by_pixel(0, 0), + -- scale = 0.5 + --} + }), + rocket_smoke_top1_animation = util.add_shift_offset(util.by_pixel(0-66, -112+28+232+32), + { + filename = "__base__/graphics/entity/rocket-silo/12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 1, g = 0, b = 0, a = 0.8 }, + width = 41, + height = 145, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5*1.3, + shift = util.by_pixel(-2, -2), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 1, g = 0, b = 0, a = 0.8 }, + width = 80, + height = 286, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5/2*1.3, + shift = util.by_pixel(-1, -3), + } + }), + rocket_smoke_top2_animation = util.add_shift_offset(util.by_pixel(0+17, -112+28+265+32), + { + filename = "__base__/graphics/entity/rocket-silo/12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 0, g = 1, b = 0, a = 0.8 }, + width = 41, + height = 145, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5*1.3, + shift = util.by_pixel(-2, -2), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 0, g = 1, b = 0, a = 0.8 }, + width = 80, + height = 286, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5/2*1.3, + shift = util.by_pixel(-1, -3), + } + }), + rocket_smoke_top3_animation = util.add_shift_offset(util.by_pixel(0+48, -112+28+252+32), + { + filename = "__base__/graphics/entity/rocket-silo/12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 0, g = 0, b = 1, a = 0.8 }, + width = 41, + height = 145, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5*1.3, + shift = util.by_pixel(-2, -2), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 0, g = 0, b = 1, a = 0.8 }, + width = 80, + height = 286, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5/2*1.3, + shift = util.by_pixel(-1, -3), + } + }), + + rocket_smoke_bottom1_animation = util.add_shift_offset(util.by_pixel(0-69, -112+28+205+32), + { + filename = "__base__/graphics/entity/rocket-silo/12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.7 }, + --tint = { r = 1, g = 1, b = 0, a = 0.8 }, + width = 41, + height = 145, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5*1.3, + shift = util.by_pixel(-2, -2), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.7 }, + --tint = { r = 1, g = 1, b = 0, a = 0.8 }, + width = 80, + height = 286, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5/2*1.3, + shift = util.by_pixel(-1, -3), + } + }), + rocket_smoke_bottom2_animation = util.add_shift_offset(util.by_pixel(0+62, -112+28+207+32), + { + filename = "__base__/graphics/entity/rocket-silo/12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.7 }, + --tint = { r = 0, g = 1, b = 1, a = 0.8 }, + width = 41, + height = 145, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5*1.3, + shift = util.by_pixel(-2, -2), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.7 }, + --tint = { r = 0, g = 1, b = 1, a = 0.8 }, + width = 80, + height = 286, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5/2*1.3, + shift = util.by_pixel(-1, -3), + } + }), + rocket_flame_animation = util.add_shift_offset(util.by_pixel(-1, 280-16), + { + filename = "__base__/graphics/entity/rocket-silo/10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 87, + height = 128, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 1.13, + shift = util.by_pixel(-0.5, -2), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 172, + height = 256, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 1.13/2, + shift = util.by_pixel(-1, -2), + } + }), + rocket_flame_left_animation = util.add_shift_offset(util.by_pixel(-32-28+3, 280-68+1), + { + filename = "__base__/graphics/entity/rocket-silo/10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 87, + height = 128, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 0.345*1.15, + shift = util.by_pixel(-0.5, -2), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 172, + height = 256, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 0.345/2*1.15, + shift = util.by_pixel(-1, -2), + } + }), + rocket_flame_left_rotation = 0.0611, + + rocket_flame_right_animation = util.add_shift_offset(util.by_pixel(32+16, 280-50), + { + filename = "__base__/graphics/entity/rocket-silo/10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 87, + height = 128, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 0.368*1.15, + shift = util.by_pixel(-0.5, -2), + hr_version = { + filename = "__base__/graphics/entity/rocket-silo/hr-10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 172, + height = 256, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 0.368/2*1.15, + shift = util.by_pixel(-1, -2), + } + }), + rocket_flame_right_rotation = 0.952, + + rocket_initial_offset = {0, 1.5}, + rocket_rise_offset = {0, -3.5}, + rocket_launch_offset = {0, -256}, + rocket_render_layer_switch_distance = 7.5, + full_render_layer_switch_distance = 9, + effects_fade_in_start_distance = 4.5, + effects_fade_in_end_distance = 7.5, + shadow_fade_out_start_ratio = 0.25, + shadow_fade_out_end_ratio = 0.75, + rocket_visible_distance_from_center = 2.75, + rocket_above_wires_slice_offset_from_center = -3, + rocket_air_object_slice_offset_from_center = -5.5 + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/rail.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/rail.lua new file mode 100644 index 0000000..fdd199f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/rail.lua @@ -0,0 +1,73 @@ +local data_util = require("data_util") + +local collision_floor = { + --"item-layer", -- stops player from dropping items on belts. + "floor-layer", + --"object-layer", + "water-tile", + "rail-layer" +} + +--data.raw["curved-rail"]["curved-rail"].fast_replaceable_group = "curved-rail" -- makes crossing placement overwrite instead of cross +--data.raw["straight-rail"]["straight-rail"].fast_replaceable_group = "straight-rail" -- makes crossing placement overwrite instead of cross + +data.raw["rail-signal"]["rail-signal"].collision_mask = collision_floor +data.raw["rail-chain-signal"]["rail-chain-signal"].collision_mask = collision_floor + +local curved_rail = table.deepcopy(data.raw["curved-rail"]["curved-rail"]) +curved_rail.name = data_util.mod_prefix .. "space-curved-rail" +curved_rail.icon = "__space-exploration-graphics__/graphics/icons/space-rail.png" +curved_rail.icon_size = 64 +curved_rail.icon_mipmaps = 1 +curved_rail.minable = { mining_time = 0.2, count = 4, result = data_util.mod_prefix .. "space-rail"} +curved_rail.placeable_by = { count = 4, item = data_util.mod_prefix .. "space-rail"} +curved_rail.collision_mask = collision_floor +curved_rail.fast_replaceable_group = "space-curved-rail" +curved_rail.next_upgrade = nil +--data.raw["curved-rail"]["curved-rail"].next_upgrade = curved_rail.name + +data_util.replace_filenames_recursive(curved_rail.pictures, "__base__/graphics/entity/curved-rail/hr-", "__space-exploration-graphics__/graphics/entity/space-rail/hr/") +data_util.replace_filenames_recursive(curved_rail.pictures, "__base__/graphics/entity/rail-endings/hr-rail-endings-background.png", + "__space-exploration-graphics__/graphics/entity/space-rail/hr/rail-endings-background.png") +data_util.replace_filenames_recursive(curved_rail.pictures, "__base__/graphics/entity/curved-rail/", "__space-exploration-graphics__/graphics/entity/space-rail/sr/") +data_util.replace_filenames_recursive(curved_rail.pictures, "__base__/graphics/entity/rail-endings/rail-endings-background.png", + "__space-exploration-graphics__/graphics/entity/space-rail/sr/rail-endings-background.png") + +local straight_rail = table.deepcopy(data.raw["straight-rail"]["straight-rail"]) +straight_rail.name = data_util.mod_prefix .. "space-straight-rail" +straight_rail.icon = "__space-exploration-graphics__/graphics/icons/space-rail.png" +straight_rail.icon_size = 64 +straight_rail.icon_mipmaps = 1 +straight_rail.minable = { + mining_time = 0.2, + result = data_util.mod_prefix .. "space-rail" +} +straight_rail.placeable_by = { count = 1, item = data_util.mod_prefix .. "space-rail"} +straight_rail.collision_mask = collision_floor +straight_rail.fast_replaceable_group = "space-rail" +straight_rail.next_upgrade = nil +--data.raw["straight-rail"]["straight-rail"].next_upgrade = straight_rail.name + +data_util.replace_filenames_recursive(straight_rail.pictures, "__base__/graphics/entity/straight-rail/hr-", "__space-exploration-graphics__/graphics/entity/space-rail/hr/") +data_util.replace_filenames_recursive(straight_rail.pictures, "__base__/graphics/entity/rail-endings/hr-rail-endings-background.png", + "__space-exploration-graphics__/graphics/entity/space-rail/hr/rail-endings-background.png") +data_util.replace_filenames_recursive(straight_rail.pictures, "__base__/graphics/entity/straight-rail/", "__space-exploration-graphics__/graphics/entity/space-rail/sr/") +data_util.replace_filenames_recursive(straight_rail.pictures, "__base__/graphics/entity/rail-endings/rail-endings-background.png", + "__space-exploration-graphics__/graphics/entity/space-rail/sr/rail-endings-background.png") + +local rail_planner = table.deepcopy(data.raw["rail-planner"]["rail"]) +rail_planner.name = data_util.mod_prefix .. "space-"..rail_planner.name +rail_planner.curved_rail = curved_rail.name +rail_planner.straight_rail = straight_rail.name +rail_planner.place_result = straight_rail.name +rail_planner.localised_name = { "item-name.".. data_util.mod_prefix .. "space-rail"} +rail_planner.icon = "__space-exploration-graphics__/graphics/icons/space-rail.png" +rail_planner.icon_size = 64 +rail_planner.icon_mipmaps = 1 +rail_planner.subgroup = "rail" + +data:extend({ + rail_planner, + straight_rail, + curved_rail +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/spaceship-clamps.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/spaceship-clamps.lua new file mode 100644 index 0000000..a8f97d4 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/spaceship-clamps.lua @@ -0,0 +1,283 @@ +local data_util = require("data_util") + +local blank = { + direction_count = 8, + frame_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + priority = "low" +} +local blank_set = { + backplates = blank, + metals = blank, + stone_path = blank, + ties = blank, +} +local picture_left = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-clamps/spaceship-clamps.png", + width = 192/2, + height = 160/2, + x = 192/2, + y = 160/2, + priority = "high", + shift = {0,0}, + variation_count = 1, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-clamps/hr-spaceship-clamps.png", + width = 192, + height = 160, + x = 192, + y = 160, + priority = "high", + scale = 0.5, + shift = {0,0}, + variation_count = 1, + }, +} + +local pictures_left = { + backplates = blank, + metals = picture_left, + ties = blank, + stone_path = blank +} +local picture_right = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-clamps/spaceship-clamps.png", + width = 192/2, + height = 160/2, + y = 160/2, + priority = "high", + shift = {0,0}, + variation_count = 1, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-clamps/hr-spaceship-clamps.png", + width = 192, + height = 160, + y = 160, + priority = "high", + scale = 0.5, + shift = {0,0}, + variation_count = 1, + }, +} +local pictures_right = { + backplates = blank, + metals = picture_right, + ties = blank, + stone_path = blank +} +local connection_point = { + wire = { red = {0,0}, green = {0,0}, }, + shadow = { red = {0,0}, green = {0,0}, }, +} +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "spaceship-clamp", + icon = "__space-exploration-graphics__/graphics/icons/spaceship-clamp.png", + icon_size = 64, + order = "c-a", + subgroup = "spaceship-structure", + stack_size = 50, + place_result = data_util.mod_prefix .. "spaceship-clamp-place", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-clamp", + result = data_util.mod_prefix .. "spaceship-clamp", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "aeroframe-scaffold", 10 }, + { data_util.mod_prefix .. "heavy-girder", 6 }, + { "electric-engine-unit", 10 }, + { "processing-unit", 10 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + --[[ + { + type = "item", + name = data_util.mod_prefix .. "spaceship-clamp-anchor", + icon = "__space-exploration-graphics__/graphics/icons/spaceship-clamp-anchor.png", + icon_size = 64, + order = "c-b", + subgroup = "energy", + stack_size = 50, + place_result = data_util.mod_prefix .. "spaceship-clamp-anchor", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-clamp-anchor", + result = data_util.mod_prefix .. "spaceship-clamp-anchor", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "aeroframe-scaffold", 6 }, + { data_util.mod_prefix .. "heavy-girder", 10 }, + { "electric-engine-unit", 10 }, + { "processing-unit", 10 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + },]] + { + type = "technology", + name = data_util.mod_prefix .. "spaceship-clamps", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "spaceship-clamp" }, + --{ type = "unlock-recipe", recipe = data_util.mod_prefix .. "spaceship-clamp-anchor" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-clamps.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "spaceship", + data_util.mod_prefix .. "heavy-girder", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + } + }, + }, + { + type = "straight-rail", + name = data_util.mod_prefix .. "spaceship-clamp-place", + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "spaceship-clamp"}, + se_allow_in_space = true, + corpse = "straight-rail-remnants", + collision_box = {{-0.99,-0.99},{0.99,0.99}}, + collision_mask = {"player-layer", "floor-layer", "item-layer"}, + selection_box = {{-1,-1},{1,1}}, + damaged_trigger_effect = { + entity_name = "wall-damaged-explosion", + offset_deviation = { + { + -0.5, + -0.5 + }, + { + 0.5, + 0.5 + } + }, + offsets = { + { + 0, + 1 + } + }, + type = "create-entity" + }, + dying_explosion = "rail-explosion", + flags = { + "placeable-neutral", + "player-creation", + }, + icon = "__space-exploration-graphics__/graphics/icons/spaceship-clamp.png", + icon_mipmaps = 1, + icon_size = 64, + max_health = 100, + pictures = { + curved_rail_horizontal_left_bottom = blank_set, + curved_rail_horizontal_left_top = blank_set, + curved_rail_horizontal_right_bottom = blank_set, + curved_rail_horizontal_right_top = blank_set, + curved_rail_vertical_left_bottom = blank_set, + curved_rail_vertical_left_top = blank_set, + curved_rail_vertical_right_bottom = blank_set, + curved_rail_vertical_right_top = blank_set, + rail_endings = { + sheets = { + { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + flags = { + "low-object" + }, + priority = "low", + }, + } + }, + straight_rail_diagonal_left_bottom = blank_set, + straight_rail_diagonal_left_top = blank_set, + straight_rail_diagonal_right_bottom = blank_set, + straight_rail_diagonal_right_top = blank_set, + straight_rail_horizontal = pictures_left, + straight_rail_vertical = pictures_right, + }, + resistances = { + { + percent = 100, + type = "fire" + }, + { + percent = 80, + type = "acid" + } + }, + }, + { + type = "constant-combinator", + name = data_util.mod_prefix .. "spaceship-clamp", + placeable_by = {item=data_util.mod_prefix .. "spaceship-clamp", count = 1}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "spaceship-clamp"}, + flags = { + "placeable-neutral", + "player-creation", + }, + icon = "__space-exploration-graphics__/graphics/icons/spaceship-clamp.png", + icon_mipmaps = 1, + icon_size = 64, + order="c", + max_health = 1000, + corpse = "small-remnants", + collision_box = {{-0.99,-0.99},{0.99,0.99}}, + collision_mask = {"player-layer", "floor-layer", "item-layer"}, + selection_box = {{-1,-1},{1,1}}, + scale_info_icons = false, + item_slot_count = 1, + sprites = + { + north = blank, + east = picture_right, + south = blank, + west = picture_left + }, + activity_led_sprites = + { + north = blank, + east = blank, + south = blank, + west = blank + }, + activity_led_light = + { + intensity = 0.8, + size = 1, + }, + activity_led_light_offsets = + { + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0} + }, + circuit_wire_connection_points = + { + connection_point, connection_point, connection_point, connection_point, + }, + circuit_wire_max_distance = 0 + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/transport-belt.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/transport-belt.lua new file mode 100644 index 0000000..7ac9667 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/transport-belt.lua @@ -0,0 +1,516 @@ +local data_util = require("data_util") + +local belt_span = 5 +local deep_belt_span = 16 +local deep_speed = settings.startup[data_util.mod_prefix .. "deep-space-belt-speed"].value * (1+1/3)/10 / 64 -- 0.133333333 +local default_variant = "black" +local deep_space_variants = { + ["black"] = {r=0,g=0,b=0}, + ["white"] = {r=1,g=1,b=1}, + ["red"] = {r=1,g=0,b=0}, + ["magenta"] = {r=1,g=0,b=1}, + ["blue"] = {r=0,g=0,b=1}, + ["cyan"] = {r=0,g=1,b=1}, + ["green"] = {r=0,g=1,b=0}, + ["yellow"] = {r=1,g=1,b=0}, +} + +local collision_floor = { + --"item-layer", -- stops player from dropping items on belts. + "floor-layer", + "object-layer", + "water-tile", + "transport-belt-layer" +} +local collision_floor_platform = { + --"item-layer", -- stops player from dropping items on belts. + "floor-layer", + "object-layer", + "water-tile", + "transport-belt-layer" +} + +data:extend({ + { + icon = "__space-exploration-graphics__/graphics/icons/transport-belt.png", + icon_size = 64, + name = data_util.mod_prefix .. "space-transport-belt", + order = "x[space-transport-belt]", + place_result = data_util.mod_prefix .. "space-transport-belt", + stack_size = 100, + subgroup = "transport-belt", + type = "item" + }, + { + icon = "__space-exploration-graphics__/graphics/icons/underground-belt.png", + icon_size = 64, + name = data_util.mod_prefix .. "space-underground-belt", + order = "x[space-underground-belt]-u[underground]", + place_result = data_util.mod_prefix .. "space-underground-belt", + stack_size = 50, + subgroup = "underground-belt", + type = "item" + }, + { + icon = "__space-exploration-graphics__/graphics/icons/splitter.png", + icon_size = 64, + name = data_util.mod_prefix .. "space-splitter", + order = "x[space-splitter]-s[splitter]", + place_result = data_util.mod_prefix .. "space-splitter", + stack_size = 50, + subgroup = "splitter", + type = "item" + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-transport-belt", + category = "crafting-with-fluid", + expensive = { + ingredients = { + { type = "fluid", name = "lubricant", amount = 20}, + { name = "steel-plate", amount = 6 }, + { name = "iron-plate", amount = 6 }, + { name = "copper-plate", amount = 6 }, + }, + result = data_util.mod_prefix .. "space-transport-belt", + energy_required = 10, + result_count = 2, + enabled = false, + }, + normal = { + ingredients = { + { type = "fluid", name = "lubricant", amount = 20}, + { name = "steel-plate", amount = 6 }, + { name = "iron-plate", amount = 6 }, + { name = "copper-plate", amount = 6 }, + }, + result = data_util.mod_prefix .. "space-transport-belt", + energy_required = 10, + result_count = 1, + enabled = false, + }, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-underground-belt", + category = "crafting-with-fluid", + ingredients = { + { name = "steel-plate", amount = 8 }, + { data_util.mod_prefix .. "space-transport-belt", 8 }, + { + amount = 40, + name = "lubricant", + type = "fluid" + } + }, + energy_required = 10, + result = data_util.mod_prefix .. "space-underground-belt", + result_count = 1, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-splitter", + category = "crafting-with-fluid", + ingredients = { + { name = "steel-plate", amount = 10 }, + { name = "advanced-circuit", amount = 10 }, + { data_util.mod_prefix .. "space-transport-belt", 4 }, + { + amount = 40, + name = "lubricant", + type = "fluid" + } + }, + energy_required = 10, + result = data_util.mod_prefix .. "space-splitter", + result_count = 1, + enabled = false, + always_show_made_in = true, + }, +}) + +local belt = table.deepcopy(data.raw["transport-belt"]["express-transport-belt"]) +belt.name = data_util.mod_prefix .. "space-transport-belt" +belt.minable.result = data_util.mod_prefix .. "space-transport-belt" +belt.icon = "__space-exploration-graphics__/graphics/icons/transport-belt.png" +belt.icon_size = 64 +belt.icon_mipmaps = 1 +belt.fast_replaceable_group = "space-transport-belt" +belt.next_upgrade = nil +belt.related_underground_belt = data_util.mod_prefix .. "space-underground-belt" +local fields = {"animations", "belt_animation_set", "structure", "structure_patch", "belt_horizontal", "belt_vertical", + "ending_bottom", "ending_patch", "ending_side", "ending_top", + "starting_bottom", "starting_patch", "starting_side", "starting_top"} +for _, field in pairs(fields) do + data_util.replace_filenames_recursive(belt[field], + "__base__", + "__space-exploration-graphics__") + data_util.replace_filenames_recursive(belt[field], + "express-", + "space-") +end +belt.collision_mask = collision_floor + +local splitter = table.deepcopy(data.raw["splitter"]["express-splitter"]) +splitter.name = data_util.mod_prefix .. "space-splitter" +splitter.minable.result = data_util.mod_prefix .. "space-splitter" +splitter.icon = "__space-exploration-graphics__/graphics/icons/splitter.png" +splitter.icon_size = 64 +splitter.icon_mipmaps = 1 +splitter.fast_replaceable_group = "space-transport-belt" +splitter.next_upgrade = nil +for _, field in pairs(fields) do + data_util.replace_filenames_recursive(splitter[field], + "__base__", + "__space-exploration-graphics__") + data_util.replace_filenames_recursive(splitter[field], + "express-", + "space-") +end +splitter.collision_mask = collision_floor + +local ug_belt = table.deepcopy(data.raw["underground-belt"]["express-underground-belt"]) +ug_belt.name = data_util.mod_prefix .. "space-underground-belt" +ug_belt.minable.result = data_util.mod_prefix .. "space-underground-belt" +ug_belt.icon = "__space-exploration-graphics__/graphics/icons/underground-belt.png" +ug_belt.icon_size = 64 +ug_belt.icon_mipmaps = 1 +ug_belt.fast_replaceable_group = "space-transport-belt" +ug_belt.next_upgrade = nil +for _, field in pairs(fields) do + data_util.replace_filenames_recursive(ug_belt[field], + "__base__", + "__space-exploration-graphics__") + data_util.replace_filenames_recursive(ug_belt[field], + "express-", + "space-") +end +ug_belt.max_distance = belt_span + 1 +ug_belt.collision_mask = collision_floor_platform + +-- NOTE: items and recipes are still elsewhere +data:extend({belt, splitter, ug_belt}) + +-- DEEP SPACE ----------------------------------------------------------------- + + +local deep_tech = { + type = "technology", + name = data_util.mod_prefix.."deep-space-transport-belt", + effects = { + {type = "unlock-recipe", recipe = data_util.mod_prefix.."deep-space-transport-belt"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix.."deep-space-splitter"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix.."deep-space-underground-belt"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/deep-space-transport-belt.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix.."deep-space-science-pack-2", + data_util.mod_prefix.."heavy-assembly" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix.."astronomic-science-pack-4", 1 }, + { data_util.mod_prefix.."energy-science-pack-4", 1 }, + { data_util.mod_prefix.."material-science-pack-4", 1 }, + { data_util.mod_prefix.."biological-science-pack-4", 1 }, + { data_util.mod_prefix.."deep-space-science-pack-2", 1 }, + } + } +} +local deep_belt_recipe = { + type = "recipe", + name = data_util.mod_prefix.."deep-space-transport-belt", + ingredients = { + { name = data_util.mod_prefix.."space-transport-belt", amount = 10 }, + { name = data_util.mod_prefix.."naquium-plate", amount = 4 }, + { name = data_util.mod_prefix.."heavy-bearing", amount = 1 }, + { name = data_util.mod_prefix.."superconductive-cable", amount = 1 }, + { name = data_util.mod_prefix.."aeroframe-scaffold", amount = 1 }, + { name = data_util.mod_prefix.."cryonite-rod", amount = 1 }, + { type = "fluid", name = "lubricant", amount = 50 }, + }, + result = data_util.mod_prefix.."deep-space-transport-belt-"..default_variant, + result_count = 10, + energy_required = 10, + enabled = false, + always_show_made_in = true, + category = "space-manufacturing", +} +local deep_splitter_recipe = { + type = "recipe", + name = data_util.mod_prefix.."deep-space-splitter", + ingredients = { + { name = data_util.mod_prefix.."space-splitter", amount = 1 }, + { name = data_util.mod_prefix.."deep-space-transport-belt-"..default_variant, amount = 2 }, + { name = data_util.mod_prefix.."naquium-cube", amount = 1 }, + { name = data_util.mod_prefix.."quantum-processor", amount = 1 }, + { name = data_util.mod_prefix.."heavy-assembly", amount = 1 }, + { name = data_util.mod_prefix.."superconductive-cable", amount = 1 }, + { type = "fluid", name = "lubricant", amount = 100 }, + }, + result = data_util.mod_prefix.."deep-space-splitter-"..default_variant, + energy_required = 100, + enabled = false, + always_show_made_in = true, + category = "space-manufacturing", +} +local deep_ug_recipe = { + type = "recipe", + name = data_util.mod_prefix.."deep-space-underground-belt", + ingredients = { + { name = data_util.mod_prefix.."space-underground-belt", amount = 1 }, + { name = data_util.mod_prefix.."deep-space-transport-belt-"..default_variant, amount = 10 }, + { name = data_util.mod_prefix.."naquium-cube", amount = 1 }, + { name = data_util.mod_prefix.."heavy-composite", amount = 5 }, + { name = data_util.mod_prefix.."aeroframe-scaffold", amount = 10 }, + { name = data_util.mod_prefix.."superconductive-cable", amount = 1 }, + { type = "fluid", name = "lubricant", amount = 100 }, + }, + result = data_util.mod_prefix.."deep-space-underground-belt-"..default_variant, + energy_required = 100, + enabled = false, + always_show_made_in = true, + category = "space-manufacturing", +} +data:extend({ + deep_tech, + deep_belt_recipe, + deep_splitter_recipe, + deep_ug_recipe, +}) + +local deep_space_belt_base = table.deepcopy(belt) +deep_space_belt_base.name = data_util.mod_prefix .. "deep-space-transport-belt" +deep_space_belt_base.order = "z" +for _, field in pairs(fields) do + data_util.replace_filenames_recursive(deep_space_belt_base[field], + "space-t", + "deep-space-t") +end +deep_space_belt_base.speed = deep_speed +deep_space_belt_base.related_underground_belt = data_util.mod_prefix.."deep-space-underground-belt" + +local deep_space_splitter_base = table.deepcopy(splitter) +deep_space_splitter_base.name = data_util.mod_prefix .. "deep-space-splitter" +deep_space_splitter_base.order = "z" +deep_space_splitter_base.speed = deep_speed +data_util.replace_filenames_recursive(deep_space_splitter_base.structure, + "space-s", + "deep-space-s") +data_util.replace_filenames_recursive(deep_space_splitter_base.structure_patch, + "space-s", + "deep-space-s") +data_util.replace_sr_with_half_hr(deep_space_splitter_base.structure) +data_util.replace_sr_with_half_hr(deep_space_splitter_base.structure_patch) + +local deep_space_ug_base = table.deepcopy(ug_belt) +deep_space_ug_base.name = data_util.mod_prefix .. "deep-space-underground-belt" +deep_space_ug_base.order = "z" +deep_space_ug_base.speed = deep_speed +deep_space_ug_base.max_distance = deep_belt_span + 1 +data_util.replace_filenames_recursive(deep_space_ug_base.structure, + "space-u", + "deep-space-u") + +for name, tint in pairs(deep_space_variants) do + local suffix = "-"..name + + local variant_belt = table.deepcopy(deep_space_belt_base) + variant_belt.name = variant_belt.name ..suffix + variant_belt.minable.result = variant_belt.name + variant_belt.icons = { + {icon="__space-exploration-graphics__/graphics/icons/deep-space-transport-belt.png", icon_size=64}, + {icon="__space-exploration-graphics__/graphics/icons/deep-space-transport-belt-glow.png", icon_size=64,tint=tint} + } + + variant_belt.related_underground_belt = deep_space_ug_base.name .. suffix + local set = table.deepcopy(variant_belt.belt_animation_set.animation_set) + set.flags = {"no-crop"} + set.hr_version.flags = {"no-crop"} + local glow_set = table.deepcopy(set) + data_util.replace_filenames_recursive(glow_set, + "deep-space-transport-belt.png", + "deep-space-transport-belt-glow.png") + data_util.tint_recursive(glow_set, tint) + data_util.blend_mode_recursive(glow_set, "additive") + variant_belt.belt_animation_set.animation_set = { + layers = { + set, + glow_set + } + } + + + local variant_splitter = table.deepcopy(deep_space_splitter_base) + variant_splitter.name = variant_splitter.name ..suffix + variant_splitter.minable.result = variant_splitter.name + variant_splitter.icons = { + {icon="__space-exploration-graphics__/graphics/icons/deep-space-splitter.png", icon_size=64}, + {icon="__space-exploration-graphics__/graphics/icons/deep-space-splitter-glow.png", icon_size=64,tint=tint} + } + variant_splitter.belt_animation_set = table.deepcopy(variant_belt.belt_animation_set) + for _, structure in pairs({"structure", "structure_patch"}) do + for direction, pictures in pairs(variant_splitter[structure]) do + local pictures = table.deepcopy(pictures) + local glow_pictures = table.deepcopy(pictures) + data_util.replace_filenames_recursive(glow_pictures, + "patch.png", + "patch-glow.png") + data_util.replace_filenames_recursive(glow_pictures, + "east.png", + "east-glow.png") + data_util.replace_filenames_recursive(glow_pictures, + "north.png", + "north-glow.png") + data_util.replace_filenames_recursive(glow_pictures, + "west.png", + "west-glow.png") + data_util.replace_filenames_recursive(glow_pictures, + "south.png", + "south-glow.png") + data_util.tint_recursive(glow_pictures, tint) + data_util.blend_mode_recursive(glow_pictures, "additive") + variant_splitter[structure][direction].layers = {pictures, glow_pictures} + end + end + + local variant_ug = table.deepcopy(deep_space_ug_base) + variant_ug.name = variant_ug.name ..suffix + variant_ug.minable.result = variant_ug.name + variant_ug.icons = { + {icon="__space-exploration-graphics__/graphics/icons/deep-space-underground-belt.png", icon_size=64}, + {icon="__space-exploration-graphics__/graphics/icons/deep-space-underground-belt-glow.png", icon_size=64,tint=tint} + } + variant_ug.belt_animation_set = table.deepcopy(variant_belt.belt_animation_set) + for _, field in pairs({"direction_in", "direction_in_side_loading","direction_out","direction_out_side_loading"}) do + local sheet = table.deepcopy(variant_ug.structure[field].sheet) + local glow_sheet = table.deepcopy(sheet) + data_util.replace_filenames_recursive(glow_sheet, + "underground-belt-structure.png", + "underground-belt-structure-glow.png") + data_util.tint_recursive(glow_sheet, tint) + data_util.blend_mode_recursive(glow_sheet, "additive") + variant_ug.structure[field].sheet = nil + variant_ug.structure[field].sheets = { + sheet, glow_sheet + } + end + + local variant_item_belt = { + type = "item", + name = variant_belt.name, + icons = variant_belt.icons, + order = "z[space-transport-belt]-"..name, + stack_size = 50, + subgroup = "transport-belt", + place_result = variant_belt.name, + } + local variant_item_splitter = { + type = "item", + name = variant_splitter.name, + icons = variant_splitter.icons, + icon_size = 64, + icon_mipmaps = 1, + order = "z[space-transport-belt]-"..name.."-s[splitter]", + stack_size = 50, + subgroup = "splitter", + place_result = variant_splitter.name, + } + local variant_item_ug = { + type = "item", + name = variant_ug.name, + icons = variant_ug.icons, + icon_size = 64, + icon_mipmaps = 1, + order = "z[space-transport-belt]-"..name.."-u[underground]", + stack_size = 50, + subgroup = "underground-belt", + place_result = variant_ug.name, + } + + if name ~= default_variant then + local variant_recipe_belt = { + type = "recipe", + name = variant_belt.name, + ingredients = { + { name = deep_space_belt_base.name.."-"..default_variant, amount = 10 }, + { name = "small-lamp", amount = 1 }, + }, + result = variant_belt.name, + result_count = 10, + energy_required = 0.1, + enabled = false, + always_show_made_in = true, + category = "crafting", + } + local variant_recipe_splitter = { + type = "recipe", + name = variant_splitter.name, + ingredients = { + { name = deep_space_splitter_base.name.."-"..default_variant, amount = 1 }, + { name = "small-lamp", amount = 1 }, + }, + result = variant_splitter.name, + energy_required = 0.5, + enabled = false, + always_show_made_in = true, + category = "crafting", + } + local variant_recipe_ug = { + type = "recipe", + name = variant_ug.name, + ingredients = { + { name = deep_space_ug_base.name.."-"..default_variant, amount = 2 }, + { name = "small-lamp", amount = 1 }, + }, + result = variant_ug.name, + result_count = 2, + energy_required = 0.5, + enabled = false, + always_show_made_in = true, + category = "crafting", + } + + if (not settings.startup[data_util.mod_prefix .. "deep-space-belt-"..name]) or settings.startup[data_util.mod_prefix .. "deep-space-belt-"..name].value ~= false then + table.insert(deep_tech.effects, {type = "unlock-recipe", recipe = variant_recipe_belt.name,}) + table.insert(deep_tech.effects, {type = "unlock-recipe", recipe = variant_recipe_splitter.name,}) + table.insert(deep_tech.effects, {type = "unlock-recipe", recipe = variant_recipe_ug.name,}) + end + + data:extend({ + variant_belt, + variant_splitter, + variant_ug, + variant_item_belt, + variant_item_splitter, + variant_item_ug, + variant_recipe_belt, + variant_recipe_splitter, + variant_recipe_ug + }) + end + + data:extend({ + variant_belt, + variant_splitter, + variant_ug, + variant_item_belt, + variant_item_splitter, + variant_item_ug, + }) +end + + + +--log( serpent.block( data.raw["transport-belt"], {comment = false, numformat = '%1.8g' } ) ) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/weapon-bio.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/weapon-bio.lua new file mode 100644 index 0000000..22bf1fc --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/combined/weapon-bio.lua @@ -0,0 +1,1531 @@ +local data_util = require("data_util") +local tint = { + 0.7, + 0.6944, + 0.3584, + 0.7 +} +data.raw["utility-constants"].default.bonus_gui_ordering["biogun"] = "k-c" +data:extend({ + { + type = "technology", + name = data_util.mod_prefix .. "biogun", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biogun" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bloater-ammo" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "pheromone-ammo" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/biogun.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "vitalic-acid", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + } + }, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "biogun", + result = data_util.mod_prefix .. "biogun", + enabled = false, + energy_required = 30, + ingredients = { + { "glass", 10 }, + { "steel-plate", 10 }, + { data_util.mod_prefix .. "space-pipe", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "pheromone-ammo", + result = data_util.mod_prefix .. "pheromone-ammo", + enabled = false, + energy_required = 10, + ingredients = { + { data_util.mod_prefix .. "canister", 1 }, + { data_util.mod_prefix .. "vitalic-acid", 10 }, + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 100 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + category = "chemistry" + }, + { + type = "recipe", + name = data_util.mod_prefix .. "bloater-ammo", + result = data_util.mod_prefix .. "bloater-ammo", + enabled = false, + energy_required = 10, + ingredients = { + { data_util.mod_prefix .. "canister", 1 }, + { data_util.mod_prefix .. "vitalic-acid", 10 }, + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 100 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + category = "chemistry" + }, + { + type = "ammo-category", + name = "biogun", + bonus_gui_order = "k-c", + }, + { + type = "gun", + name = data_util.mod_prefix .. "biogun", + icon = "__space-exploration-graphics__/graphics/icons/biogun.png", + icon_mipmaps = 1, + icon_size = 64, + subgroup = "gun", + order = "e[flamethrower]", + stack_size = 5, + attack_parameters = { + ammo_category = "biogun", + cooldown = 60, + cyclic_sound = { + begin_sound = { + { + filename = "__base__/sound/fight/flamethrower-start.ogg", + volume = 0.7 + } + }, + end_sound = { + { + filename = "__base__/sound/fight/flamethrower-end.ogg", + volume = 0.7 + } + }, + middle_sound = { + { + filename = "__base__/sound/fight/flamethrower-mid.ogg", + volume = 0.7 + } + } + }, + gun_barrel_length = 0.8, + gun_center_shift = { + 0, + -1 + }, + movement_slow_down_factor = 0.1, + range = 25, + type = "stream" + }, + }, + { + type = "ammo", + name = data_util.mod_prefix .. "pheromone-ammo", + ammo_type = + { + category = "biogun", + target_type = "entity", + range_modifier = 3, + action = { + action_delivery = { + projectile = data_util.mod_prefix .. "pheromone-projectile", + source_effects = { + entity_name = "explosion-hit", + type = "create-entity" + }, + starting_speed = 0.3, + type = "projectile" + }, + type = "direct" + }, + }, + icon = "__space-exploration-graphics__/graphics/icons/pheromone-dart.png", + icon_size = 64, + icon_mipmaps = 1, + magazine_size = 1, + order = "z-t[biogun]", + stack_size = 100, + subgroup = "ammo", + }, + { + type = "projectile", + name = data_util.mod_prefix .. "pheromone-projectile", + acceleration = 0.005, + action = { + action_delivery = { + target_effects = { + { + entity_name = data_util.mod_prefix .. "pheromone-trigger", + type = "create-entity", + trigger_created_entity = true, + }, + }, + type = "instant" + }, + type = "direct" + }, + animation = { + filename = "__base__/graphics/entity/rocket/rocket.png", + frame_count = 8, + height = 35, + line_length = 8, + priority = "high", + shift = { + 0, + 0 + }, + width = 9 + }, + flags = { + "not-on-map" + }, + light = { + intensity = 0.5, + size = 4 + }, + shadow = { + filename = "__base__/graphics/entity/rocket/rocket-shadow.png", + frame_count = 1, + height = 24, + priority = "high", + shift = { + 0, + 0 + }, + width = 7 + }, + smoke = { + { + deviation = { + 0.15, + 0.15 + }, + frequency = 1, + name = "smoke-fast", + position = { + 0, + 1 + }, + slow_down_factor = 1, + starting_frame = 3, + starting_frame_deviation = 5, + starting_frame_speed = 0, + starting_frame_speed_deviation = 5 + } + }, + }, + { + type = "explosion", + name = data_util.mod_prefix .. "pheromone-trigger", + animations = { + { + direction_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + frame_count = 1, + height = 1, + line_length = 1, + width = 1 + } + }, + flags = { + "not-on-map", "placeable-off-grid" + }, + }, + { + type = "ammo", + name = data_util.mod_prefix .. "bloater-ammo", + ammo_type = + { + category = "biogun", + target_type = "position", + clamp_position = true, + action = { + action_delivery = { + stream = data_util.mod_prefix .. "bloater-stream", + type = "stream" + }, + type = "direct" + }, + }, + icon = "__space-exploration-graphics__/graphics/icons/bloater-ammo.png", + icon_size = 64, + icon_mipmaps = 1, + magazine_size = 1, + order = "z-t[biogun]", + stack_size = 100, + subgroup = "ammo", + }, + { + name = data_util.mod_prefix .. "bloater-stream", + flags = { + "not-on-map" + }, + initial_action = { + { + action_delivery = { + target_effects = { + { + sound = { + { + filename = "__base__/sound/creatures/projectile-acid-burn-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/creatures/projectile-acid-burn-2.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/creatures/projectile-acid-burn-long-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/creatures/projectile-acid-burn-long-2.ogg", + volume = 0.8 + } + }, + type = "play-sound" + }, + { + entity_name = data_util.mod_prefix .. "bloater-pool-cloud", + show_in_tooltip = true, + type = "create-entity" + }, + }, + type = "instant" + }, + type = "direct" + }, + { + action_delivery = { + target_effects = { + { + sticker = data_util.mod_prefix .. "bloater-sticker", + type = "create-sticker" + }, + { + damage = { + amount = 1, + type = "acid" + }, + type = "damage" + } + }, + type = "instant" + }, + force = "enemy", + ignore_collision_condition = true, + radius = 1.75, + type = "area" + } + }, + oriented_particle = true, + particle = { + animation_speed = 1, + filename = "__base__/graphics/entity/acid-projectile/acid-projectile-head.png", + frame_count = 15, + height = 84, + hr_version = { + animation_speed = 1, + filename = "__base__/graphics/entity/acid-projectile/hr-acid-projectile-head.png", + frame_count = 15, + height = 164, + line_length = 5, + priority = "high", + scale = 0.5, + shift = { + -0.0625, + 0.96875 + }, + tint = tint, + width = 42 + }, + line_length = 5, + priority = "high", + scale = 1, + shift = { + -0.0625, + 0.9375 + }, + tint = tint, + width = 22 + }, + particle_alpha_per_part = 0.8, + particle_buffer_size = 90, + particle_end_alpha = 1, + particle_fade_out_duration = 2, + particle_horizontal_speed = 0.3375, + particle_horizontal_speed_deviation = 0.0035, + particle_loop_exit_threshold = 0.25, + particle_loop_frame_count = 15, + particle_scale_per_part = 0.8, + particle_spawn_interval = 1, + particle_spawn_timeout = 6, + particle_start_alpha = 0.5, + particle_vertical_acceleration = 0.0045, + shadow = { + animation_speed = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-projectile/acid-projectile-shadow.png", + frame_count = 15, + height = 84, + hr_version = { + animation_speed = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-projectile/hr-acid-projectile-shadow.png", + frame_count = 15, + height = 164, + line_length = 15, + priority = "high", + scale = 0.5, + shift = { + -0.0625, + 0.96875 + }, + width = 42 + }, + line_length = 15, + priority = "high", + scale = 1, + shift = { + -0.0625, + 0.9375 + }, + width = 22 + }, + shadow_scale_enabled = true, + special_neutral_target_damage = { + amount = 1, + type = "acid" + }, + spine_animation = { + animation_speed = 1, + filename = "__base__/graphics/entity/acid-projectile/acid-projectile-tail.png", + frame_count = 15, + height = 12, + hr_version = { + animation_speed = 1, + filename = "__base__/graphics/entity/acid-projectile/hr-acid-projectile-tail.png", + frame_count = 15, + height = 20, + line_length = 5, + priority = "high", + scale = 0.5, + shift = { + 0, + -0.03125 + }, + tint = tint, + width = 132 + }, + line_length = 5, + priority = "high", + scale = 1, + shift = { + 0, + -0.0625 + }, + tint = tint, + width = 66 + }, + type = "stream" + }, + { + type = "smoke-with-trigger", + name = data_util.mod_prefix .. "bloater-pool-cloud", + flags = {"not-on-map"}, + show_when_smoke_off = true, + particle_count = 16, + particle_spread = { 11 * 1.05, 11 * 0.6 * 1.05 }, + particle_distance_scale_factor = 0.5, + particle_scale_factor = { 1, 0.707 }, + wave_speed = { 1/80, 1/60 }, + wave_distance = { 0.3, 0.2 }, + spread_duration_variation = 20, + particle_duration_variation = 60 * 3, + render_layer = "object", + + affected_by_wind = false, + cyclic = true, + duration = 60 * 20, + fade_away_duration = 2 * 60, + spread_duration = 20, + --color = {r = 0.239, g = 0.875, b = 0.992, a = 0.690}, -- #3ddffdb0, + color = tint, -- #3ddffdb0, + + animation = + { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/acid-splash-1.png", + frame_count = 26, + height = 116, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-1.png", + frame_count = 26, + height = 224, + line_length = 8, + scale = 0.5, + shift = { + -0.375, + -0.25 + }, + tint = tint, + width = 210 + }, + line_length = 8, + scale = 1, + shift = { + -0.375, + -0.3125 + }, + tint = tint, + width = 106 + }, + + created_effect = + { + { + type = "cluster", + cluster_count = 10, + distance = 4, + distance_deviation = 5, + action_delivery = + { + type = "instant", + target_effects = + { + type = "create-fire", + show_in_tooltip = false, + entity_name = data_util.mod_prefix .. "bloater-pool-fire", + initial_height = 0 + } + } + }, + { + type = "cluster", + cluster_count = 11, + distance = 8 * 1.1, + distance_deviation = 2, + action_delivery = + { + type = "instant", + target_effects = + { + type = "create-fire", + show_in_tooltip = false, + entity_name = data_util.mod_prefix .. "bloater-pool-fire", + initial_height = 0 + } + } + } + }, + + working_sound = + { + sound = + { + filename = "__base__/sound/fight/poison-cloud.ogg", + volume = 0.7 + }, + }, + action = { + { + type = "direct", + action_delivery = + { + type = "instant", + target_effects = + { + type = "nested-result", + action = + { + type = "area", + radius = 11, + action_delivery = + { + type = "instant", + target_effects = + { + type = "damage", + damage = { amount = 8, type = "acid"} + } + } + } + } + } + }, + { + type = "cluster", + cluster_count = 6, + distance = 6, + distance_deviation = 7, + action_delivery = + { + type = "instant", + target_effects = + { + type = "create-fire", + show_in_tooltip = false, + entity_name = data_util.mod_prefix .. "bloater-pool-fire", + initial_height = 0 + } + } + }, + { + type = "cluster", + cluster_count = 2, + distance = 1, + distance_deviation = 1, + action_delivery = + { + type = "instant", + target_effects = + { + type = "create-fire", + show_in_tooltip = false, + entity_name = data_util.mod_prefix .. "bloater-pool-fire", + initial_height = 0 + } + } + }, + }, + action_cooldown = 10 + }, + { + type = "fire", + name = data_util.mod_prefix .. "bloater-pool-fire", + add_fuel_cooldown = 10, + burnt_patch_lifetime = 0, + damage_multiplier_decrease_per_tick = 0.005, + damage_multiplier_increase_per_added_fuel = 1, + damage_per_tick = { + amount = 0, + type = "acid" + }, + delay_between_initial_flames = 10, + emissions_per_second = 0, + fade_in_duration = 1, + fade_out_duration = 30, + flags = { + "placeable-off-grid", + "not-on-map" + }, + initial_flame_count = 1, + initial_lifetime = 192, + initial_render_layer = "object", + lifetime_increase_by = 0, + lifetime_increase_cooldown = 4, + limit_overlapping_particles = true, + localised_name = { + "entity-name.acid-splash" + }, + maximum_damage_multiplier = 3, + maximum_lifetime = 180, + maximum_spread_count = 100, + on_damage_tick_effect = { + action_delivery = { + target_effects = { + { + show_in_tooltip = true, + sticker = data_util.mod_prefix .. "bloater-sticker", + type = "create-sticker" + }, + { + apply_damage_to_trees = false, + damage = { + amount = 2, + type = "acid" + }, + type = "damage" + } + }, + type = "instant" + }, + filter_enabled = true, + ignore_collision_condition = true, + trigger_target_mask = { + "ground-unit" + }, + type = "direct" + }, + particle_alpha = 0.6, + particle_alpha_blend_duration = 300, + pictures = { + { + layers = { + { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/acid-splash-1.png", + frame_count = 26, + height = 116, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-1.png", + frame_count = 26, + height = 224, + line_length = 8, + scale = 0.5, + shift = { + -0.375, + -0.25 + }, + tint = tint, + width = 210 + }, + line_length = 8, + scale = 1, + shift = { + -0.375, + -0.3125 + }, + tint = tint, + width = 106 + }, + { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/acid-splash-1-shadow.png", + frame_count = 26, + height = 98, + hr_version = { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-1-shadow.png", + frame_count = 26, + height = 188, + line_length = 8, + scale = 0.5, + shift = { + 0.0625, + 0.0625 + }, + width = 266 + }, + line_length = 8, + scale = 1, + shift = { + 0.0625, + 0 + }, + width = 134 + } + } + }, + { + layers = { + { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/acid-splash-2.png", + frame_count = 29, + height = 76, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-2.png", + frame_count = 29, + height = 150, + line_length = 8, + scale = 0.5, + shift = { + -0.28125, + -0.53125 + }, + tint = tint, + width = 174 + }, + line_length = 8, + scale = 1, + shift = { + -0.3125, + -0.5625 + }, + tint = tint, + width = 88 + }, + { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/acid-splash-2-shadow.png", + frame_count = 29, + height = 136, + hr_version = { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-2-shadow.png", + frame_count = 29, + height = 266, + line_length = 8, + scale = 0.5, + shift = { + 0.1875, + 0.90625 + }, + width = 238 + }, + line_length = 8, + scale = 1, + shift = { + 0.1875, + 0.875 + }, + width = 120 + } + } + }, + { + layers = { + { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/acid-splash-3.png", + frame_count = 29, + height = 104, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-3.png", + frame_count = 29, + height = 208, + line_length = 8, + scale = 0.5, + shift = { + 0.6875, + -0.5 + }, + tint = tint, + width = 236 + }, + line_length = 8, + scale = 1, + shift = { + 0.6875, + -0.5 + }, + tint = tint, + width = 118 + }, + { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/acid-splash-3-shadow.png", + frame_count = 29, + height = 70, + hr_version = { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-3-shadow.png", + frame_count = 29, + height = 140, + line_length = 8, + scale = 0.5, + shift = { + 0.53125, + 0.0625 + }, + width = 214 + }, + line_length = 8, + scale = 1, + shift = { + 0.5, + 0.0625 + }, + width = 110 + } + } + }, + { + layers = { + { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/acid-splash-4.png", + frame_count = 24, + height = 80, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-4.png", + frame_count = 24, + height = 154, + line_length = 8, + scale = 0.5, + shift = { + 0.53125, + -0.59375 + }, + tint = tint, + width = 252 + }, + line_length = 8, + scale = 1, + shift = { + 0.5, + -0.625 + }, + tint = tint, + width = 128 + }, + { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/acid-splash-4-shadow.png", + frame_count = 24, + height = 80, + hr_version = { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-4-shadow.png", + frame_count = 24, + height = 160, + line_length = 8, + scale = 0.5, + shift = { + 0.5625, + -0.5 + }, + width = 248 + }, + line_length = 8, + scale = 1, + shift = { + 0.5625, + -0.5 + }, + width = 124 + } + } + } + }, + render_layer = "lower-object-above-shadow", + secondary_picture_fade_out_duration = 60, + secondary_picture_fade_out_start = 30, + secondary_pictures = { + { + layers = { + { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/acid-splash-1.png", + frame_count = 26, + height = 116, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-1.png", + frame_count = 26, + height = 224, + line_length = 8, + scale = 0.325, + shift = { + -0.24375, + -0.1625 + }, + tint = { + 0.7, + 0.6944, + 0.3584, + 0.7 + }, + width = 210 + }, + line_length = 8, + scale = 0.65, + shift = { + -0.24375, + -0.203125 + }, + tint = { + 0.7, + 0.6944, + 0.3584, + 0.7 + }, + width = 106 + }, + { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/acid-splash-1-shadow.png", + frame_count = 26, + height = 98, + hr_version = { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-1-shadow.png", + frame_count = 26, + height = 188, + line_length = 8, + scale = 0.325, + shift = { + 0.040625, + 0.040625 + }, + width = 266 + }, + line_length = 8, + scale = 0.65, + shift = { + 0.040625, + 0 + }, + width = 134 + } + } + }, + { + layers = { + { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/acid-splash-2.png", + frame_count = 29, + height = 76, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-2.png", + frame_count = 29, + height = 150, + line_length = 8, + scale = 0.325, + shift = { + -0.1828125, + -0.3453125 + }, + tint = { + 0.7, + 0.6944, + 0.3584, + 0.7 + }, + width = 174 + }, + line_length = 8, + scale = 0.65, + shift = { + -0.203125, + -0.365625 + }, + tint = { + 0.7, + 0.6944, + 0.3584, + 0.7 + }, + width = 88 + }, + { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/acid-splash-2-shadow.png", + frame_count = 29, + height = 136, + hr_version = { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-2-shadow.png", + frame_count = 29, + height = 266, + line_length = 8, + scale = 0.325, + shift = { + 0.121875, + 0.5890625 + }, + width = 238 + }, + line_length = 8, + scale = 0.65, + shift = { + 0.121875, + 0.56875 + }, + width = 120 + } + } + }, + { + layers = { + { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/acid-splash-3.png", + frame_count = 29, + height = 104, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-3.png", + frame_count = 29, + height = 208, + line_length = 8, + scale = 0.325, + shift = { + 0.446875, + -0.325 + }, + tint = { + 0.7, + 0.6944, + 0.3584, + 0.7 + }, + width = 236 + }, + line_length = 8, + scale = 0.65, + shift = { + 0.446875, + -0.325 + }, + tint = { + 0.7, + 0.6944, + 0.3584, + 0.7 + }, + width = 118 + }, + { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/acid-splash-3-shadow.png", + frame_count = 29, + height = 70, + hr_version = { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-3-shadow.png", + frame_count = 29, + height = 140, + line_length = 8, + scale = 0.325, + shift = { + 0.3453125, + 0.040625 + }, + width = 214 + }, + line_length = 8, + scale = 0.65, + shift = { + 0.325, + 0.040625 + }, + width = 110 + } + } + }, + { + layers = { + { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/acid-splash-4.png", + frame_count = 24, + height = 80, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-4.png", + frame_count = 24, + height = 154, + line_length = 8, + scale = 0.325, + shift = { + 0.3453125, + -0.3859375 + }, + tint = { + 0.7, + 0.6944, + 0.3584, + 0.7 + }, + width = 252 + }, + line_length = 8, + scale = 0.65, + shift = { + 0.325, + -0.40625 + }, + tint = { + 0.7, + 0.6944, + 0.3584, + 0.7 + }, + width = 128 + }, + { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/acid-splash-4-shadow.png", + frame_count = 24, + height = 80, + hr_version = { + direction_count = 1, + draw_as_shadow = true, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-4-shadow.png", + frame_count = 24, + height = 160, + line_length = 8, + scale = 0.325, + shift = { + 0.365625, + -0.325 + }, + width = 248 + }, + line_length = 8, + scale = 0.65, + shift = { + 0.365625, + -0.325 + }, + width = 124 + } + } + } + }, + secondary_render_layer = "higher-object-above", + spread_delay = 300, + spread_delay_deviation = 180, + uses_alternative_behavior = true + }, + { + type = "sticker", + name = data_util.mod_prefix .. "bloater-sticker", + animation = { + animation_speed = 2, + axially_symmetrical = false, + blend_mode = "additive", + direction_count = 1, + filename = "__base__/graphics/entity/fire-flame/fire-flame-13.png", + frame_count = 25, + height = 118, + line_length = 8, + scale = 0.4, + shift = { + -0.0078125, + -0.18125 + }, + tint = {r = 0.2, g = 1, b = 0}, + width = 60 + }, + duration_in_ticks = 120, + flags = { + "not-on-map" + }, + target_movement_modifier_from = 0.4, + target_movement_modifier_to = 1, + vehicle_friction_modifier_from = 1.5, + vehicle_friction_modifier_to = 1, + vehicle_speed_modifier_from = 0.4, + vehicle_speed_modifier_to = 1 + }, + { + type = "projectile", + name = data_util.mod_prefix .. "bloater-splatter", + acceleration = -0.01, + action = { + action_delivery = { + target_effects = { + damage = { + amount = 50, + type = "acid" + }, + type = "damage" + }, + type = "instant" + }, + type = "direct" + }, + animation = { + filename = "__base__/graphics/entity/bullet/bullet.png", + frame_count = 1, + height = 50, + priority = "high", + width = 3, + scale = 1.5, + tint = {r = 159/255, g = 229/255, b = 38/255} + }, + collision_box = { + { + -0.05, + -0.25 + }, + { + 0.05, + 0.25 + } + }, + direction_only = true, + flags = { + "not-on-map" + }, + }, +}) + +for _, e in pairs({10, 40, 100, 400, 1000, 4000, 10000}) do + + data:extend({ + { + type = "explosion", + name = data_util.mod_prefix .. "bloater-burst-"..e, + animations = { + { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/acid-splash-1.png", + frame_count = 26, + height = 116, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/acid-splash/hr-acid-splash-1.png", + frame_count = 26, + height = 224, + line_length = 8, + scale = 0.5, + shift = { + -0.375, + -0.25 + }, + tint = tint, + width = 210 + }, + line_length = 8, + scale = 1, + shift = { + -0.375, + -0.3125 + }, + tint = tint, + width = 106 + }, + }, + created_effect = { + type = "direct", + action_delivery = { + type = "instant", + target_effects = { + { + type = "create-particle", + repeat_count = 12, + repeat_count_deviation = 0, + probability = 1, + affects_target = false, + show_in_tooltip = false, + particle_name = "blood-particle-carpet", + offsets = { { 0, 0 } }, + offset_deviation = + { + left_top = { -0.5, -0.5 }, + right_bottom = { 0.5, 0.5 } + }, + tile_collision_mask = nil, + initial_height = 0.2, + initial_height_deviation = 0.05, + initial_vertical_speed = 0.062, + initial_vertical_speed_deviation = 0.01, + speed_from_center = 0.18, + speed_from_center_deviation = 0.111, + frame_speed = 1, + frame_speed_deviation = 0, + tail_length = 25, + tail_length_deviation = 0, + tail_width = 1 + }, + { + type = "create-particle", + repeat_count = 10, + repeat_count_deviation = 2, + probability = 1, + affects_target = false, + show_in_tooltip = false, + particle_name = "blood-particle-carpet", + offsets = + { + { 0.0625, 0.7891 }, + { -0.01563, 0.2422 } + }, + offset_deviation = + { + left_top = { -1, -1 }, + right_bottom = { 1, 1 } + }, + tile_collision_mask = nil, + initial_height = 0.9, + initial_height_deviation = 0, + initial_vertical_speed = 0.04, + initial_vertical_speed_deviation = 0.07, + speed_from_center = 0.135, + speed_from_center_deviation = 0.115, + frame_speed = 1, + frame_speed_deviation = 0.02, + tail_length = 12, + tail_length_deviation = 25, + tail_width = 1 + }, + { + type = "create-particle", + repeat_count = 8, + repeat_count_deviation = 2, + probability = 1, + affects_target = false, + show_in_tooltip = false, + particle_name = "guts-entrails-particle-small-medium", + offsets = { { 0, 0 } }, + offset_deviation = + { + left_top = { -0.5, -0.5 }, + right_bottom = { 0.5, 0.5 } + }, + tile_collision_mask = nil, + initial_height = 1, + initial_height_deviation = 0.52, + initial_vertical_speed = 0.078, + initial_vertical_speed_deviation = 0.05, + speed_from_center = 0.17, + speed_from_center_deviation = 0.17/2, + frame_speed = 1, + frame_speed_deviation = 0 + }, + { + type = "create-particle", + repeat_count = 11, + repeat_count_deviation = 0, + probability = 1, + affects_target = false, + show_in_tooltip = false, + particle_name = "blood-particle-carpet", + offsets = { { 0, -0.03906 } }, + offset_deviation = + { + left_top = { -1, -1 }, + right_bottom = { 1, 1 } + }, + tile_collision_mask = nil, + initial_height = 0.1, + initial_height_deviation = 0.05, + initial_vertical_speed = 0.09, + initial_vertical_speed_deviation = 0.05, + speed_from_center = 0.04, + speed_from_center_deviation = 0, + frame_speed = 1, + frame_speed_deviation = 0, + tail_length = 21, + tail_length_deviation = 3, + tail_width = 1 + }, + { + type = "create-particle", + repeat_count = 15, + repeat_count_deviation = 1, + probability = 1, + affects_target = false, + show_in_tooltip = false, + particle_name = "blood-particle-carpet", + offsets = { { 0, 0 } }, + offset_deviation = + { + left_top = { -1, -1 }, + right_bottom = { 1, 1 } + }, + tile_collision_mask = nil, + initial_height = 0.1, + initial_height_deviation = 0.01, + initial_vertical_speed = 0.018, + initial_vertical_speed_deviation = 0.005, + speed_from_center = 0.2, + speed_from_center_deviation = 0.141, + frame_speed = 1, + frame_speed_deviation = 0, + tail_length = 11, + tail_length_deviation = 7, + tail_width = 1 + }, + { + type = "create-particle", + repeat_count = 15, + repeat_count_deviation = 0, + probability = 1, + affects_target = false, + show_in_tooltip = false, + particle_name = "blood-particle-carpet", + offsets = { { 0, 0 } }, + offset_deviation = + { + left_top = { -1, -0.5 }, + right_bottom = { 1, 0.5 } + }, + tile_collision_mask = nil, + initial_height = 0.3, + initial_height_deviation = 0.5, + initial_vertical_speed = 0.055, + initial_vertical_speed_deviation = 0.003, + speed_from_center = 0.09, + speed_from_center_deviation = 0.042, + frame_speed = 1, + frame_speed_deviation = 0, + tail_length = 10, + tail_length_deviation = 12, + tail_width = 1 + }, + { + type = "create-particle", + repeat_count = 2, + repeat_count_deviation = 2, + probability = 1, + affects_target = false, + show_in_tooltip = false, + particle_name = "guts-entrails-particle-big", + offsets = { { 0, 0 } }, + offset_deviation = + { + left_top = { -0.5, -0.5 }, + right_bottom = { 0.5, 0.5 } + }, + tile_collision_mask = nil, + initial_height = 1, + initial_height_deviation = 0.52, + initial_vertical_speed = 0.178, + initial_vertical_speed_deviation = 0.15, + speed_from_center = 0.07, + speed_from_center_deviation = 0, + frame_speed = 1, + frame_speed_deviation = 0 + }, + { + action = { + action_delivery = { + projectile = data_util.mod_prefix .. "bloater-splatter", + starting_speed = 0.4, + starting_speed_deviation = 0.2, + show_in_tooltip = false, + type = "projectile" + }, + radius = 6, + repeat_count = math.max(1, e / 100), + target_entities = false, + trigger_from_target = true, + show_in_tooltip = false, + type = "area" + }, + show_in_tooltip = false, + type = "nested-result" + }, + --[[{ type = "nested-result", action = { type = "area", radius = 3, + action_delivery = { type = "instant", target_effects = { { type = "damage", damage = { amount = e * 0.05, type = "explosion" }}}}, + }}, + { type = "nested-result", action = { type = "area", radius = 6, + action_delivery = { type = "instant", target_effects = { { type = "damage", damage = { amount = e * 0.01, type = "acid" }}}}, + }},]]-- + }, + }, + }, + flags = { "not-on-map" }, + sound = { + aggregation = { max_count = 1, remove = true }, + variations = { + { filename = "__base__/sound/small-explosion-1.ogg", volume = 0.4 }, + { filename = "__base__/sound/small-explosion-2.ogg", volume = 0.4 }, + } + }, + }, + }) +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/compatibility/qol_research.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/compatibility/qol_research.lua new file mode 100644 index 0000000..4fc585f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/compatibility/qol_research.lua @@ -0,0 +1,4 @@ +qol_research_config_overrides = qol_research_config_overrides or {} +qol_research_config_overrides['space-exploration'] = [[1,23,crafting-speed,150*L,automation-science-pack,logistic-science-pack,175*L,chemical-science-pack,225*L,se-rocket-science-pack,300*L,se-biological-science-pack-1,10*L,se-biological-science-pack-2,100+20*L,se-biological-science-pack-3,250+50*L,se-biological-science-pack-4,500+100*L,se-deep-space-science-pack-1,500*2^L,inventory-size,mining-speed,movement-speed,player-reach,5,1,9,5,5,0,0,2,10,1,1,3,5,5,3,1,4,5,15,2,1,3,1,4,5,5,3,1,6,7,20,3,1,3,1,4,1,6,5,5,3,1,8,9,25,4,1,3,1,4,1,6,1,8,5,5,3,1,10,11,30,5,1,3,1,4,1,6,1,8,1,10,5,5,5,1,12,13,30,5,1,3,1,4,1,6,1,8,1,12,5,5,5,1,14,15,30,5,1,3,1,4,1,6,1,8,1,14,5,5,5,1,16,17,30,5,1,3,1,4,1,6,1,8,1,16,0,5,5,1,18,19,30,6,1,3,1,4,1,6,1,8,1,16,1,18,20,9,5,2,0,0,2,10,1,1,3,5,2,3,1,4,5,15,2,1,3,1,4,5,2,3,1,6,7,20,3,1,3,1,4,1,6,5,2,3,1,8,9,25,4,1,3,1,4,1,6,1,8,5,2,3,1,10,11,30,5,1,3,1,4,1,6,1,8,1,10,5,2,5,1,12,13,30,5,1,3,1,4,1,6,1,8,1,12,5,2,5,1,14,15,30,5,1,3,1,4,1,6,1,8,1,14,5,2,5,1,16,17,30,5,1,3,1,4,1,6,1,8,1,16,0,2,5,1,18,19,30,6,1,3,1,4,1,6,1,8,1,16,1,18,21,9,5,10,0,0,2,10,1,1,3,5,10,3,1,4,5,15,2,1,3,1,4,5,10,3,1,6,7,20,3,1,3,1,4,1,6,5,10,3,1,8,9,25,4,1,3,1,4,1,6,1,8,5,10,3,1,10,11,30,5,1,3,1,4,1,6,1,8,1,10,5,10,5,1,12,13,30,5,1,3,1,4,1,6,1,8,1,12,5,10,5,1,14,15,30,5,1,3,1,4,1,6,1,8,1,14,5,10,5,1,16,17,30,5,1,3,1,4,1,6,1,8,1,16,0,10,5,1,18,19,30,6,1,3,1,4,1,6,1,8,1,16,1,18,22,9,5,2,0,0,2,10,1,1,3,5,2,3,1,4,5,15,2,1,3,1,4,5,2,3,1,6,7,20,3,1,3,1,4,1,6,5,2,3,1,8,9,25,4,1,3,1,4,1,6,1,8,5,2,3,1,10,11,30,5,1,3,1,4,1,6,1,8,1,10,5,2,5,1,12,13,30,5,1,3,1,4,1,6,1,8,1,12,5,2,5,1,14,15,30,5,1,3,1,4,1,6,1,8,1,14,5,2,5,1,16,17,30,5,1,3,1,4,1,6,1,8,1,16,0,2,5,1,18,19,30,6,1,3,1,4,1,6,1,8,1,16,1,18,23,9,5,1,0,0,2,10,1,1,3,5,1,3,1,4,5,15,2,1,3,1,4,5,1,3,1,6,7,20,3,1,3,1,4,1,6,5,1,3,1,8,9,25,4,1,3,1,4,1,6,1,8,5,1,3,1,10,11,30,5,1,3,1,4,1,6,1,8,1,10,5,1,5,1,12,13,30,5,1,3,1,4,1,6,1,8,1,12,5,1,5,1,14,15,30,5,1,3,1,4,1,6,1,8,1,14,5,1,5,1,16,17,30,5,1,3,1,4,1,6,1,8,1,16,0,1,5,1,18,19,30,6,1,3,1,4,1,6,1,8,1,16,1,18]] +table.insert(se_prodecural_tech_exclusions, "qol-") +table.insert(se_prodecural_tech_exclusions, "qolinternal-") diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/damage-types.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/damage-types.lua new file mode 100644 index 0000000..9a41336 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/damage-types.lua @@ -0,0 +1,23 @@ +data:extend({ + { + type = "damage-type", + name = "cold", + }, + { + type = "damage-type", + name = "suffocation", + }, + { + type = "damage-type", + name = "meteor", + }, + + { + type = "trigger-target-type", + name = "flammable" + }, + { + type = "trigger-target-type", + name = "tree" + } +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/crater.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/crater.lua new file mode 100644 index 0000000..9ab0a6f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/crater.lua @@ -0,0 +1,72 @@ +local data_util = require("data_util") + +local function crater_picture (name, width, height) + return { + filename = "__alien-biomes__/graphics/decorative/crater/sr/crater-"..name..".png", + width = math.floor(width/2), + height = math.floor(height/2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/crater/hr/crater-"..name..".png", + width = width, + height = height, + scale = 0.5 + }, + } +end +local i = 0 +local function make_crater(name, box, max_probability, random_probability_penalty, pictures) + i = i + 1 + return { + name = data_util.mod_prefix..name, + type = "optimized-decorative", + subgroup = "grass", + order = "b[decorative]-b[crater-decal]-"..i, + collision_box = {{-box, -box*0.75}, {box, box*0.75}}, + collision_mask = {"doodad-layer", "water-tile"}, + render_layer = "decals", + tile_layer = 50, -- as long as it is over asteroid layer + pictures = pictures, + autoplace = { + max_probability = max_probability, + --random_probability_penalty = random_probability_penalty, + sharpness = 0.7, + order = "a[doodad]-b[decal]", + peaks = { + { influence = 0.4}, + { + influence = 0.15, + noise_layer = "trees-"..i, + noise_octaves_difference = -3, + noise_persistence = 0.9, + } + }, + tile_restriction = {data_util.mod_prefix.."asteroid"} + }, + } +end +data:extend({ + make_crater("crater3-huge", 3, 0.01, 0.95, { + crater_picture("huge-01", 1249, 877), + }), + make_crater("crater1-large-rare", 2, 0.01, 0.95, { + crater_picture("large-01", 679, 513), + }), + make_crater("crater1-large", 1, 0.1, 0.7, { + crater_picture("large-02", 327, 284), + crater_picture("large-03", 481, 393), + crater_picture("large-04", 406, 382), + crater_picture("large-05", 363, 301), + }), + make_crater("crater2-medium", 0.5, 0.1, 0.5, { + crater_picture("medium-01", 283, 231), + crater_picture("medium-02", 213, 182), + crater_picture("medium-03", 243, 189), + crater_picture("medium-04", 237, 173), + crater_picture("medium-05", 195, 182), + crater_picture("medium-06", 146, 125), + crater_picture("medium-07", 180, 127), + }), + make_crater("crater4-small", 0.25, 0.1, 0.8, { + crater_picture("small-01", 122, 108), + }), +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/rocks-base.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/rocks-base.lua new file mode 100644 index 0000000..73a8fdf --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/rocks-base.lua @@ -0,0 +1,3477 @@ +--NOTE: this is different from the alien biomes data +local rock_coverage_multiplier = 6 +local rock_max_prob_multiplier = 2 +return { +{ + name = "rock-huge", + type = "simple-entity", + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__base__/graphics/icons/rock-huge.png", + icon_size = 64, + subgroup = "grass", + order = "b[decorative]-l[rock]-a[huge]", + collision_box = {{-1.5, -1.1}, {1.5, 1.1}}, + collision_mask = {"object-layer"}, + selection_box = {{-1.7, -1.3}, {1.7, 1.3}}, + minable = + { + mining_particle = "stone-particle", + mining_time = 1.5, + results = { + {name = "stone", probability = 1, amount_min = 10, amount_max = 20}, + {name = "iron-ore", probability = 1, amount_min = 0, amount_max = 20}, + {name = "copper-ore", probability = 1, amount_min = 0, amount_max = 10}, + }, + --count = 200 + }, + loot = + { + {item = "stone", probability = 1, count_min = 10, count_max = 20}, + {item = "iron-ore", probability = 1, amount_min = 10, amount_max = 20}, + {item = "copper-ore", probability = 1, amount_min = 10, amount_max = 20}, + }, + count_as_rock_for_filtered_deconstruction = true, + mined_sound = { filename = "__base__/sound/deconstruct-bricks.ogg" }, + vehicle_impact_sound = { filename = "__base__/sound/car-stone-impact.ogg", volume = 1.0 }, + render_layer = "object", + max_health = 2000, + resistances = + { + { type = "fire", percent = 100 }, + { type = "poison", percent = 100 } + }, + autoplace = { + coverage = 0.00125 * rock_coverage_multiplier, + max_probability = 0.0875 * rock_max_prob_multiplier, + order = "a[doodad]-a[rock]-a[huge]", + peaks = { + { + influence = -0.1 + }, + { + noise_layer = "rocks", + noise_octaves_difference = -2, + noise_persistence = 0.9, + } + }, + sharpness = 0.7 + }, + pictures = + { + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-05.png", + width = 101, + height = 90, + shift = {0.25, 0.0625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-05.png", + width = 201, + height = 179, + scale = 0.5, + shift = {0.25, 0.0625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-06.png", + width = 117, + height = 86, + shift = {0.4375, 0.046875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-06.png", + width = 233, + height = 171, + scale = 0.5, + shift = {0.429688, 0.046875} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-07.png", + width = 120, + height = 96, + shift = {0.390625, 0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-07.png", + width = 240, + height = 192, + scale = 0.5, + shift = {0.398438, 0.03125} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-08.png", + width = 110, + height = 88, + shift = {0.140625, 0.125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-08.png", + width = 219, + height = 175, + scale = 0.5, + shift = {0.148438, 0.132812} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-09.png", + width = 120, + height = 104, + shift = {0.3125, 0.0625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-09.png", + width = 240, + height = 208, + scale = 0.5, + shift = {0.3125, 0.0625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-10.png", + width = 122, + height = 95, + shift = {0.1875, 0.046875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-10.png", + width = 243, + height = 190, + scale = 0.5, + shift = {0.1875, 0.046875} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-11.png", + width = 125, + height = 93, + shift = {0.390625, 0.0625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-11.png", + width = 249, + height = 185, + scale = 0.5, + shift = {0.398438, 0.0546875} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-12.png", + width = 137, + height = 82, + shift = {0.34375, 0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-12.png", + width = 273, + height = 163, + scale = 0.5, + shift = {0.34375, 0.0390625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-13.png", + width = 138, + height = 88, + shift = {0.265625, 0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-13.png", + width = 275, + height = 175, + scale = 0.5, + shift = {0.273438, 0.0234375} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-14.png", + width = 121, + height = 108, + shift = {0.203125, 0.046875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-14.png", + width = 241, + height = 215, + scale = 0.5, + shift = {0.195312, 0.0390625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-15.png", + width = 159, + height = 91, + shift = {0.515625, 0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-15.png", + width = 318, + height = 181, + scale = 0.5, + shift = {0.523438, 0.03125} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-16.png", + width = 109, + height = 112, + shift = {0.046875, 0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-16.png", + width = 217, + height = 224, + scale = 0.5, + shift = {0.0546875, 0.0234375} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-17.png", + width = 166, + height = 114, + shift = {0.234375, 0.046875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-17.png", + width = 332, + height = 228, + scale = 0.5, + shift = {0.226562, 0.046875} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-18.png", + width = 145, + height = 122, + shift = {0.203125, 0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-18.png", + width = 290, + height = 243, + scale = 0.5, + shift = {0.195312, 0.0390625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-19.png", + width = 175, + height = 113, + shift = {0.609375, 0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-19.png", + width = 349, + height = 225, + scale = 0.5, + shift = {0.609375, 0.0234375} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/rock-huge-20.png", + width = 144, + height = 125, + shift = {0.140625, 0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-huge/hr-rock-huge-20.png", + width = 287, + height = 250, + scale = 0.5, + shift = {0.132812, 0.03125} + }, + } + } +}, +{ + name = "rock-big", + type = "simple-entity", + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__base__/graphics/icons/rock-big.png", + icon_size = 64, + subgroup = "grass", + order = "b[decorative]-l[rock]-b[big]", + collision_box = {{-1.0, -0.9}, {1.0, 1.0}}, + collision_mask = {"object-layer"}, + selection_box = {{-1.2, -1.2}, {1.2, 1.2}}, + minable = + { + mining_particle = "stone-particle", + mining_time = 1, + results = { + {name = "stone", probability = 1, amount_min = 5, amount_max = 10}, + {name = "iron-ore", probability = 1, amount_min = 0, amount_max = 1}, + }, + }, + loot = + { + {item = "stone", probability = 1, count_min = 5, count_max = 10}, + {item = "iron-ore", probability = 1, count_min = 0, count_max = 1} + }, + count_as_rock_for_filtered_deconstruction = true, + mined_sound = { filename = "__base__/sound/deconstruct-bricks.ogg" }, + vehicle_impact_sound = { filename = "__base__/sound/car-stone-impact.ogg", volume = 1.0 }, + render_layer = "object", + max_health = 500, + resistances = + { + { type = "fire", percent = 100 }, + { type = "poison", percent = 100 } + }, + autoplace = { + coverage = 0.0025 * rock_coverage_multiplier, + max_probability = 0.175 * rock_max_prob_multiplier, + order = "a[doodad]-a[rock]-b[big]", + peaks = { + { + noise_layer = "rocks", + noise_octaves_difference = -2, + noise_persistence = 0.9, + } + }, + sharpness = 0.7 + }, + pictures = + { + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-01.png", + width = 94, + height = 64, + shift = {-0.046875, 0.171875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-01.png", + width = 188, + height = 127, + scale = 0.5, + shift = {-0.046875, 0.171875} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-02.png", + width = 98, + height = 68, + shift = {0.4375, 0.125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-02.png", + width = 195, + height = 135, + scale = 0.5, + shift = {0.445312, 0.125} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-03.png", + width = 103, + height = 66, + shift = {0.484375, 0.0625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-03.png", + width = 205, + height = 132, + scale = 0.5, + shift = {0.484375, 0.0546875} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-04.png", + width = 72, + height = 71, + shift = {0.21875, 0.046875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-04.png", + width = 144, + height = 142, + scale = 0.5, + shift = {0.210938, 0.0390625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-05.png", + width = 65, + height = 54, + shift = {0.015625, 0.21875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-05.png", + width = 130, + height = 107, + scale = 0.5, + shift = {0.0234375, 0.226562} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-06.png", + width = 83, + height = 55, + shift = {0.15625, 0.234375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-06.png", + width = 165, + height = 109, + scale = 0.5, + shift = {0.15625, 0.226562} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-07.png", + width = 75, + height = 67, + shift = {0.265625, 0.15625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-07.png", + width = 150, + height = 133, + scale = 0.5, + shift = {0.257812, 0.148438} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-08.png", + width = 78, + height = 56, + shift = {0.09375, 0.171875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-08.png", + width = 156, + height = 111, + scale = 0.5, + shift = {0.0859375, 0.179688} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-09.png", + width = 94, + height = 60, + shift = {0.078125, 0.09375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-09.png", + width = 187, + height = 120, + scale = 0.5, + shift = {0.078125, 0.0859375} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-10.png", + width = 113, + height = 64, + shift = {-0.15625, 0.078125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-10.png", + width = 225, + height = 128, + scale = 0.5, + shift = {-0.15625, 0.0703125} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-11.png", + width = 92, + height = 72, + shift = {0.203125, 0.265625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-11.png", + width = 183, + height = 144, + scale = 0.5, + shift = {0.195312, 0.257812} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-12.png", + width = 79, + height = 69, + shift = {0.046875, 0.15625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-12.png", + width = 158, + height = 138, + scale = 0.5, + shift = {0.0390625, 0.15625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-13.png", + width = 94, + height = 75, + shift = {0.21875, 0.21875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-13.png", + width = 188, + height = 150, + scale = 0.5, + shift = {0.226562, 0.21875} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-14.png", + width = 93, + height = 80, + shift = {0.125, 0.0625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-14.png", + width = 186, + height = 160, + scale = 0.5, + shift = {0.132812, 0.0625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-15.png", + width = 91, + height = 87, + shift = {0.3125, -0.09375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-15.png", + width = 181, + height = 174, + scale = 0.5, + shift = {0.304688, -0.09375} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-16.png", + width = 106, + height = 75, + shift = {0.34375, 0.125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-16.png", + width = 212, + height = 150, + scale = 0.5, + shift = {0.335938, 0.117188} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-17.png", + width = 78, + height = 59, + shift = {0.25, 0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-17.png", + width = 155, + height = 117, + scale = 0.5, + shift = {0.25, 0.0390625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-18.png", + width = 71, + height = 64, + shift = {0.3125, 0.046875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-18.png", + width = 141, + height = 128, + scale = 0.5, + shift = {0.304688, 0.0390625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-19.png", + width = 88, + height = 57, + shift = {0.390625, 0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-19.png", + width = 176, + height = 114, + scale = 0.5, + shift = {0.390625, 0.0234375} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/rock-big-20.png", + width = 60, + height = 63, + shift = {0.140625, 0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-big/hr-rock-big-20.png", + width = 120, + height = 125, + scale = 0.5, + shift = {0.148438, 0.03125} + }, + }, + } +}, +{ + name = "rock-medium", + type = "optimized-decorative", + subgroup = "grass", + order = "b[decorative]-l[rock]-c[medium]", + selectable_in_game = false, + collision_box = {{-1.1, -1.1}, {1.1, 1.1}}, + collision_mask = {"item-layer"}, + --selection_box = {{-1.3, -1.3}, {1.3, 1.3}}, + render_layer = "decorative", + autoplace = { + coverage = 0.005 * rock_coverage_multiplier, + max_probability = 0.35 * rock_max_prob_multiplier, + order = "a[doodad]-a[rock]-c[medium]", + peaks = { + { + noise_layer = "rocks", + noise_octaves_difference = -2, + noise_persistence = 0.9, + } + }, + sharpness = 0.7 + }, + pictures = + { + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-01.png", + priority = base_decorative_sprite_priority, + width = 45, + height = 32, + shift = {0.078125, 0.109375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-01.png", + priority = base_decorative_sprite_priority, + width = 89, + height = 63, + scale = 0.5, + shift = {0.078125, 0.109375} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-02.png", + priority = base_decorative_sprite_priority, + width = 39, + height = 33, + shift = {0.015625, 0.125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-02.png", + priority = base_decorative_sprite_priority, + width = 77, + height = 66, + scale = 0.5, + shift = {0.015625, 0.132812} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-03.png", + priority = base_decorative_sprite_priority, + width = 46, + height = 32, + shift = {0.140625, 0.171875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-03.png", + priority = base_decorative_sprite_priority, + width = 92, + height = 63, + scale = 0.5, + shift = {0.148438, 0.179688} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-04.png", + priority = base_decorative_sprite_priority, + width = 46, + height = 30, + shift = {0, 0.1875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-04.png", + priority = base_decorative_sprite_priority, + width = 91, + height = 59, + scale = 0.5, + shift = {-0.0078125, 0.1875} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-05.png", + priority = base_decorative_sprite_priority, + width = 52, + height = 36, + shift = {0.203125, 0.171875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-05.png", + priority = base_decorative_sprite_priority, + width = 104, + height = 72, + scale = 0.5, + shift = {0.203125, 0.179688} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-06.png", + priority = base_decorative_sprite_priority, + width = 42, + height = 41, + shift = {0.015625, 0.21875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-06.png", + priority = base_decorative_sprite_priority, + width = 83, + height = 82, + scale = 0.5, + shift = {0.015625, 0.21875} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-07.png", + priority = base_decorative_sprite_priority, + width = 56, + height = 33, + shift = {0.0625, 0.3125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-07.png", + priority = base_decorative_sprite_priority, + width = 111, + height = 65, + scale = 0.5, + shift = {0.0625, 0.3125} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-08.png", + priority = base_decorative_sprite_priority, + width = 40, + height = 41, + shift = {0.109375, 0.140625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-08.png", + priority = base_decorative_sprite_priority, + width = 79, + height = 81, + scale = 0.5, + shift = {0.109375, 0.148438} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-09.png", + priority = base_decorative_sprite_priority, + width = 49, + height = 28, + shift = {0.015625, 0.140625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-09.png", + priority = base_decorative_sprite_priority, + width = 98, + height = 56, + scale = 0.5, + shift = {0.015625, 0.140625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-10.png", + priority = base_decorative_sprite_priority, + width = 46, + height = 34, + shift = {0, 0.140625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-10.png", + priority = base_decorative_sprite_priority, + width = 91, + height = 68, + scale = 0.5, + shift = {0, 0.132812} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-11.png", + priority = base_decorative_sprite_priority, + width = 53, + height = 36, + shift = {-0.03125, 0.125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-11.png", + priority = base_decorative_sprite_priority, + width = 105, + height = 71, + scale = 0.5, + shift = {-0.0234375, 0.125} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/rock-medium-12.png", + priority = base_decorative_sprite_priority, + width = 39, + height = 40, + shift = {0.078125, -0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-medium/hr-rock-medium-12.png", + priority = base_decorative_sprite_priority, + width = 78, + height = 80, + scale = 0.5, + shift = {0.078125, -0.015625} + }, + } + } +}, +{ + name = "rock-small", + type = "optimized-decorative", + subgroup = "grass", + order = "b[decorative]-l[rock]-d[small]", + selectable_in_game = false, + collision_box = {{-0.8, -0.8}, {0.8, 0.8}}, + collision_mask = {"item-layer"}, + render_layer = "decorative", + autoplace = { + coverage = 0.01 * rock_coverage_multiplier, + max_probability = 0.7 * rock_max_prob_multiplier, + order = "a[doodad]-a[rock]-d[small]", + peaks = { + { + noise_layer = "rocks", + noise_octaves_difference = -2, + noise_persistence = 0.9, + } + }, + sharpness = 0.7 + }, + pictures = + { + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-01.png", + priority = base_decorative_sprite_priority, + width = 26, + height = 19, + shift = {0.0625, 0.125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-01.png", + priority = base_decorative_sprite_priority, + width = 51, + height = 37, + scale = 0.5, + shift = {0.0546875, 0.117188} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-02.png", + priority = base_decorative_sprite_priority, + width = 26, + height = 18, + shift = {0.046875, 0.078125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-02.png", + priority = base_decorative_sprite_priority, + width = 52, + height = 35, + scale = 0.5, + shift = {0.0390625, 0.078125} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-03.png", + priority = base_decorative_sprite_priority, + width = 23, + height = 21, + shift = {-0.015625, 0.140625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-03.png", + priority = base_decorative_sprite_priority, + width = 46, + height = 42, + scale = 0.5, + shift = {-0.0078125, 0.148438} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-04.png", + priority = base_decorative_sprite_priority, + width = 27, + height = 17, + shift = {0.015625, 0.15625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-04.png", + priority = base_decorative_sprite_priority, + width = 53, + height = 33, + scale = 0.5, + shift = {0.0234375, 0.15625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-05.png", + priority = base_decorative_sprite_priority, + width = 24, + height = 23, + shift = {0.046875, 0.140625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-05.png", + priority = base_decorative_sprite_priority, + width = 47, + height = 46, + scale = 0.5, + shift = {0.0390625, 0.140625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-06.png", + priority = base_decorative_sprite_priority, + width = 31, + height = 21, + shift = {-0.03125, 0.09375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-06.png", + priority = base_decorative_sprite_priority, + width = 62, + height = 41, + scale = 0.5, + shift = {-0.03125, 0.09375} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-07.png", + priority = base_decorative_sprite_priority, + width = 32, + height = 18, + shift = {-0.015625, 0.078125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-07.png", + priority = base_decorative_sprite_priority, + width = 64, + height = 36, + scale = 0.5, + shift = {-0.015625, 0.0703125} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-08.png", + priority = base_decorative_sprite_priority, + width = 33, + height = 16, + shift = {-0.71875, -0.171875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-08.png", + priority = base_decorative_sprite_priority, + width = 65, + height = 31, + scale = 0.5, + shift = {-0.71875, -0.164062} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-09.png", + priority = base_decorative_sprite_priority, + width = 23, + height = 17, + shift = {-0.09375, 0.109375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-09.png", + priority = base_decorative_sprite_priority, + width = 46, + height = 34, + scale = 0.5, + shift = {-0.0859375, 0.101562} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-10.png", + priority = base_decorative_sprite_priority, + width = 24, + height = 17, + shift = {0, 0.125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-10.png", + priority = base_decorative_sprite_priority, + width = 48, + height = 34, + scale = 0.5, + shift = {0.0078125, 0.125} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-11.png", + priority = base_decorative_sprite_priority, + width = 26, + height = 17, + shift = {-0.09375, 0.078125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-11.png", + priority = base_decorative_sprite_priority, + width = 51, + height = 33, + scale = 0.5, + shift = {-0.0859375, 0.078125} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-12.png", + priority = base_decorative_sprite_priority, + width = 24, + height = 20, + shift = {0.078125, 0.109375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-12.png", + priority = base_decorative_sprite_priority, + width = 47, + height = 39, + scale = 0.5, + shift = {0.078125, 0.117188} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-13.png", + priority = base_decorative_sprite_priority, + width = 22, + height = 17, + shift = {0, 0.09375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-13.png", + priority = base_decorative_sprite_priority, + width = 43, + height = 33, + scale = 0.5, + shift = {0, 0.09375} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-14.png", + priority = base_decorative_sprite_priority, + width = 22, + height = 15, + shift = {0.046875, 0.140625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-14.png", + priority = base_decorative_sprite_priority, + width = 43, + height = 30, + scale = 0.5, + shift = {0.046875, 0.140625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-15.png", + priority = base_decorative_sprite_priority, + width = 21, + height = 19, + shift = {0, 0.140625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-15.png", + priority = base_decorative_sprite_priority, + width = 41, + height = 37, + scale = 0.5, + shift = {0, 0.140625} + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/rock-small-16.png", + priority = base_decorative_sprite_priority, + width = 23, + height = 17, + shift = {0.015625, 0.125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-small/hr-rock-small-16.png", + priority = base_decorative_sprite_priority, + width = 46, + height = 33, + scale = 0.5, + shift = {0.0234375, 0.125} + }, + } + } +}, +{ + name = "rock-tiny", + type = "optimized-decorative", + subgroup = "grass", + order = "b[decorative]-l[rock]-e[tiny]", + selectable_in_game = false, + collision_box = {{-0.1, -0.1}, {0.1, 0.1}}, + collision_mask = {"not-colliding-with-itself"}, + render_layer = "decorative", + autoplace = { + coverage = 0.010 * rock_coverage_multiplier, + max_probability = 0.5 * rock_max_prob_multiplier, + order = "a[doodad]-a[rock]-e[tiny]", + peaks = { + { + noise_layer = "rocks", + noise_octaves_difference = -2, + noise_persistence = 0.9, + } + }, + sharpness = 0.7 + }, + pictures = + { + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-01.png", + priority = base_decorative_sprite_priority, + width = 15, + height = 11, + shift = {0.03125, 0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-01.png", + priority = base_decorative_sprite_priority, + width = 29, + height = 21, + scale = 0.5, + shift = {0.0390625, 0.0234375} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-02.png", + priority = base_decorative_sprite_priority, + width = 15, + height = 10, + shift = {0, 0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-02.png", + priority = base_decorative_sprite_priority, + width = 30, + height = 19, + scale = 0.5, + shift = {0.0078125, 0.0234375} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-03.png", + priority = base_decorative_sprite_priority, + width = 15, + height = 12, + shift = {0.015625, 0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-03.png", + priority = base_decorative_sprite_priority, + width = 29, + height = 24, + scale = 0.5, + shift = {0.0234375, 0.0234375} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-04.png", + priority = base_decorative_sprite_priority, + width = 16, + height = 10, + shift = {0.03125, 0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-04.png", + priority = base_decorative_sprite_priority, + width = 32, + height = 20, + scale = 0.5, + shift = {0.03125, 0.015625} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-05.png", + priority = base_decorative_sprite_priority, + width = 15, + height = 13, + shift = {0, -0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-05.png", + priority = base_decorative_sprite_priority, + width = 29, + height = 25, + scale = 0.5, + shift = {0, -0.0078125} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-06.png", + priority = base_decorative_sprite_priority, + width = 18, + height = 12, + shift = {0, -0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-06.png", + priority = base_decorative_sprite_priority, + width = 36, + height = 24, + scale = 0.5, + shift = {0, -0.0234375} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-07.png", + priority = base_decorative_sprite_priority, + width = 39, + height = 17, + shift = {-0.34375, -0.140625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-07.png", + priority = base_decorative_sprite_priority, + width = 78, + height = 34, + scale = 0.5, + shift = {-0.34375, -0.132812} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-08.png", + priority = base_decorative_sprite_priority, + width = 18, + height = 10, + shift = {-0.03125, 0}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-08.png", + priority = base_decorative_sprite_priority, + width = 35, + height = 19, + scale = 0.5, + shift = {-0.03125, 0} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-09.png", + priority = base_decorative_sprite_priority, + width = 14, + height = 10, + shift = {0.015625, 0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-09.png", + priority = base_decorative_sprite_priority, + width = 28, + height = 20, + scale = 0.5, + shift = {0.0234375, 0.015625} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-10.png", + priority = base_decorative_sprite_priority, + width = 15, + height = 10, + shift = {0.015625, -0.03125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-10.png", + priority = base_decorative_sprite_priority, + width = 29, + height = 20, + scale = 0.5, + shift = {0.0078125, -0.0234375} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-11.png", + priority = base_decorative_sprite_priority, + width = 15, + height = 10, + shift = {0.046875, 0}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-11.png", + priority = base_decorative_sprite_priority, + width = 29, + height = 20, + scale = 0.5, + shift = {0.046875, 0.0078125} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-12.png", + priority = base_decorative_sprite_priority, + width = 15, + height = 11, + shift = {0.015625, 0}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-12.png", + priority = base_decorative_sprite_priority, + width = 29, + height = 22, + scale = 0.5, + shift = {0.015625, 0} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-13.png", + priority = base_decorative_sprite_priority, + width = 14, + height = 10, + shift = {0.03125, 0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-13.png", + priority = base_decorative_sprite_priority, + width = 27, + height = 19, + scale = 0.5, + shift = {0.03125, 0.015625} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-14.png", + priority = base_decorative_sprite_priority, + width = 14, + height = 10, + shift = {0.015625, 0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-14.png", + priority = base_decorative_sprite_priority, + width = 27, + height = 19, + scale = 0.5, + shift = {0.0078125, 0.0078125} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-15.png", + priority = base_decorative_sprite_priority, + width = 13, + height = 11, + shift = {0, 0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-15.png", + priority = base_decorative_sprite_priority, + width = 26, + height = 22, + scale = 0.5, + shift = {0.0078125, 0.015625} + } + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/rock-tiny-16.png", + priority = base_decorative_sprite_priority, + width = 14, + height = 10, + shift = {0.03125, 0}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/rock-tiny/hr-rock-tiny-16.png", + priority = base_decorative_sprite_priority, + width = 27, + height = 20, + scale = 0.5, + shift = {0.03125, 0.0078125} + } + } + } +}, +{ + name = "sand-rock-big", + type = "simple-entity", + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__base__/graphics/icons/rock-big.png", + icon_size = 64, + subgroup = "wrecks", + order = "b[decorative]-l[rock]-b[big]", + collision_box = {{-0.75, -0.75}, {0.75, 0.75}}, + collision_mask = {"object-layer"}, + selection_box = {{-1.0, -1.0}, {1.0, 0.75}}, + render_layer = "object", + max_health = 500, + autoplace = { + coverage = 0.0025 * rock_coverage_multiplier, + max_probability = 0.175 * rock_max_prob_multiplier, + order = "a[doodad]-a[rock]-b[big]", + peaks = { + { + noise_layer = "trees-1", + noise_octaves_difference = -2, + noise_persistence = 0.9, + } + }, + sharpness = 0.7 + }, + minable = + { + mining_particle = "stone-particle", + mining_time = 1, + results = { + {name = "stone", amount_min = 5, amount_max = 10}, + {name = "copper-ore", amount_min = 0, amount_max = 1}, + }, + }, + loot = + { + {item = "stone", probability = 1, count_min = 0, count_max = 10} + }, + resistances = + { + { type = "fire", percent = 100 }, + { type = "poison", percent = 100 } + }, + count_as_rock_for_filtered_deconstruction = true, + mined_sound = { filename = "__base__/sound/deconstruct-bricks.ogg" }, + vehicle_impact_sound = { filename = "__base__/sound/car-stone-impact.ogg", volume = 1.0 }, + pictures = + { + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-01.png", + width = 105, + height = 69, + shift = {0.296875, -0.4}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-01.png", + width = 209, + height = 138, + shift = {0.304688, -0.4}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-02.png", + width = 82, + height = 65, + shift = {0.0, 0.046875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-02.png", + width = 165, + height = 129, + shift = {0.0, 0.0390625}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-03.png", + width = 76, + height = 69, + shift = {0.14375, 0.0}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-03.png", + width = 151, + height = 139, + shift = {0.151562, 0.0}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-04.png", + width = 108, + height = 55, + shift = {0.398438, 0.0}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-04.png", + width = 216, + height = 110, + shift = {0.390625, 0.0}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-05.png", + width = 77, + height = 74, + shift = {0.328125, 0.0625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-05.png", + width = 154, + height = 147, + shift = {0.328125, 0.0703125}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-06.png", + width = 77, + height = 66, + shift = {0.16875, -0.1}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-06.png", + width = 154, + height = 132, + shift = {0.16875, -0.1}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-07.png", + width = 96, + height = 65, + shift = {0.3, -0.2}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-07.png", + width = 193, + height = 130, + shift = {0.3, -0.2}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-08.png", + width = 68, + height = 59, + shift = {0.0, 0.0}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-08.png", + width = 136, + height = 117, + shift = {0.0, 0.0}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-09.png", + width = 78, + height = 58, + shift = {0.2, 0.0}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-09.png", + width = 157, + height = 115, + shift = {0.1, 0.0}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-10.png", + width = 99, + height = 77, + shift = {0.325, -0.1}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-10.png", + width = 198, + height = 153, + shift = {0.325, -0.1}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-11.png", + width = 95, + height = 58, + shift = {0.453125, 0.0}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-11.png", + width = 190, + height = 115, + shift = {0.453125, 0.0}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-12.png", + width = 115, + height = 63, + shift = {0.546875, -0.015625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-12.png", + width = 229, + height = 126, + shift = {0.539062, -0.015625}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-13.png", + width = 75, + height = 63, + shift = {0.0625, 0.171875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-13.png", + width = 151, + height = 125, + shift = {0.0703125, 0.179688}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-14.png", + width = 69, + height = 59, + shift = {0.153125, 0.0}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-14.png", + width = 137, + height = 117, + shift = {0.160938, 0.0}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-15.png", + width = 100, + height = 71, + shift = {0.234375, -0.203125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-15.png", + width = 201, + height = 141, + shift = {0.242188, -0.195312}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-big-16.png", + width = 104, + height = 77, + shift = {0.359375, -0.1}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-big-16.png", + width = 209, + height = 154, + shift = {0.351562, -0.1}, + scale = 0.5, + }, + }, + }, +}, +{ + name = "sand-rock-medium", + type = "optimized-decorative", + subgroup = "wrecks", + order = "d[remnants]-d[ship-wreck-grass]-b[small]", + collision_box = {{-1.5, -0.5}, {1.5, 0.5}}, + collision_mask = {"item-layer"}, + selection_box = {{-1.7, -0.6}, {1.7, 0.6}}, + selectable_in_game = false, + render_layer = "floor", + autoplace = { + coverage = 0.004 * rock_coverage_multiplier, + max_probability = 0.27999999999999998 * rock_max_prob_multiplier, + order = "a[doodad]-a[rock]-c[medium]", + peaks = { + { + noise_layer = "trees-1", + noise_octaves_difference = -2, + noise_persistence = 0.9, + } + }, + sharpness = 0.7 + }, + pictures = + { + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-01.png", + priority = base_decorative_sprite_priority, + width = 67, + height = 41, + shift = {0.328125, 0.515625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-01.png", + priority = base_decorative_sprite_priority, + width = 134, + height = 82, + shift = {0.328125, 0.515625}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-02.png", + priority = base_decorative_sprite_priority, + width = 55, + height = 40, + shift = {0.15625, 0.5625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-02.png", + priority = base_decorative_sprite_priority, + width = 110, + height = 79, + shift = {0.15625, 0.570312}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-03.png", + priority = base_decorative_sprite_priority, + width = 44, + height = 30, + shift = {0.34375, 0.484375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-03.png", + priority = base_decorative_sprite_priority, + width = 90, + height = 60, + shift = {0.34375, 0.484375}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-04.png", + priority = base_decorative_sprite_priority, + width = 55, + height = 45, + shift = {0.296875, 0.484375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-04.png", + priority = base_decorative_sprite_priority, + width = 110, + height = 89, + shift = {0.296875, 0.476562}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-05.png", + priority = base_decorative_sprite_priority, + width = 53, + height = 38, + shift = {0.359375, 0.25}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-05.png", + priority = base_decorative_sprite_priority, + width = 106, + height = 76, + shift = {0.359375, 0.25}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-06.png", + priority = base_decorative_sprite_priority, + width = 50, + height = 46, + shift = {0.4375, 0.296875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-06.png", + priority = base_decorative_sprite_priority, + width = 100, + height = 92, + shift = {0.4375, 0.296875}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-07.png", + priority = base_decorative_sprite_priority, + width = 41, + height = 41, + shift = {0.59375, 0.40625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-07.png", + priority = base_decorative_sprite_priority, + width = 82, + height = 83, + shift = {0.59375, 0.398438}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-08.png", + priority = base_decorative_sprite_priority, + width = 62, + height = 46, + shift = {0.59375, 0.328125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-08.png", + priority = base_decorative_sprite_priority, + width = 123, + height = 92, + shift = {0.601562, 0.328125}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-09.png", + priority = base_decorative_sprite_priority, + width = 73, + height = 38, + shift = {0.5625, 0.3125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-09.png", + priority = base_decorative_sprite_priority, + width = 146, + height = 76, + shift = {0.5625, 0.3125}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-10.png", + priority = base_decorative_sprite_priority, + width = 56, + height = 39, + shift = {0.46875, 0.453125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-10.png", + priority = base_decorative_sprite_priority, + width = 112, + height = 77, + shift = {0.46875, 0.460938}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-11.png", + priority = base_decorative_sprite_priority, + width = 46, + height = 30, + shift = {0.4375, 0.515625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-11.png", + priority = base_decorative_sprite_priority, + width = 91, + height = 61, + shift = {0.445312, 0.507812}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-12.png", + priority = base_decorative_sprite_priority, + width = 53, + height = 42, + shift = {0.390625, 0.453125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-12.png", + priority = base_decorative_sprite_priority, + width = 105, + height = 84, + shift = {0.398438, 0.453125}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-13.png", + priority = base_decorative_sprite_priority, + width = 46, + height = 36, + shift = {0.375, 0.640625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-13.png", + priority = base_decorative_sprite_priority, + width = 94, + height = 73, + shift = {0.375, 0.632812}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-14.png", + priority = base_decorative_sprite_priority, + width = 61, + height = 45, + shift = {0.359375, 0.578125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-14.png", + priority = base_decorative_sprite_priority, + width = 122, + height = 89, + shift = {0.359375, 0.570312}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-15.png", + priority = base_decorative_sprite_priority, + width = 49, + height = 33, + shift = {0.1875, 0.765625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-15.png", + priority = base_decorative_sprite_priority, + width = 98, + height = 65, + shift = {0.1875, 0.773438}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-medium-16.png", + priority = base_decorative_sprite_priority, + width = 72, + height = 38, + shift = {0.109375, 0.71875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-medium-16.png", + priority = base_decorative_sprite_priority, + width = 144, + height = 76, + shift = {0.109375, 0.71875}, + scale = 0.5, + }, + }, + } +}, + +{ + name = "sand-rock-small", + type = "optimized-decorative", + subgroup = "wrecks", + order = "d[remnants]-d[ship-wreck-grass]-b[small]", + collision_box = {{-1.5, -0.5}, {1.5, 0.5}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = {{-1.7, -0.6}, {1.7, 0.6}}, + selectable_in_game = false, + render_layer = "floor", + autoplace = { + coverage = 0.011000000000000001 * rock_coverage_multiplier, + max_probability = 0.77000000000000002 * rock_max_prob_multiplier, + order = "a[doodad]-a[rock]-d[small]", + peaks = { + { + noise_layer = "trees-1", + noise_octaves_difference = -2, + noise_persistence = 0.9, + } + }, + sharpness = 0.7 + }, + pictures = + { + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-01.png", + priority = base_decorative_sprite_priority, + width = 28, + height = 23, + shift = {0.40625, 0.484375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-01.png", + priority = base_decorative_sprite_priority, + width = 56, + height = 45, + shift = {0.40625, 0.476562}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-02.png", + priority = base_decorative_sprite_priority, + width = 27, + height = 22, + shift = {0.296875, 0.484375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-02.png", + priority = base_decorative_sprite_priority, + width = 54, + height = 45, + shift = {0.296875, 0.476562}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-03.png", + priority = base_decorative_sprite_priority, + width = 22, + height = 20, + shift = {0.328125, 0.53125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-03.png", + priority = base_decorative_sprite_priority, + width = 44, + height = 40, + shift = {0.328125, 0.53125}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-04.png", + priority = base_decorative_sprite_priority, + width = 30, + height = 22, + shift = {0.265625, 0.59375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-04.png", + priority = base_decorative_sprite_priority, + width = 60, + height = 43, + shift = {0.265625, 0.601562}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-05.png", + priority = base_decorative_sprite_priority, + width = 26, + height = 24, + shift = {0.296875, 0.46875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-05.png", + priority = base_decorative_sprite_priority, + width = 52, + height = 48, + shift = {0.296875, 0.46875}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-06.png", + priority = base_decorative_sprite_priority, + width = 29, + height = 20, + shift = {0.546875, 0.53125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-06.png", + priority = base_decorative_sprite_priority, + width = 57, + height = 39, + shift = {0.554688, 0.523438}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-07.png", + priority = base_decorative_sprite_priority, + width = 36, + height = 21, + shift = {0.578125, 0.546875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-07.png", + priority = base_decorative_sprite_priority, + width = 73, + height = 41, + shift = {0.570312, 0.539062}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-08.png", + priority = base_decorative_sprite_priority, + width = 25, + height = 23, + shift = {0.640625, 0.390625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-08.png", + priority = base_decorative_sprite_priority, + width = 50, + height = 46, + shift = {0.640625, 0.390625}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-09.png", + priority = base_decorative_sprite_priority, + width = 26, + height = 22, + shift = {0.671875, 0.34375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-09.png", + priority = base_decorative_sprite_priority, + width = 52, + height = 43, + shift = {0.671875, 0.335938}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-10.png", + priority = base_decorative_sprite_priority, + width = 32, + height = 20, + shift = {0.625, 0.40625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-10.png", + priority = base_decorative_sprite_priority, + width = 63, + height = 39, + shift = {0.632812, 0.398438}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-11.png", + priority = base_decorative_sprite_priority, + width = 29, + height = 21, + shift = {0.453125, 0.609375}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-11.png", + priority = base_decorative_sprite_priority, + width = 57, + height = 41, + shift = {0.460938, 0.617188}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-12.png", + priority = base_decorative_sprite_priority, + width = 34, + height = 26, + shift = {0.46875, 0.5625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-12.png", + priority = base_decorative_sprite_priority, + width = 67, + height = 51, + shift = {0.460938, 0.570312}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-13.png", + priority = base_decorative_sprite_priority, + width = 35, + height = 19, + shift = {0.484375, 0.796875}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-13.png", + priority = base_decorative_sprite_priority, + width = 70, + height = 37, + shift = {0.484375, 0.789062}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-14.png", + priority = base_decorative_sprite_priority, + width = 32, + height = 24, + shift = {0.1875, 0.90625}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-14.png", + priority = base_decorative_sprite_priority, + width = 63, + height = 48, + shift = {0.179688, 0.90625}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-15.png", + priority = base_decorative_sprite_priority, + width = 28, + height = 24, + shift = {0.140625, 0.78125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-15.png", + priority = base_decorative_sprite_priority, + width = 56, + height = 48, + shift = {0.140625, 0.78125}, + scale = 0.5, + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/sand-rock-small-16.png", + priority = base_decorative_sprite_priority, + width = 37, + height = 23, + shift = {-0.03125, 0.78125}, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-rock/hr-sand-rock-small-16.png", + priority = base_decorative_sprite_priority, + width = 74, + height = 46, + shift = {-0.03125, 0.78125}, + scale = 0.5, + }, + }, + }, +}, +{ + name = "sand-decal", + type = "optimized-decorative", + subgroup = "grass", + order = "b[decorative]-b[red-desert-decal]", + collision_box = {{-6, -6}, {6, 6}}, + collision_mask = {"doodad-layer", "water-tile", "not-colliding-with-itself"}, + render_layer = "decals", + tile_layer = default_decal_layer, -- despite the name, this is not sand exclusive decal; draw under stone path and concrete + autoplace = { + max_probability = 0.05, + order = "a[doodad]-b[decal]", + peaks = { + { + influence = 0.2, + noise_layer = "sand-decal", + --noise_octaves_difference = -2, + noise_octaves_difference = -4, + noise_persistence = 0.9 + }, + { + influence = 0.05, + } + }, + sharpness = 0.1 + }, + pictures = + { + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-01.png", + width = 488, + height = 322, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-01.png", + width = 975, + height = 664, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-02.png", + width = 314, + height = 239, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-02.png", + width = 628, + height = 477, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-03.png", + width = 260, + height = 166, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-03.png", + width = 519, + height = 331, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-04.png", + width = 435, + height = 391, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-04.png", + width = 870, + height = 781, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-05.png", + width = 115, + height = 81, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-05.png", + width = 230, + height = 161, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-06.png", + width = 70, + height = 55, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-06.png", + width = 140, + height = 110, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-07.png", + width = 143, + height = 122, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-07.png", + width = 285, + height = 243, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-08.png", + width = 78, + height = 43, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-08.png", + width = 156, + height = 85, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-09.png", + width = 106, + height = 76, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-09.png", + width = 212, + height = 152, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-10.png", + width = 117, + height = 99, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-10.png", + width = 233, + height = 197, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-11.png", + width = 162, + height = 207, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-11.png", + width = 324, + height = 413, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-12.png", + width = 252, + height = 244, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-12.png", + width = 504, + height = 488, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-13.png", + width = 165, + height = 153, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-13.png", + width = 329, + height = 305, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-14.png", + width = 406, + height = 362, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-14.png", + width = 811, + height = 724, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-15.png", + width = 133, + height = 131, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-15.png", + width = 266, + height = 262, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-16.png", + width = 461, + height = 356, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-16.png", + width = 921, + height = 712, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-17.png", + width = 361, + height = 198, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-17.png", + width = 722, + height = 395, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-18.png", + width = 94, + height = 145, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-18.png", + width = 187, + height = 289, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-19.png", + width = 500, + height = 187, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-19.png", + width = 999, + height = 374, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-20.png", + width = 392, + height = 200, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-20.png", + width = 783, + height = 399, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-21.png", + width = 334, + height = 203, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-21.png", + width = 668, + height = 406, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-22.png", + width = 219, + height = 159, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-22.png", + width = 437, + height = 318, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-23.png", + width = 197, + height = 123, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-23.png", + width = 394, + height = 246, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-24.png", + width = 181, + height = 146, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-24.png", + width = 361, + height = 291, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-25.png", + width = 645, + height = 641, + slice_y = 4, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-25.png", + width = 1290, + height = 1281, + slice_y = 4, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-26.png", + width = 157, + height = 87, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-26.png", + width = 314, + height = 174, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-27.png", + width = 174, + height = 132, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-27.png", + width = 348, + height = 264, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-28.png", + width = 244, + height = 179, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-28.png", + width = 488, + height = 357, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-29.png", + width = 297, + height = 317, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-29.png", + width = 594, + height = 634, + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/sand-decal-30.png", + width = 98, + height = 108, + hr_version = + { + filename = "__alien-biomes__/graphics/decorative/rock/base/sand-decal/hr-sand-decal-30.png", + width = 195, + height = 215, + scale = 0.5 + }, + }, + }, +}, +{ + name = "sand-dune-decal", + type = "optimized-decorative", + subgroup = "grass", + order = "b[decorative]-b[red-desert-decal]", + collision_box = {{-4, -4}, {4, 4}}, + collision_mask = {"doodad-layer", "water-tile", "not-colliding-with-itself"}, + render_layer = "decals", + tile_layer = default_decal_layer, + autoplace = + { + order = "a[doodad]-b[decal]", + sharpness = 0.2, + max_probability = 0.04, + peaks = + { + peak, + { + influence = 0.5, + }, + { + influence = 1, + noise_layer = "sand-dune-decal", + noise_octaves_difference = -3, + noise_persistence = 0.7, + } + }, + tile_restriction = { "sand-1" } + }, + pictures = + { + --dune + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-00.png", + width = 105, + height = 84, + shift = util.by_pixel(-8.5, 0), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-00.png", + width = 212, + height = 168, + shift = util.by_pixel(-8, 0), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-01.png", + width = 88, + height = 73, + shift = util.by_pixel(-3, -3.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-01.png", + width = 211, + height = 148, + shift = util.by_pixel(5.75, -3.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-02.png", + width = 130, + height = 91, + shift = util.by_pixel(3, 1.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-02.png", + width = 260, + height = 184, + shift = util.by_pixel(3, 1), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-03.png", + width = 61, + height = 90, + shift = util.by_pixel(0.5, 2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-03.png", + width = 129, + height = 181, + shift = util.by_pixel(0.75, 1.75), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-04.png", + width = 95, + height = 92, + shift = util.by_pixel(-3.5, -1), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-04.png", + width = 196, + height = 184, + shift = util.by_pixel(-3.5, -1.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-05.png", + width = 107, + height = 92, + shift = util.by_pixel(-1.5, -1), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-05.png", + width = 215, + height = 184, + shift = util.by_pixel(-1.25, -1), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-06.png", + width = 108, + height = 89, + shift = util.by_pixel(6, 4.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-06.png", + width = 218, + height = 179, + shift = util.by_pixel(6.5, 4.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-07.png", + width = 125, + height = 91, + shift = util.by_pixel(17.5, 3.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-07.png", + width = 250, + height = 183, + shift = util.by_pixel(17.5, 3.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-08.png", + width = 130, + height = 86, + shift = util.by_pixel(5, 1), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-08.png", + width = 260, + height = 176, + shift = util.by_pixel(5, 0.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-09.png", + width = 129, + height = 92, + shift = util.by_pixel(-5.5, -1), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-09.png", + width = 260, + height = 184, + shift = util.by_pixel(-5.5, -1), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-10.png", + width = 115, + height = 91, + shift = util.by_pixel(-14.5, 1.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-10.png", + width = 233, + height = 183, + shift = util.by_pixel(-13.75, 1.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-11.png", + width = 85, + height = 92, + shift = util.by_pixel(-9.5, 2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-11.png", + width = 172, + height = 184, + shift = util.by_pixel(-9.5, 2), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-12.png", + width = 129, + height = 82, + shift = util.by_pixel(2.5, -7), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-12.png", + width = 260, + height = 166, + shift = util.by_pixel(2.5, -6.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-13.png", + width = 129, + height = 85, + shift = util.by_pixel(4.5, -0.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-13.png", + width = 259, + height = 172, + shift = util.by_pixel(4.75, -1), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-14.png", + width = 98, + height = 92, + shift = util.by_pixel(-3, -2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-14.png", + width = 199, + height = 184, + shift = util.by_pixel(-2.25, -2), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-15.png", + width = 104, + height = 92, + shift = util.by_pixel(9, -3), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-15.png", + width = 214, + height = 184, + shift = util.by_pixel(8.5, -3), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-16.png", + width = 80, + height = 91, + shift = util.by_pixel(-8, -4.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-16.png", + width = 162, + height = 182, + shift = util.by_pixel(-8, -4.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-17.png", + width = 110, + height = 76, + shift = util.by_pixel(-3, 0), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-17.png", + width = 222, + height = 153, + shift = util.by_pixel(-3, -0.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-18.png", + width = 122, + height = 92, + shift = util.by_pixel(4, -3), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-18.png", + width = 247, + height = 184, + shift = util.by_pixel(4.25, -2.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-19.png", + width = 103, + height = 92, + shift = util.by_pixel(-6.5, -3), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-19.png", + width = 211, + height = 184, + shift = util.by_pixel(-5.75, -3), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-20.png", + width = 121, + height = 91, + shift = util.by_pixel(-0.5, 2.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-20.png", + width = 248, + height = 183, + shift = util.by_pixel(-1.5, 2.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-21.png", + width = 87, + height = 91, + shift = util.by_pixel(6.5, 1.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-21.png", + width = 176, + height = 184, + shift = util.by_pixel(6.5, 1.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-22.png", + width = 104, + height = 92, + shift = util.by_pixel(9, -2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-22.png", + width = 208, + height = 185, + shift = util.by_pixel(9, -1.75), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-23.png", + width = 113, + height = 91, + shift = util.by_pixel(-3.5, -1.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-23.png", + width = 227, + height = 184, + shift = util.by_pixel(-3.75, -1.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-24.png", + width = 78, + height = 92, + shift = util.by_pixel(5, -1), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-24.png", + width = 158, + height = 186, + shift = util.by_pixel(4.5, -1), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-25.png", + width = 129, + height = 91, + shift = util.by_pixel(1.5, -1.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-25.png", + width = 260, + height = 184, + shift = util.by_pixel(1.5, -1.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-26.png", + width = 66, + height = 92, + shift = util.by_pixel(-1, -1), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-26.png", + width = 134, + height = 184, + shift = util.by_pixel(-0.5, -1), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-27.png", + width = 63, + height = 82, + shift = util.by_pixel(26.5, 1), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-27.png", + width = 127, + height = 165, + shift = util.by_pixel(26.25, 1.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-28.png", + width = 129, + height = 79, + shift = util.by_pixel(-2.5, -4.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-28.png", + width = 258, + height = 158, + shift = util.by_pixel(-2.5, -4.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/sand-dune-decal-29.png", + width = 89, + height = 92, + shift = util.by_pixel(-3.5, -2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/dune/|color|/sand-dune-decal/hr-sand-dune-decal-29.png", + width = 180, + height = 184, + shift = util.by_pixel(-3.5, -2), + scale = 0.5 + }, + }, + }, +}, +{ + name = "stone-decal", + type = "optimized-decorative", + subgroup = "grass", + order = "b[decorative]-b[red-desert-decal]", + collision_box = {{-4, -4}, {4, 4}}, + collision_mask = {"doodad-layer", "water-tile", "not-colliding-with-itself"}, + render_layer = "decals", + tile_layer = default_decal_layer, -- under stone-path + autoplace = + { + max_probability = 0.01, + order = "a[doodad]-b[decal]", + peaks = { + { + noise_layer = "stone-decal", + noise_octaves_difference = -2, + noise_persistence = 0.9 + } + }, + sharpness = 0.3 + }, + pictures = + { + --lightDecal + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-00.png", + width = 199, + height = 149, + shift = util.by_pixel(4.5, -2.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-00.png", + width = 400, + height = 299, + shift = util.by_pixel(4.5, -2.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-01.png", + width = 210, + height = 160, + shift = util.by_pixel(-1, 2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-01.png", + width = 419, + height = 320, + shift = util.by_pixel(-0.75, 2), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-02.png", + width = 208, + height = 142, + shift = util.by_pixel(-1, 2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-02.png", + width = 417, + height = 287, + shift = util.by_pixel(-1.25, 1.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-03.png", + width = 211, + height = 149, + shift = util.by_pixel(-0.5, 5.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-03.png", + width = 421, + height = 298, + shift = util.by_pixel(-0.25, 5.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-04.png", + width = 198, + height = 151, + shift = util.by_pixel(6, 3.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-04.png", + width = 396, + height = 302, + shift = util.by_pixel(6, 4), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-05.png", + width = 205, + height = 147, + shift = util.by_pixel(-2.5, 7.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-05.png", + width = 408, + height = 295, + shift = util.by_pixel(-2.5, 7.75), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-06.png", + width = 208, + height = 158, + shift = util.by_pixel(-1, 3), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-06.png", + width = 417, + height = 317, + shift = util.by_pixel(-1.25, 3.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-07.png", + width = 209, + height = 155, + shift = util.by_pixel(0.5, 2.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-07.png", + width = 419, + height = 312, + shift = util.by_pixel(0.75, 2.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-08.png", + width = 206, + height = 158, + shift = util.by_pixel(-2, 2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-08.png", + width = 413, + height = 317, + shift = util.by_pixel(-2.25, 2.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-09.png", + width = 201, + height = 155, + shift = util.by_pixel(0.5, 1.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-09.png", + width = 403, + height = 310, + shift = util.by_pixel(0.25, 1.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-10.png", + width = 206, + height = 153, + shift = util.by_pixel(-1, 1.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-10.png", + width = 411, + height = 307, + shift = util.by_pixel(-0.75, 1.75), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-11.png", + width = 210, + height = 147, + shift = util.by_pixel(0, -0.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-11.png", + width = 421, + height = 295, + shift = util.by_pixel(-0.25, -0.75), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-12.png", + width = 210, + height = 140, + shift = util.by_pixel(-1, -7), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-12.png", + width = 420, + height = 280, + shift = util.by_pixel(-0.5, -7), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-13.png", + width = 201, + height = 156, + shift = util.by_pixel(0.5, 3), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-13.png", + width = 403, + height = 311, + shift = util.by_pixel(0.75, 3.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-14.png", + width = 209, + height = 152, + shift = util.by_pixel(0.5, 2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-14.png", + width = 418, + height = 304, + shift = util.by_pixel(0, 2), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-15.png", + width = 199, + height = 142, + shift = util.by_pixel(-3.5, 6), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-15.png", + width = 398, + height = 284, + shift = util.by_pixel(-3.5, 6.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-16.png", + width = 204, + height = 154, + shift = util.by_pixel(4, -1), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-16.png", + width = 406, + height = 313, + shift = util.by_pixel(4, 0.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-17.png", + width = 210, + height = 147, + shift = util.by_pixel(1, 4.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-17.png", + width = 420, + height = 294, + shift = util.by_pixel(0.5, 4.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-18.png", + width = 189, + height = 145, + shift = util.by_pixel(0.5, 5.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-18.png", + width = 379, + height = 289, + shift = util.by_pixel(0.25, 5.75), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-19.png", + width = 201, + height = 155, + shift = util.by_pixel(-5.5, 1.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-19.png", + width = 401, + height = 311, + shift = util.by_pixel(-5.25, 1.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-20.png", + width = 209, + height = 158, + shift = util.by_pixel(0.5, 1), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-20.png", + width = 418, + height = 315, + shift = util.by_pixel(0.5, 1.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-21.png", + width = 208, + height = 157, + shift = util.by_pixel(1, 3.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-21.png", + width = 418, + height = 314, + shift = util.by_pixel(1, 3), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-22.png", + width = 211, + height = 135, + shift = util.by_pixel(-0.5, 0.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-22.png", + width = 421, + height = 270, + shift = util.by_pixel(-0.25, 1), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-23.png", + width = 202, + height = 145, + shift = util.by_pixel(2, -2.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-23.png", + width = 403, + height = 290, + shift = util.by_pixel(2.25, -2.5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-24.png", + width = 209, + height = 158, + shift = util.by_pixel(-0.5, 2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-24.png", + width = 418, + height = 315, + shift = util.by_pixel(-0.5, 2.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-25.png", + width = 207, + height = 155, + shift = util.by_pixel(-2.5, 4.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-25.png", + width = 414, + height = 310, + shift = util.by_pixel(-2, 4), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-26.png", + width = 201, + height = 154, + shift = util.by_pixel(-3.5, 5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-26.png", + width = 403, + height = 306, + shift = util.by_pixel(-3.75, 5), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-27.png", + width = 208, + height = 151, + shift = util.by_pixel(1, 0.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-27.png", + width = 416, + height = 303, + shift = util.by_pixel(1, 0.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-28.png", + width = 211, + height = 155, + shift = util.by_pixel(-0.5, 2.5), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-28.png", + width = 422, + height = 311, + shift = util.by_pixel(0, 2.25), + scale = 0.5 + }, + }, + { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/stone-decal-29.png", + width = 203, + height = 146, + shift = util.by_pixel(-3.5, 2), + hr_version = { + filename = "__alien-biomes__/graphics/decorative/rock/base/stone-decal/hr-stone-decal-29.png", + width = 406, + height = 292, + shift = util.by_pixel(-3.5, 2), + scale = 0.5 + }, + }, + }, +}, +} diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/rocks.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/rocks.lua new file mode 100644 index 0000000..e15b50c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/decorative/rocks.lua @@ -0,0 +1,80 @@ +local data_util = require('data_util') + +-- decals for asteroids +-- rocks floating in space + + +local tints = { + grey = {177,183,187}, +} + + +-- ROCKS +-- get base rocks +local base_rocks_list = require("rocks-base") +local base_rocks = {} +for _, rock in pairs(base_rocks_list) do + base_rocks[rock.name] = rock +end + +-- make a new colored rock from a base rock and restrict to certain biome tiles by tag +local make_rock = function(name, color, base_names, tile_restriction, multiplier) + if table_size(tile_restriction) > 0 then + color = name + for _, base_name in pairs(base_names) do + local rock = table.deepcopy(base_rocks[base_name]) + rock.name = data_util.mod_prefix.. base_name .. '-' .. name + rock.autoplace.tile_restriction = tile_restriction + if rock.autoplace.coverage then rock.autoplace.coverage = rock.autoplace.coverage * multiplier end + if rock.autoplace.max_probability then rock.autoplace.max_probability = rock.autoplace.max_probability * multiplier end + + for _, pic in pairs(rock.pictures) do + pic.tint = tints[color] + if pic.hr_version then + pic.hr_version.tint = tints[color] + end + end + + rock.localised_name = {"entity-name.small-asteroid"} + -- volcanic has generally more rocks + data:extend({rock}) + end + end +end + +make_rock( + 'space', 'grey', + { + 'rock-huge', + 'rock-big', + }, + {data_util.mod_prefix.."space", data_util.mod_prefix.."asteroid"}, + 0.25 +) + +make_rock( + 'asteroid', 'grey', + { + 'rock-huge', + 'rock-big', + 'rock-medium', + 'rock-small', + 'rock-tiny', + 'sand-rock-big', + 'sand-rock-medium', + 'sand-rock-small', + }, + {data_util.mod_prefix.."asteroid"}, + 1 +) + +-- non-sand shared decals +make_rock( + 'space', 'grey', + { + 'stone-decal', + 'sand-decal' + }, + {data_util.mod_prefix.."asteroid"}, + 2 +) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/ancient.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/ancient.lua new file mode 100644 index 0000000..022136c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/ancient.lua @@ -0,0 +1,339 @@ +local data_util = require("data_util") + +data:extend({ + { + name = data_util.mod_prefix .. "pyramid-a", + type = "simple-entity", + map_color = {r = 0, g = 0, b = 0}, + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/pyramid.png", + icon_size = 64, + order = "a[ancient]-p[pyramid]-a", + collision_box = {{-9, -7}, {9, 7}}, + collision_mask = {"item-layer","object-layer","player-layer","water-tile"}, + selection_box = {{-9, -7}, {9, 7}}, + render_layer = "object", + selectable_in_game = false, + picture = + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/entity/cartouche/pyramid-a.png", + width = 622+64, + height = 571+32, + shift = {0,-1+0.25}, + scale = 1, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/cartouche/pyramid-a-shadow.png", + width = 743, + height = 584, + shift = {1.5-2/32,-1+8/32}, + scale = 1, + } + } + } + }, + { + name = data_util.mod_prefix .. "pyramid-b", + type = "simple-entity", + map_color = {r = 0, g = 0, b = 0}, + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/pyramid.png", + icon_size = 64, + order = "a[ancient]-p[pyramid]-b", + collision_box = {{-9, -7}, {9, 7}}, + collision_mask = {"item-layer","object-layer","player-layer","water-tile"}, + selection_box = {{-9, -7}, {9, 7}}, + render_layer = "object", + selectable_in_game = false, + picture = + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/entity/cartouche/pyramid-b.png", + width = 611+64, + height = 554+32, + shift = {0,-1.5+0.25}, + scale = 1, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/cartouche/pyramid-b-shadow.png", + width = 867, + height = 568, + shift = {3.5+2/32,-1.5+8/32}, + scale = 1, + } + } + } + }, + { + name = data_util.mod_prefix .. "pyramid-c", + type = "simple-entity", + map_color = {r = 0, g = 0, b = 0}, + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/pyramid.png", + icon_size = 64, + order = "a[ancient]-p[pyramid]-c", + collision_box = {{-9, -7}, {9, 7}}, + collision_mask = {"item-layer","object-layer","player-layer","water-tile"}, + selection_box = {{-9, -7}, {9, 7}}, + render_layer = "object", + selectable_in_game = false, + picture = + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/entity/cartouche/pyramid-c.png", + width = 623+64, + height = 571+32, + shift = {0,-1+0.25}, + scale = 1, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/cartouche/pyramid-c-shadow.png", + width = 976, + height = 584, + shift = {5+4/32,-1+8/32}, + scale = 1, + } + } + } + }, + { + name = data_util.mod_prefix .. "cartouche-a", + type = "simple-entity", + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__space-exploration-graphics__/graphics/icons/cartouche-a.png", + icon_size = 64, + order = "a[ancient]-c[cartouche]-a[a]", + collision_box = {{-9, -7}, {9, 7}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = {{-9, -7}, {9, 7}}, + render_layer = "floor", + selectable_in_game = false, + picture = + { + filename = "__space-exploration-graphics__/graphics/entity/cartouche/cartouche-a.png", + width = 1154, + height = 821, + shift = {0,0}, + scale = 0.5, + } + }, + { + name = data_util.mod_prefix .. "cartouche-b-a", + type = "simple-entity", + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__space-exploration-graphics__/graphics/icons/cartouche-b-a.png", + icon_size = 64, + order = "a[ancient]-c[cartouche]-b[b]-a", + collision_box = {{-4, -3}, {4, 3}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = {{-4, -3}, {4, 3}}, + selectable_in_game = false, + render_layer = "floor", + picture = + { + filename = "__space-exploration-graphics__/graphics/entity/cartouche/cartouche-b-a.png", + width = 520, + height = 373, + shift = {0,0}, + scale = 0.5, + } + }, + { + name = data_util.mod_prefix .. "cartouche-b-b", + type = "simple-entity", + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__space-exploration-graphics__/graphics/icons/cartouche-b-b.png", + icon_size = 64, + order = "a[ancient]-c[cartouche]-b[b]-b", + collision_box = {{-1, -1}, {1, 1}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = {{-1, -1}, {1, 1}}, + selectable_in_game = false, + render_layer = "floor", + picture = + { + filename = "__space-exploration-graphics__/graphics/entity/cartouche/cartouche-b-b.png", + width = 520, + height = 373, + shift = {0,0}, + scale = 0.5, + } + }, + { + type = "container", + name = data_util.mod_prefix .. "cartouche-chest", -- "rocket-launch-pad-chest" + circuit_connector_sprites = nil, + circuit_wire_connection_point = nil, + circuit_wire_max_distance = 0, + close_sound = { + filename = "__base__/sound/metallic-chest-close.ogg", + volume = 0.7 + }, + collision_box = {{-0.95, -0.95}, {0.95, 0.95}}, + selection_box = {{-0.95, -0.95}, {0.95, 0.95}}, + corpse = "medium-remnants", + flags = { + "placeable-neutral", + "player-creation" + }, + icon = "__space-exploration-graphics__/graphics/icons/cartouche-chest.png", + icon_size = 64, + inventory_size = 10, + max_health = 1000, + open_sound = { + filename = "__base__/sound/metallic-chest-open.ogg", + volume = 0.65 + }, + order = "z-z", + picture = { + layers = { + { + filename = "__space-exploration-graphics__/graphics/entity/cartouche/chest.png", + height = 128, + priority = "extra-high", + shift = { 0, 0 }, + width = 128, + scale = 0.5 + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/cartouche/chest-shadow.png", + height = 96, + priority = "extra-high", + shift = { 8/32, 8/32 }, + width = 160, + scale = 0.5 + }, + } + }, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + } + }, +}) + +for i = 1, 64, 1 do + local large = { + name = data_util.mod_prefix .. "glyph-a-"..i, + type = "simple-entity", + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__space-exploration-graphics__/graphics/icons/glyph/glyph-a-"..i..".png", + icon_size = 64, + order = "a[ancient]-c[cartouche]-g[glyph]-a[a]-"..i, + collision_box = {{-1, -1}, {1, 1}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = {{-1, -1}, {1, 1}}, + selectable_in_game = false, + render_layer = "lower-object", + picture = + { + filename = "__space-exploration-graphics__/graphics/entity/cartouche/glyphs-a-metal.png", + width = 2048/8, + height = 1536/8, + x = ((i-1)%8)*2048/8, + y = math.floor((i-1)/8)*1536/8, + shift = {0,0}, + scale = 0.5, + }, + localised_name = {"entity-name.glyph"} + } + local small = table.deepcopy(large) + small.name = small.name .. "-small" + small.picture.scale = small.picture.scale * 0.5 + data:extend({small, large}) +end + +for i = 1, 64, 1 do + local large = { + name = data_util.mod_prefix .. "glyph-b-"..i, + type = "simple-entity", + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__space-exploration-graphics__/graphics/icons/glyph/glyph-b-"..i..".png", + icon_size = 64, + order = "a[ancient]-c[cartouche]-g[glyph]-b[b]-"..i, + collision_box = {{-4, -3}, {4, 3}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = {{-4, -3}, {4, 3}}, + selectable_in_game = false, + render_layer = "lower-object", + picture = + { + filename = "__space-exploration-graphics__/graphics/entity/cartouche/glyphs-b-metal.png", + width = 1280/8, + height = 1024/8, + x = ((i-1)%8)*1280/8, + y = math.floor((i-1)/8)*1024/8, + shift = {0,0}, + scale = 0.5, + }, + localised_name = {"entity-name.glyph"} + } + local small = table.deepcopy(large) + small.name = small.name .. "-small" + small.picture.scale = small.picture.scale * 0.65 + data:extend({small, large}) +end + +data:extend({ + --[[{ + name = data_util.mod_prefix .. "lightbeam-a", + type = "projectile", + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/pyramid.png", + icon_size = 64, + order = "a[ancient]-p[pyramid]-a", + collision_box = {{-9, -7}, {9, 7}}, + collision_mask = {"item-layer","object-layer","player-layer","water-tile"}, + selection_box = {{-9, -7}, {9, 7}}, + render_layer = "object", + selectable_in_game = false, + picture = + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/entity/cartouche/pyramid-a.png", + width = 622, + height = 571, + shift = {0,-1}, + scale = 1, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/cartouche/pyramid-a-shadow.png", + width = 743, + height = 584, + shift = {1.5-2/32,-1+8/32}, + scale = 1, + } + } + } + },]]-- + { + type = "projectile", + name = data_util.mod_prefix .. "lightbeam-a", + acceleration = 0, + rotatable = false, + animation = { + filename = "__space-exploration-graphics__/graphics/entity/cartouche/lightbeam-a.png", + frame_count = 1, + width = 296, + height = 193, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + scale = 1, + blend_mode = "additive" + }, + flags = { "not-on-map" }, + light = { intensity = 2, size = 16, color={r=1,g=0.9,b=0.8}}, + }, + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/astrometric-gravimetric.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/astrometric-gravimetric.lua new file mode 100644 index 0000000..054883e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/astrometric-gravimetric.lua @@ -0,0 +1,356 @@ +local data_util = require("data_util") + +local pipe_pictures = { + north = blank_image, + east = { + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/sr/pipe-right.png", + width = 10/2, + height = 60/2, + priority = "extra-high", + shift = util.by_pixel(-18, 1), + hr_version = { + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/hr/pipe-right.png", + width = 10, + height = 60, + priority = "extra-high", + shift = util.by_pixel(-18, 1), + scale = 0.5, + }, + }, + north = { + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/sr/pipe-top.png", + width = 128/2, + height = 128/2, + priority = "extra-high", + shift = util.by_pixel(0, 22), + hr_version = { + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/hr/pipe-top.png", + width = 128, + height = 128, + priority = "extra-high", + shift = util.by_pixel(0, 22), + scale = 0.5, + }, + }, + south = { + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/sr/pipe-bottom.png", + width = 70/2, + height = 44/2, + priority = "extra-high", + shift = util.by_pixel(3, -27), + hr_version = { + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/hr/pipe-bottom.png", + width = 70, + height = 44, + priority = "extra-high", + shift = util.by_pixel(3, -27), + scale = 0.5, + }, + }, + west = { + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/sr/pipe-left.png", + width = 10/2, + height = 64/2, + priority = "extra-high", + shift = util.by_pixel(18, 2), + hr_version = { + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/hr/pipe-left.png", + width = 10, + height = 64, + priority = "extra-high", + shift = util.by_pixel(18, 2), + scale = 0.5, + }, + } +} + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-astrometrics-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/astrometrics-laboratory.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {hardness = 0.2, mining_time = 1, result = data_util.mod_prefix .. "space-astrometrics-laboratory"}, + max_health = 700, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-2.3, -2.3}, {2.3, 2.3}}, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + drawing_box = {{-2.5, -3.5}, {2.5, 2.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -3} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 3} }}, + secondary_draw_orders = { north = -1 } + }, + off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/sr/astrometrics-laboratory.png", + priority = "high", + width = 2752/8/2, + height = 3120/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -11), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/hr/astrometrics-laboratory.png", + priority = "high", + width = 2752/8, + height = 3120/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -11), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/sr/astrometrics-laboratory-shadow.png", + priority = "high", + width = 330/2, + height = 220/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(26, 24), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/astrometrics-laboratory/hr/astrometrics-laboratory-shadow.png", + priority = "high", + width = 330, + height = 220, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(26, 24), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-astrometrics"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = {r = 1, g = 0.9, b = 0.5}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-gravimetrics-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/gravimetrics-laboratory.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {hardness = 0.2, mining_time = 1, result = data_util.mod_prefix .. "space-gravimetrics-laboratory"}, + max_health = 700, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-2.3, -2.3}, {2.3, 2.3}}, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + drawing_box = {{-2.5, -3.5}, {2.5, 2.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -3} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 3} }}, + secondary_draw_orders = { north = -1 } + }, + off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-4__/graphics/entity/gravimetrics-laboratory/sr/gravimetrics-laboratory.png", + priority = "high", + width = 2752/8/2, + height = 3120/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -11), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-4__/graphics/entity/gravimetrics-laboratory/hr/gravimetrics-laboratory.png", + priority = "high", + width = 2752/8, + height = 3120/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -11), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/gravimetrics-laboratory/sr/gravimetrics-laboratory-shadow.png", + priority = "high", + width = 330/2, + height = 220/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(26, 24), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/gravimetrics-laboratory/hr/gravimetrics-laboratory-shadow.png", + priority = "high", + width = 330, + height = 220, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(26, 24), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-gravimetrics", "arcosphere"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = {r = 100/255, g = 48/255, b = 1}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/cargo-rocket.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/cargo-rocket.lua new file mode 100644 index 0000000..0a4ce75 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/cargo-rocket.lua @@ -0,0 +1,423 @@ +local data_util = require("data_util") + +local side_thruster_offset = 40 +local bottom_thruster_offset = 89 + +data:extend({ + { + type = "container", + name = data_util.mod_prefix .. "cargo-rocket-cargo-pod", -- "rocket-launch-pad-chest" + circuit_connector_sprites = nil, + circuit_wire_connection_point = nil, + circuit_wire_max_distance = 0, + close_sound = { + filename = "__base__/sound/metallic-chest-close.ogg", + volume = 0.7 + }, + collision_box = {{-0.95, -0.95}, {0.95, 0.95}}, + selection_box = {{-0.95, -0.95}, {0.95, 0.95}}, + corpse = "medium-remnants", + flags = { + "placeable-neutral", + "player-creation" + }, + icon = "__space-exploration-graphics__/graphics/icons/cargo-pod.png", + icon_size = 64, + inventory_size = math.ceil(rocket_capacity / 0.9 / 100 ) * 10, --can fit all partial stacks if 9/10 pods land + max_health = 1000, + minable = { + mining_time = 0.2, + result = data_util.mod_prefix .. "cargo-rocket-cargo-pod" + }, + open_sound = { + filename = "__base__/sound/metallic-chest-open.ogg", + volume = 0.65 + }, + order = "z-z", + picture = { + layers = { + { + filename = "__space-exploration-graphics__/graphics/entity/cargo-pod/cargo-pod.png", + height = 194, + priority = "extra-high", + shift = { 1/32, 1/32 }, + width = 147, + scale = 0.35 + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/cargo-pod/cargo-pod-shadow.png", + height = 164, + priority = "extra-high", + shift = { 10/32, 6/32 }, + width = 167, + scale = 0.35 + }, + } + }, + resistances = { + { + percent = 90, + type = "fire" + }, + { + percent = 90, + type = "explosion" + }, + { + percent = 100, + type = "poison" + }, + { + percent = 60, + type = "impact" + }, + { + percent = 100, + type = "meteor" + } + }, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + } + }, + { + -- this only exists for the animation + -- it won't be selectable or affected normally + -- when ready to launch the required dummy item will be added + -- then launch will be triggered by script + type = "rocket-silo-rocket", + name = data_util.mod_prefix .. "cargo-rocket", + inventory_size = 1, + collision_box = { { -2, -7 }, { 2, 7 } }, + collision_mask = { "not-colliding-with-itself" }, + dying_explosion = "massive-explosion", + shadow_slave_entity = "rocket-silo-rocket-shadow", + engine_starting_speed = 1 / (5.5 * 60), + flying_speed = 1 / (2000 * 60), + flying_acceleration = 0.01, + flags = { "not-on-map" }, + flying_trigger = { + { + sound = { + { + filename = "__base__/sound/silo-rocket.ogg", + volume = 1.8 + } + }, + type = "play-sound" + } + }, + glow_light = + { + intensity = 1, + size = 30, + shift = {0, 1.5}, + color = {r = 1.0, g = 1.0, b = 1.0} + }, + + rising_speed = 1 / (7 * 60), + rocket_initial_offset = {0, 5}, + rocket_rise_offset = {0, -5.75}, + rocket_launch_offset = {0, -256}, + rocket_render_layer_switch_distance = 10.5,--7.5, + full_render_layer_switch_distance = 12,--9, + effects_fade_in_start_distance = 7.5,--4.5, + effects_fade_in_end_distance = 10.5,--7.5, + shadow_fade_out_start_ratio = 0.25, + shadow_fade_out_end_ratio = 0.75, + rocket_visible_distance_from_center = 2.75, + + --[[ + rocket_shadow_sprite = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/09-rocket-shadow/09-rocket-shadow.png", + height = 128, + priority = "medium", + shift = { + -2.5, + 2 + }, + width = 394 + }, + rocket_sprite = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/02-11-rocket/02-rocket.png", + height = 394, + shift = { + 0, + 5.5 - (394 - 288) / 2 / 32 -- keep base aligned with flare + }, + width = 192 + }, + ]]-- + + rocket_sprite = util.add_shift_offset(util.by_pixel(0, 32*3.5), --util.mul_shift(rocket_rise_offset, -1), + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/02-rocket.png", + width = 310/2, + height = 950/2, + shift = util.by_pixel(-5, -27), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-02-rocket.png", + width = 310, + height = 950, + shift = util.by_pixel(-5, -27), + scale = 0.5 + } + }), + + rocket_shadow_sprite = util.add_shift_offset(util.by_pixel(-146, -120), + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/09-rocket-shadow.png", + priority = "medium", + width = 788/2, + height = 256/2, + draw_as_shadow = true, + shift = util.by_pixel(146, 120), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-09-rocket-shadow.png", + priority = "medium", + width = 788, + height = 256, + draw_as_shadow = true, + shift = util.by_pixel(146, 121), + scale = 0.5 + } + }), + + + rocket_glare_overlay_sprite = util.add_shift_offset(util.by_pixel(0, 112+112), + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/03-rocket-over-glare.png", + blend_mode = "additive", + width = 481, + height = 481, + shift = util.by_pixel(-2, -2 + bottom_thruster_offset), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-03-rocket-over-glare.png", + blend_mode = "additive", + width = 954, + height = 954, + shift = util.by_pixel(0, 0 + bottom_thruster_offset), + scale = 0.5 + } + }), + rocket_smoke_top1_animation = util.add_shift_offset(util.by_pixel(0-66, -112+28+232+32), + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 1, g = 0, b = 0, a = 0.8 }, + width = 41, + height = 145, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5*1.3, + shift = util.by_pixel(-2, -2 + side_thruster_offset), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 1, g = 0, b = 0, a = 0.8 }, + width = 80, + height = 286, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5/2*1.3, + shift = util.by_pixel(-1, -3 + side_thruster_offset), + } + }), + rocket_smoke_top2_animation = util.add_shift_offset(util.by_pixel(0+17, -112+28+265+32), + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 0, g = 1, b = 0, a = 0.8 }, + width = 41, + height = 145, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5*1.3, + shift = util.by_pixel(-2, -2 + side_thruster_offset), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 0, g = 1, b = 0, a = 0.8 }, + width = 80, + height = 286, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5/2*1.3, + shift = util.by_pixel(-1, -3 + side_thruster_offset), + } + }), + rocket_smoke_top3_animation = util.add_shift_offset(util.by_pixel(0+48, -112+28+252+32), + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 0, g = 0, b = 1, a = 0.8 }, + width = 41, + height = 145, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5*1.3, + shift = util.by_pixel(-2, -2 + side_thruster_offset), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.8 }, + --tint = { r = 0, g = 0, b = 1, a = 0.8 }, + width = 80, + height = 286, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5/2*1.3, + shift = util.by_pixel(-1, -3 + side_thruster_offset), + } + }), + + rocket_smoke_bottom1_animation = util.add_shift_offset(util.by_pixel(0-69, -112+28+205+32), + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.7 }, + --tint = { r = 1, g = 1, b = 0, a = 0.8 }, + width = 41, + height = 145, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5*1.3, + shift = util.by_pixel(-2, -2 + bottom_thruster_offset), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.7 }, + --tint = { r = 1, g = 1, b = 0, a = 0.8 }, + width = 80, + height = 286, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5/2*1.3, + shift = util.by_pixel(-1, -3 + bottom_thruster_offset), + } + }), + rocket_smoke_bottom2_animation = util.add_shift_offset(util.by_pixel(0+62, -112+28+207+32), + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.7 }, + --tint = { r = 0, g = 1, b = 1, a = 0.8 }, + width = 41, + height = 145, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5*1.3, + shift = util.by_pixel(-2, -2 + bottom_thruster_offset), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-12-rocket-smoke.png", + priority = "medium", + tint = { r = 0.8, g = 0.8, b = 1, a = 0.7 }, + --tint = { r = 0, g = 1, b = 1, a = 0.8 }, + width = 80, + height = 286, + frame_count = 24, + line_length = 8, + animation_speed = 0.5, + scale = 1.5/2*1.3, + shift = util.by_pixel(-1, -3 + bottom_thruster_offset), + } + }), + rocket_flame_animation = util.add_shift_offset(util.by_pixel(-1, 280-16), + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 87, + height = 128, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 1.13, + shift = util.by_pixel(-0.5, -2 + bottom_thruster_offset), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 172, + height = 256, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 1.13/2, + shift = util.by_pixel(-1, -2 + bottom_thruster_offset), + } + }), + rocket_flame_left_animation = util.add_shift_offset(util.by_pixel(-32-28+3, 280-68+1), + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 87, + height = 128, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 0.345*1.15, + shift = util.by_pixel(-0.5, -2 + bottom_thruster_offset), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 172, + height = 256, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 0.345/2*1.15, + shift = util.by_pixel(-1, -2 + bottom_thruster_offset), + } + }), + rocket_flame_left_rotation = 0.0611, + + rocket_flame_right_animation = util.add_shift_offset(util.by_pixel(32+16, 280-50), + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 87, + height = 128, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 0.368*1.15, + shift = util.by_pixel(-0.5, -2 + bottom_thruster_offset), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-10-jet-flame.png", + priority = "medium", + blend_mode = "additive", + width = 172, + height = 256, + frame_count = 8, + line_length = 8, + animation_speed = 0.5, + scale = 0.368/2*1.15, + shift = util.by_pixel(-1, -2 + bottom_thruster_offset), + } + }), + rocket_flame_right_rotation = 0.952, + + + } +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/condenser-turbine.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/condenser-turbine.lua new file mode 100644 index 0000000..5339ceb --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/condenser-turbine.lua @@ -0,0 +1,403 @@ +local data_util = require("data_util") +--[[ +fluid box connections don't need to line up just find the right entity. +furnace is the placed entity, short but wide, outputs at front +Outpts piped heat to the turbine +turbine ies long and thin, collects from side + +has a connection top and right +always goes on the bottom or left +move horizontal version down 1 pixel so animation shows + +if the turbine is aove the the animation won't work +make sure furnace has outputs at both lockations +]]-- +local selectable = false +local idle_horizontal = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/condenser-turbine/condenser-turbine-H.png", + frame_count = 1, + height = 123, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/condenser-turbine/hr-condenser-turbine-H.png", + frame_count = 1, + height = 245, + line_length = 1, + scale = 0.5, + shift = { + 0, + -0.0859375 + }, + width = 320 + }, + line_length = 1, + shift = { + 0, + -0.078125 + }, + width = 160 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/steam-turbine/steam-turbine-H-shadow.png", + frame_count = 1, + height = 74, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/steam-turbine/hr-steam-turbine-H-shadow.png", + frame_count = 1, + height = 150, + line_length = 1, + scale = 0.5, + shift = { + 0.890625, + 0.5625 + }, + width = 435 + }, + line_length = 1, + shift = { + 0.8984375, + 0.5625 + }, + width = 217 + } + } +} +local idle_vertical = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/condenser-turbine/condenser-turbine-V.png", + frame_count = 1, + height = 173, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/condenser-turbine/hr-condenser-turbine-V.png", + frame_count = 1, + height = 347, + line_length = 1, + scale = 0.5, + shift = { + 0.1484375, + 0.2109375 + }, + width = 217 + }, + line_length = 1, + shift = { + 0.15625, + 0.203125 + }, + width = 108 + }, + { + draw_as_shadow = true, + filename = "__base__/graphics/entity/steam-turbine/steam-turbine-V-shadow.png", + frame_count = 1, + height = 131, + hr_version = { + draw_as_shadow = true, + filename = "__base__/graphics/entity/steam-turbine/hr-steam-turbine-V-shadow.png", + frame_count = 1, + height = 260, + line_length = 1, + repeat_count = 1, + scale = 0.5, + shift = { + 1.234375, + 0.765625 + }, + width = 302 + }, + line_length = 1, + repeat_count = 1, + shift = { + 1.234375, + 0.765625 + }, + width = 151 + } + } +} +local blank_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, +} +data:extend({ + + { + type = "storage-tank", + name = data_util.mod_prefix .. "condenser-turbine-tank", + icon = "__space-exploration-graphics__/graphics/icons/condenser-turbine.png", + icon_size = 64, + flags = {"placeable-player", "player-creation", "not-deconstructable", "not-blueprintable"}, + max_health = 500, + order = "zz", + collision_box = {{-1.5, -0.25},{1.5, 0.25}}, + selection_box = {{-1.5, -0.25},{1.5, 0.25}}, + collision_mask = {"not-colliding-with-itself"}, + se_allow_in_space = true, + selectable_in_game = selectable, + fluid_box = + { + filter = data_util.mod_prefix .. "decompressing-steam", + base_area = 0.25, -- gets multiplied by 100 by engine + base_level = 0, -- pull fluid in + pipe_connections = + { + { position = {0, -1} }, -- connects to generator + { position = {1, -1} }, -- connects to furnace + { position = {-1, -1} }, -- connects to furnace + }, + }, + window_bounding_box = {{-0.0, 0.0}, {0.0, 1.0}}, + pictures = { + picture = blank_image, + window_background = blank_image, + fluid_background = blank_image, + flow_sprite = blank_image, + gas_flow = blank_image, + }, + flow_length_in_ticks = 360, + circuit_wire_max_distance = 0 + }, + { + type = "generator", + name = data_util.mod_prefix .. "condenser-turbine-generator", + icon = "__space-exploration-graphics__/graphics/icons/condenser-turbine.png", + icon_size = 64, + alert_icon_shift = { 0, 0.375 }, + burns_fluid = false, + fluid_usage_per_tick = 1, + selectable_in_game = selectable, + collision_box = { { -1.25, -1.6 }, { 1.25, 1.6 } }, -- short and wide thin + --collision_box = { { -1, -0.1 }, { 1, 0.1 } }, -- sits on y 2.25 + collision_mask = {"not-colliding-with-itself"}, + selection_box = { { -1.25, -1.6 }, { 1.25, 1.6 } }, + order = "zzz", + corpse = "big-remnants", + dying_explosion = "medium-explosion", + effectivity = 1, + energy_source = { type = "electric", usage_priority = "secondary-output" }, + fast_replaceable_group = "steam-engine", + flags = { "placeable-neutral", "player-creation", "placeable-off-grid" }, + fluid_box = { + base_area = 0.25, + base_level = -1, + filter = data_util.mod_prefix .. "decompressing-steam", + --filter = "steam", + height = 2, + minimum_temperature = 15, + pipe_connections = { + { + position = { 0, 1.65 }, + type = "input-output" + }, + { + position = { 0, -1.65 }, + type = "input-output" + }, + }, + production_type = "input-output" + }, + horizontal_animation = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/condenser-turbine/condenser-turbine-H.png", + frame_count = 8, + height = 123, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/condenser-turbine/hr-condenser-turbine-H.png", + frame_count = 8, + height = 245, + line_length = 4, + scale = 0.5, + shift = { + 0, + -0.0859375 - 1/32 + }, + width = 320 + }, + line_length = 4, + shift = { + 0, + -0.078125 - 1/32 + }, + width = 160 + }, + } + }, + max_health = 300, + maximum_temperature = 500, + min_perceived_performance = 0.25, + performance_to_sound_speedup = 0.5, + resistances = { + { + percent = 70, + type = "fire" + } + }, + smoke = { + { + east_position = { + 0.75, + -0.75 + }, + frequency = 0.3125, + name = "turbine-smoke", + north_position = { + 0, + -1 + }, + slow_down_factor = 1, + starting_frame_deviation = 60, + starting_vertical_speed = 0.08 + } + }, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + vertical_animation = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/condenser-turbine/condenser-turbine-V.png", + frame_count = 8, + height = 173, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/condenser-turbine/hr-condenser-turbine-V.png", + frame_count = 8, + height = 347, + line_length = 4, + scale = 0.5, + shift = { + 0.1484375, + 0.2109375 - 1/32 + }, + width = 217 + }, + line_length = 4, + shift = { + 0.15625, + 0.203125 - 1/32 + }, + width = 108 + } + } + }, + working_sound = { + match_speed_to_activity = true, + sound = { + filename = "__base__/sound/steam-engine-90bpm.ogg", + volume = 0.6 + } + } + }, + { + type = "furnace", + name = data_util.mod_prefix .. "condenser-turbine", + icon = "__space-exploration-graphics__/graphics/icons/condenser-turbine.png", + collision_box = { { -1.3, -2.15 }, { 1.3, 2.15 } }, + --selection_box = { { -1.5, -2.5 }, { 1.5, 2.5 } }, + selection_box = { { -1.3, -2.15 }, { 1.3, 2.15 } }, + fluid_boxes = + { + { + production_type = "input", + filter = "steam", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 1.5, + base_level = -1, + filter = "steam", + pipe_connections = { + { type="input-output", position = {0, -3} } + }, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 1.5, + base_level = 1, + filter = "water", + pipe_connections = { + { type="output", position = {0, 3} } + }, + secondary_draw_orders = { north = -1 } + }, + { + filter = data_util.mod_prefix .. "decompressing-steam", + --filter = "steam", + production_type = "output", + --pipe_picture = assembler3pipepictures(), + base_area = 1.5, + base_level = 1, + pipe_connections = { + { type="output", position = {1, 2.25} }, + { type="output", position = {-1, 2.25} }, + }, + secondary_draw_orders = { north = -1 } + }, + }, + minable = { + mining_time = 0.3, + result = data_util.mod_prefix .. "condenser-turbine", + }, + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + drawing_box = {{-1.5, -3}, {1.5, 4}}, + resistances = { + { type = "poison", percent = 100 }, + { type = "fire", percent = 80 }, + { type = "explosion", percent = 50 } + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + filename = "__base__/sound/steam-engine-90bpm.ogg", + volume = 0.6 + } + }, + always_draw_idle_animation = true, + source_inventory_size = 0, + result_inventory_size = 0, + animation = nil, + idle_animation = { + east = idle_horizontal, + west = idle_horizontal, + north = idle_vertical, + south = idle_vertical, + }, + crafting_categories = {"condenser-turbine"}, + crafting_speed = 1, + energy_source = + { + type = "void", + }, + energy_usage = "0.1W", + ingredient_count = 0, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {}, + working_visualisations = nil, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/core-miner.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/core-miner.lua new file mode 100644 index 0000000..e26f5f3 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/core-miner.lua @@ -0,0 +1,195 @@ +local data_util = require("data_util") +local shadow = +{ + filename = "__space-exploration-graphics-3__/graphics/entity/core-miner/hr/core-miner-shadow.png", + priority = "high", + width = 951, + height = 491, + frame_count = 1, + shift = {2 + 3/32, 1 + 22/32}, + draw_as_shadow = true, + scale=0.5, +} +local shadow_anim = table.deepcopy(shadow) +shadow_anim.repeat_count = 30 +local off_layer = { + layers = { + shadow, + { + filename = "__space-exploration-graphics-3__/graphics/entity/core-miner/hr/core-miner-off.png", + priority = "high", + width = 691, + height = 737, + frame_count = 1, + shift = {0, -8/32}, + scale=0.5, + }, + } +} +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "core-miner", + icon = "__space-exploration-graphics__/graphics/icons/core-miner.png", + selection_priority = 0, + icon_size = 64, + flags = {"placeable-neutral", "placeable-player", "player-creation"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "core-miner"}, + max_health = 5000, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + resistances = + { + { type = "fire", percent = 70 }, + { type = "meteor", percent = 90 }, + { type = "explosion", percent = 70 }, + { type = "impact", percent = 70 }, + }, + collision_box = {{-5.2, -5.2}, {5.2, 5.2}}, + collision_mask = { + "item-layer", + "object-layer", + "player-layer", + "water-tile", + space_collision_layer + }, + render_layer = "lower-object-above-shadow", + selection_box = {{-5.5, -5.5}, {5.5, 5.5}}, + fluid_boxes = + { + { + production_type = "output", + base_area = 1, + base_level = 1, + pipe_connections = {{ type="output", position = {0, -5.85} }}, + secondary_draw_orders = { north = -1 } + }, + }, + animation = off_layer, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + energy_usage = "50MW", + energy_source = {type = "void"}, + crafting_speed = 1, + crafting_categories = {"dummy"}, + }, + { + type = "mining-drill", + name = data_util.mod_prefix .. "core-miner-drill", + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "core-miner"}, + selection_priority = 10, + icon = "__space-exploration-graphics__/graphics/icons/core-miner.png", + icon_size = 64, + order = "zzz", + flags = {"placeable-neutral", "placeable-player", "player-creation", "not-blueprintable", "not-deconstructable", "placeable-off-grid"}, + placeable_by = {item = data_util.mod_prefix .. "core-miner", count=1}, + max_health = 5000, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + resistances = + { + { type = "fire", percent = 70 }, + { type = "meteor", percent = 90 }, + { type = "explosion", percent = 70 }, + { type = "impact", percent = 70 }, + }, + collision_box = {{-5.2, -5.2}, {5.2, 5.2}}, + selection_box = {{-5.5, -5.5}, {5.5, 5.5}}, + resource_categories = { data_util.mod_prefix .. "core-mining" }, + resource_searching_radius = 2, + mining_speed = 150, + always_draw_idle_animation = false, + energy_usage = "50MW", + vector_to_place_result = { 0, -5.85 }, + animations = { + layers = { + shadow_anim, + { + priority = "high", + width = 691, + height = 737, + frame_count = 30, + animation_speed = 1, + shift = {0, -8/32}, + scale=0.5, + stripes = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/core-miner/hr/core-miner-1.png", + width_in_frames = 2, + height_in_frames = 2, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/core-miner/hr/core-miner-2.png", + width_in_frames = 2, + height_in_frames = 2, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/core-miner/hr/core-miner-3.png", + width_in_frames = 2, + height_in_frames = 2, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/core-miner/hr/core-miner-4.png", + width_in_frames = 2, + height_in_frames = 2, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/core-miner/hr/core-miner-5.png", + width_in_frames = 2, + height_in_frames = 2, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/core-miner/hr/core-miner-6.png", + width_in_frames = 2, + height_in_frames = 2, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/core-miner/hr/core-miner-7.png", + width_in_frames = 2, + height_in_frames = 2, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/core-miner/hr/core-miner-8.png", + width_in_frames = 2, + height_in_frames = 1, + }, + }, + }, + } + }, + working_visualisations = + { + shadow, + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 1, size = 32, shift = {0.0, 0.0}, color = {r = 1.0, g = 0.6, b = 0.1}} + }, + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = + { + { + filename = "__base__/sound/electric-mining-drill.ogg", + volume = 1 + }, + }, + apparent_volume = 2 + }, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 200, + }, + ingredient_count = 0, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {} + } +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/decontamination-lifesupport.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/decontamination-lifesupport.lua new file mode 100644 index 0000000..f54e0e9 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/decontamination-lifesupport.lua @@ -0,0 +1,399 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-decontamination-facility", + icon = "__space-exploration-graphics__/graphics/icons/decontamination-facility.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-decontamination-facility"}, + max_health = 700, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-2.8, -2.8}, {2.8, 2.8}}, + selection_box = {{-3, -3}, {3, 3}}, + drawing_box = {{-3, -3.5}, {3, 3}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-1.5, -3.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {1.5, -3.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-3.5, -1.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {3.5, -1.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {-1.5, 3.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {1.5, 3.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {3.5, 1.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {-3.5, 1.5} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/decontamination-facility/sr/decontamination-facility.png", + priority = "high", + width = 3072/8/2, + height = 1792/4/2, + frame_count = 32, + line_length = 8, + shift = util.by_pixel(0, -16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/decontamination-facility/hr/decontamination-facility.png", + priority = "high", + width = 3072/8, + height = 1792/4, + frame_count = 32, + line_length = 8, + shift = util.by_pixel(0, -16), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/decontamination-facility/sr/decontamination-facility-shadow.png", + priority = "high", + width = 426/2, + height = 298/2, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(26, 24), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/decontamination-facility/hr/decontamination-facility-shadow.png", + priority = "high", + width = 426, + height = 298, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(26, 24), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-decontamination"}, + crafting_speed = 2, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "2000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = {r = 1, g = 0.9, b = 0.5}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "lifesupport-facility", + icon = "__space-exploration-graphics__/graphics/icons/lifesupport-facility.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "lifesupport-facility"}, + max_health = 700, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-2.8, -2.8}, {2.8, 2.8}}, + se_allow_in_space = true, + selection_box = {{-3, -3}, {3, 3}}, + drawing_box = {{-3, -3.5}, {3, 3}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-1.5, -3.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {1.5, -3.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-3.5, -1.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {3.5, -1.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {-1.5, 3.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {1.5, 3.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {3.5, 1.5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {-3.5, 1.5} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + --"ground-tile", -- allow on ground + "item-layer", + "object-layer", + "player-layer", + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/lifesupport-facility/sr/lifesupport-facility.png", + priority = "high", + width = 3072/8/2, + height = 1792/4/2, + frame_count = 32, + line_length = 8, + shift = util.by_pixel(0, -16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/lifesupport-facility/hr/lifesupport-facility.png", + priority = "high", + width = 3072/8, + height = 1792/4, + frame_count = 32, + line_length = 8, + shift = util.by_pixel(0, -16), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/lifesupport-facility/sr/lifesupport-facility-shadow.png", + priority = "high", + width = 426/2, + height = 298/2, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(26, 24), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/lifesupport-facility/hr/lifesupport-facility-shadow.png", + priority = "high", + width = 426, + height = 298, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(26, 24), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"lifesupport"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = {r = 100/255, g = 48/255, b = 1}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/dimensional-anchor.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/dimensional-anchor.lua new file mode 100644 index 0000000..a116134 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/dimensional-anchor.lua @@ -0,0 +1,197 @@ +local data_util = require("data_util") + +data:extend({ + + { + type = "electric-energy-interface", + name = data_util.mod_prefix .. "dimensional-anchor", + icon = "__space-exploration-graphics__/graphics/icons/dimensional-anchor.png", + icon_size = 64, + minable = {hardness = 0.2, mining_time = 1, result = data_util.mod_prefix .. "dimensional-anchor"}, + order = "z-d-a", + allow_copy_paste = true, + picture = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/dimensional-anchor/sr/dimensional-anchor.png", + priority = "high", + width = 576/2, + height = 672/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -24), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/dimensional-anchor/hr/dimensional-anchor.png", + priority = "high", + width = 576, + height = 672, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -24), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/dimensional-anchor/sr/dimensional-anchor-shadow.png", + priority = "high", + width = 354, + height = 238, + frame_count = 1, + line_length = 1, + repeat_count = 1, + shift = util.by_pixel(32, 28), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/dimensional-anchor/hr/dimensional-anchor-shadow.png", + priority = "high", + width = 709, + height = 477, + frame_count = 1, + line_length = 1, + repeat_count = 1, + shift = util.by_pixel(32, 28), + scale = 0.5, + } + }, + }, + }, + collision_box = {{-4.4, -4.4},{4.4, 4.4}}, + selection_box = {{-4.4, -4.4},{4.4, 4.4}}, + drawing_box = {{-4.4, -5.4},{4.4, 4.4}}, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + selectable = false, + continuous_animation = true, + corpse = "medium-remnants", + energy_source = { + buffer_capacity = "1TJ", + input_flow_limit = "60GW", -- total when all active (values over 60GW won't work) + output_flow_limit = "0kW", + type = "electric", + usage_priority = "primary-input" + }, + energy_production = "0kW", + energy_usage = "0GW", -- platform + 1x per lock + 1x for final energy spike final activation. + --energy_usage = "60GW", -- platform + 1x per lock + 1x for final energy spike final activation. + flags = { + "placeable-player", + "player-creation", + "hidden", + "not-rotatable" + }, + max_health = 5000, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + working_sound = { + apparent_volume = 1.5, + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + { + filename = "__base__/sound/nuclear-reactor-1.ogg", + volume = 0.6 + }, + { + filename = "__base__/sound/nuclear-reactor-2.ogg", + volume = 0.6 + } + } + }, + --light = {intensity = 1, size = 8, shift = {0.0, 0.0}, color = {r = 0.6, g = 0.9, b = 1}} + }, + { + type = "projectile", + name = data_util.mod_prefix .. "dimensional-anchor-fx", + direction_only = false, + flags = { "not-on-map", "placeable-off-grid" }, + acceleration = 0, + collision_mask = {"not-colliding-with-itself"}, + light = {intensity = 1, size = 8, shift = {0.0, 0.0}, color = {r = 0.6, g = 0.9, b = 1}}, + working_sound = { + apparent_volume = 1.5, + fade_in_ticks = 10, + fade_out_ticks = 30, + max_sounds_per_type = 3, + sound = { + { + filename = "__base__/sound/nuclear-reactor-1.ogg", + volume = 0.6 + }, + { + filename = "__base__/sound/nuclear-reactor-2.ogg", + volume = 0.6 + } + } + }, + animation = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/dimensional-anchor/sr/dimensional-anchor-light.png", + priority = "high", + width = 576/2, + height = 640/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -32), + animation_speed = 1, + apply_runtime_tint = true, + blend_mode = "additive", --"additive-soft" + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/dimensional-anchor/hr/dimensional-anchor-light.png", + priority = "high", + width = 576, + height = 640, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -32), + animation_speed = 1, + scale = 0.5, + apply_runtime_tint = true, + blend_mode = "additive", --"additive-soft" + } + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/dimensional-anchor/sr/dimensional-anchor-skybeam.png", + priority = "high", + width = 38, + height = 298, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -19 * 32 -2), + animation_speed = 1, + scale = 4, + apply_runtime_tint = true, + blend_mode = "additive-soft", + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/dimensional-anchor/hr/dimensional-anchor-skybeam.png", + priority = "high", + width = 77, + height = 597, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -19 * 32 -2), + animation_speed = 1, + scale = 2, + apply_runtime_tint = true, + blend_mode = "additive-soft", + } + }, + } + }, + }, + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/entity.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/entity.lua new file mode 100644 index 0000000..2734f70 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/entity.lua @@ -0,0 +1,429 @@ +local data_util = require("data_util") + +-- Collision entities +local base_collision_entity = { + type = "simple-entity", + icon = "__base__/graphics/icons/iron-chest.png", + icon_size = 64, + flags = {"placeable-neutral", "placeable-off-grid"}, + subgroup = "grass", + order = "z-z", + selection_box = {{-0.0, -0.0}, {0.0, 0.0}}, + selectable_in_game = false, + render_layer = "resource", + pictures = {{ + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1 + }}, +} + +local collision_player = table.deepcopy(base_collision_entity) +collision_player.name = data_util.mod_prefix .. "collision-player" +collision_player.collision_mask = { "player-layer", "train-layer"} +collision_player.collision_box = { { -0.25, -0.25 }, { 0.25, 0.25 } } + +local collision_player_not_space = table.deepcopy(base_collision_entity) +collision_player_not_space.name = data_util.mod_prefix .. "collision-player-not-space" +collision_player_not_space.collision_mask = { "player-layer", "train-layer", space_collision_layer} +collision_player_not_space.collision_box = { { -0.25, -0.25 }, { 0.25, 0.25 } } + +local collision_rocket_destination_surface = table.deepcopy(base_collision_entity) +collision_rocket_destination_surface.name = data_util.mod_prefix .. "collision-rocket-destination-surface" +collision_rocket_destination_surface.collision_mask = { "player-layer", "train-layer", space_collision_layer} +collision_rocket_destination_surface.collision_box = { { -0.25, -0.25 }, { 0.25, 0.25 } } + +local collision_rocket_destination_orbital = table.deepcopy(base_collision_entity) +collision_rocket_destination_orbital.name = data_util.mod_prefix .. "collision-rocket-destination-orbital" +collision_rocket_destination_orbital.collision_mask = { "player-layer", "train-layer"} +collision_rocket_destination_orbital.collision_box = { { -0.25, -0.25 }, { 0.25, 0.25 } } + +data:extend({ + collision_player, + collision_player_not_space, + collision_rocket_destination_surface, + collision_rocket_destination_orbital +}) + +-- settings entity +data:extend({ + { -- this is a tempalte + type = "programmable-speaker", + name = data_util.mod_prefix .. "struct-settings-string", + icon = "__space-exploration-graphics__/graphics/icons/settings.png", + icon_size = 64, + order="zzz", + flags = {"placeable-neutral", "player-creation"}, + collision_box = {{-0.3, -0.3}, {0.3, 0.3}}, + selection_box = {{-0.0, -0.0}, {0.0, 0.0}}, + drawing_box = {{-0.0, -0.0}, {0.0, 0.0}}, + selectable_in_game = false, + energy_source = { + --type = "electric", + type = "void", + usage_priority = "secondary-input", + render_no_power_icon = false + }, + energy_usage_per_tick = "1W", + sprite = + { + layers = + { + { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, + } + } + }, + maximum_polyphony = 0, + instruments = { }, + }, +}) +--[[ +energy_source = { + buffer_capacity = "5MJ", + input_flow_limit = "300kW", + output_flow_limit = "300kW", + type = "electric", + usage_priority = "tertiary" +},]]-- + +data.raw.accumulator.accumulator.fast_replaceable_group = "accumulator" +data.raw.accumulator.accumulator.next_upgrade = data_util.mod_prefix .. "space-accumulator" +data.raw.accumulator.accumulator.collision_box = {{-0.8,-0.8},{0.8,0.8}} +data.raw.accumulator.accumulator.energy_source.buffer_capacity = "5MJ" +data.raw.accumulator.accumulator.energy_source.input_flow_limit = "250kW" +data.raw.accumulator.accumulator.energy_source.output_flow_limit = "500kW" +local accumulator = table.deepcopy(data.raw.accumulator.accumulator) +accumulator.name = data_util.mod_prefix .. "space-accumulator" +--accumulator.collision_mask = { "floor-layer", "object-layer", "water-tile", "ground-tile", "player-layer"} +data_util.replace_filenames_recursive(accumulator, "__base__/graphics/entity/accumulator/accumulator.png", "__space-exploration-graphics-3__/graphics/entity/accumulator/accumulator.png") +data_util.replace_filenames_recursive(accumulator, "__base__/graphics/entity/accumulator/hr-accumulator.png", "__space-exploration-graphics-3__/graphics/entity/accumulator/hr-accumulator.png") +accumulator.icon = "__space-exploration-graphics__/graphics/icons/accumulator.png" +accumulator.icon_size = 64 +accumulator.icon_mipmaps = 1 +accumulator.energy_source = { + --buffer_capacity = "25MJ", + --input_flow_limit = "2500kW", + --output_flow_limit = "2500kW", + buffer_capacity = "50MJ", + input_flow_limit = "500kW", + output_flow_limit = "5MW", + type = "electric", + usage_priority = "tertiary" +} +accumulator.minable.result = data_util.mod_prefix .. "space-accumulator" +--accumulator.fast_replaceable_group = "space-accumulator" +accumulator.next_upgrade = data_util.mod_prefix .. "space-accumulator-2" + + +local accumulator2 = table.deepcopy(accumulator) +accumulator2.name = data_util.mod_prefix .. "space-accumulator-2" +data_util.replace_filenames_recursive(accumulator2, "__space-exploration-graphics-3__/graphics/entity/accumulator/accumulator.png", "__space-exploration-graphics-3__/graphics/entity/accumulator/accumulator-2.png") +data_util.replace_filenames_recursive(accumulator2, "__space-exploration-graphics-3__/graphics/entity/accumulator/hr-accumulator.png", "__space-exploration-graphics-3__/graphics/entity/accumulator/hr-accumulator-2.png") +accumulator2.icon = "__space-exploration-graphics__/graphics/icons/accumulator-2.png" +accumulator2.icon_size = 64 +accumulator2.icon_mipmaps = 1 +accumulator2.energy_source = { + --buffer_capacity = "100MJ", + --input_flow_limit = "10000kW", + --output_flow_limit = "10000kW", + buffer_capacity = "250MJ", + input_flow_limit = "2500kW", + output_flow_limit = "25MW", + type = "electric", + usage_priority = "tertiary" +} +accumulator2.minable.result = data_util.mod_prefix .. "space-accumulator-2" +accumulator2.next_upgrade = nil + +data:extend{ + accumulator, + accumulator2, + { + type = "solar-panel", + name = data_util.mod_prefix .. "space-solar-panel", + collision_box = { + { -1.95, -1.95 }, + { 1.95, 1.95 } + }, + collision_mask = { + "floor-layer", + "object-layer", + "water-tile", + --"ground-tile" + }, + selection_box = { + { -2, -2 }, + { 2, 2 } + }, + production = "400kW", -- 106.6 would be equivalent to a solar panel for its size. + corpse = "big-remnants", + energy_source = { + type = "electric", + usage_priority = "solar" + }, + flags = { + "placeable-neutral", + "player-creation" + }, + fast_replaceable_group = "space-solar-panel", + icon = "__space-exploration-graphics__/graphics/icons/solar-panel.png", + icon_size = 64, + max_health = 400, + minable = { + mining_time = 0.1, + result = data_util.mod_prefix .. "space-solar-panel" + }, + next_upgrade = data_util.mod_prefix .. "space-solar-panel-2", + picture = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel/solar-panel.png", + width = 260/2, + height = 272/2, + priority = "high", + shift = { + 0, + -1/32 + }, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel/hr-solar-panel.png", + width = 260, + height = 272, + priority = "high", + scale = 0.5, + shift = { + 0, + -1/32 + }, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel/solar-panel-shadow.png", + width = 92/2, + height = 260/2, + priority = "high", + shift = { + 1.5, + 1/32 + }, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel/hr-solar-panel-shadow.png", + width = 92, + height = 260, + priority = "high", + scale = 0.5, + shift = { + 1.5, + 1/32 + }, + }, + } + } + }, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + } + }, + { + type = "solar-panel", + name = data_util.mod_prefix .. "space-solar-panel-2", + collision_box = { + { -1.95, -1.95 }, + { 1.95, 1.95 } + }, + collision_mask = { + "floor-layer", + "object-layer", + "water-tile", + --"ground-tile" + }, + selection_box = { + { -2, -2 }, + { 2, 2 } + }, + production = "800kW", -- 106.6 would be equivalent to a solar panel for its size. + corpse = "big-remnants", + energy_source = { + type = "electric", + usage_priority = "solar" + }, + flags = { + "placeable-neutral", + "player-creation" + }, + fast_replaceable_group = "space-solar-panel", + icon = "__space-exploration-graphics__/graphics/icons/solar-panel-2.png", + icon_size = 64, + max_health = 500, + minable = { + mining_time = 0.1, + result = data_util.mod_prefix .. "space-solar-panel-2" + }, + next_upgrade = data_util.mod_prefix .. "space-solar-panel-3", + picture = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel-2/solar-panel.png", + width = 260/2, + height = 272/2, + priority = "high", + shift = { + 0, + -1/32 + }, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel-2/hr-solar-panel.png", + width = 260, + height = 272, + priority = "high", + scale = 0.5, + shift = { + 0, + -1/32 + }, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel-2/solar-panel-shadow.png", + width = 92/2, + height = 260/2, + priority = "high", + shift = { + 1.5, + 1/32 + }, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel-2/hr-solar-panel-shadow.png", + width = 92, + height = 260, + priority = "high", + scale = 0.5, + shift = { + 1.5, + 1/32 + }, + }, + } + } + }, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + } + }, + { + type = "solar-panel", + name = data_util.mod_prefix .. "space-solar-panel-3", + collision_box = { + { -1.95, -1.95 }, + { 1.95, 1.95 } + }, + collision_mask = { + "floor-layer", + "object-layer", + "water-tile", + --"ground-tile" + }, + selection_box = { + { -2, -2 }, + { 2, 2 } + }, + production = "1600kW", -- 106.6 would be equivalent to a solar panel for its size. + corpse = "big-remnants", + energy_source = { + type = "electric", + usage_priority = "solar" + }, + flags = { + "placeable-neutral", + "player-creation" + }, + fast_replaceable_group = "space-solar-panel", + icon = "__space-exploration-graphics__/graphics/icons/solar-panel-3.png", + icon_size = 64, + max_health = 500, + minable = { + mining_time = 0.1, + result = data_util.mod_prefix .. "space-solar-panel-3" + }, + picture = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel-3/solar-panel.png", + width = 260/2, + height = 272/2, + priority = "high", + shift = { + 0, + -1/32 + }, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel-3/hr-solar-panel.png", + width = 260, + height = 272, + priority = "high", + scale = 0.5, + shift = { + 0, + -1/32 + }, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel-3/solar-panel-shadow.png", + width = 92/2, + height = 260/2, + priority = "high", + shift = { + 1.5, + 1/32 + }, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/solar-panel-3/hr-solar-panel-shadow.png", + width = 92, + height = 260, + priority = "high", + scale = 0.5, + shift = { + 1.5, + 1/32 + }, + }, + } + } + }, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + } + } +} + +local tree_fire_starter = table.deepcopy(data.raw.fire["fire-flame"]) +tree_fire_starter.name = data_util.mod_prefix .. "tree-fire-starter" +tree_fire_starter.damage_multiplier_decrease_per_tick = 0 +tree_fire_starter.initial_lifetime = 600 +tree_fire_starter.spread_delay = 1 +tree_fire_starter.spread_delay_deviation = 1 +tree_fire_starter.spawn_entity = data_util.mod_prefix .. "fire-flame-on-tree-no-pollution" +tree_fire_starter.emissions_per_second = 0 +data:extend({tree_fire_starter}) + +local treefire = table.deepcopy(data.raw.fire["fire-flame-on-tree"]) +treefire.name = data_util.mod_prefix .. "fire-flame-on-tree-no-pollution" +treefire.spawn_entity = treefire.name +treefire.emissions_per_second = 0 +data:extend({treefire}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/explosion.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/explosion.lua new file mode 100644 index 0000000..c9aeeea --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/explosion.lua @@ -0,0 +1,216 @@ +local data_util = require("data_util") + +-- generic triggers +data:extend({ + { -- dummy explosion entity for alerts + type = "explosion", + name = data_util.mod_prefix .. "dummy-explosion", + animations = { + { + direction_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + frame_count = 1, + height = 1, + line_length = 1, + width = 1 + } + }, + flags = { + "not-on-map" + }, + }, + { -- some debris has been added to the surface, in space it should move + type = "explosion", + name = data_util.mod_prefix .. "trigger-movable-debris", + animations = { + { + direction_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + frame_count = 1, + height = 1, + line_length = 1, + width = 1 + } + }, + flags = { + "not-on-map" + }, + }, +}) + + +--[[ +vanila explosions: +"big-artillery-explosion" -- huge smoke plume but very little debris +"big-explosion" -- biggest overall, but smaller plume +"massive-explosion" -- more debris +"medium-explosion" -- medium and wider +"ground-explosion" -- medium but higher, and with stone particles + +SE explosions: +Huge +large +Medium +Small +]]-- + +local big_explsion_hit = table.deepcopy(data.raw.explosion["explosion-hit"]) +big_explsion_hit.name = "big-explosion-hit" +big_explsion_hit.animations[1].scale = 1.5 +data:extend({big_explsion_hit}) + +local function make_explosion(magnitude, name, animation, sound) -- magnitude is 1,2,3,4 + data:extend({ + { + type = "explosion", + name = data_util.mod_prefix..name, + animations = {animation}, + created_effect = { + type = "direct", + action_delivery = { + type = "instant", + target_effects = { + { + type = "create-particle", + particle_name = "explosion-remnants-particle", + initial_height = 0.5, + initial_vertical_speed = 0.06 + 0.01 * magnitude, + initial_vertical_speed_deviation = 0.06 + 0.01 * magnitude, + offset_deviation = { { -0.2, -0.2 }, { 0.2, 0.2 } }, + repeat_count = 10 + 5 * magnitude, + speed_from_center = 0.06 + 0.01 * magnitude, + speed_from_center_deviation = 0.06 + 0.01 * magnitude, + }, + { + type = "create-particle", + particle_name = "stone-particle", + initial_height = 0.5, + initial_vertical_speed = 0.1 + 0.05 * magnitude, + initial_vertical_speed_deviation = 0.1 + 0.05 * magnitude, + offset_deviation = { { -0.2, -0.2 }, { 0.2, 0.2 } }, + repeat_count = 40 + 20 * magnitude, + speed_from_center = 0.06 + 0.02 * magnitude, + speed_from_center_deviation = 0.06 + 0.02 * magnitude, + } + }, + }, + }, + flags = { "not-on-map" }, + light = { color = { r = 1, g = 0.9, b = 0.8 }, intensity = 0.8 + 0.1 * magnitude, size = 30 + 5 * magnitude }, + sound = { + aggregation = { max_count = 1, remove = true }, + variations = sound + }, + }, + + }) +end + + +make_explosion(1, "small-explosion", { + filename = "__base__/graphics/entity/medium-explosion/medium-explosion.png", + width = 112, + height = 94, + line_length = 6, + frame_count = 54, + animation_speed = 0.5, + priority = "high", + shift = { -0.56, -0.96 }, + scale = 0.75, +},{ + { filename = "__base__/sound/small-explosion-1.ogg", volume = 0.7 }, + { filename = "__base__/sound/small-explosion-2.ogg", volume = 0.7 } +}) +make_explosion(2, "medium-explosion", { + filename = "__base__/graphics/entity/medium-explosion/medium-explosion.png", + width = 112, + height = 94, + line_length = 6, + frame_count = 54, + animation_speed = 0.5, + priority = "high", + shift = { -0.56, -0.96 }, + scale = 1, +}, { + { filename = "__base__/sound/fight/large-explosion-1.ogg", volume = 0.7 }, + { filename = "__base__/sound/fight/large-explosion-2.ogg", volume = 0.7 } +}) +make_explosion(3, "large-explosion", { + animation_speed = 0.5, + filename = "__base__/graphics/entity/big-explosion/big-explosion.png", + flags = { "compressed" }, + frame_count = 47, + height = 245, + line_length = 6, + shift = { 0.1875, -0.75 }, + width = 197, + scale = 1, +},{ + { filename = "__base__/sound/fight/large-explosion-1.ogg", volume = 0.8 }, + { filename = "__base__/sound/fight/large-explosion-2.ogg", volume = 0.8 } +}) +make_explosion(4, "huge-explosion", { + animation_speed = 0.5, + filename = "__base__/graphics/entity/bigass-explosion/hr-bigass-explosion-36f.png", + flags = { "compressed" }, + frame_count = 36, + width = 324, + height = 416, + shift = { 0, -1.5 }, + stripes = { + { filename = "__base__/graphics/entity/bigass-explosion/hr-bigass-explosion-36f-1.png", height_in_frames = 3, width_in_frames = 6 }, + { filename = "__base__/graphics/entity/bigass-explosion/hr-bigass-explosion-36f-2.png", height_in_frames = 3, width_in_frames = 6 } + }, + scale = 1, +}, { + { filename = "__base__/sound/explosion1.ogg", volume = 1 }, +}) + + +data:extend({ + { + type = "explosion", + name = data_util.mod_prefix.."meteor-explosion", + animations = {{ + animation_speed = 0.5, + filename = "__base__/graphics/entity/bigass-explosion/hr-bigass-explosion-36f.png", + flags = { "compressed" }, + frame_count = 36, + width = 324, + height = 416, + shift = { 0, -1.5 }, + stripes = { + { filename = "__base__/graphics/entity/bigass-explosion/hr-bigass-explosion-36f-1.png", height_in_frames = 3, width_in_frames = 6 }, + { filename = "__base__/graphics/entity/bigass-explosion/hr-bigass-explosion-36f-2.png", height_in_frames = 3, width_in_frames = 6 } + }, + scale = 1, + }}, + created_effect = { + type = "direct", + action_delivery = { + type = "instant", + target_effects = { + -- TODO add rock fragments equivalent to "explosion-remnants-particle" from small rock graphics + { + type = "create-particle", + particle_name = "stone-particle", + initial_height = 0.5, + initial_vertical_speed = 0.3, + initial_vertical_speed_deviation = 0.3, + offset_deviation = { { -0.2, -0.2 }, { 0.2, 0.2 } }, + repeat_count = 120, + speed_from_center = 0.2, + speed_from_center_deviation = 0.2, + } + }, + }, + }, + flags = { "not-on-map" }, + light = { color = { r = 1, g = 0.9, b = 0.8 }, intensity = 1, size = 50 }, + sound = { + aggregation = { max_count = 1, remove = true }, + variations = { filename = "__base__/sound/explosion1.ogg", volume = 1 } + }, + }, + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/fluid-burner-generator.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/fluid-burner-generator.lua new file mode 100644 index 0000000..0a0ce07 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/fluid-burner-generator.lua @@ -0,0 +1,149 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "generator", + name = data_util.mod_prefix .. "fluid-burner-generator", + icon = "__space-exploration-graphics__/graphics/icons/fluid-burner-generator.png", + icon_size = 64, + flags = {"placeable-neutral","player-creation"}, + minable = {mining_time = 0.3, result = data_util.mod_prefix .. "fluid-burner-generator"}, + max_health = 300, + corpse = "steam-turbine-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + effectivity = 1, + fluid_usage_per_tick = 1, + burns_fluid = true, + resistances = { { type = "fire", percent = 70 } }, + fast_replaceable_group = "steam-engine", + collision_box = {{-1.35, -2.35}, {1.35, 2.35}}, + selection_box = {{-1.5, -2.5}, {1.5, 2.5}}, + scale_fluid_usage = true, + max_power_output = "2MW", + maximum_temperature = 1000, + fluid_box = + { + base_area = 1, + height = 2, + base_level = -1, + pipe_covers = pipecoverspictures(), + pipe_connections = + { + { type = "input-output", position = {0, 3} }, + { type = "input-output", position = {0, -3} } + }, + production_type = "input-output", + }, + effectivity = 0.75, + energy_source = { type = "electric", usage_priority = "secondary-output" }, + horizontal_animation = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/fluid-burner-generator/fluid-burner-generator-h.png", + width = 320/2, + height = 244/2, + frame_count = 8, + line_length = 4, + shift = util.by_pixel(0, -2.75), + animation_speed = 0.5, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/fluid-burner-generator/hr-fluid-burner-generator-h.png", + width = 320, + height = 244, + frame_count = 8, + line_length = 4, + shift = util.by_pixel(0, -2.75), + animation_speed = 0.5, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/fluid-burner-generator/fluid-burner-generator-h-shadow.png", + width = 434/2, + height = 150/2, + frame_count = 1, + repeat_count = 8, + line_length = 1, + draw_as_shadow = true, + shift = util.by_pixel(28.5, 18), + animation_speed = 0.5, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/fluid-burner-generator/hr-fluid-burner-generator-h-shadow.png", + width = 434, + height = 150, + frame_count = 1, + repeat_count = 8, + line_length = 1, + draw_as_shadow = true, + shift = util.by_pixel(28.5, 18), + animation_speed = 0.5, + scale = 0.5 + } + } + } + }, + vertical_animation = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/fluid-burner-generator/fluid-burner-generator-v.png", + width = 864/4/2, + height = 692/2/2, + frame_count = 8, + line_length = 4, + shift = util.by_pixel(5, 6.5), + animation_speed = 0.5, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/fluid-burner-generator/hr-fluid-burner-generator-v.png", + width = 864/4, + height = 692/2, + frame_count = 8, + line_length = 4, + shift = util.by_pixel(4.75, 6.75), + animation_speed = 0.5, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/fluid-burner-generator/fluid-burner-generator-v-shadow.png", + width = 256/2, + height = 260/2, + frame_count = 1, + repeat_count = 8, + line_length = 1, + draw_as_shadow = true, + shift = util.by_pixel(9.5, 14.5), + animation_speed = 0.5, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/fluid-burner-generator/hr-fluid-burner-generator-v-shadow.png", + width = 256, + height = 260, + frame_count = 1, + repeat_count = 8, + line_length = 1, + draw_as_shadow = true, + shift = util.by_pixel(9.5, 14.5), + animation_speed = 0.5, + scale = 0.5 + } + } + } + }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = + { + filename = "__base__/sound/steam-engine-90bpm.ogg", + volume = 0.6 + }, + match_speed_to_activity = true + }, + min_perceived_performance = 0.25, + performance_to_sound_speedup = 0.5 + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/fuel-refinery.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/fuel-refinery.lua new file mode 100644 index 0000000..9fcec49 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/fuel-refinery.lua @@ -0,0 +1,145 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "fuel-refinery", + icon = "__space-exploration-graphics__/graphics/icons/fuel-refinery.png", + icon_size = 64, + flags = {"placeable-neutral","player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "fuel-refinery"}, + max_health = 350, + dying_explosion = "medium-explosion", + corpse = "oil-refinery-remnants", + collision_box = {{-2.4, -2.4}, {2.4, 2.4}}, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + se_allow_in_space = true, + drawing_box = {{-2.5, -2.8}, {2.5, 2.5}}, + module_specification = + { + module_slots = 3 + }, + scale_entity_info_icon = true, + allowed_effects = {"consumption", "speed", "productivity", "pollution"}, + crafting_categories = {"fuel-refining"}, + crafting_speed = 1, + has_backer_name = false, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 6 + }, + energy_usage = "1000kW", + animation = make_4way_animation_from_spritesheet({ layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/fuel-refinery/fuel-refinery.png", + width = 386/2, + height = 430/2, + frame_count = 1, + shift = util.by_pixel(0, -7.5), + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/fuel-refinery/hr-fuel-refinery.png", + width = 386, + height = 430, + frame_count = 1, + shift = util.by_pixel(0, -7.5), + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/fuel-refinery/fuel-refinery-shadow.png", + width = 337, + height = 213, + frame_count = 1, + shift = util.by_pixel(82.5, 26.5), + draw_as_shadow = true, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/fuel-refinery/hr-fuel-refinery-shadow.png", + width = 674, + height = 426, + frame_count = 1, + shift = util.by_pixel(82.5, 26.5), + draw_as_shadow = true, + scale = 0.5 + } + } + }}), + working_visualisations = + { + { + north_position = util.by_pixel(34, -65), + east_position = util.by_pixel(-52, -61), + south_position = util.by_pixel(-59, -82), + west_position = util.by_pixel(57, -58), + animation = + { + filename = "__base__/graphics/entity/oil-refinery/oil-refinery-fire.png", + line_length = 10, + width = 20, + height = 40, + frame_count = 60, + animation_speed = 0.75, + shift = util.by_pixel(0, -14), + hr_version = + { + filename = "__base__/graphics/entity/oil-refinery/hr-oil-refinery-fire.png", + line_length = 10, + width = 40, + height = 81, + frame_count = 60, + animation_speed = 0.75, + scale = 0.5, + shift = util.by_pixel(0, -14.25) + } + }, + light = {intensity = 0.4, size = 6, color = {r = 1.0, g = 1.0, b = 1.0}} + } + }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { filename = "__base__/sound/oil-refinery.ogg" }, + idle_sound = { filename = "__base__/sound/idle1.ogg", volume = 0.6 }, + apparent_volume = 2.5 + }, + fluid_boxes = + { + { + production_type = "input", + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-1, 3} }} + }, + { + production_type = "input", + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {1, 3} }} + }, + { + production_type = "output", + pipe_covers = pipecoverspictures(), + base_level = 1, + pipe_connections = {{ position = {-2, -3} }} + }, + { + production_type = "output", + pipe_covers = pipecoverspictures(), + base_level = 1, + pipe_connections = {{ position = {0, -3} }} + }, + { + production_type = "output", + pipe_covers = pipecoverspictures(), + base_level = 1, + pipe_connections = {{ position = {2, -3} }} + } + } + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/gate.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/gate.lua new file mode 100644 index 0000000..f38303b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/gate.lua @@ -0,0 +1,1690 @@ +local data_util = require("data_util") + +local fragment_render_layer = "lower-object-above-shadow" +local underlay_render_layer = "transport-belt-integration" +local track_glyph_render_layer = "resource" +local lock_rail_render_layer = "building-smoke" +local lock_shunt_render_layer = "decorative" +local portal_main_shadow_render_layer = "decorative" +local portal_main_render_layer = "lower-object" +local portal_addons_render_layer = "transport-belt-circuit-connector" +local locked_glyph_render_layer = "transport-belt-circuit-connector" +local portal_buttons_render_layer = "lower-object-above-shadow" +local placeable_collision = {"floor-layer", "water-tile"} + +local px = 1/32 + +local blank_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, +} + +local no_north_cover_pictures = pipecoverspictures() +no_north_cover_pictures.north = blank_image + +local function middle_shift (box) + return {(box[1][1]+box[2][1])/2, (box[1][2]+box[2][2])/2} +end + +for i = 1, 64, 1 do + local track = { + name = data_util.mod_prefix .. "glyph-a-energy-"..i, + type = "simple-entity", + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__space-exploration-graphics__/graphics/icons/glyph/glyph-a-"..i..".png", + icon_size = 64, + order = "a[ancient]-g[gate]-g[glyph]-"..i, + collision_box = {{-1, -1}, {1, 1}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = {{-1, -1}, {1, 1}}, + selectable_in_game = false, + render_layer = lock_rail_render_layer, + picture = { + + filename = "__space-exploration-graphics__/graphics/entity/gate/sr/glyphs-a-energy.png", + width = 2048/8/2, + height = 1536/8/2, + x = ((i-1)%8)*2048/8/2, + y = math.floor((i-1)/8)*1536/8/2, + shift = {0,0}, + scale = 0.135*2, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/glyphs-a-energy.png", + width = 2048/8, + height = 1536/8, + x = ((i-1)%8)*2048/8, + y = math.floor((i-1)/8)*1536/8, + shift = {0,0}, + scale = 0.135, + } + }, + localised_name = {"entity-name.glyph"} + } + local locked = table.deepcopy(track) + locked.name = locked.name .. "-locked" + locked.render_layer = portal_buttons_render_layer + locked.picture.scale = 0.11 + data:extend({track, locked}) +end + + +local main = { + e = {512,1280}, + en = {832,704}, + es = {832,640}, + n = {1600,384}, + ne = {576,576}, + nw = {576,576}, + s = {1344,320}, + se = {704,576}, + sw = {704,576}, + w = {512,1280}, + wn = {832,704}, + ws = {832,640}, +} + +for m, dimensions in pairs(main) do + data:extend({ + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-main-"..m, + localised_name = {"entity-name.se-gate-part"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_main_render_layer, + order = "a[ancient]-g[gate]-m[main]-"..m, + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-dimensions[1]/64/2, -dimensions[2]/64/2}, {dimensions[1]/64/2, dimensions[2]/64/2}}, + selection_box = {{-dimensions[1]/64/2, -dimensions[2]/64/2}, {dimensions[1]/64/2, dimensions[2]/64/2}}, + selectable_in_game = false, + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/main-"..m..".png", + width = dimensions[1], + height = dimensions[2], + shift = {0,0}, + scale = 0.5, + }) + }, + }) +end + +local main_shadow = { + e = {192,1280}, + en = {704,576}, + es = {832,640}, + ne = {128,128}, + s = {1344,128}, + se = {704,320}, + sw = {704,320}, + w = {128,1280}, + ws = {832,640}, +} +for m, dimensions in pairs(main_shadow) do + data:extend({ + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-main-"..m.."-shadow", + localised_name = {"entity-name.se-gate-part"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_main_shadow_render_layer, + order = "a[ancient]-g[gate]-s[shadow]-"..m, + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-dimensions[1]/64/2, -dimensions[2]/64/2}, {dimensions[1]/64/2, dimensions[2]/64/2}}, + selection_box = {{-dimensions[1]/64/2, -dimensions[2]/64/2}, {dimensions[1]/64/2, dimensions[2]/64/2}}, + selectable_in_game = false, + picture = data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/main-"..m.."-shadow.png", + width = dimensions[1], + height = dimensions[2], + shift = {0,0}, + scale = 0.5, + }) + }, + }) +end + +local underlays = { + e = {320,1280}, + en = {512,512}, + es = {576,448}, + n = {1728,192}, + ne = {640,384}, + nw = {640,384}, + s = {1728,256}, + se = {704,384}, + sw = {704,384}, + w = {320,1280}, + wn = {512,512}, + ws = {576,448}, +} +for u, dimensions in pairs(underlays) do + data:extend({ + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-underlay-"..u, + localised_name = {"entity-name.se-gate-part"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = underlay_render_layer, + order = "a[ancient]-g[gate]-u[underlay]-"..u, + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-dimensions[1]/64/2, -dimensions[2]/64/2}, {dimensions[1]/64/2, dimensions[2]/64/2}}, + selection_box = {{-dimensions[1]/64/2, -dimensions[2]/64/2}, {dimensions[1]/64/2, dimensions[2]/64/2}}, + selectable_in_game = false, + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/underlay-"..u..".png", + width = dimensions[1], + height = dimensions[2], + shift = {0,0}, + scale = 0.5, + }) + }, + }) +end + +for i = 1, 8, 1 do + data:extend({ + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-rails-"..i, + localised_name = {"entity-name.se-gate-part"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = lock_rail_render_layer, + order = "a[ancient]-g[gate]-r[rails]-"..i, + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-1.5, -1}, {1.5, 1}}, + selection_box = {{-1.5, -1}, {1.5, 1}}, + selectable_in_game = false, + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-rails-"..i..".png", + width = 192, + height = 128, + shift = {0,0}, + scale = 0.5, + }) + }, + }) +end + +for i = 1, 8, 1 do + data:extend({ + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-shunt-"..i, + localised_name = {"entity-name.se-gate-part"}, + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = lock_shunt_render_layer, + order = "a[ancient]-g[gate]-s[shunt]-"..i, + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-2, -1.5}, {2, 1.5}}, + selection_box = {{-2, -1.5}, {2, 1.5}}, + selectable_in_game = false, + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-shunt-"..i..".png", + width = 256, + height = 192, + shift = {0,0}, + scale = 0.5, + }) + }, + }) +end + + +data:extend({ + -- fragments + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-1", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-1"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-1.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-5+px, -5+px}, {9-px, 1-px}}, + selection_box = {{-5+px, -5+px}, {9-px, 1-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-1.png", + width = 960, + height = 512, + shift = middle_shift({{-6, -6}, {9, 2}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-1-shadow.png", + width = 1024, + height = 448, + shift = {2,-1.5}, + scale = 0.5,q + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-2", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-2"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-2.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-8+px, -1+px}, {8-px, 3-px}}, + selection_box = {{-8+px, -1+px}, {8-px, 3-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-2.png", + width = 1280, + height = 320, + shift = middle_shift({{-10, -2}, {10, 3}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-2-shadow.png", + width = 1280, + height = 320, + shift = {1,0.5}, + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-3", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-3"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-3.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-10+px, -3.5+px}, {6-px, 3.5-px}}, + selection_box = {{-10+px, -3.5+px}, {6-px, 3.5-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-3.png", + width = 1280, + height = 512, + shift = {-1,-0.5}, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-3-shadow.png", + width = 1216, + height = 448, + shift = {0,0}, + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-4", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-4"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-4.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-3+px, -3+px}, {5-px, 3-px}}, + selection_box = {{-3+px, -3+px}, {5-px, 3-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-4.png", + width = 640, + height = 576, + shift = middle_shift({{-4, -4}, {6, 5}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-4-shadow.png", + width = 704, + height = 576, + shift = middle_shift({{-4, -4}, {7, 5}}), + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-5", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-5"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-5.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-1+px, -1+px}, {1-px, 1-px}}, + selection_box = {{-1+px, -1+px}, {1-px, 1-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-5.png", + width = 256, + height = 256, + shift = middle_shift({{-3, -2}, {1, 2}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-5-shadow.png", + width = 320, + height = 192, + shift = {-0.5,0.5}, + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-6", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-6.png", + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-6"}, + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-2+px, -1+px}, {2-px, 1-px}}, + selection_box = {{-2+px, -1+px}, {2-px, 1-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-6.png", + width = 384, + height = 256, + shift = middle_shift({{-3, -2}, {3, 2}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-6-shadow.png", + width = 384, + height = 256, + shift = middle_shift({{-2, -2}, {4, 2}}), + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-7", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-7.png", + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-7"}, + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-3+px, -2+px}, {3-px, 2-px}}, + selection_box = {{-3+px, -2+px}, {3-px, 2-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-7.png", + width = 448, + height = 384, + shift = middle_shift({{-4, -3}, {3, 3}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-7-shadow.png", + width = 448, + height = 320, + shift = {-0.5,0.5}, + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-8", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-8"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-8.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-3.5+px, -5+px}, {3.5-px, 5-px}}, + selection_box = {{-3.5+px, -5+px}, {3.5-px, 5-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-8.png", + width = 640, + height = 832, + shift = {-0.5, 0.5}, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-8-shadow.png", + width = 640, + height = 832, + shift = {-0.5, 1.5}, + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-9", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-9"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-9.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-2.5+px, -4.5+px}, {2.5-px, 2.5-px}}, + selection_box = {{-2.5+px, -4.5+px}, {2.5-px, 2.5-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-9.png", + width = 320, + height = 704, + shift = {0,-1}, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-9-shadow.png", + width = 384, + height = 704, + shift = {0.5,0}, + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-10", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-10"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-10.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-1+px, -3+px}, {1-px, 1-px}}, + selection_box = {{-1+px, -3+px}, {1-px, 1-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-10.png", + width = 320, + height = 512, + shift = {0.5,0}, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-10-shadow.png", + width = 320, + height = 512, + shift = {1.5,0}, + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-11", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-11"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-11.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-1+px, -1+px}, {1-px, 3-px}}, + selection_box = {{-1+px, -1+px}, {1-px, 3-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-11.png", + width = 256, + height = 384, + shift = middle_shift({{-2, -2}, {2, 4}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-11-shadow.png", + width = 256, + height = 320, + shift = {0,1.5}, + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-12", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-12"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-12.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-7+px, -6.5+px}, {5-px, 4.5-px}}, + selection_box = {{-7+px, -6.5+px}, {5-px, 4.5-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-12.png", + width = 832, + height = 896, + shift = {-1.5,-0.5}, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-12-shadow.png", + width = 896, + height = 960, + shift = {-1,0}, + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-13", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "gate-fragment-13"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-13.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = placeable_collision, + collision_box = {{-9+px, -2+px}, {9-px, 6-px}}, + selection_box = {{-9+px, -2+px}, {9-px, 6-px}}, + selectable_in_game = true, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-13.png", + width = 1344, + height = 640, + shift = {-0.5,3}, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-13-shadow.png", + width = 1280, + height = 640, + shift = {1,3}, + scale = 0.5, + }) + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-14-a", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-6+px, -15+px}, {6-px, 15-px}}, + selection_box = {{-6+px, -15+px}, {6-px, 15-px}}, + selectable_in_game = false, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-14-a.png", + width = 832, + height = 2176, + shift = {-0.5,1}, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-14-a-shadow.png", + width = 832, + height = 2176, + shift = {-0.5,1}, + scale = 0.5, + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-fragment-14-b", + localised_name = {"entity-name."..data_util.mod_prefix .. "gate-fragment"}, + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = fragment_render_layer, + order = "a[ancient]-g[gate]-a", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-13.5+px, -1+px}, {13.5-px, 5-px}}, + selection_box = {{-13.5+px, -1+px}, {13.5-px, 5-px}}, + selectable_in_game = false, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-14-b.png", + width = 2048, + height = 704, + shift = {2.5,3.5}, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/fragment-14-b-shadow.png", + width = 2048, + height = 704, + shift = {2.5,3.5}, + scale = 0.5, + }) + } + } + }, + + -- addons + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-addon-1", + localised_name = {"entity-name."..data_util.mod_prefix.."gate-addon"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_addons_render_layer, + order = "a[ancient]-g[gate]-d[addon]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-2, -2}, {2, 2}}, + selection_box = {{-2, -2}, {2, 2}}, + selectable_in_game = false, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-1.png", + width = 384, + height = 256, + shift = middle_shift({{-3, -1}, {3, 3}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-1-shadow.png", + width = 320, + height = 128, + shift = middle_shift({{-2, 1}, {3, 3}}), + scale = 0.5, + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-addon-2", + localised_name = {"entity-name."..data_util.mod_prefix.."gate-addon"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_addons_render_layer, + order = "a[ancient]-g[gate]-d[addon]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-2, -2}, {2, 2}}, + selection_box = {{-2, -2}, {2, 2}}, + selectable_in_game = false, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-2.png", + width = 256, + height = 320, + shift = middle_shift({{-3, -3}, {1, 2}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-2-shadow.png", + width = 256, + height = 128, + shift = {-1,2}, + scale = 0.5, + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-addon-3", + localised_name = {"entity-name."..data_util.mod_prefix.."gate-addon"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_addons_render_layer, + order = "a[ancient]-g[gate]-d[addon]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-2, -2}, {2, 2}}, + selection_box = {{-2, -2}, {2, 2}}, + selectable_in_game = false, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-3.png", + width = 256, + height = 320, + shift = middle_shift({{-3, -3}, {1, 2}}) , + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-3-shadow.png", + width = 128, + height = 192, + shift = {-1.5,1}, + scale = 0.5, + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-addon-4", + localised_name = {"entity-name."..data_util.mod_prefix.."gate-addon"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_addons_render_layer, + order = "a[ancient]-g[gate]-d[addon]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-2, -2}, {2, 2}}, + selection_box = {{-2, -2}, {2, 2}}, + selectable_in_game = false, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-4.png", + width = 320, + height = 192, + shift = {0.5,-1.5}, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-4-shadow.png", + width = 128, + height = 64, + shift = {1,-1.5}, + scale = 0.5, + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-addon-5", + localised_name = {"entity-name."..data_util.mod_prefix.."gate-addon"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_addons_render_layer, + order = "a[ancient]-g[gate]-d[addon]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-2, -2}, {2, 2}}, + selection_box = {{-2, -2}, {2, 2}}, + selectable_in_game = false, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-5.png", + width = 320, + height = 192, + shift = middle_shift({{-2, -3}, {3, 0}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-5-shadow.png", + width = 192, + height = 128, + shift = {2.5,-1}, + scale = 0.5, + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-addon-6", + localised_name = {"entity-name."..data_util.mod_prefix.."gate-addon"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_addons_render_layer, + order = "a[ancient]-g[gate]-d[addon]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-2, -2}, {2, 2}}, + selection_box = {{-2, -2}, {2, 2}}, + selectable_in_game = false, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-6.png", + width = 256, + height = 320, + shift = {1, -0.5}, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-6-shadow.png", + width = 192, + height = 256, + shift = {2.5,0}, + scale = 0.5, + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-addon-7", + localised_name = {"entity-name."..data_util.mod_prefix.."gate-addon"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_addons_render_layer, + order = "a[ancient]-g[gate]-d[addon]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-2, -2}, {2, 2}}, + selection_box = {{-2, -2}, {2, 2}}, + selectable_in_game = false, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-7.png", + width = 256, + height = 320, + shift = middle_shift({{-1, -3}, {3, 2}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-7-shadow.png", + width = 192, + height = 256, + shift = middle_shift({{0, -2}, {3, 2}}), + scale = 0.5, + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-addon-8", + localised_name = {"entity-name."..data_util.mod_prefix.."gate-addon"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_addons_render_layer, + order = "a[ancient]-g[gate]-d[addon]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-2, -2}, {2, 2}}, + selection_box = {{-2, -2}, {2, 2}}, + selectable_in_game = false, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-8.png", + width = 384, + height = 256, + shift = middle_shift({{-3, -1}, {3, 3}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/lock-addon-8-shadow.png", + width = 384, + height = 192, + shift = middle_shift({{-3, 0}, {3, 3}}), + scale = 0.5, + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-platform", + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_addons_render_layer, + order = "a[ancient]-g[gate]-d[addon]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-4.5, -4}, {4.5, 2}}, + selection_box = {{-4.5, -4}, {4.5, 2}}, + selectable_in_game = false, + picture = { + layers = { + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/platform.png", + width = 704, + height = 384, + shift = middle_shift({{-5.5, -4}, {5.5, 2}}), + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/platform-shadow.png", + width = 768, + height = 192, + shift = {0.5,0.5}, + scale = 0.5, + }), + } + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-platform-button-left", + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_buttons_render_layer, + order = "a[ancient]-g[gate]-b[button]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-0.5, -0.5}, {0.5, 0.5}}, + selection_box = {{-0.5, -0.5}, {0.5, 0.5}}, + selectable_in_game = true, + pictures = { + blank_image, + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/platform-button-left.png", + width = 52, + height = 48, + shift = {0,0}, + scale = 0.5, + }) + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-platform-button-middle", + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_buttons_render_layer, + order = "a[ancient]-g[gate]-b[button]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-0.5, -0.5}, {0.5, 0.5}}, + selection_box = {{-0.5, -0.5}, {0.5, 0.5}}, + selectable_in_game = false, + pictures = { + blank_image, + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/platform-button-middle.png", + width = 54, + height = 48, + shift = {0,0}, + scale = 0.5, + }) + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-platform-button-right", + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_buttons_render_layer, + order = "a[ancient]-g[gate]-b[button]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-0.5, -0.5}, {0.5, 0.5}}, + selection_box = {{-0.5, -0.5}, {0.5, 0.5}}, + selectable_in_game = false, + pictures = { + blank_image, + data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/platform-button-right.png", + width = 48, + height = 48, + shift = {0,0}, + scale = 0.5, + }) + } + }, + { + type = "constant-combinator", + name = data_util.mod_prefix .. "gate-platform-button-switch", + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + order = "a[ancient]-g[gate]-z[invisible]", + flags = {"placeable-neutral", "placeable-off-grid", "not-deconstructable", "not-blueprintable", }, + collision_box = {{-0.5,-0.5},{0.5,0.5}}, + selection_box = {{-0.5,-0.5},{0.5,0.5}}, + selection_priority = 200, + collision_mask = {"not-colliding-with-itself"}, + item_slot_count = 0, + activity_led_light = { color = {b = 1,g = 1,r = 1},intensity = 0.8,size = 1}, + activity_led_light_offsets = {{0.296875,-0.40625},{0.25,-0.03125},{-0.296875,-0.078125},{-0.21875,-0.46875}}, + activity_led_sprites = { + east = blank_image, + north = blank_image, + south = blank_image, + west = blank_image, + }, + circuit_wire_connection_points = { + {shadow = {green = {0.71875,-0.1875},red = {0.21875,-0.1875}},wire = {green = {0.21875,-0.546875},red = {-0.265625,-0.546875}}}, + {shadow = {green = {1,0.25},red = {1,-0.15625}},wire = {green = {0.5,-0.109375},red = {0.5,-0.515625}}}, + {shadow = {green = {0.28125,0.625},red = {0.78125,0.625}},wire = {green = {-0.203125,0.234375},red = {0.28125,0.234375}}}, + {shadow = {green = {0.03125,-0.0625},red = {0.03125,0.34375}},wire = {green = {-0.46875,-0.421875},red = {-0.46875,-0.015625}}} + }, + circuit_wire_max_distance = 0, + max_health = 100000, + sprites = { + east = blank_image, + north = blank_image, + south = blank_image, + west = blank_image, + }, + }, + { + type = "constant-combinator", + name = data_util.mod_prefix .. "gate-lock-switch", + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + order = "a[ancient]-g[gate]-z[invisible]", + flags = {"placeable-neutral", "placeable-off-grid", "not-deconstructable", "not-blueprintable", }, + collision_box = {{-1.5,-1.5},{1.5,1.5}}, + selection_box = {{-1.5,-1.5},{1.5,1.5}}, + selection_priority = 200, + collision_mask = {"not-colliding-with-itself"}, + item_slot_count = 0, + activity_led_light = { color = {b = 1,g = 1,r = 1},intensity = 0.8,size = 1}, + activity_led_light_offsets = {{0.296875,-0.40625},{0.25,-0.03125},{-0.296875,-0.078125},{-0.21875,-0.46875}}, + activity_led_sprites = { + east = blank_image, + north = blank_image, + south = blank_image, + west = blank_image, + }, + circuit_wire_connection_points = { + {shadow = {green = {0.71875,-0.1875},red = {0.21875,-0.1875}},wire = {green = {0.21875,-0.546875},red = {-0.265625,-0.546875}}}, + {shadow = {green = {1,0.25},red = {1,-0.15625}},wire = {green = {0.5,-0.109375},red = {0.5,-0.515625}}}, + {shadow = {green = {0.28125,0.625},red = {0.78125,0.625}},wire = {green = {-0.203125,0.234375},red = {0.28125,0.234375}}}, + {shadow = {green = {0.03125,-0.0625},red = {0.03125,0.34375}},wire = {green = {-0.46875,-0.421875},red = {-0.46875,-0.015625}}} + }, + circuit_wire_max_distance = 0, + max_health = 100000, + sprites = { + east = blank_image, + north = blank_image, + south = blank_image, + west = blank_image, + }, + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-platform-indicator-green", + localised_name = {"entity-name.se-gate-part"}, + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_buttons_render_layer, + order = "a[ancient]-g[gate]-b[button]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-0.1, -0.25}, {0.1, 0.25}}, + selection_box = {{-0.1, -0.25}, {0.1, 0.25}}, + selectable_in_game = false, + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/platform-indicator-green.png", + width = 14, + height = 26, + shift = {0,0}, + scale = 0.5, + }) + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-platform-indicator-yellow", + localised_name = {"entity-name.se-gate-part"}, + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_buttons_render_layer, + order = "a[ancient]-g[gate]-b[button]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-0.1, -0.25}, {0.1, 0.25}}, + selection_box = {{-0.1, -0.25}, {0.1, 0.25}}, + selectable_in_game = false, + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/platform-indicator-yellow.png", + width = 14, + height = 26, + shift = {0,0}, + scale = 0.5, + }) + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-platform-indicator-red", + localised_name = {"entity-name.se-gate-part"}, + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + render_layer = portal_buttons_render_layer, + order = "a[ancient]-g[gate]-b[button]", + collision_mask = {"not-colliding-with-itself"}, + collision_box = {{-0.1, -0.25}, {0.1, 0.25}}, + selection_box = {{-0.1, -0.25}, {0.1, 0.25}}, + selectable_in_game = false, + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/gate/hr/platform-indicator-red.png", + width = 14, + height = 26, + shift = {0,0}, + scale = 0.5, + }) + }, + { + type = "sprite", + name = data_util.mod_prefix .. "gate-void-sprite", + filename = "__space-exploration-graphics__/graphics/entity/gate/void.png", + priority = "extra-high", + width = 512, + height = 362, + shift = {0,0} + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-blocker", + localised_name = {"entity-name.se-gate-part"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + order = "a[ancient]-g[gate]-b[button]", + collision_mask = {"object-layer", "floor-layer", "item-layer"}, + collision_box = {{-0.49, -0.49}, {0.49, 0.49}}, + selection_box = {{-0.49, -0.49}, {0.49, 0.49}}, + selectable_in_game = false, + map_color = {r=0.8, g=0.8, b=0.8, a=1}, + picture = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-blocker-void", + localised_name = {"entity-name.se-gate-part"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + order = "a[ancient]-g[gate]-b[button]", + collision_mask = {"object-layer", "floor-layer", "item-layer"}, + collision_box = {{-0.49, -0.49}, {0.49, 0.49}}, + selection_box = {{-0.49, -0.49}, {0.49, 0.49}}, + selectable_in_game = false, + map_color = {r=0, g=0, b=0, a=1}, + picture = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "gate-tryplace", + localised_name = {"entity-name.se-gate-part"}, + flags = {"placeable-neutral"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + order = "a[ancient]-g[gate]-b[button]", + collision_mask = placeable_collision, + collision_box = {{-35.5, -26.5}, {35.5, 26.5}}, -- note gate registration point is at -0.5,-0.5 from this center + selection_box = {{-35.5, -26.5}, {35.5, 26.5}}, + selectable_in_game = false, + map_color = {r=1, g=0, b=0, a=1}, + picture = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + } + }, + + -- active entities + { + type = "storage-tank", + name = data_util.mod_prefix .. "gate-tank-input", + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + scale_info_icons = false, + render_layer = "higher-object-above", + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + max_health = 500, + order = "a[ancient]-g[gate]-z[invisible]", + corpse = "medium-remnants", + collision_box = {{-0.5+px,-0.5+px},{0.5-px,0.5-px}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = {{-0.5+px,-0.5+px},{0.5-px,0.5-px}}, + selectable_in_game = true, + fluid_box = + { + filter = data_util.mod_prefix .. "space-coolant-supercooled", + base_area = 10, -- gets multiplied by 100 by engine + base_level = -1, -- pull fluid in + pipe_covers = no_north_cover_pictures, + pipe_connections = + { + { position = {0, -1} }, + }, + secondary_draw_orders = { north = -1 } + }, + window_bounding_box = {{0, 0}, {0, 0}}, + pictures = + { + picture = blank_image, + fluid_background = blank_image, + window_background = blank_image, + flow_sprite = blank_image, + gas_flow = blank_image, + }, + flow_length_in_ticks = 360, + circuit_wire_max_distance = 0 + }, + { + type = "storage-tank", + name = data_util.mod_prefix .. "gate-tank-output", + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + order = "a[ancient]-g[gate]-z[invisible]", + scale_info_icons = false, + render_layer = "higher-object-above", + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable"}, + max_health = 500, + order = "a[ancient]-g[gate]-z[invisible]", + corpse = "medium-remnants", + collision_box = {{-0.5+px,-0.5+px},{0.5-px,0.5-px}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = {{-0.5+px,-0.5+px},{0.5-px,0.5-px}}, + selectable_in_game = true, + fluid_box = + { + filter = data_util.mod_prefix .. "space-coolant-hot", + base_area = 10, -- gets multiplied by 100 by engine + base_level = 2, -- push fluid out + pipe_covers = no_north_cover_pictures, + pipe_connections = + { + { position = {0, -1} }, + }, + secondary_draw_orders = { north = -1 } + }, + window_bounding_box = {{0, 0}, {0, 0}}, + pictures = + { + picture = blank_image, + fluid_background = blank_image, + window_background = blank_image, + flow_sprite = blank_image, + gas_flow = blank_image, + }, + flow_length_in_ticks = 360, + circuit_wire_max_distance = 0 + }, + { + type = "constant-combinator", + name = data_util.mod_prefix .. "gate-lock-combinator", + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + order = "a[ancient]-g[gate]-z[invisible]", + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable", "placeable-off-grid"}, + collision_box = {{-0.35,-0.35},{0.35,0.35}}, + selection_box = {{-0.5,-0.5},{0.5,0.5}}, + selection_priority = 200, + collision_mask = {"not-colliding-with-itself"}, + item_slot_count = 18, + activity_led_light = { color = {b = 1,g = 1,r = 1},intensity = 0.8,size = 1}, + activity_led_light_offsets = {{0.296875,-0.40625},{0.25,-0.03125},{-0.296875,-0.078125},{-0.21875,-0.46875}}, + activity_led_sprites = { + east = { + filename = "__base__/graphics/entity/combinator/activity-leds/constant-combinator-LED-E.png", + frame_count = 1, + width = 8, + height = 8, + shift = {0.25,0}, + hr_version = { + filename = "__base__/graphics/entity/combinator/activity-leds/hr-constant-combinator-LED-E.png", + frame_count = 1, + width = 14, + height = 14, + scale = 0.5, + shift = {0.234375,-0.015625}, + }, + }, + north = { + filename = "__base__/graphics/entity/combinator/activity-leds/constant-combinator-LED-N.png", + frame_count = 1, + width = 8, + height = 6, + shift = {0.28125,-0.375}, + hr_version = { + filename = "__base__/graphics/entity/combinator/activity-leds/hr-constant-combinator-LED-N.png", + frame_count = 1, + width = 14, + height = 12, + scale = 0.5, + shift = {0.28125,-0.359375}, + }, + }, + south = { + filename = "__base__/graphics/entity/combinator/activity-leds/constant-combinator-LED-S.png", + frame_count = 1, + width = 8, + height = 8, + shift = {-0.28125,0.0625}, + hr_version = { + filename = "__base__/graphics/entity/combinator/activity-leds/hr-constant-combinator-LED-S.png", + frame_count = 1, + width = 14, + height = 16, + scale = 0.5, + shift = {-0.28125,0.078125}, + }, + }, + west = { + filename = "__base__/graphics/entity/combinator/activity-leds/constant-combinator-LED-W.png", + frame_count = 1, + width = 8, + height = 8, + shift = {-0.21875,-0.46875}, + hr_version = { + filename = "__base__/graphics/entity/combinator/activity-leds/hr-constant-combinator-LED-W.png", + frame_count = 1, + width = 14, + height = 16, + scale = 0.5, + shift = {-0.21875,-0.46875}, + }, + } + }, + circuit_wire_connection_points = { + {shadow = {green = {0.71875,-0.1875},red = {0.21875,-0.1875}},wire = {green = {0.21875,-0.546875},red = {-0.265625,-0.546875}}}, + {shadow = {green = {1,0.25},red = {1,-0.15625}},wire = {green = {0.5,-0.109375},red = {0.5,-0.515625}}}, + {shadow = {green = {0.28125,0.625},red = {0.78125,0.625}},wire = {green = {-0.203125,0.234375},red = {0.28125,0.234375}}}, + {shadow = {green = {0.03125,-0.0625},red = {0.03125,0.34375}},wire = {green = {-0.46875,-0.421875},red = {-0.46875,-0.015625}}} + }, + circuit_wire_max_distance = 9, + max_health = 100000, + sprites = { + east = blank_image, + north = blank_image, + south = blank_image, + west = blank_image, + }, + }, + { + type = "constant-combinator", + name = data_util.mod_prefix .. "gate-platform-combinator", + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + order = "a[ancient]-g[gate]-z[invisible]", + flags = {"placeable-neutral", "not-deconstructable", "not-blueprintable", "placeable-off-grid"}, + collision_box = {{-0.35,-0.35},{0.35,0.35}}, + selection_box = {{-0.6,-0.7},{0.6,0}}, + selection_priority = 200, + collision_mask = {"not-colliding-with-itself"}, + item_slot_count = 18, + activity_led_light = { color = {b = 1,g = 1,r = 1},intensity = 0.8,size = 1}, + activity_led_light_offsets = {{0.296875,-0.40625},{0.25,-0.03125},{-0.296875,-0.078125},{-0.21875,-0.46875}}, + activity_led_sprites = { + east = { + filename = "__base__/graphics/entity/combinator/activity-leds/constant-combinator-LED-E.png", + frame_count = 1, + width = 8, + height = 8, + shift = {0.25,0}, + hr_version = { + filename = "__base__/graphics/entity/combinator/activity-leds/hr-constant-combinator-LED-E.png", + frame_count = 1, + width = 14, + height = 14, + scale = 0.5, + shift = {0.234375,-0.015625}, + }, + }, + north = { + filename = "__base__/graphics/entity/combinator/activity-leds/constant-combinator-LED-N.png", + frame_count = 1, + width = 8, + height = 6, + shift = {0.28125,-0.375}, + hr_version = { + filename = "__base__/graphics/entity/combinator/activity-leds/hr-constant-combinator-LED-N.png", + frame_count = 1, + width = 14, + height = 12, + scale = 0.5, + shift = {0.28125,-0.359375}, + }, + }, + south = { + filename = "__base__/graphics/entity/combinator/activity-leds/constant-combinator-LED-S.png", + frame_count = 1, + width = 8, + height = 8, + shift = {-0.28125,0.0625}, + hr_version = { + filename = "__base__/graphics/entity/combinator/activity-leds/hr-constant-combinator-LED-S.png", + frame_count = 1, + width = 14, + height = 16, + scale = 0.5, + shift = {-0.28125,0.078125}, + }, + }, + west = { + filename = "__base__/graphics/entity/combinator/activity-leds/constant-combinator-LED-W.png", + frame_count = 1, + width = 8, + height = 8, + shift = {-0.21875,-0.46875}, + hr_version = { + filename = "__base__/graphics/entity/combinator/activity-leds/hr-constant-combinator-LED-W.png", + frame_count = 1, + width = 14, + height = 16, + scale = 0.5, + shift = {-0.21875,-0.46875}, + }, + } + }, + circuit_wire_connection_points = { + {shadow = {green = {0.71875,-0.1875},red = {0.21875,-0.1875}},wire = {green = {0.21875,-0.546875},red = {-0.265625,-0.546875}}}, + {shadow = {green = {1,0.25},red = {1,-0.15625}},wire = {green = {0.5,-0.109375},red = {0.5,-0.515625}}}, + {shadow = {green = {0.28125,0.625},red = {0.78125,0.625}},wire = {green = {-0.203125,0.234375},red = {0.28125,0.234375}}}, + {shadow = {green = {0.03125,-0.0625},red = {0.03125,0.34375}},wire = {green = {-0.46875,-0.421875},red = {-0.46875,-0.015625}}} + }, + circuit_wire_max_distance = 9, + max_health = 100000, + sprites = { + east = blank_image, + north = blank_image, + south = blank_image, + west = blank_image, + }, + }, + { + type = "electric-energy-interface", + name = data_util.mod_prefix .. "gate-energy-interface", + icon = "__space-exploration-graphics__/graphics/icons/gate/gate.png", + icon_size = 64, + order = "a[ancient]-g[gate]-z[invisible]", + allow_copy_paste = false, + picture = blank_image, + collision_box = {{-4.5+px, -1.5+px},{4.5-px, 1.5-px}}, + selection_box = {{-4.5+px, -1.5+px},{4.5-px, 1.5-px}}, + collision_mask = {"not-colliding-with-itself"}, + selectable = false, + continuous_animation = true, + corpse = "medium-remnants", + energy_source = { + buffer_capacity = "1GJ", + --input_flow_limit = "60GW", -- total when all active (values over 60GW won't work) + input_flow_limit = "11GW", -- total when all active (values over 60GW won't work) + output_flow_limit = "0kW", + type = "electric", + usage_priority = "primary-input" + }, + energy_production = "0kW", + --energy_usage = "60GW", -- platform + 1x per lock + 1x for final energy spike final activation. + energy_usage = "10GW", -- platform + 1x per lock + 1x for final energy spike final activation. + flags = { + "placeable-player", + "player-creation", + "hidden", + "not-rotatable" + }, + max_health = 150000, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + working_sound = { + fade_in_ticks = 10, + fade_out_ticks = 30, + idle_sound = { + filename = "__base__/sound/accumulator-idle.ogg", + volume = 0.5 + }, + max_sounds_per_type = 3, + sound = { + filename = "__base__/sound/accumulator-working.ogg", + volume = 1 + } + } + }, + { + type = "animation", + name = data_util.mod_prefix .. "gate-cloud", + animation_speed = 0.5, + filename = "__base__/graphics/entity/cloud/cloud-45-frames.png", + flags = { + "compressed" + }, + frame_count = 45, + height = 256, + line_length = 7, + priority = "low", + scale = 3, + width = 256, + apply_runtime_tint = true, + blend_mode = "additive", --"additive-soft" + }, + { + type = "projectile", + name = data_util.mod_prefix .. "gate-spec-white", + direction_only = false, + flags = { "not-on-map", "placeable-off-grid" }, + acceleration = -0.001, + collision_mask = {"not-colliding-with-itself"}, + animation = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-particle/speck.png", + frame_count = 1, + height = 50, + priority = "high", + width = 3, + apply_runtime_tint = true, + blend_mode = "additive", --"additive-soft" + scale = 1 + }, + }, + { + type = "projectile", + name = data_util.mod_prefix .. "gate-spec-cyan", + direction_only = false, + flags = { "not-on-map", "placeable-off-grid" }, + acceleration = -0.001, + collision_mask = {"not-colliding-with-itself"}, + animation = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-particle/speck.png", + frame_count = 1, + height = 50, + priority = "high", + width = 3, + apply_runtime_tint = true, + blend_mode = "additive", --"additive-soft" + tint = {r = 0.0, g = 0.6, b = 1, a = 1}, + scale = 1 + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/genetics-laboratory.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/genetics-laboratory.lua new file mode 100644 index 0000000..e86eebb --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/genetics-laboratory.lua @@ -0,0 +1,164 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-genetics-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/genetics-laboratory.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-genetics-laboratory"}, + max_health = 1200, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-3.3, -3.3}, {3.3, 3.3}}, + selection_box = {{-3.5, -3.5}, {3.5, 3.5}}, + drawing_box = {{-3.5, -3.9}, {3.5, 3.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/chemical-plant.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-2__/graphics/entity/genetics-laboratory/sr/genetics-laboratory.png", + priority = "high", + width = 3584/8/2, + height = 2048/4/2, + frame_count = 32, + line_length = 8, + shift = util.by_pixel(0, -16), + animation_speed = 0.5, + hr_version = { + filename = "__space-exploration-graphics-2__/graphics/entity/genetics-laboratory/hr/genetics-laboratory.png", + priority = "high", + width = 3584/8, + height = 2048/4, + frame_count = 32, + line_length = 8, + shift = util.by_pixel(0, -16), + animation_speed = 0.5, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/genetics-laboratory/sr/genetics-laboratory-shadow.png", + priority = "high", + width = 604/2, + height = 302/2, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(40, 8), + animation_speed = 0.5, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/genetics-laboratory/hr/genetics-laboratory-shadow.png", + priority = "high", + width = 604, + height = 302, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(40, 8), + animation_speed = 0.5, + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-genetics"}, + crafting_speed = 4, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = {r = 0.7, g = 0.8, b = 1}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/growth-facility.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/growth-facility.lua new file mode 100644 index 0000000..7216753 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/growth-facility.lua @@ -0,0 +1,245 @@ +local data_util = require("data_util") + +local pipe_pics = table.deepcopy(data.raw["assembling-machine"]["assembling-machine-3"].fluid_boxes[1].pipe_picture) +data_util.replace_filenames_recursive(pipe_pics, + "__base__", + "__space-exploration-graphics__") +data_util.replace_filenames_recursive(pipe_pics, + "assembling-machine-3", + "assembling-machine") + + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-growth-facility", + icon = "__space-exploration-graphics__/graphics/icons/growth-facility.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-growth-facility"}, + max_health = 1500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-4.3, -4.3}, {4.3, 4.3}}, + selection_box = {{-4.5, -4.5}, {4.5, 4.5}}, + drawing_box = {{-4.5, -4.9}, {4.5, 4.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, 2} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-2, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, -2} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {2, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {-2, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, 2} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {2, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, -2} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/chemical-plant.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/growth-facility/sr/growth-facility.png", + priority = "high", + width = 4032/7/2, + height = 3360/5/2, + frame_count = 32, + line_length = 7, + shift = util.by_pixel(0, -24), + animation_speed = 0.1, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/growth-facility/hr/growth-facility.png", + priority = "high", + width = 4032/7, + height = 3360/5, + frame_count = 32, + line_length = 7, + shift = util.by_pixel(0, -24), + animation_speed = 0.1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/growth-facility/sr/growth-facility-shadow.png", + priority = "high", + width = 618/2, + height = 570/2, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(8, 2), + animation_speed = 0.1, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/growth-facility/hr/growth-facility-shadow.png", + priority = "high", + width = 618, + height = 570, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(8, 2), + animation_speed = 0.1, + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-growth"}, + crafting_speed = 4, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "4000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 24, shift = {0.0, 0.0}, color = {r = 0.7, g = 0.8, b = 1}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/laser-radi-thermo.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/laser-radi-thermo.lua new file mode 100644 index 0000000..3f5ed46 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/laser-radi-thermo.lua @@ -0,0 +1,481 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-laser-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/laser-laboratory.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-laser-laboratory"}, + max_health = 1200, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-3.3, -3.3}, {3.3, 3.3}}, + selection_box = {{-3.5, -3.5}, {3.5, 3.5}}, + drawing_box = {{-3.5, -3.9}, {3.5, 3.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/electric-furnace.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-2__/graphics/entity/laser-laboratory/sr/laser-laboratory.png", + priority = "high", + width = 3584/8/2, + height = 3840/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -8), + animation_speed = 0.75, + hr_version = { + filename = "__space-exploration-graphics-2__/graphics/entity/laser-laboratory/hr/laser-laboratory.png", + priority = "high", + width = 3584/8, + height = 3840/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -8), + animation_speed = 0.75, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/laser-laboratory/sr/laser-laboratory-shadow.png", + priority = "high", + width = 442/2, + height = 394/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(21, 13), + animation_speed = 0.75, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/laser-laboratory/hr/laser-laboratory-shadow.png", + priority = "high", + width = 442, + height = 394, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(21, 13), + animation_speed = 0.75, + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-laser"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "5MW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.8, size = 18, shift = {0.0, 0.0}, color = {r = 1, g = 0.2, b = 0.2}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-radiation-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/radiation-laboratory.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-radiation-laboratory"}, + max_health = 1200, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-3.3, -3.3}, {3.3, 3.3}}, + selection_box = {{-3.5, -3.5}, {3.5, 3.5}}, + drawing_box = {{-3.5, -3.9}, {3.5, 3.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/electric-furnace.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-2__/graphics/entity/radiation-laboratory/sr/radiation-laboratory.png", + priority = "high", + width = 3584/8/2, + height = 3840/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -8), + animation_speed = 0.75, + hr_version = { + filename = "__space-exploration-graphics-2__/graphics/entity/radiation-laboratory/hr/radiation-laboratory.png", + priority = "high", + width = 3584/8, + height = 3840/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -8), + animation_speed = 0.75, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/radiation-laboratory/sr/radiation-laboratory-shadow.png", + priority = "high", + width = 442/2, + height = 394/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(21, 13), + animation_speed = 0.75, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/radiation-laboratory/hr/radiation-laboratory-shadow.png", + priority = "high", + width = 442, + height = 394, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(21, 13), + animation_speed = 0.75, + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-radiation", "centrifuging"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.8, size = 18, shift = {0.0, 0.0}, color = {r = 0.3, g = 1, b = 0.1}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-thermodynamics-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/thermodynamics-laboratory.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-thermodynamics-laboratory"}, + max_health = 1200, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-3.3, -3.3}, {3.3, 3.3}}, + selection_box = {{-3.5, -3.5}, {3.5, 3.5}}, + drawing_box = {{-3.5, -3.9}, {3.5, 3.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/electric-furnace.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-2__/graphics/entity/thermodynamics-laboratory/sr/thermodynamics-laboratory.png", + priority = "high", + width = 3584/8/2, + height = 3840/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -8), + animation_speed = 0.75, + hr_version = { + filename = "__space-exploration-graphics-2__/graphics/entity/thermodynamics-laboratory/hr/thermodynamics-laboratory.png", + priority = "high", + width = 3584/8, + height = 3840/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -8), + animation_speed = 0.75, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/thermodynamics-laboratory/sr/thermodynamics-laboratory-shadow.png", + priority = "high", + width = 442/2, + height = 394/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(21, 13), + animation_speed = 0.75, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/thermodynamics-laboratory/hr/thermodynamics-laboratory-shadow.png", + priority = "high", + width = 442, + height = 394, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(21, 13), + animation_speed = 0.75, + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-thermodynamics", "smelting"}, + crafting_speed = 4, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.8, size = 18, shift = {0.0, 0.0}, color = {r = 1, g = 0.7, b = 0.1}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/light.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/light.lua new file mode 100644 index 0000000..1488464 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/light.lua @@ -0,0 +1,44 @@ +local data_util = require("data_util") +-- use projectile for light becuase they are can be positioned, moved, and removed at a specific time. +local function make_light(name, light) + data:extend( { + { + type = "projectile", + name = name, + acceleration = 0, + animation = { + filename = "__space-exploration-graphics__/graphics/blank.png", + frame_count = 1, + height = 1, + line_length = 1, + priority = "high", + width = 1 + }, + flags = { "not-on-map", "placeable-off-grid" }, + light = light, + } + }) +end + +make_light(data_util.mod_prefix .."light-space-capsule", { + intensity = 0.4, + size = 16, + color = {r = 255, g = 225, b = 195} +}) + +make_light(data_util.mod_prefix .. "light-space-capsule-launch", { + intensity = 2, + size = 8, + color = {r = 255, g = 50, b = 0} +}) + +make_light(data_util.mod_prefix .. "gate-light", { + intensity = 0.15, + size = 40, + color = {r = 255, g = 250, b = 255} +}) +make_light(data_util.mod_prefix .. "gate-light-middle", { + intensity = 1, + size = 64, + color = {r = 255, g = 250, b = 255} +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/meteor-defence.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/meteor-defence.lua new file mode 100644 index 0000000..4dfb160 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/meteor-defence.lua @@ -0,0 +1,453 @@ +local data_util = require("data_util") + +local blank_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + direction_count = 1, + shift = { 0, 0 }, +} + +local selection_box = { { -4.5, -4.5 }, { 4.5, 4.5 } } +local collision_box = { { -4.3, -4.3 }, { 4.3, 4.3 } } + +data:extend({ + { + type = "ammo-turret", + name = data_util.mod_prefix .. "meteor-defence-container", + minable = { + mining_time = 0.5, + result = data_util.mod_prefix .. "meteor-defence" + }, + alert_when_attacking = false, + automated_ammo_count = 4, + attack_parameters = { + ammo_category = data_util.mod_prefix .. "meteor-defence", + cooldown = 300, + range = 1, + type = "projectile" + }, + base_picture_render_layer = "object", + base_picture = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-defence/meteor-defence.png", + shift = { 0, -4.75 }, + width = 616/2, + height = 1198/2, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-defence/hr-meteor-defence.png", + shift = { 0, -4.75 }, + width = 616, + height = 1198, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-defence/meteor-defence-shadow.png", + shift = { 2.5, 2/32 }, + width = 890/2, + height = 578/2, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-defence/hr-meteor-defence-shadow.png", + shift = { 2.5, 2/32 }, + width = 890, + height = 578, + scale = 0.5, + } + } + } + }, + call_for_help_radius = 40, + folded_animation = blank_image, + collision_box = collision_box, + drawing_box = { { -4.5, -4.5-9 }, { 4.5, 4.5 } }, + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + flags = {"placeable-neutral", "player-creation"}, + icon = "__space-exploration-graphics__/graphics/icons/meteor-defence.png", + icon_size = 64, + order = "b-a", + inventory_size = 1, + max_health = 8000, + resistances = { + { type = "impact", percent = 100 }, + { type = "fire", percent = 100 } + }, + open_sound = { + filename = "__base__/sound/machine-open.ogg", + volume = 0.85 + }, + close_sound = { + filename = "__base__/sound/machine-close.ogg", + volume = 0.75 + }, + rotation_speed = 0.015, + selection_box = selection_box, + selection_priority = 100, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + } + }, + { + type = "electric-energy-interface", + name = data_util.mod_prefix .. "meteor-defence-charger", + icon = "__space-exploration-graphics__/graphics/icons/meteor-defence.png", + flags = {"placeable-player", "player-creation", "placeable-off-grid", "not-deconstructable", "not-blueprintable"}, + icon_size = 64, + order = "b-a", + selectable_in_game = false, + selection_box = { { -4.5, -4.5 }, { 4.5, 4.5 } }, + collision_box = collision_box, + energy_source = { + buffer_capacity = "2000MJ", + input_flow_limit = "20MW", + type = "electric", + usage_priority = "secondary-input" + }, + energy_usage = "5MW" + }, + { + type = "explosion", + name = data_util.mod_prefix .. "meteor-defence-beam", + animations = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-defence/meteor-defence-beam.png", + frame_count = 6, + height = 1, + priority = "extra-high", + width = 187 + } + }, + beam = true, + flags = { "not-on-map", "placeable-off-grid"}, + light = { + color = { + b = 0, + g = 0, + r = 1 + }, + intensity = 1, + size = 20 + }, + rotate = true, + smoke = "smoke-fast", + smoke_count = 2, + smoke_slow_down_factor = 1, + sound = { + { + filename = "__base__/sound/fight/old/huge-explosion.ogg", + volume = 1 + } + }, + }, + { + type = "ammo-turret", + name = data_util.mod_prefix .. "meteor-point-defence-container", + minable = { + mining_time = 0.3, + result = data_util.mod_prefix .. "meteor-point-defence", + }, + alert_when_attacking = false, + automated_ammo_count = 4, + attack_parameters = { + ammo_category = data_util.mod_prefix .. "meteor-point-defence", + cooldown = 300, + range = 64, + type = "projectile" + }, + base_picture_render_layer = "object", + base_picture = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/meteor-point-defence-base.png", + shift = { 1/32, -1.5 }, + width = 206/2, + height = 400/2, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/hr-meteor-point-defence-base.png", + shift = { 1/32, -1.5 }, + width = 206, + height = 400, + scale = 0.5, + } + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/meteor-point-defence-mask.png", + shift = { 1/32, -1.5 }, + width = 206/2, + height = 400/2, + tint = {r=255,g=0,b=0}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/hr-meteor-point-defence-mask.png", + shift = { 1/32, -1.5 }, + width = 206, + height = 400, + scale = 0.5, + tint = {r=255,g=0,b=0}, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/meteor-point-defence-shadow.png", + shift = { 1.7, 0.6 }, + width = 408/2, + height = 136/2, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/hr-meteor-point-defence-shadow.png", + shift = { 1.7, 0.6 }, + width = 408, + height = 136, + scale = 0.5, + } + } + } + }, + call_for_help_radius = 40, + folded_animation = blank_image, + collision_box = { { -1.35, -1.35 }, { 1.35, 1.35 } }, + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + corpse = "medium-remnants", + dying_explosion = "medium-explosion", + flags = {"placeable-neutral", "player-creation"}, + icon = "__space-exploration-graphics__/graphics/icons/meteor-point-defence.png", + icon_size = 64, + order = "a-a", + inventory_size = 1, + max_health = 2000, + resistances = { + { type = "impact", percent = 100 }, + { type = "fire", percent = 100 } + }, + open_sound = { + filename = "__base__/sound/machine-open.ogg", + volume = 0.85 + }, + close_sound = { + filename = "__base__/sound/machine-close.ogg", + volume = 0.75 + }, + rotation_speed = 0.015, + selection_box = { { -1.5, -1.5 }, { 1.5, 1.5 } }, + selection_priority = 100, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + } + }, + { + type = "sprite", + name = data_util.mod_prefix .. "meteor-point-defence-mask", + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/meteor-point-defence-mask.png", + shift = { 1/32, -1.5 }, + width = 206/2, + height = 400/2, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/hr-meteor-point-defence-mask.png", + shift = { 1/32, -1.5 }, + width = 206, + height = 400, + scale = 0.5, + } + }, + { + type = "electric-energy-interface", + name = data_util.mod_prefix .. "meteor-point-defence-charger", + icon = "__space-exploration-graphics__/graphics/icons/meteor-point-defence.png", + flags = {"placeable-player", "player-creation", "placeable-off-grid", "not-deconstructable", "not-blueprintable"}, + + render_layer="object", + picture = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/meteor-point-defence-base.png", + shift = { 1/32, -1.5 }, + width = 206/2, + height = 400/2, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/hr-meteor-point-defence-base.png", + shift = { 1/32, -1.5 }, + width = 206, + height = 400, + scale = 0.5, + } + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/meteor-point-defence-mask.png", + shift = { 1/32, -1.5 }, + width = 206/2, + height = 400/2, + tint = {r=255,g=0,b=0}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/hr-meteor-point-defence-mask.png", + shift = { 1/32, -1.5 }, + width = 206, + height = 400, + scale = 0.5, + tint = {r=255,g=0,b=0}, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/meteor-point-defence-shadow.png", + shift = { 1.7, 0.6 }, + width = 408/2, + height = 136/2, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/hr-meteor-point-defence-shadow.png", + shift = { 1.7, 0.6 }, + width = 408, + height = 136, + scale = 0.5, + } + } + } + }, + icon_size = 64, + order = "a-a", + selectable_in_game = false, + selection_box = { { -1.5, -1.5 }, { 1.5, 1.5 } }, + collision_box = { { -1.35, -1.35 }, { 1.35, 1.35 } }, + collision_mask = {"not-colliding-with-itself"}, + energy_source = { + buffer_capacity = "200MJ", + input_flow_limit = "2MW", + type = "electric", + usage_priority = "secondary-input" + }, + energy_usage = "0.5MW" + }, + { + type = "electric-energy-interface", + name = data_util.mod_prefix .. "meteor-point-defence-charger-overcharged", + + render_layer="object", + picture = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/meteor-point-defence-base.png", + shift = { 1/32, -1.5 }, + width = 206/2, + height = 400/2, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/hr-meteor-point-defence-base.png", + shift = { 1/32, -1.5 }, + width = 206, + height = 400, + scale = 0.5, + } + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/meteor-point-defence-mask.png", + shift = { 1/32, -1.5 }, + width = 206/2, + height = 400/2, + tint = {r=200,g=100,b=0}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/hr-meteor-point-defence-mask.png", + shift = { 1/32, -1.5 }, + width = 206, + height = 400, + scale = 0.5, + tint = {r=200,g=100,b=0}, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/meteor-point-defence-shadow.png", + shift = { 1.7, 0.6 }, + width = 408/2, + height = 136/2, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/hr-meteor-point-defence-shadow.png", + shift = { 1.7, 0.6 }, + width = 408, + height = 136, + scale = 0.5, + } + } + } + }, + icon = "__space-exploration-graphics__/graphics/icons/meteor-point-defence.png", + flags = {"placeable-player", "player-creation", "placeable-off-grid", "not-deconstructable", "not-blueprintable"}, + icon_size = 64, + selectable_in_game = false, + selection_box = { { -1.5, -1.5 }, { 1.5, 1.5 } }, + collision_box = { { -1.35, -1.35 }, { 1.35, 1.35 } }, + collision_mask = {"not-colliding-with-itself"}, + energy_source = { + buffer_capacity = "1000MJ", + input_flow_limit = "10GW", + type = "electric", + usage_priority = "primary-input" + }, + energy_usage = "0.25MW" + }, + { + type = "explosion", + name = data_util.mod_prefix .. "meteor-point-defence-beam", + animations = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/meteor-point-defence/meteor-point-defence-beam.png", + frame_count = 6, + height = 1, + priority = "extra-high", + width = 576/6 + } + }, + beam = true, + flags = { "not-on-map", "placeable-off-grid"}, + light = { + color = { + b = 0.5, + g = 0.95, + r = 1 + }, + intensity = 1, + size = 20 + }, + rotate = true, + smoke = "smoke-fast", + smoke_count = 2, + smoke_slow_down_factor = 1, + sound = { + { + filename = "__base__/sound/fight/heavy-gunshot-1.ogg", + volume = 0.45 + }, + { + filename = "__base__/sound/fight/heavy-gunshot-2.ogg", + volume = 0.45 + }, + { + filename = "__base__/sound/fight/heavy-gunshot-3.ogg", + volume = 0.45 + }, + { + filename = "__base__/sound/fight/heavy-gunshot-4.ogg", + volume = 0.45 + } + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/meteor.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/meteor.lua new file mode 100644 index 0000000..632a165 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/meteor.lua @@ -0,0 +1,358 @@ +local data_util = require("data_util") +--[[ +meteors +projectile falls from the sky +shadow moves sideways +projectile causes explosion and spawns a rock +]]-- +local meteors = { + ["meteor-01"] = {209, 138}, + ["meteor-02"] = {165,129}, + ["meteor-03"] = {151,139}, + ["meteor-04"] = {216,110}, + ["meteor-05"] = {154,147}, + ["meteor-06"] = {154,132}, + ["meteor-07"] = {193,120}, + ["meteor-08"] = {136,117}, + ["meteor-09"] = {157,115}, + ["meteor-10"] = {198,153}, + ["meteor-11"] = {190,115}, + ["meteor-12"] = {229,126}, + ["meteor-13"] = {151,125}, + ["meteor-14"] = {137,117}, + ["meteor-15"] = {201,141}, + ["meteor-16"] = {209,154}, +} + +local tint = {r = 0.5, g = 0.5, b = 0.5} + +for name, meteor in pairs(meteors) do + local width = meteor[1] + local height = meteor[2] + local shadow_width = meteor[1] + local shadow_height = meteor[2] + local scale = 0.75 + local picture_offset = width / 32 / 16 + data:extend({ + { + type = "projectile", + name = data_util.mod_prefix.."falling-" .. name, + acceleration = 0, + rotatable = false, + animation = { + filename = "__space-exploration-graphics__/graphics/entity/meteor/hr-"..name..".png", + frame_count = 1, + width = width, + height = height, + line_length = 1, + priority = "high", + shift = { picture_offset, 0 }, + tint=tint, + scale = scale, + }, + action = { + action_delivery = { + target_effects = { + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 20, + type = "meteor" + }, + type = "damage" + }, + }, + type = "instant" + }, + radius = 10, + type = "area" + }, + type = "nested-result" + }, + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 100, + type = "meteor" + }, + type = "damage" + }, + }, + type = "instant" + }, + radius = 4, + type = "area" + }, + type = "nested-result" + }, + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 200, + type = "meteor" + }, + type = "damage" + }, + }, + type = "instant" + }, + radius = 2, + type = "area" + }, + type = "nested-result" + }, + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 10000, + type = "meteor" + }, + type = "damage" + }, + }, + type = "instant" + }, + radius = 1, + type = "area" + }, + type = "nested-result" + }, + { + type = "create-entity", + entity_name = data_util.mod_prefix.."meteor-explosion", + }, + { + type = "create-entity", + check_buildability = false, + entity_name = data_util.mod_prefix.."static-"..name, + }, + { + type = "create-entity", + entity_name = data_util.mod_prefix .. "trigger-movable-debris", + trigger_created_entity = true, + }, + }, + type = "instant" + }, + type = "direct" + }, + flags = { "not-on-map" }, + light = { intensity = 1, size = 5, color={r=1,g=0.7,b=0.3}}, + smoke = { + { + deviation = { + 0.15, + 0.15 + }, + frequency = 1, + --name = "smoke-fast", + --name = "smoke-explosion-particle", + name = "soft-fire-smoke", -- lasts longer + position = {0,0}, + slow_down_factor = 1, + starting_frame = 3, + starting_frame_deviation = 5, + starting_frame_speed = 0, + starting_frame_speed_deviation = 5 + } + }, + }, + { + type = "projectile", + name = data_util.mod_prefix.."shadow-" .. name, + acceleration = 0, + rotatable = false, + animation = { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/meteor/shadows/hr-"..name..".png", + frame_count = 1, + width = shadow_width, + height = shadow_height, + line_length = 1, + priority = "high", + shift = { picture_offset, 0 }, + tint=tint, + scale = scale, + }, + flags = { "not-on-map" }, + }, + { + type = "simple-entity", + name = data_util.mod_prefix.."static-"..name, + icon = "__space-exploration-graphics__/graphics/icons/astronomic/asteroid-belt.png", + icon_size = 64, + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + subgroup = "wrecks", + order = "d[remnants]-d[ship-wreck]-c[small]-a", + max_health = 1000, + minable = { + mining_time = 1, + results={ + {name = "stone", amount_min = 9, amount_max = 31}, + {name = "iron-ore", amount_min = 0, amount_max = 30}, + {name = "copper-ore", amount_min = 0, amount_max = 30}, + {name = "uranium-ore", amount_min = 0, amount_max = 30, probability = 0.1}, + } + }, + resistances = + { + { type = "fire", percent = 100 }, + { type = "poison", percent = 100 } + }, + collision_box = {{-1, -1}, {1, 1}}, + collision_mask = {"not-colliding-with-itself"}, -- otherwise it kills the entity ghosts too + selection_box = {{-1, -1}, {1, 1}}, + selection_priority = 2, + count_as_rock_for_filtered_deconstruction = true, + picture = + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/entity/meteor/hr-"..name..".png", + width = width, + height = height, + shift = { picture_offset, 0 }, + tint=tint, + scale = scale, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/meteor/shadows/hr-"..name..".png", + width = shadow_width, + height = shadow_height, + shift = { picture_offset, 0 }, + tint=tint, + scale = scale, + } + } + }, + render_layer = "object", + localised_name = {"entity-name.meteorite"} + }, + + }) +end + +data:extend({ + { + animation = { + direction_count = 1, + frame_count = 1, + filename = "__base__/graphics/entity/scorchmark/small-scorchmark.png", + width = 128, + height = 92, + line_length = 4, + shift = util.by_pixel(0, 2), + variation_count = 4, + hr_version = + { + direction_count = 1, + frame_count = 1, + filename = "__base__/graphics/entity/scorchmark/hr-small-scorchmark.png", + width = 256, + height = 182, + line_length = 4, + shift = util.by_pixel(0, 2), + variation_count = 4, + scale = 0.5, + } + }, + collision_box = { + { + -1.5, + -1.5 + }, + { + 1.5, + 1.5 + } + }, + collision_mask = { + "doodad-layer", + "not-colliding-with-itself" + }, + final_render_layer = "ground-patch-higher2", + flags = { + "placeable-neutral", + "not-on-map", + "placeable-off-grid" + }, + ground_patch = + { + sheet = + { + filename = "__base__/graphics/entity/scorchmark/small-scorchmark.png", + width = 128, + height = 92, + line_length = 4, + shift = util.by_pixel(0, 2), + variation_count = 4, + hr_version = + { + filename = "__base__/graphics/entity/scorchmark/hr-small-scorchmark.png", + width = 256, + height = 182, + line_length = 4, + shift = util.by_pixel(0, 2), + variation_count = 4, + scale = 0.5, + } + } + }, + ground_patch_higher = + { + sheet = + { + filename = "__base__/graphics/entity/scorchmark/small-scorchmark-top.png", + width = 34, + height = 28, + line_length = 4, + variation_count = 4, + shift = util.by_pixel(0, -2), + hr_version = + { + filename = "__base__/graphics/entity/scorchmark/hr-small-scorchmark-top.png", + width = 68, + height = 54, + line_length = 4, + shift = util.by_pixel(0, -2), + variation_count = 4, + scale = 0.5, + } + } + }, + icon = "__base__/graphics/icons/small-scorchmark.png", + icon_size = 64, + name = data_util.mod_prefix.."meteor-scorchmark", + order = "d[remnants]-b[scorchmark]-a[small]", + remove_on_entity_placement = false, + remove_on_tile_placement = true, + selectable_in_game = false, + selection_box = { + { + -1, + -1 + }, + { + 1, + 1 + } + }, + subgroup = "remnants", + time_before_removed = 36000, + type = "corpse" + }, + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/particle-acc-col-fab.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/particle-acc-col-fab.lua new file mode 100644 index 0000000..0482e86 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/particle-acc-col-fab.lua @@ -0,0 +1,483 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-particle-accelerator", + icon = "__space-exploration-graphics__/graphics/icons/particle-accelerator.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-particle-accelerator"}, + max_health = 1500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-4.3, -4.3}, {4.3, 4.3}}, + selection_box = {{-4.5, -4.5}, {4.5, 4.5}}, + drawing_box = {{-4.5, -6.0}, {4.5, 4.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/electric-furnace.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-2__/graphics/entity/particle-accelerator/sr/particle-accelerator.png", + priority = "high", + width = 3540/6/2, + height = 4032/6/2, + frame_count = 32, + line_length = 6, + shift = util.by_pixel(0, -24), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-2__/graphics/entity/particle-accelerator/hr/particle-accelerator.png", + priority = "high", + width = 3540/6, + height = 4032/6, + frame_count = 32, + line_length = 6, + shift = util.by_pixel(0, -24), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/particle-accelerator/sr/particle-accelerator-shadow.png", + priority = "high", + width = 692/2, + height = 526/2, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(32, 16), + animation_speed = 1, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/particle-accelerator/hr/particle-accelerator-shadow.png", + priority = "high", + width = 692, + height = 526, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(32, 16), + animation_speed = 1, + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-accelerator"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "100MW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.8, size = 32, shift = {0.0, 0.0}, color = {r = 0.1, g = 0.5, b = 1}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-particle-collider", + icon = "__space-exploration-graphics__/graphics/icons/particle-collider.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-particle-collider"}, + max_health = 1500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-4.3, -4.3}, {4.3, 4.3}}, + selection_box = {{-4.5, -4.5}, {4.5, 4.5}}, + drawing_box = {{-4.5, -6.0}, {4.5, 4.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/electric-furnace.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-2__/graphics/entity/particle-collider/sr/particle-collider.png", + priority = "high", + width = 3540/6/2, + height = 4032/6/2, + frame_count = 32, + line_length = 6, + shift = util.by_pixel(0, -24), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-2__/graphics/entity/particle-collider/hr/particle-collider.png", + priority = "high", + width = 3540/6, + height = 4032/6, + frame_count = 32, + line_length = 6, + shift = util.by_pixel(0, -24), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/particle-collider/sr/particle-collider-shadow.png", + priority = "high", + width = 692/2, + height = 526/2, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(32, 16), + animation_speed = 1, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/particle-collider/hr/particle-collider-shadow.png", + priority = "high", + width = 692, + height = 526, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(32, 16), + animation_speed = 1, + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-collider"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "10MW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.8, size = 32, shift = {0.0, 0.0}, color = {r = 1, g = 1, b = 0.2}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-material-fabricator", + icon = "__space-exploration-graphics__/graphics/icons/material-fabricator.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-material-fabricator"}, + max_health = 1500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-4.3, -4.3}, {4.3, 4.3}}, + selection_box = {{-4.5, -4.5}, {4.5, 4.5}}, + drawing_box = {{-4.5, -6.0}, {4.5, 4.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/electric-furnace.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-2__/graphics/entity/material-fabricator/sr/material-fabricator.png", + priority = "high", + width = 3540/6/2, + height = 4032/6/2, + frame_count = 32, + line_length = 6, + shift = util.by_pixel(0, -24), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-2__/graphics/entity/material-fabricator/hr/material-fabricator.png", + priority = "high", + width = 3540/6, + height = 4032/6, + frame_count = 32, + line_length = 6, + shift = util.by_pixel(0, -24), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/material-fabricator/sr/material-fabricator-shadow.png", + priority = "high", + width = 692/2, + height = 526/2, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(32, 16), + animation_speed = 1, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/material-fabricator/hr/material-fabricator-shadow.png", + priority = "high", + width = 692, + height = 526, + frame_count = 1, + line_length = 1, + repeat_count = 32, + shift = util.by_pixel(32, 16), + animation_speed = 1, + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-materialisation"}, + crafting_speed = 4, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "250MW", + ingredient_count = 12, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {"pollution"}, -- not "speed", "consumption", "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.8, size = 32, shift = {0.0, 0.0}, color = {r = 1, g = 0.1, b = 0.5}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/pylons.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/pylons.lua new file mode 100644 index 0000000..969f257 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/pylons.lua @@ -0,0 +1,865 @@ +local data_util = require("data_util") + +local blank_image = { + direction_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, +} +local collision_box = { { -0.65, -0.65 }, { 0.65, 0.65 } } +local selection_box = {{-1,-1},{1,1}} +local resistances = { + { type = "fire", percent = 100 }, + { type = "electric", percent = 100 } +} +local collision_mask = { + --"item-layer", -- stops player from dropping items on belts. + "floor-layer", + --"object-layer", + "water-tile", + "player-layer", +} +data:extend({ + { + type = "electric-pole", + name = data_util.mod_prefix .. "addon-power-pole", + supply_area_distance = 0.4, + collision_box = {{-0.2,-0.2},{0.2,0.2}}, + collision_mask = {collision_mask_util_extended.get_make_named_collision_mask("addon-layer")}, + selection_box = {{-0.3,-0.3},{0.3,0.3}}, + selection_priority = 150, + render_layer = "higher-object-above", + connection_points = { + { + shadow = { + copper = { 1.6-0.1, 0.1 }, + green = { 1.6-0.1, 0.1-0.3 }, + red = { 1.6-0.25, 0.1-0.2 } + }, + wire = { + copper = { 0+0.07, -1.2-0.2 }, + green = { 0+0.1, -1.2-0.4 }, + red = { 0-0.15, -1.2-0.3 } + } + }, + }, + corpse = "big-electric-pole-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = { + { -0.5, -2.5 }, + { 0.5, 0.5 } + }, + offsets = { { 0, 1 } }, + type = "create-entity" + }, + drawing_box = { {-0.5,-1.5},{0.5,0.5} }, + dying_explosion = "big-electric-pole-explosion", + fast_replaceable_group = data_util.mod_prefix .. "addon-power-pole", + flags = { + "placeable-neutral", + "player-creation", + "fast-replaceable-no-build-while-moving", + "placeable-off-grid" + }, + icon = "__space-exploration-graphics__/graphics/icons/addon-power-pole.png", + icon_mipmaps = 1, + icon_size = 64, + max_health = 500, + maximum_wire_distance = 9, + minable = { mining_time = 0.1, result = data_util.mod_prefix .. "addon-power-pole" }, + pictures = { + layers = { + data_util.auto_sr_hr({ + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/addon-power-pole/hr/addon-power-pole.png", + width = 64, + height = 128, + shift = { 0, -0.75 }, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/addon-power-pole/hr/addon-power-pole-shadow.png", + width = 128, + height = 64, + shift = { 0.75, 0 }, + scale = 0.5, + }), + } + }, + radius_visualisation_picture = { + filename = "__base__/graphics/entity/small-electric-pole/electric-pole-radius-visualization.png", + height = 12, + priority = "extra-high-no-scale", + width = 12 + }, + resistances = resistances, + vehicle_impact_sound = { + {filename = "__base__/sound/car-metal-impact.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-2.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-3.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-4.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-5.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-6.ogg",volume = 0.5} + }, + water_reflection = { + orientation_to_variation = false, + pictures = { + filename = "__base__/graphics/entity/big-electric-pole/big-electric-pole-reflection.png", + height = 32, + priority = "extra-high", + scale = 5, + shift = {0,1.875}, + variation_count = 1, + width = 16 + }, + rotate = false + }, + }, + { + type = "electric-pole", + name = data_util.mod_prefix .. "pylon", + supply_area_distance = 2, + collision_box = collision_box, + collision_mask = collision_mask, + selection_box = selection_box, + connection_points = { + { + shadow = { + copper = { 1.1-0.1, 0.1 }, + green = { 1.1+0.1, 0.1-0.4 }, + red = { 1.1-0.15, 0.1-0.3 } + }, + wire = { + copper = { 0+0.1, -2.3-0.2 }, + green = { 0+0.2, -2.3-0.5 }, + red = { 0-0.25, -2.3-0.4 } + } + }, + }, + corpse = "big-electric-pole-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = { + { -0.5, -2.5 }, + { 0.5, 0.5 } + }, + offsets = { { 0, 1 } }, + type = "create-entity" + }, + drawing_box = { {-1,-3},{1,0.5} }, + dying_explosion = "big-electric-pole-explosion", + fast_replaceable_group = data_util.mod_prefix .. "pylon", + flags = { + "placeable-neutral", + "player-creation", + "fast-replaceable-no-build-while-moving" + }, + icon = "__space-exploration-graphics__/graphics/icons/pylon.png", + icon_mipmaps = 1, + icon_size = 64, + max_health = 500, + maximum_wire_distance = 64, + minable = { mining_time = 0.1, result = data_util.mod_prefix .. "pylon" }, + pictures = { + layers = { + data_util.auto_sr_hr({ + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/pylon/hr/pylon.png", + width = 128, + height = 256, + shift = { 0, -1.25 }, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/pylon/hr/pylon-shadow.png", + width = 192, + height = 128, + shift = { 0.5, 0 }, + scale = 0.5, + }), + } + }, + radius_visualisation_picture = { + filename = "__base__/graphics/entity/small-electric-pole/electric-pole-radius-visualization.png", + height = 12, + priority = "extra-high-no-scale", + width = 12 + }, + resistances = resistances, + vehicle_impact_sound = { + {filename = "__base__/sound/car-metal-impact.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-2.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-3.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-4.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-5.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-6.ogg",volume = 0.5} + }, + water_reflection = { + orientation_to_variation = false, + pictures = { + filename = "__base__/graphics/entity/big-electric-pole/big-electric-pole-reflection.png", + height = 32, + priority = "extra-high", + scale = 5, + shift = {0,1.875}, + variation_count = 1, + width = 16 + }, + rotate = false + }, + }, + { + type = "electric-pole", + name = data_util.mod_prefix .. "pylon-substation", + supply_area_distance = 32, + collision_box = collision_box, + collision_mask = collision_mask, + selection_box = selection_box, + connection_points = { + { + shadow = { + copper = { 1.1-0.1, 0.1 }, + green = { 1.1+0.1, 0.1-0.4 }, + red = { 1.1-0.15, 0.1-0.3 } + }, + wire = { + copper = { 0+0.1, -2.3-0.2 }, + green = { 0+0.2, -2.3-0.5 }, + red = { 0-0.25, -2.3-0.4 } + } + }, + }, + corpse = "big-electric-pole-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = { + { -0.5, -2.5 }, + { 0.5, 0.5 } + }, + offsets = { { 0, 1 } }, + type = "create-entity" + }, + drawing_box = { {-1,-3},{1,0.5} }, + dying_explosion = "big-electric-pole-explosion", + fast_replaceable_group = data_util.mod_prefix .. "pylon", + flags = { + "placeable-neutral", + "player-creation", + "fast-replaceable-no-build-while-moving" + }, + icon = "__space-exploration-graphics__/graphics/icons/pylon-substation.png", + icon_mipmaps = 1, + icon_size = 64, + max_health = 500, + maximum_wire_distance = 64, + minable = { mining_time = 0.1, result = data_util.mod_prefix .. "pylon-substation" }, + pictures = { + layers = { + data_util.auto_sr_hr({ + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/pylon-substation/hr/pylon-substation.png", + width = 128, + height = 256, + shift = { 0, -1.25 }, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/pylon-substation/hr/pylon-substation-shadow.png", + width = 192, + height = 128, + shift = { 0.5, 0 }, + scale = 0.5, + }), + } + }, + radius_visualisation_picture = { + filename = "__base__/graphics/entity/small-electric-pole/electric-pole-radius-visualization.png", + height = 12, + priority = "extra-high-no-scale", + width = 12 + }, + resistances = resistances, + vehicle_impact_sound = { + {filename = "__base__/sound/car-metal-impact.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-2.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-3.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-4.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-5.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-6.ogg",volume = 0.5} + }, + water_reflection = { + orientation_to_variation = false, + pictures = { + filename = "__base__/graphics/entity/big-electric-pole/big-electric-pole-reflection.png", + height = 32, + priority = "extra-high", + scale = 5, + shift = {0,1.875}, + variation_count = 1, + width = 16 + }, + rotate = false + }, + }, + { + type = "electric-pole", + name = data_util.mod_prefix .. "pylon-construction", + placeable_by = {item = data_util.mod_prefix .. "pylon-construction", count=1}, + minable = { mining_time = 0.1, result = data_util.mod_prefix .. "pylon-construction" }, + supply_area_distance = 2, + collision_mask = {"not-colliding-with-itself"}, + collision_box = collision_box, + selection_box = selection_box, + connection_points = { + { + shadow = { + copper = { 1.1-0.1+0.1, 0.1 }, + green = { 1.1+0.1, 0.1-0.4 }, + red = { 1.1-0.15, 0.1-0.3 } + }, + wire = { + copper = { 0+0.1+0.1, -2.3-0.2+0.3}, + green = { 0+0.2+0.1, -2.3-0.5 }, + red = { 0-0.25-0.3, -2.3-0.4+0.1 } + } + }, + }, + corpse = "big-electric-pole-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = { + { -0.5, -2.5 }, + { 0.5, 0.5 } + }, + offsets = { { 0, 1 } }, + type = "create-entity" + }, + drawing_box = { {-1,-3},{1,0.5} }, + dying_explosion = "big-electric-pole-explosion", + flags = { + "placeable-neutral", + "player-creation", + "fast-replaceable-no-build-while-moving", + --"not-blueprintable", + "not-deconstructable" + }, + icon = "__space-exploration-graphics__/graphics/icons/pylon-construction.png", + icon_mipmaps = 1, + icon_size = 64, + max_health = 500, + maximum_wire_distance = 64, + pictures = { + layers = { + blank_image + } + }, + radius_visualisation_picture = { + filename = "__base__/graphics/entity/small-electric-pole/electric-pole-radius-visualization.png", + height = 12, + priority = "extra-high-no-scale", + width = 12 + }, + resistances = resistances, + vehicle_impact_sound = { + {filename = "__base__/sound/car-metal-impact.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-2.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-3.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-4.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-5.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-6.ogg",volume = 0.5} + }, + water_reflection = { + orientation_to_variation = false, + pictures = { + filename = "__base__/graphics/entity/big-electric-pole/big-electric-pole-reflection.png", + height = 32, + priority = "extra-high", + scale = 5, + shift = {0,1.875}, + variation_count = 1, + width = 16 + }, + rotate = false + }, + }, + { + type = "roboport", + name = data_util.mod_prefix .. "pylon-construction-roboport", + placeable_by = {item = data_util.mod_prefix .. "pylon-construction", count=1}, + selectable_in_game = false, + minable = { mining_time = 0.1, result = data_util.mod_prefix .. "pylon-construction" }, + logistics_radius = 0, + logistics_connection_distance = 32, + material_slots_count = 0, + robot_slots_count = 0, + construction_radius = 32, + icon = "__space-exploration-graphics__/graphics/icons/pylon-construction.png", + icon_mipmaps = 1, + icon_size = 64, + fast_replaceable_group = data_util.mod_prefix .. "pylon", + base = blank_image, + base_animation = { + layers = { + data_util.auto_sr_hr({ + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/pylon-construction/hr/pylon-construction.png", + width = 128, + height = 256, + frame_count = 32, + shift = { 0, -1.25 }, + scale = 0.5, + line_length = 16, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/pylon-construction/hr/pylon-construction-shadow.png", + width = 192, + height = 128, + frame_count = 32, + shift = { 0.5, 0 }, + scale = 0.5, + line_length = 2, + }), + } + }, + base_patch = blank_image, + charge_approach_distance = 5, + charging_energy = "10MW", + charging_offsets = { + settings.startup["se-pylon-charge-points"].value and {0, 1.5} or nil + }, + circuit_connector_sprites = nil, + circuit_wire_connection_point = nil, + circuit_wire_max_distance = 0, + collision_box = collision_box, + collision_mask = collision_mask, + selection_box = selection_box, + corpse = "roboport-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = {{-0.5,-0.5},{0.5,0.5}}, + offsets = {{0,1}}, + type = "create-entity" + }, + door_animation_down = blank_image, + door_animation_up = blank_image, + draw_construction_radius_visualization = true, + draw_logistic_radius_visualization = true, + dying_explosion = "roboport-explosion", + energy_source = { + buffer_capacity = "100MJ", + input_flow_limit = "10MW", + type = "electric", + usage_priority = "secondary-input" + }, + energy_usage = "10kW", + flags = { + "placeable-neutral", + "player-creation", + "fast-replaceable-no-build-while-moving" + }, + max_health = 500, + recharge_minimum = "40MJ", + recharging_animation = { + animation_speed = 0.5, + filename = "__base__/graphics/entity/roboport/roboport-recharging.png", + frame_count = 16, + height = 35, + priority = "high", + scale = 1.5, + width = 37 + }, + recharging_light = { + color = { + b = 1, + g = 1, + r = 1 + }, + intensity = 0.4, + size = 5 + }, + request_to_open_door_timeout = 15, + resistances = resistances, + spawn_and_station_height = -0.1, + stationing_offset = {0,0}, + vehicle_impact_sound = { + { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-2.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-3.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-4.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-5.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-6.ogg", + volume = 0.5 + } + }, + water_reflection = { + orientation_to_variation = false, + pictures = { + filename = "__base__/graphics/entity/roboport/roboport-reflection.png", + height = 28, + priority = "extra-high", + scale = 5, + shift = { + 0, + 2.34375 + }, + variation_count = 1, + width = 28 + }, + rotate = false + }, + working_sound = { + audible_distance_modifier = 0.5, + max_sounds_per_type = 3, + probability = 0.0033333333, + sound = { + filename = "__base__/sound/roboport-working.ogg", + volume = 0.6 + } + } + }, + { + type = "electric-pole", + name = data_util.mod_prefix .. "pylon-construction-radar", + placeable_by = {item = data_util.mod_prefix .. "pylon-construction-radar", count=1}, + minable = { mining_time = 0.1, result = data_util.mod_prefix .. "pylon-construction-radar" }, + collision_mask = {"not-colliding-with-itself"}, + supply_area_distance = 32, + collision_box = collision_box, + selection_box = selection_box, + connection_points = { + { + shadow = { + copper = { 1.1-0.1+0.1, 0.1 }, + green = { 1.1+0.1, 0.1-0.4 }, + red = { 1.1-0.15, 0.1-0.3 } + }, + wire = { + copper = { 0+0.1+0.1, -2.3-0.2+0.3}, + green = { 0+0.2+0.1, -2.3-0.5 }, + red = { 0-0.25-0.3, -2.3-0.4+0.1 } + } + }, + }, + corpse = "big-electric-pole-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = { + { -0.5, -2.5 }, + { 0.5, 0.5 } + }, + offsets = { { 0, 1 } }, + type = "create-entity" + }, + drawing_box = { {-1,-3},{1,0.5} }, + dying_explosion = "big-electric-pole-explosion", + flags = { + "placeable-neutral", + "player-creation", + "fast-replaceable-no-build-while-moving", + --"not-blueprintable", + "not-deconstructable" + }, + icon = "__space-exploration-graphics__/graphics/icons/pylon-construction-radar.png", + icon_mipmaps = 1, + icon_size = 64, + max_health = 500, + maximum_wire_distance = 64, + pictures = { + layers = { + blank_image + } + }, + radius_visualisation_picture = { + filename = "__base__/graphics/entity/small-electric-pole/electric-pole-radius-visualization.png", + height = 12, + priority = "extra-high-no-scale", + width = 12 + }, + resistances = resistances, + vehicle_impact_sound = { + {filename = "__base__/sound/car-metal-impact.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-2.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-3.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-4.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-5.ogg",volume = 0.5}, + {filename = "__base__/sound/car-metal-impact-6.ogg",volume = 0.5} + }, + water_reflection = { + orientation_to_variation = false, + pictures = { + filename = "__base__/graphics/entity/big-electric-pole/big-electric-pole-reflection.png", + height = 32, + priority = "extra-high", + scale = 5, + shift = {0,1.875}, + variation_count = 1, + width = 16 + }, + rotate = false + }, + }, + { + type = "roboport", + name = data_util.mod_prefix .. "pylon-construction-radar-roboport", + placeable_by = {item = data_util.mod_prefix .. "pylon-construction-radar", count=1}, + selectable_in_game = false, + minable = { mining_time = 0.1, result = data_util.mod_prefix .. "pylon-construction-radar" }, + logistics_radius = 2, + logistics_connection_distance = 32, + material_slots_count = 0, + robot_slots_count = 0, + construction_radius = 128, + icon = "__space-exploration-graphics__/graphics/icons/pylon-construction-radar.png", + icon_mipmaps = 1, + icon_size = 64, + fast_replaceable_group = data_util.mod_prefix .. "pylon", + base = blank_image, + base_animation = { + layers = { + data_util.auto_sr_hr({ + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/pylon-construction-radar/hr/pylon-construction-radar.png", + width = 128, + height = 256, + frame_count = 32, + shift = { 0, -1.25 }, + scale = 0.5, + line_length = 16, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/pylon-construction-radar/hr/pylon-construction-radar-shadow.png", + width = 192, + height = 128, + frame_count = 32, + shift = { 0.5, 0 }, + scale = 0.5, + line_length = 2, + }), + } + }, + base_patch = blank_image, + charge_approach_distance = 5, + charging_energy = "10MW", + charging_offsets = { + settings.startup["se-pylon-charge-points"].value and {0, 1.5} or nil + }, + circuit_connector_sprites = nil, + circuit_wire_connection_point = nil, + circuit_wire_max_distance = 0, + collision_box = collision_box, + collision_mask = collision_mask, + selection_box = selection_box, + corpse = "roboport-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = {{-0.5,-0.5},{0.5,0.5}}, + offsets = {{0,1}}, + type = "create-entity" + }, + door_animation_down = blank_image, + door_animation_up = blank_image, + draw_construction_radius_visualization = true, + draw_logistic_radius_visualization = true, + dying_explosion = "roboport-explosion", + energy_source = { + buffer_capacity = "100MJ", + input_flow_limit = "10MW", + type = "electric", + usage_priority = "secondary-input" + }, + energy_usage = "100kW", + flags = { + "placeable-neutral", + "player-creation", + "fast-replaceable-no-build-while-moving" + }, + max_health = 500, + recharge_minimum = "40MJ", + recharging_animation = { + animation_speed = 0.5, + filename = "__base__/graphics/entity/roboport/roboport-recharging.png", + frame_count = 16, + height = 35, + priority = "high", + scale = 1.5, + width = 37 + }, + recharging_light = { + color = { + b = 1, + g = 1, + r = 1 + }, + intensity = 0.4, + size = 5 + }, + request_to_open_door_timeout = 15, + resistances = resistances, + spawn_and_station_height = -0.1, + stationing_offset = {0,0}, + vehicle_impact_sound = { + { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-2.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-3.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-4.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-5.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-6.ogg", + volume = 0.5 + } + }, + water_reflection = { + orientation_to_variation = false, + pictures = { + filename = "__base__/graphics/entity/roboport/roboport-reflection.png", + height = 28, + priority = "extra-high", + scale = 5, + shift = { + 0, + 2.34375 + }, + variation_count = 1, + width = 28 + }, + rotate = false + }, + working_sound = { + audible_distance_modifier = 0.5, + max_sounds_per_type = 3, + probability = 0.0033333333, + sound = { + filename = "__base__/sound/roboport-working.ogg", + volume = 0.6 + } + } + }, + { + type = "radar", + name = data_util.mod_prefix .. "pylon-construction-radar-radar", + placeable_by = {item = data_util.mod_prefix .. "pylon-construction-radar", count=1}, + selectable_in_game = false, + max_distance_of_nearby_sector_revealed = 5, + max_distance_of_sector_revealed = 5, + collision_box = collision_box, + selection_box = selection_box, + collision_mask = {"not-colliding-with-itself"}, + corpse = "radar-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = {{-0.5,-0.5},{0.5,0.5}}, + offsets = {{0,1}}, + type = "create-entity" + }, + dying_explosion = "radar-explosion", + energy_per_nearby_scan = "10MJ", + energy_per_sector = "10MJ", + energy_source = { + type = "electric", + usage_priority = "secondary-input" + }, + energy_usage = "1MW", + flags = { + "placeable-neutral", + "not-blueprintable", + "not-deconstructable" + }, + icon = "__space-exploration-graphics__/graphics/icons/pylon-construction-radar.png", + icon_mipmaps = 1, + icon_size = 64, + max_health = 500, + pictures = { + layers = { + blank_image + } + }, + radius_minimap_visualisation_color = { + a = 0.275, + b = 0.235, + g = 0.092, + r = 0.059 + }, + resistances = resistances, + rotation_speed = 0.01, + vehicle_impact_sound = { + { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-2.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-3.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-4.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-5.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-6.ogg", + volume = 0.5 + } + }, + working_sound = { + apparent_volume = 2, + sound = { + { + filename = "__base__/sound/radar.ogg" + } + } + } + } + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/recycle-mechanical.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/recycle-mechanical.lua new file mode 100644 index 0000000..95f296f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/recycle-mechanical.lua @@ -0,0 +1,483 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "recycling-facility", + icon = "__space-exploration-graphics__/graphics/icons/recycling-facility.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "recycling-facility"}, + max_health = 1200, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-3.3, -3.3}, {3.3, 3.3}}, + selection_box = {{-3.5, -3.5}, {3.5, 3.5}}, + drawing_box = {{-3.5, -3.9}, {3.5, 3.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/burner-mining-drill.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + --"ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/recycling-facility/sr/recycling-facility.png", + priority = "high", + width = 3840/8/2, + height = 3584/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(-8, 0), + animation_speed = 0.75, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/recycling-facility/hr/recycling-facility.png", + priority = "high", + width = 3840/8, + height = 3584/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(-8, 0), + animation_speed = 0.75, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/recycling-facility/sr/recycling-facility-shadow.png", + priority = "high", + width = 694/2, + height = 400/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(59, 17), + animation_speed = 0.75, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/recycling-facility/hr/recycling-facility-shadow.png", + priority = "high", + width = 694, + height = 400, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(59, 17), + animation_speed = 0.75, + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"hand-hard-recycling", "hard-recycling"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "100kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 18, shift = {0.0, 0.0}, color = {r = 0.8, g = 1, b = 0.5}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-mechanical-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/mechanical-laboratory.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-mechanical-laboratory"}, + max_health = 1200, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-3.3, -3.3}, {3.3, 3.3}}, + selection_box = {{-3.5, -3.5}, {3.5, 3.5}}, + drawing_box = {{-3.5, -3.9}, {3.5, 3.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/burner-mining-drill.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/mechanical-laboratory/sr/mechanical-laboratory.png", + priority = "high", + width = 3840/8/2, + height = 3584/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(-8, 0), + animation_speed = 0.75, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/mechanical-laboratory/hr/mechanical-laboratory.png", + priority = "high", + width = 3840/8, + height = 3584/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(-8, 0), + animation_speed = 0.75, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/mechanical-laboratory/sr/mechanical-laboratory-shadow.png", + priority = "high", + width = 694/2, + height = 400/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(59, 17), + animation_speed = 0.75, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/mechanical-laboratory/hr/mechanical-laboratory-shadow.png", + priority = "high", + width = 694, + height = 400, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(59, 17), + animation_speed = 0.75, + scale = 0.5, + } + }, + }, + }, + crafting_categories = { + "space-mechanical", + "pulverising" + }, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "200kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.8, size = 18, shift = {0.0, 0.0}, color = {r = 1, g = 0.8, b = 0.5}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "pulveriser", + icon = "__space-exploration-graphics__/graphics/icons/pulveriser.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "pulveriser"}, + max_health = 1200, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-3.3, -3.3}, {3.3, 3.3}}, + selection_box = {{-3.5, -3.5}, {3.5, 3.5}}, + drawing_box = {{-3.5, -3.9}, {3.5, 3.5}}, + resistances = + { + { + type = "impact", + percent = 30 + } + }, + fluid_boxes = + { + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, -4} }}, + --secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {-4, 0} }}, + --secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 4} }}, + --secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {4, 0} }}, + --secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/burner-mining-drill.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/pulveriser/sr/pulveriser.png", + priority = "high", + width = 3840/8/2, + height = 3584/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(-8, 0), + animation_speed = 0.35, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/pulveriser/hr/pulveriser.png", + priority = "high", + width = 3840/8, + height = 3584/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(-8, 0), + animation_speed = 0.35, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/pulveriser/sr/pulveriser-shadow.png", + priority = "high", + width = 694/2, + height = 400/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(59, 17), + animation_speed = 0.35, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/pulveriser/hr/pulveriser-shadow.png", + priority = "high", + width = 694, + height = 400, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(59, 17), + animation_speed = 0.35, + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"pulverising", "core-fragment-processing"}, + crafting_speed = 2, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "500kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution", "productivity"}, -- allow "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.8, size = 18, shift = {0.0, 0.0}, color = {r = 1, g = 0.8, b = 0.5}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/resource-autoplace.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/resource-autoplace.lua new file mode 100644 index 0000000..1f3de6b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/resource-autoplace.lua @@ -0,0 +1,372 @@ +local noise = require("noise") +local expression_to_ascii_math = require("noise.expression-to-ascii-math") +local tne = noise.to_noise_expression +local litexp = noise.literal_expression + +local starting_resource_count = 7 +local regular_resource_count = 9 -- add oil and uranium + +next_resource_index = 0 +function get_next_resource_index() + local resource_index = next_resource_index + next_resource_index = next_resource_index + 1 + return resource_index +end + +local pointillist_mode = false +local patch_blobbiness_enabled = true + +local function dump_expression(name, expr) + log(name..":\n"..tostring(expression_to_ascii_math(expr))) +end + +local onethird = tne(1)/3 -- Looks nicer in output than 0.333333 + +local resource_indexes = { + ["iron-ore"] = 0, + ["copper-ore"] = 1, + ["coal"] = 2, + ["stone"] = 3, + ["crude-oil"] = 4, + ["uranium-ore"] = 5, + ["se-water-ice"] = 6, + ["se-methane-ice"] = 7, +} + +local function resource_autoplace_settings(params) + local name = params.name + local order = params.order or "d" + -- How much of this stuff (probability * richness) should occur per tile on average near the starting area? + local base_density = params.base_density + -- Random probability that this stuff is placed when probability is otherwise positive + -- This IS automatically compensated for by richness, so you don't need to adjust base_density + local random_probability = params.random_probability or 1 + local base_spots_per_km2 = params.base_spots_per_km2 or 2.5 + local random_spot_size_minimum = params.random_spot_size_minimum or 0.25 + local random_spot_size_maximum = params.random_spot_size_maximum or 2.00 + -- Amplitude of spot 'blob noise' relative to typical spot amplitude + local regular_blob_amplitude_multiplier = 1/8 * (params.regular_blob_amplitude_multiplier or 1) + local starting_blob_amplitude_multiplier = 1/8 * (params.starting_blob_amplitude_multiplier or 1) + + local control_setting = noise.get_control_setting(name) + local frequency_multiplier = control_setting.frequency_multiplier + local size_multiplier = control_setting.size_multiplier + local density_multiplier = frequency_multiplier * size_multiplier + + -- The following are more dangerous, since they'll throw total quantities off if you don't compensate for them: + + -- additional_richness will be added to richness but does not affect probability of anything being placed at all. + -- This is NOT automatically compensated for, because that would be difficult to calculate. + -- The caller will need to compensate for any additional_richness by adjusting base_density. + local additional_richness = params.additional_richness or 0 + -- richness will be clamped to minimum_richness at the low end anywhere the stuff is otherwise placed + -- Not automatically compensated for. + local minimum_richness = params.minimum_richness or 0 + -- 'post' as in multiplied after everything else is calculated, including additional_richness + -- and minimum_richness. + local richness_post_multiplier = (params.richness_post_multiplier or 1) * control_setting.richness_multiplier + + local seed1 = 100 + + -- rq_factor is the ratio of the radius of a patch to the cube root of its quantity, + -- i.e. radius of a quantity=1 patch; higher values = fatter, shallower patches + -- Watch out! Shallower patches are more heavily thrown off by noise, + -- so adjust noise amplitude accordingly! + -- (this is automatically done -- se *_blob_amplitude, below) + local regular_rq_factor = (params.regular_rq_factor_multiplier or 1) * 1 / 10 + local starting_rq_factor = (params.starting_rq_factor_multiplier or 1) * 1 / 7 + + local elevation = noise.var("elevation") + local distance = noise.var("distance") + + -- > I just realized because of the new rule of "keep ores outside the + -- > starting area", the starting area size setting should not affect ore + -- > placement. The ore's starting area should be it's own fixed value + -- > that ignores the setting. + -- Twinsen, August 2018 + local starting_resource_placement_radius = 120 + local regular_modulation + -- has_starting_area_placement values: + -- - true - place in starting area and outside starting area independently + -- - false - place outside starting area but not inside + -- - nil - place everywhere as if there is no starting area + + local regular_patch_fade_in_distance = 300 + local regular_ns_multiplier_at + if params.has_starting_area_placement == nil then + regular_ns_multiplier_at = function(dist) return 1 end + else + regular_ns_multiplier_at = function(dist) + return noise.clamp((dist - starting_resource_placement_radius) / regular_patch_fade_in_distance, 0, 1) + end + end + local double_density_distance = 1300 -- distance at which patches have twice as much stuff in them + + -- Maximum distance at which blob amplitude should keep increasing along with spot height + local regular_blob_amplitude_maximum_distance = double_density_distance + local spot_enlargement_maximum_distance = regular_blob_amplitude_maximum_distance + + -- Get distance for purposes of calculating regular ore density, patch size, and richness + local function size_effective_distance_at(dist) + if params.has_starting_area_placement == nil then + return dist + else + -- If there's a starting area measure from the edge of the fade-in radius + return dist - regular_patch_fade_in_distance + end + end + + local function regular_density_at(dist) + -- Don't increase density beyond spot_enlargement_maximum_distance + -- because large spots get unwieldy. We'll increase richness after that, instead. + effective_distance = noise.clamp(size_effective_distance_at(dist), 0, spot_enlargement_maximum_distance) + local distance_density_multiplier = 1 + effective_distance / double_density_distance + return base_density * density_multiplier * distance_density_multiplier * regular_ns_multiplier_at(dist) + end + local spots_per_km2_near_start = base_spots_per_km2 * frequency_multiplier + local candidate_point_count = tne(128) + + if pointillist_mode then + -- Split ore into lots and lots and lots of little patches + -- so that we can get a better idea of the underlying distribution + candidate_point_count = 10000 -- hardcoded max so we don't melt the player's CPU + spots_per_km2_near_start = candidate_point_count / regular_resource_count + end + + -- Regular spot quantity without randomization added + local function regular_spot_quantity_base_at(dist) + return regular_density_at(dist) * 1000000 / spots_per_km2_near_start + end + -- Regular spot quantity averaging over randomization + local function regular_spot_quantity_typical_at(dist) + local average_random_size_multiplier = (random_spot_size_minimum + random_spot_size_maximum) / 2 + return average_random_size_multiplier * regular_spot_quantity_base_at(dist) + end + local function regular_spot_height_typical_at(dist) + return regular_spot_quantity_typical_at(dist)^(onethird) / ((math.pi/3) * regular_rq_factor^2) + end + + local regular_density_expression = regular_density_at(distance) + local regular_spot_quantity_expression = noise.random_between(random_spot_size_minimum, random_spot_size_maximum) * regular_spot_quantity_base_at(distance) + local regular_spot_radius_expression = noise.min(32, regular_rq_factor * regular_spot_quantity_expression ^ (onethird)) + + if params.has_starting_area_placement ~= nil then + regular_blob_amplitude_maximum_distance = regular_blob_amplitude_maximum_distance + regular_patch_fade_in_distance + end + local function regular_blob_amplitude_at(dist) + return regular_blob_amplitude_multiplier * noise.min( + regular_spot_height_typical_at(regular_blob_amplitude_maximum_distance), + regular_spot_height_typical_at(dist) + ) + end + local regular_blob_amplitude_maximum = regular_blob_amplitude_at(regular_blob_amplitude_maximum_distance) + local regular_blob_amplitude_expression = regular_blob_amplitude_at(distance) + + -- Values for starting spots. + -- Simpler calculations than for regular spots because they are only placed + -- in one place and therefore there are fewer variables! + + -- reduce the influence of the frequency slider over the amount of ore in the starting area. + -- note that starting_spot_count is still set to frequency_multiplier below, so we still split the ore to a fairly high amount of patches.s. + local starting_frequency_multiplier = ((frequency_multiplier - 1) * 0.5) + 1 + local starting_amount = 40000 * base_density * starting_frequency_multiplier * size_multiplier + --local starting_amount = 1000000 -- nicer for testing - just check that all spots have ~1.0M + local starting_area_sharpness = tne(math.huge) + local starting_resource_placement_area = math.pi*starting_resource_placement_radius*starting_resource_placement_radius + local starting_density = starting_amount / starting_resource_placement_area + -- Goes < 0 outside of starting area and at negative elevations + local starting_modulation = + noise.clamp((starting_resource_placement_radius - distance) * starting_area_sharpness, 0, 1) + local starting_feasibility = + noise.clamp((elevation - 1) / 10, 0, 1) * starting_modulation + -- Allow resources at lower elevations for starting + + -- Set minimum_favorability_for_full_placement to lower numbers to decrease the likelihood that the starting patches get split. + -- Quantity will automatically be clamped by the spot noise function + -- and radius will be automatically adjusted, too, + -- so it's fine for the spot quantity to be more than the region target quantity. + local minimum_favorability_for_full_placement = 1/2 + local starting_spot_count = frequency_multiplier + local starting_area_spot_quantity = starting_amount / minimum_favorability_for_full_placement / starting_spot_count + local starting_spot_height = starting_area_spot_quantity ^ (1/3) / ((math.pi/3) * starting_rq_factor^2) + local starting_blob_amplitude = starting_blob_amplitude_multiplier * starting_spot_height + + -- since starting and regular spots get maxed together, + -- the basement value should be the lower of the two. + -- This value needs to be low enough that any noise added to it is still below zero + -- so that we don't get bits of ores sticking out between spot noise spots. + -- It also needs to be constant because that's how the spot noise op works. + -- Simply using -infinity would work, but calculating it based on blob amplitude: + -- a) looks nicer if you render the value on a map preview + -- b) acts as a check on our blob_amplitude calculations + local basement_value = noise.min(-6 * regular_blob_amplitude_maximum, + -6 * starting_blob_amplitude) + + local regular_spots = tne{ + type = "function-application", + function_name = "spot-noise", + arguments = + { + x = noise.var("x"), + y = noise.var("y"), + seed0 = noise.var("map_seed"), + seed1 = tne(seed1), + region_size = tne(1024), + candidate_point_count = tne(candidate_point_count), + skip_span = tne(regular_resource_count), + skip_offset = tne(params.resource_index or 0), + density_expression = litexp(regular_density_expression), -- low-frequency noise evaluate for an entire region + spot_quantity_expression = litexp(regular_spot_quantity_expression), -- used to figure out where spots go + hard_region_target_quantity = tne(false), -- it's fine for large spots to push region quantity past the target + spot_radius_expression = litexp(regular_spot_radius_expression), + spot_favorability_expression = litexp(1), + basement_value = basement_value, + maximum_spot_basement_radius = tne(128) + } + } + + -- If you change starting area region size, + -- also change the default starting area position in MapGenSettings + local starting_spots = tne{ + type = "function-application", + function_name = "spot-noise", + arguments = + { + x = noise.var("x"), + y = noise.var("y"), + seed0 = noise.var("map_seed"), + seed1 = tne(seed1+1), + skip_span = tne(starting_resource_count), + skip_offset = tne(params.resource_index or 0), + region_size = tne(starting_resource_placement_radius * 2), + candidate_point_count = tne(128), + minimum_candidate_point_spacing = tne(32), + density_expression = litexp(starting_density * starting_modulation), + spot_quantity_expression = litexp(starting_area_spot_quantity), + hard_region_target_quantity = tne(true), -- Since there's [usually] only one spot, clamp its quantity to the target quantity + spot_radius_expression = litexp(starting_rq_factor * starting_area_spot_quantity ^ (onethird)), + spot_favorability_expression = litexp( + starting_feasibility * 2 - + 1 * distance / starting_resource_placement_radius + + noise.random(0.5) + ), + basement_value = basement_value, + maximum_spot_basement_radius = tne(128) -- does making this huge make a difference? + } + } + + if pointillist_mode or not patch_blobbiness_enabled then + regular_blob_amplitude_expression = 0 + end + if not patch_blobbiness_enabled then + starting_blob_amplitude = 0 + end + + -- Add some blobbiness + local blobs0 = tne{ + type = "function-application", + function_name = "factorio-basis-noise", + arguments = + { + x = noise.var("x"), + y = noise.var("y"), + seed0 = noise.var("map_seed"), + seed1 = tne(seed1), + input_scale = tne(1/8), + output_scale = tne(1) + } + } + tne{ + type = "function-application", + function_name = "factorio-basis-noise", + arguments = + { + x = noise.var("x"), + y = noise.var("y"), + seed0 = noise.var("map_seed"), + seed1 = tne(seed1), + input_scale = tne(1/24), + output_scale = tne(1) + } + } + local blobs0f = blobs0 - 1/4 + + local blobs1 = blobs0 + tne{ + type = "function-application", + function_name = "factorio-basis-noise", + arguments = + { + x = noise.var("x"), + y = noise.var("y"), + seed0 = noise.var("map_seed"), + seed1 = tne(seed1), + input_scale = tne(1/64), + output_scale = tne(1.5) + } + } + local blobs1f = blobs1 - onethird -- attempt to remove positive bias + + local regular_patches = regular_spots + blobs1f * regular_blob_amplitude_expression + local starting_patches = starting_spots + blobs0f * starting_blob_amplitude + + local all_patches + if params.has_starting_area_placement == true then + all_patches = noise.max(starting_patches, regular_patches) + elseif params.has_starting_area_placement == false then + all_patches = regular_patches + else -- nil or unspecified means just make it uniform everywhere + all_patches = regular_patches + end + + local richness_expression = noise.delimit_procedure(all_patches) -- Re-use all that stuff between richness/probability! + local probability_expression = noise.clamp(richness_expression, 0, 1) + if random_probability < 1 then + richness_expression = richness_expression / random_probability + probability_expression = probability_expression * tne{ + type = "function-application", + function_name = "random-penalty", + arguments = + { + source = tne(1), + x = noise.var("x"), + y = noise.var("y"), + amplitude = tne(1/random_probability) -- put random_probability points with probability < 0 + } + } + end + if additional_richness > 0 then + richness_expression = richness_expression + additional_richness + end + if minimum_richness > 0 then + richness_expression = noise.max(richness_expression, minimum_richness) + end + + -- sed = size-effective distance + local function post_semd_richness_distance_multiplier_at(sed) + local ddd = double_density_distance + local semd = spot_enlargement_maximum_distance + -- density = pre-richness-mutliplied density * richness_distance_multiplier. + -- Since pre-richness-multiplied density plateaus at semd, + -- richness needs to increase at that point, and by this much: + return (ddd + sed)/(ddd + semd) + end + local richness_distance_multiplier = noise.max(1, post_semd_richness_distance_multiplier_at(size_effective_distance_at(distance))) + + richness_expression = richness_expression * richness_distance_multiplier * richness_post_multiplier + + local ret = + { + order = order, + control = name, + probability_expression = probability_expression, + richness_expression = richness_expression + } + + return ret +end + +return +{ + get_next_resource_index = get_next_resource_index, + resource_indexes = resource_indexes, + resource_autoplace_settings = resource_autoplace_settings +} diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/resources.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/resources.lua new file mode 100644 index 0000000..4657981 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/resources.lua @@ -0,0 +1,533 @@ +local data_util = require("data_util") +local noise = require("noise"); +local tne = noise.to_noise_expression; +local resource_autoplace = require("resource-autoplace"); + +data:extend({ + { + type = "resource", + name = data_util.mod_prefix.."water-ice", + icon = "__space-exploration-graphics__/graphics/icons/water-ice.png", + icon_size = 64, + flags = {"placeable-neutral"}, + order="a-b-e", + tree_removal_probability = 0.8, + tree_removal_max_distance = 32 * 32, + minable = + { + mining_particle = "stone-particle", + mining_time = 1, + result = data_util.mod_prefix.."water-ice", + }, + collision_box = {{ -0.1, -0.1}, {0.1, 0.1}}, + selection_box = {{ -0.5, -0.5}, {0.5, 0.5}}, + autoplace = { -- real distribution set in stage 3 + control = data_util.mod_prefix.."water-ice", + tile_restriction = {data_util.mod_prefix.."asteroid"} + }, + stage_counts = {15000, 9500, 5500, 2900, 1300, 400, 150, 80}, + stages = + { + sheet = + { + filename = "__space-exploration-graphics__/graphics/entity/water-ice/water-ice.png", + priority = "extra-high", + size = 64, + frame_count = 8, + variation_count = 8, + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/water-ice/hr-water-ice.png", + priority = "extra-high", + size = 128, + frame_count = 8, + variation_count = 8, + scale = 0.5 + } + } + }, + map_color = {r = 198/255, g = 241/255, b = 245/255} + }, + { + type = "resource", + name = data_util.mod_prefix.."methane-ice", + icon = "__space-exploration-graphics__/graphics/icons/methane-ice.png", + icon_size = 64, + flags = {"placeable-neutral"}, + order="a-b-e", + tree_removal_probability = 0.8, + tree_removal_max_distance = 32 * 32, + minable = + { + mining_particle = "stone-particle", + mining_time = 1, + result = data_util.mod_prefix.."methane-ice", + }, + collision_box = {{ -0.1, -0.1}, {0.1, 0.1}}, + selection_box = {{ -0.5, -0.5}, {0.5, 0.5}}, + autoplace = { -- real distribution set in stage 3 + control = data_util.mod_prefix.."methane-ice", + tile_restriction = {data_util.mod_prefix.."asteroid"} + }, + stage_counts = {15000, 9500, 5500, 2900, 1300, 400, 150, 80}, + stages = + { + sheet = + { + filename = "__space-exploration-graphics__/graphics/entity/methane-ice/methane-ice.png", + priority = "extra-high", + size = 64, + frame_count = 8, + variation_count = 8, + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/methane-ice/hr-methane-ice.png", + priority = "extra-high", + size = 128, + frame_count = 8, + variation_count = 8, + scale = 0.5 + } + } + }, + map_color = {r = 245/255, g = 231/255, b = 198/255} + }, + { + type = "resource", + name = data_util.mod_prefix.."beryllium-ore", + icon = "__space-exploration-graphics__/graphics/icons/beryllium-ore.png", + icon_size = 64, + flags = {"placeable-neutral"}, + order="a-b-e", + tree_removal_probability = 0.8, + tree_removal_max_distance = 32 * 32, + minable = + { + mining_particle = "stone-particle", + mining_time = 4, + result = data_util.mod_prefix.."beryllium-ore", + }, + collision_box = {{ -0.1, -0.1}, {0.1, 0.1}}, + selection_box = {{ -0.5, -0.5}, {0.5, 0.5}}, + autoplace = { -- real distribution set in stage 3 + control = data_util.mod_prefix.."beryllium-ice" + }, + stage_counts = {15000, 9500, 5500, 2900, 1300, 400, 150, 80}, + stages = + { + sheet = + { + filename = "__space-exploration-graphics__/graphics/entity/beryllium-ore/beryllium-ore.png", + priority = "extra-high", + size = 64, + frame_count = 8, + variation_count = 8, + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/beryllium-ore/hr-beryllium-ore.png", + priority = "extra-high", + size = 128, + frame_count = 8, + variation_count = 8, + scale = 0.5 + } + } + }, + map_color = {r = 144/255, g = 222/255, b = 184/255} + }, + { + type = "resource", + name = data_util.mod_prefix.."cryonite", + icon = "__space-exploration-graphics__/graphics/icons/cryonite.png", + icon_size = 64, + flags = {"placeable-neutral"}, + order="a-b-e", + tree_removal_probability = 0.8, + tree_removal_max_distance = 32 * 32, + minable = + { + mining_particle = "stone-particle", + mining_time = 2, + result = data_util.mod_prefix.."cryonite", + }, + collision_box = {{ -0.1, -0.1}, {0.1, 0.1}}, + selection_box = {{ -0.5, -0.5}, {0.5, 0.5}}, + autoplace = { -- real distribution set in stage 3 + control = data_util.mod_prefix.."cryonite", + tile_restriction = alien_biomes.list_tiles(alien_biomes.require_tag(alien_biomes.all_tiles(), {"frozen"})), -- was just snow but too unpredicatable + }, + stage_counts = {15000, 9500, 5500, 2900, 1300, 400, 150, 80}, + stages = + { + sheet = + { + filename = "__space-exploration-graphics__/graphics/entity/cryonite/cryonite.png", + priority = "extra-high", + size = 64, + frame_count = 8, + variation_count = 8, + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/cryonite/hr-cryonite.png", + priority = "extra-high", + size = 128, + frame_count = 8, + variation_count = 8, + scale = 0.5 + } + } + }, + stages_effect = { + sheet = { + blend_mode = "additive", + filename = "__space-exploration-graphics__/graphics/entity/cryonite/cryonite-glow.png", + flags = { + "light" + }, + frame_count = 8, + height = 64, + hr_version = { + blend_mode = "additive", + filename = "__space-exploration-graphics__/graphics/entity/cryonite/hr-cryonite-glow.png", + flags = { + "light" + }, + frame_count = 8, + height = 128, + priority = "extra-high", + scale = 0.5, + variation_count = 8, + width = 128 + }, + priority = "extra-high", + variation_count = 8, + width = 64 + } + }, + effect_animation_period = 5, + effect_animation_period_deviation = 1, + effect_darkness_multiplier = 3.6, + max_effect_alpha = 0.3, + min_effect_alpha = 0.2, + map_color = {r = 35/255, g = 164/255, b = 255/255} + }, + { + type = "resource", + name = data_util.mod_prefix.."holmium-ore", + icon = "__space-exploration-graphics__/graphics/icons/holmium-ore.png", + icon_size = 64, + flags = {"placeable-neutral"}, + order="a-b-e", + tree_removal_probability = 0.8, + tree_removal_max_distance = 32 * 32, + minable = + { + mining_particle = "stone-particle", + mining_time = 3, + result = data_util.mod_prefix.."holmium-ore", + }, + collision_box = {{ -0.1, -0.1}, {0.1, 0.1}}, + selection_box = {{ -0.5, -0.5}, {0.5, 0.5}}, + autoplace = { -- real distribution set in stage 3 + control = data_util.mod_prefix.."holmium-ore" + }, + stage_counts = {15000, 9500, 5500, 2900, 1300, 400, 150, 80}, + stages = + { + sheet = + { + filename = "__space-exploration-graphics__/graphics/entity/holmium-ore/holmium-ore.png", + priority = "extra-high", + size = 64, + frame_count = 8, + variation_count = 8, + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/holmium-ore/hr-holmium-ore.png", + priority = "extra-high", + size = 128, + frame_count = 8, + variation_count = 8, + scale = 0.5 + } + } + }, + map_color = {r = 135/255, g = 96/255, b = 109/255} + }, + { + type = "resource", + name = data_util.mod_prefix.."iridium-ore", + icon = "__space-exploration-graphics__/graphics/icons/iridium-ore.png", + icon_size = 64, + flags = {"placeable-neutral"}, + order="a-b-e", + tree_removal_probability = 0.8, + tree_removal_max_distance = 32 * 32, + minable = + { + fluid_amount = 1, + required_fluid = "sulfuric-acid", + mining_particle = "stone-particle", + mining_time = 5, + result = data_util.mod_prefix.."iridium-ore", + }, + collision_box = {{ -0.1, -0.1}, {0.1, 0.1}}, + selection_box = {{ -0.5, -0.5}, {0.5, 0.5}}, + autoplace = { -- real distribution set in stage 3 + control = data_util.mod_prefix.."iridium-ore" + }, + stage_counts = {15000, 9500, 5500, 2900, 1300, 400, 150, 80}, + stages = + { + sheet = + { + filename = "__space-exploration-graphics__/graphics/entity/iridium-ore/iridium-ore.png", + priority = "extra-high", + size = 64, + frame_count = 8, + variation_count = 8, + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/iridium-ore/hr-iridium-ore.png", + priority = "extra-high", + size = 128, + frame_count = 8, + variation_count = 8, + scale = 0.5 + } + } + }, + map_color = {r = 244/255, g = 202/255, b = 85/255} + }, + { + type = "resource", + name = data_util.mod_prefix.."naquium-ore", + icon = "__space-exploration-graphics__/graphics/icons/naquium-ore.png", + icon_size = 64, + flags = {"placeable-neutral"}, + order="a-b-e", + tree_removal_probability = 0.8, + tree_removal_max_distance = 32 * 32, + minable = + { + fluid_amount = 20, + required_fluid = "sulfuric-acid", + mining_particle = "stone-particle", + mining_time = 10, + result = data_util.mod_prefix.."naquium-ore", + }, + collision_box = {{ -0.1, -0.1}, {0.1, 0.1}}, + selection_box = {{ -0.5, -0.5}, {0.5, 0.5}}, + autoplace = { -- real distribution set in stage 3 + control = data_util.mod_prefix.."naquium-ore", + tile_restriction = {data_util.mod_prefix.."asteroid"} -- only in DEEP space + }, + stage_counts = {15000, 9500, 5500, 2900, 1300, 400, 150, 80}, + stages = + { + sheet = + { + filename = "__space-exploration-graphics__/graphics/entity/naquium-ore/naquium-ore.png", + priority = "extra-high", + size = 64, + frame_count = 8, + variation_count = 8, + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/naquium-ore/hr-naquium-ore.png", + priority = "extra-high", + size = 128, + frame_count = 8, + variation_count = 8, + scale = 0.5 + } + } + }, + stages_effect = { + sheet = { + blend_mode = "additive", + filename = "__space-exploration-graphics__/graphics/entity/naquium-ore/naquium-ore-glow.png", + flags = { + "light" + }, + frame_count = 8, + height = 64, + hr_version = { + blend_mode = "additive", + filename = "__space-exploration-graphics__/graphics/entity/naquium-ore/hr-naquium-ore-glow.png", + flags = { + "light" + }, + frame_count = 8, + height = 128, + priority = "extra-high", + scale = 0.5, + variation_count = 8, + width = 128 + }, + priority = "extra-high", + variation_count = 8, + width = 64 + } + }, + effect_animation_period = 5, + effect_animation_period_deviation = 1, + effect_darkness_multiplier = 3.6, + max_effect_alpha = 0.3, + min_effect_alpha = 0.2, + map_color = {r = 137/255, g = 113/255, b = 214/255} + }, + { + type = "resource", + name = data_util.mod_prefix.."vulcanite", + icon = "__space-exploration-graphics__/graphics/icons/vulcanite.png", + icon_size = 64, + flags = {"placeable-neutral"}, + order="a-b-e", + tree_removal_probability = 0.8, + tree_removal_max_distance = 32 * 32, + minable = + { + mining_particle = "stone-particle", + mining_time = 2, + result = data_util.mod_prefix.."vulcanite", + }, + collision_box = {{ -0.1, -0.1}, {0.1, 0.1}}, + selection_box = {{ -0.5, -0.5}, {0.5, 0.5}}, + autoplace = { -- real distribution set in stage 3 + control = data_util.mod_prefix.."vulcanite", + tile_restriction = alien_biomes.list_tiles(alien_biomes.require_tag(alien_biomes.all_tiles(), {"volcanic"})), + }, + stage_counts = {15000, 9500, 5500, 2900, 1300, 400, 150, 80}, + stages = + { + sheet = + { + filename = "__space-exploration-graphics__/graphics/entity/vulcanite/vulcanite.png", + priority = "extra-high", + size = 64, + frame_count = 8, + variation_count = 8, + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/vulcanite/hr-vulcanite.png", + priority = "extra-high", + size = 128, + frame_count = 8, + variation_count = 8, + scale = 0.5 + } + } + }, + stages_effect = { + sheet = { + blend_mode = "additive", + filename = "__space-exploration-graphics__/graphics/entity/vulcanite/vulcanite-glow.png", + flags = { + "light" + }, + frame_count = 8, + height = 64, + hr_version = { + blend_mode = "additive", + filename = "__space-exploration-graphics__/graphics/entity/vulcanite/hr-vulcanite-glow.png", + flags = { + "light" + }, + frame_count = 8, + height = 128, + priority = "extra-high", + scale = 0.5, + variation_count = 8, + width = 128 + }, + priority = "extra-high", + variation_count = 8, + width = 64 + } + }, + effect_animation_period = 5, + effect_animation_period_deviation = 1, + effect_darkness_multiplier = 3.6, + max_effect_alpha = 0.3, + min_effect_alpha = 0.2, + map_color = {r = 224/255, g = 40/255, b = 10/255} + }, + { + type = "resource", + name = data_util.mod_prefix.."vitamelange", + icon = "__space-exploration-graphics__/graphics/icons/vitamelange.png", + icon_size = 64, + flags = {"placeable-neutral"}, + order="a-b-e", + tree_removal_probability = 0.8, + tree_removal_max_distance = 32 * 32, + minable = + { + mining_particle = "stone-particle", + mining_time = 1, + result = data_util.mod_prefix.."vitamelange", + }, + collision_box = {{ -0.1, -0.1}, {0.1, 0.1}}, + selection_box = {{ -0.5, -0.5}, {0.5, 0.5}}, + autoplace = { -- real distribution set in stage 3 + control = data_util.mod_prefix.."vitamelange", + tile_restriction = alien_biomes.list_tiles(alien_biomes.require_tag(alien_biomes.all_tiles(), {"grass", "dirt"})), -- not snow, volcanic, desert + }, + stage_counts = {15000, 9500, 5500, 2900, 1300, 400, 150, 80}, + stages = + { + sheet = + { + filename = "__space-exploration-graphics__/graphics/entity/vitamelange/vitamelange.png", + priority = "extra-high", + size = 64, + frame_count = 8, + variation_count = 8, + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/vitamelange/hr-vitamelange.png", + priority = "extra-high", + size = 128, + frame_count = 8, + variation_count = 8, + scale = 0.5 + } + } + }, + stages_effect = { + sheet = { + blend_mode = "additive-soft", + filename = "__space-exploration-graphics__/graphics/entity/vitamelange/vitamelange-glow.png", + flags = { + "light" + }, + frame_count = 8, + height = 64, + hr_version = { + blend_mode = "additive-soft", + filename = "__space-exploration-graphics__/graphics/entity/vitamelange/hr-vitamelange-glow.png", + flags = { + "light" + }, + frame_count = 8, + height = 128, + priority = "extra-high", + scale = 0.5, + variation_count = 8, + width = 128 + }, + priority = "extra-high", + variation_count = 8, + width = 64 + } + }, + effect_animation_period = 5, + effect_animation_period_deviation = 1, + effect_darkness_multiplier = 3.6, + max_effect_alpha = 0.15, + min_effect_alpha = 0.05, + map_color = {r = 173/255, g = 206/255, b = 54/255}, + }, + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-fragments.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-fragments.lua new file mode 100644 index 0000000..4dd739a --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-fragments.lua @@ -0,0 +1,399 @@ +local data_util = require("data_util") +--[[ +meteors and crashing rocket parts + +Big sections: +general concept is have a script-controlled entity (and paired shadow) +moved from a spawn point to a predesiganted landing point. +It spawns smoke as moved. +probably use a projectile type for the primary pieces. +Upon impact there are explosions. + +Some cargo part survive, some are lost. +Carried resources are reduecd by similar loss amount and then distributed among survivng containers. + +additional small particles spawned during falling they can fall normally. + +-- parts of rockets / ships that fall. + + +rockets are made of 100 x +heat shielding 20 +low density structure 10 +low density structure 10 +10 rocket control unit +5 cargo pod (seperate) +1 rocket fuel tank +roughly 1.25k of each resource +125k total +if a scrap is 0.3 of a resource +then returning more than 4 166 666 scrap would be bad. + +if there are say +4 big fragments -> 100 scrap each = 400 +6 medium fragments -> 50 scrap each = 300 +20 small fragments -> 20 scrap each = 400 +20 tiny fragments -> 10 scrap each = 200 +1.1k scrap total, recycle value is 330 +]]-- + + +local resistances = { + { type = "fire", percent = 100 }, + { type = "explosion", percent = 100 }, + { type = "impact", percent = 50 } +} + +--{"floor-layer", "player-layer", "water-tile", "object-layer"}, +local collision_mask_blocking = {"player-layer", "object-layer"} +local collision_mask_nonblocking = {"item-layer"} + +local fragments = { -- name = size, width, height, shadoww, shadowh, shadowoffx, shadowoffy + ["rocket-fragment-big-a"] = {4, 215, 185, 234, 131, 27/32, 38/32}, + ["rocket-fragment-big-b"] = {4, 163, 129, 164, 109, 1/32, 12/32}, + ["rocket-fragment-big-c"] = {4, 160, 131, 136, 77, 12/32, 18/32}, + ["rocket-fragment-big-d"] = {4, 108, 86, 123, 52, 22/32, 26/32}, + ["rocket-fragment-medium-a"] = {3, 109, 81, 115, 57, 6/32, 14/32}, + ["rocket-fragment-medium-b"] = {3, 111, 81, 117, 82, 14/32, 18/32}, + ["rocket-fragment-medium-c"] = {3, 120, 75, 122, 62, 2/32, 7/32}, + ["rocket-fragment-small-a"] = {2, 65, 68, 60, 53, 1/32, 6/32}, + ["rocket-fragment-small-b"] = {2, 65, 67, 77, 62, 7/32, 6/32}, + ["rocket-fragment-small-c"] = {2, 69, 38, 76, 35, 3/32, 5/32}, + ["rocket-fragment-small-d"] = {2, 79, 59, 80, 54, 6/32, 3/32}, + ["rocket-fragment-small-e"] = {2, 69, 74, 77, 66, 5/32, 5/32}, + ["rocket-fragment-small-f"] = {2, 55, 49, 59, 39, 4/32, 6/32}, + ["rocket-fragment-small-g"] = {2, 62, 64, 60, 59, 12/32, 8/32}, + ["rocket-fragment-small-h"] = {2, 59, 48, 65, 31, 4/32, 8/32}, + ["rocket-fragment-small-i"] = {2, 41, 49, 47, 41, 5/32, 7/32}, + ["rocket-fragment-small-j"] = {2, 68, 42, 69, 43, 1/32, 3/32}, + ["rocket-fragment-tiny-a"] = {1, 47, 22, 47, 15, 0/32, 5/32}, + ["rocket-fragment-tiny-b"] = {1, 48, 36, 49, 35, 2/32, 2/32}, + ["rocket-fragment-tiny-c"] = {1, 44, 33, 48, 25, 3/32, 5/32}, + ["rocket-fragment-tiny-d"] = {1, 58, 35, 56, 30, 1/32, 1/32}, + ["rocket-fragment-tiny-e"] = {1, 21, 18, 23, 12, 3/32, 5/32}, + ["rocket-fragment-tiny-f"] = {1, 46, 30, 53, 25, 3/32, 5/32}, + + ["cargo-fragment-a"] = {3, 112, 81, 117, 49, 6/32, 14/32, 0.75, true}, + ["cargo-fragment-b"] = {3, 118, 97, 125, 82, 6/32, 14/32, 0.75, true}, + ["cargo-fragment-c"] = {3, 138, 138, 148, 69, 6/32, 14/32, 0.75, true}, + ["cargo-fragment-d"] = {3, 95, 62, 88, 38, 6/32, 14/32, 0.75, true}, +} + +local function get_explosion(size) + if size == 2 then + return data_util.mod_prefix.."medium-explosion" + elseif size == 3 then + return data_util.mod_prefix.."large-explosion" + elseif size == 4 then + return data_util.mod_prefix.."huge-explosion" + end + + return data_util.mod_prefix.."small-explosion" +end + +for name, fragment in pairs(fragments) do + local size = fragment[1] + local width = fragment[2] + local height = fragment[3] + local shadow_width = fragment[4] + local shadow_height = fragment[5] + local shadow_x = fragment[6] + local shadow_y = fragment[7] + local scale = fragment[8] or 1 + local cargo = fragment[9] == true + local scrap = 10 + if size > 3 then + scrap = 100 + elseif size > 2 then + scrap = 50 + elseif size > 1 then + scrap = 20 + end + + data:extend({ + { + type = "projectile", + name = data_util.mod_prefix.."falling-" .. name, + acceleration = 0, + rotatable = false, + animation = { + filename = "__space-exploration-graphics__/graphics/entity/rocket-fragments/"..name..".png", + frame_count = 1, + width = width, + height = height, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + scale = scale + }, + action = { + action_delivery = { + target_effects = { + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 5 + 2.5 * size, + type = "meteor" + }, + type = "damage" + }, + { + entity_name = "explosion", + type = "create-entity" + } + }, + type = "instant" + }, + radius = 0.5 + 0.2 * size, + type = "area" + }, + type = "nested-result" + }, + { + type = "create-entity", + entity_name = get_explosion(size), + }, + { + type = "create-entity", + entity_name = "small-scorchmark", + check_buildability = true, + }, + { + type = "create-entity", + check_buildability = false, + entity_name = data_util.mod_prefix.."static-"..name, + }, + { + type = "create-entity", + entity_name = data_util.mod_prefix .. "trigger-movable-debris", + trigger_created_entity = true, + }, + }, + type = "instant" + }, + type = "direct" + }, + flags = { "not-on-map" }, + light = { intensity = 0.1 + 0.05 * size, size = 10}, + smoke = { + { + deviation = { + 0.15, + 0.15 + }, + frequency = 1, + --name = "smoke-fast", + --name = "smoke-explosion-particle", + name = "soft-fire-smoke", -- lasts longer + position = {0,0}, + slow_down_factor = 1, + starting_frame = 3, + starting_frame_deviation = 5, + starting_frame_speed = 0, + starting_frame_speed_deviation = 5 + } + }, + }, + { + type = "projectile", + name = data_util.mod_prefix.."shadow-" .. name, + acceleration = 0, + rotatable = false, + animation = { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/rocket-fragments/shadows/"..name..".png", + frame_count = 1, + width = shadow_width, + height = shadow_height, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + scale = scale + }, + flags = { "not-on-map" }, + }, + { + type = "simple-entity", + name = data_util.mod_prefix.."static-"..name, + localised_name = cargo and {"entity-name.destroyed-cargo-pod"} or {"entity-name.rocket-fragment"}, + icon = "__base__/graphics/icons/ship-wreck/small-ship-wreck.png", + icon_size = 64, + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + subgroup = "wrecks", + order = "d[remnants]-d[ship-wreck]-c[small]-a", + max_health = size * 100, + minable = { + mining_time = 0.2, + results={ + {name= data_util.mod_prefix.."scrap", amount=scrap}, + } + }, + resistances = resistances, + collision_box = size > 3 and {{-1, -1}, {1, 1}} or {{-0.7, -0.7}, {0.7, 0.7}}, + collision_mask = size > 3 and collision_mask_blocking or collision_mask_nonblocking, + selection_box = {{-1.3, -1.1}, {1.3, 1.1}}, + selection_priority = 2, + count_as_rock_for_filtered_deconstruction = true, + picture = + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/entity/rocket-fragments/"..name..".png", + width = width, + height = height, + shift = { 0, 0 }, + scale = scale + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/rocket-fragments/shadows/"..name..".png", + width = shadow_width, + height = shadow_height, + shift = { shadow_x, shadow_y }, + scale = scale + } + } + }, + render_layer = "object", + }, + { + type = "projectile", + name = data_util.mod_prefix.."space-" .. name, + acceleration = -0.001, + rotatable = false, + animation = { + filename = "__space-exploration-graphics__/graphics/entity/rocket-fragments/"..name..".png", + frame_count = 1, + width = width, + height = height, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + scale = scale + }, + action = { + action_delivery = { + target_effects = { + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 5 + 2.5 * size, + type = "meteor" + }, + type = "damage" + }, + { + entity_name = "explosion", + type = "create-entity" + } + }, + type = "instant" + }, + radius = 0.5 + 0.2 * size, + type = "area" + }, + type = "nested-result" + }, + { + type = "create-entity", + check_buildability = false, + entity_name = data_util.mod_prefix.."static-"..name, + }, + { + type = "create-entity", + entity_name = data_util.mod_prefix .. "trigger-movable-debris", + trigger_created_entity = true, + }, + }, + type = "instant" + }, + type = "direct" + }, + flags = { "not-on-map" }, + light = { intensity = 0.1 + 0.05 * size, size = 10}, + smoke = { + { + deviation = { + 0.15, + 0.15 + }, + frequency = 1, + --name = "smoke-fast", + --name = "smoke-explosion-particle", + name = "soft-fire-smoke", -- lasts longer + position = {0,0}, + slow_down_factor = 1, + starting_frame = 3, + starting_frame_deviation = 5, + starting_frame_speed = 0, + starting_frame_speed_deviation = 5 + } + }, + }, + }) +end + + +-- safe version +data:extend({ + { + type = "projectile", + name = data_util.mod_prefix.."falling-cargo-pod", + acceleration = 0, + rotatable = false, + animation = { + filename = "__space-exploration-graphics__/graphics/entity/cargo-pod/cargo-pod.png", + frame_count = 1, + width = 147, + height = 194, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + scale = 0.5, + }, + flags = { "not-on-map" }, + light = { intensity = 0.2, size = 10}, + smoke = { + { + deviation = { + 0.15, + 0.15 + }, + frequency = 1, + name = "smoke-fast", + --name = "smoke-explosion-particle", + --name = "soft-fire-smoke", -- lasts longer + position = {0,0}, + slow_down_factor = 1, + starting_frame = 3, + starting_frame_deviation = 5, + starting_frame_speed = 0, + starting_frame_speed_deviation = 5 + } + }, + }, + { + type = "projectile", + name = data_util.mod_prefix.."shadow-cargo-pod", + acceleration = 0, + rotatable = false, + animation = { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/cargo-pod/cargo-pod-shadow.png", + frame_count = 1, + width = 167, + height = 164, + line_length = 1, + priority = "high", + shift = { 0, 0 }, + scale = 0.5, + }, + flags = { "not-on-map" }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-landing-pad.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-landing-pad.lua new file mode 100644 index 0000000..7e8c5bc --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-landing-pad.lua @@ -0,0 +1,64 @@ +local data_util = require("data_util") + +local landing_pad_collision_box = {{-4.35, -4.35}, {4.35, 4.35}} +data:extend({ + { + type = "container", + name = data_util.mod_prefix .. "rocket-landing-pad", -- "rocket-launch-pad-chest", + icon = "__space-exploration-graphics__/graphics/icons/rocket-landing-pad.png", + icon_size = 64, + order = "z-z", + flags = {"placeable-neutral", "player-creation"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "rocket-landing-pad"}, + max_health = 5000, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + collision_box = landing_pad_collision_box, + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer -- not spaceship + }, + selection_box = {{-4.35, -4.35}, {4.35, 4.35}}, + drawing_box = {{-4.35, -4.35 - 1}, {4.35, 4.35}}, + inventory_size = rocket_capacity + 110, -- 100 for potential recovered rocket sections and space capsule, plus another 10 to prevent deleting cargo from overflowing reused rocket sections + resistances = { + { type = "meteor", percent = 99 }, + { type = "explosion", percent = 99 }, + { type = "impact", percent = 99 }, + { type = "fire", percent = 99 }, + }, + open_sound = { filename = "__base__/sound/metallic-chest-open.ogg", volume=0.65 }, + close_sound = { filename = "__base__/sound/metallic-chest-close.ogg", volume = 0.7 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + picture = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-landing-pad/rocket-landing-pad.png", + height = 384, + shift = { 0, -0.5 }, + width = 352, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-landing-pad/hr-rocket-landing-pad.png", + height = 384 * 2, + shift = { 0, -0.5 }, + width = 352 * 2, + scale = 0.5 + } + }, + circuit_wire_connection_point = + { + shadow = + { + red = {-3.5, 2.7}, + green = {-3.6, 2.6}, + }, + wire = + { + red = {-3.5, 2.7}, + green = {-3.6, 2.6}, + } + }, + circuit_wire_max_distance = 12.5, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-launch-pad.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-launch-pad.lua new file mode 100644 index 0000000..6cb3aa7 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/rocket-launch-pad.lua @@ -0,0 +1,992 @@ +--[[ +The plan: +While sile is in assembly mode a vehicle with a filter +is placed over the silo that only takes rocket segments. +also, rocket segments are taken from the container if any. +once the rocket is complete the vehicle is removed so items +are placed in the silo and not the vehicle. + +new rocket doors are 168 up on hr image +]]-- +local data_util = require("data_util") + +local silo_offset_px = -37 +--local shadow_adds_width = 192; +local shadow_adds_width = 96; +local blank_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, +} +local selectable = false -- false for production, true only to help debug layers +local launch_pad_collision_box = {{-4.85, -4.85}, {4.85, 4.85}} + +local connection_point = { + wire = { red = {-1 -8/32, 2 +20/32}, green = {-1 -2/32, 2 +20/32}, }, + shadow = { red = {2 -8/32, 5}, green = {2 -2/32, 5}, }, +} +local tank_connection_point = table.deepcopy(connection_point) +tank_connection_point.wire.red[2] = connection_point.wire.red[2] - 1 +tank_connection_point.wire.green[2] = connection_point.wire.green[2] - 1 +tank_connection_point.shadow.red[2] = connection_point.shadow.red[2] - 1 +tank_connection_point.shadow.green[2] = connection_point.shadow.green[2] - 1 + +local function connection_sprites(offset) + return { + blue_led_light_offset = offset, + led_blue = { + filename = "__base__/graphics/entity/circuit-connector/hr-ccm-universal-04e-blue-LED-on-sequence.png", + height = 60, + priority = "low", + shift = offset, + width = 60, + x = 60, + y = 0 + }, + led_blue_off = { + filename = "__base__/graphics/entity/circuit-connector/hr-ccm-universal-04f-blue-LED-off-sequence.png", + height = 44, + priority = "low", + shift = offset, + width = 46, + x = 46, + y = 0 + }, + led_green = { + filename = "__base__/graphics/entity/circuit-connector/hr-ccm-universal-04h-green-LED-sequence.png", + height = 46, + priority = "low", + shift = offset, + width = 48, + x = 48, + y = 0 + }, + led_light = { + intensity = 0.8, + size = 0.9 + }, + led_red = { + filename = "__base__/graphics/entity/circuit-connector/hr-ccm-universal-04i-red-LED-sequence.png", + height = 46, + priority = "low", + shift = offset, + width = 48, + x = 48, + y = 0 + }, + red_green_led_light_offset = offset, + } +end + +--local container_connection_sprites = connection_sprites({ 3-12/32, 0 }) +local tank_connection_sprites = connection_sprites({ -97/32, -153/32 }) + +data:extend({ + { + type = "container", + name = data_util.mod_prefix .. "rocket-launch-pad", -- "rocket-launch-pad-chest", + icon = "__space-exploration-graphics__/graphics/icons/rocket-launch-pad.png", + icon_size = 64, + scale_info_icons = false, + inventory_size = rocket_capacity, + order = "z-z", + flags = {"placeable-neutral", "player-creation"}, + minable = {mining_time = 0.5, result = data_util.mod_prefix .. "rocket-launch-pad"}, + max_health = 8000, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + collision_box = launch_pad_collision_box, + collision_mask = { + "water-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer -- not spaceship + }, + render_layer = "transport-belt", -- does not work + selection_box = launch_pad_collision_box, + drawing_box = {{-4.85, -4.85 - 1}, {4.85, 4.85}}, + selection_priority = 100, + resistances = { + { type = "meteor", percent = 90 }, + { type = "impact", percent = 100 }, + { type = "fire", percent = 100 } + }, + open_sound = { filename = "__base__/sound/metallic-chest-open.ogg", volume=0.65 }, + close_sound = { filename = "__base__/sound/metallic-chest-close.ogg", volume = 0.7 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + picture = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/complete.png", + shift = { 0, -0.25 }, + width = 704/2, + height = 736/2, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-complete.png", + shift = { 0, -0.25 }, + width = 704, + height = 736, + scale = 0.5, + } + }, + --circuit_connector_sprites = container_connection_sprites, -- these are not seen because of layering + circuit_wire_connection_point = connection_point, + circuit_wire_max_distance = 12.5, + }, + { -- invisibly dummy vehicle + type = "car", + name = data_util.mod_prefix .. "rocket-launch-pad-_-section-input", + collision_box = {{-3.85, -3.85}, {3.85, 3.85}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = launch_pad_collision_box, + scale_info_icons = false, + selection_priority = 200, + selectable_in_game = selectable, + has_belt_immunity = true, + animation = { + layers = { + { + animation_speed = 1, + direction_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + frame_count = 1, + height = 1, + width = 1 + }, + } + }, + braking_power = "200kW", + burner = { + effectivity = 1, + fuel_category = "chemical", + fuel_inventory_size = 0, + render_no_power_icon = false + }, + consumption = "1W", + effectivity = 0.5, + energy_per_hit_point = 1, + flags = { "placeable-neutral", "player-creation", "placeable-off-grid" }, + friction = 0.9, + icon = "__space-exploration-graphics__/graphics/icons/rocket-launch-pad.png", + icon_size = 64, + inventory_size = 2, + max_health = 45000, + open_sound = { + filename = "__base__/sound/car-door-open.ogg", + volume = 0.7 + }, + close_sound = { + filename = "__base__/sound/car-door-close.ogg", + volume = 0.7 + }, + render_layer = "object", + rotation_speed = 0.00, + order = "zz", + weight = 10000, + }, + { + type = "constant-combinator", + name = data_util.mod_prefix .. "rocket-launch-pad-combinator", + icon = "__space-exploration-graphics__/graphics/icons/rocket-launch-pad.png", + icon_size = 64, + flags = {"placeable-player", "player-creation", "placeable-off-grid", "not-deconstructable", "not-blueprintable"}, + order = "y", + max_health = 10000, + healing_per_tick = 10000, + corpse = "small-remnants", + collision_box = {{-0.0, -0.0}, {0.0, 0.0}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = {{-0.5, -0.5}, {0.5, 0.5}}, + scale_info_icons = false, + selectable_in_game = selectable, + item_slot_count = 10, -- capsule, rocket parts, fuel, rocket made, slots free + sprites = + { + north = blank_image, + east = blank_image, + south = blank_image, + west = blank_image + }, + activity_led_sprites = + { + north = blank_image, + east = blank_image, + south = blank_image, + west = blank_image + }, + activity_led_light = + { + intensity = 0.8, + size = 1, + }, + activity_led_light_offsets = + { + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0} + }, + circuit_wire_connection_points = + { + connection_point, connection_point, connection_point, connection_point, + }, + circuit_wire_max_distance = 10 + }, + { -- invisibly dummy vehicle + -- allows player to enter and go with a rocket + type = "car", + name = data_util.mod_prefix .. "rocket-launch-pad-_-seat", + collision_mask = {"not-colliding-with-itself"}, + collision_box = { { -0.4, -0.05 }, { 0.4, 0.05 } }, + collision_mask = {"not-colliding-with-itself"}, + has_belt_immunity = true, + animation = { + layers = { + { + animation_speed = 1, + direction_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + frame_count = 1, + height = 1, + width = 1 + }, + } + }, + braking_power = "200kW", + burner = { + effectivity = 1, + fuel_category = "chemical", + fuel_inventory_size = 0, + render_no_power_icon = false + }, + consumption = "150kW", + effectivity = 0.5, + energy_per_hit_point = 1, + flags = { "placeable-neutral", "player-creation", "placeable-off-grid" }, + friction = 0.9, + icon = "__space-exploration-graphics__/graphics/icons/rocket-launch-pad.png", + icon_size = 64, + inventory_size = 0, + max_health = 45000, + open_sound = { + filename = "__base__/sound/car-door-open.ogg", + volume = 0.7 + }, + close_sound = { + filename = "__base__/sound/car-door-close.ogg", + volume = 0.7 + }, + render_layer = "object", + rotation_speed = 0.00, + order = "zz", + selectable_in_game = selectable, + weight = 700, + }, + { + type = "storage-tank", + name = data_util.mod_prefix .. "rocket-launch-pad-tank", + icon = "__space-exploration-graphics__/graphics/icons/rocket-launch-pad.png", + icon_size = 64, + scale_info_icons = false, + render_layer = "higher-object-above", + flags = {"placeable-player", "player-creation", "not-deconstructable", "not-blueprintable"}, + max_health = 50000, + order = "zz", + corpse = "medium-remnants", + collision_box = { -- compensate for position shift + {launch_pad_collision_box[1][1], launch_pad_collision_box[1][2] -1}, + {launch_pad_collision_box[2][1], launch_pad_collision_box[2][2] -1}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = { -- compensate for position shift + {launch_pad_collision_box[1][1], launch_pad_collision_box[1][2] -1}, + {launch_pad_collision_box[2][1], launch_pad_collision_box[2][2] -1}}, + selectable_in_game = selectable, + fluid_box = + { + base_area = 100, -- gets multiplied by 100 by engine + base_level = -1, -- pull fluid in + height = 1.1, + pipe_covers = pipecoverspictures(), + pipe_connections = + { + { position = {-5.5, 3.5-1} }, + { position = {-5.5, -3.5-1} }, + { position = {3.5, -5.5-1} }, + { position = {-3.5, -5.5-1} }, + { position = {5.5, 3.5-1} }, + { position = {5.5, -3.5-1} }, + { position = {3.5, 5.5-1} }, + { position = {-3.5, 5.5-1} }, + }, + }, + two_direction_only = true, + window_bounding_box = {{-0.125, 0.6875}, {0.1875, 1.1875}}, + pictures = + { + picture = { + sheets = { + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/tank-window.png", + priority = "extra-high", + frames = 1, + width = 94/2, + height = 84/2, + shift = {128.5/32, -154/32}, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-tank-window.png", + priority = "extra-high", + frames = 1, + width = 94, + height = 84, + shift = {128.5/32, -154/32}, + scale=0.5, + }, + }, + } + }, + fluid_background = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/fluid-background.png", + priority = "extra-high", + width = 10, + height = 30, + shift = {128/32, -180/32}, + scale = 2 + }, + window_background = blank_image, + --[[{ + filename = "__base__/graphics/entity/storage-tank/window-background.png", + priority = "extra-high", + width = 17, + height = 24, + shift = {-116/32, -160/32}, + hr_version = { + filename = "__base__/graphics/entity/storage-tank/hr-window-background.png", + priority = "extra-high", + width = 34, + height = 48, + scale = 0.5, + shift = {-116/32, -160/32}, + } + },]]-- + flow_sprite = + { + filename = "__base__/graphics/entity/pipe/fluid-flow-low-temperature.png", + priority = "extra-high", + width = 160, + height = 20, + shift = {128/32, -180/32}, + scale = 2 + }, + gas_flow = + { + filename = "__base__/graphics/entity/pipe/steam.png", + priority = "extra-high", + line_length = 10, + width = 24, + height = 15, + frame_count = 60, + axially_symmetrical = false, + direction_count = 1, + animation_speed = 0.255, + shift = {128/32, -180/32}, + hr_version = + { + filename = "__base__/graphics/entity/pipe/hr-steam.png", + priority = "extra-high", + line_length = 10, + width = 48, + height = 30, + frame_count = 60, + axially_symmetrical = false, + animation_speed = 0.255, + direction_count = 1, + shift = {128/32, -180/32}, + } + } + }, + flow_length_in_ticks = 360, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { + filename = "__base__/sound/storage-tank.ogg", + volume = 0.8 + }, + apparent_volume = 1.5, + max_sounds_per_type = 3 + }, + circuit_wire_connection_points = { + tank_connection_point, tank_connection_point, tank_connection_point, tank_connection_point, + }, + circuit_connector_sprites = {tank_connection_sprites,tank_connection_sprites,tank_connection_sprites,tank_connection_sprites,}, + circuit_wire_max_distance = default_circuit_wire_max_distance + }, + + { + -- this only exists for the animation + -- it won't be selectable or affected normally + -- when ready to launch the required dummy item will be added + -- then launch will be triggered by script + type = "rocket-silo", + name = data_util.mod_prefix .. "rocket-launch-pad-silo", + rocket_entity = data_util.mod_prefix .. "cargo-rocket", + fixed_recipe = data_util.mod_prefix .. "rocket-launch-pad-silo-dummy-recipe", + rocket_entity = data_util.mod_prefix .. "cargo-rocket", + order = "zz", + icon = "__space-exploration-graphics__/graphics/icons/rocket-launch-pad.png", + icon_size = 64, + flags = {"placeable-player", "player-creation"}, + selection_box = launch_pad_collision_box, + selectable_in_game = selectable, + -- collision box stops inserters from accessing container + --collision_box = launch_pad_collision_box, -- for power + collision_box = {{0,0},{0,0}}, + collision_mask = {"not-colliding-with-itself"}, + crafting_categories = {"rocket-building"}, + rocket_parts_required = 1, + crafting_speed = 1, + rocket_result_inventory_size = 0, + module_specification = { module_slots = 0 }, + allowed_effects = {}, + show_recipe_icon = false, + max_health = 8000, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + hole_clipping_box = { {-2.75, -1.15 + silo_offset_px/32}, {2.75, 2.25 + silo_offset_px/32} }, + resistances = + { + { + type = "fire", + percent = 60 + }, + { + type = "impact", + percent = 60 + } + }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + + energy_source = { + type = "void", + usage_priority = "primary-input", + render_no_power_icon = false + }, + active_energy_usage = "1000KW", + energy_usage = "1000KW", + idle_energy_usage = "1000KW", + lamp_energy_usage = "100KW", + + times_to_blink = 3, + light_blinking_speed = 1 / (3 * 60), + door_opening_speed = 1 / (4.25 * 60), + silo_fade_out_start_distance = 9, --8, + silo_fade_out_end_distance = 16, --15, + + base_engine_light = + { + intensity = 1, + size = 25, + shift = {0, 1.5 + silo_offset_px/32} + }, + + + shadow_sprite = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/00-rocket-silo-shadow.png", + priority = "medium", + width = 410/2, + height = 510/2, + draw_as_shadow = true, + slice = 2, + shift = util.by_pixel(174, 36), + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-00-rocket-silo-shadow.png", + priority = "medium", + width = 410, + height = 510, + draw_as_shadow = true, + slice = 2, + shift = util.by_pixel(174, 36), + scale = 0.5 + }, + }, + + hole_sprite = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/01-rocket-silo-hole.png", + width = 202, + height = 136, + shift = util.by_pixel(-6, 16 + silo_offset_px), + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-01-rocket-silo-hole.png", + width = 400, + height = 270, + shift = util.by_pixel(-5, 16 + silo_offset_px), + scale = 0.5 + } + }, + hole_light_sprite = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/01-rocket-silo-hole-light.png", + width = 202, + height = 136, + shift = util.by_pixel(-6, 16 + silo_offset_px), + tint = {1,1,1,0}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-01-rocket-silo-hole-light.png", + width = 400, + height = 270, + shift = util.by_pixel(-5, 16 + silo_offset_px), + tint = {1,1,1,0}, + scale = 0.5 + } + }, + + rocket_shadow_overlay_sprite = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/03-rocket-over-shadow-over-rocket.png", + width = 212, + height = 142, + shift = util.by_pixel(-2, 22 + silo_offset_px), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-03-rocket-over-shadow-over-rocket.png", + width = 426, + height = 288, + shift = util.by_pixel(-2, 21 + silo_offset_px), + scale = 0.5 + } + }, + rocket_glow_overlay_sprite = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/03-rocket-over-glow.png", + blend_mode = "additive", + width = 218, + height = 222, + shift = util.by_pixel(-4, 36 + silo_offset_px), + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-03-rocket-over-glow.png", + blend_mode = "additive", + width = 434, + height = 446, + shift = util.by_pixel(-3, 36 + silo_offset_px), + scale = 0.5 + } + }, + + + door_back_sprite = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/04-door-back.png", + width = 158, + height = 144, + shift = util.by_pixel(36, 12 + silo_offset_px), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-04-door-back.png", + width = 312, + height = 286, + shift = util.by_pixel(37, 12 + silo_offset_px), + scale = 0.5 + } + }, + door_back_open_offset = {1.8, -1.8 * 0.43299225}, + door_front_sprite = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/05-door-front.png", + width = 166, + height = 152, + shift = util.by_pixel(-28, 32 + silo_offset_px), + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-05-door-front.png", + width = 332, + height = 300, + shift = util.by_pixel(-28, 33 + silo_offset_px), + scale = 0.5 + } + }, + door_front_open_offset = {-1.8, 1.8 * 0.43299225}, + + base_day_sprite = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/06-rocket-silo.png", + width = 352, + height = 368, + shift = util.by_pixel(0, -8), + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-06-rocket-silo.png", + width = 704, + height = 736, + shift = util.by_pixel(0, -8), + scale = 0.5 + } + }, + + + red_lights_back_sprites = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {1.34375, 0.28125-1.375 + silo_offset_px/32}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {1.34375, 0.28125-1.375 + silo_offset_px/32}, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {2.3125, 0.9375-1.375 + silo_offset_px/32}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {2.3125, 0.9375-1.375 + silo_offset_px/32}, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {2.65625, 1.90625-1.375 + silo_offset_px/32}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {2.65625, 1.90625-1.375 + silo_offset_px/32}, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {-2.65625, 1.90625-1.375 + silo_offset_px/32}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {-2.65625, 1.90625-1.375 + silo_offset_px/32}, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {-2.3125, 0.9375-1.375 + silo_offset_px/32}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {-2.3125, 0.9375-1.375 + silo_offset_px/32}, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {-1.34375, 0.28125-1.375 + silo_offset_px/32}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {-1.34375, 0.28125-1.375 + silo_offset_px/32}, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {0, 0-1.375 + silo_offset_px/32}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {0, 0-1.375 + silo_offset_px/32}, + scale = 0.5 + } + } + } + }, + + red_lights_front_sprites = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {2.3125, 2.8125-1.375 + silo_offset_px/32}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {2.3125, 2.8125-1.375 + silo_offset_px/32}, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {1.34375, 3.40625-1.375 + silo_offset_px/32}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {1.34375, 3.40625-1.375 + silo_offset_px/32}, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {0, 3.75-1.375 + silo_offset_px/32}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {0, 3.75-1.375 + silo_offset_px/32}, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {-1.34375, 3.40625-1.375 + silo_offset_px/32}, + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {0, 3.75-1.375 + silo_offset_px/32}, + scale = 0.5 + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/red-light.png", + width = 32, + height = 32, + shift = {-2.3125, 2.8125-1.375 + silo_offset_px/32}, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/07-red-lights-back/hr-red-light.png", + width = 32, + height = 32, + shift = {-2.3125, 2.8125-1.375 + silo_offset_px/32}, + scale = 0.5 + } + } + } + }, + satellite_animation = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/15-rocket-silo-turbine.png", + priority = "medium", + width = 392/4/2, + height = 288/8/2, + frame_count = 4, + line_length = 4, + animation_speed = 0.4, + shift = util.by_pixel(-114, -4), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-15-rocket-silo-turbine.png", + priority = "medium", + width = 392/4, + height = 288/8, + frame_count = 4, + line_length = 4, + animation_speed = 0.4, + shift = util.by_pixel(-114, -4), + scale = 0.5 + } + }, + + arm_01_back_animation = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/08-rocket-silo-arms-back.png", + priority = "medium", + width = 66, + height = 76, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(-54, -84 + silo_offset_px), + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-08-rocket-silo-arms-back.png", + priority = "medium", + width = 128, + height = 150, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(-53, -84 + silo_offset_px), + scale = 0.5 + } + }, + + arm_02_right_animation = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/08-rocket-silo-arms-right.png", + priority = "medium", + width = 94, + height = 94, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(100, -38 + silo_offset_px), + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-08-rocket-silo-arms-right.png", + priority = "medium", + width = 182, + height = 188, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(101, -38 + silo_offset_px), + scale = 0.5 + } + }, + + arm_03_front_animation = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/13-rocket-silo-arms-front.png", + priority = "medium", + width = 66, + height = 114, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(-52, 16 + silo_offset_px), + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-13-rocket-silo-arms-front.png", + priority = "medium", + width = 126, + height = 228, + frame_count = 32, + line_length = 32, + animation_speed = 0.3, + shift = util.by_pixel(-51, 16 + silo_offset_px), + scale = 0.5 + } + }, + + base_front_sprite = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/14-rocket-silo-front.png", + width = 704 / 2, + height = 448 / 2, + shift = util.by_pixel(0, 64), + hr_version = + { + filename = "__space-exploration-graphics-5__/graphics/entity/rocket-launch-pad/hr-14-rocket-silo-front.png", + width = 704, + height = 448, + shift = util.by_pixel(0, 64), + scale = 0.5 + } + }, + + alarm_trigger = + { + { + type = "play-sound", + sound = + { + { + filename = "__base__/sound/silo-alarm.ogg", + volume = 1.0 + } + } + } + }, + clamps_on_trigger = + { + { + type = "play-sound", + sound = + { + { + filename = "__base__/sound/silo-clamps-on.ogg", + volume = 1.0 + } + } + } + }, + clamps_off_trigger = + { + { + type = "play-sound", + sound = + { + { + filename = "__base__/sound/silo-clamps-off.ogg", + volume = 1.0 + } + } + } + }, + doors_trigger = + { + { + type = "play-sound", + sound = + { + { + filename = "__base__/sound/silo-doors.ogg", + volume = 1.0 + } + } + } + }, + raise_rocket_trigger = + { + { + type = "play-sound", + sound = + { + { + filename = "__base__/sound/silo-raise-rocket.ogg", + volume = 1.0 + } + } + } + } + }, +}) + +data.raw["storage-tank"][data_util.mod_prefix .. "rocket-launch-pad-tank"].fluid_box.pipe_covers.north.layers={blank_image} diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/scaffold.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/scaffold.lua new file mode 100644 index 0000000..e70d329 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/scaffold.lua @@ -0,0 +1,328 @@ +local data_util = require("data_util") + +local auto_hr = function(sr) + local hr = table.deepcopy(sr) + hr.scale = 0.5 * (sr.scale or 1) + hr.filename = data_util.replace(hr.filename, "/sr/", "/hr/") + hr.width = sr.width * 2 + hr.height = sr.height * 2 + sr.hr_version = hr + return sr +end + +local make_scaffold_pictures = function(width, height) + local layers = {} + local x_base = -(width+1)/2*32 + local y_base = -(height+1)/2*32 + for i = 1, width, 1 do + for j = 1, height, 1 do + if j == 1 then + if i == 1 then + table.insert(layers, auto_hr({ + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-nw.png", + priority = "high", + width = 32, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+0, y_base+j*32+0), + animation_speed = 1, + })) + table.insert(layers, auto_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-nw-shadow.png", + priority = "high", + width = 40, + height = 40, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+4, y_base+j*32+4), + animation_speed = 1, + })) + elseif i < width then + table.insert(layers, auto_hr({ + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-n.png", + priority = "high", + width = 32, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+0, y_base+j*32+0), + animation_speed = 1, + })) + table.insert(layers, auto_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-n-shadow.png", + priority = "high", + width = 32, + height = 40, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+8, y_base+j*32+4), + animation_speed = 1, + })) + else + table.insert(layers, auto_hr({ + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-ne.png", + priority = "high", + width = 32, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+0, y_base+j*32+0), + animation_speed = 1, + })) + table.insert(layers, auto_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-ne-shadow.png", + priority = "high", + width = 32, + height = 40, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+8, y_base+j*32+4), + animation_speed = 1, + })) + end + elseif j < height then + if i == 1 then + table.insert(layers, auto_hr({ + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-w.png", + priority = "high", + width = 32, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+0, y_base+j*32+0), + animation_speed = 1, + })) + table.insert(layers, auto_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-w-shadow.png", + priority = "high", + width = 40, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+4, y_base+j*32+8), + animation_speed = 1, + })) + elseif i < width then + table.insert(layers, auto_hr({ + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-m.png", + priority = "high", + width = 32, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+0, y_base+j*32+0), + animation_speed = 1, + })) + table.insert(layers, auto_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-m-shadow.png", + priority = "high", + width = 32, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+8, y_base+j*32+8), + animation_speed = 1, + })) + else + table.insert(layers, auto_hr({ + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-e.png", + priority = "high", + width = 32, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+0, y_base+j*32+0), + animation_speed = 1, + })) + table.insert(layers, auto_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-e-shadow.png", + priority = "high", + width = 32, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+8, y_base+j*32+8), + animation_speed = 1, + })) + end + else + if i == 1 then + table.insert(layers, auto_hr({ + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-sw.png", + priority = "high", + width = 32, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+0, y_base+j*32+0), + animation_speed = 1, + })) + table.insert(layers, auto_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-sw-shadow.png", + priority = "high", + width = 40, + height = 24, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+4, y_base+j*32+4), + animation_speed = 1, + })) + elseif i < width then + table.insert(layers, auto_hr({ + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-s.png", + priority = "high", + width = 32, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+0, y_base+j*32+0), + animation_speed = 1, + })) + table.insert(layers, auto_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-s-shadow.png", + priority = "high", + width = 32, + height = 24, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+8, y_base+j*32+4), + animation_speed = 1, + })) + else + table.insert(layers, auto_hr({ + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-se.png", + priority = "high", + width = 32, + height = 32, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+0, y_base+j*32+0), + animation_speed = 1, + })) + table.insert(layers, auto_hr({ + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/scaffold/sr/scaffold-se-shadow.png", + priority = "high", + width = 32, + height = 24, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(x_base+i*32+8, y_base+j*32+4), + animation_speed = 1, + })) + end + end + end + end + + return { layers = layers } + +end + + +data:extend({ + --[[{ + type = "assembling-machine", + name = data_util.mod_prefix .. "gate-addon-scaffold", + icon = "__space-exploration-graphics__/graphics/icons/scaffold.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + max_health = 700, + corpse = "big-remnants", + order = "a[ancient]-g[gate]-z[scaffold]", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-4/2+1/32, -4/2+1/32}, {4/2-1/32, 4/2-1/32}}, + selection_box = {{-4/2+1/32, -4/2+1/32}, {4/2-1/32, 4/2-1/32}}, + drawing_box = {{-4/2+1/32, -4/2+1/32}, {4/2-1/32, 4/2-1/32}}, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = {"not-colliding-with-itself"}, + animation = make_scaffold_pictures(4,4), + crafting_categories = {"fixed-recipe"}, + fixed_recipe = data_util.mod_prefix .. "gate-addon", + crafting_speed = 1, + energy_source = {type = "void"}, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = { module_slots = 0 }, + allowed_effects = {}, + },]]-- + { + type = "assembling-machine", + name = data_util.mod_prefix .. "gate-platform-scaffold", + icon = "__space-exploration-graphics__/graphics/icons/scaffold.png", + icon_size = 64, + flags = {"placeable-neutral"}, + max_health = 1000, + corpse = "big-remnants", + order = "a[ancient]-g[gate]-z[scaffold]", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-9/2+1/32, -3/2+1/32}, {9/2-1/32, 3/2-1/32}}, + selection_box = {{-9/2+1/32, -3/2+1/32}, {9/2-1/32, 3/2-1/32}}, + drawing_box = {{-9/2+1/32, -3/2+1/32}, {9/2-1/32, 3/2-1/32}}, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = {"not-colliding-with-itself"}, + animation = make_scaffold_pictures(9,3), + crafting_categories = {"fixed-recipe"}, + fixed_recipe = data_util.mod_prefix .. "gate-platform", + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = { module_slots = 0 }, + allowed_effects = {}, + } +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-biochemical.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-biochemical.lua new file mode 100644 index 0000000..02a6cf7 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-biochemical.lua @@ -0,0 +1,242 @@ +local data_util = require("data_util") + +local pipe_pics = table.deepcopy(data.raw["assembling-machine"]["assembling-machine-3"].fluid_boxes[1].pipe_picture) +data_util.replace_filenames_recursive(pipe_pics, + "__base__", + "__space-exploration-graphics__") +data_util.replace_filenames_recursive(pipe_pics, + "assembling-machine-3", + "assembling-machine") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-biochemical-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/biochemical-laboratory.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-biochemical-laboratory"}, + max_health = 700, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-4.2, -4.2}, {4.2, 4.2}}, + selection_box = {{-4.5, -4.5}, {4.5, 4.5}}, + drawing_box = {{-4.5, -4.7}, {4.5, 4.5}}, + resistances = + { + { + type = "electric", + percent = 70 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, 2} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-2, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, -2} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {2, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {-2, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, 2} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {2, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, -2} }}, + secondary_draw_orders = { north = -1 } + }, + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { + { + filename = "__base__/sound/pumpjack.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t3-1.ogg", + volume = 0.8 + }, + }, + idle_sound = { filename = "__base__/sound/pipe.ogg", volume = 0.6 }, + apparent_volume = 1.5, + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-2__/graphics/entity/biochemical-laboratory/sr/biochemical-laboratory.png", + priority = "high", + width = 4608/8/2, + height = 5120/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -16), + animation_speed = 0.5, + hr_version = { + filename = "__space-exploration-graphics-2__/graphics/entity/biochemical-laboratory/hr/biochemical-laboratory.png", + priority = "high", + width = 4608/8, + height = 5120/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(0, -16), + animation_speed = 0.5, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/biochemical-laboratory/sr/shadow.png", + priority = "high", + width = 648/2, + height = 560/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(35, 20), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-2__/graphics/entity/biochemical-laboratory/hr/shadow.png", + priority = "high", + width = 648, + height = 560, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(35, 20), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-biochemical", "chemistry", "oil-processing"}, + crafting_speed = 4, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "3000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.2, size = 16, shift = {0.0, 0.0}, color = {r = 0.6, g = 1, b = 0.5}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-capsule.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-capsule.lua new file mode 100644 index 0000000..6f6f62d --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-capsule.lua @@ -0,0 +1,98 @@ +local scale = 0.4 +local data_util = require("data_util") + +local function shadow_pictures() + local frame_count = 24 + local width = 359 + local height = 120 + local line_length = 3 + local pictures = {} + for i = 1, frame_count do + pictures[i] = { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/space-capsule/space-capsule-shadow.png", + width = width, + height = height, + x = width * ((i -1) % line_length), + y = height * math.floor((i -1) / line_length), + shift = {21/32, 12/32}, + scale = scale + } + end + return pictures +end +data:extend({ + { + type = "car", + name = data_util.mod_prefix .. "space-capsule-_-vehicle", + collision_box = {{-0.7, -0.7}, {0.7, 0.7}}, -- 2 wide is most a vehicle can be and be able to get in + selection_box = {{-1, -1}, {1, 1}}, + display_box = {{-1.5, -4}, {1.5, 1.5}}, + collision_mask = { + --"water-tile", + "object-layer", + --"floor-layer", + "player-layer"}, + minable = { mining_time = 0.25, result = data_util.mod_prefix .. "space-capsule"}, + has_belt_immunity = true, + selection_priority = 200, + selectable_in_game = true, + animation = { + layers = { + { + animation_speed = 1, + direction_count = 24, + line_length = 8, + filename = "__space-exploration-graphics__/graphics/entity/space-capsule/space-capsule.png", + frame_count = 1, + height = 362, + width = 188, + shift = {1/32, -8/32}, + scale = scale + }, + } + }, + braking_power = "200kW", + burner = { + effectivity = 1, + fuel_category = "chemical", + fuel_inventory_size = 0, + render_no_power_icon = false + }, + consumption = "1W", + effectivity = 0.0, + energy_per_hit_point = 1, + flags = { "placeable-neutral", "player-creation", "placeable-off-grid"}, + friction = 0.9, + icon = "__space-exploration-graphics__/graphics/icons/space-capsule.png", + icon_size = 64, + inventory_size = 40, + max_health = 1000, + open_sound = { + filename = "__base__/sound/car-door-open.ogg", + volume = 0.7 + }, + close_sound = { + filename = "__base__/sound/car-door-close.ogg", + volume = 0.7 + }, + render_layer = "wires-above", + rotation_speed = 0.00, + order = "zz", + weight = 10000, + }, + { + type = "simple-entity-with-force", + name = data_util.mod_prefix .. "space-capsule-_-vehicle-shadow", + collision_box = {{-0, -0}, {0, 0}}, + selection_box = {{-0, -0}, {0, 0}}, + collision_mask = {"not-colliding-with-itself"}, + selectable_in_game = false, + pictures = shadow_pictures(), + flags = { "placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/space-capsule.png", + icon_size = 64, + render_layer = "object", + order = "zz", + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-electromagnetics.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-electromagnetics.lua new file mode 100644 index 0000000..8da3d0c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-electromagnetics.lua @@ -0,0 +1,276 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-electromagnetics-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/electromagnetics-laboratory.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-electromagnetics-laboratory"}, + max_health = 700, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-3.2, -3.2}, {3.2, 3.2}}, + selection_box = {{-3.5, -3.5}, {3.5, 3.5}}, + drawing_box = {{-3.5, -5.5}, {3.5, 3.5}}, + resistances = + { + { + type = "electric", + percent = 70 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { + { + filename = "__base__/sound/lab.ogg", + volume = 0.8 + }, + }, + apparent_volume = 1.5, + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + idle_animation = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/sr/base.png", + priority = "high", + width = 448/2, + height = 576/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(0, -16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/hr/base.png", + priority = "high", + width = 448, + height = 576, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(0, -16), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/sr/shadow.png", + priority = "high", + width = 566/2, + height = 400/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(35, 20), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/hr/shadow.png", + priority = "high", + width = 566, + height = 400, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(35, 20), + scale = 0.5, + } + }, + }, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/sr/base.png", + priority = "high", + width = 448/2, + height = 576/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(0, -16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/hr/base.png", + priority = "high", + width = 448, + height = 576, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(0, -16), + animation_speed = 1, + scale = 0.5, + } + }, + { + priority = "high", + width = 1392/4/2, + height = 1880/5/2, + frame_count = 64, + shift = util.by_pixel(1, -17), + animation_speed = 0.25, + stripes = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/sr/animation-1.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/sr/animation-2.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/sr/animation-3.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/sr/animation-4.png", + width_in_frames = 4, + height_in_frames = 1, + }, + }, + hr_version = { + priority = "high", + width = 1392/4, + height = 1880/5, + frame_count = 64, + shift = util.by_pixel(1, -17), + animation_speed = 0.25, + scale = 0.5, + stripes = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/hr/animation-1.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/hr/animation-2.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/hr/animation-3.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/hr/animation-4.png", + width_in_frames = 4, + height_in_frames = 1, + }, + }, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/sr/shadow.png", + priority = "high", + width = 566/2, + height = 400/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(35, 20), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/electromagnetics-laboratory/hr/shadow.png", + priority = "high", + width = 566, + height = 400, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(35, 20), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-electromagnetics"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "5MW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.6, size = 16, shift = {0.0, 0.0}, color = {r = 0.3, g = 0.5, b = 1}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-hypercooler.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-hypercooler.lua new file mode 100644 index 0000000..9cdaa56 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-hypercooler.lua @@ -0,0 +1,148 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-hypercooler", + icon = "__space-exploration-graphics__/graphics/icons/hypercooler.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-hypercooler"}, + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, 0), + resistances = + { + { + type = "fire", + percent = 70 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -3} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-3, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 3} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {3, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { + { + filename = "__base__/sound/pumpjack.ogg", + volume = 0.8 + }, + }, + idle_sound = { filename = "__base__/sound/pipe.ogg", volume = 0.6 }, + apparent_volume = 1.5, + }, + collision_box = {{-2.2, -2.2}, {2.2, 2.2}}, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + --spaceship_collision_layer, + }, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + drawing_box = {{-2.5, -2.7}, {2.5, 2.5}}, + animation = + { + layers = + { + { + priority = "high", + width = 320, + height = 352, + frame_count = 64, + shift = util.by_pixel(-0, -8), + animation_speed = 1, + scale = 0.5, + stripes = + { + { + filename = "__space-exploration-graphics-4__/graphics/entity/hypercooler/hr/hypercooler-1.png", + width_in_frames = 6, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-4__/graphics/entity/hypercooler/hr/hypercooler-2.png", + width_in_frames = 6, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-4__/graphics/entity/hypercooler/hr/hypercooler-3.png", + width_in_frames = 4, + height_in_frames = 1, + }, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/hypercooler/hr/shadow.png", + priority = "high", + width = 424, + height = 280, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(25, 11), + scale = 0.5, + }, + }, + }, + crafting_categories = {"space-hypercooling"}, + crafting_speed = 2, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 2, + }, + energy_usage = "200kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"} -- not "productivity", + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-manufactory.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-manufactory.lua new file mode 100644 index 0000000..82b8e28 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-manufactory.lua @@ -0,0 +1,326 @@ +local data_util = require("data_util") + +local space_assembler = table.deepcopy(data.raw["assembling-machine"]["assembling-machine-3"]) +space_assembler.name = data_util.mod_prefix .. "space-assembling-machine" +space_assembler.icon = "__space-exploration-graphics__/graphics/icons/assembling-machine.png" +space_assembler.icon_size = 64 +space_assembler.icon_mipmaps = 1 + +data_util.replace_filenames_recursive(space_assembler.animation, + "__base__", + "__space-exploration-graphics__") +data_util.replace_filenames_recursive(space_assembler.animation, + "assembling-machine-3", + "assembling-machine") +local pipe_pics = nil +for _, fluid_box in pairs(space_assembler.fluid_boxes) do + if type(fluid_box) == "table" then + data_util.replace_filenames_recursive(fluid_box.pipe_picture, + "__base__", + "__space-exploration-graphics__") + data_util.replace_filenames_recursive(fluid_box.pipe_picture, + "assembling-machine-3", + "assembling-machine") + pipe_pics = table.deepcopy(fluid_box.pipe_picture) + end +end +space_assembler.minable.result = data_util.mod_prefix .. "space-assembling-machine" +space_assembler.allowed_effects = {"consumption", "speed", "pollution"} -- not "productivity" +space_assembler.fast_replaceable_group = nil +space_assembler.next_upgrade = nil +space_assembler.collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", +} +table.insert(space_assembler.crafting_categories, "space-crafting") + +data:extend({ + space_assembler, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-manufactory", + icon = "__space-exploration-graphics__/graphics/icons/manufactory.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-manufactory"}, + max_health = 900, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + resistances = + { + { + type = "fire", + percent = 70 + } + }, + fluid_boxes = + { + { + production_type = "input", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, 2} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-2, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-5, -2} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {2, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {-2, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, 2} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {2, 5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pics, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {5, -2} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { + { + filename = "__base__/sound/assembling-machine-t3-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t3-2.ogg", + volume = 0.8 + }, + }, + idle_sound = { filename = "__base__/sound/idle1.ogg", volume = 0.6 }, + apparent_volume = 1.5, + }, + collision_box = {{-4.2, -4.2}, {4.2, 4.2}}, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + selection_box = {{-4.5, -4.5}, {4.5, 4.5}}, + drawing_box = {{-4.5, -4.7}, {4.5, 4.5}}, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/base.png", + priority = "high", + width = 577, + height = 605, + frame_count = 1, + line_length = 1, + repeat_count = 128, + shift = util.by_pixel(0, -8), + animation_speed = 0.5, + scale = 0.5, + }, + { + priority = "high", + width = 512, + height = 422, + frame_count = 128, + shift = util.by_pixel(-0, -51), + animation_speed = 0.25, + scale = 0.5, + stripes = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/top-1.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/top-2.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/top-3.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/top-4.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/top-5.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/top-6.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/top-7.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/top-8.png", + width_in_frames = 4, + height_in_frames = 4, + }, + } + }, + { + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/middle.png", + priority = "high", + width = 40, + height = 82, + frame_count = 128, + line_length = 16, + shift = util.by_pixel(51, 79), + animation_speed = 0.25, + scale = 0.5, + }, + --[[{ + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/lower.png", + priority = "high", + width = 80, + height = 22, + frame_count = 128, + line_length = 8, + shift = util.by_pixel(62, 137), + scale = 0.5, + },]]-- + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/space-manufactory/hr/shadow.png", + priority = "high", + width = 795, + height = 430, + frame_count = 1, + line_length = 1, + repeat_count = 128, + shift = util.by_pixel(67, 38), + scale = 0.5, + }, + }, + }, + crafting_categories = {"crafting", "advanced-crafting", "crafting-with-fluid", "space-crafting", "space-manufacturing"}, + crafting_speed = 10, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 50, + }, + energy_usage = "2000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 6 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.8, size = 20, shift = {0.0, 0.0}, color = {r = 0.7, g = 0.8, b = 1}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-plasma-generator.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-plasma-generator.lua new file mode 100644 index 0000000..0926411 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-plasma-generator.lua @@ -0,0 +1,224 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-plasma-generator", + icon = "__space-exploration-graphics__/graphics/icons/plasma-generator.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-plasma-generator"}, + max_health = 700, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-3.2, -3.2}, {3.2, 3.2}}, + selection_box = {{-3.5, -3.5}, {3.5, 3.5}}, + drawing_box = {{-3.5, -5.5}, {3.5, 3.5}}, + resistances = + { + { + type = "electric", + percent = 70 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {-4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 4} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {4, 0} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { + { + filename = "__base__/sound/lab.ogg", + volume = 0.8 + }, + }, + apparent_volume = 1.5, + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/sr/base.png", + priority = "high", + width = 448/2, + height = 576/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(0, -16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/hr/base.png", + priority = "high", + width = 448, + height = 576, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(0, -16), + animation_speed = 1, + scale = 0.5, + } + }, + { + priority = "high", + width = 1392/4/2, + height = 1880/5/2, + frame_count = 64, + shift = util.by_pixel(-0, -17), + animation_speed = 0.25, + stripes = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/sr/animation-1.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/sr/animation-2.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/sr/animation-3.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/sr/animation-4.png", + width_in_frames = 4, + height_in_frames = 1, + }, + }, + hr_version = { + priority = "high", + width = 1392/4, + height = 1880/5, + frame_count = 64, + shift = util.by_pixel(-0, -17), + animation_speed = 0.25, + scale = 0.5, + stripes = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/hr/animation-1.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/hr/animation-2.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/hr/animation-3.png", + width_in_frames = 4, + height_in_frames = 5, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/hr/animation-4.png", + width_in_frames = 4, + height_in_frames = 1, + }, + }, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/sr/shadow.png", + priority = "high", + width = 566/2, + height = 400/2, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(35, 20), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/plasma-generator/hr/shadow.png", + priority = "high", + width = 566, + height = 400, + frame_count = 1, + line_length = 1, + repeat_count = 64, + shift = util.by_pixel(35, 20), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-plasma"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "2MW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.6, size = 16, shift = {0.0, 0.0}, color = {r = 1, g = 0.5, b = 0}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-radiator.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-radiator.lua new file mode 100644 index 0000000..1de4cb8 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-radiator.lua @@ -0,0 +1,141 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-radiator", + icon = "__space-exploration-graphics__/graphics/icons/radiator.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.1, result = data_util.mod_prefix .. "space-radiator"}, + fast_replaceable_group = data_util.mod_prefix .. "space-radiator", + max_health = 150, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, 0), + collision_box = {{-1.2, -1.2}, {1.2, 1.2}}, + selection_box = {{-1.5, -1.5}, {1.5, 1.5}}, + drawing_box = {{-1.5, -2.5}, {1.5, 1.5}}, + resistances = + { + { + type = "fire", + percent = 90 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -2} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 2} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { + { + filename = "__base__/sound/electric-furnace.ogg", + volume = 0.7 + }, + }, + apparent_volume = 1.5, + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + animation = + { + layers = + { + { + priority = "high", + width = 196, + height = 275, + frame_count = 20, + shift = util.by_pixel(-0, -12), + animation_speed = 0.25, + scale = 0.5, + stripes = + { + { + filename = "__space-exploration-graphics-4__/graphics/entity/radiator/hr/radiator.png", + width_in_frames = 10, + height_in_frames = 2, + }, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/radiator/hr/radiator-shadow.png", + priority = "high", + width = 242, + height = 147, + frame_count = 1, + line_length = 1, + repeat_count = 20, + shift = util.by_pixel(25, 11), + scale = 0.5, + }, + }, + }, + crafting_categories = {"space-radiator"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 1, + }, + energy_usage = "10kW", + ingredient_count = 12, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.3, size = 9, shift = {0.0, 0.0}, color = {r = 1, g = 0.3, b = 0.05}} + }, + }, + module_specification = + { + module_slots = 2 + }, + allowed_effects = {"consumption", "speed", "pollution"} -- not "productivity", + }, +}) +local radiator_2 = table.deepcopy(data.raw["assembling-machine"][data_util.mod_prefix .. "space-radiator"]) +radiator_2.name = data_util.mod_prefix .. "space-radiator-2" +radiator_2.crafting_speed = 2 +radiator_2.icon = "__space-exploration-graphics__/graphics/icons/radiator-blue.png" +radiator_2.minable.result = data_util.mod_prefix .. "space-radiator-2" +data_util.replace_filenames_recursive(radiator_2.animation, "radiator.png", "radiator-blue.png") +data:extend({ + radiator_2 +}) +data.raw["assembling-machine"][data_util.mod_prefix .. "space-radiator"].next_upgrade = radiator_2.name diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-science-lab.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-science-lab.lua new file mode 100644 index 0000000..49dc4ed --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-science-lab.lua @@ -0,0 +1,227 @@ +local data_util = require("data_util") + +-- space-science-lab is a lab + +data:extend({ + { + type = "lab", + name = data_util.mod_prefix .. "space-science-lab", + energy_usage = "1000kW", --"60kW", + researching_speed = 10, -- 1, + collision_box = {{-3.2, -3.2}, {3.2, 3.2}}, -- 7 wide + selection_box = {{-3.5, -3.5}, {3.5, 3.5}}, -- 7 wide + display_box = {{-3.5, -4.8}, {3.5, 3.5}}, -- 7 wide + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer -- not spaceship + }, + icon = "__space-exploration-graphics__/graphics/icons/space-science-lab.png", + icon_size = 64, + inputs = { + "automation-science-pack", + "logistic-science-pack", + "chemical-science-pack", + "military-science-pack", + "production-science-pack", + "utility-science-pack", + "space-science-pack", + data_util.mod_prefix .. "rocket-science-pack", + data_util.mod_prefix .. "astronomic-science-pack-1", + data_util.mod_prefix .. "biological-science-pack-1", + data_util.mod_prefix .. "energy-science-pack-1", + data_util.mod_prefix .. "material-science-pack-1", + data_util.mod_prefix .. "astronomic-science-pack-2", + data_util.mod_prefix .. "biological-science-pack-2", + data_util.mod_prefix .. "energy-science-pack-2", + data_util.mod_prefix .. "material-science-pack-2", + data_util.mod_prefix .. "astronomic-science-pack-3", + data_util.mod_prefix .. "biological-science-pack-3", + data_util.mod_prefix .. "energy-science-pack-3", + data_util.mod_prefix .. "material-science-pack-3", + data_util.mod_prefix .. "astronomic-science-pack-4", + data_util.mod_prefix .. "biological-science-pack-4", + data_util.mod_prefix .. "energy-science-pack-4", + data_util.mod_prefix .. "material-science-pack-4", + data_util.mod_prefix .. "deep-space-science-pack-1", + data_util.mod_prefix .. "deep-space-science-pack-2", + data_util.mod_prefix .. "deep-space-science-pack-3", + data_util.mod_prefix .. "deep-space-science-pack-4", + }, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + energy_source = { + type = "electric", + usage_priority = "secondary-input" + }, + flags = { "placeable-player", "player-creation" }, + light = { color = { b = 1, g = 0.6, r = 0.4 }, intensity = 1, size = 12 }, + max_health = 500, + minable = { mining_time = 0.2, result = data_util.mod_prefix .. "space-science-lab" }, + module_specification = { + max_entity_info_module_icon_rows = 1, + max_entity_info_module_icons_per_row = 7, + module_info_icon_shift = { 0, 2 }, + module_slots = 6 + }, + off_animation = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/sr/space-science-lab-inactive.png", + frame_count = 1, + height = 541/2, + width = 467/2, + shift = { 0/32, -12/32}, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/hr/space-science-lab-inactive.png", + frame_count = 1, + height = 541, + width = 467, + shift = { 0/32, -12/32}, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/sr/space-science-lab-shadow.png", + frame_count = 1, + width = 599/2, + height = 345/2, + shift = { 1.40625, 0.34375 }, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/hr/space-science-lab-shadow.png", + frame_count = 1, + width = 599, + height = 345, + scale = 0.5, + shift = { 1.40625, 0.34375 }, + }, + } + } + }, + on_animation = { + layers = { + { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/sr/space-science-lab-base.png", + width = 467/2, + height = 290/2, + line_length = 1, + frame_count = 1, + repeat_count = 64, + animation_speed = 1, + shift = { 0/32, 50.5/32 }, + hr_version = { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/hr/space-science-lab-base.png", + width = 467, + height = 290, + line_length = 1, + frame_count = 1, + repeat_count = 64, + animation_speed = 1, + shift = { 0/32, 50.5/32 }, + scale = 0.5, + }, + }, + { + height = 448/2, + width = 402/2, + frame_count = 64, + animation_speed = 1, + shift = { 1/32, -35/32 }, + stripes = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/sr/space-science-lab-1.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/sr/space-science-lab-2.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/sr/space-science-lab-3.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/sr/space-science-lab-4.png", + width_in_frames = 4, + height_in_frames = 4, + }, + }, + hr_version = { + height = 448, + width = 402, + frame_count = 64, + animation_speed = 1, + shift = { 1/32, -35/32 }, + stripes = + { + { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/hr/space-science-lab-1.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/hr/space-science-lab-2.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/hr/space-science-lab-3.png", + width_in_frames = 4, + height_in_frames = 4, + }, + { + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/hr/space-science-lab-4.png", + width_in_frames = 4, + height_in_frames = 4, + }, + }, + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/sr/space-science-lab-shadow.png", + width = 599/2, + height = 345/2, + line_length = 1, + frame_count = 1, + repeat_count = 64, + animation_speed = 1, + shift = { 1.40625, 0.34375 }, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-3__/graphics/entity/space-science-lab/hr/space-science-lab-shadow.png", + width = 599, + height = 345, + line_length = 1, + frame_count = 1, + repeat_count = 64, + animation_speed = 1, + scale = 0.5, + shift = { 1.40625, 0.34375 }, + }, + } + } + }, + vehicle_impact_sound = { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.65 + }, + working_sound = { + apparent_volume = 1, + sound = { + filename = "__base__/sound/lab.ogg", + volume = 0.7 + } + } + } +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-supercomputer.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-supercomputer.lua new file mode 100644 index 0000000..658f8f9 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/space-supercomputer.lua @@ -0,0 +1,672 @@ +local data_util = require("data_util") +local blank_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, +} +local pipe_pictures = { + north = blank_image, + east = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/pipe-right.png", + width = 28/2, + height = 70/2, + priority = "extra-high", + shift = util.by_pixel(-24, 0), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/pipe-right.png", + width = 28, + height = 70, + priority = "extra-high", + shift = util.by_pixel(-24, 0), + scale = 0.5, + }, + }, + south = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/pipe-bottom.png", + width = 84/2, + height = 72/2, + priority = "extra-high", + shift = util.by_pixel(1, -34), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/pipe-bottom.png", + width = 84, + height = 72, + priority = "extra-high", + shift = util.by_pixel(1, -34), + scale = 0.5, + }, + }, + west = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/pipe-left.png", + width = 28/2, + height = 70/2, + priority = "extra-high", + shift = util.by_pixel(23, 4), + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/pipe-left.png", + width = 28, + height = 70, + priority = "extra-high", + shift = util.by_pixel(23, 4), + scale = 0.5, + }, + } +} +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-supercomputer-1", + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-1.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = { mining_time = 0.1, result = data_util.mod_prefix .. "space-supercomputer-1"}, + fast_replaceable_group = data_util.mod_prefix .. "space-supercomputer", + next_upgrade = data_util.mod_prefix .. "space-supercomputer-2", + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, 0), + resistances = + { + }, + fluid_boxes = + { + { + production_type = "input", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -3} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 3} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { + { + filename = "__base__/sound/lab.ogg", + volume = 0.7 + }, + }, + apparent_volume = 1, + }, + collision_box = {{-2.2, -2.2}, {2.2, 2.2}}, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + drawing_box = {{-2.5, -4.0}, {2.5, 2.5}}, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-1.png", + priority = "high", + width = 320/2, + height = 384/2, + frame_count = 1, + shift = util.by_pixel(-0, -16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-1.png", + priority = "high", + width = 320, + height = 384, + frame_count = 1, + shift = util.by_pixel(-0, -16), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-shadow.png", + priority = "high", + width = 302/2, + height = 260/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(75, 27), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-shadow.png", + priority = "high", + width = 302, + height = 260, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(75, 27), + scale = 0.5, + }, + }, + }, + }, + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.6, size = 16, shift = {0.0, 0.0}, color = {r = 1, g = 0.2, b = 0.1}} + }, + { + animation = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-1-working.png", + priority = "high", + width = 792/9/2, + height = 286/2, + frame_count = 9, + shift = util.by_pixel(-0, -39), + animation_speed = 0.5, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-1-working.png", + priority = "high", + width = 792/9, + height = 286, + frame_count = 9, + shift = util.by_pixel(-0, -39), + animation_speed = 0.5, + scale = 0.5, + } + }, + } + }, + crafting_categories = {"space-supercomputing-1"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 2 + }, + allowed_effects = {"consumption", "speed", "pollution"} -- not "productivity", + }, + + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-supercomputer-2", + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-2.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {hardness = 0.2, mining_time = 0.5, result = data_util.mod_prefix .. "space-supercomputer-2"}, + fast_replaceable_group = data_util.mod_prefix .. "space-supercomputer", + next_upgrade = data_util.mod_prefix .. "space-supercomputer-3", + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, 0), + resistances = + { + }, + fluid_boxes = + { + { + production_type = "input", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -3} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 3} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { + { + filename = "__base__/sound/lab.ogg", + volume = 0.7 + }, + }, + apparent_volume = 1, + }, + collision_box = {{-2.2, -2.2}, {2.2, 2.2}}, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + drawing_box = {{-2.5, -4.0}, {2.5, 2.5}}, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-2.png", + priority = "high", + width = 320/2, + height = 384/2, + frame_count = 1, + shift = util.by_pixel(-0, -16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-2.png", + priority = "high", + width = 320, + height = 384, + frame_count = 1, + shift = util.by_pixel(-0, -16), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-shadow.png", + priority = "high", + width = 302/2, + height = 260/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(75, 27), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-shadow.png", + priority = "high", + width = 302, + height = 260, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(75, 27), + scale = 0.5, + }, + }, + }, + }, + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.6, size = 16, shift = {0.0, 0.0}, color = {r = 1, g = 1, b = 0.1}} + }, + { + animation = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-2-working.png", + priority = "high", + width = 792/9/2, + height = 286/2, + frame_count = 9, + shift = util.by_pixel(-0, -39), + animation_speed = 0.5, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-2-working.png", + priority = "high", + width = 792/9, + height = 286, + frame_count = 9, + shift = util.by_pixel(-0, -39), + animation_speed = 0.5, + scale = 0.5, + } + }, + } + }, + crafting_categories = {"space-supercomputing-1", "space-supercomputing-2"}, + crafting_speed = 2, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "2500kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"} -- not "productivity", + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-supercomputer-3", + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-3.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {hardness = 0.2, mining_time = 0.5, result = data_util.mod_prefix .. "space-supercomputer-3"}, + fast_replaceable_group = data_util.mod_prefix .. "space-supercomputer", + next_upgrade = data_util.mod_prefix .. "space-supercomputer-4", + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, 0), + resistances = + { + }, + fluid_boxes = + { + { + production_type = "input", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -3} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 3} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { + { + filename = "__base__/sound/lab.ogg", + volume = 0.7 + }, + }, + apparent_volume = 1, + }, + collision_box = {{-2.2, -2.2}, {2.2, 2.2}}, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + drawing_box = {{-2.5, -4.0}, {2.5, 2.5}}, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-3.png", + priority = "high", + width = 320/2, + height = 384/2, + frame_count = 1, + shift = util.by_pixel(-0, -16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-3.png", + priority = "high", + width = 320, + height = 384, + frame_count = 1, + shift = util.by_pixel(-0, -16), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-shadow.png", + priority = "high", + width = 302/2, + height = 260/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(75, 27), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-shadow.png", + priority = "high", + width = 302, + height = 260, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(75, 27), + scale = 0.5, + }, + }, + }, + }, + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.6, size = 16, shift = {0.0, 0.0}, color = {r = 0.1, g = 1, b = 1}} + }, + { + animation = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-3-working.png", + priority = "high", + width = 792/9/2, + height = 286/2, + frame_count = 9, + shift = util.by_pixel(-0, -39), + animation_speed = 0.5, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-3-working.png", + priority = "high", + width = 792/9, + height = 286, + frame_count = 9, + shift = util.by_pixel(-0, -39), + animation_speed = 0.5, + scale = 0.5, + } + }, + } + }, + crafting_categories = {"space-supercomputing-1", "space-supercomputing-2", "space-supercomputing-3"}, + crafting_speed = 4, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "5000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 6 + }, + allowed_effects = {"consumption", "speed", "pollution"} -- not "productivity", + }, + + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-supercomputer-4", + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-4.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {hardness = 0.2, mining_time = 0.5, result = data_util.mod_prefix .. "space-supercomputer-4"}, + fast_replaceable_group = data_util.mod_prefix .. "space-supercomputer", + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, 0), + resistances = + { + }, + fluid_boxes = + { + { + production_type = "input", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -3} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + pipe_picture = pipe_pictures, + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 3} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = { + { + filename = "__base__/sound/lab.ogg", + volume = 0.7 + }, + }, + apparent_volume = 1, + }, + collision_box = {{-2.2, -2.2}, {2.2, 2.2}}, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + drawing_box = {{-2.5, -4.0}, {2.5, 2.5}}, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-4.png", + priority = "high", + width = 320/2, + height = 384/2, + frame_count = 1, + shift = util.by_pixel(-0, -16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-4.png", + priority = "high", + width = 320, + height = 384, + frame_count = 1, + shift = util.by_pixel(-0, -16), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-shadow.png", + priority = "high", + width = 302/2, + height = 260/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(75, 27), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-shadow.png", + priority = "high", + width = 302, + height = 260, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(75, 27), + scale = 0.5, + }, + }, + }, + }, + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.8, size = 16, shift = {0.0, 0.0}, color = {r = 0.3, g = 0.1, b = 1}} + }, + { + animation = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/sr/supercomputer-4-working.png", + priority = "high", + width = 560/4/2, + height = 1184/4/2, + line_length = 4, + frame_count = 16, + shift = util.by_pixel(-0, -35), + animation_speed = 0.05, + blend_mode = "additive", + draw_as_glow = true, + max_advance = 1, + hr_version = { + filename = "__space-exploration-graphics-5__/graphics/entity/supercomputer/hr/supercomputer-4-working.png", + priority = "high", + width = 560/4, + height = 1184/4, + line_length = 4, + frame_count = 16, + shift = util.by_pixel(-0, -35), + animation_speed = 0.05, + blend_mode = "additive", + draw_as_glow = true, + max_advance = 1, + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-supercomputing-1", "space-supercomputing-2", "space-supercomputing-3", "space-supercomputing-4"}, + crafting_speed = 6, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "10000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 8 + }, + allowed_effects = {"consumption", "speed", "pollution"} -- not "productivity", + } +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/spaceship-obstacles.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/spaceship-obstacles.lua new file mode 100644 index 0000000..3480b65 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/spaceship-obstacles.lua @@ -0,0 +1,353 @@ +local data_util = require("data_util") + +local health_multiplier = 20 + +-- projectile: invisible. Deals damage if it hits stuff, maybe destroys floor too. +-- graphic: The visible graphic, may also be mined. +-- targetable: invisible. exists so that turrets will shoot it, should only exist when moving. +local blank = { + filename = "__space-exploration-graphics__/graphics/blank.png", + priority = "high", + frame_count = 1, + height = 1, + width = 1, +} +local meteors = { + ["meteor-01"] = {209, 138}, + ["meteor-02"] = {165,129}, + ["meteor-03"] = {151,139}, + ["meteor-04"] = {216,110}, + ["meteor-05"] = {154,147}, + ["meteor-06"] = {154,132}, + ["meteor-07"] = {193,120}, + ["meteor-08"] = {136,117}, + ["meteor-09"] = {157,115}, + ["meteor-10"] = {198,153}, + ["meteor-11"] = {190,115}, + ["meteor-12"] = {229,126}, + ["meteor-13"] = {151,125}, + ["meteor-14"] = {137,117}, + ["meteor-15"] = {201,141}, + ["meteor-16"] = {209,154}, +} +local pictures_small = {} +local pictures_medium = {} +for name, meteor in pairs(meteors) do + table.insert(pictures_small, + { + filename = "__space-exploration-graphics__/graphics/entity/meteor/sr/"..name..".png", + width = math.floor(meteor[1]/2), + height = math.floor(meteor[2]/2), + priority = "high", + shift = { 0, 0 }, + scale = 0.2, + }) + table.insert(pictures_medium, + { + filename = "__space-exploration-graphics__/graphics/entity/meteor/sr/"..name..".png", + width = math.floor(meteor[1]/2), + height = math.floor(meteor[2]/2), + priority = "high", + shift = { 0, 0 }, + tint={r = 0.75, g = 0.75, b = 0.75}, + scale = 0.6, + }) +end +local resistances = { + -- no laser + { type = "explosion", percent = 10 }, + { type = "physical", percent = 20}, + { type = "impact", percent = 50 }, + { type = "electric", percent = 50 }, + { type = "fire", percent = 90 }, + { type = "poison", percent = 100 }, + { type = "meteor", percent = 100 }, +} + +data:extend({ + + { + type = "lamp", + name = data_util.mod_prefix.."spaceship-travel-anchor", + flags = { "not-on-map", "placeable-off-grid", "placeable-neutral" }, + collision_mask = {"not-colliding-with-itself"}, + collision_box = { { -0.0, -0.0 }, { 0.0, 0.0 } }, + picture_on = blank, + picture_off = blank, + icon = "__space-exploration-graphics__/graphics/blank.png", + icon_size = 64, + energy_source = { + type = "void" + }, + energy_usage_per_tick = "1W", + light = { + type = "basic", + intensity = 0, + size = 0 + }, + localised_name = {"entity-name.small-asteroid"}, + }, + -- SPECK + { -- just a visual for motion + type = "simple-entity", + name = data_util.mod_prefix.."spaceship-speck-graphic", + direction_only = true, + flags = { "not-on-map", "placeable-off-grid" }, + acceleration = 0, + collision_mask = {"not-colliding-with-itself"}, + collision_box = { { -0.0, -0.0 }, { 0.0, 0.0 } }, + pictures = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-particle/speck.png", + frame_count = 1, + height = 50, + priority = "high", + width = 3 + }, + localised_name = {"entity-name.small-asteroid"}, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "spaceship-speck-graphic", + filename = "__space-exploration-graphics__/graphics/entity/spaceship-particle/speck.png", + priority = "extra-high", + width = 3, + height = 50, + shift = {0,0}, + apply_runtime_tint = true, + }, + + -- small-rock + { + type = "simple-entity-with-force", + name = data_util.mod_prefix .. "spaceship-obstacle-rock-small-targetable", + selectable_in_game = false, + collision_box = { { -0, -0 }, { 0, 0 } }, + collision_mask = {"not-colliding-with-itself"}, + selection_box = { { -0.2, -0.2 }, { 0.2, 0.2 } }, + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__base__/graphics/icons/small-scorchmark.png", + icon_size = 64, + max_health = 20*health_multiplier, + order = "s-e-w-f", + render_layer = "object", + pictures = pictures_small, + dying_explosion = "explosion-hit", + localised_name = {"entity-name.small-asteroid"}, + resistances = resistances, + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "spaceship-obstacle-rock-small-graphic", + selectable_in_game = true, + selection_priority = 2, + count_as_rock_for_filtered_deconstruction = true, + collision_box = { { -0, -0 }, { 0, 0 } }, + collision_mask = {"not-colliding-with-itself"}, + selection_box = { { -0.2, -0.2 }, { 0.2, 0.2 } }, + minable = { + mining_particle = "stone-particle", + mining_time = 0.2, + results = { + {name = "stone", amount_min = 1, amount_max = 3}, + {name = "iron-ore", amount_min = 1, amount_max = 3}, + {name = "copper-ore", amount_min = 1, amount_max = 3}, + }, + }, + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__base__/graphics/icons/small-scorchmark.png", + icon_size = 64, + max_health = 20*health_multiplier, + order = "s-e-w-f", + render_layer = "object", + pictures = pictures_small, + dying_explosion = "explosion-hit", + localised_name = {"entity-name.small-asteroid"}, + resistances = resistances, + }, + { + type = "projectile", + name = data_util.mod_prefix.."spaceship-obstacle-rock-small-projectile", + direction_only = true, + flags = { "not-on-map", "placeable-off-grid" }, + acceleration = 0, + collision_box = { { -0.05, -0.25 }, { 0.05, 0.25 } }, + force_condition = "not-friend", + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 200, + type = "meteor" + }, + type = "damage" + }, + { type = "create-entity", entity_name = "explosion-hit" }, + }, + type = "instant" + }, + type = "direct" + }, + animation = blank, + localised_name = {"entity-name.small-asteroid"}, + }, + + -- ROCK MEDIUM + { + type = "simple-entity", + name = data_util.mod_prefix .. "spaceship-obstacle-rock-medium-graphic", + selectable_in_game = true, + selection_priority = 2, + count_as_rock_for_filtered_deconstruction = true, + minable = { + mining_particle = "stone-particle", + mining_time = 0.5, + results = { + {name = "stone", amount_min = 0, amount_max = 15}, + {name = "iron-ore", amount_min = 0, amount_max = 15}, + {name = "copper-ore", amount_min = 0, amount_max = 15}, + }, + }, + collision_box = { { -0, -0 }, { 0, 0 } }, + collision_mask = {"not-colliding-with-itself"}, + selection_box = { { -0.5, -0.5 }, { 0.5, 0.5 } }, + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__base__/graphics/icons/small-scorchmark.png", + icon_size = 64, + max_health = 200*health_multiplier, + order = "s-e-w-f", + render_layer = "object", + pictures = pictures_medium, + dying_explosion = "big-explosion-hit", + localised_name = {"entity-name.small-asteroid"}, + resistances = resistances, + }, + { + type = "simple-entity-with-force", + name = data_util.mod_prefix .. "spaceship-obstacle-rock-medium-targetable", + selectable_in_game = false, + collision_box = { { -0, -0 }, { 0, 0 } }, + collision_mask = {"not-colliding-with-itself"}, + selection_box = { { -0.5, -0.5 }, { 0.5, 0.5 } }, + flags = { "placeable-neutral", "player-creation", "placeable-off-grid"}, + icon = "__base__/graphics/icons/small-scorchmark.png", + icon_size = 64, + max_health = 200*health_multiplier, + order = "s-e-w-f", + render_layer = "object", + pictures = blank, + dying_explosion = "big-explosion-hit", + localised_name = {"entity-name.small-asteroid"}, + resistances = resistances, + }, + { + type = "projectile", + name = data_util.mod_prefix.."spaceship-obstacle-rock-medium-projectile", + direction_only = true, + flags = { "not-on-map", "placeable-off-grid" }, + acceleration = 0, + collision_box = { { -0.25, -0.25 }, { 0.25, 0.25 } }, + force_condition = "not-friend", + action = { + action_delivery = { + target_effects = { + { type = "nested-result", action = { type = "area", radius = 0.5, + action_delivery = { type = "instant", target_effects = { { type = "damage", damage = { amount = 400, type = "meteor" }}}}, + }}, + { type = "nested-result", action = { type = "area", radius = 1.5, + action_delivery = { type = "instant", target_effects = { { type = "damage", damage = { amount = 40, type = "meteor" }}}}, + }}, + { type = "nested-result", action = { type = "area", radius = 2.5, + action_delivery = { type = "instant", target_effects = { { type = "damage", damage = { amount = 5, type = "meteor" }}}}, + }}, + { type = "create-entity", entity_name = "big-explosion-hit" }, + }, + type = "instant" + }, + type = "direct" + }, + animation = blank, + localised_name = {"entity-name.small-asteroid"}, + }, + + + + -- ROCK large + { + type = "simple-entity", + name = data_util.mod_prefix .. "spaceship-obstacle-rock-large-graphic", + selectable_in_game = true, + selection_priority = 2, + count_as_rock_for_filtered_deconstruction = true, + minable = { + mining_particle = "stone-particle", + mining_time = 4, + results = { + {name = "stone", amount_min = 0, amount_max = 5000}, + {name = "iron-ore", amount_min = 0, amount_max = 5000}, + {name = "copper-ore", amount_min = 0, amount_max = 5000}, + {name = "uranium-ore", amount_min = 0, amount_max = 500}, + }, + }, + collision_box = { { -0, -0 }, { 0, 0 } }, + collision_mask = {"not-colliding-with-itself"}, + selection_box = { { -1, -1 }, { 1, 1 } }, + flags = {"placeable-neutral", "placeable-off-grid", "not-on-map"}, + icon = "__base__/graphics/icons/small-scorchmark.png", + icon_size = 64, + max_health = 2000*health_multiplier, + order = "s-e-w-f", + render_layer = "object", + pictures = pictures_medium, + dying_explosion = "big-explosion-hit", + localised_name = {"entity-name.small-asteroid"}, + resistances = resistances, + }, + { + type = "simple-entity-with-force", + name = data_util.mod_prefix .. "spaceship-obstacle-rock-large-targetable", + selectable_in_game = false, + collision_box = { { -0, -0 }, { 0, 0 } }, + collision_mask = {"not-colliding-with-itself"}, + selection_box = { { -1, -1 }, { 1, 1 } }, + flags = { "placeable-neutral", "player-creation", "placeable-off-grid"}, + icon = "__base__/graphics/icons/small-scorchmark.png", + icon_size = 64, + max_health = 2000*health_multiplier, + order = "s-e-w-f", + render_layer = "object", + pictures = blank, + dying_explosion = "big-explosion-hit", + localised_name = {"entity-name.small-asteroid"}, + resistances = resistances, + }, + { + type = "projectile", + name = data_util.mod_prefix.."spaceship-obstacle-rock-large-projectile", + direction_only = true, + flags = { "not-on-map", "placeable-off-grid" }, + acceleration = 0, + collision_box = { { -0.5, -0.5 }, { 0.5, 0.5 } }, + force_condition = "not-friend", + action = { + action_delivery = { + target_effects = { + { type = "nested-result", action = { type = "area", radius = 0.5, + action_delivery = { type = "instant", target_effects = { { type = "damage", damage = { amount = 4000, type = "meteor" }}}}, + }}, + { type = "nested-result", action = { type = "area", radius = 1.5, + action_delivery = { type = "instant", target_effects = { { type = "damage", damage = { amount = 150, type = "meteor" }}}}, + }}, + { type = "nested-result", action = { type = "area", radius = 2.5, + action_delivery = { type = "instant", target_effects = { { type = "damage", damage = { amount = 150, type = "meteor" }}}}, + }}, + { type = "create-entity", entity_name = "big-explosion-hit" }, + }, + type = "instant" + }, + type = "direct" + }, + animation = blank, + localised_name = {"entity-name.small-asteroid"}, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/spaceship.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/spaceship.lua new file mode 100644 index 0000000..50d5991 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/spaceship.lua @@ -0,0 +1,1106 @@ +local data_util = require("data_util") + +local blank_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, +} +local blank_directions = { + north = blank_image, + east = blank_image, + south = blank_image, + west = blank_image +} +local wall = table.deepcopy(data.raw.wall["stone-wall"]) + +wall.name = data_util.mod_prefix .. "spaceship-wall" +wall.minable.result = data_util.mod_prefix .. "spaceship-wall" +wall.max_health = 400 +wall.resistances = { + {type = "meteor", percent = 50}, + {type = "impact", percent = 50}, + {type = "physical", percent = 50}, + {type = "laser", percent = 50}, + {type = "fire", percent = 50}, + {type = "electric", percent = 50}, + {type = "explosion", percent = 50}, + {type = "acid", percent = 50}, + {type = "poison", percent = 100}, +} +if mods["aai-industry"] then + data_util.replace_filenames_recursive(wall.pictures, "__aai-industry__", "__space-exploration-graphics__") + data_util.replace_filenames_recursive(wall.pictures, "stone-wall", "spaceship-wall") +else + data_util.replace_filenames_recursive(wall.pictures, "__base__", "__space-exploration-graphics__") + data_util.replace_filenames_recursive(wall.pictures, "entity/wall", "entity/spaceship-wall") +end +wall.collision_mask = { + "ground-tile", + "water-tile", + "object-layer", + "player-layer", + "train-layer", + "item-layer", +} +wall.fast_replaceable_group = nil +wall.next_upgrade = nil +wall.icon = "__space-exploration-graphics__/graphics/icons/spaceship-wall.png" +wall.icon_size = 64 +wall.icon_mipmaps = 1 + +local gate = table.deepcopy(data.raw.gate["gate"]) +gate.name = data_util.mod_prefix .. "spaceship-gate" +gate.minable.result = data_util.mod_prefix .. "spaceship-gate" +for _, pictures in pairs({gate.horizontal_animation, gate.horizontal_rail_animation_left, gate.horizontal_rail_animation_right, gate.horizontal_rail_base, + gate.vertical_animation, gate.vertical_rail_animation_left, gate.vertical_rail_animation_right, gate.vertical_rail_base }) do + data_util.replace_filenames_recursive(pictures, "__base__/graphics/entity/gate/", "__space-exploration-graphics__/graphics/entity/spaceship-gate/") +end +gate.collision_mask = { + "ground-tile", + "water-tile", + "object-layer", + "item-layer", + "player-layer", + "train-layer", +} +gate.opened_collision_mask = { -- thanks Bilka + "ground-tile", + "water-tile", + "object-layer", + "item-layer", +} +gate.fast_replaceable_group = nil +gate.next_upgrade = nil +gate.icon = "__space-exploration-graphics__/graphics/icons/spaceship-gate.png" +gate.icon_size = 64 +gate.icon_mipmaps = 1 + + +local booster = { + type = "storage-tank", + name = "storage-tank", + icon = "__base__/graphics/icons/storage-tank.png", + icon_size = 64, + icon_mipmaps = 1, + flags = {"placeable-player", "player-creation"}, + minable = {mining_time = 0.5, result = "storage-tank"}, + max_health = 500, + corpse = "medium-remnants", + collision_box = {{-1.3, -1.3}, {1.3, 1.3}}, + selection_box = {{-1.5, -1.5}, {1.5, 1.5}}, + fluid_box = + { + base_area = 250, + pipe_covers = pipecoverspictures(), + pipe_connections = + { + { position = {-1, -2} }, + { position = {2, 1} }, + { position = {1, 2} }, + { position = {-2, -1} } + } + }, + two_direction_only = true, + window_bounding_box = {{-0.125, 0.6875}, {0.1875, 1.1875}}, + pictures = + { + picture = + { + sheets = + { + { + filename = "__base__/graphics/entity/storage-tank/storage-tank.png", + priority = "extra-high", + frames = 2, + width = 110, + height = 108, + shift = util.by_pixel(0, 4), + hr_version = + { + filename = "__base__/graphics/entity/storage-tank/hr-storage-tank.png", + priority = "extra-high", + frames = 2, + width = 219, + height = 215, + shift = util.by_pixel(-0.25, 3.75), + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/storage-tank/storage-tank-shadow.png", + priority = "extra-high", + frames = 2, + width = 146, + height = 77, + shift = util.by_pixel(30, 22.5), + draw_as_shadow = true, + hr_version = + { + filename = "__base__/graphics/entity/storage-tank/hr-storage-tank-shadow.png", + priority = "extra-high", + frames = 2, + width = 291, + height = 153, + shift = util.by_pixel(29.75, 22.25), + scale = 0.5, + draw_as_shadow = true + } + } + } + }, + fluid_background = + { + filename = "__base__/graphics/entity/storage-tank/fluid-background.png", + priority = "extra-high", + width = 32, + height = 15 + }, + window_background = + { + filename = "__base__/graphics/entity/storage-tank/window-background.png", + priority = "extra-high", + width = 17, + height = 24, + hr_version = + { + filename = "__base__/graphics/entity/storage-tank/hr-window-background.png", + priority = "extra-high", + width = 34, + height = 48, + scale = 0.5 + } + }, + flow_sprite = + { + filename = "__base__/graphics/entity/pipe/fluid-flow-low-temperature.png", + priority = "extra-high", + width = 160, + height = 20 + }, + gas_flow = + { + filename = "__base__/graphics/entity/pipe/steam.png", + priority = "extra-high", + line_length = 10, + width = 24, + height = 15, + frame_count = 60, + axially_symmetrical = false, + direction_count = 1, + animation_speed = 0.25, + hr_version = + { + filename = "__base__/graphics/entity/pipe/hr-steam.png", + priority = "extra-high", + line_length = 10, + width = 48, + height = 30, + frame_count = 60, + axially_symmetrical = false, + animation_speed = 0.25, + direction_count = 1, + scale = 0.5 + } + } + }, + flow_length_in_ticks = 360, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = + { + sound = + { + filename = "__base__/sound/storage-tank.ogg", + volume = 0.8 + }, + match_volume_to_activity = true, + apparent_volume = 1.5, + max_sounds_per_type = 3 + }, + circuit_wire_connection_points = circuit_connector_definitions["storage-tank"].points, + circuit_connector_sprites = circuit_connector_definitions["storage-tank"].sprites, + circuit_wire_max_distance = default_circuit_wire_max_distance +} +booster.name = data_util.mod_prefix .. "spaceship-rocket-booster-tank" +booster.minable.result = data_util.mod_prefix .. "spaceship-rocket-booster-tank" +booster.collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", +} +booster.rotatable = false +booster.collision_box = { {-1.3, -1.1}, {1.3, 1.3} } +booster.fluid_box = { + filter = data_util.mod_prefix .. "liquid-rocket-fuel", + base_area = 1000, + pipe_connections = { + { position = { 0, -2 } }, + { position = { 2, 0 } }, + { position = { -2, 0 } }, + { position = { 0, 2 } }, + }, + pipe_covers = pipecoverspictures(), + secondary_draw_orders = { north = -1 } +} +booster.icon = "__space-exploration-graphics__/graphics/icons/spaceship-rocket-booster-tank.png" +booster.drawing_box = { {-1.5, -2.5}, {1.5, 1.5} } +booster.window_bounding_box = { + util.by_pixel(40/2, -32/2), + util.by_pixel(72/2, 64/2) +} +booster.pictures = { + flow_sprite = { + filename = "__base__/graphics/entity/pipe/fluid-flow-low-temperature.png", + height = 20, + priority = "extra-high", + width = 160, + --shift = util.by_pixel(56/2, 16/2), + }, + fluid_background = { + filename = "__base__/graphics/entity/storage-tank/fluid-background.png", + height = 15, + priority = "extra-high", + width = 32, + shift = util.by_pixel(-5, 0) + --shift = util.by_pixel(56/2, 16/2), + }, + gas_flow = { + animation_speed = 0.25, + axially_symmetrical = false, + direction_count = 1, + filename = "__base__/graphics/entity/pipe/steam.png", + frame_count = 60, + height = 15, + line_length = 10, + priority = "extra-high", + width = 24, + shift = util.by_pixel(-14, 2), + hr_version = { + animation_speed = 0.25, + axially_symmetrical = false, + direction_count = 1, + filename = "__base__/graphics/entity/pipe/hr-steam.png", + frame_count = 60, + height = 30, + line_length = 10, + priority = "extra-high", + width = 48, + shift = util.by_pixel(-14, 2), + }, + }, + picture = { + sheets = { + { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-booster-tank/spaceship-rocket-booster-tank.png", + frames = 1, + height = 256/2, + width = 192/2, + priority = "extra-high", + shift = util.by_pixel(0, -16), + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-booster-tank/hr-spaceship-rocket-booster-tank.png", + frames = 1, + height = 256, + width = 192, + priority = "extra-high", + shift = util.by_pixel(0, -16), + scale = 0.5, + }, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-booster-tank/spaceship-rocket-booster-tank-shadow.png", + frames = 1, + width = 262/2, + height = 134/2, + priority = "extra-high", + shift = util.by_pixel(18, 14), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-booster-tank/hr-spaceship-rocket-booster-tank-shadow.png", + frames = 1, + width = 262, + height = 134, + priority = "extra-high", + shift = util.by_pixel(18, 14), + scale = 0.5, + }, + } + } + }, + window_background = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-booster-tank/spaceship-rocket-booster-tank-background.png", + priority = "extra-high", + width = 32/2, + height = 96/2, + --shift = util.by_pixel(56/2, 16/2), + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-booster-tank/hr-spaceship-rocket-booster-tank-background.png", + priority = "extra-high", + width = 32, + height = 96, + --shift = util.by_pixel(56/2, 16/2), + scale = 0.5, + }, + } +} +local antimatter_booster = table.deepcopy(booster) +antimatter_booster.name = data_util.mod_prefix.."spaceship-antimatter-booster-tank" +antimatter_booster.minable.result = data_util.mod_prefix .. "spaceship-antimatter-booster-tank" +data_util.replace_filenames_recursive(antimatter_booster.pictures, "rocket", "antimatter") +antimatter_booster.fluid_box = { + filter = data_util.mod_prefix .. "antimatter-stream", + base_area = 500, + pipe_connections = { + { position = { 0, -2 } }, + { position = { 2, 0 } }, + { position = { -2, 0 } }, + { position = { 0, 2 } }, + }, + pipe_covers = pipecoverspictures(), + secondary_draw_orders = { north = -1 } +} +local console_layers = { + layers = + { + { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-console/spaceship-console-base.png", + priority = "high", + width = 256, + height = 256, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16+3), + animation_speed = 1, + scale = 0.5, + }, + { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-console/spaceship-console-mask.png", + priority = "high", + width = 256, + height = 256, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16+3), + animation_speed = 1, + scale = 0.5, + tint = data_util.console_tint, + blend_mode = "additive", + draw_as_glow = true, + }, + { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-console/spaceship-console-white.png", + priority = "high", + width = 256, + height = 256, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, -16+3), + animation_speed = 1, + scale = 0.5, + blend_mode = "additive", + draw_as_glow = true, + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/spaceship-console/spaceship-console-shadow.png", + priority = "high", + width = 110, + height = 74, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(75, 16+3), + animation_speed = 1, + scale = 0.5, + }, + }, +} +local console_alt_layers = table.deepcopy(console_layers) +console_alt_layers.layers[2].tint = data_util.console_alt_tint + +local function connection_sprites(offset) + return { + blue_led_light_offset = offset, + led_blue = { + filename = "__base__/graphics/entity/circuit-connector/hr-ccm-universal-04e-blue-LED-on-sequence.png", + height = 60, + priority = "low", + shift = offset, + width = 60, + x = 60, + y = 0 + }, + led_blue_off = { + filename = "__base__/graphics/entity/circuit-connector/hr-ccm-universal-04f-blue-LED-off-sequence.png", + height = 44, + priority = "low", + shift = offset, + width = 46, + x = 46, + y = 0 + }, + led_green = { + filename = "__base__/graphics/entity/circuit-connector/hr-ccm-universal-04h-green-LED-sequence.png", + height = 46, + priority = "low", + shift = offset, + width = 48, + x = 48, + y = 0 + }, + led_light = { + intensity = 0.8, + size = 0.9 + }, + led_red = { + filename = "__base__/graphics/entity/circuit-connector/hr-ccm-universal-04i-red-LED-sequence.png", + height = 46, + priority = "low", + shift = offset, + width = 48, + x = 48, + y = 0 + }, + red_green_led_light_offset = offset, + } +end + +local console_connection_point_left = { + wire = { green = {-92/64, -108/64}, red = {-102/64, -102/64}, }, + shadow = { green = {-92/64 + 1, 0.5}, red = {-102/64 + 1, 0.5}, }, +} +local console_connection_point_right = { + wire = { red = {92/64, -108/64}, green = {102/64, -102/64}, }, + shadow = { red = {92/64 + 1, 0.5}, green = {102/64 + 1, 0.5}, }, +} +local output_connection_point = { + wire = { red = {92/64-1.5, -108/64+1}, green = {102/64-1.5, -102/64+1}, }, + shadow = { red = {92/64-1.5 + 1, 0.5+1}, green = {102/64-1.5 + 1, 0.5+1}, }, +} + +data:extend({ + wall, + gate, + booster, + antimatter_booster, + { + type = "accumulator", + name = data_util.mod_prefix .. "spaceship-console", + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-base.png", icon_size = 64}, + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-mask.png", icon_size = 64, tint = data_util.console_tint}, + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-white.png", icon_size = 64}, + }, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = { mining_time = 1, result = data_util.mod_prefix .. "spaceship-console"}, + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-1.6, -1.6}, {1.6, 1.6}}, + selection_box = {{-2, -2}, {2, 2}}, + drawing_box = {{-2, -2}, {2, 2}}, + resistances = + { + { type = "poison", percent = 100 }, + { type = "fire", percent = 80 }, + { type = "explosion", percent = 50 } + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + match_speed_to_activity = true, + max_sounds_per_type = 2, + sound = { + filename = "__base__/sound/combinator.ogg", + volume = 0.5 + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + charge_animation = console_layers, + picture = console_layers, + charge_cooldown = 30, + discharge_cooldown = 30, + crafting_categories = {"spaceship-console"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "primary-input", + input_flow_limit = "1001KW", + buffer_capacity = "1J", + }, + energy_usage = "1000kW", + ingredient_count = 0, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {}, + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = data_util.console_tint} + }, + }, + circuit_wire_max_distance = 10, + circuit_wire_connection_point = console_connection_point_left, + }, + { + type = "constant-combinator", + name = data_util.mod_prefix .. "spaceship-console-output", + fast_replaceable_group = data_util.mod_prefix .. "spaceship-console-output", + placeable_by = { item = data_util.mod_prefix .. "struct-generic-output", count = 1}, + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-base.png", icon_size = 64}, + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-mask.png", icon_size = 64, tint = data_util.console_tint}, + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-white.png", icon_size = 64}, + }, + flags = {"placeable-player", "player-creation", "placeable-off-grid", "not-rotatable", "not-deconstructable"}, + order = "y", + max_health = 500, + corpse = "small-remnants", + collision_box = {{-0.5, -1}, {0.5, 1}}, + collision_mask = {"floor-layer"}, + selection_box = {{-0.5, -1}, {0.5, 1}}, + scale_info_icons = false, + selectable_in_game = true, + selection_priority = 150, + item_slot_count = 10, -- speed, current_surface, target_surface, distance + sprites = + { + north = blank_image, + east = blank_image, + south = blank_image, + west = blank_image + }, + activity_led_sprites = + { + north = blank_image, + east = blank_image, + south = blank_image, + west = blank_image + }, + activity_led_light = + { + intensity = 0.8, + size = 1, + }, + activity_led_light_offsets = + { + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0} + }, + circuit_wire_connection_points = + { + output_connection_point, output_connection_point, output_connection_point, output_connection_point, + }, + circuit_wire_max_distance = 10 + }, + { + type = "accumulator", + name = data_util.mod_prefix .. "spaceship-console-alt", + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-base.png", icon_size = 64}, + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-mask.png", icon_size = 64, tint = data_util.console_alt_tint}, + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-white.png", icon_size = 64}, + }, + flags = {"placeable-neutral","placeable-player", "player-creation", "not-deconstructable"}, + --minable = { mining_time = 1, result = data_util.mod_prefix .. "spaceship-console-alt"}, + max_health = 5000, + healing_per_tick = 1, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-1.6, -1.6}, {1.6, 1.6}}, + selection_box = {{-2, -2}, {2, 2}}, + drawing_box = {{-2, -2}, {2, 2}}, + resistances = + { + { type = "poison", percent = 100 }, + { type = "fire", percent = 80 }, + { type = "explosion", percent = 50 } + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + match_speed_to_activity = true, + max_sounds_per_type = 2, + sound = { + filename = "__base__/sound/combinator.ogg", + volume = 0.5 + } + }, + collision_mask = { + --"item-layer", -- stops player from dropping items on belts. + "floor-layer", + --"object-layer", + "water-tile", + "player-layer", + }, + charge_animation = console_alt_layers, + picture = console_alt_layers, + charge_cooldown = 30, + discharge_cooldown = 30, + crafting_categories = {"spaceship-console"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "primary-input", + input_flow_limit = "1001KW", + buffer_capacity = "1J", + }, + energy_usage = "1000kW", + ingredient_count = 0, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {}, + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = data_util.console_alt_tint} + }, + }, + circuit_wire_max_distance = 10, + circuit_wire_connection_point = console_connection_point_left, + }, + { + type = "furnace", + name = data_util.mod_prefix .. "spaceship-rocket-engine", + icon = "__space-exploration-graphics__/graphics/icons/spaceship-rocket-engine.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation", "not-rotatable"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "spaceship-rocket-engine"}, + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-1.45, -1.95}, {1.45, 1.95}}, + selection_box = {{-1.45, -1.95}, {1.45, 1.95}}, + drawing_box = {{-1.5, -3}, {1.5, 4}}, + resistances = + { + { type = "poison", percent = 100 }, + { type = "fire", percent = 80 }, + { type = "explosion", percent = 50 } + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/fight/flamethrower-mid.ogg", + volume = 0.9 + }, + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + always_draw_idle_animation = true, + source_inventory_size = 0, + result_inventory_size = 0, + animation = { + layers = { + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-engine/sr/rocket-engine-shadow.png", + priority = "high", + width = 302/2, + height = 236/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(40, 24 + 16), + animation_speed = 1, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-engine/hr/rocket-engine-shadow.png", + priority = "high", + width = 302, + height = 236, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(40, 24 + 16), + animation_speed = 1, + scale = 0.5, + } + }, + }, + }, + idle_animation = { + layers = { + { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-engine/sr/rocket-engine-inactive.png", + priority = "high", + width = 256/2, + height = 416/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, 24 + 16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-engine/hr/rocket-engine-inactive.png", + priority = "high", + width = 256, + height = 416, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, 24 + 16), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-engine/sr/rocket-engine-shadow.png", + priority = "high", + width = 302/2, + height = 236/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(40, 24 + 16), + animation_speed = 1, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-engine/hr/rocket-engine-shadow.png", + priority = "high", + width = 302, + height = 236, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(40, 24 + 16), + animation_speed = 1, + scale = 0.5, + } + }, + }, + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 0.1, + base_level = -1, + pipe_connections = { + { type="input", position = {-1, -2.5} }, + { type="input", position = { 1, -2.5} } + }, + secondary_draw_orders = { north = -1 } + }, + }, + crafting_categories = {"spaceship-rocket-engine"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + smoke = { + { + frequency = 10, + name = "turbine-smoke", + position = { 0, -2 }, + starting_frame_deviation = 60, + starting_vertical_speed = 0.08 + } + }, + }, + energy_usage = "100kW", + ingredient_count = 0, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {}, + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 1.2, size = 8, shift = {0.0, 3}, color = {r = 1, g = 0.7, b = 0.1}} + }, + { + animation = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-engine/sr/rocket-engine-active.png", + priority = "high", + width = 256/2, + height = 416/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, 24 + 16), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-rocket-engine/hr/rocket-engine-active.png", + priority = "high", + width = 256, + height = 416, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, 24 + 16), + animation_speed = 1, + scale = 0.5, + } + }, + }, + smoke = { + { + frequency = 10, + name = "turbine-smoke", + position = { 0, -2 }, + starting_frame_deviation = 60, + starting_vertical_speed = 0.08 + } + }, + }, + smoke = { + { + frequency = 0.3125, + name = "turbine-smoke", + slow_down_factor = 1, + starting_frame_deviation = 60, + starting_vertical_speed = -0.08 + } + }, + circuit_wire_max_distance = 10, + }, + { + type = "furnace", + name = data_util.mod_prefix .. "spaceship-antimatter-engine", + icon = "__space-exploration-graphics__/graphics/icons/spaceship-antimatter-engine.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation", "not-rotatable"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "spaceship-antimatter-engine"}, + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-2.45, -2.95}, {2.45, 2.95}}, + selection_box = {{-2.45, -2.95}, {2.45, 2.95}}, + drawing_box = {{-2.5, -4}, {2.5, 6}}, + resistances = + { + { type = "poison", percent = 100 }, + { type = "fire", percent = 80 }, + { type = "explosion", percent = 50 } + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/fight/flamethrower-mid.ogg", + volume = 0.9 + }, + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + }, + always_draw_idle_animation = true, + source_inventory_size = 0, + result_inventory_size = 0, + animation = { + layers = { + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/spaceship-antimatter-engine/sr/antimatter-engine-shadow.png", + priority = "high", + width = 368/2, + height = 474/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(40, 24 + 16), + animation_speed = 1, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/spaceship-antimatter-engine/hr/antimatter-engine-shadow.png", + priority = "high", + width = 368, + height = 474, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(40, 24 + 16), + animation_speed = 1, + scale = 0.5, + } + }, + }, + }, + idle_animation = { + layers = { + { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-antimatter-engine/sr/antimatter-engine-inactive.png", + priority = "high", + width = 384/2, + height = 704/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, 76), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-antimatter-engine/hr/antimatter-engine-inactive.png", + priority = "high", + width = 384, + height = 704, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, 76), + animation_speed = 1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/spaceship-antimatter-engine/sr/antimatter-engine-shadow.png", + priority = "high", + width = 368/2, + height = 474/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(40, 24 + 16), + animation_speed = 1, + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics__/graphics/entity/spaceship-antimatter-engine/hr/antimatter-engine-shadow.png", + priority = "high", + width = 368, + height = 474, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(40, 24 + 16), + animation_speed = 1, + scale = 0.5, + } + }, + }, + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 0.1, + base_level = -1, + pipe_connections = { + { type="input", position = {-1, -3.5} }, + { type="input", position = { 1, -3.5} } + }, + secondary_draw_orders = { north = -1 } + }, + }, + crafting_categories = {"spaceship-antimatter-engine"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + smoke = { + { + frequency = 10, + name = "turbine-smoke", + position = { 0, -2 }, + starting_frame_deviation = 60, + starting_vertical_speed = 0.08 + } + }, + }, + energy_usage = "1000kW", + ingredient_count = 0, + module_specification = + { + module_slots = 0 + }, + allowed_effects = {}, + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 1.3, size = 12, shift = {0.0, 3}, color = {r = 1, g = 0.1, b = 1}} + }, + { + animation = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-antimatter-engine/sr/antimatter-engine-active.png", + priority = "high", + width = 384/2, + height = 704/2, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, 76), + animation_speed = 1, + hr_version = { + filename = "__space-exploration-graphics__/graphics/entity/spaceship-antimatter-engine/hr/antimatter-engine-active.png", + priority = "high", + width = 384, + height = 704, + frame_count = 1, + line_length = 1, + shift = util.by_pixel(0, 76), + animation_speed = 1, + scale = 0.5, + } + }, + }, + smoke = { + { + frequency = 10, + name = "turbine-smoke", + position = { 0, -2 }, + starting_frame_deviation = 60, + starting_vertical_speed = 0.08 + } + }, + }, + smoke = { + { + frequency = 0.3125, + name = "turbine-smoke", + slow_down_factor = 1, + starting_frame_deviation = 60, + starting_vertical_speed = -0.08 + } + }, + circuit_wire_max_distance = 10, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/starmap.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/starmap.lua new file mode 100644 index 0000000..39a665e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/starmap.lua @@ -0,0 +1,235 @@ +local data_util = require("data_util") + +local blank = { + direction_count = 8, + frame_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + priority = "low" +} + +local function make_openable_entity(name, locale, icon, width, height) + height = height or width + data:extend({ + { + type = "lamp", + name = name, + icon = icon, + icon_mipmaps = 0, + icon_size = 64, + circuit_wire_max_distance = 0, + collision_box = {{-width/2,-height/2},{width/2,height/2}}, + selection_box = {{-width/2,-height/2},{width/2,height/2}}, + corpse = "lamp-remnants", + darkness_for_all_lamps_off = 1, + darkness_for_all_lamps_on = 1, + energy_source = { + type = "void", + usage_priority = "lamp" + }, + energy_usage_per_tick = "1W", + flags = { + "placeable-neutral", + "not-blueprintable", + "not-deconstructable", + "placeable-off-grid" + }, + glow_color_intensity = 0.135, + glow_size = width, + light = { intensity = 0.9, size = 40 }, + max_health = 100, + picture_off = blank, + picture_on = blank, + localised_name = locale + } + }) +end + +data:extend({ + { + type = "sprite", + name = data_util.mod_prefix .. "map-star", + filename = "__space-exploration-graphics__/graphics/entity/starmap/star.png", + priority = "extra-high", + width = 512, + height = 512, + shift = {0,0} + }, + { + type = "animation", + name = data_util.mod_prefix .. "map-star-cloud", + animation_speed = 0.5, + filename = "__base__/graphics/entity/cloud/cloud-45-frames.png", + flags = { + "compressed" + }, + frame_count = 45, + line_length = 7, + priority = "low", + scale = 3, + width = 256, + height = 256, + apply_runtime_tint = true, + blend_mode = "additive", --"additive-soft" + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-planet", + filename = "__space-exploration-graphics__/graphics/entity/starmap/planet-base.png", + priority = "extra-high", + width = 512, + height = 512, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-planet-detail", + filename = "__space-exploration-graphics__/graphics/entity/starmap/planet-detail.png", + priority = "extra-high", + width = 512, + height = 512, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-planet-water", + filename = "__space-exploration-graphics__/graphics/entity/starmap/planet-water.png", + priority = "extra-high", + width = 512, + height = 512, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-planet-cloud-ice", + filename = "__space-exploration-graphics__/graphics/entity/starmap/planet-cloud-ice.png", + priority = "extra-high", + width = 512, + height = 512, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-planet-haze", + filename = "__space-exploration-graphics__/graphics/entity/starmap/planet-haze.png", + priority = "extra-high", + width = 512, + height = 512, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-planet-atmosphere", + filename = "__space-exploration-graphics__/graphics/entity/starmap/planet-atmosphere.png", + priority = "extra-high", + width = 512, + height = 512, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-spaceship", + filename = "__space-exploration-graphics__/graphics/entity/starmap/spaceship.png", + priority = "extra-high", + width = 87, + height = 256, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "gradient-sprite", + filename = "__space-exploration-graphics__/graphics/gradient-white.png", + priority = "high", + width = 4, + height = 512, + frame_count = 1, + line_length = 1, + apply_runtime_tint = true, + --blend_mode = "additive", + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-starmap", + filename = "__space-exploration-graphics__/graphics/entity/starmap/starmap.png", + priority = "extra-high", + width = 512, + height = 512, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-gui-starmap", + filename = "__space-exploration-graphics__/graphics/icons/starmap-transparent.png", + priority = "extra-high", + width = 64, + height = 64, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-gui-starmap-small", + filename = "__space-exploration-graphics__/graphics/icons/starmap-transparent.png", + priority = "extra-high", + width = 64, + height = 64, + scale = 0.5, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-gui-universe-explorer", + filename = "__space-exploration-graphics__/graphics/icons/universe-explorer.png", + priority = "extra-high", + width = 64, + height = 64, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-gui-right-arrow", + filename = "__space-exploration-graphics__/graphics/icons/astronomic/right-arrow.png", + priority = "extra-high", + width = 16, + height = 32, + shift = {0,0}, + apply_runtime_tint = true, + }, + { + type = "sprite", + name = data_util.mod_prefix .. "map-gui-system", + filename = "__space-exploration-graphics__/graphics/technology/discovery.png", + priority = "extra-high", + width = 128, + height = 128, + shift = {0,0}, + apply_runtime_tint = true, + }, +}) + +make_openable_entity(data_util.mod_prefix .. "interstellar-map-star", {"space-exploration.star"}, "__space-exploration-graphics__/graphics/icons/astronomic/star.png", 2) -- used for stars on starmap +make_openable_entity(data_util.mod_prefix .. "interstellar-map-asteroid-field", {"space-exploration.asteroid-field"}, "__space-exploration-graphics__/graphics/icons/astronomic/asteroid-field.png", 1) +make_openable_entity(data_util.mod_prefix .. "interstellar-map-spaceship", {"space-exploration.spaceship"}, "__space-exploration-graphics__/graphics/icons/spaceship.png", 0.75) + +make_openable_entity(data_util.mod_prefix .. "system-map-star", {"space-exploration.star"}, "__space-exploration-graphics__/graphics/icons/astronomic/star.png", 22) -- used for star on solarmap +for i = 1, 20 do + make_openable_entity(data_util.mod_prefix .. "system-map-planet-"..i, {"space-exploration.planet"}, "__space-exploration-graphics__/graphics/icons/astronomic/planet.png", 4 * ((i+1)/11)) -- different sizes of planet based on radius + make_openable_entity(data_util.mod_prefix .. "system-map-moon-"..i, {"space-exploration.moon"}, "__space-exploration-graphics__/graphics/icons/astronomic/moon.png", 4 * ((i+1)/11)) -- different sizes of moon based on radius +end +make_openable_entity(data_util.mod_prefix .. "system-map-asteroid-belt", {"space-exploration.asteroid-belt"}, "__space-exploration-graphics__/graphics/icons/astronomic/asteroid-belt.png", 2) +make_openable_entity(data_util.mod_prefix .. "system-map-spaceship", {"space-exploration.spaceship"}, "__space-exploration-graphics__/graphics/icons/spaceship.png", 0.75) +make_openable_entity(data_util.mod_prefix .. "system-map-interstellar-space", {"space-exploration.interstellar-map"}, "__space-exploration-graphics__/graphics/icons/astronomic/star.png", 8, 8) + +data.raw.lamp[data_util.mod_prefix .. "interstellar-map-spaceship"].selection_priority = 100 +data.raw.lamp[data_util.mod_prefix .. "system-map-spaceship"].selection_priority = 100 diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/supercharger.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/supercharger.lua new file mode 100644 index 0000000..7d34720 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/supercharger.lua @@ -0,0 +1,170 @@ +local data_util = require("data_util") + +local blank_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, +} +local charging_offsets = {} +local radius = 2 +for i = 1, 64 do + local a = i/64 + table.insert(charging_offsets, {math.sin(a * 2 * math.pi) * 0.75 * radius, -2 + math.cos(a * 2 * math.pi) * radius}) +end + +data:extend({ + { + type = "roboport", + name = data_util.mod_prefix .. "supercharger", + logistics_radius = 32, + logistics_connection_distance = 32, + material_slots_count = 0, + robot_slots_count = 0, + construction_radius = 32, + minable = { + mining_time = 0.1, + result = data_util.mod_prefix .. "supercharger" + }, + icon = "__space-exploration-graphics__/graphics/icons/supercharger.png", + icon_mipmaps = 1, + icon_size = 64, + base = { + layers = { + data_util.auto_sr_hr({ + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/supercharger/hr/supercharger.png", + width = 256, + height = 320, + frame_count = 1, + shift = { 0, -0.5 }, + scale = 0.5, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + direction_count = 1, + filename = "__space-exploration-graphics-3__/graphics/entity/supercharger/hr/supercharger-shadow.png", + width = 298, + height = 165, + frame_count = 1, + shift = { 0.3, 0.8 }, + scale = 0.5, + }), + } + }, + base_animation = blank_image, + base_patch = blank_image, + charge_approach_distance = 5, + charging_energy = settings.startup["se-supercharger-individual-charge-rate"].value.."MW", + charging_offsets = charging_offsets, + circuit_connector_sprites = nil, + circuit_wire_connection_point = nil, + circuit_wire_max_distance = 0, + collision_box = { { -1.65, -1.65 }, { 1.65, 1.65 } }, + drawing_box = { { -1.65, -1.65 - 1.5 }, {1.65, 1.65 + 0.5 } }, + corpse = "roboport-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = {{-0.5,-0.5},{0.5,0.5}}, + offsets = {{0,1}}, + type = "create-entity" + }, + door_animation_down = blank_image, + door_animation_up = blank_image, + draw_construction_radius_visualization = true, + draw_logistic_radius_visualization = true, + dying_explosion = "roboport-explosion", + energy_source = { + buffer_capacity = "1000MJ", + input_flow_limit = "1GW", + type = "electric", + usage_priority = "secondary-input" + }, + energy_usage = "100kW", + flags = { + "placeable-player", + "player-creation" + }, + max_health = 500, + recharge_minimum = "40MJ", + recharging_animation = { + animation_speed = 0.5, + filename = "__base__/graphics/entity/roboport/roboport-recharging.png", + frame_count = 16, + height = 35, + priority = "high", + scale = 1.5, + width = 37 + }, + recharging_light = { + color = { + b = 1, + g = 1, + r = 1 + }, + intensity = 0.4, + size = 5 + }, + request_to_open_door_timeout = 15, + resistances = { + { type = "fire", percent = 100 }, + { type = "electric", percent = 100 } + }, + selection_box = {{-2,-2},{2,2}}, + spawn_and_station_height = -0.1, + stationing_offset = {0,0}, + vehicle_impact_sound = { + { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-2.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-3.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-4.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-5.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-6.ogg", + volume = 0.5 + } + }, + water_reflection = { + orientation_to_variation = false, + pictures = { + filename = "__base__/graphics/entity/roboport/roboport-reflection.png", + height = 28, + priority = "extra-high", + scale = 5, + shift = { + 0, + 2.34375 + }, + variation_count = 1, + width = 28 + }, + rotate = false + }, + working_sound = { + audible_distance_modifier = 0.5, + max_sounds_per_type = 3, + probability = 0.0033333333, + sound = { + filename = "__base__/sound/roboport-working.ogg", + volume = 0.6 + } + } + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/telescopes.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/telescopes.lua new file mode 100644 index 0000000..2162483 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/telescopes.lua @@ -0,0 +1,714 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-telescope", + icon = "__space-exploration-graphics__/graphics/icons/telescope.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.1, result = data_util.mod_prefix .. "space-telescope"}, + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-1.3, -1.3}, {1.3, 1.3}}, + selection_box = {{-1.5, -1.5}, {1.5, 1.5}}, + drawing_box = {{-1.5, -1.9}, {1.5, 1.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -2} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 2} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-4__/graphics/entity/telescope/sr/telescope.png", + priority = "high", + width = 2080/8/2, + height = 2128/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(6, -19), + animation_speed = 0.1, + hr_version = { + filename = "__space-exploration-graphics-4__/graphics/entity/telescope/hr/telescope.png", + priority = "high", + width = 2080/8, + height = 2128/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(6, -19), + animation_speed = 0.1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/telescope/sr/telescope-shadow.png", + priority = "high", + width = 2608/8/2, + height = 1552/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(32, 7), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/telescope/hr/telescope-shadow.png", + priority = "high", + width = 2608/8, + height = 1552/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(32, 7), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-observation-visible", "space-observation-uv", "space-observation-infrared"}, + crafting_speed = 2, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = {r = 0.9, g = 1, b = 0.8}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-telescope-xray", + icon = "__space-exploration-graphics__/graphics/icons/telescope-xray.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-telescope-xray"}, + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-2.3, -2.3}, {2.3, 2.3}}, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + drawing_box = {{-2.5, -3.5}, {2.5, 2.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -3} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 3} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-xray/sr/telescope-xray.png", + priority = "high", + width = 2880/8/2, + height = 3232/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(6, -13), + animation_speed = 0.1, + hr_version = { + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-xray/hr/telescope-xray.png", + priority = "high", + width = 2880/8, + height = 3232/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(6, -13), + animation_speed = 0.1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-xray/sr/telescope-xray-shadow.png", + priority = "high", + width = 3712/8/2, + height = 2224/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(33, 10), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-xray/hr/telescope-xray-shadow.png", + priority = "high", + width = 3712/8, + height = 2224/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(33, 10), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-observation-xray"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = {r = 0.5, g = 0.5, b = 1}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-telescope-gammaray", + icon = "__space-exploration-graphics__/graphics/icons/telescope-gammaray.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-telescope-gammaray"}, + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-2.3, -2.3}, {2.3, 2.3}}, + selection_box = {{-2.5, -2.5}, {2.5, 2.5}}, + drawing_box = {{-2.5, -3.5}, {2.5, 2.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -3} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 3} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-gammaray/sr/telescope-gammaray.png", + priority = "high", + width = 2880/8/2, + height = 3232/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(6, -13), + animation_speed = 0.1, + hr_version = { + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-gammaray/hr/telescope-gammaray.png", + priority = "high", + width = 2880/8, + height = 3232/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(6, -13), + animation_speed = 0.1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-gammaray/sr/telescope-gammaray-shadow.png", + priority = "high", + width = 3712/8/2, + height = 2224/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(33, 10), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-gammaray/hr/telescope-gammaray-shadow.png", + priority = "high", + width = 3712/8, + height = 2224/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(33, 10), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-observation-gammaray"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = {r = 1, g = 0.5, b = 1}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-telescope-microwave", + icon = "__space-exploration-graphics__/graphics/icons/telescope-microwave.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-telescope-microwave"}, + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-4.3, -4.3}, {4.3, 4.3}}, + selection_box = {{-4.5, -4.5}, {4.5, 4.5}}, + drawing_box = {{-4.5, -6.5}, {4.5, 4.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 5} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-microwave/sr/telescope-microwave.png", + priority = "high", + width = 4688/8/2, + height = 5440/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(1, -26), + animation_speed = 0.1, + hr_version = { + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-microwave/hr/telescope-microwave.png", + priority = "high", + width = 4688/8, + height = 5440/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(1, -26), + animation_speed = 0.1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-microwave/sr/telescope-microwave-shadow.png", + priority = "high", + width = 5440/8/2, + height = 4800/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(25, 19), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-microwave/hr/telescope-microwave-shadow.png", + priority = "high", + width = 5440/8, + height = 4800/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(25, 19), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-observation-microwave"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = {r = 1, g = 1, b = 0.5}} + }, + }, + }, + { + type = "assembling-machine", + name = data_util.mod_prefix .. "space-telescope-radio", + icon = "__space-exploration-graphics__/graphics/icons/telescope-radio.png", + icon_size = 64, + flags = {"placeable-neutral","placeable-player", "player-creation"}, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "space-telescope-radio"}, + max_health = 500, + corpse = "big-remnants", + dying_explosion = "medium-explosion", + alert_icon_shift = util.by_pixel(0, -12), + collision_box = {{-4.3, -4.3}, {4.3, 4.3}}, + selection_box = {{-4.5, -4.5}, {4.5, 4.5}}, + drawing_box = {{-4.5, -6.5}, {4.5, 4.5}}, + resistances = + { + { + type = "impact", + percent = 10 + } + }, + fluid_boxes = + { + { + production_type = "input", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = -1, + pipe_connections = {{ type="input", position = {0, -5} }}, + secondary_draw_orders = { north = -1 } + }, + { + production_type = "output", + --pipe_picture = assembler3pipepictures(), + pipe_covers = pipecoverspictures(), + base_area = 10, + base_level = 1, + pipe_connections = {{ type="output", position = {0, 5} }}, + secondary_draw_orders = { north = -1 } + }, + --off_when_no_fluid_recipe = true + }, + open_sound = { filename = "__base__/sound/machine-open.ogg", volume = 0.85 }, + close_sound = { filename = "__base__/sound/machine-close.ogg", volume = 0.75 }, + vehicle_impact_sound = { filename = "__base__/sound/car-metal-impact.ogg", volume = 0.65 }, + working_sound = { + apparent_volume = 1.5, + idle_sound = { + filename = "__base__/sound/idle1.ogg", + volume = 0.6 + }, + sound = { + { + filename = "__base__/sound/assembling-machine-t1-1.ogg", + volume = 0.8 + }, + { + filename = "__base__/sound/assembling-machine-t1-2.ogg", + volume = 0.8 + } + } + }, + collision_mask = { + "water-tile", + "ground-tile", + "item-layer", + "object-layer", + "player-layer", + spaceship_collision_layer, + }, + animation = + { + layers = + { + { + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-radio/sr/telescope-radio.png", + priority = "high", + width = 4688/8/2, + height = 5440/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(1, -26), + animation_speed = 0.1, + hr_version = { + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-radio/hr/telescope-radio.png", + priority = "high", + width = 4688/8, + height = 5440/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(1, -26), + animation_speed = 0.1, + scale = 0.5, + } + }, + { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-radio/sr/telescope-radio-shadow.png", + priority = "high", + width = 5440/8/2, + height = 4800/8/2, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(25, 19), + hr_version = { + draw_as_shadow = true, + filename = "__space-exploration-graphics-4__/graphics/entity/telescope-radio/hr/telescope-radio-shadow.png", + priority = "high", + width = 5440/8, + height = 4800/8, + frame_count = 64, + line_length = 8, + shift = util.by_pixel(25, 19), + scale = 0.5, + } + }, + }, + }, + crafting_categories = {"space-observation-radio"}, + crafting_speed = 1, + energy_source = + { + type = "electric", + usage_priority = "secondary-input", + emissions_per_minute = 4, + }, + energy_usage = "1000kW", + ingredient_count = 12, + module_specification = + { + module_slots = 4 + }, + allowed_effects = {"consumption", "speed", "pollution"}, -- not "productivity", + working_visualisations = + { + { + effect = "uranium-glow", -- changes alpha based on energy source light intensity + light = {intensity = 0.5, size = 8, shift = {0.0, 0.0}, color = {r = 1, g = 0.5, b = 0.5}} + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/wide-beacon.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/wide-beacon.lua new file mode 100644 index 0000000..7bde6a3 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/entity/wide-beacon.lua @@ -0,0 +1,253 @@ +local data_util = require("data_util") + + +local blank_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, + repeat_count = 32, +} +data.raw.beacon.beacon.energy_usage = "200kW" +data.raw.beacon.beacon.module_specification = { + module_info_icon_shift = { 0, 0.5 }, + module_info_max_icons_per_row = 4, + module_info_max_icon_rows = 2, + module_info_multi_row_initial_height_modifier = -0.3, + module_slots = 8 +} +data:extend({ + { + type = "beacon", + name = data_util.mod_prefix .. "wide-beacon", + icon = "__space-exploration-graphics__/graphics/icons/wide-beacon.png", + icon_mipmaps = 1, + icon_size = 64, + flags = { "placeable-player", "player-creation" }, + minable = { + mining_time = 0.25, + result = data_util.mod_prefix .. "wide-beacon" + }, + next_upgrade = data_util.mod_prefix .. "wide-beacon-2", + fast_replaceable_group = "wide-beacon", + se_allow_in_space = true, + allowed_effects = { "consumption", "speed", "pollution" }, + animation = { + layers = { + data_util.auto_sr_hr({ + animation_speed = 0.5, + filename = "__space-exploration-graphics-4__/graphics/entity/wide-beacon/hr/wide-beacon.png", + frame_count = 32, + width = 256, + height = 320, + line_length = 8, + shift = { 0, -0.5 }, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + animation_speed = 0.5, + filename = "__space-exploration-graphics-4__/graphics/entity/wide-beacon/hr/wide-beacon-shadow.png", + frame_count = 32, + width = 330, + height = 174, + line_length = 4, + shift = { 0.5+4/32, 0.5+4/32 }, + }), + } + }, + animation_shadow = blank_image, + base_picture = blank_image, + collision_box = { { -1.7, -1.7 }, { 1.7, 1.7 } }, + allow_in_space = true, + drawing_box = { { -2, -2.7 }, { 2, 2 } }, + selection_box = { { -2, -2 }, { 2, 2 } }, + corpse = "medium-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = { { -0.5, -0.5 }, { 0.5, 0.5 } }, + offsets = { { 0, 1 } }, + type = "create-entity" + }, + dying_explosion = "beacon-explosion", + energy_source = { + type = "electric", + usage_priority = "secondary-input" + }, + energy_usage = "10000kW", + max_health = 800, + module_specification = { + module_info_icon_shift = { 0, 0.5 }, + module_info_max_icons_per_row = 5, + module_info_max_icon_rows = 5, + module_info_multi_row_initial_height_modifier = -0.3, + module_slots = 15 + }, + distribution_effectivity = 0.5, + supply_area_distance = 14, -- extends from edge of collision box, actual is 16 + radius_visualisation_picture = { + filename = "__base__/graphics/entity/beacon/beacon-radius-visualization.png", + height = 10, + priority = "extra-high-no-scale", + width = 10 + }, + vehicle_impact_sound = { + { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-2.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-3.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-4.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-5.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-6.ogg", + volume = 0.5 + } + }, + water_reflection = { + orientation_to_variation = false, + pictures = { + filename = "__base__/graphics/entity/beacon/beacon-reflection.png", + height = 28, + priority = "extra-high", + scale = 5, + shift = { + 0, + 1.71875 + }, + variation_count = 1, + width = 24 + }, + rotate = false + } + }, + { + type = "beacon", + name = data_util.mod_prefix .. "wide-beacon-2", + icon = "__space-exploration-graphics__/graphics/icons/wide-beacon-2.png", + icon_mipmaps = 1, + icon_size = 64, + flags = { "placeable-player", "player-creation" }, + minable = { + mining_time = 0.25, + result = data_util.mod_prefix .. "wide-beacon-2" + }, + fast_replaceable_group = "wide-beacon", + se_allow_in_space = true, + allowed_effects = { "consumption", "speed", "pollution" }, + animation = { + layers = { + data_util.auto_sr_hr({ + animation_speed = 0.5, + filename = "__space-exploration-graphics-4__/graphics/entity/wide-beacon/hr/wide-beacon-2.png", + frame_count = 32, + width = 256, + height = 320, + line_length = 8, + shift = { 0, -0.5 }, + }), + data_util.auto_sr_hr({ + draw_as_shadow = true, + animation_speed = 0.5, + filename = "__space-exploration-graphics-4__/graphics/entity/wide-beacon/hr/wide-beacon-shadow.png", + frame_count = 32, + width = 330, + height = 174, + line_length = 4, + shift = { 0.5+4/32, 0.5+4/32 }, + }), + } + }, + animation_shadow = blank_image, + base_picture = blank_image, + collision_box = { { -1.7, -1.7 }, { 1.7, 1.7 } }, + allow_in_space = true, + drawing_box = { { -2, -2.7 }, { 2, 2 } }, + selection_box = { { -2, -2 }, { 2, 2 } }, + corpse = "medium-remnants", + damaged_trigger_effect = { + entity_name = "spark-explosion", + offset_deviation = { { -0.5, -0.5 }, { 0.5, 0.5 } }, + offsets = { { 0, 1 } }, + type = "create-entity" + }, + dying_explosion = "beacon-explosion", + energy_source = { + type = "electric", + usage_priority = "secondary-input" + }, + energy_usage = "10000kW", + max_health = 800, + module_specification = { + module_info_icon_shift = { 0, 0 }, + module_info_max_icons_per_row = 5, + module_info_max_icon_rows = 5, + module_info_multi_row_initial_height_modifier = -0.3, + module_slots = 20 + }, + distribution_effectivity = 0.5, + supply_area_distance = 14, -- extends from edge of collision box, actual is 16 + radius_visualisation_picture = { + filename = "__base__/graphics/entity/beacon/beacon-radius-visualization.png", + height = 10, + priority = "extra-high-no-scale", + width = 10 + }, + vehicle_impact_sound = { + { + filename = "__base__/sound/car-metal-impact.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-2.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-3.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-4.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-5.ogg", + volume = 0.5 + }, + { + filename = "__base__/sound/car-metal-impact-6.ogg", + volume = 0.5 + } + }, + water_reflection = { + orientation_to_variation = false, + pictures = { + filename = "__base__/graphics/entity/beacon/beacon-reflection.png", + height = 28, + priority = "extra-high", + scale = 5, + shift = { + 0, + 1.71875 + }, + variation_count = 1, + width = 24 + }, + rotate = false + } + } +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/fluid/fluid.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/fluid/fluid.lua new file mode 100644 index 0000000..60a3920 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/fluid/fluid.lua @@ -0,0 +1,354 @@ +local data_util = require("data_util") + +local steam_max_temperature = 5000 +data.raw.fluid.steam.max_temperature = math.max(data.raw.fluid.steam.max_temperature, steam_max_temperature) + +local decompressing_steam = table.deepcopy(data.raw.fluid.steam) +decompressing_steam.name = data_util.mod_prefix .. "decompressing-steam" + +local space_water = table.deepcopy(data.raw.fluid.water) +space_water.name = data_util.mod_prefix .. "space-water" +space_water.icon = "__space-exploration-graphics__/graphics/icons/fluid/space-water.png" +space_water.icon_size = 64 +space_water.icon_mipmaps = 1 +space_water.subgroup = "space-fluids" + +local contaminated_space_water = table.deepcopy(data.raw.fluid.water) +contaminated_space_water.name = data_util.mod_prefix .. "contaminated-space-water" +contaminated_space_water.icon = "__space-exploration-graphics__/graphics/icons/fluid/contaminated-space-water.png" +contaminated_space_water.icon_size = 64 +contaminated_space_water.icon_mipmaps = 1 +contaminated_space_water.subgroup = "space-fluids" + + +--TODO: order strings +data:extend({ + decompressing_steam, + { + type = "fluid", + name = data_util.mod_prefix .. "methane-gas", + default_temperature = 15, + max_temperature = 1000, + heat_capacity = "0.1KJ", + icon = "__space-exploration-graphics__/graphics/icons/fluid/methane-gas.png", + icon_size = 64, + icon_mipmaps = 1, + base_color = {r=0.7, g=0.5, b=0.4}, + flow_color = {r=1.0, g=0.97, b=0.95}, + order = "a[fluid]-b[steam]", + gas_temperature = -160, + auto_barrel = true + }, + space_water, + contaminated_space_water, + { + type = "fluid", + name = data_util.mod_prefix .. "liquid-rocket-fuel", + default_temperature = 25, + heat_capacity = "0.1KJ", + fuel_category = "chemical", + fuel_value = (100 / data_util.liquid_rocket_fuel_per_solid) .. "MJ", -- solid rocket fuel is "100MJ", 50 liquid to solid + max_temperature = 100, + base_color = {r=0.53, g=0.1, b=0}, + flow_color = {r=0.93, g=0.68, b=0.2}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/liquid-rocket-fuel.png", + icon_size = 64, + icon_mipmaps = 1, + order = "p-z-a", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + subgroup = "processed-fuel", + }, + --[[{ + type = "fluid", + name = data_util.mod_prefix .. "space-coolant", + default_temperature = data_util.coolant_temperature.hot, + heat_capacity = "0.1KJ", + min_temperature = -273, + max_temperature = 1000, + base_color = {r=80, g=27, b=255}, + flow_color = {r=178, g=155, b=255}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/space-coolant.png", + icon_size = 64, + order = "a[fluid]-a[water]", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + },]]-- + { + type = "fluid", + name = data_util.mod_prefix .. "space-coolant-hot", + default_temperature = data_util.coolant_temperature.hot, + heat_capacity = "0.1KJ", + min_temperature = -273, + max_temperature = steam_max_temperature, + base_color = {r=159, g=27, b=255}, + flow_color = {r=212, g=155, b=255}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/space-coolant-hot.png", + icon_size = 64, + icon_mipmaps = 1, + order = "t-a", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "space-coolant-warm", + default_temperature = data_util.coolant_temperature.normal, + heat_capacity = "0.1KJ", + min_temperature = -273, + max_temperature = steam_max_temperature, + base_color = {r=121, g=27, b=255}, + flow_color = {r=196, g=155, b=255}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/space-coolant-warm.png", + icon_size = 64, + icon_mipmaps = 1, + order = "t-b", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + subgroup = "space-fluids", + auto_barrel = false, + }, + { + type = "fluid", + name = data_util.mod_prefix .. "space-coolant-cold", + default_temperature = data_util.coolant_temperature.cold, + heat_capacity = "0.1KJ", + min_temperature = -273, + max_temperature = steam_max_temperature, + base_color = {r=95, g=47, b=255}, + flow_color = {r=185, g=164, b=255}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/space-coolant-cold.png", + icon_size = 64, + icon_mipmaps = 1, + order = "t-c", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + subgroup = "space-fluids", + auto_barrel = false, + }, + { + type = "fluid", + name = data_util.mod_prefix .. "space-coolant-supercooled", + default_temperature = data_util.coolant_temperature.supercooled, + heat_capacity = "0.1KJ", + min_temperature = -273, + max_temperature = steam_max_temperature, + base_color = {r=98, g=111, b=255}, + flow_color = {r=186, g=192, b=255}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/space-coolant-supercooled.png", + icon_size = 64, + icon_mipmaps = 1, + order = "t-d", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + subgroup = "space-fluids", + auto_barrel = false, + }, + { + type = "fluid", + name = data_util.mod_prefix .. "bio-sludge", + default_temperature = 25, + heat_capacity = "0.1KJ", + max_temperature = 100, + base_color = {r=0, g=84, b=3}, + flow_color = {r=133, g=226, b=18}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/bio-sludge.png", + icon_size = 64, + icon_mipmaps = 1, + order = "q-a", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "contaminated-bio-sludge", + default_temperature = 25, + heat_capacity = "0.1KJ", + max_temperature = 100, + base_color = {r=71, g=46, b=5}, + flow_color = {r=135, g=121, b=9}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/contaminated-bio-sludge.png", + icon_size = 64, + icon_mipmaps = 1, + order = "q-b", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "chemical-gel", + default_temperature = 25, + heat_capacity = "0.1KJ", + max_temperature = 100, + base_color = {r=103, g=31, b=0}, + flow_color = {r=234, g=135, b=0}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/chemical-gel.png", + icon_size = 64, + icon_mipmaps = 1, + order = "q-c", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "nutrient-gel", + default_temperature = 25, + heat_capacity = "0.1KJ", + max_temperature = 100, + base_color = {r=191, g=64, b=87}, + flow_color = {r=248, g=62, b=122}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/nutrient-gel.png", + icon_size = 64, + icon_mipmaps = 1, + order = "q-d", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "neural-gel", + default_temperature = 25, + heat_capacity = "0.1KJ", + max_temperature = 100, + base_color = {r=14, g=77, b=109}, + flow_color = {r=26, g=216, b=212}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/neural-gel.png", + icon_size = 64, + icon_mipmaps = 1, + order = "q-e", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "neural-gel-2", + default_temperature = 25, + heat_capacity = "0.1KJ", + max_temperature = 100, + base_color = {r=56, g=6, b=143}, + flow_color = {r=135, g=0, b=234}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/neural-gel-2.png", + icon_size = 64, + icon_mipmaps = 1, + order = "q-f", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "plasma-stream", + default_temperature = 5000, + heat_capacity = "0.01KJ", + max_temperature = 100000, + base_color = {r=255, g=0, b=0}, + flow_color = {r=255, g=235, b=0}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/plasma-stream.png", + icon_size = 64, + icon_mipmaps = 1, + order = "r-a", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + gas_temperature = 0, + auto_barrel = false, + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "ion-stream", + default_temperature = 5000, + heat_capacity = "0.01KJ", + max_temperature = 100000, + base_color = {r=0, g=102, b=255}, + flow_color = {r=0, g=240, b=255}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/ion-stream.png", + icon_size = 64, + icon_mipmaps = 1, + order = "r-b", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + gas_temperature = 0, + auto_barrel = false, + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "proton-stream", + default_temperature = 5000, + heat_capacity = "0.01KJ", + max_temperature = 100000, + base_color = {r=102, g=197, b=0}, + flow_color = {r=13, g=231, b=174}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/proton-stream.png", + icon_size = 64, + icon_mipmaps = 1, + order = "r-e", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + gas_temperature = 0, + auto_barrel = false, + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "particle-stream", + default_temperature = 5000, + heat_capacity = "0.01KJ", + max_temperature = 100000, + base_color = {r=200, g=0, b=128}, + flow_color = {r=255, g=0, b=252}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/particle-stream.png", + icon_size = 64, + icon_mipmaps = 1, + order = "r-d", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + gas_temperature = 0, + auto_barrel = false, + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "antimatter-stream", + default_temperature = 10000, + heat_capacity = "0.01KJ", + max_temperature = 100000, + base_color = {r=156, g=0, b=255}, + flow_color = {r=255, g=0, b=255}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/antimatter-stream.png", + icon_size = 64, + icon_mipmaps = 1, + order = "z", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + gas_temperature = 0, + auto_barrel = false, + fuel_value = "20MJ", -- liquid rocket fuel is 2 + fuel_category = "antimatter", + subgroup = "space-fluids", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "cryonite-slush", + default_temperature = 0, + heat_capacity = "0.01KJ", + max_temperature = 25, + base_color = {r=47, g=95, b=255}, + flow_color = {r=185, g=164, b=255}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/cryonite-slush.png", + icon_size = 64, + icon_mipmaps = 1, + order = "z", + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + gas_temperature = 0, + auto_barrel = true, + subgroup = "space-fluids", + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/input.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/input.lua new file mode 100644 index 0000000..ebebd70 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/input.lua @@ -0,0 +1,195 @@ +local data_util = require("data_util") + +data:extend{ + { + type = 'custom-input', + name = data_util.mod_prefix .. 'remote-view', + key_sequence = 'N', + enabled_while_spectating = true, + order = "a-a", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'remote-view-pins', + key_sequence = "CONTROL + SHIFT + N", + enabled_while_spectating = true, + order = "a-aa" + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'remote-view-next', + key_sequence = 'SHIFT + N', + enabled_while_spectating = true, + order = "a-ab" + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'remote-view-previous', + key_sequence = 'CONTROL + N', + enabled_while_spectating = true, + order = "a-ac" + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'universe-explorer', + key_sequence = 'U', + enabled_while_spectating = true, + order = "a-b", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'respawn', + key_sequence = "HOME", + enabled_while_spectating = true, + order = "a-c", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'mode-toggle', + key_sequence = "R", + enabled_while_spectating = true, + order = "a-d", + }, + -- pin to pin hotkeys + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-one', + key_sequence = "CONTROL + 1", + enabled_while_spectating = true, + order = "b-a", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-two', + key_sequence = "CONTROL + 2", + enabled_while_spectating = true, + order = "b-b", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-three', + key_sequence = "CONTROL + 3", + enabled_while_spectating = true, + order = "b-c", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-four', + key_sequence = "CONTROL + 4", + enabled_while_spectating = true, + order = "b-d", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-five', + key_sequence = "CONTROL + 5", + enabled_while_spectating = true, + order = "b-e", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-six', + key_sequence = "CONTROL + 6", + enabled_while_spectating = true, + order = "b-f", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-seven', + key_sequence = "CONTROL + 7", + enabled_while_spectating = true, + order = "b-g", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-eight', + key_sequence = "CONTROL + 8", + enabled_while_spectating = true, + order = "b-h", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-nine', + key_sequence = "CONTROL + 9", + enabled_while_spectating = true, + order = "b-i", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-zero', + key_sequence = "CONTROL + 0", + enabled_while_spectating = true, + order = "b-j", + }, + -- set pin hotkeys + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-set-one', + key_sequence = "CONTROL + SHIFT + 1", + enabled_while_spectating = true, + order = "c-a", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-set-two', + key_sequence = "CONTROL + SHIFT + 2", + enabled_while_spectating = true, + order = "c-b", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-set-three', + key_sequence = "CONTROL + SHIFT + 3", + enabled_while_spectating = true, + order = "c-c", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-set-four', + key_sequence = "CONTROL + SHIFT + 4", + enabled_while_spectating = true, + order = "c-d", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-set-five', + key_sequence = "CONTROL + SHIFT + 5", + enabled_while_spectating = true, + order = "c-e", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-set-six', + key_sequence = "CONTROL + SHIFT + 6", + enabled_while_spectating = true, + order = "c-f", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-set-seven', + key_sequence = "CONTROL + SHIFT + 7", + enabled_while_spectating = true, + order = "c-g", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-set-eight', + key_sequence = "CONTROL + SHIFT + 8", + enabled_while_spectating = true, + order = "c-h", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-set-nine', + key_sequence = "CONTROL + SHIFT + 9", + enabled_while_spectating = true, + order = "c-i", + }, + { + type = 'custom-input', + name = data_util.mod_prefix .. 'pin-set-zero', + key_sequence = "CONTROL + SHIFT + 0", + enabled_while_spectating = true, + order = "c-j", + } +} diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item-groups.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item-groups.lua new file mode 100644 index 0000000..8049747 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item-groups.lua @@ -0,0 +1,427 @@ +data.raw["item-group"]["intermediate-products"].icon = "__space-exploration-graphics__/graphics/item-group/manufacturing.png" +data.raw["item-group"]["intermediate-products"].order = "c-b" +data.raw["item-group"]["combat"].icon = "__space-exploration-graphics__/graphics/item-group/equipment.png" +data:extend({ + + --[[{ + type = "item-group", + name = "space", + order = "b-b-s", + icon = "__space-exploration-graphics__/graphics/item-group/spaceship.png", + icon_size = 64, + },]]-- + { + type = "item-group", + name = "resources", + order = "c-a", + icon = "__space-exploration-graphics__/graphics/item-group/resources.png", + icon_size = 128, + }, + { + type = "item-group", + name = "science", + order = "c-d", + icon = "__space-exploration-graphics__/graphics/item-group/science.png", + icon_size = 128, + }, + + + { + type = "item-subgroup", + name = "storage", + group = "logistics", + order = "a[storage]" + }, + { + type = "item-subgroup", + name = "transport-belt", + group = "logistics", + order = "b[belt]-a" + }, + { + type = "item-subgroup", + name = "underground-belt", + group = "logistics", + order = "b[belt]-b" + }, + { + type = "item-subgroup", + name = "splitter", + group = "logistics", + order = "b[belt]-c" + }, + { + type = "item-subgroup", + name = "loader", + group = "logistics", + order = "b[belt]-c" + }, + { + type = "item-subgroup", + name = "pipe", + group = "logistics", + order = "c" + }, + { + group = "logistics", + name = "rail", + order = "e[transport]-b[rail]", + type = "item-subgroup" + }, + + { + type = "item-subgroup", + name = "spaceship-structure", + group = "logistics", + order = "k" + }, + + { + type = "item-subgroup", + name = "rocket-logistics", + group = "logistics", + order = "j" + }, + { + type = "item-subgroup", + name = "delivery-cannon-capsules", + group = "logistics", + order = "k" + }, + + + { + type = "item-subgroup", + name = "ancient", + group = "logistics", + order = "z-z-a" + }, + + + + { + type = "item-subgroup", + name = "solar", + group = "production", + order = "b-a" + }, + { + type = "item-subgroup", + name = "mechanical", + group = "production", + order = "e-a" + }, + { + type = "item-subgroup", + name = "assembling", + group = "production", + order = "e-b" + }, + { + type = "item-subgroup", + name = "chemistry", + group = "production", + order = "e-c" + }, + { + type = "item-subgroup", + name = "radiation", + group = "production", + order = "e-d" + }, + { + type = "item-subgroup", + name = "plasma", + group = "production", + order = "e-e" + }, + { + type = "item-subgroup", + name = "thermofluid", + group = "production", + order = "e-f" + }, + { + type = "item-subgroup", + name = "computation", + group = "production", + order = "e-g" + }, + { + type = "item-subgroup", + name = "telescope", + group = "production", + order = "e-h" + }, + { + type = "item-subgroup", + name = "beaming", + group = "production", + order = "h-i" + }, + { + type = "item-subgroup", + name = "space-structures", + group = "production", + order = "h-j" + }, + { + type = "item-subgroup", + name = "lab", + group = "production", + order = "h-k" + }, + { + type = "item-subgroup", + name = "module-speed", + group = "production", + order = "z-m-b" + }, + { + type = "item-subgroup", + name = "module-productivity", + group = "production", + order = "z-m-c" + }, + { + type = "item-subgroup", + name = "module-effectivity", + group = "production", + order = "z-m-d" + }, + + + + { + type = "item-subgroup", + name = "core-fragments", + group = "resources", + order = "a-a" + }, + { + type = "item-subgroup", + name = "pulverised", + group = "resources", + order = "a-b" + }, + { + type = "item-subgroup", + name = "washed", + group = "resources", + order = "a-c" + }, + { + type = "item-subgroup", + name = "ingots", + group = "resources", + order = "a-d" + }, + { + type = "item-subgroup", + name = "plates", + group = "resources", + order = "a-d" + }, + { + type = "item-subgroup", + name = "arcosphere", + group = "resources", + order = "z-b" + }, + + + + + { + type = "item-subgroup", + name = "spaceship-process", + group = "intermediate-products", + order = "z-a-a-b" + }, + { + type = "item-subgroup", + name = "rocket-intermediate-product", + group = "intermediate-products", + order = "z-a-b-b" + }, + { + type = "item-subgroup", + name = "processed-fuel", + group = "intermediate-products", + order = "z-a-c-a" + }, + { + type = "item-subgroup", + name = "space-cooling", + group = "intermediate-products", + order = "z-a-e" + }, + + { + type = "item-subgroup", + name = "space-fluids", + group = "intermediate-products", + order = "z-f-a" + }, + { + type = "item-subgroup", + name = "space-recycling", + group = "intermediate-products", + order = "z-g-a" + }, + { + type = "item-subgroup", + name = "space-components", + group = "intermediate-products", + order = "z-h-a" + }, + { + type = "item-subgroup", + name = "space-canisters", + group = "intermediate-products", + order = "z-h-b" + }, + { + type = "item-subgroup", + name = "space-bioculture", + group = "intermediate-products", + order = "z-j-a" + }, + { + type = "item-subgroup", + name = "space-observation-frame", + group = "intermediate-products", + order = "z-j-b" + }, + + + + + + { + type = "item-subgroup", + name = "data-generic", + group = "science", + order = "m-a" + }, + { + type = "item-subgroup", + name = "data-significant", + group = "science", + order = "m-m" + }, + + { + type = "item-subgroup", + name = "data-catalogue-astronomic", + group = "science", + order = "n-a" + }, + { + type = "item-subgroup", + name = "data-astronomic", + group = "science", + order = "n-b" + }, + { + type = "item-subgroup", + name = "astronomic-science-pack", + group = "science", + order = "n-c" + }, + { + type = "item-subgroup", + name = "data-catalogue-biological", + group = "science", + order = "o-a" + }, + { + type = "item-subgroup", + name = "data-biological", + group = "science", + order = "o-b" + }, + { + type = "item-subgroup", + name = "biological-science-pack", + group = "science", + order = "o-c" + }, + { + type = "item-subgroup", + name = "data-catalogue-energy", + group = "science", + order = "p-a" + }, + { + type = "item-subgroup", + name = "data-energy", + group = "science", + order = "p-b" + }, + { + type = "item-subgroup", + name = "energy-science-pack", + group = "science", + order = "p-c" + }, + { + type = "item-subgroup", + name = "data-catalogue-material", + group = "science", + order = "q-a" + }, + { + type = "item-subgroup", + name = "data-material", + group = "science", + order = "q-b" + }, + { + type = "item-subgroup", + name = "material-science-pack", + group = "science", + order = "q-c" + }, + + { + type = "item-subgroup", + name = "data-catalogue-deep", + group = "science", + order = "r-a" + }, + { + type = "item-subgroup", + name = "data-deep", + group = "science", + order = "r-b" + }, + { + type = "item-subgroup", + name = "deep-science-pack", + group = "science", + order = "r-c" + }, + + + { + type = "item-subgroup", + name = "surface-defense", + group = "combat", + order = "z-a" + }, + + { + type = "item-subgroup", + name = "virtual-signal-utility", + group = "signals", + order = "u-a" + }, + + { + type = "item-subgroup", + name = "ruins", + group = "environment", + order = "z-r" + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/armor.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/armor.lua new file mode 100644 index 0000000..178c307 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/armor.lua @@ -0,0 +1,190 @@ +local data_util = require("data_util") + + +data:extend{ + { + name = data_util.mod_prefix.."thruster-suit", + type = "armor", + subgroup = "armor", + equipment_grid = data_util.mod_prefix.."thruster-suit-grid", + icon = "__space-exploration-graphics__/graphics/icons/thruster-suit-orange.png", + icon_size = 64, + infinite = true, + inventory_size_bonus = 20, + order = "t-a", + resistances = { + { + percent = 30, + type = "physical" + }, + { + decrease = 0, + percent = 30, + type = "acid" + }, + { + decrease = 0, + percent = 30, + type = "explosion" + }, + { + decrease = 0, + percent = 60, + type = "fire" + } + }, + stack_size = 1, + }, + { + equipment_categories = { + "armor" + }, + name = data_util.mod_prefix.."thruster-suit-grid", + type = "equipment-grid", + height = 8, + width = 8 + }, + { + name = data_util.mod_prefix.."thruster-suit-2", + type = "armor", + subgroup = "armor", + equipment_grid = data_util.mod_prefix.."thruster-suit-2-grid", + icon = "__space-exploration-graphics__/graphics/icons/thruster-suit-red.png", + icon_size = 64, + infinite = true, + inventory_size_bonus = 40, + order = "t-b", + resistances = { + { + percent = 30, + type = "physical" + }, + { + decrease = 0, + percent = 30, + type = "acid" + }, + { + decrease = 0, + percent = 30, + type = "explosion" + }, + { + decrease = 0, + percent = 60, + type = "fire" + } + }, + stack_size = 1, + }, + { + equipment_categories = { + "armor" + }, + name = data_util.mod_prefix.."thruster-suit-2-grid", + type = "equipment-grid", + height = 10, + width = 10 + }, + { + name = data_util.mod_prefix.."thruster-suit-3", + type = "armor", + subgroup = "armor", + equipment_grid = data_util.mod_prefix.."thruster-suit-3-grid", + icon = "__space-exploration-graphics__/graphics/icons/thruster-suit-blue.png", + icon_size = 64, + infinite = true, + inventory_size_bonus = 50, + order = "t-c", + resistances = { + { + percent = 30, + type = "physical" + }, + { + decrease = 0, + percent = 30, + type = "acid" + }, + { + decrease = 0, + percent = 30, + type = "explosion" + }, + { + decrease = 0, + percent = 60, + type = "fire" + } + }, + stack_size = 1, + }, + { + equipment_categories = { + "armor" + }, + name = data_util.mod_prefix.."thruster-suit-3-grid", + type = "equipment-grid", + height = 14, + width = 12 + }, + { + name = data_util.mod_prefix.."thruster-suit-4", + type = "armor", + subgroup = "armor", + equipment_grid = data_util.mod_prefix.."thruster-suit-4-grid", + icon = "__space-exploration-graphics__/graphics/icons/thruster-suit-black.png", + icon_size = 64, + infinite = true, + inventory_size_bonus = 60, + order = "t-d", + resistances = { + { + percent = 30, + type = "physical" + }, + { + decrease = 0, + percent = 30, + type = "acid" + }, + { + decrease = 0, + percent = 30, + type = "explosion" + }, + { + decrease = 0, + percent = 60, + type = "fire" + } + }, + stack_size = 1, + }, + { + equipment_categories = { + "armor" + }, + name = data_util.mod_prefix.."thruster-suit-4-grid", + type = "equipment-grid", + height = 16, + width = 16 + }, +} +data.raw["character-corpse"]["character-corpse"].armor_picture_mapping[ data_util.mod_prefix .. "thruster-suit"] = 3 +data.raw["character-corpse"]["character-corpse"].armor_picture_mapping[ data_util.mod_prefix .. "thruster-suit-2"] = 3 +data.raw["character-corpse"]["character-corpse"].armor_picture_mapping[ data_util.mod_prefix .. "thruster-suit-3"] = 3 +data.raw["character-corpse"]["character-corpse"].armor_picture_mapping[ data_util.mod_prefix .. "thruster-suit-4"] = 3 + +for _, animation in pairs(data.raw.character.character.animations) do + if animation.armors then + for _, armor in pairs(animation.armors) do + if armor == "power-armor" then + table.insert(animation.armors, data_util.mod_prefix .. "thruster-suit") + table.insert(animation.armors, data_util.mod_prefix .. "thruster-suit-2") + table.insert(animation.armors, data_util.mod_prefix .. "thruster-suit-3") + table.insert(animation.armors, data_util.mod_prefix .. "thruster-suit-4") + end + end + end +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/cargo-rocket.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/cargo-rocket.lua new file mode 100644 index 0000000..3ab4588 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/cargo-rocket.lua @@ -0,0 +1,50 @@ +local data_util = require("data_util") +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "space-capsule", + place_result = data_util.mod_prefix .. "space-capsule-_-vehicle", + icon = "__space-exploration-graphics__/graphics/icons/space-capsule.png", + icon_size = 64, + order = "d", + stack_size = 1, + subgroup = "rocket-logistics", + }, + { + type = "item", + name = data_util.mod_prefix .. "cargo-rocket-section", + icon = "__space-exploration-graphics__/graphics/icons/cargo-rocket-section.png", + icon_size = 64, + order = "q[rocket-part]", + stack_size = 1, + subgroup = "rocket-intermediate-product", + }, + { + type = "item", + name = data_util.mod_prefix .. "cargo-rocket-section-packed", + icon = "__space-exploration-graphics__/graphics/icons/cargo-rocket-section-stacked.png", + icon_size = 64, + order = "q[rocket-part]-b", + stack_size = 1, + subgroup = "rocket-intermediate-product", + }, + { + type = "item", + name = data_util.mod_prefix .. "cargo-rocket-cargo-pod", + place_result = data_util.mod_prefix .. "cargo-rocket-cargo-pod", + icon = "__space-exploration-graphics__/graphics/icons/cargo-pod.png", + icon_size = 64, + order = "q[rocket-part]", + stack_size = 10, + subgroup = "rocket-intermediate-product", + }, + { + type = "item", + name = data_util.mod_prefix .. "cargo-rocket-fuel-tank", + icon = "__space-exploration-graphics__/graphics/icons/rocket-fuel-tank.png", + icon_size = 64, + order = "q[rocket-part]", + stack_size = 10, + subgroup = "rocket-intermediate-product", + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/condenser-turbine.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/condenser-turbine.lua new file mode 100644 index 0000000..e81ffb7 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/condenser-turbine.lua @@ -0,0 +1,15 @@ +local data_util = require("data_util") +--heat.localised_name = {"fluid-name.steam"} +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "condenser-turbine", + icon = "__space-exploration-graphics__/graphics/icons/condenser-turbine.png", + icon_size = 64, + order = data.raw["item"]["steam-turbine"].order or "".."-b", + place_result = data_util.mod_prefix .. "condenser-turbine", + stack_size = 10, + subgroup = "energy", + --subgroup = "space-energy", + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/core-miner.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/core-miner.lua new file mode 100644 index 0000000..3ef5fa8 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/core-miner.lua @@ -0,0 +1,14 @@ +local data_util = require("data_util") +-- Note: the actual core fragments are in data-final-fixes.lua +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "core-miner", + icon = "__space-exploration-graphics__/graphics/icons/core-miner.png", + icon_size = 64, + order = "zzzz-core-miner", + stack_size = 1, + subgroup = "extraction-machine", + place_result = data_util.mod_prefix .. "core-miner", + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/equipment.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/equipment.lua new file mode 100644 index 0000000..bc41e43 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/equipment.lua @@ -0,0 +1,388 @@ +local data_util = require("data_util") + +data.raw.item["fusion-reactor-equipment"].order = "a[energy-source]-b[fusion-reactor]-c", + +data:extend{ + { + type = "item", + name = data_util.mod_prefix .. "rtg-equipment", + icon = "__space-exploration-graphics__/graphics/icons/rtg-equipment.png", + icon_size = 64, + icon_mipmaps = 1, + order = "a[energy-source]-b[fusion-reactor]-a", + placed_as_equipment_result = data_util.mod_prefix .. "rtg-equipment", + stack_size = 20, + subgroup = "equipment", + }, + { + type = "generator-equipment", + name = data_util.mod_prefix .. "rtg-equipment", + categories = { "armor" }, + energy_source = { type = "electric", usage_priority = "primary-output" }, + power = "300kW", + shape = { type = "full", height = 4, width = 4 }, + sprite = { + filename = "__space-exploration-graphics__/graphics/equipment/rtg-equipment.png", + height = 128, + priority = "medium", + width = 128 + }, + }, + { + type = "item", + name = data_util.mod_prefix .. "rtg-equipment-2", + icon = "__space-exploration-graphics__/graphics/icons/rtg-equipment-2.png", + icon_size = 64, + icon_mipmaps = 1, + order = "a[energy-source]-b[fusion-reactor]-b", + placed_as_equipment_result = data_util.mod_prefix .. "rtg-equipment-2", + stack_size = 20, + subgroup = "equipment", + }, + { + type = "generator-equipment", + name = data_util.mod_prefix .. "rtg-equipment-2", + categories = { "armor" }, + energy_source = { type = "electric", usage_priority = "primary-output" }, + power = "500kW", + shape = { type = "full", height = 4, width = 4 }, + sprite = { + filename = "__space-exploration-graphics__/graphics/equipment/rtg-equipment-2.png", + height = 128, + priority = "medium", + width = 128 + }, + }, + { + type = "item", + name = data_util.mod_prefix .. "adaptive-armour-equipment-1", + icon = "__space-exploration-graphics__/graphics/icons/adaptive-armour-1.png", + icon_size = 64, + icon_mipmaps = 1, + placed_as_equipment_result = data_util.mod_prefix .. "adaptive-armour-equipment-1", + subgroup = "equipment", + order = "ca[shield]-a[adaptive-armour-1]", + stack_size = 20 + }, + { + type = "energy-shield-equipment", + name = data_util.mod_prefix .. "adaptive-armour-equipment-1", + sprite = { + filename = "__space-exploration-graphics__/graphics/equipment/adaptive-armour-1.png", + width = 64, + height = 64, + priority = "medium" + }, + shape = { + width = 2, + height = 2, + type = "full" + }, + max_shield_value = 25, + energy_source = + { + type = "electric", + buffer_capacity = "10kJ", + input_flow_limit = "25kW", + usage_priority = "primary-input", + }, + energy_per_shield = "20kJ", + categories = {"armor"} + }, + { + type = "item", + name = data_util.mod_prefix .. "adaptive-armour-equipment-2", + icon = "__space-exploration-graphics__/graphics/icons/adaptive-armour-2.png", + icon_size = 64, + icon_mipmaps = 1, + placed_as_equipment_result = data_util.mod_prefix .. "adaptive-armour-equipment-2", + subgroup = "equipment", + order = "ca[shield]-b[adaptive-armour-2]", + stack_size = 20 + }, + { + type = "energy-shield-equipment", + name = data_util.mod_prefix .. "adaptive-armour-equipment-2", + sprite = { + filename = "__space-exploration-graphics__/graphics/equipment/adaptive-armour-2.png", + width = 64, + height = 64, + priority = "medium" + }, + shape = { + width = 2, + height = 2, + type = "full" + }, + max_shield_value = 50, + energy_source = + { + type = "electric", + buffer_capacity = "10kJ", + input_flow_limit = "50kW", + usage_priority = "primary-input", + }, + energy_per_shield = "20kJ", + categories = {"armor"} + }, + { + type = "item", + name = data_util.mod_prefix .. "adaptive-armour-equipment-3", + icon = "__space-exploration-graphics__/graphics/icons/adaptive-armour-3.png", + icon_size = 64, + icon_mipmaps = 1, + placed_as_equipment_result = data_util.mod_prefix .. "adaptive-armour-equipment-3", + subgroup = "equipment", + order = "ca[shield]-c[adaptive-armour-3]", + stack_size = 20 + }, + { + type = "energy-shield-equipment", + name = data_util.mod_prefix .. "adaptive-armour-equipment-3", + sprite = { + filename = "__space-exploration-graphics__/graphics/equipment/adaptive-armour-3.png", + width = 64, + height = 64, + priority = "medium" + }, + shape = { + width = 2, + height = 2, + type = "full" + }, + max_shield_value = 100, + energy_source = + { + type = "electric", + buffer_capacity = "10kJ", + input_flow_limit = "100kW", + usage_priority = "primary-input", + }, + energy_per_shield = "20kJ", + categories = {"armor"} + }, + { + type = "item", + name = data_util.mod_prefix .. "adaptive-armour-equipment-4", + icon = "__space-exploration-graphics__/graphics/icons/adaptive-armour-4.png", + icon_size = 64, + icon_mipmaps = 1, + placed_as_equipment_result = data_util.mod_prefix .. "adaptive-armour-equipment-4", + subgroup = "equipment", + order = "ca[shield]-d[adaptive-armour-4]", + stack_size = 20 + }, + { + type = "energy-shield-equipment", + name = data_util.mod_prefix .. "adaptive-armour-equipment-4", + sprite = { + filename = "__space-exploration-graphics__/graphics/equipment/adaptive-armour-4.png", + width = 64, + height = 64, + priority = "medium" + }, + shape = { + width = 2, + height = 2, + type = "full" + }, + max_shield_value = 200, + energy_source = + { + type = "electric", + buffer_capacity = "10kJ", + input_flow_limit = "200kW", + usage_priority = "primary-input", + }, + energy_per_shield = "20kJ", + categories = {"armor"} + }, + { + type = "item", + name = data_util.mod_prefix .. "adaptive-armour-equipment-5", + icon = "__space-exploration-graphics__/graphics/icons/adaptive-armour-5.png", + icon_size = 64, + icon_mipmaps = 1, + placed_as_equipment_result = data_util.mod_prefix .. "adaptive-armour-equipment-5", + subgroup = "equipment", + order = "ca[shield]-e[adaptive-armour-5]", + stack_size = 20 + }, + { + type = "energy-shield-equipment", + name = data_util.mod_prefix .. "adaptive-armour-equipment-5", + sprite = { + filename = "__space-exploration-graphics__/graphics/equipment/adaptive-armour-5.png", + width = 64, + height = 64, + priority = "medium" + }, + shape = { + width = 2, + height = 2, + type = "full" + }, + max_shield_value = 500, + energy_source = + { + type = "electric", + buffer_capacity = "10kJ", + input_flow_limit = "500kW", + usage_priority = "primary-input", + }, + energy_per_shield = "20kJ", + categories = {"armor"} + }, + { + type = "item", + name = "energy-shield-mk3-equipment", + icon = "__space-exploration-graphics__/graphics/icons/energy-shield-green.png", + icon_size = 64, + icon_mipmaps = 1, + placed_as_equipment_result = "energy-shield-mk3-equipment", + subgroup = "equipment", + order = "b[shield]-c[energy-shield]", + stack_size = 20 + }, + { + type = "energy-shield-equipment", + name = "energy-shield-mk3-equipment", + sprite = + { + filename = "__space-exploration-graphics__/graphics/equipment/energy-shield-green.png", + width = 64, + height = 64, + priority = "medium" + }, + shape = + { + width = 2, + height = 2, + type = "full" + }, + max_shield_value = 500, + energy_source = + { + type = "electric", + buffer_capacity = "180kJ", + input_flow_limit = "5MW", + usage_priority = "primary-input" + }, + energy_per_shield = "30kJ", + categories = {"armor"} + }, + { + type = "item", + name = "energy-shield-mk4-equipment", + icon = "__space-exploration-graphics__/graphics/icons/energy-shield-cyan.png", + icon_size = 64, + icon_mipmaps = 1, + placed_as_equipment_result = "energy-shield-mk4-equipment", + subgroup = "equipment", + order = "b[shield]-d[energy-shield]", + stack_size = 20 + }, + { + type = "energy-shield-equipment", + name = "energy-shield-mk4-equipment", + sprite = + { + filename = "__space-exploration-graphics__/graphics/equipment/energy-shield-cyan.png", + width = 64, + height = 64, + priority = "medium" + }, + shape = + { + width = 2, + height = 2, + type = "full" + }, + max_shield_value = 1000, + energy_source = + { + type = "electric", + buffer_capacity = "180kJ", + input_flow_limit = "10MW", + usage_priority = "primary-input" + }, + energy_per_shield = "30kJ", + categories = {"armor"} + }, + { + type = "item", + name = "energy-shield-mk5-equipment", + icon = "__space-exploration-graphics__/graphics/icons/energy-shield-blue.png", + icon_size = 64, + icon_mipmaps = 1, + placed_as_equipment_result = "energy-shield-mk5-equipment", + subgroup = "equipment", + order = "b[shield]-e[energy-shield]", + stack_size = 20 + }, + { + type = "energy-shield-equipment", + name = "energy-shield-mk5-equipment", + sprite = + { + filename = "__space-exploration-graphics__/graphics/equipment/energy-shield-blue.png", + width = 64, + height = 64, + priority = "medium" + }, + shape = + { + width = 2, + height = 2, + type = "full" + }, + max_shield_value = 2000, + energy_source = + { + type = "electric", + buffer_capacity = "180kJ", + input_flow_limit = "20MW", + usage_priority = "primary-input" + }, + energy_per_shield = "30kJ", + categories = {"armor"} + }, + { + type = "item", + name = "energy-shield-mk6-equipment", + icon = "__space-exploration-graphics__/graphics/icons/energy-shield-magenta.png", + icon_size = 64, + icon_mipmaps = 1, + placed_as_equipment_result = "energy-shield-mk6-equipment", + subgroup = "equipment", + order = "b[shield]-f[energy-shield]", + stack_size = 20 + }, + { + type = "energy-shield-equipment", + name = "energy-shield-mk6-equipment", + sprite = + { + filename = "__space-exploration-graphics__/graphics/equipment/energy-shield-magenta.png", + width = 64, + height = 64, + priority = "medium" + }, + shape = + { + width = 2, + height = 2, + type = "full" + }, + max_shield_value = 4000, + energy_source = + { + type = "electric", + buffer_capacity = "180kJ", + input_flow_limit = "40MW", + usage_priority = "primary-input" + }, + energy_per_shield = "30kJ", + categories = {"armor"} + }, +} diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/gate.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/gate.lua new file mode 100644 index 0000000..a1d0c82 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/gate.lua @@ -0,0 +1,17 @@ +local data_util = require("data_util") + +-- fragments +for i = 1, 13, 1 do + data:extend({{ + type = "item", + name = data_util.mod_prefix .. "gate-fragment-"..i, + localised_name = {"item-name."..data_util.mod_prefix .. "gate-fragment"}, + icon = "__space-exploration-graphics__/graphics/icons/gate/fragment-"..i..".png", + icon_size = 64, + order = "a[ancient]-g[gate]-a", + stack_size = 1, + subgroup = "ancient", + place_result = data_util.mod_prefix .. "gate-fragment-"..i, + flags = { "hidden" }, + }}) +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/items.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/items.lua new file mode 100644 index 0000000..b35409b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/items.lua @@ -0,0 +1,1270 @@ +local data_util = require("data_util") +data.raw.item["rocket-silo"].subgroup = "rocket-logistics" +data.raw.item["rocket-silo"].order = "a-a-a" + +data.raw.item["rocket-control-unit"].subgroup = "rocket-intermediate-product" +data.raw.item["low-density-structure"].subgroup = "rocket-intermediate-product" +data.raw.item["low-density-structure"].order = "b" +data.raw.item["low-density-structure"].stack_size = 50 +data.raw.item["rocket-fuel"].subgroup = "rocket-intermediate-product" + + + +if not data.raw.item["sand"] then + data:extend({ + { + icon = "__space-exploration-graphics__/graphics/icons/sand.png", + icon_size = 64, + name = "sand", + order = "a[wood]-b-b", + stack_size = 200, + subgroup = "raw-material", + type = "item" + } + }) +end + +if not data.raw.item["glass"] then + data:extend({ + { + icon = "__space-exploration-graphics__/graphics/icons/glass.png", + icon_size = 64, + name = "glass", + order = "a[wood]-b-c", + stack_size = 100, + subgroup = "raw-material", + type = "item" + } + }) +end + +-- item_group, sequence +--[[ +data:extend({ + { + action = { + action_delivery = { + target_effects = { + damage = { + amount = 50, -- 8, + type = "physical" + }, + type = "damage" + }, + type = "instant" + }, + type = "direct" + }, + durability = 10000, -- 5000 + icon = "__space-exploration-graphics__/graphics/icons/omega-tool.png", + icon_size = 64, + name = data_util.mod_prefix .. "omega-tool", + order = "a[mining]-b[steel-axe]", + speed = 100, --4, + stack_size = 5, + subgroup = "tool", + type = "mining-tool" + }, +})]]-- + +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "heat-shielding", + icon = "__space-exploration-graphics__/graphics/icons/heat-shielding.png", + icon_size = 64, + order = "a", + stack_size = 50, + subgroup = "rocket-intermediate-product", + }, + { + icon = "__space-exploration-graphics__/graphics/icons/accumulator.png", + icon_size = 64, + name = data_util.mod_prefix .. "space-accumulator", + order = data.raw.item.accumulator.order, + place_result = data_util.mod_prefix .. "space-accumulator", + stack_size = data.raw.item.accumulator.stack_size, + subgroup = "solar", + type = "item" + }, + { + icon = "__space-exploration-graphics__/graphics/icons/accumulator-2.png", + icon_size = 64, + name = data_util.mod_prefix .. "space-accumulator-2", + order = data.raw.item.accumulator.order, + place_result = data_util.mod_prefix .. "space-accumulator-2", + stack_size = data.raw.item.accumulator.stack_size, + subgroup = "solar", + type = "item" + }, + { + icon = "__space-exploration-graphics__/graphics/icons/solar-panel.png", + icon_size = 64, + name = data_util.mod_prefix .. "space-solar-panel", + order = "d[solar-panel]-a[solar-panel]-b", + place_result = data_util.mod_prefix .. "space-solar-panel", + stack_size = 20, + subgroup = "solar", + type = "item" + }, + { + icon = "__space-exploration-graphics__/graphics/icons/solar-panel-2.png", + icon_size = 64, + name = data_util.mod_prefix .. "space-solar-panel-2", + order = "d[solar-panel]-a[solar-panel]-b2", + place_result = data_util.mod_prefix .. "space-solar-panel-2", + stack_size = 20, + subgroup = "solar", + type = "item" + }, + { + icon = "__space-exploration-graphics__/graphics/icons/solar-panel-3.png", + icon_size = 64, + name = data_util.mod_prefix .. "space-solar-panel-3", + order = "d[solar-panel]-a[solar-panel]-b3", + place_result = data_util.mod_prefix .. "space-solar-panel-3", + stack_size = 20, + subgroup = "solar", + type = "item" + }, +}) + +local function make_item_sequence(item_group, items, set, icon_size) + for _, item in pairs(items) do + -- name, stack_size, icon_size, picture count + local item = type(item) == "string" and {item, 50} or item + local order = "a-" .. string.format("%02d", _) + local filename = item[1] .. ".png" + local proto = { + type = "item", + name = data_util.mod_prefix .. item[1], + icon = "__space-exploration-graphics__/graphics/icons/" .. (set == "catalogue" and "catalogue/" or "") .. filename, + icon_size = set == "catalogue" and 64 or (item[3] or (icon_size or 64)), + subgroup = item_group, + order = order, + stack_size = item[2] + } + if string.find(item[1], "catalogue", 1, true) then + proto.pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/" .. (set == "catalogue" and "catalogue/" or "") .. filename, + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-" .. (item[1]):sub(-1)..".png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + end + if item[4] then + local baseFileName = "__space-exploration-graphics__/graphics/icons/" .. (set == "catalogue" and "catalogue/" or "") .. item[1] + proto.pictures = { + { size = 64, filename = baseFileName .. ".png", scale = 0.25 }, + { size = 64, filename = baseFileName .. "-1" .. ".png", scale = 0.25 }, + { size = 64, filename = baseFileName .. "-2" .. ".png", scale = 0.25 }, + { size = 64, filename = baseFileName .. "-3" .. ".png", scale = 0.25 } + } + end + data:extend({proto}) + --log(data_util.mod_prefix .. item[1]) + end +end + +local function make_data_item_sequence(item_group, items, stack_size, icon_size) + local stack_size = stack_size or 100 + for _, item in pairs(items) do + local item = type(item) == "string" and {item, 50} or item + local order = "a-" .. string.format("%02d", _) + data:extend({{ + type = "item", + name = data_util.mod_prefix .. item[1] .. "-data", + icon = "__space-exploration-graphics__/graphics/icons/data/" .. item[1] .. ".png", + icon_size = icon_size or 64, + subgroup = item_group, + order = order, + stack_size = item[2] + }}) + --log(data_util.mod_prefix .. item[1] .. "-data") + end +end + +--[[ +make_item_sequence("data-catalogue-astronomic", { + "astronomic-catalogue-1", "astronomic-catalogue-2", "astronomic-catalogue-3", "astronomic-catalogue-4", "astronomic-insight"}, "catalogue") +make_item_sequence("data-catalogue-energy", { + "energy-catalogue-1", "energy-catalogue-2", "energy-catalogue-3", "energy-catalogue-4", "energy-insight"}, "catalogue") +make_item_sequence("data-catalogue-biological", { + "biological-catalogue-1", "biological-catalogue-2", "biological-catalogue-3", "biological-catalogue-4", "biological-insight"}, "catalogue") +make_item_sequence("data-catalogue-material", { + "material-catalogue-1", "material-catalogue-2", "material-catalogue-3", "material-catalogue-4", "material-insight"}, "catalogue") +]] + +make_data_item_sequence("data-significant", { "significant"}) +make_data_item_sequence("data-generic", {"empty", "junk", "broken", + "machine-learning"}, nil, 64) +data.raw.item[data_util.mod_prefix .. "broken-data"].icon_size = 64 +data.raw.item[data_util.mod_prefix .. "empty-data"].order = "b" +data.raw.item[data_util.mod_prefix .. "machine-learning-data"].order = "c" +--[[ +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "universal-catalogue", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/universal-catalogue.png", + icon_size = 64, + subgroup = "data-generic", + order = "d", + stack_size = 50 + } +}) +]] + +make_data_item_sequence("data-astronomic", { + "visible-observation", + "infrared-observation", + "uv-observation", + "astrometric", + --"doppler-shift", + + "microwave-observation", + "xray-observation", + "gravitational-lensing", + "gravity-wave", + + "radio-observation", + "gammaray-observation", + "darkmatter", + "negative-pressure", + + "dark-energy", + "micro-black-hole", + --"timespace-anomaly", + "zero-point-energy", +}) + +make_data_item_sequence("data-energy", { + "conductivity", + --"ion-spectrometry", + "electromagnetic-field", + "polarisation", + "radiation", + + "quantum-phenomenon", + "atomic", + "subatomic", + "forcefield", + + "superconductivity", + "quark", + "entanglement", + "lepton", + + "boson", + "fusion-test", + --"singularity", + "magnetic-monopole", +}) + +make_data_item_sequence("data-biological", { + "bio-combustion", + --"bio-spectral", + "biomechanical", + "biochemical", + "genetic", + + "bio-combustion-resistance", + "experimental-genetic", + "biochemical-resistance", + "biomechanical-resistance", + + "bioelectrics", + "cryogenics", + "decompression", + "radiation-exposure", + + "comparative-genetic", + "decompression-resistance", + "neural-anomaly", + "radiation-exposure-resistance", +}) + +make_data_item_sequence("data-material", { + "cold-thermodynamics", + "hot-thermodynamics", + "tensile-strength", + "compressive-strength", + --"shear-strength", + + "rigidity", + "pressure-containment", + "corrosion-resistance", + "impact-shielding", + + "friction", + "ballistic-shielding", + "radiation-shielding", + "explosion-shielding", + + "electrical-shielding", + "laser-shielding", + "particle-beam-shielding", + "experimental-alloys", +}) + +make_item_sequence("space-observation-frame", { + {"observation-frame-blank", 200}, + {"observation-frame-radio", 200}, + {"observation-frame-microwave", 200}, + {"observation-frame-infrared", 200}, + {"observation-frame-visible", 200}, + {"observation-frame-uv", 200}, + {"observation-frame-xray", 200}, + {"observation-frame-gammaray", 200}, +}) + +make_item_sequence("space-canisters", { + {"canister", 50}, + {"magnetic-canister", 50}, + {"plasma-canister", 50}, + {"antimatter-canister", 50}, + {"empty-lifesupport-canister", 50}, + {"lifesupport-canister", 50}, + {"used-lifesupport-canister", 50}, +}) +data.raw.item[data_util.mod_prefix .. "antimatter-canister"].fuel_value = "20000MJ" +data.raw.item[data_util.mod_prefix .. "antimatter-canister"].fuel_category = "antimatter" +data.raw.item[data_util.mod_prefix .. "antimatter-canister"].burnt_result = data_util.mod_prefix .. "magnetic-canister" + +make_item_sequence("space-bioculture", { + {"nutrient-vat", 5}, + {"bioculture", 5}, + {"experimental-bioculture", 5}, + {"specimen", 5}, + {"experimental-specimen", 5}, + {"significant-specimen", 5}, +}, nil, 64) + +make_item_sequence("space-components", { + {"scrap", 50, 64, 4}, + {"contaminated-scrap", 50, 64, 4}, + "space-mirror", + "gammaray-detector", + {"material-testing-pack", 10}, + --"experimental-material", + {"nanomaterial", 50, 64}, + --"experimental-superconductor", + + {"superconductive-cable", 50, 64}, + + {"aeroframe-pole", 50, 64}, + {"aeroframe-scaffold", 50, 64}, + {"aeroframe-bulkhead", 50, 64}, + {"lattice-pressure-vessel", 50, 64}, + + {"heavy-girder", 50, 64}, + {"heavy-bearing", 50, 64}, + {"heavy-composite", 50, 64}, + {"heavy-assembly", 50, 64}, + + {"vitalic-acid", 50, 64}, + {"bioscrubber", 50, 64}, + {"vitalic-reagent", 50, 64}, + {"vitalic-epoxy", 50, 64}, + {"self-sealing-gel", 50, 64}, + + {"holmium-cable", 50, 64}, + {"holmium-solenoid", 50, 64}, + {"quantum-processor", 50, 64}, + {"dynamic-emitter", 50, 64}, + + {"naquium-cube", 8, 64}, + {"naquium-tessaract", 1, 64}, + {"naquium-processor", 1, 64}, +}, nil, 64) + +data.raw.item[data_util.mod_prefix .. "scrap"].pictures = { + {filename = "__space-exploration-graphics__/graphics/icons/scrap.png",scale = 0.25,size = 64}, + {filename = "__space-exploration-graphics__/graphics/icons/scrap-1.png",scale = 0.25,size = 64}, + {filename = "__space-exploration-graphics__/graphics/icons/scrap-2.png",scale = 0.25,size = 64}, + {filename = "__space-exploration-graphics__/graphics/icons/scrap-3.png",scale = 0.25,size = 64} +} +data.raw.item[data_util.mod_prefix .. "contaminated-scrap"].pictures = { + {filename = "__space-exploration-graphics__/graphics/icons/contaminated-scrap.png",scale = 0.25,size = 64}, + {filename = "__space-exploration-graphics__/graphics/icons/contaminated-scrap-1.png",scale = 0.25,size = 64}, + {filename = "__space-exploration-graphics__/graphics/icons/contaminated-scrap-2.png",scale = 0.25,size = 64}, + {filename = "__space-exploration-graphics__/graphics/icons/contaminated-scrap-3.png",scale = 0.25,size = 64} +} + +make_item_sequence("data-generic", { + {"data-storage-substrate", 100}, + {"data-storage-substrate-cleaned", 100}, +}, nil, 64) + +data.raw.item[data_util.mod_prefix .. "material-testing-pack"].icon = "__space-exploration-graphics__/graphics/icons/crate.png" + +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "satellite-telemetry", + icon = "__space-exploration-graphics__/graphics/icons/satellite-telemetry.png", + icon_size = 64, + order = "n-b", + subgroup = "rocket-intermediate-product", + stack_size = 50, + }, + + { + type = "item", + name = data_util.mod_prefix .. "astronomic-catalogue-1", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-1.png", + icon_size = 64, + order = "a-a", + subgroup = "data-catalogue-astronomic", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-1.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-1.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "astronomic-catalogue-2", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-2.png", + icon_size = 64, + order = "a-b", + subgroup = "data-catalogue-astronomic", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-2.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-2.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "astronomic-catalogue-3", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-3.png", + icon_size = 64, + order = "a-c", + subgroup = "data-catalogue-astronomic", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-3.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-3.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "astronomic-catalogue-4", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-4.png", + icon_size = 64, + order = "a-d", + subgroup = "data-catalogue-astronomic", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-4.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-4.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "astronomic-insight", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-insight.png", + icon_size = 64, + order = "a-e", + subgroup = "data-catalogue-astronomic", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-insight.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-insight.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + + { + type = "item", + name = data_util.mod_prefix .. "biological-catalogue-1", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-1.png", + icon_size = 64, + order = "a-a", + subgroup = "data-catalogue-biological", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-1.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-1.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "biological-catalogue-2", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-2.png", + icon_size = 64, + order = "a-b", + subgroup = "data-catalogue-biological", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-2.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-2.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "biological-catalogue-3", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-3.png", + icon_size = 64, + order = "a-c", + subgroup = "data-catalogue-biological", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-3.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-3.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "biological-catalogue-4", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-4.png", + icon_size = 64, + order = "a-d", + subgroup = "data-catalogue-biological", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-4.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-4.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "biological-insight", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-insight.png", + icon_size = 64, + order = "a-e", + subgroup = "data-catalogue-biological", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/biological-insight.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-insight.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + + + { + type = "item", + name = data_util.mod_prefix .. "energy-catalogue-1", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-1.png", + icon_size = 64, + order = "a-a", + subgroup = "data-catalogue-energy", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-1.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-1.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "energy-catalogue-2", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-2.png", + icon_size = 64, + order = "a-b", + subgroup = "data-catalogue-energy", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-2.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-2.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "energy-catalogue-3", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-3.png", + icon_size = 64, + order = "a-c", + subgroup = "data-catalogue-energy", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-3.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-3.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "energy-catalogue-4", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-4.png", + icon_size = 64, + order = "a-d", + subgroup = "data-catalogue-energy", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-4.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-4.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "energy-insight", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-insight.png", + icon_size = 64, + order = "a-e", + subgroup = "data-catalogue-energy", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/energy-insight.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-insight.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + + + { + type = "item", + name = data_util.mod_prefix .. "material-catalogue-1", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-1.png", + icon_size = 64, + order = "a-a", + subgroup = "data-catalogue-material", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-1.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-1.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "material-catalogue-2", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-2.png", + icon_size = 64, + order = "a-b", + subgroup = "data-catalogue-material", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-2.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-2.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "material-catalogue-3", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-3.png", + icon_size = 64, + order = "a-c", + subgroup = "data-catalogue-material", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-3.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-3.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "material-catalogue-4", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-4.png", + icon_size = 64, + order = "a-d", + subgroup = "data-catalogue-material", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-4.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-4.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "material-insight", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-insight.png", + icon_size = 64, + order = "a-e", + subgroup = "data-catalogue-material", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/material-insight.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-insight.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + + + + { + type = "item", + name = data_util.mod_prefix .. "deep-catalogue-1", + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/base-catalogue-1.png", icon_size = 64}, + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-1.png", icon_size = 64}, + }, + icon_size = 64, + order = "a-a", + subgroup = "data-catalogue-deep", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/base-catalogue-1.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-1.png", + scale = 0.25, + size = 64, + draw_as_glow = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "deep-catalogue-2", + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/base-catalogue-2.png", icon_size = 64}, + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-2.png", icon_size = 64}, + }, + icon_size = 64, + order = "a-b", + subgroup = "data-catalogue-deep", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/base-catalogue-2.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-2.png", + scale = 0.25, + size = 64, + draw_as_glow = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "deep-catalogue-3", + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/base-catalogue-3.png", icon_size = 64}, + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-3.png", icon_size = 64}, + }, + icon_size = 64, + order = "a-c", + subgroup = "data-catalogue-deep", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/base-catalogue-3.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-3.png", + scale = 0.25, + size = 64, + draw_as_glow = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "deep-catalogue-4", + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/base-catalogue-4.png", icon_size = 64}, + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-4.png", icon_size = 64}, + }, + icon_size = 64, + order = "a-d", + subgroup = "data-catalogue-deep", + stack_size = 50, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/base-catalogue-4.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-catalogue-4.png", + scale = 0.25, + size = 64, + draw_as_glow = true + } + } + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "nano-engineering-data", + icon = "__space-exploration-graphics__/graphics/icons/data/nano-engineering.png", + icon_size = 64, + order = "a-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "naquium-structural-data", + icon = "__space-exploration-graphics__/graphics/icons/data/naquium-structural.png", + icon_size = 64, + order = "a-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "naquium-energy-data", + icon = "__space-exploration-graphics__/graphics/icons/data/naquium-energy.png", + icon_size = 64, + order = "a-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "annihilation-data", + icon = "__space-exploration-graphics__/graphics/icons/data/annihilation.png", + icon_size = 64, + order = "b-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "hyperlattice-data", + icon = "__space-exploration-graphics__/graphics/icons/data/hyperlattice.png", + icon_size = 64, + order = "b-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "timespace-anomaly-data", + icon = "__space-exploration-graphics__/graphics/icons/data/timespace-anomaly.png", + icon_size = 64, + order = "b-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "singularity-data", + icon = "__space-exploration-graphics__/graphics/icons/data/singularity.png", + icon_size = 64, + order = "b-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "star-probe-data", + icon = "__space-exploration-graphics__/graphics/icons/data/star-probe.png", + icon_size = 64, + order = "z", + subgroup = "data-energy", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "belt-probe-data", + icon = "__space-exploration-graphics__/graphics/icons/data/belt-probe.png", + icon_size = 64, + order = "z", + subgroup = "data-astronomic", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "void-probe-data", + icon = "__space-exploration-graphics__/graphics/icons/data/void-probe.png", + icon_size = 64, + order = "a-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "space-fold-data", + icon = "__space-exploration-graphics__/graphics/icons/data/space-fold.png", + icon_size = 64, + order = "c-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "space-warp-data", + icon = "__space-exploration-graphics__/graphics/icons/data/space-warp.png", + icon_size = 64, + order = "c-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "space-dialation-data", + icon = "__space-exploration-graphics__/graphics/icons/data/space-dialation.png", + icon_size = 64, + order = "c-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "space-injection-data", + icon = "__space-exploration-graphics__/graphics/icons/data/space-injection.png", + icon_size = 64, + order = "c-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "interstellar-data", + icon = "__space-exploration-graphics__/graphics/icons/data/interstellar.png", + icon_size = 64, + order = "d-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "teleportation-data", + icon = "__space-exploration-graphics__/graphics/icons/data/teleportation.png", + icon_size = 64, + order = "d-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "wormhole-data", + icon = "__space-exploration-graphics__/graphics/icons/data/wormhole.png", + icon_size = 64, + order = "d-a", + subgroup = "data-deep", + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "rhga-data", + icon = "__space-exploration-graphics__/graphics/icons/data/rhga.png", + icon_size = 64, + order = "d-a", + subgroup = "data-deep", + stack_size = 50, + }, + + { + type = "item", + name = data_util.mod_prefix .. "star-probe", + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/satellite.png", icon_size = 64}, + { icon = "__space-exploration-graphics__/graphics/icons/satellite-mask.png", icon_size = 64, tint = {r=1,g=0,b=0.5}}, + }, + icon_size = 64, + order = "z", + subgroup = "data-energy", + stack_size = 1, + rocket_launch_product = { data_util.mod_prefix .. "star-probe-data", 1000} + }, + { + type = "item", + name = data_util.mod_prefix .. "belt-probe", + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/satellite.png", icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/satellite-mask.png", icon_size = 64, tint = {r=0,g=0.5,b=1}}, + }, + icon_size = 64, + order = "z", + subgroup = "data-astronomic", + stack_size = 1, + rocket_launch_product = { data_util.mod_prefix .. "belt-probe-data", 1000} + }, + { + type = "item", + name = data_util.mod_prefix .. "void-probe", + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/satellite.png", icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/satellite-mask.png", icon_size = 64, tint = {r=0.1,g=0,b=0.5}}, + }, + icon_size = 64, + order = "a-d", + subgroup = "data-deep", + stack_size = 1, + rocket_launch_product = { data_util.mod_prefix .. "void-probe-data", 1000} + }, + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/medpack.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/medpack.lua new file mode 100644 index 0000000..2cdf276 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/medpack.lua @@ -0,0 +1,198 @@ +local data_util = require("data_util") + +data.raw.capsule["raw-fish"].capsule_action = { + attack_parameters = { + ammo_category = "capsule", + ammo_type = { + action = { + action_delivery = { + target_effects = { + damage = { + amount = -10, + type = "poison" + }, + type = "damage" + }, + type = "instant" + }, + type = "direct" + }, + category = "capsule", + target_type = "position" + }, + cooldown = 60, + range = 0, + type = "projectile" + }, + type = "use-on-self" +} +data:extend({ + { + icon = "__space-exploration-graphics__/graphics/icons/medpack-1.png", + icon_size = 64, + name = data_util.mod_prefix .. "medpack", + order = "aa", + stack_size = 20, + subgroup = "tool", + type = "capsule", + capsule_action = { + type = "use-on-self", + attack_parameters = { + activation_type = "consume", + ammo_category = "capsule", + ammo_type = { + action = { + action_delivery = { + target_effects = { + { + type = "play-sound", + sound = { filename = "__base__/sound/character-corpse-open.ogg", volume = 0.5 }, + }, + { + damage = { + amount = -50, + type = "poison" + }, + type = "damage" + } + }, + type = "instant" + }, + type = "direct" + }, + category = "capsule", + target_type = "position" + }, + cooldown = 60, + range = 0, + type = "projectile" + }, + }, + }, + { + icon = "__space-exploration-graphics__/graphics/icons/medpack-2.png", + icon_size = 64, + name = data_util.mod_prefix .. "medpack-2", + order = "aa", + stack_size = 20, + subgroup = "tool", + type = "capsule", + capsule_action = { + type = "use-on-self", + attack_parameters = { + activation_type = "consume", + ammo_category = "capsule", + ammo_type = { + action = { + action_delivery = { + target_effects = { + { + type = "play-sound", + sound = { filename = "__base__/sound/character-corpse-open.ogg", volume = 0.5 }, + }, + { + damage = { + amount = -100, + type = "poison" + }, + type = "damage" + } + }, + type = "instant" + }, + type = "direct" + }, + category = "capsule", + target_type = "position" + }, + cooldown = 60, + range = 0, + type = "projectile" + }, + }, + }, + { + icon = "__space-exploration-graphics__/graphics/icons/medpack-3.png", + icon_size = 64, + name = data_util.mod_prefix .. "medpack-3", + order = "aa", + stack_size = 20, + subgroup = "tool", + type = "capsule", + capsule_action = { + type = "use-on-self", + attack_parameters = { + activation_type = "consume", + ammo_category = "capsule", + ammo_type = { + action = { + action_delivery = { + target_effects = { + { + type = "play-sound", + sound = { filename = "__base__/sound/character-corpse-open.ogg", volume = 0.5 }, + }, + { + damage = { + amount = -200, + type = "poison" + }, + type = "damage" + } + }, + type = "instant" + }, + type = "direct" + }, + category = "capsule", + target_type = "position" + }, + cooldown = 60, + range = 0, + type = "projectile" + }, + }, + }, + { + icon = "__space-exploration-graphics__/graphics/icons/medpack-4.png", + icon_size = 64, + name = data_util.mod_prefix .. "medpack-4", + order = "aa", + stack_size = 20, + subgroup = "tool", + type = "capsule", + capsule_action = { + type = "use-on-self", + attack_parameters = { + activation_type = "consume", + ammo_category = "capsule", + ammo_type = { + action = { + action_delivery = { + target_effects = { + { + type = "play-sound", + sound = { filename = "__base__/sound/character-corpse-open.ogg", volume = 0.5 }, + }, + { + damage = { + amount = -400, + type = "poison" + }, + type = "damage" + } + }, + type = "instant" + }, + type = "direct" + }, + category = "capsule", + target_type = "position" + }, + cooldown = 60, + range = 0, + type = "projectile" + }, + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/meteor-defence.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/meteor-defence.lua new file mode 100644 index 0000000..77b627f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/meteor-defence.lua @@ -0,0 +1,101 @@ +local data_util = require("data_util") + + +data:extend({ + { + type = "ammo-category", + name = data_util.mod_prefix .. "meteor-point-defence", + bonus_gui_order = "z-z", + }, + { + type = "ammo-category", + name = data_util.mod_prefix .. "meteor-defence", + bonus_gui_order = "z-z", + }, + { + type = "item", + name = data_util.mod_prefix .. "meteor-point-defence", + icons = { + {icon="__space-exploration-graphics__/graphics/icons/meteor-point-defence-base.png", icon_size = 64}, + {icon="__space-exploration-graphics__/graphics/icons/meteor-point-defence-mask.png", icon_size = 64, tint = {r=255,g=0,b=0}} + }, + order = "a-a", + subgroup = "surface-defense", + stack_size = 50, + place_result = data_util.mod_prefix .. "meteor-point-defence-container", + }, + { + type = "ammo", + name = data_util.mod_prefix .. "meteor-point-defence-ammo", + icon = "__space-exploration-graphics__/graphics/icons/meteor-point-defence-ammo.png", + icon_size = 64, + order = "a-b", + subgroup = "surface-defense", + stack_size = 50, + ammo_type = + { + category = data_util.mod_prefix .. "meteor-point-defence", + target_type = "entity", + action = { + { + type = "direct", + action_delivery = { + type = "instant", + target_effects = { + { + damage = { + amount = 50, + type = "physical" + }, + type = "damage" + }, + } + } + }, + } + }, + magazine_size = 1, + }, + { + type = "item", + name = data_util.mod_prefix .. "meteor-defence", + icon = "__space-exploration-graphics__/graphics/icons/meteor-defence.png", + icon_size = 64, + order = "b-a", + subgroup = "surface-defense", + stack_size = 1, + place_result = data_util.mod_prefix .. "meteor-defence-container", + }, + { + type = "ammo", + name = data_util.mod_prefix .. "meteor-defence-ammo", + icon = "__space-exploration-graphics__/graphics/icons/meteor-defence-ammo.png", + icon_size = 64, + order = "b-b", + subgroup = "surface-defense", + stack_size = 20, + ammo_type = + { + category = data_util.mod_prefix .. "meteor-defence", + target_type = "entity", + action = { + { + type = "direct", + action_delivery = { + type = "instant", + target_effects = { + { + damage = { + amount = 80, + type = "physical" + }, + type = "damage" + }, + } + } + }, + } + }, + magazine_size = 1, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/platforms.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/platforms.lua new file mode 100644 index 0000000..545aa86 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/platforms.lua @@ -0,0 +1,54 @@ +local data_util = require("data_util") +data:extend({ + --[[{ + type = "item", + name = "space", + icon = "__space-exploration-graphics__/graphics/icon/starfield-sparse.png", + icon_size = 64, + subgroup = "terrain", + order = "t[starfield]-a[sparse]", + stack_size = 100, + place_as_tile = + { + result = "space", + condition_size = 0, + condition = { "water-tile" } + } + },]]-- + { + type = "item", + name = data_util.mod_prefix .. "space-platform-scaffold", + icon = "__space-exploration-graphics__/graphics/icons/space-platform-scaffold.png", + icon_size = 64, + subgroup = "terrain", + order = "s[space-platform]-a[scaffold]", + stack_size = 100, + place_as_tile = + { + result = data_util.mod_prefix .. "space-platform-scaffold", + condition_size = 1, + condition = { + "water-tile", + "ground-tile", + } + } + }, + { + type = "item", + name = data_util.mod_prefix .. "space-platform-plating", + icon = "__space-exploration-graphics__/graphics/icons/space-platform-plating.png", + icon_size = 64, + subgroup = "terrain", + order = "s[space-platform]-b[plating]", + stack_size = 100, + place_as_tile = + { + result = data_util.mod_prefix .. "space-platform-plating", + condition_size = 1, + condition = { + "water-tile", + "ground-tile", + } + } + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/resources.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/resources.lua new file mode 100644 index 0000000..0f90aca --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/resources.lua @@ -0,0 +1,582 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "water-ice", + icon = "__space-exploration-graphics__/graphics/icons/water-ice.png", + icon_size = 64, + subgroup = "raw-resource", + order = "i-a", + stack_size = 200, + }, + + + { + type = "item", + name = data_util.mod_prefix .. "methane-ice", + icon = "__space-exploration-graphics__/graphics/icons/methane-ice.png", + icon_size = 64, + order = "i-b", + stack_size = 200, + subgroup = "raw-resource", + }, + + + { + type = "item", + name = data_util.mod_prefix .. "cryonite", + icon = "__space-exploration-graphics__/graphics/icons/cryonite.png", + icon_size = 64, + order = "h-a[cryonite]", + pictures = { + { + filename = "__space-exploration-graphics__/graphics/icons/cryonite.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/cryonite-01.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/cryonite-02.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/cryonite-03.png", + scale = 0.25, + size = 64 + } + }, + stack_size = 50, + subgroup = "raw-resource", + }, + { + type = "item", + name = data_util.mod_prefix .. "cryonite-crushed", + icon = "__space-exploration-graphics__/graphics/icons/cryonite-crushed.png", + icon_size = 64, + order = "r[resource]-c[crushed]-a", + stack_size = 50, + subgroup = "pulverised", + }, + { + type = "item", + name = data_util.mod_prefix .. "cryonite-washed", + icon = "__space-exploration-graphics__/graphics/icons/cryonite-washed.png", + icon_size = 64, + order = "r[resource]-d[washed]-a", + stack_size = 50, + subgroup = "washed", + }, + { + type = "item", + name = data_util.mod_prefix .. "cryonite-rod", + icon = "__space-exploration-graphics__/graphics/icons/cryonite-rod.png", + icon_size = 64, + order = "r[resource]-g[extract]-a", + stack_size = 100, + subgroup = "raw-material", + }, + { + type = "item", + name = data_util.mod_prefix .. "cryonite-ion-exchange-beads", + icon = "__space-exploration-graphics__/graphics/icons/cryonite-ion-exchange-beads.png", + icon_size = 64, + order = "r[resource]-h[extract]-a", + stack_size = 200, + subgroup = "raw-material", + }, + + + + + + { + type = "item", + name = data_util.mod_prefix .. "beryllium-ore", + icon = "__space-exploration-graphics__/graphics/icons/beryllium-ore.png", + icon_size = 64, + order = "h-d[beryllium-ore]", + pictures = { + { + filename = "__space-exploration-graphics__/graphics/icons/beryllium-ore.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/beryllium-ore-01.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/beryllium-ore-02.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/beryllium-ore-03.png", + scale = 0.25, + size = 64 + } + }, + stack_size = 100, + subgroup = "raw-resource", + }, + { + type = "item", + name = data_util.mod_prefix .. "beryllium-ore-crushed", + icon = "__space-exploration-graphics__/graphics/icons/beryllium-ore-crushed.png", + icon_size = 64, + order = "r[resource]-c[crushed]-d", + stack_size = 100, + subgroup = "pulverised", + }, + { + type = "item", + name = data_util.mod_prefix .. "beryllium-sulfate", + icon = "__space-exploration-graphics__/graphics/icons/beryllium-sulfate.png", + icon_size = 64, + order = "r[resource]-d[washed]-d", + stack_size = 100, + subgroup = "washed", + }, + { + type = "fluid", + name = data_util.mod_prefix .. "beryllium-hydroxide", + default_temperature = 25, + heat_capacity = "0.1KJ", + max_temperature = 100, + base_color = {r=73, g=112, b=79}, + flow_color = {r=156, g=178, b=159}, + icon = "__space-exploration-graphics__/graphics/icons/fluid/beryllium-hydroxide.png", + icon_size = 64, + pressure_to_speed_ratio = 0.4, + flow_to_energy_ratio = 0.59, + order = "r[resources]-b", + }, + { + type = "item", + name = data_util.mod_prefix .. "beryllium-powder", + icon = "__space-exploration-graphics__/graphics/icons/beryllium-powder.png", + icon_size = 64, + order = "r[resource]-p[powder]-d", + stack_size = 100, + subgroup = "washed", + }, + { + type = "item", + name = data_util.mod_prefix .. "beryllium-ingot", + icon = "__space-exploration-graphics__/graphics/icons/beryllium-ingot.png", + icon_size = 64, + order = "r[resource]-i[ingot]-e", + stack_size = 100, + subgroup = "ingots", + }, + { + type = "item", + name = data_util.mod_prefix .. "beryllium-plate", + icon = "__space-exploration-graphics__/graphics/icons/beryllium-plate.png", + icon_size = 64, + order = "r[resource]-p[plate]-e", + stack_size = 200, + subgroup = "plates", + }, + + + + { + type = "item", + name = data_util.mod_prefix .. "holmium-ore", + icon = "__space-exploration-graphics__/graphics/icons/holmium-ore.png", + icon_size = 64, + order = "h-e[holmium-ore]", + pictures = { + { + filename = "__space-exploration-graphics__/graphics/icons/holmium-ore.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/holmium-ore-01.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/holmium-ore-02.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/holmium-ore-03.png", + scale = 0.25, + size = 64 + } + }, + stack_size = 50, + subgroup = "raw-resource", + }, + { + type = "item", + name = data_util.mod_prefix .. "holmium-ore-crushed", + icon = "__space-exploration-graphics__/graphics/icons/holmium-ore-crushed.png", + icon_size = 64, + order = "r[resource]-c[crushed]-e", + stack_size = 50, + subgroup = "pulverised", + }, + { + type = "item", + name = data_util.mod_prefix .. "holmium-ore-washed", + icon = "__space-exploration-graphics__/graphics/icons/holmium-ore-washed.png", + icon_size = 64, + order = "r[resource]-d[washed]-e", + stack_size = 50, + subgroup = "washed", + }, + { + type = "item", + name = data_util.mod_prefix .. "holmium-powder", + icon = "__space-exploration-graphics__/graphics/icons/holmium-powder.png", + icon_size = 64, + order = "r[resource]-p[powder]-e", + stack_size = 50, + subgroup = "washed", + }, + { + type = "item", + name = data_util.mod_prefix .. "holmium-ingot", + icon = "__space-exploration-graphics__/graphics/icons/holmium-ingot.png", + icon_size = 64, + order = "r[resource]-i[ingot]-e", + stack_size = 50, + subgroup = "ingots", + }, + { + type = "item", + name = data_util.mod_prefix .. "holmium-plate", + icon = "__space-exploration-graphics__/graphics/icons/holmium-plate.png", + icon_size = 64, + order = "r[resource]-p[plate]-e", + stack_size = 100, + subgroup = "plates", + }, + + + + { + type = "item", + name = data_util.mod_prefix .. "iridium-ore", + icon = "__space-exploration-graphics__/graphics/icons/iridium-ore.png", + icon_size = 64, + order = "h-f[iridium-ore]", + pictures = { + { + filename = "__space-exploration-graphics__/graphics/icons/iridium-ore.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/iridium-ore-01.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/iridium-ore-02.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/iridium-ore-03.png", + scale = 0.25, + size = 64 + } + }, + stack_size = 40, + subgroup = "raw-resource", + }, + { + type = "item", + name = data_util.mod_prefix .. "iridium-ore-crushed", + icon = "__space-exploration-graphics__/graphics/icons/iridium-ore-crushed.png", + icon_size = 64, + order = "r[resource]-c[crushed]-f", + stack_size = 40, + subgroup = "pulverised", + }, + { + type = "item", + name = data_util.mod_prefix .. "iridium-ore-washed", + icon = "__space-exploration-graphics__/graphics/icons/iridium-ore-washed.png", + icon_size = 64, + order = "r[resource]-d[washed]-f", + stack_size = 40, + subgroup = "washed", + }, + { + type = "item", + name = data_util.mod_prefix .. "iridium-powder", + icon = "__space-exploration-graphics__/graphics/icons/iridium-powder.png", + icon_size = 64, + order = "r[resource]p[powder]-f", + stack_size = 30, + subgroup = "washed", + }, + { + type = "item", + name = data_util.mod_prefix .. "iridium-ingot", + icon = "__space-exploration-graphics__/graphics/icons/iridium-ingot.png", + icon_size = 64, + order = "r[resource]-i[ingot]-f", + stack_size = 20, + subgroup = "ingots", + }, + { + type = "item", + name = data_util.mod_prefix .. "iridium-plate", + icon = "__space-exploration-graphics__/graphics/icons/iridium-plate.png", + icon_size = 64, + order = "r[resource]-p[plate]-f", + stack_size = 40, + subgroup = "plates", + }, + + + + { + type = "item", + name = data_util.mod_prefix .. "naquium-ore", + icon = "__space-exploration-graphics__/graphics/icons/naquium-ore.png", + icon_size = 64, + order = "h-g[naquium-ore]", + pictures = { + { + filename = "__space-exploration-graphics__/graphics/icons/naquium-ore.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/naquium-ore-01.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/naquium-ore-02.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/naquium-ore-03.png", + scale = 0.25, + size = 64 + } + }, + stack_size = 10, + subgroup = "raw-resource", + }, + { + type = "item", + name = data_util.mod_prefix .. "naquium-ore-crushed", + icon = "__space-exploration-graphics__/graphics/icons/naquium-ore-crushed.png", + icon_size = 64, + order = "r[resource]-c[crushed]-g", + stack_size = 10, + subgroup = "pulverised", + }, + { + type = "item", + name = data_util.mod_prefix .. "naquium-ore-washed", + icon = "__space-exploration-graphics__/graphics/icons/naquium-ore-washed.png", + icon_size = 64, + order = "r[resource]-d[washed]-g", + stack_size = 10, + subgroup = "washed", + }, + { + type = "item", + name = data_util.mod_prefix .. "naquium-powder", + icon = "__space-exploration-graphics__/graphics/icons/naquium-powder.png", + icon_size = 64, + order = "r[resource]-p[powder]-g", + stack_size = 10, + subgroup = "washed", + }, + { + type = "item", + name = data_util.mod_prefix .. "naquium-ingot", + icon = "__space-exploration-graphics__/graphics/icons/naquium-ingot.png", + icon_size = 64, + order = "r[resource]-i[ingot]-g", + stack_size = 10, + subgroup = "ingots", + }, + { + type = "item", + name = data_util.mod_prefix .. "naquium-plate", + icon = "__space-exploration-graphics__/graphics/icons/naquium-plate.png", + icon_size = 64, + order = "r[resource]-p[plate]-g", + stack_size = 20, + subgroup = "plates", + }, + + + { + type = "item", + name = data_util.mod_prefix .. "vitamelange", + icon = "__space-exploration-graphics__/graphics/icons/vitamelange.png", + icon_size = 64, + order = "h-c[vitamelange]", + pictures = { + { + filename = "__space-exploration-graphics__/graphics/icons/vitamelange.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/vitamelange-01.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/vitamelange-02.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/vitamelange-03.png", + scale = 0.25, + size = 64 + } + }, + stack_size = 50, + subgroup = "raw-resource", + fuel_category = "chemical", + fuel_value = "2MJ", + }, + { + type = "item", + name = data_util.mod_prefix .. "vitamelange-nugget", + icon = "__space-exploration-graphics__/graphics/icons/vitamelange-nugget.png", + icon_size = 64, + order = "r[resource]-d[washed]-c", + stack_size = 50, + subgroup = "pulverised", + fuel_category = "chemical", + fuel_value = "1MJ", + }, + { + type = "item", + name = data_util.mod_prefix .. "vitamelange-roast", + icon = "__space-exploration-graphics__/graphics/icons/vitamelange-roast.png", + icon_size = 64, + order = "r[resource]-e[roast]-c", + stack_size = 50, + subgroup = "ingots", + fuel_category = "chemical", + fuel_value = "2.2MJ", + }, + { + type = "item", + name = data_util.mod_prefix .. "vitamelange-spice", + icon = "__space-exploration-graphics__/graphics/icons/vitamelange-spice.png", + icon_size = 64, + order = "r[resource]-f[blended]-c", + stack_size = 50, + subgroup = "washed", + fuel_category = "chemical", + fuel_value = "4.5MJ", + }, + { + type = "item", + name = data_util.mod_prefix .. "vitamelange-extract", + icon = "__space-exploration-graphics__/graphics/icons/vitamelange-extract.png", + icon_size = 64, + order = "r[resource]-g[extract]-c", + stack_size = 50, + subgroup = "raw-material", + fuel_category = "chemical", + fuel_value = "10MJ", + }, + + + { + type = "item", + name = data_util.mod_prefix .. "vulcanite", + icon = "__space-exploration-graphics__/graphics/icons/vulcanite.png", + icon_size = 64, + order = "h-b[vulcanite]", + pictures = { + { + filename = "__space-exploration-graphics__/graphics/icons/vulcanite.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/vulcanite-01.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/vulcanite-02.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/vulcanite-03.png", + scale = 0.25, + size = 64 + } + }, + stack_size = 50, + subgroup = "raw-resource", + fuel_category = "chemical", + fuel_value = "4MJ", + }, + { + type = "item", + name = data_util.mod_prefix .. "vulcanite-crushed", + icon = "__space-exploration-graphics__/graphics/icons/vulcanite-crushed.png", + icon_size = 64, + order = "r[resource]-c[crushed]-b", + stack_size = 50, + subgroup = "pulverised", + fuel_category = "chemical", + fuel_value = "4MJ", + }, + { + type = "item", + name = data_util.mod_prefix .. "vulcanite-washed", + icon = "__space-exploration-graphics__/graphics/icons/vulcanite-washed.png", + icon_size = 64, + order = "r[resource]-d[washed]-b", + stack_size = 50, + subgroup = "washed", + fuel_category = "chemical", + fuel_value = "5MJ", + }, + { + type = "item", + name = data_util.mod_prefix .. "vulcanite-block", + icon = "__space-exploration-graphics__/graphics/icons/vulcanite-block.png", + icon_size = 64, + order = "r[resource]-g[extract]-b", + stack_size = 100, + subgroup = "raw-material", + fuel_category = "chemical", + fuel_value = "10MJ", + }, + { + type = "item", + name = data_util.mod_prefix .. "vulcanite-ion-exchange-beads", + icon = "__space-exploration-graphics__/graphics/icons/vulcanite-ion-exchange-beads.png", + icon_size = 64, + order = "r[resource]-h[extract]-b", + stack_size = 200, + subgroup = "raw-material", + }, + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/rocket-landing-pad.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/rocket-landing-pad.lua new file mode 100644 index 0000000..17c0eb1 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/rocket-landing-pad.lua @@ -0,0 +1,13 @@ +local data_util = require("data_util") +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "rocket-landing-pad", + place_result = data_util.mod_prefix .. "rocket-landing-pad", + icon = "__space-exploration-graphics__/graphics/icons/rocket-landing-pad.png", + icon_size = 64, + order = "c", + stack_size = 1, + subgroup = "rocket-logistics", -- need to move to logistics + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/rocket-launch-pad.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/rocket-launch-pad.lua new file mode 100644 index 0000000..08721a9 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/rocket-launch-pad.lua @@ -0,0 +1,33 @@ +local data_util = require("data_util") +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "rocket-launch-pad-silo-dummy-ingredient-item", + icon = "__space-exploration-graphics__/graphics/icons/cargo-rocket.png", + icon_size = 64, + order = "q[rocket-part]-d", + stack_size = 1, + subgroup = "rocket-intermediate-product", + flags = {"hidden"} + }, + { + type = "item", + name = data_util.mod_prefix .. "rocket-launch-pad-silo-dummy-result-item", + icon = "__space-exploration-graphics__/graphics/icons/cargo-rocket.png", + icon_size = 64, + order = "q[rocket-part]-e", + stack_size = 1, + subgroup = "rocket-intermediate-product", + flags = { "hidden" }, + }, + { + type = "item", + name = data_util.mod_prefix .. "rocket-launch-pad", + place_result = data_util.mod_prefix .. "rocket-launch-pad", + icon = "__space-exploration-graphics__/graphics/icons/rocket-launch-pad.png", + icon_size = 64, + order = "b", + stack_size = 1, + subgroup = "rocket-logistics", -- need to move to logistics + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/science-pack.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/science-pack.lua new file mode 100644 index 0000000..53d2765 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/science-pack.lua @@ -0,0 +1,689 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "tool", + name = data_util.mod_prefix .. "rocket-science-pack", + subgroup = "science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/deep-1.png", icon_size = 64}, + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/mask-1.png", icon_size = 64}, + }, + order = "h[rocket-science-pack-1]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/deep-1.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-1.png", + scale = 0.25, + size = 64, + draw_as_glow = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "astronomic-science-pack-1", + subgroup = "astronomic-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-1.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[astronomic-science-pack-1]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-1.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-1.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "astronomic-science-pack-2", + subgroup = "astronomic-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-2.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[astronomic-science-pack-2]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-2.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-2.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "astronomic-science-pack-3", + subgroup = "astronomic-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-3.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[astronomic-science-pack-3]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-3.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-3.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "astronomic-science-pack-4", + subgroup = "astronomic-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-4.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[astronomic-science-pack-4]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-4.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-4.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "biological-science-pack-1", + subgroup = "biological-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-1.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[biological-science-pack-1]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/biological-1.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-1.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "biological-science-pack-2", + subgroup = "biological-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-2.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[biological-science-pack-2]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/biological-2.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-2.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "biological-science-pack-3", + subgroup = "biological-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-3.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[biological-science-pack-3]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/biological-3.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-3.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "biological-science-pack-4", + subgroup = "biological-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-4.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[biological-science-pack-4]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/biological-4.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-4.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "energy-science-pack-1", + subgroup = "energy-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-1.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[energy-science-pack-1]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/energy-1.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-1.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "energy-science-pack-2", + subgroup = "energy-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-2.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[energy-science-pack-2]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/energy-2.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-2.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "energy-science-pack-3", + subgroup = "energy-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-3.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[energy-science-pack-3]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/energy-3.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-3.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "energy-science-pack-4", + subgroup = "energy-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-4.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[energy-science-pack-4]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/energy-4.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-4.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "material-science-pack-1", + subgroup = "material-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-1.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[material-science-pack-1]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/material-1.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-1.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "material-science-pack-2", + subgroup = "material-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-2.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[material-science-pack-2]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/material-2.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-2.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "material-science-pack-3", + subgroup = "material-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-3.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[material-science-pack-3]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/material-3.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-3.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "material-science-pack-4", + subgroup = "material-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-4.png", + icon_size = 64, + icon_mipmaps = 1, + order = "h[material-science-pack-4]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/material-4.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-4.png", + scale = 0.25, + size = 64, + draw_as_light = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "deep-space-science-pack-1", + subgroup = "deep-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/deep-1.png", + icon_size = 64, + icon_mipmaps = 1, + order = "z[space-platform-science-pack-2]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/deep-1.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-1.png", + scale = 0.25, + size = 64, + tint = {r=50,g=0,b=150}, + draw_as_glow = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "deep-space-science-pack-2", + subgroup = "deep-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/deep-2.png", + icon_size = 64, + icon_mipmaps = 1, + order = "z[space-platform-science-pack-2]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/deep-2.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-2.png", + scale = 0.25, + size = 64, + tint = {r=50,g=0,b=150}, + draw_as_glow = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "deep-space-science-pack-3", + subgroup = "deep-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/deep-3.png", + icon_size = 64, + icon_mipmaps = 1, + order = "z[space-platform-science-pack-2]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/deep-3.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-3.png", + scale = 0.25, + size = 64, + tint = {r=50,g=0,b=150}, + draw_as_glow = true + } + } + } + } + }, + { + type = "tool", + name = data_util.mod_prefix .. "deep-space-science-pack-4", + subgroup = "deep-science-pack", + durability = 1, + durability_description_key = "description.science-pack-remaining-amount-key", + durability_description_value = "description.science-pack-remaining-amount-value", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/deep-4.png", + icon_size = 64, + icon_mipmaps = 1, + order = "z[space-platform-science-pack-2]", + stack_size = 200, + pictures = { + { + layers = { + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/deep-4.png", + scale = 0.25, + size = 64 + }, + { + filename = "__space-exploration-graphics__/graphics/icons/catalogue/mask-4.png", + scale = 0.25, + size = 64, + tint = {r=50,g=0,b=150}, + draw_as_glow = true + } + } + } + } + }, +}) + +--[[ +local function tint_science_pack(name, tint) + if data.raw.tool[name] then + data.raw.tool[name].icon = nil + data.raw.tool[name].icons = { + { + icon = "__space-exploration-graphics__/graphics/icons/science-pack-base.png" + }, + { + icon = "__space-exploration-graphics__/graphics/icons/science-pack-mask.png", + tint = tint + } + } + end +end +tint_science_pack("science-pack-1", {r = 0.9, g = 0.7, b = 0}) +tint_science_pack("science-pack-2", {r = 0, g = 0.6, b = 0}) +tint_science_pack("science-pack-3", {r = 0.2, g = 0.4, b = 0.8}) +tint_science_pack("military-science-pack", {r = 0.7, g = 0, b = 0}) +tint_science_pack("production-science-pack", {r = 0.9, g = 0.4, b = 0}) +tint_science_pack("high-tech-science-pack", {r = 0.7, g = 0, b = 0.7}) +tint_science_pack("space-science-pack", {r = 0, g = 1, b = 1}) +tint_science_pack(data_util.mod_prefix .. "science-pack-1", {r = 1, g = 1, b = 1}) +data.raw.tool[data_util.mod_prefix .. "science-pack-2"].icons = nil +data.raw.tool[data_util.mod_prefix .. "science-pack-2"].icon = "__space-exploration-graphics__/graphics/icons/science-pack-dark.png" +"space-science-pack" +]]-- +--[[ + +[red] = science pack 1 +[green] = science pack 2 +[military] (grey) +[blue] = science pack 3 +[tech] (gold) High Tech +[production] (purple) +[rocket] (orange ) - was white space science 1 +[space] (white) - new space platform +[deep-space] - advanced space science + +yellow = 1 +green = 2 +cyan = 3 +red = military +purple = production +turquoise = tech +orange = rocketry +white = space +black = deep space +]]-- diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/spaceship.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/spaceship.lua new file mode 100644 index 0000000..7158cd8 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/spaceship.lua @@ -0,0 +1,111 @@ +local data_util = require("data_util") +data:extend({ + { + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-base.png", icon_size = 64}, + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-mask.png", icon_size = 64, draw_as_glow = true, tint = data_util.console_tint}, + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-white.png", icon_size = 64}, + }, + name = data_util.mod_prefix .. "spaceship-console", + order = "a-a[spaceship-console]", + place_result = data_util.mod_prefix .. "spaceship-console", + stack_size = 10, + subgroup = "spaceship-structure", + type = "item", + }, + { + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-base.png", icon_size = 64}, + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-mask.png", icon_size = 64, draw_as_glow = true, tint = data_util.console_alt_tint}, + {icon = "__space-exploration-graphics__/graphics/icons/spaceship-console-white.png", icon_size = 64}, + }, + name = data_util.mod_prefix .. "spaceship-console-alt", + order = "a-a[spaceship-console]", + place_result = data_util.mod_prefix .. "spaceship-console-alt", + stack_size = 10, + subgroup = "spaceship-structure", + type = "item", + }, + { + icon = "__space-exploration-graphics__/graphics/icons/spaceship-floor.png", + icon_size = 64, + icon_mipmaps = 1, + name = data_util.mod_prefix .. "spaceship-floor", + order = "a-b[spaceship-floor]", + stack_size = 50, + subgroup = "spaceship-structure", + type = "item", + place_as_tile = + { + result = data_util.mod_prefix .. "spaceship-floor", + condition_size = 1, + condition = { "player-layer" } -- prevents placement on out-of-map + } + }, + { + icon = "__space-exploration-graphics__/graphics/icons/spaceship-wall.png", + icon_size = 64, + icon_mipmaps = 1, + name = data_util.mod_prefix .. "spaceship-wall", + order = "a-c[spaceship-wall]", + place_result = data_util.mod_prefix .. "spaceship-wall", + stack_size = 50, + subgroup = "spaceship-structure", + type = "item", + }, + { + icon = "__space-exploration-graphics__/graphics/icons/spaceship-gate.png", + icon_size = 64, + icon_mipmaps = 1, + name = data_util.mod_prefix .. "spaceship-gate", + order = "a-d[spaceship-gate]", + place_result = data_util.mod_prefix .. "spaceship-gate", + stack_size = 50, + subgroup = "spaceship-structure", + type = "item", + }, + { + icon = "__space-exploration-graphics__/graphics/icons/spaceship-rocket-engine.png", + icon_size = 64, + icon_mipmaps = 1, + name = data_util.mod_prefix .. "spaceship-rocket-engine", + order = "a-e[spaceship-engine]-a[rocket]", + place_result = data_util.mod_prefix .. "spaceship-rocket-engine", + stack_size = 10, + subgroup = "spaceship-structure", + type = "item", + }, + { + icon = "__space-exploration-graphics__/graphics/icons/spaceship-rocket-booster-tank.png", + icon_size = 64, + icon_mipmaps = 1, + name = data_util.mod_prefix .. "spaceship-rocket-booster-tank", + order = "a-e[spaceship-engine]-b[booster-tank]", + place_result = data_util.mod_prefix .. "spaceship-rocket-booster-tank", + stack_size = 10, + subgroup = "spaceship-structure", + type = "item", + }, + { + icon = "__space-exploration-graphics__/graphics/icons/spaceship-antimatter-engine.png", + icon_size = 64, + icon_mipmaps = 1, + name = data_util.mod_prefix .. "spaceship-antimatter-engine", + order = "a-e[spaceship-engine]-e[antimatter]", + place_result = data_util.mod_prefix .. "spaceship-antimatter-engine", + stack_size = 10, + subgroup = "spaceship-structure", + type = "item", + }, + { + icon = "__space-exploration-graphics__/graphics/icons/spaceship-antimatter-booster-tank.png", + icon_size = 64, + icon_mipmaps = 1, + name = data_util.mod_prefix .. "spaceship-antimatter-booster-tank", + order = "a-e[spaceship-engine]-f[booster-tank]", + place_result = data_util.mod_prefix .. "spaceship-antimatter-booster-tank", + stack_size = 10, + subgroup = "spaceship-structure", + type = "item", + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/structures.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/structures.lua new file mode 100644 index 0000000..d6daec0 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/structures.lua @@ -0,0 +1,482 @@ +local data_util = require("data_util") +local function stack_size(width) + if width >= 9 then + return 1 + elseif width >= 8 then + return 2 + elseif width >= 7 then + return 5 + elseif width >= 6 then + return 10 + elseif width >= 5 then + return 15 + elseif width >= 4 then + return 25 + elseif width >= 3 then + return 50 + end +end + + +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "fuel-refinery", + icon = "__space-exploration-graphics__/graphics/icons/fuel-refinery.png", + icon_size = 64, + order = "z-d[refinery]-e[fuel-refinery]", + subgroup = "chemistry", + stack_size = 10, + place_result = data_util.mod_prefix .. "fuel-refinery", + }, + { + type = "item", + name = data_util.mod_prefix .. "fluid-burner-generator", + icon = "__space-exploration-graphics__/graphics/icons/fluid-burner-generator.png", + icon_size = 64, + order = "z-d[fluid-burner-generator]", + subgroup = "energy", + stack_size = 20, + place_result = data_util.mod_prefix .. "fluid-burner-generator", + }, + { + type = "item", + name = data_util.mod_prefix .. "antimatter-reactor", + icon = "__space-exploration-graphics__/graphics/icons/antimatter-reactor.png", + icon_size = 64, + order = "f[antimatter]-a[reactor]-b", + subgroup = "energy", + stack_size = stack_size(9), + place_result = data_util.mod_prefix .. "antimatter-reactor", + }, + { + type = "item", + name = data_util.mod_prefix .. "naquium-heat-pipe", + icon = "__space-exploration-graphics__/graphics/icons/naquium-heat-pipe.png", + icon_size = 64, + order = "f[nuclear-energy]-b[heat-pipe]-m", + subgroup = "energy", + stack_size = 50, + place_result = data_util.mod_prefix .. "naquium-heat-pipe", + }, + { + type = "item", + name = data_util.mod_prefix .. "dimensional-anchor", + icon = "__space-exploration-graphics__/graphics/icons/dimensional-anchor.png", + icon_size = 64, + order = "z-a-".."dimensional-anchor", + stack_size = stack_size(9), + subgroup = "beaming", + place_result = data_util.mod_prefix .. "dimensional-anchor", + }, + { + type = "item", + name = data_util.mod_prefix .. "pulveriser", + icon = "__space-exploration-graphics__/graphics/icons/pulveriser.png", + icon_size = 64, + order = "z-d-z", + stack_size = stack_size(7), + subgroup = "mechanical", + place_result = data_util.mod_prefix .. "pulveriser", + }, + { + type = "item", + name = data_util.mod_prefix .. "addon-power-pole", + icon = "__space-exploration-graphics__/graphics/icons/addon-power-pole.png", + icon_size = 64, + order = "z-p-a", + stack_size = 50, + subgroup = "energy-pipe-distribution", + place_result = data_util.mod_prefix .. "addon-power-pole", + }, + { + type = "item", + name = data_util.mod_prefix .. "pylon", + icon = "__space-exploration-graphics__/graphics/icons/pylon.png", + icon_size = 64, + order = "z-p-a", + stack_size = 50, + subgroup = "energy-pipe-distribution", + place_result = data_util.mod_prefix .. "pylon", + }, + { + type = "item", + name = data_util.mod_prefix .. "pylon-substation", + icon = "__space-exploration-graphics__/graphics/icons/pylon-substation.png", + icon_size = 64, + order = "z-p-b", + stack_size = 50, + subgroup = "energy-pipe-distribution", + place_result = data_util.mod_prefix .. "pylon-substation", + }, + { + type = "item", + name = data_util.mod_prefix .. "pylon-construction", + icon = "__space-exploration-graphics__/graphics/icons/pylon-construction.png", + icon_size = 64, + order = "z-p-c", + stack_size = 50, + subgroup = "energy-pipe-distribution", + place_result = data_util.mod_prefix .. "pylon-construction-roboport", + }, + { + type = "item", + name = data_util.mod_prefix .. "pylon-construction-radar", + icon = "__space-exploration-graphics__/graphics/icons/pylon-construction-radar.png", + icon_size = 64, + order = "z-p-d", + stack_size = 50, + subgroup = "energy-pipe-distribution", + place_result = data_util.mod_prefix .. "pylon-construction-radar-roboport", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-assembling-machine", + icon = "__space-exploration-graphics__/graphics/icons/assembling-machine.png", + icon_size = 64, + order = "z-a-".."space-assembling-machine", + stack_size = stack_size(3), + subgroup = "assembling", + place_result = data_util.mod_prefix .. "space-assembling-machine", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-astrometrics-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/astrometrics-laboratory.png", + icon_size = 64, + order = "a-a", + stack_size = stack_size(5), + subgroup = "computation", + place_result = data_util.mod_prefix .. "space-astrometrics-laboratory", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-biochemical-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/biochemical-laboratory.png", + icon_size = 64, + order = "z-a-".."space-biochemical-laboratory", + stack_size = stack_size(7), + subgroup = "chemistry", + place_result = data_util.mod_prefix .. "space-biochemical-laboratory", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-electromagnetics-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/electromagnetics-laboratory.png", + icon_size = 64, + order = "z-a-".."space-electromagnetics-laboratory", + stack_size = stack_size(7), + subgroup = "plasma", + place_result = data_util.mod_prefix .. "space-electromagnetics-laboratory", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-decontamination-facility", + icon = "__space-exploration-graphics__/graphics/icons/decontamination-facility.png", + icon_size = 64, + order = "z-a-".."space-decontamination-facility", + stack_size = stack_size(6), + subgroup = "chemistry", + place_result = data_util.mod_prefix .. "space-decontamination-facility", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-genetics-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/genetics-laboratory.png", + icon_size = 64, + order = "z-a-".."space-genetics-laboratory", + stack_size = stack_size(7), + subgroup = "chemistry", + place_result = data_util.mod_prefix .. "space-genetics-laboratory", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-gravimetrics-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/gravimetrics-laboratory.png", + icon_size = 64, + order = "a-b", + stack_size = stack_size(5), + subgroup = "computation", + place_result = data_util.mod_prefix .. "space-gravimetrics-laboratory", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-growth-facility", + icon = "__space-exploration-graphics__/graphics/icons/growth-facility.png", + icon_size = 64, + order = "z-a-".."space-growth-facility", + stack_size = stack_size(9), + subgroup = "chemistry", + place_result = data_util.mod_prefix .. "space-growth-facility", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-hypercooler", + icon = "__space-exploration-graphics__/graphics/icons/hypercooler.png", + icon_size = 64, + order = "z-a-".."space-hypercooler", + stack_size = stack_size(5), + subgroup = "thermofluid", + place_result = data_util.mod_prefix .. "space-hypercooler", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-laser-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/laser-laboratory.png", + icon_size = 64, + order = "z-a-".."space-laser-laboratory", + stack_size = stack_size(7), + subgroup = "plasma", + place_result = data_util.mod_prefix .. "space-laser-laboratory", + }, + { + type = "item", + name = data_util.mod_prefix .. "lifesupport-facility", + icon = "__space-exploration-graphics__/graphics/icons/lifesupport-facility.png", + icon_size = 64, + order = "z-a-".."lifesupport-facility", + stack_size = stack_size(6), + subgroup = "chemistry", + place_result = data_util.mod_prefix .. "lifesupport-facility", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-manufactory", + icon = "__space-exploration-graphics__/graphics/icons/manufactory.png", + icon_size = 64, + order = "z-a-".."space-manufactory", + stack_size = stack_size(9), + subgroup = "assembling", + place_result = data_util.mod_prefix .. "space-manufactory", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-material-fabricator", + icon = "__space-exploration-graphics__/graphics/icons/material-fabricator.png", + icon_size = 64, + order = "z-a-".."space-material-fabricator", + stack_size = stack_size(9), + subgroup = "plasma", + place_result = data_util.mod_prefix .. "space-material-fabricator", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-mechanical-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/mechanical-laboratory.png", + icon_size = 64, + order = "z-a-".."space-mechanical-laboratory", + stack_size = stack_size(7), + subgroup = "mechanical", + place_result = data_util.mod_prefix .. "space-mechanical-laboratory", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-particle-accelerator", + icon = "__space-exploration-graphics__/graphics/icons/particle-accelerator.png", + icon_size = 64, + order = "z-a-".."space-particle-accelerator", + stack_size = stack_size(9), + subgroup = "plasma", + place_result = data_util.mod_prefix .. "space-particle-accelerator", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-particle-collider", + icon = "__space-exploration-graphics__/graphics/icons/particle-collider.png", + icon_size = 64, + order = "z-a-".."space-particle-collider", + stack_size = stack_size(9), + subgroup = "plasma", + place_result = data_util.mod_prefix .. "space-particle-collider", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-plasma-generator", + icon = "__space-exploration-graphics__/graphics/icons/plasma-generator.png", + icon_size = 64, + order = "z-a-".."space-plasma-generator", + stack_size = stack_size(7), + subgroup = "plasma", + place_result = data_util.mod_prefix .. "space-plasma-generator", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-radiation-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/radiation-laboratory.png", + icon_size = 64, + order = "z-a-".."space-radiation-laboratory", + stack_size = stack_size(7), + subgroup = "radiation", + place_result = data_util.mod_prefix .. "space-radiation-laboratory", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-radiator", + icon = "__space-exploration-graphics__/graphics/icons/radiator.png", + icon_size = 64, + order = "z-a-".."space-radiator", + stack_size = stack_size(3), + subgroup = "thermofluid", + place_result = data_util.mod_prefix .. "space-radiator", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-radiator-2", + icon = "__space-exploration-graphics__/graphics/icons/radiator-blue.png", + icon_size = 64, + order = "z-a-".."space-radiator-2", + stack_size = stack_size(3), + subgroup = "thermofluid", + place_result = data_util.mod_prefix .. "space-radiator-2", + }, + { + type = "item", + name = data_util.mod_prefix .. "recycling-facility", + icon = "__space-exploration-graphics__/graphics/icons/recycling-facility.png", + icon_size = 64, + order = "z-a-".."recycling-facility", + stack_size = stack_size(7), + subgroup = "mechanical", + place_result = data_util.mod_prefix .. "recycling-facility", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-supercomputer-1", + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-1.png", + icon_size = 64, + order = "z-a-".."space-supercomputer", + stack_size = stack_size(5), + subgroup = "computation", + place_result = data_util.mod_prefix .. "space-supercomputer-1", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-supercomputer-2", + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-2.png", + icon_size = 64, + order = "z-a-".."space-supercomputer", + stack_size = stack_size(5), + subgroup = "computation", + place_result = data_util.mod_prefix .. "space-supercomputer-2", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-supercomputer-3", + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-3.png", + icon_size = 64, + order = "z-a-".."space-supercomputer", + stack_size = stack_size(5), + subgroup = "computation", + place_result = data_util.mod_prefix .. "space-supercomputer-3", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-supercomputer-4", + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-4.png", + icon_size = 64, + order = "z-a-".."space-supercomputer", + stack_size = stack_size(5), + subgroup = "computation", + place_result = data_util.mod_prefix .. "space-supercomputer-4", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-telescope", + icon = "__space-exploration-graphics__/graphics/icons/telescope.png", + icon_size = 64, + order = "z-a-".."space-telescope", + stack_size = stack_size(3), + subgroup = "telescope", + place_result = data_util.mod_prefix .. "space-telescope", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-telescope-xray", + icon = "__space-exploration-graphics__/graphics/icons/telescope-xray.png", + icon_size = 64, + order = "z-a-".."space-telescope-xray", + stack_size = stack_size(5), + subgroup = "telescope", + place_result = data_util.mod_prefix .. "space-telescope-xray", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-telescope-gammaray", + icon = "__space-exploration-graphics__/graphics/icons/telescope-gammaray.png", + icon_size = 64, + order = "z-a-".."space-telescope-gammaray", + stack_size = stack_size(5), + subgroup = "telescope", + place_result = data_util.mod_prefix .. "space-telescope-gammaray", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-telescope-microwave", + icon = "__space-exploration-graphics__/graphics/icons/telescope-microwave.png", + icon_size = 64, + order = "z-a-".."space-telescope-microwave", + stack_size = stack_size(9), + subgroup = "telescope", + place_result = data_util.mod_prefix .. "space-telescope-microwave", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-telescope-radio", + icon = "__space-exploration-graphics__/graphics/icons/telescope-radio.png", + icon_size = 64, + order = "z-a-".."space-telescope-radio", + stack_size = stack_size(9), + subgroup = "telescope", + place_result = data_util.mod_prefix .. "space-telescope-radio", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-thermodynamics-laboratory", + icon = "__space-exploration-graphics__/graphics/icons/thermodynamics-laboratory.png", + icon_size = 64, + order = "z-a-".."space-thermodynamics-laboratory", + stack_size = stack_size(7), + subgroup = "smelting-machine", + place_result = data_util.mod_prefix .. "space-thermodynamics-laboratory", + }, + { + type = "item", + name = data_util.mod_prefix .. "supercharger", + icon = "__space-exploration-graphics__/graphics/icons/supercharger.png", + icon_size = 64, + order = "z-z", + stack_size = stack_size(4), + subgroup = "logistic-network", + place_result = data_util.mod_prefix .. "supercharger", + }, + { + type = "item", + name = data_util.mod_prefix .. "wide-beacon", + icon = "__space-exploration-graphics__/graphics/icons/wide-beacon.png", + icon_size = 64, + order = "z-a[beacon]-b", + stack_size = stack_size(4), + subgroup = "module", + place_result = data_util.mod_prefix .. "wide-beacon", + }, + { + type = "item", + name = data_util.mod_prefix .. "wide-beacon-2", + icon = "__space-exploration-graphics__/graphics/icons/wide-beacon-2.png", + icon_size = 64, + order = "z-a[beacon]-c", + stack_size = stack_size(4), + subgroup = "module", + place_result = data_util.mod_prefix .. "wide-beacon-2", + }, + { + type = "item", + name = data_util.mod_prefix .. "space-science-lab", + icon = "__space-exploration-graphics__/graphics/icons/space-science-lab.png", + icon_size = 64, + order = "z-space-science-lab", + stack_size = 1, + subgroup = "lab", + place_result = data_util.mod_prefix .. "space-science-lab" + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/utility.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/utility.lua new file mode 100644 index 0000000..1de40b2 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/utility.lua @@ -0,0 +1,29 @@ +local data_util = require("data_util") +data:extend{ + { + type = "item", + name = data_util.mod_prefix .. "struct-generic-settings", + icon = "__space-exploration-graphics__/graphics/icons/settings.png", + icon_size = 64, icon_mipmaps = 1, + flags = { "hidden"}, + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "struct-generic-input", + --icon = "__space-exploration-graphics__/graphics/icon/generic-input.png", + icon = "__space-exploration-graphics__/graphics/icons/settings.png", + icon_size = 64, icon_mipmaps = 1, + flags = { "hidden"}, + stack_size = 50, + }, + { + type = "item", + name = data_util.mod_prefix .. "struct-generic-output", + --icon = "__space-exploration-graphics__/graphics/icon/generic-output.png", + icon = "__space-exploration-graphics__/graphics/icons/settings.png", + icon_size = 64, icon_mipmaps = 1, + flags = { "hidden"}, + stack_size = 50, + } +} diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-cryogun.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-cryogun.lua new file mode 100644 index 0000000..7f68387 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-cryogun.lua @@ -0,0 +1,489 @@ +local data_util = require("data_util") + +data.raw["utility-constants"].default.bonus_gui_ordering["cryogun"] = "k-c" +data:extend({ + { + type = "ammo-category", + name = "cryogun", + bonus_gui_order = "k-c", + }, + { + type = "gun", + name = data_util.mod_prefix .. "cryogun", + icon = "__space-exploration-graphics__/graphics/icons/cryogun.png", + icon_mipmaps = 1, + icon_size = 64, + subgroup = "gun", + order = "e[flamethrower]", + stack_size = 5, + attack_parameters = { + ammo_category = "cryogun", + cooldown = 1, + cyclic_sound = { + begin_sound = { + { + filename = "__base__/sound/fight/flamethrower-start.ogg", + volume = 0.7 + } + }, + end_sound = { + { + filename = "__base__/sound/fight/flamethrower-end.ogg", + volume = 0.7 + } + }, + middle_sound = { + { + filename = "__base__/sound/fight/flamethrower-mid.ogg", + volume = 0.7 + } + } + }, + gun_barrel_length = 0.8, + gun_center_shift = { + 0, + -1 + }, + min_range = 3, + movement_slow_down_factor = 0.1, + range = 20, + type = "stream" + }, + }, + { + type = "ammo", + name = data_util.mod_prefix .. "cryogun-ammo", + ammo_type = + { + category = "cryogun", + target_type = "position", + clamp_position = true, + action = { + action_delivery = { + stream = "cryogun-stream", + type = "stream" + }, + type = "direct" + }, + }, + icon = "__space-exploration-graphics__/graphics/icons/cryogun-ammo.png", + icon_size = 64, + magazine_size = 100, + order = "z-t[cryogun]", + stack_size = 100, + subgroup = "ammo", + }, + { + type = "sticker", + name = "cryogun-sticker", + --icon = "__base__/graphics/icons/slowdown-sticker.png", + flags = {}, + duration_in_ticks = 30 * 60, + target_movement_modifier = 0.25 + }, + { + type = "stream", + name = "cryogun-stream", + action = { + { + action_delivery = { + target_effects = { + { + sticker = "cryogun-sticker", + type = "create-sticker" + }, + { + apply_damage_to_trees = false, + damage = { + amount = 2, + type = "cold" + }, + type = "damage" + }, + }, + type = "instant" + }, + radius = 4, + type = "area" + }, + { + action_delivery = { + target_effects = { + { + type = "create-entity", + entity_name = data_util.mod_prefix .. "cryogun-trigger", + trigger_created_entity = true, + show_in_tooltip = false, + }, + }, + type = "instant" + }, + type = "direct" + } + --[[{ + action_delivery = { + target_effects = { + { + entity_name = "fire-flame", + initial_ground_flame_count = 2, + show_in_tooltip = true, + type = "create-fire" + } + }, + type = "instant" + }, + type = "direct" + }]] + }, + flags = { + "not-on-map" + }, + ground_light = { + intensity = 0.8, + size = 3.2, + color = {r = 0.5, g = 0.5, b = 1} + }, + particle = { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/cryostream-explosion.png", + frame_count = 32, + height = 64, + line_length = 8, + priority = "extra-high", + scale = 0.8, + width = 64 + }, + particle_buffer_size = 65, + particle_end_alpha = 1, + particle_fade_out_threshold = 0.9, + particle_horizontal_speed = 0.5, + particle_horizontal_speed_deviation = 0.0035, + particle_loop_exit_threshold = 0.25, + particle_loop_frame_count = 3, + particle_spawn_interval = 2, + particle_spawn_timeout = 2, + particle_start_alpha = 0.5, + particle_start_scale = 0.2, + particle_vertical_acceleration = 0.003, + shadow = { + filename = "__base__/graphics/entity/acid-projectile/projectile-shadow.png", + frame_count = 33, + height = 16, + line_length = 5, + priority = "high", + scale = 0.5, + shift = { + -0.045, + 0.1975 + }, + width = 28 + }, + smoke_sources = { + { + frequency = 0.05, + name = "soft-fire-smoke", + position = { + 0, + 0 + }, + starting_frame_deviation = 60 + } + }, + spine_animation = { + animation_speed = 2, + axially_symmetrical = false, + blend_mode = "additive-soft", + direction_count = 1, + filename = "__space-exploration-graphics__/graphics/entity/cryostream/cryostream-spine.png", + frame_count = 32, + height = 18, + line_length = 4, + scale = 0.75, + shift = { + 0, + 0 + }, + width = 32 + }, + stream_light = { + intensity = 1, + size = 3.2, + color = {r = 0.5, g = 0.5, b = 1} + }, + }, + { + type = "explosion", + name = data_util.mod_prefix .. "cryogun-trigger", + animations = { + { + direction_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + frame_count = 1, + height = 1, + line_length = 1, + width = 1 + } + }, + flags = { + "not-on-map", "placeable-off-grid" + }, + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "cryogun-ice-spacer", + flags = {"placeable-neutral", "placeable-off-grid"}, + icon = "__space-exploration-graphics__/graphics/icons/cryogun-ice.png", + icon_size = 64, + icon_mipmaps = 1, + order = "b-z", + collision_box = {{-0.49, -0.49}, {0.49, 0.49}}, + collision_mask = {"player-layer", "train-layer"}, + selection_box = {{-0.49, -0.49}, {0.49, 0.49}}, + selectable_in_game = false, + map_color = {r = 0.8, g = 0.9, b = 1, a = 0.5}, + picture = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + } + }, + { + type = "simple-entity", + name = data_util.mod_prefix .. "cryogun-ice", + icon = "__space-exploration-graphics__/graphics/icons/cryogun-ice.png", + icon_size = 64, + icon_mipmaps = 1, + subgroup = "grass", + collision_box = {{-1.1,-1.1},{1.1,1.1}}, + collision_mask = {"player-layer", "train-layer"}, + selection_box = {{-1.1,-1.1},{1.1,1.1}}, + count_as_rock_for_filtered_deconstruction = true, + damaged_trigger_effect = { + entity_name = "rock-damaged-explosion", + offset_deviation = { + { -0.5, -0.5 }, + { 0.5, 0.5 } + }, + offsets = { { 0, 1 } }, + type = "create-entity" + }, + flags = {"placeable-neutral", "placeable-off-grid"}, + map_color = {r = 0.8, g = 0.9, b = 1, a = 0.5}, + icon = "__space-exploration-graphics__/graphics/icons/cryogun-ice.png", + icon_mipmaps = 1, + icon_size = 64, + loot = { + { + item = data_util.mod_prefix .. "water-ice", + } + }, + max_health = 500, + resistances = { + { + type = "cold", + percent = 100 + }, + { + type = "poison", + percent = 100 + }, + { + type = "fire", + percent = -100 + }, + }, + minable = { + mining_particle = "stone-particle", + mining_time = 0.1, + results = { + { + amount_max = 1, + amount_min = 1, + name = data_util.mod_prefix .. "water-ice", + }, + } + }, + mined_sound = { + filename = "__base__/sound/deconstruct-bricks.ogg" + }, + order = "b-z", + pictures = { + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-01.png", + height = 179, + scale = 0.5, + shift = { + 0.25, + 0.0625 + }, + width = 201 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-02.png", + height = 171, + scale = 0.5, + shift = { + 0.429688, + 0.046875 + }, + width = 233 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-03.png", + height = 192, + scale = 0.5, + shift = { + 0.398438, + 0.03125 + }, + width = 240 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-04.png", + height = 175, + scale = 0.5, + shift = { + 0.148438, + 0.132812 + }, + width = 219 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-05.png", + height = 208, + scale = 0.5, + shift = { + 0.3125, + 0.0625 + }, + width = 240 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-06.png", + height = 190, + scale = 0.5, + shift = { + 0.1875, + 0.046875 + }, + width = 243 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-07.png", + height = 185, + scale = 0.5, + shift = { + 0.398438, + 0.0546875 + }, + width = 249 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-08.png", + height = 163, + scale = 0.5, + shift = { + 0.34375, + 0.0390625 + }, + width = 273 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-09.png", + height = 175, + scale = 0.5, + shift = { + 0.273438, + 0.0234375 + }, + width = 275 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-10.png", + height = 215, + scale = 0.5, + shift = { + 0.195312, + 0.0390625 + }, + width = 241 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-11.png", + height = 181, + scale = 0.5, + shift = { + 0.523438, + 0.03125 + }, + width = 318 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-12.png", + height = 224, + scale = 0.5, + shift = { + 0.0546875, + 0.0234375 + }, + width = 217 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-13.png", + height = 228, + scale = 0.5, + shift = { + 0.226562, + 0.046875 + }, + width = 332 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-14.png", + height = 243, + scale = 0.5, + shift = { + 0.195312, + 0.0390625 + }, + width = 290 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-15.png", + height = 225, + scale = 0.5, + shift = { + 0.609375, + 0.0234375 + }, + width = 349 + }, + { + filename = "__space-exploration-graphics__/graphics/entity/cryostream/ice/ice-16.png", + height = 250, + scale = 0.5, + shift = { + 0.132812, + 0.03125 + }, + width = 287 + } + }, + render_layer = "object", + vehicle_impact_sound = { + filename = "__base__/sound/car-stone-impact.ogg", + volume = 0.5 + } + } +}) + +for _, tech in pairs(data.raw.technology) do + if tech.effects then + for _, effect in pairs(tech.effects) do + if (effect.type == "ammo-damage" or effect.type == "gun-speed") and effect.ammo_category == "laser-turret" then + local c = table.deepcopy(effect) + c.ammo_category = "cryogun" + table.insert(tech.effects, c) + end + end + end +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-plague.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-plague.lua new file mode 100644 index 0000000..9a4a3d8 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-plague.lua @@ -0,0 +1,323 @@ +local data_util = require("data_util") + +-- concept: fire a plague rocket. +-- it explodes in a cloud, cloud applies disease stickers to biters. +-- initial impact fires many plague projectiles in all directions. +-- impact with biter applies sticker and a new set of plague projectiles. +-- each time a projectile is spawned deal small damage in radius to biter bases. +-- sticker slows and deals damage. biters are only damaged by the sticker. + +local wave_radius = 256 + +data:extend({ + { + type = "ammo", + name = data_util.mod_prefix .. "plague-bomb", + ammo_type = { + action = { + action_delivery = { + projectile = data_util.mod_prefix .. "plague-rocket", + source_effects = { + entity_name = "explosion-hit", + type = "create-entity" + }, + starting_speed = 0.05, + type = "projectile", + show_in_tooltip = false, + }, + type = "direct" + }, + category = "rocket", + cooldown_modifier = 3, + range_modifier = 3, + target_type = "position" + }, + icon = "__space-exploration-graphics__/graphics/icons/plague-bomb.png", + icon_size = 64, + icon_mipmaps = 1, + order = "d[rocket-launcher]-d[plague-bomb]", + stack_size = 10, + subgroup = "ammo", + }, + + + { + type = "projectile", + name = data_util.mod_prefix .. "plague-rocket", + acceleration = 0.005, + action = { + action_delivery = { + target_effects = { + { + entity_name = "explosion", + type = "create-entity" + }, + { + damage = { + amount = 50, + type = "poison" + }, + type = "damage" + }, + { + check_buildability = true, + entity_name = "small-scorchmark", + type = "create-entity" + }, + { + entity_name = data_util.mod_prefix .. "plague-cloud", + show_in_tooltip = false, + trigger_created_entity = true, + type = "create-entity" + }, + { + action = { + action_delivery = { + projectile = data_util.mod_prefix .. "plague-wave", + starting_speed = 0.05, + starting_speed_deviation = 0.049, + show_in_tooltip = false, + type = "projectile" + }, + radius = wave_radius, + repeat_count = 64, + target_entities = false, + trigger_from_target = true, + show_in_tooltip = false, + type = "area" + }, + show_in_tooltip = false, + type = "nested-result" + } + }, + type = "instant" + }, + type = "direct" + }, + animation = { + filename = "__base__/graphics/entity/rocket/rocket.png", + frame_count = 8, + height = 35, + line_length = 8, + priority = "high", + shift = { + 0, + 0 + }, + width = 9 + }, + flags = { + "not-on-map" + }, + light = { + intensity = 0.8, + size = 15 + }, + shadow = { + filename = "__base__/graphics/entity/rocket/rocket-shadow.png", + frame_count = 1, + height = 24, + priority = "high", + shift = { + 0, + 0 + }, + width = 7 + }, + smoke = { + { + deviation = { + 0.15, + 0.15 + }, + frequency = 1, + name = "smoke-fast", + position = { + 0, + -1 + }, + slow_down_factor = 1, + starting_frame = 3, + starting_frame_deviation = 5, + starting_frame_speed = 0, + starting_frame_speed_deviation = 5 + } + }, + }, + + + { + type = "projectile", + name = data_util.mod_prefix .. "plague-wave", + acceleration = -0.000001, + action = { + { + action_delivery = { + target_effects = { + { + entity_name = data_util.mod_prefix .. "plague-cloud", + show_in_tooltip = false, + trigger_created_entity = true, + type = "create-entity" + }, + }, + type = "instant" + }, + radius = 3, + entity_flags = { "breaths-air" }, + type = "area" + }, + }, + animation = { + animation_speed = 0.5, + filename = "__space-exploration-graphics__/graphics/entity/cloud/plague-cloud-faint.png", + run_mode = "backward", + flags = { + "compressed" + }, + frame_count = 45, + height = 128, + line_length = 7, + priority = "low", + scale = 3, + width = 128 + }, + flags = { + "not-on-map" + }, + shadow = { + filename = "__core__/graphics/empty.png", + frame_count = 1, + height = 1, + priority = "high", + width = 1 + }, + }, + + + { + type = "smoke-with-trigger", + name = data_util.mod_prefix .. "plague-cloud", + action = { + { + type = "direct", + action_delivery = { + type = "instant", + target_effects = { + type = "nested-result", + action = { + radius = 6, + type = "area", + action_delivery = { + type = "instant", + target_effects = { + { + type = "damage", + damage = { + amount = 20, + type = "poison" + }, + }, + { + type = "create-sticker", + sticker = data_util.mod_prefix .. "plague-sticker", + } + }, + }, + }, + }, + }, + }, + { + type = "area", + radius = wave_radius, + repeat_count = 3, + target_entities = false, + trigger_from_target = true, + action_delivery = { + direction_deviation = 0.5, + projectile = data_util.mod_prefix .. "plague-wave", + starting_speed = 0.05, + starting_speed_deviation = 0.049, + type = "projectile" + }, + } + }, + action_cooldown = 200, + affected_by_wind = true, + animation = { + animation_speed = 0.5, + filename = "__space-exploration-graphics__/graphics/entity/cloud/plague-cloud-faint.png", + run_mode = "backward", + flags = { + "compressed" + }, + frame_count = 45, + height = 128, + line_length = 7, + priority = "low", + scale = 3, + width = 128 + }, + cyclic = true, + duration = 30 * 60, + fade_away_duration = 120, + flags = { + "not-on-map" + }, + show_when_smoke_off = true, + spread_duration = 10, + }, + + + { + type = "sticker", + name = data_util.mod_prefix .. "plague-sticker", + animation = { + animation_speed = 0.4, + filename = "__base__/graphics/entity/slowdown-sticker/slowdown-sticker.png", + frame_count = 13, + height = 11, + priority = "extra-high", + width = 11 + }, + damage_per_tick = { + amount = 2, + type = "poison" + }, + duration_in_ticks = 60, + flags = { + "not-on-map" + }, + target_movement_modifier = 0.75, + --fire_spread_cooldown = 30, + --fire_spread_radius = 1, + --spread_fire_entity = "fire-flame-on-tree", + }, +}) + +if data_util.dot_string_greater_than(mods["base"], "0.18.35", false) then + data.raw.sticker[data_util.mod_prefix .. "plague-sticker"].animation = { + filename = "__base__/graphics/entity/slowdown-sticker/slowdown-sticker.png", + priority = "extra-high", + line_length = 5, + width = 22, + height = 24, + frame_count = 50, + animation_speed = 0.5, + tint = {r = 0.663, g = 1.000, b = 0.000, a = 0.694}, + shift = util.by_pixel (2,-1), + hr_version = + { + filename = "__base__/graphics/entity/slowdown-sticker/hr-slowdown-sticker.png", + line_length = 5, + width = 42, + height = 48, + frame_count = 50, + animation_speed = 0.5, + tint = {r = 0.663, g = 1.000, b = 0.000, a = 0.694}, + shift = util.by_pixel(2, -0.5), + scale = 0.5 + } + } +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-railgun.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-railgun.lua new file mode 100644 index 0000000..a885461 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-railgun.lua @@ -0,0 +1,104 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "ammo-category", + name = "railgun", + bonus_gui_order = "k-c-b", + }, + { + type = "ammo", + name = data_util.mod_prefix .. "railgun-ammo", + icon = "__space-exploration-graphics__/graphics/icons/railgun-ammo.png", + icon_size = 64, icon_mipmaps = 4, + ammo_type = + { + category = "railgun", + target_type = "direction", + clamp_position = true, + action = + { + type = "line", + range = 100, + width = 0.5, + + range_effects = + { + type = "create-explosion", + entity_name = data_util.mod_prefix .. "railgun-beam" + }, + action_delivery = + { + type = "instant", + target_effects = + { + type = "damage", + damage = { amount = 250, type="physical"} + } + } + } + }, + magazine_size = 4, + subgroup = "ammo", + order = "c[railgun]", + stack_size = 200 + }, + { + type = "gun", + name = data_util.mod_prefix .. "railgun", + icon = "__space-exploration-graphics__/graphics/icons/railgun.png", + icon_size = 64, icon_mipmaps = 4, + subgroup = "gun", + order = "c[railgun]", + attack_parameters = + { + type = "projectile", + ammo_category = "railgun", + cooldown = 150, + movement_slow_down_factor = 0.4, + projectile_creation_distance = 0.6, + range = 100, + sound = + { + { + filename = "__space-exploration__/sound/railgun.ogg", + volume = 0.5 + } + } + }, + stack_size = 5 + }, + { + type = "explosion", + name = data_util.mod_prefix .. "railgun-beam", + localised_name = {"entity-name."..data_util.mod_prefix .. "railgun-beam"}, + flags = {"not-on-map"}, + subgroup = "explosions", + rotate = true, + beam = true, + animations = { + { + filename = "__space-exploration-graphics__/graphics/entity/railgun/beam.png", + priority = "extra-high", + width = 187, + height = 1, + frame_count = 6 + } + }, + light = {intensity = 1, size = 10, color = {r = 1.0, g = 0.8, b = 0.5}}, + smoke = "smoke-fast", + smoke_count = 2, + smoke_slow_down_factor = 1 + }, +}) +for _, tech in pairs(data.raw.technology) do + if tech.effects then + for _, effect in pairs(tech.effects) do + if (effect.type == "ammo-damage" or effect.type == "gun-speed") and effect.ammo_category == "bullet" then + local c = table.deepcopy(effect) + c.ammo_category = "railgun" + table.insert(tech.effects, c) + end + end + end +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-tesla.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-tesla.lua new file mode 100644 index 0000000..ac38213 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/item/weapon-tesla.lua @@ -0,0 +1,315 @@ +local data_util = require("data_util") + +data.raw["utility-constants"].default.bonus_gui_ordering["tesla"] = "k-c" +data:extend({ + { + type = "ammo-category", + name = "tesla", + bonus_gui_order = "k-c", + }, + { + type = "gun", + name = data_util.mod_prefix .. "tesla-gun", + attack_parameters = { + ammo_category = "tesla", + cooldown = 10, + movement_slow_down_factor = 0.2, + damage_modifier = 1, + range = 10, + type = "projectile", + sound = { + { + filename = "__space-exploration__/sound/tesla-gunshot.ogg", + volume = 0.9 + }, + }, + }, + icon = "__space-exploration-graphics__/graphics/icons/tesla-gun.png", + icon_size = 64, + order = "z-t[tesla]", + stack_size = 5, + subgroup = "gun", + }, + { + type = "ammo", + name = data_util.mod_prefix .. "tesla-ammo", + ammo_type = + { + category = "tesla", + target_type = "direction", + action = { + { + type = "direct", + action_delivery = { + type = "instant", + target_effects = { + { + type = "create-entity", + entity_name = data_util.mod_prefix .. "tesla-gun-trigger", + trigger_created_entity = true, + show_in_tooltip = false, + }, + { + action = { + action_delivery = { + target_effects = { + { + damage = { + amount = 0, + type = "electric" + }, + type = "damage" + }, + }, + type = "instant" + }, + radius = 32, + force = "enemy", + type = "area" + }, + type = "nested-result" + }, + } + } + }, + } + }, + icon = "__space-exploration-graphics__/graphics/icons/tesla-ammo.png", + icon_size = 64, + magazine_size = 10, + order = "z-t[tesla]", + stack_size = 200, + subgroup = "ammo", + sound = { + { + filename = "__space-exploration__/sound/tesla-gunshot.ogg", + volume = 0.9 + }, + }, + }, + { + type = "explosion", + name = data_util.mod_prefix .. "tesla-gun-trigger", + animations = { + { + direction_count = 1, + filename = "__space-exploration-graphics__/graphics/blank.png", + frame_count = 1, + height = 1, + line_length = 1, + width = 1 + } + }, + flags = { + "not-on-map", "placeable-off-grid" + }, + }, + { + type = "explosion", + name = data_util.mod_prefix .. "tesla-gun-light", + animations = { + { + blend_mode = "additive", + animation_speed = 1.5, + direction_count = 1, + filename = "__base__/graphics/entity/beam/tileable-beam-END.png", + frame_count = 16, + height = 54, + hr_version = { + blend_mode = "additive", + animation_speed = 1.5, + direction_count = 1, + filename = "__base__/graphics/entity/beam/hr-tileable-beam-END.png", + frame_count = 16, + height = 93, + line_length = 4, + scale = 0.5, + shift = { 0, 1 }, + width = 91 + }, + line_length = 4, + shift = { 0, 1 }, + width = 49 + } + }, + flags = { + "not-on-map", "placeable-off-grid" + }, + light = { + color = { + b = 1, + g = 1, + r = 0.7 + }, + intensity = 0.1, + size = 10 + }, + smoke = "smoke-fast", + smoke_count = 1, + smoke_slow_down_factor = 1, + }, + { + type = "beam", + name = data_util.mod_prefix .. "tesla-gun-beam", + action = { + action_delivery = { + target_effects = { + { + type = "create-entity", + entity_name = data_util.mod_prefix .. "tesla-gun-light", + }, + { + damage = { + amount = 20, + type = "electric" + }, + type = "damage" + }, + }, + type = "instant" + }, + type = "direct" + }, + body = { + { + blend_mode = "additive", + filename = "__base__/graphics/entity/beam/beam-body-1.png", + frame_count = 16, + height = 39, + line_length = 16, + width = 45 + }, + { + blend_mode = "additive", + filename = "__base__/graphics/entity/beam/beam-body-2.png", + frame_count = 16, + height = 39, + line_length = 16, + width = 45 + }, + { + blend_mode = "additive", + filename = "__base__/graphics/entity/beam/beam-body-3.png", + frame_count = 16, + height = 39, + line_length = 16, + width = 45 + }, + { + blend_mode = "additive", + filename = "__base__/graphics/entity/beam/beam-body-4.png", + frame_count = 16, + height = 39, + line_length = 16, + width = 45 + }, + { + blend_mode = "additive", + filename = "__base__/graphics/entity/beam/beam-body-5.png", + frame_count = 16, + height = 39, + line_length = 16, + width = 45 + }, + { + blend_mode = "additive", + filename = "__base__/graphics/entity/beam/beam-body-6.png", + frame_count = 16, + height = 39, + line_length = 16, + width = 45 + } + }, + damage_interval = 20, + ending = { + direction_count = 1, + filename = "__base__/graphics/entity/beam/tileable-beam-END.png", + frame_count = 16, + height = 54, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/beam/hr-tileable-beam-END.png", + frame_count = 16, + height = 93, + line_length = 4, + scale = 0.5, + shift = { + -0.078125, + -0.046875 + }, + width = 91 + }, + line_length = 4, + shift = { + -0.046875, + 0 + }, + width = 49 + }, + flags = { + "not-on-map", "placeable-off-grid" + }, + head = { + animation_speed = 0.5, + blend_mode = "additive", + filename = "__base__/graphics/entity/beam/beam-head.png", + frame_count = 16, + height = 39, + line_length = 16, + width = 45 + }, + random_target_offset = true, + start = { + direction_count = 1, + filename = "__base__/graphics/entity/beam/tileable-beam-START.png", + frame_count = 16, + height = 40, + hr_version = { + direction_count = 1, + filename = "__base__/graphics/entity/beam/hr-tileable-beam-START.png", + frame_count = 16, + height = 66, + line_length = 4, + scale = 0.5, + shift = { + 0.53125, + 0 + }, + width = 94 + }, + line_length = 4, + shift = { + -0.03125, + 0 + }, + width = 52 + }, + tail = { + blend_mode = "additive", + filename = "__base__/graphics/entity/beam/beam-tail.png", + frame_count = 16, + height = 39, + line_length = 16, + width = 45 + }, + target_offset_y = -0.3, + width = 0.5, + working_sound = { + { + filename = "__base__/sound/fight/electric-beam.ogg", + volume = 0.7 + } + } + }, +}) +for _, tech in pairs(data.raw.technology) do + if tech.effects then + for _, effect in pairs(tech.effects) do + if (effect.type == "ammo-damage" or effect.type == "gun-speed") and effect.ammo_category == "laser" then + local c = table.deepcopy(effect) + c.ammo_category = "tesla" + table.insert(tech.effects, c) + end + end + end +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/astrometrics-laboratory.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/astrometrics-laboratory.lua new file mode 100644 index 0000000..42ed924 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/astrometrics-laboratory.lua @@ -0,0 +1,98 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe +local obs_types = data_util.obs_types + +make_recipe({ + name = data_util.mod_prefix .. "astrometric-analysis-multispectral-1", + ingredients = { + { data_util.mod_prefix .. "visible-observation-data", 1 }, + { data_util.mod_prefix .. "uv-observation-data", 1 }, + { data_util.mod_prefix .. "infrared-observation-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { data_util.mod_prefix .. "astrometric-data", 3 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 3, + icon = "__space-exploration-graphics__/graphics/icons/data/astrometric.png", + icon_size = 64, + category = "space-astrometrics", + subgroup = "data-astronomic", + enabled = false, + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "astrometric-analysis-multispectral-2", + ingredients = { + { data_util.mod_prefix .. "empty-data", 5 }, + { data_util.mod_prefix .. "visible-observation-data", 1 }, + { data_util.mod_prefix .. "uv-observation-data", 1 }, + { data_util.mod_prefix .. "infrared-observation-data", 1 }, + { data_util.mod_prefix .. "microwave-observation-data", 1 }, + { data_util.mod_prefix .. "xray-observation-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { data_util.mod_prefix .. "astrometric-data", 10 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 10, + icon = "__space-exploration-graphics__/graphics/icons/data/astrometric.png", + icon_size = 64, + category = "space-astrometrics", + subgroup = "data-astronomic", + enabled = false, + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "astrometric-analysis-multispectral-3", + ingredients = { + { data_util.mod_prefix .. "empty-data", 13 }, + { data_util.mod_prefix .. "visible-observation-data", 1 }, + { data_util.mod_prefix .. "infrared-observation-data", 1 }, + { data_util.mod_prefix .. "uv-observation-data", 1 }, + { data_util.mod_prefix .. "microwave-observation-data", 1 }, + { data_util.mod_prefix .. "xray-observation-data", 1 }, + { data_util.mod_prefix .. "radio-observation-data", 1 }, + { data_util.mod_prefix .. "gammaray-observation-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { data_util.mod_prefix .. "astrometric-data", 20 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + icon = "__space-exploration-graphics__/graphics/icons/data/astrometric.png", + icon_size = 64, + category = "space-astrometrics", + subgroup = "data-astronomic", + enabled = false, + always_show_made_in = true, +}) + +local i = 0 +for _, type in pairs(obs_types) do + i = i + 1 + make_recipe({ + name = data_util.mod_prefix .. type[1] .. "-observation-data", + ingredients = { + { data_util.mod_prefix .. "observation-frame-" .. type[1], type[2] }, + { data_util.mod_prefix .. "empty-data", 1 }, + }, + results = { + { name = data_util.mod_prefix .. type[1] .. "-observation-data", amount_min = 1, amount_max = 1, probability = type[3] }, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.99 - type[3] }, + { name = data_util.mod_prefix .. "scrap", amount_min = 1, amount_max = 1, probability = 0.01 * type[2] }, + }, + energy_required = math.floor(60 * type[3]) / 10, + main_product = data_util.mod_prefix .. type[1] .. "-observation-data", + icon = "__space-exploration-graphics__/graphics/icons/data/"..type[1].."-observation.png", + icon_size = 64, icon_mipmaps = 1, + category = "space-astrometrics", + order = "od-a"..i, + enabled = false, + always_show_made_in = true, + allow_as_intermediate = false, + }) +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/biochemical-laboratory.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/biochemical-laboratory.lua new file mode 100644 index 0000000..6e3cdad --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/biochemical-laboratory.lua @@ -0,0 +1,296 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "bio-sludge-from-fish", + ingredients = { + { name = "raw-fish", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 7 }, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 10 }, + }, + icons = { + { icon = data.raw.fluid[data_util.mod_prefix .. "bio-sludge"].icon, scale = 1, icon_size = 64 }, + { icon = data.raw.capsule["raw-fish"].icon, scale = 0.75/2, icon_size = 64 }, + }, + energy_required = 4, + localised_name = {"recipe-name."..data_util.mod_prefix .. "bio-sludge-from-fish"}, + category = "space-biochemical", + enabled = false, + subgroup = "space-bioculture", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "bio-sludge-from-wood", + ingredients = { + { name = "wood", amount = 10}, + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 10 }, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 20 }, + }, + icons = { + { icon = data.raw.fluid[data_util.mod_prefix .. "bio-sludge"].icon, scale = 1, icon_size = 64 }, + { icon = data.raw.item["wood"].icon, scale = 0.75/2, icon_size = 64 }, + }, + energy_required = 4, + localised_name = {"recipe-name."..data_util.mod_prefix .. "bio-sludge-from-wood"}, + category = "space-biochemical", + enabled = false, + subgroup = "space-bioculture", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "bio-sludge-from-vitamelange", + ingredients = { + { name = data_util.mod_prefix .. "vitalic-acid", amount = 1}, + { name = data_util.mod_prefix .. "vitamelange-nugget", amount = 40}, + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 10 }, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 10 }, + }, + icons = { + { icon = data.raw.fluid[data_util.mod_prefix .. "bio-sludge"].icon, scale = 1, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "vitamelange-nugget"].icon, scale = 0.75/2, icon_size = 64 }, + }, + energy_required = 4, + localised_name = {"recipe-name."..data_util.mod_prefix .. "bio-sludge-from-vitamelange"}, + category = "space-biochemical", + enabled = false, + subgroup = "space-bioculture", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "bio-sludge", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 10 }, + { name = data_util.mod_prefix .. "specimen", amount = 1}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 30 }, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1 }, + }, + icons = { + { icon = data.raw.fluid[data_util.mod_prefix .. "bio-sludge"].icon, scale = 1, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "specimen"].icon, scale = 0.75, icon_size = 64 }, + }, + energy_required = 4, + main_product = data_util.mod_prefix .. "bio-sludge", + localised_name = {"recipe-name."..data_util.mod_prefix .. "bio-sludge"}, + category = "space-biochemical", + enabled = false, + subgroup = "space-bioculture", + allow_as_intermediate = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "bio-sludge-crude-oil", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 5 }, + { name = data_util.mod_prefix .. "experimental-specimen", amount = 1}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 20 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 5 }, + { type = "fluid", name = "crude-oil", amount = 100 }, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1 }, + }, + icons = data_util.add_icons_to_stack(nil, { + {icon = data.raw.fluid[data_util.mod_prefix .. "bio-sludge"]}, + {icon = data.raw.fluid["crude-oil"], properties = {scale = 0.75}}, + }), + energy_required = 10, + category = "space-biochemical", + enabled = false, + subgroup = "space-bioculture", + allow_as_intermediate = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "biochemical-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { name = data_util.mod_prefix .. "specimen", amount = 1}, + { name = data_util.mod_prefix .. "vitamelange-spice", amount = 1}, + { type="fluid", name = data_util.mod_prefix .. "chemical-gel", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "biochemical-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 10 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 10 }, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "biochemical-data", + category = "space-biochemical", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "cryogenics-data", + ingredients = { + { name = data_util.mod_prefix .. "significant-specimen", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "cryogenics-data", amount_min = 1, amount_max = 1, probability = 0.9}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.09}, + { type="fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 10}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "cryogenics-data", + category = "space-biochemical", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "biochemical-resistance-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { name = data_util.mod_prefix .. "experimental-specimen", amount = 1}, + { name = data_util.mod_prefix .. "vitalic-acid", amount = 1}, + { type="fluid", name = data_util.mod_prefix .. "chemical-gel", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "biochemical-resistance-data", amount_min = 1, amount_max = 1, probability = 0.9}, + { name = data_util.mod_prefix .. "experimental-specimen", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.09}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 5 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 5 }, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "biochemical-resistance-data", + category = "space-biochemical", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "nutrient-gel", + ingredients = { + { name = "coal", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "chemical-gel", amount = 4}, + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 20}, + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 25}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "nutrient-gel", amount = 50}, + }, + energy_required = 5, + category = "space-biochemical", + subgroup = "space-bioculture", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "nutrient-gel-methane", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "methane-gas", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "chemical-gel", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 10}, + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 20}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "nutrient-gel", amount = 50}, + }, + energy_required = 10, + category = "space-biochemical", + subgroup = "space-bioculture", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "nutrient-vat", + ingredients = { + { name = "iron-plate", amount = 1}, + { name = "glass", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "nutrient-gel", amount = 50}, + }, + results = { + { name = data_util.mod_prefix .. "nutrient-vat", amount = 5}, + }, + energy_required = 10, + category = "space-biochemical", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "plague-bomb", + ingredients = { + { name = data_util.mod_prefix .. "significant-specimen", amount = 100}, + { name = data_util.mod_prefix .. "biological-catalogue-4", amount = 10}, + { type="fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 1000}, + { type="fluid", name = data_util.mod_prefix .. "chemical-gel", amount = 1000}, + }, + results = { + { name = data_util.mod_prefix .. "plague-bomb", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 2000 }, + }, + energy_required = 60, + main_product = data_util.mod_prefix .. "plague-bomb", + category = "space-biochemical", + enabled = false, + always_show_made_in = true, +}) + + +make_recipe({ + name = data_util.mod_prefix .. "melting-water-ice", + ingredients = { + { name = data_util.mod_prefix .. "water-ice", amount = 1}, + }, + results = { + { type = "fluid", name = "water", amount = 100}, + }, + energy_required = 0.25, + subgroup = "space-fluids", + category = "chemistry", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "melting-methane-ice", + ingredients = { + { name = data_util.mod_prefix .. "methane-ice", amount = 1}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "methane-gas", amount = 10}, + }, + energy_required = 0.25, + subgroup = "space-fluids", + category = "chemistry", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "corrosion-resistance-data", + ingredients = { + { name = "glass", amount = 2}, + { name = data_util.mod_prefix .. "material-testing-pack", amount = 2}, + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "chemical-gel", amount = 5}, + }, + results = { + { name = data_util.mod_prefix .. "corrosion-resistance-data", amount = 1}, + { name = data_util.mod_prefix .. "iridium-plate", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "scrap", amount = 6}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 5}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "corrosion-resistance-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/cargo-rocket.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/cargo-rocket.lua new file mode 100644 index 0000000..13a4cbd --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/cargo-rocket.lua @@ -0,0 +1,127 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "space-capsule", + result = data_util.mod_prefix .. "space-capsule", + energy_required = 60, + ingredients = { + { data_util.mod_prefix .. "heat-shielding", 100 }, + { "rocket-control-unit", 100 }, + { "low-density-structure", 100 }, + { "rocket-fuel", 100 }, + { "solar-panel", 50 }, + { "accumulator", 50 }, + { "glass", 50 }, + }, + requester_paste_multiplier = 2, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "cargo-rocket-section", + result = data_util.mod_prefix .. "cargo-rocket-section", + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "heat-shielding", 4 }, + { "low-density-structure", 4 }, + { "rocket-control-unit", 4 }, + { data_util.mod_prefix .. "cargo-rocket-cargo-pod", 1 }, + { data_util.mod_prefix .. "cargo-rocket-fuel-tank", 1 } + }, + requester_paste_multiplier = 1, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "cargo-rocket-section-beryllium", + results = { + { data_util.mod_prefix .. "cargo-rocket-section", 2 } + }, + energy_required = 60, + ingredients = { + { data_util.mod_prefix .. "beryllium-plate", 10 }, + { data_util.mod_prefix .. "heat-shielding", 4 }, + { "low-density-structure", 4 }, + { "rocket-control-unit", 4 }, + { data_util.mod_prefix .. "cargo-rocket-cargo-pod", 1 }, + { data_util.mod_prefix .. "cargo-rocket-fuel-tank", 1 } + }, + requester_paste_multiplier = 1, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "cargo-rocket-section-unpack", + results = {{ + type = "item", + name = data_util.mod_prefix .. "cargo-rocket-section", + amount = 5, + catalyst_amount = 5 + }}, + result_count = 5, + energy_required = 5, + ingredients = { + { data_util.mod_prefix .. "cargo-rocket-section-packed", 1 } + }, + requester_paste_multiplier = 1, + enabled = false, + always_show_made_in = true, + always_show_products = true, + category = "crafting-with-fluid", -- no hand crafting + localised_name = {"recipe-name."..data_util.mod_prefix .. "cargo-rocket-section-unpack"}, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "cargo-rocket-section-pack", + result = data_util.mod_prefix .. "cargo-rocket-section-packed", + energy_required = 5, + ingredients = {{ + type = "item", + name = data_util.mod_prefix .. "cargo-rocket-section", + amount = 5, + catalyst_amount = 5 + }}, + requester_paste_multiplier = 1, + enabled = false, + always_show_made_in = true, + always_show_products = true, + category = "crafting-with-fluid", -- no hand crafting + localised_name = {"recipe-name."..data_util.mod_prefix .. "cargo-rocket-section-pack"}, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "cargo-rocket-cargo-pod", + result = data_util.mod_prefix .. "cargo-rocket-cargo-pod", + energy_required = 30, + ingredients = { + { "steel-plate", 6 }, + { "advanced-circuit", 4 }, + { "iron-chest", 4 }, -- Bentham, at least they die in fire + { "fast-inserter", 2}, + }, + requester_paste_multiplier = 2, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "cargo-rocket-fuel-tank", + result = data_util.mod_prefix .. "cargo-rocket-fuel-tank", + energy_required = 30, + ingredients = { + { "advanced-circuit", 2 }, + { "pipe", 2 }, + { "storage-tank", 1 }, + { "pump", 1 }, + }, + requester_paste_multiplier = 2, + enabled = false, + always_show_made_in = true, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/condenser-turbine.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/condenser-turbine.lua new file mode 100644 index 0000000..8f88ae8 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/condenser-turbine.lua @@ -0,0 +1,66 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "condenser-turbine", + ingredients = { + { name = "steam-turbine", amount = 1}, + { name = "storage-tank", amount = 2}, + { name = "electric-engine-unit", amount = 10}, + { name = "low-density-structure", amount = 20}, + { name = "glass", amount = 20}, + }, + results = { + { name = data_util.mod_prefix .. "condenser-turbine", amount = 1}, + }, + energy_required = 5, + category = "crafting", + enabled = false, + always_show_made_in = false, +}) +local steam_temperature_ranges = { + 100, -- Min + 165, -- Vanilla boiler + 200, + 300, + 400, + 415, -- K2 HE + 500, -- HE + 600, + 700, + 800, + 900, + 1000 -- last one is accepted but previous temperature is used internally +} +for i = 1, #steam_temperature_ranges - 1 do + local low = steam_temperature_ranges[i] + local high = steam_temperature_ranges[i+1] + + data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "condenser-turbine-reclaim-water-"..low.."-"..high, + icon = "__space-exploration-graphics__/graphics/icons/fluid/water.png", + icon_size = 64, + order = "a", + subgroup = "spaceship-process", + energy_required = 0.1, + category = "condenser-turbine", + ingredients = + { + {type="fluid", name="steam", amount=100, + minimum_temperature = low - 1, + maximum_temperature = (i == (#steam_temperature_ranges - 1)) and (high + 1) or (high -1)}, + }, + results = { + {type="fluid", name="water", amount=99}, + {type="fluid", name=data_util.mod_prefix .. "decompressing-steam", amount=75, temperature = low}, + }, + hidden = true, + enabled = true, + allow_as_intermediate = false, + always_show_made_in = true, + localised_name = {"recipe-name.se-condenser-turbine-reclaim-water"} + }, + }) +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/core-miner.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/core-miner.lua new file mode 100644 index 0000000..1d09068 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/core-miner.lua @@ -0,0 +1,24 @@ +local data_util = require("data_util") +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "core-miner", + category = "crafting", + enabled = false, + energy_required = 100, + ingredients = { + {"concrete", 400}, + {"electronic-circuit", 200}, + {"steel-plate", 100}, + {"electric-mining-drill", 40}, + }, + results= + { + {name = data_util.mod_prefix .. "core-miner", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/core-miner.png", + icon_size = 64, + order = "zzz-core-miner", + always_show_made_in = true, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/decontamination-facility.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/decontamination-facility.lua new file mode 100644 index 0000000..104400a --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/decontamination-facility.lua @@ -0,0 +1,178 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +data:extend({{ + type = "recipe", + name = data_util.mod_prefix .. "space-water", + enabled = false, + energy_required = 1, + ingredients = { + { type = "fluid", name = "water", amount = 99 }, + { type = "fluid", name = "lubricant", amount = 1 } + }, + energy_required = 1, + results = { { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 10 } }, + allow_as_intermediate = false, + icon_size = 64, + crafting_machine_tint = nil, -- TODO: tint + category = "space-decontamination", + always_show_made_in = true, +}}) + +make_recipe({ + name = data_util.mod_prefix .. "used-lifesupport-canister-cleaning-space", + ingredients = { + { data_util.mod_prefix .. "used-lifesupport-canister", 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 10}, + }, + results = { + { data_util.mod_prefix .. "empty-lifesupport-canister", 1}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 10}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 10}, + }, + energy_required = 10, + localised_name = {"recipe-name."..data_util.mod_prefix .. "used-lifesupport-canister-cleaning-space"}, + main_product = data_util.mod_prefix .. "empty-lifesupport-canister", + allow_as_intermediate = false, + category = "space-decontamination", + icon = "__space-exploration-graphics__/graphics/icons/used-lifesupport-canister.png", + icon_size = 64, icon_mipmaps = 1, + enabled = false, + always_show_made_in = true, +}) + +data:extend({{ + type = "recipe", + name = data_util.mod_prefix .. "bio-sludge-decontamination", + enabled = false, + energy_required = 5, + ingredients = { + { type = "fluid", name = data_util.mod_prefix .."contaminated-bio-sludge", amount = 100 }, + }, + results = { + { name = data_util.mod_prefix .."contaminated-scrap", amount_min = 1, amount_max = 1, probability = 0.01 }, + { type = "fluid", name = data_util.mod_prefix .."bio-sludge", amount = 99 }, + }, + energy_required = 5, + allow_as_intermediate = false, + icon_size = 64, + crafting_machine_tint = nil, -- TODO: tint + category = "space-decontamination", + subgroup = "space-fluids", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "contaminated-bio-sludge"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "contaminated-bio-sludge"].icon_size, scale = 0.5 + }, + { + icon = data.raw.fluid[data_util.mod_prefix .. "bio-sludge"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "bio-sludge"].icon_size, scale = 0.5 + } + ), + always_show_made_in = true, +}}) + +data:extend({{ + type = "recipe", + name = data_util.mod_prefix .. "space-water-decontamination", + enabled = false, + energy_required = 5, + ingredients = { + { type = "fluid", name = data_util.mod_prefix .."contaminated-space-water", amount = 100 }, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .."space-water", amount = 99 }, + { type = "fluid", name = data_util.mod_prefix .."contaminated-bio-sludge", amount = 1 }, + { name = data_util.mod_prefix .."contaminated-scrap", amount_min = 1, amount_max = 1, probability = 0.01 }, + }, + energy_required = 5, + allow_as_intermediate = false, + icon_size = 64, + crafting_machine_tint = nil, -- TODO: tint + category = "space-decontamination", + subgroup = "space-fluids", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "contaminated-space-water"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "contaminated-space-water"].icon_size, scale = 0.5 + }, + { + icon = data.raw.fluid[data_util.mod_prefix .. "space-water"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "space-water"].icon_size, scale = 0.5 + } + ), + always_show_made_in = true, +}}) + +make_recipe({ + name = data_util.mod_prefix .. "data-storage-substrate-cleaned", + ingredients = { + { data_util.mod_prefix .. "data-storage-substrate", 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 5 } + }, + results = { + { data_util.mod_prefix .. "data-storage-substrate-cleaned", 1}, + { name = data_util.mod_prefix .. "scrap", amount_min = 1, amount_max = 1, probability = 0.01 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 5 } + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "data-storage-substrate-cleaned"].icon, scale = 1, icon_size = 64 }, + { icon = data.raw.fluid[ data_util.mod_prefix .. "space-water"].icon, scale = 0.6, icon_size = 64, shift = {0,-6}}, + }, + energy_required = 2.5, + main_product = data_util.mod_prefix .. "data-storage-substrate-cleaned", + category = "space-decontamination", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "data-storage-substrate-cleaned-chemical", + ingredients = { + { data_util.mod_prefix .. "data-storage-substrate", 1}, + { type = "fluid", name = data_util.mod_prefix .. "chemical-gel", amount = 1 } + }, + results = { + { data_util.mod_prefix .. "data-storage-substrate-cleaned", 1}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "data-storage-substrate-cleaned"].icon, scale = 1, icon_size = 64 }, + { icon = data.raw.fluid[ data_util.mod_prefix .. "chemical-gel"].icon, scale = 0.6, icon_size = 64, shift = {0,-6} }, + }, + energy_required = 2.5, + main_product = data_util.mod_prefix .. "data-storage-substrate-cleaned", + category = "space-decontamination", + enabled = false, + always_show_made_in = true, +}) + +-- scrap processing +make_recipe({ + name = data_util.mod_prefix .. "scrap-decontamination", + ingredients = { + { data_util.mod_prefix .. "contaminated-scrap", 20}, + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 2}, + }, + results = { + { name = data_util.mod_prefix .. "scrap", amount = 20}, + { name = "uranium-ore", amount_min = 1, amount_max = 1, probability = 0.001}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 1}, + }, + energy_required = 6, + allow_as_intermediate = false, + category = "space-decontamination", + subgroup = "space-components", + icons = data_util.transition_icons( + { + icon = data.raw.item[data_util.mod_prefix .. "contaminated-scrap"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "contaminated-scrap"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .. "scrap"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "scrap"].icon_size, scale = 0.5 + } + ), + enabled = false, + always_show_made_in = true, +}, false, true) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/electromagnetics-laboratory.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/electromagnetics-laboratory.lua new file mode 100644 index 0000000..a47cae3 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/electromagnetics-laboratory.lua @@ -0,0 +1,259 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "magnetic-canister", + ingredients = { + { data_util.mod_prefix .. "canister", 1}, + { "battery", 1}, + { data_util.mod_prefix .. "superconductive-cable", 1}, + }, + results = { + { data_util.mod_prefix .. "magnetic-canister", 1}, + }, + energy_required = 10, + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "bioelectrics-data", + ingredients = { + { name = data_util.mod_prefix .. "significant-specimen", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "ion-stream", amount = 5}, + }, + results = { + { name = data_util.mod_prefix .. "bioelectrics-data", amount_min = 1, amount_max = 1, probability = 0.9}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.09}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "bioelectrics-data", + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "conductivity-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { name = "copper-plate", amount = 4}, + { name = data_util.mod_prefix .. "holmium-plate", amount = 1}, + { name = "electronic-circuit", amount = 2}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "conductivity-data", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "conductivity-data", + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "superconductivity-data", + ingredients = { + { name = data_util.mod_prefix .. "holmium-cable", amount = 2}, + { name = data_util.mod_prefix .. "cryonite-rod", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "superconductivity-data", amount_min = 1, amount_max = 1, probability = 0.7}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.29}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "superconductivity-data", + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "superconductive-cable", + ingredients = { + { name = data_util.mod_prefix .. "holmium-cable", amount = 2}, + { name = data_util.mod_prefix .. "cryonite-rod", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "superconductive-cable", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 10}, + }, + energy_required = 30, + main_product = data_util.mod_prefix .. "superconductive-cable", + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "forcefield-data", + ingredients = { + { name = data_util.mod_prefix .. "polarisation-data", amount = 1}, + { name = data_util.mod_prefix .. "electromagnetic-field-data", amount = 1}, + { name = data_util.mod_prefix .. "holmium-cable", amount = 4}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "forcefield-data", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "empty-data", amount_min = 1, amount_max = 1, probability = 1}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.49}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "forcefield-data", + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "neural-anomaly-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { name = "processing-unit", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "neural-gel-2", amount = 20}, + }, + results = { + { name = data_util.mod_prefix .. "neural-anomaly-data", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.49}, + { name = "processing-unit", amount_min = 1, amount_max = 1, probability = 0.75}, + { type = "fluid", name = data_util.mod_prefix .. "neural-gel-2", amount = 10}, + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "neural-anomaly-data", + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "electromagnetic-field-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "ion-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "electromagnetic-field-data", amount_min = 1, amount_max = 1, probability = 0.95}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.04}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "electromagnetic-field-data", + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "electrical-shielding-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "ion-stream", amount = 10}, + { name = "plastic-bar", amount = 1 }, + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "electrical-shielding-data", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 5}, + { name = data_util.mod_prefix .. "iridium-plate", amount_min = 1, amount_max = 1, probability = 0.75 }, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "electrical-shielding-data", + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + + +make_recipe({ + name = data_util.mod_prefix .. "naquium-energy-data", + ingredients = { + { name = data_util.mod_prefix .. "naquium-ingot", amount = 4}, + { type = "fluid", name = data_util.mod_prefix .. "ion-stream", amount = 40}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "naquium-energy-data", amount = 1}, + }, + energy_required = 8, + main_product = data_util.mod_prefix .. "naquium-energy-data", + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + + +data_util.make_recipe({ + name = data_util.mod_prefix .. "railgun", + ingredients = { + { "plastic-bar", 10}, + { data_util.mod_prefix .. "heavy-girder", 10}, + { type = "fluid", name = data_util.mod_prefix .. "ion-stream", amount = 10}, + { "copper-cable", 1000}, + }, + results = { + { data_util.mod_prefix .. "railgun", 1}, + }, + energy_required = 30, + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + +data_util.make_recipe({ + name = data_util.mod_prefix .. "railgun-ammo", + ingredients = { + { data_util.mod_prefix .. "heavy-girder", 1}, + { "battery", 10}, + }, + results = { + { data_util.mod_prefix .. "railgun-ammo", 1}, + }, + energy_required = 10, + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) + +data_util.make_recipe({ + name = data_util.mod_prefix .. "tesla-gun", + ingredients = { + { "plastic-bar", 10}, + { data_util.mod_prefix .. "holmium-plate", 10}, + { data_util.mod_prefix .. "holmium-cable", 10}, + { type = "fluid", name = data_util.mod_prefix .. "ion-stream", amount = 10}, + }, + results = { + { data_util.mod_prefix .. "tesla-gun", 1}, + }, + energy_required = 60, + category = "space-electromagnetics", + enabled = false, +}) +data_util.make_recipe({ + name = data_util.mod_prefix .. "tesla-ammo", + ingredients = { + { "battery", 10}, + { data_util.mod_prefix .. "holmium-plate", 1}, + }, + results = { + { data_util.mod_prefix .. "tesla-ammo", 1}, + }, + energy_required = 10, + category = "space-electromagnetics", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/gate.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/gate.lua new file mode 100644 index 0000000..ef72929 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/gate.lua @@ -0,0 +1,44 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +data:extend({ + --[[{ + type = "recipe", + name = data_util.mod_prefix .. "gate-addon", + icon = "__space-exploration-graphics__/graphics/icons/scaffold.png", + icon_size = 64, + ingredients = { + { data_util.mod_prefix .. "space-pipe", 1000}, + { "battery", 1000}, + { data_util.mod_prefix .. "superconductive-cable", 1000}, + }, + results = {}, + energy_required = 1, + category = "fixed-recipe", + subgroup = "ancient", + order = "z", + enabled = true, + always_show_made_in = false, + flags = {"hidden"} + },]]-- + { + type = "recipe", + name = data_util.mod_prefix .. "gate-platform", + icon = "__space-exploration-graphics__/graphics/icons/scaffold.png", + icon_size = 64, + ingredients = { + { data_util.mod_prefix .. "space-pipe", 100}, + { "battery", 100}, + { data_util.mod_prefix .. "superconductive-cable", 100}, + { data_util.mod_prefix .. "naquium-processor", 9}, + }, + results = {}, + energy_required = 1, + category = "fixed-recipe", + subgroup = "ancient", + order = "z", + enabled = true, + always_show_made_in = false, + hidden = true, + } +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/genetics-laboratory.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/genetics-laboratory.lua new file mode 100644 index 0000000..98b4976 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/genetics-laboratory.lua @@ -0,0 +1,111 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "comparative-genetic-data", + ingredients = { + { name = data_util.mod_prefix .. "significant-specimen", amount = 1}, + { name = data_util.mod_prefix .. "specimen", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "comparative-genetic-data", amount = 1}, + { type="fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 20}, + }, + energy_required = 2, + main_product = data_util.mod_prefix .. "comparative-genetic-data", + category = "space-genetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "experimental-bioculture", + ingredients = { + { name = data_util.mod_prefix .. "experimental-genetic-data", amount = 1}, + { name = data_util.mod_prefix .. "nutrient-vat", amount = 1}, + { name = data_util.mod_prefix .. "vitamelange-extract", amount = 1}, + { type="fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "experimental-bioculture", amount = 1}, + { name = data_util.mod_prefix .. "junk-data", amount = 1}, + }, + energy_required = 3, + main_product = data_util.mod_prefix .. "experimental-bioculture", + category = "space-genetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "experimental-genetic-data", + ingredients = { + { name = data_util.mod_prefix .. "genetic-data", amount = 1}, + { name = data_util.mod_prefix .. "biochemical-data", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "experimental-genetic-data", amount = 2}, + }, + energy_required = 3, + main_product = data_util.mod_prefix .. "experimental-genetic-data", + category = "space-genetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "bioculture", + ingredients = { + { name = data_util.mod_prefix .. "genetic-data", amount = 10}, + { name = data_util.mod_prefix .. "nutrient-vat", amount = 10}, + { name = data_util.mod_prefix .. "vitamelange-spice", amount = 5}, + { type="fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 50}, + }, + results = { + { name = data_util.mod_prefix .. "bioculture", amount = 10}, + { name = data_util.mod_prefix .. "genetic-data", amount = 9}, + { name = data_util.mod_prefix .. "junk-data", amount = 1}, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "bioculture", + category = "space-genetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "genetic-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type="fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "genetic-data", amount = 1}, + { type="fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 9}, + }, + energy_required = 1, + main_product = data_util.mod_prefix .. "genetic-data", + category = "space-genetics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "significant-specimen", + ingredients = { + { name = data_util.mod_prefix .. "experimental-specimen", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "neural-gel", amount = 1}, + { name = data_util.mod_prefix .. "vitalic-reagent", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "significant-specimen", amount_min = 1, amount_max = 1, probability = 0.3}, + { name = data_util.mod_prefix .. "experimental-specimen", amount_min = 1, amount_max = 1, probability = 0.6}, + { type="fluid", name = data_util.mod_prefix .. "bio-sludge", amount_min = 1, amount_max = 5, probability = 1}, + }, + energy_required = 1, + main_product = data_util.mod_prefix .. "significant-specimen", + category = "space-genetics", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/gravimetrics-laboratory.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/gravimetrics-laboratory.lua new file mode 100644 index 0000000..537b099 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/gravimetrics-laboratory.lua @@ -0,0 +1,308 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "darkmatter-data", + ingredients = { + { data_util.mod_prefix .. "gravitational-lensing-data", 1 }, + { data_util.mod_prefix .. "negative-pressure-data", 1 }, + }, + results = { + { name = data_util.mod_prefix .. "darkmatter-data", amount_min = 1, amount_max = 1, probability = 0.6 }, + { data_util.mod_prefix .. "junk-data", 1 }, + { name = data_util.mod_prefix .. "broken-data", amount_min = 1, amount_max = 1, probability = 0.39 }, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "darkmatter-data", + icon = "__space-exploration-graphics__/graphics/icons/data/darkmatter.png", + icon_size = 64, + category = "space-gravimetrics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "gravitational-lensing-data", + ingredients = { + { data_util.mod_prefix .. "astrometric-data", 1 }, + }, + results = { + { name = data_util.mod_prefix .. "gravitational-lensing-data", amount_min = 1, amount_max = 1, probability = 0.95 }, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.04}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "gravitational-lensing-data", + icon = "__space-exploration-graphics__/graphics/icons/data/gravitational-lensing.png", + icon_size = 64, + category = "space-gravimetrics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "timespace-anomaly-data", + ingredients = { + { data_util.mod_prefix .. "gravitational-lensing-data", 1 }, + { data_util.mod_prefix .. "micro-black-hole-data", 1 }, + { data_util.mod_prefix .. "negative-pressure-data", 1 }, + { data_util.mod_prefix .. "zero-point-energy-data", 1 }, + { data_util.mod_prefix .. "naquium-cube", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "timespace-anomaly-data", amount_min = 1, amount_max = 1, probability = 0.6 }, + { name = data_util.mod_prefix .. "gravitational-lensing-data", amount_min = 1, amount_max = 1, probability = 0.6 }, + { name = data_util.mod_prefix .. "micro-black-hole-data", amount_min = 1, amount_max = 1, probability = 0.6 }, + { name = data_util.mod_prefix .. "negative-pressure-data", amount_min = 1, amount_max = 1, probability = 0.6 }, + { name = data_util.mod_prefix .. "zero-point-energy-data", amount_min = 1, amount_max = 1, probability = 0.6 }, + { name = data_util.mod_prefix .. "empty-data", amount_min = 1, amount_max = 1, probability = 0.6 }, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.6 }, + { name = data_util.mod_prefix .. "broken-data", amount_min = 1, amount_max = 1, probability = 0.6 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 30, + main_product = data_util.mod_prefix .. "timespace-anomaly-data", + icon = "__space-exploration-graphics__/graphics/icons/data/timespace-anomaly.png", + icon_size = 64, + category = "space-gravimetrics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "dark-energy-data", + ingredients = { + { name = data_util.mod_prefix .. "negative-pressure-data", amount = 1}, + { name = data_util.mod_prefix .. "astrometric-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "dark-energy-data", amount_min = 1, amount_max = 1, probability = 0.75}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.24}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 30, + main_product = data_util.mod_prefix .. "dark-energy-data", + category = "space-gravimetrics", + enabled = false, + always_show_made_in = true, +}) + + + +make_recipe({ + name = data_util.mod_prefix .. "space-fold-data", + ingredients = { + { name = data_util.mod_prefix .. "significant-data", amount = 1 }, + { name = data_util.mod_prefix .. "naquium-plate", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-a", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-b", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "space-fold-data", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-d", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-e", amount = 0}, + { name = data_util.mod_prefix .. "arcosphere-f", amount = 0}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "space-fold-data", + category = "arcosphere", + enabled = false, + always_show_made_in = true, + localised_description = {"space-exploration.arcosphere-random"} +}) +make_recipe({ + name = data_util.mod_prefix .. "space-fold-data-alt", + ingredients = { + { name = data_util.mod_prefix .. "significant-data", amount = 1 }, + { name = data_util.mod_prefix .. "naquium-plate", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-a", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-b", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "space-fold-data", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 0}, + { name = data_util.mod_prefix .. "arcosphere-d", amount = 0}, + { name = data_util.mod_prefix .. "arcosphere-e", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-f", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "space-fold-data", + category = "arcosphere", + enabled = false, + always_show_made_in = true, + localised_description = {"space-exploration.arcosphere-random"} +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-warp-data", + ingredients = { + { name = data_util.mod_prefix .. "significant-data", amount = 1 }, + { name = data_util.mod_prefix .. "naquium-plate", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-e", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-f", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "space-warp-data", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-d", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-h", amount = 0}, + { name = data_util.mod_prefix .. "arcosphere-g", amount = 0}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "space-warp-data", + category = "arcosphere", + enabled = false, + always_show_made_in = true, + localised_description = {"space-exploration.arcosphere-random"} +}) +make_recipe({ + name = data_util.mod_prefix .. "space-warp-data-alt", + ingredients = { + { name = data_util.mod_prefix .. "significant-data", amount = 1 }, + { name = data_util.mod_prefix .. "naquium-plate", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-e", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-f", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "space-warp-data", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 0}, + { name = data_util.mod_prefix .. "arcosphere-d", amount = 0}, + { name = data_util.mod_prefix .. "arcosphere-h", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-g", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "space-warp-data", + category = "arcosphere", + enabled = false, + always_show_made_in = true, + localised_description = {"space-exploration.arcosphere-random"} +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-dialation-data", + ingredients = { + { name = data_util.mod_prefix .. "significant-data", amount = 1 }, + { name = data_util.mod_prefix .. "naquium-plate", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-h", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "space-dialation-data", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-a", amount = 2}, + { name = data_util.mod_prefix .. "arcosphere-f", amount = 0}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "space-dialation-data", + category = "arcosphere", + enabled = false, + always_show_made_in = true, + localised_description = {"space-exploration.arcosphere-random"} +}) +make_recipe({ + name = data_util.mod_prefix .. "space-dialation-data-alt", + ingredients = { + { name = data_util.mod_prefix .. "significant-data", amount = 1 }, + { name = data_util.mod_prefix .. "naquium-plate", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-h", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "space-dialation-data", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-a", amount = 0}, + { name = data_util.mod_prefix .. "arcosphere-f", amount = 2}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "space-dialation-data", + category = "arcosphere", + enabled = false, + always_show_made_in = true, + localised_description = {"space-exploration.arcosphere-random"} +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-injection-data", + ingredients = { + { name = data_util.mod_prefix .. "significant-data", amount = 1 }, + { name = data_util.mod_prefix .. "naquium-plate", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-d", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-g", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "space-injection-data", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-e", amount = 2}, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 0}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "space-injection-data", + category = "arcosphere", + enabled = false, + always_show_made_in = true, + localised_description = {"space-exploration.arcosphere-random"} +}) +make_recipe({ + name = data_util.mod_prefix .. "space-injection-data-alt", + ingredients = { + { name = data_util.mod_prefix .. "significant-data", amount = 1 }, + { name = data_util.mod_prefix .. "naquium-plate", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-d", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-g", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "space-injection-data", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-e", amount = 0}, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 2}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "space-injection-data", + category = "arcosphere", + enabled = false, + always_show_made_in = true, + localised_description = {"space-exploration.arcosphere-random"} +}) + + +make_recipe({ + name = data_util.mod_prefix .. "wormhole-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + { name = data_util.mod_prefix .. "arcosphere-a", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-e", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-g", amount = 1}, + { name = data_util.mod_prefix .. "naquium-cube", amount = 1}, + { name = data_util.mod_prefix .. "cryonite-rod", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "wormhole-data", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-b", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-d", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-f", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-h", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "wormhole-data", + category = "arcosphere", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/growth-facility.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/growth-facility.lua new file mode 100644 index 0000000..9a09172 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/growth-facility.lua @@ -0,0 +1,147 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "neural-gel", + ingredients = { + { name = data_util.mod_prefix .. "specimen", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "nutrient-gel", amount = 10 } + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "neural-gel", amount = 10 }, + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 10 }, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "neural-gel", + category = "space-growth", + subgroup = "space-bioculture", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "neural-gel-2", + ingredients = { + { name = data_util.mod_prefix .. "significant-specimen", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "neural-gel", amount = 100 }, + { type = "fluid", name = data_util.mod_prefix .. "nutrient-gel", amount = 100 }, + { name = data_util.mod_prefix .. "bioelectrics-data", amount = 1 }, + + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "neural-gel-2", amount = 100 }, + { data_util.mod_prefix .. "junk-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 100 }, + }, + energy_required = 50, + main_product = data_util.mod_prefix .. "neural-gel-2", + category = "space-growth", + subgroup = "space-bioculture", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "specimen", + ingredients = { + { name = data_util.mod_prefix .. "bioculture", amount = 10 }, + { type = "fluid", name = data_util.mod_prefix .. "nutrient-gel", amount = 100 }, + }, + results = { + { name = data_util.mod_prefix .. "specimen", amount = 10 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 30 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 20 }, + }, + energy_required = 80, + main_product = data_util.mod_prefix .. "specimen", + category = "space-growth", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "experimental-specimen", + ingredients = { + { name = data_util.mod_prefix .. "experimental-bioculture", amount = 10 }, + { type = "fluid", name = data_util.mod_prefix .. "nutrient-gel", amount = 100 }, + }, + results = { + { name = data_util.mod_prefix .. "experimental-specimen", amount_min = 5, amount_max = 10, probability = 1 }, + { name = data_util.mod_prefix .. "specimen", amount_min = 0, amount_max = 5, probability = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 30 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 20 }, + }, + energy_required = 80, + main_product = data_util.mod_prefix .. "experimental-specimen", + category = "space-growth", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "specimen-fish", + ingredients = { + { name = data_util.mod_prefix .. "bioculture", amount = 10 }, + { type = "fluid", name = data_util.mod_prefix .. "nutrient-gel", amount = 100 }, + }, + results = { + { name = "raw-fish", amount = 10 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 50 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 50 }, + }, + energy_required = 80, + category = "space-growth", + subgroup = "space-bioculture", + icons = { + { icon = "__space-exploration-graphics__/graphics/blank.png", scale = 1, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "bioculture"].icon, scale = 0.75, shift = {16, -16}, icon_size = 64 }, + { icon = data.raw.capsule["raw-fish"].icon, scale = 0.75, shift = {-16, 16}, icon_size = 64 }, + }, + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "specimen-wood", + ingredients = { + { name = data_util.mod_prefix .. "bioculture", amount = 10 }, + { type = "fluid", name = data_util.mod_prefix .. "nutrient-gel", amount = 100 }, + }, + results = { + { name = "wood", amount = 100 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 125 }, + }, + energy_required = 80, + category = "space-growth", + subgroup = "space-bioculture", + icons = { + { icon = "__space-exploration-graphics__/graphics/blank.png", scale = 1, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "bioculture"].icon, scale = 0.75, shift = {16, -16}, icon_size = 64 }, + { icon = data.raw.item["wood"].icon, scale = 0.75, shift = {-16, 16}, icon_size = 64 }, + }, + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "bio-methane-to-crude-oil", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 100 }, + { type = "fluid", name = data_util.mod_prefix .. "methane-gas", amount = 1000 }, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "bio-sludge", amount = 80 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 10 }, + { type = "fluid", name = "crude-oil", amount = 1000 }, + }, + energy_required = 10, + category = "space-growth", + subgroup = "space-bioculture", + icon = data.raw.fluid["crude-oil"].icon, + icon_size = data.raw.fluid["crude-oil"].icon_size, + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/hypercooler.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/hypercooler.lua new file mode 100644 index 0000000..85a2821 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/hypercooler.lua @@ -0,0 +1,116 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "space-coolant", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 1}, + { type = "fluid", name = "heavy-oil", amount = 20}, + { name = "copper-plate", amount = 2}, + { name = "iron-plate", amount = 1}, + { name = "sulfur", amount = 1}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 5, + subgroup = "space-cooling", + category = "space-manufacturing", + localised_name = {"fluid-name." .. data_util.mod_prefix .. "space-coolant"}, + always_show_made_in = true, + order = "a-a", +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-coolant-cryonite", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 5}, + { type = "fluid", name = "heavy-oil", amount = 5}, + { name = data_util.mod_prefix .. "cryonite-rod", amount = 1}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 5, + subgroup = "space-cooling", + category = "space-manufacturing", + localised_name = {"fluid-name." .. data_util.mod_prefix .. "space-coolant"}, + always_show_made_in = true, + order = "a-a", +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-coolant-cold", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 10}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 5}, + }, + energy_required = 1, + subgroup = "space-cooling", + category = "space-hypercooling", + localised_name = {"recipe-name." .. data_util.mod_prefix .. "space-coolant-cold"}, + enabled = false, + always_show_made_in = true, + order = "c-a", +}) + + +make_recipe({ + name = data_util.mod_prefix .. "space-coolant-supercooled", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 5}, + }, + energy_required = 2, + subgroup = "space-cooling", + category = "space-hypercooling", + localised_name = {"recipe-name." .. data_util.mod_prefix .. "space-coolant-supercooled"}, + enabled = false, + always_show_made_in = true, + order = "d-a", +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-coolant-cold-cryonite", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 20}, + { type = "fluid", name = data_util.mod_prefix .. "cryonite-slush", amount = 1}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 15}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 5}, + }, + energy_required = 1, + subgroup = "space-cooling", + category = "space-hypercooling", + localised_name = {"recipe-name." .. data_util.mod_prefix .. "space-coolant-cold-cryonite"}, + enabled = false, + always_show_made_in = true, + order = "c-a", +}) + + +make_recipe({ + name = data_util.mod_prefix .. "space-coolant-supercooled-cryonite", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 15}, + { type = "fluid", name = data_util.mod_prefix .. "cryonite-slush", amount = 1}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 5}, + }, + energy_required = 1, + subgroup = "space-cooling", + category = "space-hypercooling", + localised_name = {"recipe-name." .. data_util.mod_prefix .. "space-coolant-supercooled-cryonite"}, + enabled = false, + always_show_made_in = true, + order = "d-a", +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/laser-laboratory.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/laser-laboratory.lua new file mode 100644 index 0000000..e78e16c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/laser-laboratory.lua @@ -0,0 +1,174 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +--[[ +make_recipe({ + name = data_util.mod_prefix .. "doppler-shift-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 50}, + }, + results = { + { name = data_util.mod_prefix .. "doppler-shift-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 50}, + }, + energy_required = 2, + main_product = data_util.mod_prefix .. "doppler-shift-data", + category = "space-laser", + enabled = false, + always_show_made_in = true, +})]] + +make_recipe({ + name = data_util.mod_prefix .. "gravity-wave-data", + ingredients = { + { name = data_util.mod_prefix .. "astrometric-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "gravity-wave-data", amount_min = 1, amount_max = 1, probability = 0.3}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.69}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 10}, + }, + energy_required = 2, + main_product = data_util.mod_prefix .. "gravity-wave-data", + category = "space-laser", + enabled = false, + always_show_made_in = true, +}) + + +make_recipe({ + name = data_util.mod_prefix .. "negative-pressure-data", + ingredients = { + { name = data_util.mod_prefix .. "astrometric-data", amount = 1}, + { name = data_util.mod_prefix .. "aeroframe-scaffold", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "negative-pressure-data", amount_min = 1, amount_max = 1, probability = 0.9}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.09}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "negative-pressure-data", + category = "space-laser", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "polarisation-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 10}, + { name = data_util.mod_prefix .. "space-mirror", amount = 2}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "polarisation-data", amount = 9}, + { name = data_util.mod_prefix .. "junk-data", amount = 1}, + { name = data_util.mod_prefix .. "scrap", amount = 2}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 10}, + }, + energy_required = 60, + main_product = data_util.mod_prefix .. "polarisation-data", + category = "space-laser", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "quantum-phenomenon-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "quantum-phenomenon-data", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.49}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "quantum-phenomenon-data", + category = "space-laser", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "zero-point-energy-data", + ingredients = { + { name = data_util.mod_prefix .. "negative-pressure-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "zero-point-energy-data", amount_min = 1, amount_max = 1, probability = 0.4}, + { name = data_util.mod_prefix .. "negative-pressure-data", amount_min = 1, amount_max = 1, probability = 0.4}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.19}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "zero-point-energy-data", + category = "space-laser", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "laser-shielding-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + { name = data_util.mod_prefix .. "material-testing-pack", amount = 1 }, + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "laser-shielding-data", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + { name = data_util.mod_prefix .. "iridium-plate", amount_min = 1, amount_max = 1, probability = 0.5 }, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "laser-shielding-data", + category = "space-laser", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "teleportation-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 2 }, + { name = data_util.mod_prefix .. "singularity-data", amount = 1}, + { name = data_util.mod_prefix .. "timespace-anomaly-data", amount = 1}, + { name = data_util.mod_prefix .. "naquium-cube", amount = 2}, + { name = data_util.mod_prefix .. "cryonite-rod", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "teleportation-data", amount = 4}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 10}, + }, + energy_required = 40, + main_product = data_util.mod_prefix .. "teleportation-data", + category = "space-laser", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "hyperlattice-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 6 }, + { name = data_util.mod_prefix .. "nanomaterial", amount = 1}, + { name = data_util.mod_prefix .. "naquium-plate", amount = 24}, + }, + results = { + { name = data_util.mod_prefix .. "hyperlattice-data", amount=6}, + }, + energy_required = 40, + main_product = data_util.mod_prefix .. "hyperlattice-data", + category = "space-laser", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/lifesupport-facility.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/lifesupport-facility.lua new file mode 100644 index 0000000..b255180 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/lifesupport-facility.lua @@ -0,0 +1,101 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "empty-lifesupport-canister", + ingredients = { + { data_util.mod_prefix .. "canister", 1}, + { "processing-unit", 1}, + }, + results = { + { data_util.mod_prefix .. "empty-lifesupport-canister", 1}, + }, + energy_required = 10, + category = "lifesupport", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "lifesupport-canister-fish", + ingredients = { + { data_util.mod_prefix .. "empty-lifesupport-canister", 2}, + { "raw-fish", 1}, + { "wood", 10}, + { type = "fluid", name = "water" , amount = 100}, + }, + results = { + { data_util.mod_prefix .. "lifesupport-canister", 2}, + }, + energy_required = 10, + category = "lifesupport", + enabled = false, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "lifesupport-canister"].icon, scale = 1, icon_size = 64 }, + { icon = data.raw.item["wood"].icon, scale = 0.25, shift = {-20, 20}, icon_size = 64 }, + { icon = data.raw.capsule["raw-fish"].icon, scale = 0.25, shift = {-20, 0}, icon_size = 64 }, + }, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "lifesupport-canister-coal", + ingredients = { + { data_util.mod_prefix .. "empty-lifesupport-canister", 2}, + { "coal", 2}, + { type = "fluid", name = "water" , amount = 100}, + }, + results = { + { data_util.mod_prefix .. "lifesupport-canister", 2}, + }, + energy_required = 10, + category = "lifesupport", + enabled = false, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "lifesupport-canister"].icon, scale = 1, icon_size = 64 }, + { icon = data.raw.item["coal"].icon, scale = 0.25, shift = {-20, 20}, icon_size = 64 }, + }, + allow_as_intermediate = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "lifesupport-canister-specimen", + ingredients = { + { data_util.mod_prefix .. "empty-lifesupport-canister", 1}, + { data_util.mod_prefix .. "specimen", 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-water" , amount = 10}, + }, + results = { + { data_util.mod_prefix .. "lifesupport-canister", 1}, + }, + energy_required = 10, + category = "lifesupport", + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "empty-lifesupport-canister"].icon, scale = 1, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "specimen"].icon, scale = 0.5, shift = {-20, 20}, icon_size = 64 }, + }, + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "used-lifesupport-canister-cleaning", + ingredients = { + { data_util.mod_prefix .. "used-lifesupport-canister", 1}, + { type = "fluid", name = "water", amount = 100}, + }, + results = { + { data_util.mod_prefix .. "empty-lifesupport-canister", 1}, + }, + energy_required = 10, + localised_name = {"recipe-name."..data_util.mod_prefix .. "used-lifesupport-canister-cleaning"}, + main_product = data_util.mod_prefix .. "empty-lifesupport-canister", + allow_as_intermediate = false, + category = "lifesupport", + icon = "__space-exploration-graphics__/graphics/icons/used-lifesupport-canister.png", + icon_size = 64, icon_mipmaps = 1, + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/manufacturing.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/manufacturing.lua new file mode 100644 index 0000000..58d4331 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/manufacturing.lua @@ -0,0 +1,421 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +-- making data cell +--[[make_recipe({ + name = data_util.mod_prefix .. "omega-tool", + ingredients = { + { data_util.mod_prefix .. "nanomaterial", 100 }, + }, + results = { + { data_util.mod_prefix .. "omega-tool", 1}, + }, + category = "space-manufacturing" +})]]-- + +-- making data cell +make_recipe({ + name = data_util.mod_prefix .. "data-storage-substrate", + ingredients = { + { "glass", 2 }, + { "iron-plate", 4 } + }, + results = { + { data_util.mod_prefix .. "data-storage-substrate", 1}, + { name = data_util.mod_prefix .. "scrap", amount_min = 1, amount_max = 1, probability = 0.5 }, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "data-storage-substrate", + category = "crafting", + enabled = false, + always_show_made_in = false, +}) + +make_recipe({ + name = data_util.mod_prefix .. "empty-data", + ingredients = { + { "advanced-circuit", 3 }, + { "copper-plate", 6 }, + { data_util.mod_prefix .. "data-storage-substrate-cleaned", 4 } + }, + results = { + { data_util.mod_prefix .. "empty-data", 1}, + }, + energy_required = 10, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}, true) + +make_recipe({ + name = data_util.mod_prefix .. "material-testing-pack", + ingredients = { + { "iron-plate", 1}, + { "copper-plate", 1}, + { "stone", 1}, + { "plastic-bar", 1}, + }, + results = { + { data_util.mod_prefix .. "material-testing-pack", 1}, + }, + energy_required = 5, + category = "crafting", + enabled = false, + always_show_made_in = false, +}) + +make_recipe({ + name = data_util.mod_prefix .. "canister", + ingredients = { + { "steel-plate", 5}, + { "copper-plate", 10}, + { "plastic-bar", 5}, + { "glass", 5}, + { data_util.mod_prefix .. "heat-shielding", 1}, + }, + results = { + { data_util.mod_prefix .. "canister", 1}, + { data_util.mod_prefix .. "scrap", 1}, + }, + main_product = data_util.mod_prefix .. "canister", + energy_required = 10, + category = "crafting", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-mirror", + ingredients = { + { name = "glass", amount = 6}, + { name = "steel-plate", amount = 3}, + { name = "low-density-structure", amount = 1}, + { name = data_util.mod_prefix .. "heat-shielding", amount = 1}, + { type = "fluid", name = "lubricant", amount = 10}, + { type = "fluid", name = data_util.mod_prefix .."chemical-gel", amount = 1}, + }, + results = { + { name = data_util.mod_prefix.."space-mirror", amount = 1 }, + { name = data_util.mod_prefix.."scrap", amount = 1 }, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "space-mirror", + category = "space-manufacturing", + icon = "__space-exploration-graphics__/graphics/icons/space-mirror.png", + icon_size = 64, icon_mipmaps = 1, + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-mirror-alternate", + ingredients = { + { name = "glass", amount = 2}, + { name = data_util.mod_prefix.."iridium-plate", amount = 2}, + { name = "low-density-structure", amount = 1}, + { type = "fluid", name = "lubricant", amount = 5}, + { type = "fluid", name = data_util.mod_prefix.."chemical-gel", amount = 5}, + }, + results = { + { name = data_util.mod_prefix.."space-mirror", amount = 1 }, + { name = data_util.mod_prefix.."scrap", amount = 5 }, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "space-mirror", + category = "space-manufacturing", + icon = "__space-exploration-graphics__/graphics/icons/space-mirror.png", + icon_size = 64, icon_mipmaps = 1, + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "gammaray-detector", + ingredients = { + { name = data_util.mod_prefix.."space-mirror", amount = 1 }, + { name = data_util.mod_prefix.."beryllium-plate", amount = 1}, + { type = "fluid", name = data_util.mod_prefix.."cryonite-slush", amount = 5}, + { type = "fluid", name = data_util.mod_prefix.."chemical-gel", amount = 5}, + }, + results = { + { name = data_util.mod_prefix.."gammaray-detector", amount = 1 }, + }, + energy_required = 10, + category = "space-manufacturing", + icon = "__space-exploration-graphics__/graphics/icons/gammaray-detector.png", + icon_size = 64, icon_mipmaps = 1, + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-solar-panel", + ingredients = { + { name = data_util.mod_prefix .. "space-mirror", amount = 4}, + { name = "solar-panel", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "space-solar-panel", amount = 1 }, + }, + energy_required = 20, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-solar-panel-2", + ingredients = { + { name = data_util.mod_prefix .. "space-solar-panel", amount = 1}, + { name = data_util.mod_prefix .. "holmium-plate", amount = 4}, + { name = data_util.mod_prefix .. "holmium-cable", amount = 4}, + { name = data_util.mod_prefix .. "space-mirror", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "space-solar-panel-2", amount = 1 }, + }, + energy_required = 40, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-solar-panel-3", + ingredients = { + { name = data_util.mod_prefix .. "space-solar-panel-2", amount = 1}, + { name = data_util.mod_prefix .. "naquium-cube", amount = 1}, + { name = data_util.mod_prefix .. "superconductive-cable", amount = 4}, + }, + results = { + { name = data_util.mod_prefix .. "space-solar-panel-3", amount = 1 }, + }, + energy_required = 60, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-accumulator", + ingredients = { + { name = "accumulator", amount = 2}, + { name = data_util.mod_prefix .. "heavy-girder", amount = 8}, + { name = data_util.mod_prefix .. "holmium-cable", amount = 40}, + }, + results = { + { name = data_util.mod_prefix .. "space-accumulator", amount = 1 }, + }, + energy_required = 30, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-accumulator-2", + ingredients = { + { name = data_util.mod_prefix .. "space-accumulator", amount = 2}, + { name = data_util.mod_prefix .. "superconductive-cable", amount = 8}, + { name = data_util.mod_prefix .. "naquium-cube", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "space-accumulator-2", amount = 1 }, + }, + energy_required = 60, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "observation-frame-blank", + ingredients = { + { name = "coal", amount = 1}, + { name = "glass", amount = 1}, + { name = "steel-plate", amount = 1}, + { type = "fluid", name = "light-oil", amount = 10}, + }, + results = { + { name = data_util.mod_prefix.."observation-frame-blank", amount = 5 }, + }, + energy_required = 5, + category = "space-manufacturing", + icon = "__space-exploration-graphics__/graphics/icons/observation-frame-blank.png", + icon_size = 64, icon_mipmaps = 1, + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "observation-frame-blank-beryllium", + ingredients = { + { name = "coal", amount = 1}, + { name = "glass", amount = 1}, + { name = data_util.mod_prefix .. "beryllium-plate", amount = 1}, + { type = "fluid", name = "light-oil", amount = 10}, + }, + results = { + { name = data_util.mod_prefix.."observation-frame-blank", amount = 10 }, + }, + energy_required = 10, + category = "space-manufacturing", + icon = "__space-exploration-graphics__/graphics/icons/observation-frame-blank.png", + icon_size = 64, icon_mipmaps = 1, + enabled = false, + always_show_made_in = true, +}) + + +make_recipe({ + name = data_util.mod_prefix .. "chemical-gel", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 10}, + { type = "fluid", name = "petroleum-gas", amount = 100}, + }, + results = { + { type="fluid", name = data_util.mod_prefix .. "chemical-gel", amount = 20}, + }, + energy_required = 10, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) + +--[[ +make_recipe({ + name = data_util.mod_prefix .. "space-rail", + ingredients = { + { name = "low-density-structure", amount = 1}, + { name = "steel-plate", amount = 2}, + { name = "copper-cable", amount = 4}, + }, + results = { + { name = data_util.mod_prefix .. "space-rail", amount = 1}, + }, + energy_required = 10, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) +]]-- + +make_recipe({ + name = data_util.mod_prefix .. "space-rail", + ingredients = { + { name = "rail", amount = 100}, + { name = "steel-plate", amount = 100}, + { name = "copper-cable", amount = 100}, + { name = data_util.mod_prefix .. "energy-catalogue-1", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "space-rail", amount = 100}, + }, + energy_required = 100, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "star-probe", + ingredients = { + { name = "rocket-fuel", amount = 100}, + { name = data_util.mod_prefix .. "heat-shielding", amount = 100}, + { name = "rocket-control-unit", amount = 20}, + { name = data_util.mod_prefix .. "space-solar-panel-2", amount = 10}, + { name = data_util.mod_prefix .. "holmium-solenoid", amount = 50}, + { name = data_util.mod_prefix .. "empty-data", amount = 1000}, + }, + results = { + { name = data_util.mod_prefix .. "star-probe", amount = 1}, + }, + energy_required = 60, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "belt-probe", + ingredients = { + { name = "rocket-fuel", amount = 100}, + { name = "uranium-fuel-cell", amount = 10}, + { name = data_util.mod_prefix .. "aeroframe-bulkhead", amount = 50}, + { name = "rocket-control-unit", amount = 20}, + { name = data_util.mod_prefix .. "space-solar-panel", amount = 10}, + { name = data_util.mod_prefix .. "empty-data", amount = 1000}, + }, + results = { + { name = data_util.mod_prefix .. "belt-probe", amount = 1}, + }, + energy_required = 60, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "void-probe", + ingredients = { + { name = "uranium-fuel-cell", amount = 20}, + { name = "rocket-fuel", amount = 100}, + { name = "rocket-control-unit", amount = 20}, + { name = data_util.mod_prefix .. "nanomaterial", amount = 10}, + { name = "laser-turret", amount = 10}, + { name = data_util.mod_prefix .. "empty-data", amount = 1000}, + }, + results = { + { name = data_util.mod_prefix .. "void-probe", amount = 1}, + }, + energy_required = 60, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "nanomaterial", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + { data_util.mod_prefix .. "dynamic-emitter", 1}, + { data_util.mod_prefix .. "aeroframe-bulkhead", 2}, + { data_util.mod_prefix .. "heavy-girder", 3}, + { data_util.mod_prefix .. "vitalic-epoxy", 1}, + }, + results = { + { name = data_util.mod_prefix .. "nanomaterial", amount=16}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 60, + main_product = data_util.mod_prefix .. "nanomaterial", + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) + + +make_recipe({ + name = data_util.mod_prefix .. "nano-engineering-data", + ingredients = { + { name = data_util.mod_prefix .. "nanomaterial", amount = 1, catalyst_amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + { name = data_util.mod_prefix .. "empty-data", amount=1}, + }, + results = { + { name = data_util.mod_prefix .. "nano-engineering-data", amount=1}, + { name = data_util.mod_prefix .. "nanomaterial", amount_min = 1, amount_max = 1, probability = 0.05}, + { name = data_util.mod_prefix .. "heat-shielding", amount_min = 1, amount_max = 1, probability = 0.05}, + { name = "low-density-structure", amount_min = 1, amount_max = 1, probability = 0.05}, + { name = data_util.mod_prefix .. "superconductive-cable", amount_min = 1, amount_max = 1, probability = 0.05}, + { name = data_util.mod_prefix .. "scrap", amount_min = 1, amount_max = 1, probability = 0.05}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount_min = 1, amount_max = 1, probability = 0.05}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 60, + main_product = data_util.mod_prefix .. "nano-engineering-data", + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/material-fabricator.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/material-fabricator.lua new file mode 100644 index 0000000..f6fc30e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/material-fabricator.lua @@ -0,0 +1,357 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "antimatter-stream", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount=50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 100}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "antimatter-stream", amount = 50}, -- 50 * 20MJ = 1000 MJ = 1GJ + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 100}, + }, + energy_required = 4, -- 400 * 5MW = 2000MJ + main_product = data_util.mod_prefix .. "antimatter-stream", + category = "space-materialisation", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "matter-fusion-dirty", + ingredients = { + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1, catalyst_amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + }, + results = { + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 15}, + { name = data_util.mod_prefix .. "fusion-test-data", amount_min = 1, amount_max = 1, probability = 0.99}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.01}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 1, + category = "space-materialisation", + subgroup = "space-components", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .. "contaminated-scrap"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "contaminated-scrap"].icon_size, scale = 0.5 + } + ), + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, + allow_decomposition = false, +}) + +make_recipe({ + name = data_util.mod_prefix .. "matter-fusion-iron", + ingredients = { + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1, catalyst_amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + }, + results = { + { name = "iron-ore", amount = 10}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { name = data_util.mod_prefix .. "fusion-test-data", amount_min = 1, amount_max = 1, probability = 0.99}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.01}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 1, + category = "space-materialisation", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item["iron-ore"].icon, + icon_size = data.raw.item["iron-ore"].icon_size, scale = 0.5 + } + ), + subgroup = "space-components", + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, + allow_decomposition = false, + localised_name = {"recipe-name.se-matter-fusion-to", {"item-name.iron-ore"}} +}) + +make_recipe({ + name = data_util.mod_prefix .. "matter-fusion-copper", + ingredients = { + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1, catalyst_amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + }, + results = { + { name = "copper-ore", amount = 10}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { name = data_util.mod_prefix .. "fusion-test-data", amount_min = 1, amount_max = 1, probability = 0.99}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.01}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 1, + category = "space-materialisation", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item["copper-ore"].icon, + icon_size = data.raw.item["copper-ore"].icon_size, scale = 0.5 + } + ), + subgroup = "space-components", + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, + allow_decomposition = false, + localised_name = {"recipe-name.se-matter-fusion-to", {"item-name.copper-ore"}} +}) + +make_recipe({ + name = data_util.mod_prefix .. "matter-fusion-stone", + ingredients = { + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1, catalyst_amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + }, + results = { + { name = "stone", amount = 10}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { name = data_util.mod_prefix .. "fusion-test-data", amount_min = 1, amount_max = 1, probability = 0.99}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.01}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 1, + category = "space-materialisation", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item["stone"].icon, + icon_size = data.raw.item["stone"].icon_size, scale = 0.5 + } + ), + subgroup = "space-components", + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, + allow_decomposition = false, + localised_name = {"recipe-name.se-matter-fusion-to", {"item-name.stone"}} +}) + +make_recipe({ + name = data_util.mod_prefix .. "matter-fusion-uranium", + ingredients = { + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1, catalyst_amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + }, + results = { + { name = "uranium-ore", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { name = data_util.mod_prefix .. "fusion-test-data", amount_min = 1, amount_max = 1, probability = 0.99}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.01}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 6, + category = "space-materialisation", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item["uranium-ore"].icon, + icon_size = data.raw.item["uranium-ore"].icon_size, scale = 0.5 + } + ), + subgroup = "space-components", + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, + allow_decomposition = false, + localised_name = {"recipe-name.se-matter-fusion-to", {"item-name.uranium-ore"}} +}) + +make_recipe({ + name = data_util.mod_prefix .. "matter-fusion-beryllium", + ingredients = { + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1, catalyst_amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + }, + results = { + { name = data_util.mod_prefix .."beryllium-ore", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { name = data_util.mod_prefix .. "fusion-test-data", amount_min = 1, amount_max = 1, probability = 0.99}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.01}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 6, + category = "space-materialisation", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .."beryllium-ore"].icon, + icon_size = data.raw.item[data_util.mod_prefix .."beryllium-ore"].icon_size, scale = 0.5 + } + ), + subgroup = "space-components", + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, + allow_decomposition = false, + localised_name = {"recipe-name.se-matter-fusion-to", {"item-name." .. data_util.mod_prefix .."beryllium-ore"}} +}) + +make_recipe({ + name = data_util.mod_prefix .. "matter-fusion-holmium", + ingredients = { + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1, catalyst_amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + }, + results = { + { name = data_util.mod_prefix .."holmium-ore", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { name = data_util.mod_prefix .. "fusion-test-data", amount_min = 1, amount_max = 1, probability = 0.99}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.01}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 6, + category = "space-materialisation", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .."holmium-ore"].icon, + icon_size = data.raw.item[data_util.mod_prefix .."holmium-ore"].icon_size, scale = 0.5 + } + ), + subgroup = "space-components", + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, + allow_decomposition = false, + localised_name = {"recipe-name.se-matter-fusion-to", {"item-name." .. data_util.mod_prefix .."holmium-ore"}} +}) + +make_recipe({ + name = data_util.mod_prefix .. "matter-fusion-iridium", + ingredients = { + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1, catalyst_amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + }, + results = { + { name = data_util.mod_prefix .."iridium-ore", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { name = data_util.mod_prefix .. "fusion-test-data", amount_min = 1, amount_max = 1, probability = 0.99}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.01}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 6, + category = "space-materialisation", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .."iridium-ore"].icon, + icon_size = data.raw.item[data_util.mod_prefix .."iridium-ore"].icon_size, scale = 0.5 + } + ), + subgroup = "space-components", + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, + allow_decomposition = false, + localised_name = {"recipe-name.se-matter-fusion-to", {"item-name." .. data_util.mod_prefix .."iridium-ore"}} +}) + +make_recipe({ + name = data_util.mod_prefix .. "matter-fusion-vulcanite", + ingredients = { + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1, catalyst_amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + }, + results = { + { name = data_util.mod_prefix .."vulcanite", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { name = data_util.mod_prefix .. "fusion-test-data", amount_min = 1, amount_max = 1, probability = 0.99}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.01}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 3, + category = "space-materialisation", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .."vulcanite"].icon, + icon_size = data.raw.item[data_util.mod_prefix .."vulcanite"].icon_size, scale = 0.5 + } + ), + subgroup = "space-components", + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, + allow_decomposition = false, + localised_name = {"recipe-name.se-matter-fusion-to", {"item-name." .. data_util.mod_prefix .."vulcanite"}} +}) + +make_recipe({ + name = data_util.mod_prefix .. "matter-fusion-cryonite", + ingredients = { + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1, catalyst_amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 25}, + }, + results = { + { name = data_util.mod_prefix .."cryonite", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + { name = data_util.mod_prefix .. "fusion-test-data", amount_min = 1, amount_max = 1, probability = 0.99}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.01}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 25}, + }, + energy_required = 3, + category = "space-materialisation", + icons = data_util.transition_icons( + { + icon = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon, + icon_size = data.raw.fluid[data_util.mod_prefix .. "particle-stream"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .."cryonite"].icon, + icon_size = data.raw.item[data_util.mod_prefix .."cryonite"].icon_size, scale = 0.5 + } + ), + subgroup = "space-components", + enabled = false, + allow_as_intermediate = false, + always_show_made_in = true, + allow_decomposition = false, + localised_name = {"recipe-name.se-matter-fusion-to", {"item-name." .. data_util.mod_prefix .."cryonite"}} +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/mechanical-laboratory.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/mechanical-laboratory.lua new file mode 100644 index 0000000..04010ba --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/mechanical-laboratory.lua @@ -0,0 +1,251 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "compressive-strength-data", + ingredients = { + { name = data_util.mod_prefix .. "material-testing-pack", amount = 2}, + { name = "concrete", amount = 1}, + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = "lubricant", amount = 5}, + }, + results = { + { name = data_util.mod_prefix .. "compressive-strength-data", amount = 1}, + { name = data_util.mod_prefix .. "iridium-plate", amount_min = 1, amount_max = 1, probability = 0.25}, + { name = data_util.mod_prefix .. "scrap", amount = 6}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 1}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "compressive-strength-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "tensile-strength-data", + ingredients = { + { name = data_util.mod_prefix .. "material-testing-pack", amount = 2}, + { name = "steel-plate", amount = 1}, + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = "lubricant", amount = 5}, + }, + results = { + { name = data_util.mod_prefix .. "tensile-strength-data", amount = 1}, + { name = data_util.mod_prefix .. "iridium-plate", amount_min = 1, amount_max = 1, probability = 0.25}, + { name = data_util.mod_prefix .. "scrap", amount = 6}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 1}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "tensile-strength-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) +--[[ +make_recipe({ + name = data_util.mod_prefix .. "shear-strength-data", + ingredients = { + { name = data_util.mod_prefix .. "material-testing-pack", amount = 1}, + { name = "refined-concrete", amount = 1}, + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = "lubricant", amount = 5}, + }, + results = { + { name = data_util.mod_prefix .. "shear-strength-data", amount = 1}, + { name = data_util.mod_prefix .. "iridium-plate", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "scrap", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 1}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "shear-strength-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +})]] + +make_recipe({ + name = data_util.mod_prefix .. "rigidity-data", + ingredients = { + { name = data_util.mod_prefix .. "material-testing-pack", amount = 4}, + { name = data_util.mod_prefix .. "heavy-girder", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = "lubricant", amount = 5}, + }, + results = { + { name = data_util.mod_prefix .. "rigidity-data", amount = 1}, + { name = data_util.mod_prefix .. "heavy-girder", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "scrap", amount = 8}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 1}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "rigidity-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "impact-shielding-data", + ingredients = { + { name = "locomotive", amount = 1}, + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + { name = data_util.mod_prefix .. "heavy-girder", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 25}, + { type = "fluid", name = "lubricant", amount = 5}, + }, + results = { + { name = data_util.mod_prefix .. "impact-shielding-data", amount = 25}, + { name = data_util.mod_prefix .. "heavy-girder", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "iridium-plate", amount_min = 1, amount_max = 1, probability = 0.25}, + { name = data_util.mod_prefix .. "scrap", amount = 1500}, + }, + energy_required = 200, + main_product = data_util.mod_prefix .. "impact-shielding-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) + + +make_recipe({ + name = data_util.mod_prefix .. "ballistic-shielding-data", + ingredients = { + { name = "firearm-magazine", amount = 10}, + { name = data_util.mod_prefix .. "material-testing-pack", amount = 1}, + { name = data_util.mod_prefix .. "heavy-girder", amount = 1}, + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = "lubricant", amount = 5}, + }, + results = { + { name = data_util.mod_prefix .. "ballistic-shielding-data", amount = 1}, + { name = data_util.mod_prefix .. "heavy-girder", amount_min = 1, amount_max = 1, probability = 0.75}, + { name = data_util.mod_prefix .. "iridium-plate", amount_min = 1, amount_max = 1, probability = 0.25}, + { name = data_util.mod_prefix .. "scrap", amount = 6}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 1}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "ballistic-shielding-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "friction-data", + ingredients = { + { name = data_util.mod_prefix .. "material-testing-pack", amount = 4}, + { name = data_util.mod_prefix .. "heavy-bearing", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = "lubricant", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "friction-data", amount = 1}, + { name = data_util.mod_prefix .. "heavy-bearing", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "scrap", amount = 8}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 2}, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "friction-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "biomechanical-data", + ingredients = { + { name = data_util.mod_prefix .. "specimen", amount = 2}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = "lubricant", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "biomechanical-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 20}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "biomechanical-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "biomechanical-resistance-data", + ingredients = { + { name = data_util.mod_prefix .. "experimental-specimen", amount = 1}, + { name = data_util.mod_prefix .. "biomechanical-data", amount = 1}, + { type = "fluid", name = "lubricant", amount = 5}, + }, + results = { + { name = data_util.mod_prefix .. "biomechanical-resistance-data", amount = 1}, + { name = data_util.mod_prefix .. "experimental-specimen", amount_min = 1, amount_max = 1, probability = 0.25}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 7}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 1}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "biomechanical-resistance-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) + + +make_recipe({ + name = data_util.mod_prefix .. "decompression-data", + ingredients = { + { name = data_util.mod_prefix .. "experimental-specimen", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "decompression-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount_min = 1, amount_max = 10, probability = 1}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "decompression-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "decompression-resistance-data", + ingredients = { + { name = data_util.mod_prefix .. "significant-specimen", amount = 1}, + { name = data_util.mod_prefix .. "vitalic-epoxy", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "decompression-resistance-data", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "significant-specimen", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.49}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount_min = 1, amount_max = 5, probability = 1}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "decompression-resistance-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "naquium-structural-data", + ingredients = { + { name = data_util.mod_prefix .. "naquium-ingot", amount = 1}, + { type = "fluid", name = "lubricant", amount = 2}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "naquium-structural-data", amount = 1}, + }, + energy_required = 4, + main_product = data_util.mod_prefix .. "naquium-structural-data", + category = "space-mechanical", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/medpack.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/medpack.lua new file mode 100644 index 0000000..6ae5f84 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/medpack.lua @@ -0,0 +1,85 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "medpack", + ingredients = { + { "raw-fish", 5}, + { "wood", 5}, + { "iron-plate", 1}, + }, + results = { + { data_util.mod_prefix .. "medpack", 1}, + }, + order = "a-a-a", + energy_required = 10, + category = "crafting", + enabled = false, + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "medpack-plastic", + ingredients = { + { "iron-plate", 1}, + { "plastic-bar", 5}, + { type = "fluid", name = "water" , amount = 100}, + { type = "fluid", name = "heavy-oil" , amount = 100}, + }, + results = { + { data_util.mod_prefix .. "medpack", 1}, + }, + order = "a-a-b", + energy_required = 10, + category = "lifesupport", + enabled = false, + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "medpack-2", + ingredients = { + { data_util.mod_prefix .. "medpack", 1}, + { data_util.mod_prefix .. "canister", 1}, + { type = "fluid", name = "petroleum-gas" , amount = 100}, + }, + results = { + { data_util.mod_prefix .. "medpack-2", 1}, + }, + order = "a-b", + energy_required = 10, + category = "lifesupport", + enabled = false, + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "medpack-3", + ingredients = { + { data_util.mod_prefix .. "medpack-2", 1}, + { data_util.mod_prefix .. "specimen", 1}, + { type = "fluid", name = data_util.mod_prefix .. "chemical-gel" , amount = 10}, + }, + results = { + { data_util.mod_prefix .. "medpack-3", 1}, + }, + order = "a-c", + energy_required = 10, + category = "lifesupport", + enabled = false, + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "medpack-4", + ingredients = { + { data_util.mod_prefix .. "medpack-3", 1}, + { data_util.mod_prefix .. "significant-specimen", 1}, + { data_util.mod_prefix .. "self-sealing-gel", 1}, + { type = "fluid", name = data_util.mod_prefix .. "neural-gel-2" , amount = 10}, + }, + results = { + { data_util.mod_prefix .. "medpack-4", 1}, + }, + order = "a-d", + energy_required = 10, + category = "lifesupport", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/observation.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/observation.lua new file mode 100644 index 0000000..d457c6e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/observation.lua @@ -0,0 +1,142 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe +local obs_types = data_util.obs_types + +make_recipe({ + name = data_util.mod_prefix .. "observation-frame-gammaray", + ingredients = { + { data_util.mod_prefix .. "observation-frame-blank", 12 }, + { data_util.mod_prefix .. "gammaray-detector", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 3}, + }, + results = { + { data_util.mod_prefix .. "observation-frame-gammaray", 12 }, + { name = data_util.mod_prefix .. "scrap", amount_min = 1, amount_max = 1, probability = 0.5 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 3}, + }, + energy_required = 16, + --energy_required = math.ceil(2 + 20 / 5 * 12 / (obs_types["gammaray"][2] / obs_types["gammaray"][3])), -- base, size, results, required, success + main_product = data_util.mod_prefix .. "observation-frame-gammaray", + icon = "__space-exploration-graphics__/graphics/icons/observation-frame-gammaray.png", + icon_size = 64, icon_mipmaps = 1, + category = "space-observation-gammaray", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "observation-frame-xray", + ingredients = { + { data_util.mod_prefix .. "observation-frame-blank", 12 }, + { data_util.mod_prefix .. "space-mirror", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 4}, + }, + results = { + { data_util.mod_prefix .. "observation-frame-xray", 12 }, + { name = data_util.mod_prefix .. "scrap", amount_min = 1, amount_max = 1, probability = 0.25 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 4}, + }, + energy_required = 12, + --energy_required = math.ceil(2 + 20 / 5 * 12 / (obs_types["xray"][2] / obs_types["xray"][3])), -- base, size, results, required, success + main_product = data_util.mod_prefix .. "observation-frame-xray", + icon = "__space-exploration-graphics__/graphics/icons/observation-frame-xray.png", + icon_size = 64, icon_mipmaps = 1, + category = "space-observation-xray", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "observation-frame-uv", + ingredients = { + { data_util.mod_prefix .. "observation-frame-blank", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 8}, + }, + results = { + { data_util.mod_prefix .. "observation-frame-uv", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 8}, + }, + energy_required = math.ceil(2 + 100 / 3 * 1 / (obs_types["uv"][2] / obs_types["uv"][3])), -- base, size, results, required, success + main_product = data_util.mod_prefix .. "observation-frame-uv", + icon = "__space-exploration-graphics__/graphics/icons/observation-frame-uv.png", + icon_size = 64, icon_mipmaps = 1, + category = "space-observation-uv", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "observation-frame-visible", + ingredients = { + { data_util.mod_prefix .. "observation-frame-blank", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 8}, + }, + results = { + { data_util.mod_prefix .. "observation-frame-visible", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 8}, + }, + energy_required = math.ceil(2 + 100 / 3 * 1 / (obs_types["visible"][2] / obs_types["visible"][3])), -- base, size, results, required, success + main_product = data_util.mod_prefix .. "observation-frame-visible", + icon = "__space-exploration-graphics__/graphics/icons/observation-frame-visible.png", + icon_size = 64, icon_mipmaps = 1, + category = "space-observation-visible", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "observation-frame-infrared", + ingredients = { + { data_util.mod_prefix .. "observation-frame-blank", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 6}, + }, + results = { + { data_util.mod_prefix .. "observation-frame-infrared", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 6}, + }, + energy_required = math.ceil(2 + 100 / 3 * 1 / (obs_types["infrared"][2] / obs_types["infrared"][3])), -- base, size, results, required, success + main_product = data_util.mod_prefix .. "observation-frame-infrared", + icon = "__space-exploration-graphics__/graphics/icons/observation-frame-infrared.png", + icon_size = 64, icon_mipmaps = 1, + category = "space-observation-infrared", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "observation-frame-microwave", + ingredients = { + { data_util.mod_prefix .. "observation-frame-blank", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 5}, + }, + results = { + { data_util.mod_prefix .. "observation-frame-microwave", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 5}, + }, + energy_required = math.ceil(2 + 150 / 9 * 1 / (obs_types["microwave"][2] / obs_types["microwave"][3])), -- base, size, results, required, success + main_product = data_util.mod_prefix .. "observation-frame-microwave", + icon = "__space-exploration-graphics__/graphics/icons/observation-frame-microwave.png", + icon_size = 64, icon_mipmaps = 1, + category = "space-observation-microwave", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "observation-frame-radio", + ingredients = { + { data_util.mod_prefix .. "observation-frame-blank", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 4}, + }, + results = { + { data_util.mod_prefix .. "observation-frame-radio", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 4}, + }, + energy_required = math.ceil(2 + 150 / 9 * 1 / (obs_types["radio"][2] / obs_types["radio"][3])), -- base, size, results, required, success + main_product = data_util.mod_prefix .. "observation-frame-radio", + icon = "__space-exploration-graphics__/graphics/icons/observation-frame-radio.png", + icon_size = 64, icon_mipmaps = 1, + category = "space-observation-radio", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/particle-accelerator.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/particle-accelerator.lua new file mode 100644 index 0000000..c192f76 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/particle-accelerator.lua @@ -0,0 +1,72 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +-- accelerator +make_recipe({ + name = data_util.mod_prefix .. "ion-stream", + ingredients = { + { name = "copper-plate", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "plasma-stream", amount = 100}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "ion-stream", amount = 100}, + }, + energy_required = 10, + category = "space-accelerator", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "proton-stream", + ingredients = { + { name = "iron-plate", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "plasma-stream", amount = 100}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "proton-stream", amount = 100}, + }, + energy_required = 20, + category = "space-accelerator", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "particle-stream", + ingredients = { + { name = data_util.mod_prefix .. "material-testing-pack", amount = 1}, + { name = "sand", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "plasma-stream", amount = 100}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 200}, + }, + energy_required = 30, + category = "space-accelerator", + enabled = false, + always_show_made_in = true, +}) + +-- collider +make_recipe({ + name = data_util.mod_prefix .. "empty-antimatter-canister", + ingredients = { + { name = data_util.mod_prefix .. "antimatter-canister", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 100}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "antimatter-stream", amount=1000}, + { data_util.mod_prefix .. "magnetic-canister", 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 100}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "magnetic-canister"].icon, scale = 1, icon_size = 64 }, + { icon = data.raw.fluid[data_util.mod_prefix .. "antimatter-stream"].icon, scale = 1, icon_size = 64 }, + }, + subgroup = "space-fluids", + energy_required = 30, + category = "space-accelerator", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/particle-collider.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/particle-collider.lua new file mode 100644 index 0000000..a9a62d7 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/particle-collider.lua @@ -0,0 +1,245 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +-- collider +make_recipe({ + name = data_util.mod_prefix .. "antimatter-canister", + ingredients = { + { data_util.mod_prefix .. "magnetic-canister", 1}, + { type = "fluid", name = data_util.mod_prefix .. "antimatter-stream", amount=1000}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 100}, + }, + results = { + { name = data_util.mod_prefix .. "antimatter-canister", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 100}, + }, + energy_required = 4, + main_product = data_util.mod_prefix .. "antimatter-canister", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) + + +make_recipe({ + name = data_util.mod_prefix .. "atomic-data", + ingredients = { + { data_util.mod_prefix .. "material-testing-pack", 1}, + { data_util.mod_prefix .. "empty-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "ion-stream", amount=100}, + }, + results = { + { name = data_util.mod_prefix .. "atomic-data", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 8}, + }, + energy_required = 2, + main_product = data_util.mod_prefix .. "atomic-data", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "boson-data", + ingredients = { + { data_util.mod_prefix .. "empty-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 15}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "boson-data", amount_min = 1, amount_max = 1, probability = 0.2}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.79}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "boson-data", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "entanglement-data", + ingredients = { + { data_util.mod_prefix .. "empty-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "ion-stream", amount = 20}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "entanglement-data", amount_min = 1, amount_max = 1, probability = 0.2}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.79}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 4, + main_product = data_util.mod_prefix .. "entanglement-data", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "singularity-data", + ingredients = { + { data_util.mod_prefix .. "naquium-cube", 1}, + { data_util.mod_prefix .. "entanglement-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "singularity-data", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "naquium-cube", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.49}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "singularity-data", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "lepton-data", + ingredients = { + { data_util.mod_prefix .. "empty-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 20}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "lepton-data", amount_min = 1, amount_max = 1, probability = 0.4}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.59}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "lepton-data", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "magnetic-monopole-data", + ingredients = { + { data_util.mod_prefix .. "electromagnetic-field-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "proton-stream", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "magnetic-monopole-data", amount_min = 1, amount_max = 1, probability = 0.3}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.69}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "magnetic-monopole-data", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "micro-black-hole-data", + ingredients = { + { data_util.mod_prefix .. "empty-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "micro-black-hole-data", amount_min = 1, amount_max = 1, probability = 0.2}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.79}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "micro-black-hole-data", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "quark-data", + ingredients = { + { data_util.mod_prefix .. "empty-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "proton-stream", amount = 20}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "quark-data", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.49}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "quark-data", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "subatomic-data", + ingredients = { + { data_util.mod_prefix .. "empty-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "proton-stream", amount = 20}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "subatomic-data", amount_min = 1, amount_max = 1, probability = 0.6}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.39}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "subatomic-data", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "fusion-test-data", + ingredients = { + { name = data_util.mod_prefix .. "forcefield-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "proton-stream", amount = 50}, + }, + results = { + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1}, + }, + energy_required = 5, + category = "space-collider", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "particle-beam-shielding-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 10}, + { name = data_util.mod_prefix .. "space-platform-plating", amount = 1 }, + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "particle-beam-shielding-data", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 15}, + { name = data_util.mod_prefix .. "iridium-plate", amount_min = 1, amount_max = 1, probability = 0.2 }, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "particle-beam-shielding-data", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "annihilation-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "particle-stream", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "antimatter-stream", amount = 5 }, + }, + results = { + { name = data_util.mod_prefix .. "annihilation-data", amount = 1 }, + }, + energy_required = 5, + main_product = data_util.mod_prefix .. "annihilation-data", + category = "space-collider", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/plasma-generator.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/plasma-generator.lua new file mode 100644 index 0000000..454757a --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/plasma-generator.lua @@ -0,0 +1,50 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +-- plasma +make_recipe({ + name = data_util.mod_prefix .. "plasma-canister", + ingredients = { + { data_util.mod_prefix .. "magnetic-canister", 1}, + { type = "fluid", name = data_util.mod_prefix .. "plasma-stream", amount=1000}, + }, + results = { + { data_util.mod_prefix .. "plasma-canister", 1}, + }, + energy_required = 30, + category = "space-plasma", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "plasma-canister-empty", + ingredients = { + { data_util.mod_prefix .. "plasma-canister", 1}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "plasma-stream", amount=1000}, + { data_util.mod_prefix .. "magnetic-canister", 1}, + }, + main_product = data_util.mod_prefix .. "plasma-stream", + energy_required = 2, + category = "space-plasma", + enabled = false, + always_show_made_in = true, + localised_name = {"recipe-name." .. data_util.mod_prefix .. "plasma-canister-empty"} +}) + +make_recipe({ + name = data_util.mod_prefix .. "plasma-stream", + ingredients = { + { name = "stone", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "chemical-gel", amount = 10}, + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "plasma-stream", amount = 100}, + }, + energy_required = 30, + category = "space-plasma", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/platforms.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/platforms.lua new file mode 100644 index 0000000..24b8861 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/platforms.lua @@ -0,0 +1,51 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +data:extend({ + --[[{ + type = "recipe", + name = "starfield-sparse", + energy_required = 10, + category = "crafting", + ingredients = + { + {"iron-plate", 1} + }, + result= "space", + result_count = 10 + },]]-- + { + type = "recipe", + name = data_util.mod_prefix .. "space-platform-scaffold", + energy_required = 1, + category = "crafting", + ingredients = + { + {"steel-plate", 1}, + {"low-density-structure", 1}, + {data_util.mod_prefix .. "heat-shielding", 1}, + }, + energy_required = 10, + result = data_util.mod_prefix .. "space-platform-scaffold", + result_count = 1, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-platform-plating", + energy_required = 2, + category = "crafting", + ingredients = + { + {data_util.mod_prefix .. "space-platform-scaffold", 1}, + {data_util.mod_prefix .. "heavy-girder", 1}, + {"steel-plate", 4}, + }, + energy_required = 30, + result = data_util.mod_prefix .. "space-platform-plating", + result_count = 1, + enabled = false, + always_show_made_in = true, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/radiation-laboratory.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/radiation-laboratory.lua new file mode 100644 index 0000000..8760b00 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/radiation-laboratory.lua @@ -0,0 +1,79 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "radiation-shielding-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + { name = "uranium-235", amount = 1 }, + { name = data_util.mod_prefix .. "material-testing-pack", amount = 4 }, + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "radiation-shielding-data", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 8}, + { name = "uranium-235", amount_min = 1, amount_max = 1, probability = 0.5 }, + { name = data_util.mod_prefix .. "iridium-plate", amount_min = 1, amount_max = 1, probability = 0.75 }, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "radiation-shielding-data", + category = "space-radiation", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "radiation-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + { name = "uranium-235", amount = 1 }, + }, + results = { + { name = data_util.mod_prefix .. "radiation-data", amount = 1}, + { name = "uranium-235", amount_min = 1, amount_max = 1, probability = 0.5 }, + }, + energy_required = 8, + main_product = data_util.mod_prefix .. "radiation-data", + category = "space-radiation", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "radiation-exposure-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + { name = data_util.mod_prefix .. "specimen", amount = 1 }, + { name = "uranium-235", amount = 1 }, + }, + results = { + { name = data_util.mod_prefix .. "radiation-exposure-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 10}, + { name = "uranium-235", amount_min = 1, amount_max = 1, probability = 0.5 }, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "radiation-exposure-data", + category = "space-radiation", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "radiation-exposure-resistance-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + { name = data_util.mod_prefix .. "significant-specimen", amount = 1 }, + { name = "uranium-235", amount = 1 }, + }, + results = { + { name = data_util.mod_prefix .. "radiation-exposure-resistance-data", amount = 1}, + { name = data_util.mod_prefix .. "significant-specimen", amount_min = 1, amount_max = 1, probability = 0.5 }, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount_min = 1, amount_max = 10, probability = 1 }, + { name = "uranium-235", amount_min = 1, amount_max = 1, probability = 0.5 }, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "radiation-exposure-resistance-data", + category = "space-radiation", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/radiator.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/radiator.lua new file mode 100644 index 0000000..da25d29 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/radiator.lua @@ -0,0 +1,55 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "radiating-space-coolant-slow", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 500}, -- 2.5/s + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 499}, -- -0.2% + }, + energy_required = 200, + subgroup = "space-cooling", + category = "space-radiator", + localised_name = {"recipe-name." .. data_util.mod_prefix .. "radiating-space-coolant-slow"}, + enabled = false, + always_show_made_in = true, + order = "b-a", +}) + +make_recipe({ + name = data_util.mod_prefix .. "radiating-space-coolant-normal", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 50}, -- 5/s + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 49}, -- -2% + }, + energy_required = 10, + subgroup = "space-cooling", + category = "space-radiator", + localised_name = {"recipe-name." .. data_util.mod_prefix .. "radiating-space-coolant-normal"}, + enabled = false, + always_show_made_in = true, + order = "b-b", +}) + + + +make_recipe({ + name = data_util.mod_prefix .. "radiating-space-coolant-fast", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, -- 10/s + }, + results = { + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 9}, -- -10% + }, + energy_required = 1, + subgroup = "space-cooling", + category = "space-radiator", + localised_name = {"recipe-name." .. data_util.mod_prefix .. "radiating-space-coolant-fast"}, + enabled = false, + always_show_made_in = true, + order = "b-c", +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/recipe.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/recipe.lua new file mode 100644 index 0000000..5914a79 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/recipe.lua @@ -0,0 +1,728 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +if not data.raw.recipe["sand-from-stone"] then + data:extend({ + { + ingredients = { + { "stone", 1 } + }, + name = "sand-from-stone", + result = "sand", + result_count = 2, + type = "recipe", + enabled = false, + energy_required = 0.5, + } + }) +end +data:extend({ + { + ingredients = { + { "stone", 1 } + }, + name = data_util.mod_prefix .. "pulverised-sand", + result = "sand", + result_count = 3, + type = "recipe", + enabled = false, + energy_required = 0.5, + category = "pulverising", + --localised_name = {"recipe-name."..data_util.mod_prefix .. "pulverised-sand"}, + always_show_made_in = true, + } +}) + +if not data.raw.recipe["glass-from-sand"] then + data:extend({ + { + category = "smelting", + enabled = true, + energy_required = 4, + ingredients = { + { "sand", 4 } + }, + name = "glass-from-sand", + result = "glass", + type = "recipe", + enabled = false, + }, + }) +end + +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "low-density-structure-beryllium", + result = "low-density-structure", + energy_required = 10, + ingredients = { + { name = data_util.mod_prefix .. "aeroframe-scaffold", amount = 2}, + { name = "glass", amount = 2}, + { "steel-plate", 2 }, + { "plastic-bar", 2 } + }, + requester_paste_multiplier = 2, + enabled = false, + always_show_made_in = false, + allow_as_intermediate = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "heat-shielding", + result = data_util.mod_prefix .. "heat-shielding", + energy_required = 10, + ingredients = { + { name = "stone-tablet", amount = 20}, + { "sulfur", 8 }, + { "steel-plate", 2 } + }, + requester_paste_multiplier = 2, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "heat-shielding-iridium", + result = data_util.mod_prefix .. "heat-shielding", + energy_required = 10, + ingredients = { + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + { name = "stone-tablet", amount = 4}, + { "sulfur", 1 }, + }, + requester_paste_multiplier = 2, + enabled = false, + always_show_made_in = true, + allow_as_intermediate = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "processing-unit-holmium", + result = "processing-unit", + energy_required = 10, + ingredients = { + { "electronic-circuit", 10 }, + { "advanced-circuit", 1 }, + { name = data_util.mod_prefix .. "holmium-cable", amount = 4}, + { type = "fluid", name = "sulfuric-acid", amount = 2 }, + }, + requester_paste_multiplier = 3, + enabled = false, + always_show_made_in = true, + allow_as_intermediate = false, + category = "crafting-with-fluid", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "thruster-suit", + result = data_util.mod_prefix .. "thruster-suit", + enabled = false, + energy_required = 30, + ingredients = { + { "rocket-control-unit", 10 }, + { data_util.mod_prefix .. "heat-shielding", 20 }, + { "low-density-structure", 20 }, + { "glass", 20 }, + { "jetpack-1", 1 }, + { data_util.mod_prefix .. "lifesupport-equipment-1", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "thruster-suit-2", + results = { + { name=data_util.mod_prefix .. "thruster-suit-2", amount = 1}, + }, + main_product = data_util.mod_prefix .. "thruster-suit-2", + enabled = false, + energy_required = 30, + ingredients = { + { "processing-unit", 50 }, + { "rocket-fuel", 50 }, + { data_util.mod_prefix .. "iridium-plate", 50 }, + { data_util.mod_prefix .. "material-catalogue-1", 1 }, + { data_util.mod_prefix .. "thruster-suit", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "thruster-suit-3", + results = { + { name=data_util.mod_prefix .. "thruster-suit-3", amount = 1}, + }, + main_product = data_util.mod_prefix .. "thruster-suit-3", + enabled = false, + energy_required = 30, + ingredients = { + { "processing-unit", 100 }, + { "rocket-fuel", 50 }, + { data_util.mod_prefix .. "superconductive-cable", 50 }, + { data_util.mod_prefix .. "astronomic-catalogue-1", 1 }, + { data_util.mod_prefix .. "biological-catalogue-1", 1 }, + { data_util.mod_prefix .. "energy-catalogue-3", 1 }, + { data_util.mod_prefix .. "material-catalogue-3", 1 }, + { data_util.mod_prefix .. "aeroframe-bulkhead", 1 }, + { data_util.mod_prefix .. "thruster-suit-2", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "thruster-suit-4", + results = { + { name=data_util.mod_prefix .. "thruster-suit-4", amount = 1}, + }, + main_product = data_util.mod_prefix .. "thruster-suit-4", + enabled = false, + energy_required = 30, + ingredients = { + { "processing-unit", 200 }, + { data_util.mod_prefix .. "antimatter-canister", 10 }, + { data_util.mod_prefix .. "nanomaterial", 200 }, + { data_util.mod_prefix .. "superconductive-cable", 100 }, + { data_util.mod_prefix .. "naquium-plate", 100 }, + { data_util.mod_prefix .. "deep-catalogue-2", 1 }, + { data_util.mod_prefix .. "self-sealing-gel", 1 }, + { data_util.mod_prefix .. "lattice-pressure-vessel", 1 }, + { data_util.mod_prefix .. "naquium-processor", 1 }, + { data_util.mod_prefix .. "thruster-suit-3", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "rtg-equipment", + result = data_util.mod_prefix .. "rtg-equipment", + enabled = false, + energy_required = 10, + ingredients = { + { "processing-unit", 50 }, + { "low-density-structure", 50 }, + { "uranium-fuel-cell", 4 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "rtg-equipment-2", + result = data_util.mod_prefix .. "rtg-equipment-2", + enabled = false, + energy_required = 10, + ingredients = { + { "processing-unit", 50 }, + { "low-density-structure", 100 }, + { data_util.mod_prefix .."atomic-data", 1 }, + { data_util.mod_prefix .."radiation-data", 1 }, + { data_util.mod_prefix .. "rtg-equipment", 4 }, + { data_util.mod_prefix .. "holmium-solenoid", 8 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "adaptive-armour-equipment-1", + result = data_util.mod_prefix .. "adaptive-armour-equipment-1", + enabled = false, + energy_required = 10, + ingredients = { + { "steel-plate", 20 }, + { "advanced-circuit", 10 }, + { "battery", 5 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "adaptive-armour-equipment-2", + result = data_util.mod_prefix .. "adaptive-armour-equipment-2", + enabled = false, + energy_required = 10, + ingredients = { + { "steel-plate", 30 }, + { "processing-unit", 10 }, + { "low-density-structure", 10 }, + { data_util.mod_prefix .. "adaptive-armour-equipment-1", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "adaptive-armour-equipment-3", + result = data_util.mod_prefix .. "adaptive-armour-equipment-3", + enabled = false, + energy_required = 10, + ingredients = { + { "steel-plate", 40 }, + { "processing-unit", 10 }, + { data_util.mod_prefix .. "heat-shielding", 10 }, + { data_util.mod_prefix .. "adaptive-armour-equipment-2", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "adaptive-armour-equipment-4", + result = data_util.mod_prefix .. "adaptive-armour-equipment-4", + enabled = false, + energy_required = 10, + ingredients = { + { "steel-plate", 50 }, + { "processing-unit", 20 }, + { data_util.mod_prefix .. "heat-shielding", 20 }, + { data_util.mod_prefix .. "adaptive-armour-equipment-3", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "adaptive-armour-equipment-5", + result = data_util.mod_prefix .. "adaptive-armour-equipment-5", + enabled = false, + energy_required = 10, + ingredients = { + { "steel-plate", 40 }, + { "processing-unit", 30 }, + { data_util.mod_prefix .. "nanomaterial", 10 }, + { data_util.mod_prefix .. "adaptive-armour-equipment-4", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = "energy-shield-mk3-equipment", + result = "energy-shield-mk3-equipment", + enabled = false, + energy_required = 10, + ingredients = { + { "energy-shield-mk2-equipment", 5 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = "energy-shield-mk4-equipment", + result = "energy-shield-mk4-equipment", + enabled = false, + energy_required = 10, + ingredients = { + { "energy-shield-mk3-equipment", 5 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = "energy-shield-mk5-equipment", + result = "energy-shield-mk5-equipment", + enabled = false, + energy_required = 10, + ingredients = { + { "energy-shield-mk4-equipment", 5 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = "energy-shield-mk6-equipment", + result = "energy-shield-mk6-equipment", + enabled = false, + energy_required = 10, + ingredients = { + { "energy-shield-mk5-equipment", 5 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + + + + + { + type = "recipe", + name = data_util.mod_prefix .. "aeroframe-pole", + results = {{data_util.mod_prefix .. "aeroframe-pole", 2}}, + energy_required = 1, + ingredients = { + { data_util.mod_prefix .. "beryllium-plate", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + enabled = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "aeroframe-scaffold", + result = data_util.mod_prefix .. "aeroframe-scaffold", + energy_required = 2, + ingredients = { + { data_util.mod_prefix .. "aeroframe-pole", 2 }, + { data_util.mod_prefix .. "beryllium-plate", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + enabled = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "aeroframe-bulkhead", + result = data_util.mod_prefix .. "aeroframe-bulkhead", + energy_required = 4, + ingredients = { + { data_util.mod_prefix .. "aeroframe-scaffold", 1 }, + { "low-density-structure", 1 }, + { data_util.mod_prefix .. "beryllium-plate", 4 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + enabled = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "lattice-pressure-vessel", + result = data_util.mod_prefix .. "lattice-pressure-vessel", + energy_required = 3, + ingredients = { + { data_util.mod_prefix .. "beryllium-plate", 5 }, + { data_util.mod_prefix .. "cryonite-rod", 2 }, + { data_util.mod_prefix .. "vulcanite-block", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + enabled = false, + category="space-manufacturing" + }, + + { + type = "recipe", + name = data_util.mod_prefix .. "heavy-girder", + result = data_util.mod_prefix .. "heavy-girder", + energy_required = 1, + ingredients = { + { data_util.mod_prefix .. "iridium-plate", 2 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + enabled = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "heavy-bearing", + result = data_util.mod_prefix .. "heavy-bearing", + energy_required = 2, + ingredients = { + { data_util.mod_prefix .. "iridium-plate", 4 }, + { type="fluid", name="lubricant", amount=4 }, + }, + category="crafting-with-fluid", + requester_paste_multiplier = 1, + always_show_made_in = false, + enabled = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "heavy-composite", + result = data_util.mod_prefix .. "heavy-composite", + energy_required = 3, + ingredients = { + { data_util.mod_prefix .. "iridium-plate", 4 }, + { data_util.mod_prefix .. "heavy-girder", 2 }, + { data_util.mod_prefix .. "heat-shielding", 4 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + enabled = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "heavy-assembly", + result = data_util.mod_prefix .. "heavy-assembly", + energy_required = 4, + ingredients = { + { data_util.mod_prefix .. "iridium-plate", 4 }, + { data_util.mod_prefix .. "heavy-bearing", 4 }, + { "iron-gear-wheel", 4 }, + { type="fluid", name="lubricant", amount=4 }, + }, + category="crafting-with-fluid", + requester_paste_multiplier = 1, + always_show_made_in = false, + enabled = false, + }, + + + { + type = "recipe", + name = data_util.mod_prefix .. "vitalic-acid", + result = data_util.mod_prefix .. "vitalic-acid", + energy_required = 1, + ingredients = { + { "glass", 1 }, + { data_util.mod_prefix .. "vitamelange-extract", 2 }, + { type = "fluid", name = "sulfuric-acid", amount = 2 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + enabled = false, + category = "crafting-with-fluid", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "bioscrubber", + result = data_util.mod_prefix .. "bioscrubber", + energy_required = 2, + ingredients = { + { data_util.mod_prefix .. "vitalic-acid", 2 }, + { "glass", 1 }, + { "steel-plate", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category = "chemistry", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "vitalic-reagent", + result = data_util.mod_prefix .. "vitalic-reagent", + energy_required = 3, + ingredients = { + { data_util.mod_prefix .. "vitamelange-extract", 4 }, + { data_util.mod_prefix .. "vulcanite-block", 4 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category = "chemistry", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "vitalic-epoxy", + result = data_util.mod_prefix .. "vitalic-epoxy", + energy_required = 4, + ingredients = { + { data_util.mod_prefix .. "vitalic-reagent", 2 }, + { data_util.mod_prefix .. "vitalic-acid", 2 }, + { "sulfur", 4 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category = "chemistry", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "self-sealing-gel", + result = data_util.mod_prefix .. "self-sealing-gel", + energy_required = 5, + ingredients = { + { data_util.mod_prefix .. "vitalic-reagent", 2 }, + { data_util.mod_prefix .. "vitalic-epoxy", 2 }, + { data_util.mod_prefix .. "cryonite-rod", 2 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category = "space-biochemical", + }, + + + + + { + type = "recipe", + name = data_util.mod_prefix .. "holmium-cable", + results = {{data_util.mod_prefix .. "holmium-cable", 2}}, + energy_required = 1, + ingredients = { + { data_util.mod_prefix .. "holmium-plate", 1 }, + { "plastic-bar", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + enabled = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "holmium-solenoid", + result = data_util.mod_prefix .. "holmium-solenoid", + energy_required = 2, + ingredients = { + { data_util.mod_prefix .. "holmium-cable", 4 }, + { data_util.mod_prefix .. "holmium-plate", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + enabled = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "quantum-processor", + result = data_util.mod_prefix .. "quantum-processor", + energy_required = 3, + ingredients = { + { "processing-unit", 1 }, + { data_util.mod_prefix .. "holmium-cable", 4 }, + { data_util.mod_prefix .. "holmium-plate", 1 }, + {data_util.mod_prefix .. "quantum-phenomenon-data", 1}, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category="space-manufacturing" + }, + { + type = "recipe", + name = data_util.mod_prefix .. "dynamic-emitter", + result = data_util.mod_prefix .. "dynamic-emitter", + energy_required = 4, + ingredients = { + { data_util.mod_prefix .. "holmium-solenoid", 1 }, + { data_util.mod_prefix .. "quantum-processor", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category="space-manufacturing" + }, + + { + type = "recipe", + name = data_util.mod_prefix .. "naquium-cube", + result = data_util.mod_prefix .. "naquium-cube", + energy_required = 10, + ingredients = { + { type="fluid", name = data_util.mod_prefix .. "particle-stream", amount = 16 }, + { data_util.mod_prefix .. "naquium-plate", 16 }, + { data_util.mod_prefix .. "nanomaterial", 1 }, + { data_util.mod_prefix .. "vulcanite-block", 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category = "space-materialisation", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "naquium-tessaract", + main_product = data_util.mod_prefix .. "naquium-tessaract", + energy_required = 20, + ingredients = { + { data_util.mod_prefix .. "naquium-cube", 1 }, + { data_util.mod_prefix .. "naquium-plate", 16 }, + { data_util.mod_prefix .. "cryonite-rod", 4 }, + { name = data_util.mod_prefix .. "arcosphere-a", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-b", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "naquium-tessaract", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-d", amount= 1 }, + { name = data_util.mod_prefix .. "arcosphere-e", amount= 1 }, + { name = data_util.mod_prefix .. "arcosphere-f", amount= 1 }, + { name = data_util.mod_prefix .. "arcosphere-g", amount= 0 }, + { name = data_util.mod_prefix .. "arcosphere-h", amount= 0 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category = "arcosphere", + localised_description = {"space-exploration.arcosphere-random"} + }, + { + type = "recipe", + name = data_util.mod_prefix .. "naquium-tessaract-alt", + main_product = data_util.mod_prefix .. "naquium-tessaract", + energy_required = 20, + ingredients = { + { data_util.mod_prefix .. "naquium-cube", 1 }, + { data_util.mod_prefix .. "naquium-plate", 16 }, + { data_util.mod_prefix .. "cryonite-rod", 4 }, + { name = data_util.mod_prefix .. "arcosphere-a", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-b", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "naquium-tessaract", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-d", amount= 0 }, + { name = data_util.mod_prefix .. "arcosphere-e", amount= 0 }, + { name = data_util.mod_prefix .. "arcosphere-f", amount= 1 }, + { name = data_util.mod_prefix .. "arcosphere-g", amount= 1 }, + { name = data_util.mod_prefix .. "arcosphere-h", amount= 1 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category = "arcosphere", + localised_description = {"space-exploration.arcosphere-random"} + }, + { + type = "recipe", + name = data_util.mod_prefix .. "naquium-processor", + main_product = data_util.mod_prefix .. "naquium-processor", + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "quantum-processor", 1 }, + { data_util.mod_prefix .. "naquium-tessaract", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "neural-gel-2", amount = 4}, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-d", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-e", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-f", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-g", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-h", amount = 1}, + }, + results = { + {name = data_util.mod_prefix .. "naquium-processor", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-a", amount = 5}, + { name = data_util.mod_prefix .. "arcosphere-b", amount = 1}, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category = "arcosphere", + localised_description = {"space-exploration.arcosphere-random"} + }, + { + type = "recipe", + name = data_util.mod_prefix .. "naquium-processor-alt", + main_product = data_util.mod_prefix .. "naquium-processor", + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "quantum-processor", 1 }, + { data_util.mod_prefix .. "naquium-tessaract", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "neural-gel-2", amount = 4}, + { name = data_util.mod_prefix .. "arcosphere-c", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-d", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-e", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-f", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-g", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-h", amount = 1}, + }, + results = { + {name = data_util.mod_prefix .. "naquium-processor", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-a", amount = 1}, + { name = data_util.mod_prefix .. "arcosphere-b", amount = 5}, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + enabled = false, + category = "arcosphere", + localised_description = {"space-exploration.arcosphere-random"} + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/recycling-facility.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/recycling-facility.lua new file mode 100644 index 0000000..4d82044 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/recycling-facility.lua @@ -0,0 +1,185 @@ +-- NOTE: fluids x100 + +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "scrap-recycling", + ingredients = { + { data_util.mod_prefix .. "scrap", 1}, + }, + results = { + { name = "iron-ore", amount_min = 1, amount_max = 1, probability = 0.1}, + { name = "copper-ore", amount_min = 1, amount_max = 1, probability = 0.1}, + { name = "stone", amount_min = 1, amount_max = 1, probability = 0.1}, + { type = "fluid", name = "heavy-oil", amount_min = 1, amount_max = 1, probability = 0.1}, + }, + category = "hard-recycling", + subgroup = "space-recycling", + icons = data_util.transition_icons( + { + icon = data.raw.item[data_util.mod_prefix .. "scrap"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "scrap"].icon_size, scale = 0.5 + }, + { + {icon = data.raw.item["iron-ore"].icon, icon_size = data.raw.item["iron-ore"].icon_size, scale = 0.5}, + {icon = data.raw.item["copper-ore"].icon, icon_size = data.raw.item["copper-ore"].icon_size, scale = 0.5}, + {icon = data.raw.item["stone"].icon, icon_size = data.raw.item["stone"].icon_size, scale = 0.5}, + } + ), + energy_required = 1, + allow_as_intermediate = false, + enabled = false, + always_show_made_in = true, + allow_decomposition = false +}) + +make_recipe({ + name = data_util.mod_prefix .. "broken-data-scrapping", + ingredients = { + { data_util.mod_prefix .. "broken-data", 1} + }, + results = { + { data_util.mod_prefix .. "scrap", 5}, + }, + icon = "__space-exploration-graphics__/graphics/icons/scrap.png", + category = "hard-recycling", + subgroup = "space-recycling", + icons = data_util.transition_icons( + { + icon = data.raw.item[data_util.mod_prefix .. "broken-data"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "broken-data"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .. "scrap"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "scrap"].icon_size, scale = 0.5 + } + ), + energy_required = 5, + allow_as_intermediate = false, + localised_name = {"recipe-name." .. data_util.mod_prefix .. "broken-data-scrapping"}, + enabled = false, + always_show_made_in = true, + allow_decomposition = false +}) + +make_recipe({ + name = data_util.mod_prefix .. "empty-barrel-scrapping", + ingredients = { + { "empty-barrel", 1} + }, + results = { + { data_util.mod_prefix .. "scrap", 2}, + }, + icon = "__space-exploration-graphics__/graphics/icons/scrap.png", + category = "hard-recycling", + subgroup = "space-recycling", + icons = data_util.transition_icons( + { + icon = data.raw.item["empty-barrel"].icon, + icon_size = data.raw.item["empty-barrel"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .. "scrap"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "scrap"].icon_size, scale = 0.5 + } + ), + energy_required = 2, + allow_as_intermediate = false, + localised_name = {"recipe-name." .. data_util.mod_prefix .. "empty-barrel-scrapping"}, + enabled = false, + always_show_made_in = true, + allow_decomposition = false +}) + +make_recipe({ + name = data_util.mod_prefix .. "empty-barrel-reprocessing", + ingredients = { + { "empty-barrel", 1} + }, + results = { + { "steel-plate", 1}, + }, + icon = "__space-exploration-graphics__/graphics/icons/scrap.png", + category = "hard-recycling", + subgroup = "space-recycling", + icons = data_util.transition_icons( + { + icon = data.raw.item["empty-barrel"].icon, + icon_size = data.raw.item["empty-barrel"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item["steel-plate"].icon, + icon_size = data.raw.item["steel-plate"].icon_size, scale = 0.5 + } + ), + energy_required = 2, + allow_as_intermediate = false, + localised_name = {"recipe-name." .. data_util.mod_prefix .. "empty-barrel-reprocessing"}, + enabled = false, + always_show_made_in = true, + allow_decomposition = false +}) + +make_recipe({ + name = data_util.mod_prefix .. "space-capsule-scrapping", + ingredients = { + { data_util.mod_prefix .. "space-capsule", 1} + }, + results = { + { "solar-panel", 45}, + { "accumulator", 45}, + { data_util.mod_prefix .. "heat-shielding", 90}, + { "low-density-structure", 90}, + { "rocket-control-unit", 90}, + { data_util.mod_prefix .. "scrap", 1000}, + }, + icon = "__space-exploration-graphics__/graphics/icons/scrap.png", + category = "hard-recycling", + subgroup = "space-recycling", + icons = data_util.transition_icons( + { + icon = data.raw.item[data_util.mod_prefix .. "space-capsule"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "space-capsule"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .. "scrap"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "scrap"].icon_size, scale = 0.5 + } + ), + energy_required = 2, + allow_as_intermediate = false, + localised_name = {"recipe-name." .. data_util.mod_prefix .. "space-capsule-scrapping"}, + enabled = false, + always_show_made_in = true, + allow_decomposition = false +}) + +make_recipe({ + name = data_util.mod_prefix .. "cargo-pod-scrapping", + ingredients = { + { data_util.mod_prefix .. "cargo-rocket-cargo-pod", 1} + }, + results = { + { data_util.mod_prefix .. "scrap", 100}, + }, + icon = "__space-exploration-graphics__/graphics/icons/scrap.png", + category = "hard-recycling", + subgroup = "space-recycling", + icons = data_util.transition_icons( + { + icon = data.raw.item[data_util.mod_prefix .. "cargo-rocket-cargo-pod"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "cargo-rocket-cargo-pod"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .. "scrap"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "scrap"].icon_size, scale = 0.5 + } + ), + energy_required = 2, + allow_as_intermediate = false, + localised_name = {"recipe-name." .. data_util.mod_prefix .. "cargo-pod-scrapping"}, + enabled = false, + always_show_made_in = true, + allow_decomposition = false +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/resources.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/resources.lua new file mode 100644 index 0000000..4e073bb --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/resources.lua @@ -0,0 +1,934 @@ +local data_util = require("data_util") + + +data:extend({ + -- pulverising + { + type = "recipe", + category = "pulverising", + name = data_util.mod_prefix .. "beryllium-ore-crushed", + results = { + {name = data_util.mod_prefix .. "beryllium-ore-crushed", amount = 1} -- 2 + }, + energy_required = 1, + ingredients = { + {name = data_util.mod_prefix .. "beryllium-ore", amount = 2} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "beryllium-sulfate", + main_product = data_util.mod_prefix .. "beryllium-sulfate", + results = { + {name = data_util.mod_prefix .. "beryllium-sulfate", amount = 1}, -- 4 + {name = "sand", probability = 0.5, amount_min = 1, amount_max = 1,}, + {type = "fluid", name = "water", amount = 1, catalyst_amount = 1}, + }, + energy_required = 2, + ingredients = { + {type = "fluid", name="sulfuric-acid", amount = 2}, + {name = data_util.mod_prefix .. "beryllium-ore-crushed", amount = 2} + }, + enabled = false, + always_show_made_in = true, + crafting_machine_tint = { + primary = { + a = 1, + r = 0.338, + b = 0.482, + g = 0.965 + }, + quaternary = { + a = 1, + r = 0.191, + b = 0.763, + g = 0.939 + }, + secondary = { + a = 1, + r = 0.222, + b = 0.56, + g = 0.831 + }, + tertiary = { + a = 1, + r = 0.443, + b = 0.728, + g = 0.818, + } + }, + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "beryllium-hydroxide", + main_product = data_util.mod_prefix .. "beryllium-hydroxide", + results = { + {type = "fluid", name = data_util.mod_prefix .. "beryllium-hydroxide", amount = 200}, --1 + }, + energy_required = 30, + ingredients = { + {name = data_util.mod_prefix .. "cryonite-rod", amount = 1}, + {type = "fluid", name="water", amount = 150, catalyst_amount = 150}, + {name = data_util.mod_prefix .. "beryllium-sulfate", amount = 50} + }, + subgroup = "fluid-recipes", + enabled = false, + always_show_made_in = true, + crafting_machine_tint = { + primary = { + a = 1, + r = 0.338, + b = 0.482, + g = 0.965 + }, + quaternary = { + a = 1, + r = 0.191, + b = 0.763, + g = 0.939 + }, + secondary = { + a = 1, + r = 0.222, + b = 0.56, + g = 0.831 + }, + tertiary = { + a = 1, + r = 0.443, + b = 0.728, + g = 0.818, + } + }, + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "beryllium-powder", + main_product = data_util.mod_prefix .. "beryllium-powder", + results = { + {name = data_util.mod_prefix .. "beryllium-powder", amount = 1}, -- 2 + {type = "fluid", name = "water", amount = 1, catalyst_amount = 1}, + }, + energy_required = 1, + ingredients = { + {type = "fluid", name = data_util.mod_prefix .. "beryllium-hydroxide", amount = 2}, + }, + enabled = false, + always_show_made_in = true, + crafting_machine_tint = { + primary = { + a = 1, + r = 0.338, + b = 0.482, + g = 0.965 + }, + quaternary = { + a = 1, + r = 0.191, + b = 0.763, + g = 0.939 + }, + secondary = { + a = 1, + r = 0.222, + b = 0.56, + g = 0.831 + }, + tertiary = { + a = 1, + r = 0.443, + b = 0.728, + g = 0.818, + } + }, + }, + { + type = "recipe", + category = "smelting", + name = data_util.mod_prefix .. "beryllium-ingot", + results = { + {name = data_util.mod_prefix .. "beryllium-ingot", amount = 1}, -- 20 + }, + energy_required = 40, + ingredients = { + {name = data_util.mod_prefix .. "beryllium-powder", amount = 10}, + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "crafting", + name = data_util.mod_prefix .. "beryllium-plate", + results = { + {name = data_util.mod_prefix .. "beryllium-plate", amount = 4}, -- 5 + }, + energy_required = 8, + ingredients = { + {name = data_util.mod_prefix .. "beryllium-ingot", amount = 1} + }, + enabled = false, + always_show_made_in = true, + }, + + + { + type = "recipe", + category = "pulverising", + name = data_util.mod_prefix .. "cryonite-crushed", + results = { + {name = data_util.mod_prefix .. "cryonite-crushed", amount = 1} + }, + energy_required = 0.5, + ingredients = { + {name = data_util.mod_prefix .. "cryonite", amount = 2} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "pressure-washing", + name = data_util.mod_prefix .. "cryonite-washed", + main_product = data_util.mod_prefix .. "cryonite-washed", + results = { + {name = data_util.mod_prefix .. "cryonite-washed", amount = 2}, + {name = "stone", amount_min = 1, amount_max = 1, probability = 0.25}, + {type = "fluid", name="water", amount = 4, catalyst_amount = 4}, + }, + energy_required = 1, + ingredients = { + {type = "fluid", name="water", amount = 6, catalyst_amount = 6}, + {name = data_util.mod_prefix .. "cryonite-crushed", amount = 2} + }, + enabled = false, + always_show_made_in = true, + crafting_machine_tint = { + primary = { + a = 1, + r = 0.338, + g = 0.482, + b = 0.965 + }, + quaternary = { + a = 1, + r = 0.191, + g = 0.763, + b = 0.939 + }, + secondary = { + a = 1, + r = 0.222, + g = 0.56, + b = 0.831 + }, + tertiary = { + a = 1, + r = 0.443, + g = 0.728, + b = 0.818, + } + }, + }, + { + type = "recipe", + category = "smelting", + name = data_util.mod_prefix .. "cryonite-rod", + results = { + {name = data_util.mod_prefix .. "cryonite-rod", amount = 1}, + }, + energy_required = 5, + ingredients = { + {name = data_util.mod_prefix .. "cryonite-washed", amount = 1} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "cryonite-ion-exchange-beads", + results = { + {name = data_util.mod_prefix .. "cryonite-ion-exchange-beads", amount = 10}, + }, + energy_required = 10, + ingredients = { + {name = data_util.mod_prefix .. "cryonite-rod", amount = 1}, + {name = "plastic-bar", amount = 1}, + {type = "fluid", name = "sulfuric-acid", amount = 5}, + {type = "fluid", name = "steam", amount = 5}, + }, + crafting_machine_tint = { + primary = { + a = 1, + r = 0.338, + g = 0.482, + b = 0.965 + }, + quaternary = { + a = 1, + r = 0.191, + g = 0.763, + b = 0.939 + }, + secondary = { + a = 1, + r = 0.222, + g = 0.56, + b = 0.831 + }, + tertiary = { + a = 1, + r = 0.443, + g = 0.728, + b = 0.818, + } + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "cryonite-lubricant", + results = { + {type = "fluid", name = "lubricant", amount = 10}, + }, + energy_required = 5, + ingredients = { + {type = "fluid", name = data_util.mod_prefix .. "cryonite-slush", amount = 10}, + {type = "fluid", name = "heavy-oil", amount = 1}, + }, + subgroup = "fluid-recipes", + enabled = false, + always_show_made_in = true, + allow_as_intermediate = false + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "cryonite-slush", + results = { + {type = "fluid", name = data_util.mod_prefix .. "cryonite-slush", amount = 10}, + }, + energy_required = 5, + ingredients = { + {name = data_util.mod_prefix .. "cryonite-rod", amount = 1}, + {type = "fluid", name = "sulfuric-acid", amount = 1}, + }, + subgroup = "fluid-recipes", + enabled = false, + always_show_made_in = true, + allow_as_intermediate = false + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "cryonite-to-water-ice", + results = { + {name = data_util.mod_prefix .. "water-ice", amount = 1}, + }, + energy_required = 1, + ingredients = { + {type = "fluid", name = data_util.mod_prefix .. "cryonite-slush", amount = 1}, + {type = "fluid", name = "water", amount = 100}, + }, + subgroup = "fluid-recipes", + enabled = false, + always_show_made_in = true, + allow_as_intermediate = false + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "steam-to-water", + results = { + {type = "fluid", name = "water", amount = 99}, + }, + energy_required = 0.5, + ingredients = { + {type = "fluid", name = "steam", amount = 100}, + }, + subgroup = "fluid-recipes", + enabled = false, + always_show_made_in = true, + allow_as_intermediate = false + }, + + { + type = "recipe", + category = "pulverising", + name = data_util.mod_prefix .. "holmium-ore-crushed", + results = { + {name = data_util.mod_prefix .. "holmium-ore-crushed", amount = 1} + }, + energy_required = 1, + ingredients = { + {name = data_util.mod_prefix .. "holmium-ore", amount = 2} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "pressure-washing", + name = data_util.mod_prefix .. "holmium-ore-washed", + main_product = data_util.mod_prefix .. "holmium-ore-washed", + results = { + {name = data_util.mod_prefix .. "holmium-ore-washed", amount = 2}, + {name = "stone", amount_min = 1, amount_max = 1, probability = 0.25}, + }, + energy_required = 1, + ingredients = { + {type = "fluid", name="water", amount = 2, catalyst_amount = 2}, + {name = data_util.mod_prefix .. "holmium-ore-crushed", amount = 2} + }, + enabled = false, + always_show_made_in = true, + crafting_machine_tint = { + primary = { + a = 1, + g = 0.338, + b = 0.482, + r = 0.965 + }, + quaternary = { + a = 1, + g = 0.191, + b = 0.763, + r = 0.939 + }, + secondary = { + a = 1, + g = 0.222, + b = 0.56, + r = 0.831 + }, + tertiary = { + a = 1, + g = 0.443, + b = 0.728, + r = 0.818, + } + }, + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "holmium-powder", + main_product = data_util.mod_prefix .. "holmium-powder", + results = { + {name = data_util.mod_prefix .. "holmium-powder", probability = 0.5, amount_min = 1, amount_max = 1}, + {name = data_util.mod_prefix .. "vulcanite-ion-exchange-beads", probability = 0.5, amount_min = 1, amount_max = 1, catalyst_amount = 1}, + {name = data_util.mod_prefix .. "holmium-ore-washed", probability = 0.5, amount_min = 1, amount_max = 1, catalyst_amount = 1}, + {name = "sand", probability = 0.25, amount_min = 1, amount_max = 1, catalyst_amount = 1}, + }, + energy_required = 1, + ingredients = { + {type = "fluid", name="water", amount = 2, catalyst_amount = 2}, + {name = data_util.mod_prefix .. "vulcanite-ion-exchange-beads", amount = 1, catalyst_amount = 1,}, + {name = data_util.mod_prefix .. "holmium-ore-washed", amount = 1, catalyst_amount = 1,} + }, + enabled = false, + always_show_made_in = true, + crafting_machine_tint = { + primary = { + a = 1, + g = 0.338, + b = 0.482, + r = 0.965 + }, + quaternary = { + a = 1, + g = 0.191, + b = 0.763, + r = 0.939 + }, + secondary = { + a = 1, + g = 0.222, + b = 0.56, + r = 0.831 + }, + tertiary = { + a = 1, + g = 0.443, + b = 0.728, + r = 0.818, + } + }, + }, + { + type = "recipe", + category = "smelting", + name = data_util.mod_prefix .. "holmium-ingot", + results = { + {name = data_util.mod_prefix .. "holmium-ingot", amount = 1}, + }, + energy_required = 40, + ingredients = { + {name = data_util.mod_prefix .. "holmium-powder", amount = 10}, + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "crafting", + name = data_util.mod_prefix .. "holmium-plate", + results = { + {name = data_util.mod_prefix .. "holmium-plate", amount = 4}, + }, + energy_required = 8, + ingredients = { + {name = data_util.mod_prefix .. "holmium-ingot", amount = 1} + }, + enabled = false, + always_show_made_in = true, + }, + + { + type = "recipe", + category = "pulverising", + name = data_util.mod_prefix .. "iridium-ore-crushed", -- 2 + results = { + {name = data_util.mod_prefix .. "iridium-ore-crushed", amount = 1} + }, + energy_required = 1, + ingredients = { + {name = data_util.mod_prefix .. "iridium-ore", amount = 2} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "pressure-washing", + name = data_util.mod_prefix .. "iridium-ore-washed", -- 2 + main_product = data_util.mod_prefix .. "iridium-ore-washed", + results = { + {name = data_util.mod_prefix .. "iridium-ore-washed", amount = 2}, + {name = "stone", amount_min = 1, amount_max = 1, probability = 0.25}, + }, + energy_required = 1, + ingredients = { + {type = "fluid", name="water", amount = 2, catalyst_amount = 2}, + {name = data_util.mod_prefix .. "iridium-ore-crushed", amount = 2} + }, + enabled = false, + always_show_made_in = true, + crafting_machine_tint = { + primary = { + a = 1, + b = 0.338, + r = 0.482, + g = 0.965 + }, + quaternary = { + a = 1, + b = 0.191, + r = 0.763, + g = 0.939 + }, + secondary = { + a = 1, + b = 0.222, + r = 0.56, + g = 0.831 + }, + tertiary = { + a = 1, + b = 0.443, + r = 0.728, + g = 0.818, + } + }, + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "iridium-powder", -- 4 + main_product = data_util.mod_prefix .. "iridium-powder", + results = { + {name = data_util.mod_prefix .. "iridium-powder", probability = 0.5, amount_min = 1, amount_max = 1}, + {name = data_util.mod_prefix .. "cryonite-ion-exchange-beads", probability = 0.5, amount_min = 1, amount_max = 1, catalyst_amount = 1}, + {name = data_util.mod_prefix .. "iridium-ore-washed", probability = 0.5, amount_min = 1, amount_max = 1, catalyst_amount = 1}, + {name = "sand", probability = 0.25, amount_min = 1, amount_max = 1, catalyst_amount = 1}, + }, + energy_required = 1, + ingredients = { + {type = "fluid", name="water", amount = 2, catalyst_amount = 2}, + {name = data_util.mod_prefix .. "cryonite-ion-exchange-beads", amount = 1, catalyst_amount = 1,}, + {name = data_util.mod_prefix .. "iridium-ore-washed", amount = 1, catalyst_amount = 1,} + }, + enabled = false, + always_show_made_in = true, + crafting_machine_tint = { + primary = { + a = 1, + b = 0.338, + r = 0.482, + g = 0.965 + }, + quaternary = { + a = 1, + b = 0.191, + r = 0.763, + g = 0.939 + }, + secondary = { + a = 1, + b = 0.222, + r = 0.56, + g = 0.831 + }, + tertiary = { + a = 1, + b = 0.443, + r = 0.728, + g = 0.818, + } + }, + }, + { + type = "recipe", + category = "smelting", + name = data_util.mod_prefix .. "iridium-ingot", -- 40 + results = { + {name = data_util.mod_prefix .. "iridium-ingot", amount = 1}, + }, + energy_required = 40, + ingredients = { + {name = data_util.mod_prefix .. "iridium-powder", amount = 10}, + {name=data_util.mod_prefix .. "vulcanite-block", amount = 1}, + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "crafting", + name = data_util.mod_prefix .. "iridium-plate", -- 10 + results = { + {name = data_util.mod_prefix .. "iridium-plate", amount = 4}, + }, + energy_required = 8, + ingredients = { + {name = data_util.mod_prefix .. "iridium-ingot", amount = 1} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "pulverising", + name = data_util.mod_prefix .. "naquium-ore-crushed", + results = { + {name = data_util.mod_prefix .. "naquium-ore-crushed", amount = 1} + }, + energy_required = 2, + ingredients = { + {name = data_util.mod_prefix .. "naquium-ore", amount = 4} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "pressure-washing", + name = data_util.mod_prefix .. "naquium-ore-washed", + main_product = data_util.mod_prefix .. "naquium-ore-washed", + results = { + {name = data_util.mod_prefix .. "naquium-ore-washed", amount = 2}, + {name = "stone", amount_min = 1, amount_max = 1, probability = 0.25}, + }, + energy_required = 2, + ingredients = { + {type = "fluid", name="water", amount = 4}, + {name = data_util.mod_prefix .. "naquium-ore-crushed", amount = 2} + }, + enabled = false, + always_show_made_in = true, + crafting_machine_tint = { + primary = { + a = 1, + g = 0.338, + r = 0.482, + b = 0.965 + }, + quaternary = { + a = 1, + g = 0.191, + r = 0.763, + b = 0.939 + }, + secondary = { + a = 1, + g = 0.222, + r = 0.56, + b = 0.831 + }, + tertiary = { + a = 1, + g = 0.443, + r = 0.728, + b = 0.818, + } + }, + }, + { + type = "recipe", + category = "pressure-washing", + name = data_util.mod_prefix .. "naquium-powder", + main_product = data_util.mod_prefix .. "naquium-powder", + results = { + {name = data_util.mod_prefix .. "naquium-powder", amount = 1}, + {name = "sand", probability = 0.5, amount_min = 1, amount_max = 1,}, + {type="fluid", name = "water", amount = 2}, + }, + energy_required = 20, + ingredients = { + {name=data_util.mod_prefix .. "vitalic-acid", amount = 4}, + {name = data_util.mod_prefix .. "naquium-ore-washed", amount = 2} + }, + enabled = false, + always_show_made_in = true, + crafting_machine_tint = { + primary = { + a = 1, + g = 0.338, + r = 0.482, + b = 0.965 + }, + quaternary = { + a = 1, + g = 0.191, + r = 0.763, + b = 0.939 + }, + secondary = { + a = 1, + g = 0.222, + r = 0.56, + b = 0.831 + }, + tertiary = { + a = 1, + g = 0.443, + r = 0.728, + b = 0.818, + } + }, + }, + { + type = "recipe", + category = "smelting", + name = data_util.mod_prefix .. "naquium-ingot", + results = { + {name = data_util.mod_prefix .. "naquium-ingot", amount = 1}, + }, + energy_required = 60, + ingredients = { + {name = data_util.mod_prefix .. "naquium-powder", amount = 10}, + {name=data_util.mod_prefix .. "vulcanite-block", amount = 1}, + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "crafting", + name = data_util.mod_prefix .. "naquium-plate", + results = { + {name = data_util.mod_prefix .. "naquium-plate", amount = 4}, + }, + energy_required = 10, + ingredients = { + {name = data_util.mod_prefix .. "naquium-ingot", amount = 1} + }, + enabled = false, + always_show_made_in = true, + }, + + { + type = "recipe", + category = "pulverising", + name = data_util.mod_prefix .. "vitamelange-nugget", + results = { + {name = data_util.mod_prefix .. "vitamelange-nugget", amount = 2}, -- 0.5 + }, + energy_required = 1, + ingredients = { + {name = data_util.mod_prefix .. "vitamelange", amount = 1} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "smelting", + name = data_util.mod_prefix .. "vitamelange-roast", + results = { + {name = data_util.mod_prefix .. "vitamelange-roast", amount = 50} -- 1 + }, + energy_required = 100, + ingredients = { + {name=data_util.mod_prefix .. "vulcanite-block", amount = 1}, + {name = data_util.mod_prefix .. "vitamelange-nugget", amount = 100} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "crafting", + name = data_util.mod_prefix .. "vitamelange-spice", -- 2 + results = { + {name = data_util.mod_prefix .. "vitamelange-spice", amount_min=1, amount_max=1, probability=0.5}, + }, + energy_required = 1, + ingredients = { + {name = data_util.mod_prefix .. "vitamelange-roast", amount = 1} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "vitamelange-extract", -- 4 + results = { + {name = data_util.mod_prefix .. "vitamelange-extract", amount_min=1, amount_max=1, probability=0.5}, + }, + energy_required = 1, + ingredients = { + {name = data_util.mod_prefix .. "vitamelange-spice", amount = 1} + }, + enabled = false, + always_show_made_in = true, + }, + + + { + type = "recipe", + category = "pulverising", + name = data_util.mod_prefix .. "vulcanite-crushed", + results = { + {name = data_util.mod_prefix .. "vulcanite-crushed", amount = 1} + }, + energy_required = 0.5, + ingredients = { + {name = data_util.mod_prefix .. "vulcanite", amount = 2} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "pressure-washing", + name = data_util.mod_prefix .. "vulcanite-washed", + main_product = data_util.mod_prefix .. "vulcanite-washed", + results = { + {name = data_util.mod_prefix .. "vulcanite-washed", amount = 2}, + {name = "stone", amount_min = 1, amount_max = 1, probability = 0.25}, + {type = "fluid", name="steam", amount = 2, temperature = 165}, + }, + energy_required = 1, + ingredients = { + {type = "fluid", name="water", amount = 4}, + {name = data_util.mod_prefix .. "vulcanite-crushed", amount = 2} + }, + enabled = false, + always_show_made_in = true, + crafting_machine_tint = { + primary = { + a = 1, + b = 0.338, + r = 0.482, + g = 0.965 + }, + quaternary = { + a = 1, + b = 0.191, + r = 0.763, + g = 0.939 + }, + secondary = { + a = 1, + b = 0.222, + r = 0.56, + g = 0.831 + }, + tertiary = { + a = 1, + b = 0.443, + r = 0.728, + g = 0.818, + } + }, + }, + { + type = "recipe", + category = "crafting", + name = data_util.mod_prefix .. "vulcanite-block", + results = { + {name = data_util.mod_prefix .. "vulcanite-block", amount = 1}, + }, + energy_required = 1, + ingredients = { + {name = data_util.mod_prefix .. "vulcanite-washed", amount = 1} + }, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + category = "chemistry", + name = data_util.mod_prefix .. "vulcanite-ion-exchange-beads", + results = { + {name = data_util.mod_prefix .. "vulcanite-ion-exchange-beads", amount = 10}, + }, + energy_required = 10, + ingredients = { + {name = data_util.mod_prefix .. "vulcanite-block", amount = 1}, + {name = "plastic-bar", amount = 1}, + {type = "fluid", name = "sulfuric-acid", amount = 5}, + {type = "fluid", name = "steam", amount = 5}, + }, + crafting_machine_tint = { + primary = { + a = 1, + b = 0.338, + r = 0.482, + g = 0.965 + }, + quaternary = { + a = 1, + b = 0.191, + r = 0.763, + g = 0.939 + }, + secondary = { + a = 1, + b = 0.222, + r = 0.56, + g = 0.831 + }, + tertiary = { + a = 1, + b = 0.443, + r = 0.728, + g = 0.818, + } + }, + enabled = false, + always_show_made_in = true, + }, + + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/rocket-landing-pad.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/rocket-landing-pad.lua new file mode 100644 index 0000000..a564511 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/rocket-landing-pad.lua @@ -0,0 +1,32 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "rocket-landing-pad", + result = data_util.mod_prefix .. "rocket-landing-pad", + enabled = false, + energy_required = 20, + ingredients = { + { + "steel-plate", + 1000 + }, + { + "concrete", + 1000 + }, + { + "radar", + 10 + }, + { + "steel-chest", + 10 + }, + }, + requester_paste_multiplier = 1, + }, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/rocket-launch-pad.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/rocket-launch-pad.lua new file mode 100644 index 0000000..12cabd7 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/rocket-launch-pad.lua @@ -0,0 +1,63 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +data:extend({ + { + -- the dummy recipe for ethe rcoket silo section, required for launch + -- the component is inserted then the launch pad has the required parts. + type = "recipe", + name = data_util.mod_prefix .. "rocket-launch-pad-silo-dummy-recipe", + result = data_util.mod_prefix .. "rocket-launch-pad-silo-dummy-result-item", + category = "rocket-building", + enabled = false, + energy_required = 0.01, + hidden = true, + ingredients = { + { data_util.mod_prefix .. "rocket-launch-pad-silo-dummy-ingredient-item", 1 } -- could be anything really + }, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "rocket-launch-pad", + result = data_util.mod_prefix .. "rocket-launch-pad", + enabled = false, + energy_required = 30, + ingredients = { + { + "steel-plate", + 1000 + }, + { + "concrete", + 1000 + }, + { + "pipe", + 100 + }, + { + "storage-tank", + 10 + }, + { + "radar", + 10 + }, + { + "steel-chest", + 10 + }, + { + "processing-unit", + 200 + }, + { + "electric-engine-unit", + 200 + } + }, + requester_paste_multiplier = 1, + }, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/science-lab.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/science-lab.lua new file mode 100644 index 0000000..1c920ae --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/science-lab.lua @@ -0,0 +1,32 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "space-science-lab", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + {"lab", 10}, + {"low-density-structure", 40}, + {"processing-unit", 20}, + {"electric-engine-unit", 10}, + {"battery", 10}, + }, + results= + { + {name=data_util.mod_prefix .. "space-science-lab", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/space-science-lab.png", + icon_size = 64, + crafting_machine_tint = + { + primary = {r = 0.290, g = 0.027, b = 0.000, a = 0.000}, -- #49060000 + secondary = {r = 0.722, g = 0.465, b = 0.190, a = 0.000}, -- #b8763000 + tertiary = {r = 0.870, g = 0.365, b = 0.000, a = 0.000}, -- #dd5d0000 + }, + always_show_made_in = true, + } +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/science.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/science.lua new file mode 100644 index 0000000..ae39314 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/science.lua @@ -0,0 +1,601 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +data:extend({ + --[[{ + -- equivalent to 1 cargo rocket setion: (1/100) of a more expensive rocket + -- but gives 1/10 of a silo rocket launch, so around 2-5 times more efficient than silo rockets + type = "recipe", + name = "space-science-pack", + results = {{"space-science-pack", 100}}, + category = "space-manufacturing", + enabled = false, + energy_required = 20, + ingredients = { + { data_util.mod_prefix .. "heat-shielding", 10 }, + { "low-density-structure", 10 }, + { "rocket-control-unit", 10 }, + { data_util.mod_prefix .. "cargo-rocket-cargo-pod", 5 }, + { data_util.mod_prefix .. "cargo-rocket-fuel-tank", 1 } + }, + main_product = "space-science-pack", + requester_paste_multiplier = 1, + }, + { + -- this is much more efficient that rocket returns + type = "recipe", + name = "space-science-pack", + results = {{"space-science-pack", 4}}, + category = "space-crafting", + enabled = false, + energy_required = 20, + ingredients = { + { data_util.mod_prefix .. "heat-shielding", 1 }, + { "low-density-structure", 1 }, + { "battery", 5 }, + { "processing-unit", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "liquid-rocket-fuel", amount = 20 }, + }, + main_product = "space-science-pack", + requester_paste_multiplier = 1, + always_show_made_in = true, + },]]-- + { + type = "recipe", + name = data_util.mod_prefix .. "rocket-science-pack", + category = "space-manufacturing", + enabled = false, + energy_required = 100, + ingredients = { + { data_util.mod_prefix .. "satellite-telemetry", 1 }, + { "empty-barrel", 1}, + { "rocket-fuel", 1 }, + { data_util.mod_prefix .. "vulcanite-block", 1 }, + { data_util.mod_prefix .. "machine-learning-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "chemical-gel", amount = 2 }, + }, + results = { + {data_util.mod_prefix .. "rocket-science-pack", 10}, + { data_util.mod_prefix .."junk-data", 1}, + }, + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/deep-1.png", icon_size = 64}, + {icon = "__space-exploration-graphics__/graphics/icons/catalogue/mask-1.png", icon_size = 64}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "rocket-science-pack", + requester_paste_multiplier = 1, + always_show_made_in = true, + subgroup = "science-pack", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "astronomic-science-pack-1", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "astronomic-catalogue-1", 1 }, + { data_util.mod_prefix .. "beryllium-plate", 20 }, + { data_util.mod_prefix .. "astronomic-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "astronomic-science-pack-1", 2}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "astronomic-science-pack-1", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "astronomic-science-pack-1-no-beryllium", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "astronomic-catalogue-1", 2 }, + { data_util.mod_prefix .. "astronomic-insight", 2 }, + { data_util.mod_prefix .. "significant-data", 2 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "astronomic-science-pack-1", 1}, + { data_util.mod_prefix .. "junk-data", 12}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "astronomic-science-pack-1", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "astronomic-science-pack-2", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "astronomic-catalogue-2", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 2 }, + { data_util.mod_prefix .. "aeroframe-pole", 20 }, + { data_util.mod_prefix .. "astronomic-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "astronomic-science-pack-2", 4}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "astronomic-science-pack-2", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "astronomic-science-pack-3", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "astronomic-catalogue-3", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 4 }, + { data_util.mod_prefix .. "aeroframe-scaffold", 10 }, + { data_util.mod_prefix .. "astronomic-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "astronomic-science-pack-3", 6}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "astronomic-science-pack-3", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "astronomic-science-pack-4", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "astronomic-catalogue-4", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 6 }, + { data_util.mod_prefix .. "aeroframe-bulkhead", 2 }, + { data_util.mod_prefix .. "astronomic-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "astronomic-science-pack-4", 8}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "astronomic-science-pack-4", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "biological-science-pack-1", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "biological-catalogue-1", 1 }, + { data_util.mod_prefix .. "vitamelange-extract", 20 }, + { data_util.mod_prefix .. "biological-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "biological-science-pack-1", 2}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "biological-science-pack-1", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "biological-science-pack-2", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "biological-catalogue-2", 1 }, + { data_util.mod_prefix .. "biological-science-pack-1",2 }, + { data_util.mod_prefix .. "bioscrubber", 4 }, + { data_util.mod_prefix .. "biological-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "biological-science-pack-2", 4}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "biological-science-pack-2", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "biological-science-pack-3", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "biological-catalogue-3", 1 }, + { data_util.mod_prefix .. "biological-science-pack-2", 4 }, + { data_util.mod_prefix .. "vitalic-reagent", 4 }, + { data_util.mod_prefix .. "biological-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "biological-science-pack-3", 6}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "biological-science-pack-3", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "biological-science-pack-4", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "biological-catalogue-4", 1 }, + { data_util.mod_prefix .. "biological-science-pack-3", 6 }, + { data_util.mod_prefix .. "vitalic-epoxy", 2 }, + { data_util.mod_prefix .. "core-fragment-".. data_util.mod_prefix .."vitamelange", 1 }, + { data_util.mod_prefix .. "biological-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "biological-science-pack-4", 8}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "biological-science-pack-4", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "material-science-pack-1", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "material-catalogue-1", 1 }, + { data_util.mod_prefix .. "iridium-plate", 20 }, + { data_util.mod_prefix .. "material-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "material-science-pack-1", 2}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "material-science-pack-1", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "material-science-pack-2", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "material-catalogue-2", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 2 }, + { data_util.mod_prefix .. "heavy-girder", 10 }, + { data_util.mod_prefix .. "material-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "material-science-pack-2", 4}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "material-science-pack-2", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "material-science-pack-3", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "material-catalogue-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 4 }, + { data_util.mod_prefix .. "heavy-bearing", 6 }, + { data_util.mod_prefix .. "material-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "material-science-pack-3", 6}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "material-science-pack-3", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "material-science-pack-4", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "material-catalogue-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 6 }, + { data_util.mod_prefix .. "heavy-composite", 2 }, + { data_util.mod_prefix .. "material-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "material-science-pack-4", 8}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "material-science-pack-4", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "energy-science-pack-1", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "energy-catalogue-1", 1 }, + { data_util.mod_prefix .. "holmium-plate", 20 }, + { data_util.mod_prefix .. "energy-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "energy-science-pack-1", 2}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "energy-science-pack-1", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "energy-science-pack-2", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "energy-catalogue-2", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 2 }, + { data_util.mod_prefix .. "holmium-cable", 25 }, + { data_util.mod_prefix .. "energy-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "energy-science-pack-2", 4}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "energy-science-pack-2", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "energy-science-pack-3", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "energy-catalogue-3", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 4 }, + { data_util.mod_prefix .. "holmium-solenoid", 10 }, + { data_util.mod_prefix .. "energy-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "energy-science-pack-3", 6}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "energy-science-pack-3", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "energy-science-pack-4", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "energy-catalogue-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 6 }, + { data_util.mod_prefix .. "quantum-processor", 1 }, + { data_util.mod_prefix .. "energy-insight", 1 }, + { data_util.mod_prefix .. "significant-data", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "energy-science-pack-4", 8}, + { data_util.mod_prefix .. "junk-data", 6}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + icon_size = 64, + main_product = data_util.mod_prefix .. "energy-science-pack-4", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + --[[{ + type = "recipe", + name = data_util.mod_prefix .. "space-science-pack", + category = "space-manufacturing", + enabled = false, + energy_required = 20, + ingredients = { + { data_util.mod_prefix .. "significant-data", 100 }, + { data_util.mod_prefix .. "lifesupport-canister", 1 }, + { data_util.mod_prefix .. "space-mirror", 1 }, + { data_util.mod_prefix .. "space-platform-scaffold", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 100}, + }, + results = { + { data_util.mod_prefix .. "space-science-pack", 5}, + { data_util.mod_prefix .. "junk-data", 100}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 100}, + }, + icon = data.raw.tool[data_util.mod_prefix .. "space-science-pack"].icon, + icon_size = 64, + main_product = data_util.mod_prefix .. "space-science-pack", + requester_paste_multiplier = 1, + },]]-- + { + type = "recipe", + name = data_util.mod_prefix .. "deep-space-science-pack-1", + category = "space-manufacturing", + enabled = false, + energy_required = 60, + ingredients = { + { data_util.mod_prefix .. "significant-data", 1 }, + { data_util.mod_prefix .. "deep-catalogue-1", 1 }, + { name = data_util.mod_prefix .. "naquium-plate", amount = 10}, + { type = "fluid", name = data_util.mod_prefix .. "neural-gel-2", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 100}, + }, + results = { + { data_util.mod_prefix .. "deep-space-science-pack-1", 2}, + { data_util.mod_prefix .. "junk-data", 4}, + { data_util.mod_prefix .. "broken-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 100}, + }, + icon = data.raw.tool[data_util.mod_prefix .. "deep-space-science-pack-1"].icon, + icon_size = 64, + main_product = data_util.mod_prefix .. "deep-space-science-pack-1", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "deep-space-science-pack-2", + category = "space-manufacturing", + enabled = false, + energy_required = 120, + ingredients = { + { data_util.mod_prefix .. "deep-space-science-pack-1", 2}, + { data_util.mod_prefix .. "significant-data", 1 }, + { data_util.mod_prefix .. "deep-catalogue-2", 1 }, + { name = data_util.mod_prefix .. "naquium-cube", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "neural-gel-2", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 200}, + }, + results = { + { data_util.mod_prefix .. "deep-space-science-pack-2", 4}, + { data_util.mod_prefix .. "junk-data", 4}, + { data_util.mod_prefix .. "broken-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 200}, + }, + icon = data.raw.tool[data_util.mod_prefix .. "deep-space-science-pack-2"].icon, + icon_size = 64, + main_product = data_util.mod_prefix .. "deep-space-science-pack-2", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "deep-space-science-pack-3", + category = "space-manufacturing", + enabled = false, + energy_required = 180, + ingredients = { + { data_util.mod_prefix .. "deep-space-science-pack-2", 4}, + { data_util.mod_prefix .. "significant-data", 1 }, + { data_util.mod_prefix .. "deep-catalogue-3", 1 }, + { name = data_util.mod_prefix .. "naquium-tessaract", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "neural-gel-2", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 200}, + }, + results = { + { data_util.mod_prefix .. "deep-space-science-pack-3", 6}, + { data_util.mod_prefix .. "junk-data", 4}, + { data_util.mod_prefix .. "broken-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 200}, + }, + icon = data.raw.tool[data_util.mod_prefix .. "deep-space-science-pack-3"].icon, + icon_size = 64, + main_product = data_util.mod_prefix .. "deep-space-science-pack-3", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "deep-space-science-pack-4", + category = "space-manufacturing", + enabled = false, + energy_required = 240, + ingredients = { + { data_util.mod_prefix .. "deep-space-science-pack-3", 6}, + { data_util.mod_prefix .. "significant-data", 1 }, + { data_util.mod_prefix .. "deep-catalogue-4", 1 }, + { name = data_util.mod_prefix .. "naquium-processor", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "neural-gel-2", amount = 5}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 200}, + }, + results = { + { data_util.mod_prefix .. "deep-space-science-pack-4", 8}, + { data_util.mod_prefix .. "junk-data", 4}, + { data_util.mod_prefix .. "broken-data", 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 200}, + }, + icon = data.raw.tool[data_util.mod_prefix .. "deep-space-science-pack-4"].icon, + icon_size = 64, + main_product = data_util.mod_prefix .. "deep-space-science-pack-4", + requester_paste_multiplier = 1, + always_show_made_in = true, + }, + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/spaceship.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/spaceship.lua new file mode 100644 index 0000000..b8bda07 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/spaceship.lua @@ -0,0 +1,188 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-console", + energy_required = 30, + category = "crafting", + ingredients = + { + {data_util.mod_prefix .. "aeroframe-pole", 20}, + {"glass", 20}, + {"low-density-structure", 20}, + {"processing-unit", 200}, + {data_util.mod_prefix .. "astronomic-catalogue-3", 1}, + }, + result = data_util.mod_prefix .. "spaceship-console", + result_count = 1, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-floor", + energy_required = 10, + category = "crafting", + ingredients = + { + {data_util.mod_prefix .. "aeroframe-bulkhead", 4}, + {data_util.mod_prefix .. "heat-shielding", 4} + }, + result = data_util.mod_prefix .. "spaceship-floor", + result_count = 1, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-wall", + energy_required = 10, + category = "crafting", + ingredients = + { + {data_util.mod_prefix .. "aeroframe-bulkhead", 2}, + {"glass", 8}, + {"low-density-structure", 4}, + {data_util.mod_prefix .. "heat-shielding", 4} + }, + result = data_util.mod_prefix .. "spaceship-wall", + result_count = 1, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-gate", + energy_required = 10, + category = "crafting", + ingredients = + { + {data_util.mod_prefix .. "spaceship-wall", 1}, + {"electric-engine-unit", 6}, + {data_util.mod_prefix .. "aeroframe-bulkhead", 1}, + {data_util.mod_prefix .. "heat-shielding", 1} + -- TODO: add forcefield projector here + }, + result = data_util.mod_prefix .. "spaceship-gate", + result_count = 1, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-rocket-engine", + energy_required = 20, + category = "crafting", + ingredients = + { + {data_util.mod_prefix .. "aeroframe-scaffold", 4}, + {"steel-plate", 20}, + {data_util.mod_prefix .. "heat-shielding", 20}, + {data_util.mod_prefix .. "space-pipe", 20}, + {"electric-engine-unit", 10}, + }, + result = data_util.mod_prefix .. "spaceship-rocket-engine", + result_count = 1, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-rocket-engine-burn", + icon = "__space-exploration-graphics__/graphics/icons/spaceship-rocket-engine.png", + icon_size = 64, + order = "a", + subgroup = "spaceship-process", + energy_required = 0.1, + category = "spaceship-rocket-engine", + ingredients = + { + {type="fluid", name=data_util.mod_prefix .. "liquid-rocket-fuel", amount=5}, + }, + results = {}, + flags = {"hidden"}, + hidden = true, + enabled = true, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-rocket-booster-tank", + energy_required = 10, + category = "crafting", + ingredients = + { + {data_util.mod_prefix .. "aeroframe-scaffold", 4}, + {"steel-plate", 10}, + {"storage-tank", 10}, + {data_util.mod_prefix .. "heat-shielding", 10}, + {data_util.mod_prefix .. "space-pipe", 4}, + {"electric-engine-unit", 4}, + }, + result = data_util.mod_prefix .. "spaceship-rocket-booster-tank", + result_count = 1, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-antimatter-engine", + energy_required = 30, + category = "crafting", + ingredients = + { + {data_util.mod_prefix .. "lattice-pressure-vessel", 10}, + {data_util.mod_prefix .. "nanomaterial", 10}, + {data_util.mod_prefix .. "spaceship-rocket-engine", 1}, + {"low-density-structure", 100}, + {data_util.mod_prefix .. "heat-shielding", 100}, + {data_util.mod_prefix .. "superconductive-cable", 100}, + {data_util.mod_prefix .. "naquium-cube", 4}, + }, + result = data_util.mod_prefix .. "spaceship-antimatter-engine", + result_count = 1, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-antimatter-engine-burn", + icon = "__space-exploration-graphics__/graphics/icons/spaceship-antimatter-engine.png", + icon_size = 64, + order = "a", + subgroup = "spaceship-process", + energy_required = 0.5, + category = "spaceship-antimatter-engine", + ingredients = + { + {type="fluid", name=data_util.mod_prefix .. "antimatter-stream", amount=1}, + -- 10x energy density, 5 burn would be the same thrust, 25 is 5x faster + }, + results = {}, + flags = {"hidden"}, + hidden = true, + enabled = true, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "spaceship-antimatter-booster-tank", + energy_required = 20, + category = "crafting", + ingredients = + { + {data_util.mod_prefix .. "lattice-pressure-vessel", 10}, + {data_util.mod_prefix .. "nanomaterial", 10}, + {data_util.mod_prefix .. "spaceship-rocket-booster-tank", 1}, + {"low-density-structure", 50}, + {data_util.mod_prefix .. "heat-shielding", 50}, + {data_util.mod_prefix .. "superconductive-cable", 100}, + {data_util.mod_prefix .. "naquium-cube", 1}, + }, + result = data_util.mod_prefix .. "spaceship-antimatter-booster-tank", + result_count = 1, + enabled = false, + always_show_made_in = false, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/spectrometry-facility.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/spectrometry-facility.lua new file mode 100644 index 0000000..abaf53e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/spectrometry-facility.lua @@ -0,0 +1,36 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +make_recipe({ + name = data_util.mod_prefix .. "bio-spectral-data", + ingredients = { + { name = data_util.mod_prefix .. "specimen", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "bio-spectral-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "bio-spectral-data", + category = "space-spectrometry", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "ion-spectrometry-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "ion-stream", amount = 40}, + }, + results = { + { name = data_util.mod_prefix .. "ion-spectrometry-data", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.49}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "ion-spectrometry-data", + category = "space-spectrometry", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/structures.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/structures.lua new file mode 100644 index 0000000..be661b7 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/structures.lua @@ -0,0 +1,1002 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "fuel-refinery", + result = data_util.mod_prefix .. "fuel-refinery", + enabled = false, + energy_required = 10, + ingredients = { + { "glass", 20 }, + { "steel-plate", 20 }, + { "stone-brick", 20 }, + { "pipe", 20 }, + { "iron-gear-wheel", 20 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "fluid-burner-generator", + result = data_util.mod_prefix .. "fluid-burner-generator", + enabled = false, + energy_required = 5, + ingredients = { + { "steel-plate", 10 }, + { "copper-plate", 30 }, + { "pipe", 30 }, + { "iron-gear-wheel", 20 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "antimatter-reactor", + result = data_util.mod_prefix .. "antimatter-reactor", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "energy-catalogue-4", 5 }, + { data_util.mod_prefix .. "heat-shielding", 500 }, + { "low-density-structure", 500 }, + { "processing-unit", 500 }, + { data_util.mod_prefix .. "superconductive-cable", 500 }, + { name = data_util.mod_prefix .. "naquium-cube", amount = 50}, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "naquium-heat-pipe", + result = data_util.mod_prefix .. "naquium-heat-pipe", + enabled = false, + energy_required = 5, + ingredients = { + { data_util.mod_prefix .. "superconductive-cable", 1 }, + { name = data_util.mod_prefix .. "naquium-plate", amount = 4}, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "dimensional-anchor", + result = data_util.mod_prefix .. "dimensional-anchor", + enabled = false, + energy_required = 30, + ingredients = { + { data_util.mod_prefix .. "deep-catalogue-3", 4 }, + { data_util.mod_prefix .. "heavy-assembly", 100 }, + { data_util.mod_prefix .. "lattice-pressure-vessel", 100 }, + { data_util.mod_prefix .. "superconductive-cable", 500 }, + { name = data_util.mod_prefix .. "naquium-tessaract", amount = 8}, + {data_util.mod_prefix .. "quantum-processor", 8}, + }, + requester_paste_multiplier = 1, + category = "space-manufacturing", + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "meteor-point-defence", + result = data_util.mod_prefix .. "meteor-point-defence", + enabled = false, + energy_required = 30, + ingredients = { + { "electronic-circuit", 40 }, + { "steel-plate", 40 }, + { "concrete", 40 }, + { "glass", 20 }, + { "iron-gear-wheel", 20 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "meteor-point-defence-ammo", + result = data_util.mod_prefix .. "meteor-point-defence-ammo", + enabled = false, + energy_required = 10, + ingredients = { + { "steel-plate", 8 }, + { "coal", 4 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "meteor-defence", + result = data_util.mod_prefix .. "meteor-defence", + enabled = false, + energy_required = 30, + ingredients = { + { "processing-unit", 100 }, + { "copper-cable", 100 }, + { "steel-plate", 100 }, + { "concrete", 100 }, + { "glass", 50 }, + { "battery", 50 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "meteor-defence-ammo", + result = data_util.mod_prefix .. "meteor-defence-ammo", + enabled = false, + energy_required = 10, + ingredients = { + { "steel-plate", 10 }, + { "electronic-circuit", 10 }, + { "battery", 10 }, + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "pulveriser", + category = "crafting", + enabled = false, + energy_required = 30, + ingredients = { + {"steel-plate", 15}, + {"iron-plate", 15}, + {"pipe", 15}, + {"concrete", 15}, + }, + results= + { + {name = data_util.mod_prefix .. "pulveriser", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/pulveriser.png", + icon_size = 64, + order = "g-z[pulveriser]", + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "addon-power-pole", + category = "crafting", + enabled = false, + energy_required = 2, + ingredients = { + {data_util.mod_prefix .. "aeroframe-pole", 4}, + {data_util.mod_prefix .. "holmium-cable", 8}, + }, + results= + { + {name = data_util.mod_prefix .. "addon-power-pole", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/addon-power-pole.png", + icon_size = 64, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "pylon", + category = "crafting", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "beryllium-plate", 8}, + {data_util.mod_prefix .. "aeroframe-pole", 1}, + {data_util.mod_prefix .. "holmium-cable", 16}, + {"concrete", 16}, + }, + results= + { + {name = data_util.mod_prefix .. "pylon", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/pylon.png", + icon_size = 64, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "pylon-substation", + category = "crafting", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "pylon", 1}, + {data_util.mod_prefix .. "holmium-solenoid", 4}, + {"processing-unit", 16}, + {"battery", 16}, + }, + results= + { + {name = data_util.mod_prefix .. "pylon-substation", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/pylon-substation.png", + icon_size = 64, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "pylon-construction", + category = "crafting", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "pylon", 1}, + {data_util.mod_prefix .. "aeroframe-scaffold", 4}, + {data_util.mod_prefix .. "holmium-solenoid", 4}, + {data_util.mod_prefix .. "heavy-girder", 4}, + {"processing-unit", 16}, + {"battery", 16}, + }, + results= + { + {name = data_util.mod_prefix .. "pylon-construction", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/pylon-construction.png", + icon_size = 64, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "pylon-construction-radar", + category = "crafting", + enabled = false, + energy_required = 10, + ingredients = { + {"radar", 1}, + {data_util.mod_prefix .. "pylon-construction", 1}, + {data_util.mod_prefix .. "aeroframe-bulkhead", 4}, + {data_util.mod_prefix .. "heavy-bearing", 4}, + {data_util.mod_prefix .. "quantum-processor", 4}, + {"battery", 16}, + }, + results= + { + {name = data_util.mod_prefix .. "pylon-construction-radar", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/pylon-construction-radar.png", + icon_size = 64, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-assembling-machine", + category = "crafting", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "heat-shielding", 4}, + {"low-density-structure", 8}, + {"electric-engine-unit", 8}, + {"processing-unit", 4}, + }, + results= + { + {name = data_util.mod_prefix .. "space-assembling-machine", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/assembling-machine.png", + icon_size = 64, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-astrometrics-laboratory", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {"low-density-structure", 40}, + {"electric-engine-unit", 8}, + {"advanced-circuit", 40}, + {"processing-unit", 20}, + }, + results= + { + {name = data_util.mod_prefix .. "space-astrometrics-laboratory", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/astrometrics-laboratory.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-biochemical-laboratory", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {"chemical-plant", 3}, + {"low-density-structure", 60}, + {"glass", 100}, + {"pump", 4}, + {"electric-engine-unit", 6}, + }, + results= + { + {name = data_util.mod_prefix .. "space-biochemical-laboratory", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/biochemical-laboratory.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-decontamination-facility", + category = "space-crafting", + enabled = false, + energy_required = 10, + ingredients = { + {"chemical-plant", 1}, + {"low-density-structure", 40}, + {data_util.mod_prefix .. "space-pipe", 10}, + {"electric-engine-unit", 6}, + {data_util.mod_prefix .. "vulcanite-block", 1}, + }, + results= + { + {name = data_util.mod_prefix .. "space-decontamination-facility", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/decontamination-facility.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-electromagnetics-laboratory", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 2}, + {"low-density-structure", 60}, + {"accumulator", 20}, + {"processing-unit", 20}, + }, + results= + { + {name = data_util.mod_prefix .. "space-electromagnetics-laboratory", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/electromagnetics-laboratory.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-genetics-laboratory", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {"low-density-structure", 80}, + {"glass", 80}, + {"electric-engine-unit", 20}, + {"processing-unit", 20}, + {data_util.mod_prefix .. "nutrient-vat", 20}, + }, + results= + { + {name = data_util.mod_prefix .. "space-genetics-laboratory", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/genetics-laboratory.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-gravimetrics-laboratory", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {"low-density-structure", 40}, + {"electric-engine-unit", 8}, + {"advanced-circuit", 40}, + {"processing-unit", 20}, + }, + results= + { + {name = data_util.mod_prefix .. "space-gravimetrics-laboratory", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/gravimetrics-laboratory.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-growth-facility", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {"low-density-structure", 40}, + {"pump", 4}, + {"small-lamp", 100}, + {"glass", 400}, + }, + results= + { + {name = data_util.mod_prefix .. "space-growth-facility", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/growth-facility.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-hypercooler", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {"storage-tank", 1}, + {"pump", 4}, + {"electric-engine-unit", 4}, + {"low-density-structure", 20}, + {data_util.mod_prefix .. "space-pipe", 10}, + }, + results= + { + {name = data_util.mod_prefix .. "space-hypercooler", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/hypercooler.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-laser-laboratory", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {"low-density-structure", 60}, + {"glass", 80}, + {"accumulator", 20}, + {"processing-unit", 20}, + }, + results= + { + {name = data_util.mod_prefix .. "space-laser-laboratory", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/laser-laboratory.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "lifesupport-facility", + category = "crafting", + enabled = false, + energy_required = 10, + ingredients = { + {"assembling-machine-2", 1}, + {"low-density-structure", 40}, + {"pump", 1}, + {"pipe", 40}, + {"electric-engine-unit", 6}, + }, + results= + { + {name = data_util.mod_prefix .. "lifesupport-facility", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/lifesupport-facility.png", + icon_size = 64, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-manufactory", + category = "space-crafting", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 4}, + {"fast-inserter", 8}, + {data_util.mod_prefix .. "heat-shielding", 8}, + {"electric-engine-unit", 32}, + {"low-density-structure", 80}, + {type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 8}, + }, + results= + { + {name = data_util.mod_prefix .. "space-manufactory", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/manufactory.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-mechanical-laboratory", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 4}, + {"low-density-structure", 60}, + {"steel-plate", 100}, + {"concrete", 100}, + {"electric-engine-unit", 40}, + {"gun-turret", 10}, + }, + results= + { + {name = data_util.mod_prefix .. "space-mechanical-laboratory", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/mechanical-laboratory.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-particle-accelerator", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {"low-density-structure", 60}, + {"laser-turret", 6}, + {"accumulator", 20}, + {"processing-unit", 20}, + }, + results= + { + {name = data_util.mod_prefix .. "space-particle-accelerator", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/particle-accelerator.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-particle-collider", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {"low-density-structure", 60}, + {"laser-turret", 6}, + {"accumulator", 20}, + {data_util.mod_prefix .. "heat-shielding", 20}, + {data_util.mod_prefix .. "holmium-cable", 100}, + }, + results= + { + {name = data_util.mod_prefix .. "space-particle-collider", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/particle-collider.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-plasma-generator", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {"chemical-plant", 1}, + {"low-density-structure", 60}, + {"electric-furnace", 4}, + {data_util.mod_prefix .. "heat-shielding", 20}, + }, + results= + { + {name = data_util.mod_prefix .. "space-plasma-generator", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/plasma-generator.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-radiation-laboratory", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {"uranium-fuel-cell", 4}, + {"chemical-plant", 4}, + {"low-density-structure", 60}, + {data_util.mod_prefix .. "heat-shielding", 20}, + {"steel-plate", 100}, + {"glass", 80}, + }, + results= + { + {name = data_util.mod_prefix .. "space-radiation-laboratory", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/radiation-laboratory.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-radiator", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {"pump", 4}, + {"electric-engine-unit", 4}, + {"steel-plate", 20}, + {data_util.mod_prefix .. "space-pipe", 4}, + {"copper-cable", 200}, + }, + results= + { + {name = data_util.mod_prefix .. "space-radiator", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/radiator.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-radiator-2", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-radiator", 1}, + {data_util.mod_prefix .. "cryonite-rod", 16}, + {data_util.mod_prefix .. "beryllium-plate", 16}, + }, + results= + { + {name = data_util.mod_prefix .. "space-radiator-2", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/radiator-blue.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "recycling-facility", + category = "crafting", + enabled = false, + energy_required = 10, + ingredients = { + {"steel-plate", 20}, + {"advanced-circuit", 10}, + {"electric-engine-unit", 10}, + {"concrete", 20}, + {data_util.mod_prefix .. "heat-shielding", 10}, + }, + results= + { + {name = data_util.mod_prefix .. "recycling-facility", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/recycling-facility.png", + icon_size = 64, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-material-fabricator", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-particle-collider", 1}, + {data_util.mod_prefix .. "space-manufactory", 1}, + {data_util.mod_prefix .. "space-thermodynamics-laboratory", 1}, + {"speed-module-6", 5}, + {"effectivity-module-6", 5}, + }, + results= + { + {name = data_util.mod_prefix .. "space-material-fabricator", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/material-fabricator.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-supercomputer-1", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {"low-density-structure", 40}, + {"processing-unit", 100}, + }, + results= + { + {name = data_util.mod_prefix .. "space-supercomputer-1", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-1.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-supercomputer-2", + category = "space-manufacturing", + enabled = false, + energy_required = 20, + ingredients = { + {data_util.mod_prefix .. "space-supercomputer-1", 1}, + {"processing-unit", 500}, + {data_util.mod_prefix .. "quantum-processor", 50}, + }, + results= + { + {name = data_util.mod_prefix .. "space-supercomputer-2", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-2.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-supercomputer-3", + category = "space-manufacturing", + enabled = false, + energy_required = 30, + ingredients = { + {data_util.mod_prefix .. "space-supercomputer-2", 1}, + {"processing-unit", 1000}, + {data_util.mod_prefix .. "superconductive-cable", 100}, + {type = "fluid", name = data_util.mod_prefix .. "neural-gel-2", amount = 1000}, + {data_util.mod_prefix .. "bioelectrics-data", 100}, + }, + results= + { + {name = data_util.mod_prefix .. "space-supercomputer-3", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-3.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-supercomputer-4", + category = "space-manufacturing", + enabled = false, + energy_required = 40, + ingredients = { + {data_util.mod_prefix .. "space-supercomputer-3", 1}, + {type = "fluid", name = data_util.mod_prefix .. "neural-gel-2", amount = 1000}, + {data_util.mod_prefix .. "naquium-processor", 42}, + }, + results= + { + {name = data_util.mod_prefix .. "space-supercomputer-4", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/supercomputer-4.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-telescope", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {data_util.mod_prefix .. "space-mirror", 2}, + {"low-density-structure", 40}, + {"glass", 40}, + }, + results= + { + {name = data_util.mod_prefix .. "space-telescope", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/telescope.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-telescope-radio", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {"radar", 10}, + {data_util.mod_prefix .. "space-mirror", 10}, + {"low-density-structure", 120}, + {data_util.mod_prefix .. "aeroframe-scaffold", 120}, + }, + results= + { + {name = data_util.mod_prefix .. "space-telescope-radio", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/telescope-radio.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-telescope-microwave", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {data_util.mod_prefix .. "space-mirror", 6}, + {"low-density-structure", 80}, + {"glass", 80}, + {data_util.mod_prefix .. "aeroframe-pole", 120}, + }, + results= + { + {name = data_util.mod_prefix .. "space-telescope-microwave", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/telescope-microwave.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-telescope-xray", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {data_util.mod_prefix .. "space-mirror", 6}, + {data_util.mod_prefix .. "heat-shielding", 6}, + {"low-density-structure", 60}, + {data_util.mod_prefix .. "aeroframe-pole", 60}, + }, + results= + { + {name = data_util.mod_prefix .. "space-telescope-xray", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/telescope-xray.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-telescope-gammaray", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {data_util.mod_prefix .. "heat-shielding", 6}, + {data_util.mod_prefix .. "space-mirror", 24}, + {"low-density-structure", 60}, + {data_util.mod_prefix .. "aeroframe-scaffold", 60}, + }, + results= + { + {name = data_util.mod_prefix .. "space-telescope-gammaray", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/telescope-gammaray.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "space-thermodynamics-laboratory", + category = "space-manufacturing", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "space-assembling-machine", 1}, + {"chemical-plant", 1}, + {"electric-furnace", 1}, + {"low-density-structure", 60}, + {data_util.mod_prefix .. "heat-shielding", 60}, + {"steel-plate", 100}, + {"storage-tank", 8}, + }, + results= + { + {name = data_util.mod_prefix .. "space-thermodynamics-laboratory", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/thermodynamics-laboratory.png", + icon_size = 64, + enabled = false, + always_show_made_in = true, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "supercharger", + category = "crafting", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "aeroframe-scaffold", 4}, + {data_util.mod_prefix .. "heavy-girder", 4}, + {data_util.mod_prefix .. "holmium-solenoid", 16}, + {data_util.mod_prefix .. "holmium-cable", 16}, + {"battery", 16}, + }, + results= + { + {name = data_util.mod_prefix .. "supercharger", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/supercharger.png", + icon_size = 64, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "wide-beacon", + enabled = false, + energy_required = 10, + ingredients = { + {"beacon", 1}, + {data_util.mod_prefix .. "energy-catalogue-1", 1}, + {data_util.mod_prefix .. "holmium-solenoid", 2}, + {"low-density-structure", 60}, + {"processing-unit", 60}, + {data_util.mod_prefix .. "holmium-cable", 200}, + }, + results= + { + {name = data_util.mod_prefix .. "wide-beacon", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/wide-beacon.png", + icon_size = 64, + enabled = false, + always_show_made_in = false, + }, + { + type = "recipe", + name = data_util.mod_prefix .. "wide-beacon-2", + enabled = false, + energy_required = 10, + ingredients = { + {data_util.mod_prefix .. "wide-beacon", 1}, + {data_util.mod_prefix .. "deep-catalogue-1", 1}, + {data_util.mod_prefix .. "superconductive-cable", 10}, + {data_util.mod_prefix .. "dynamic-emitter", 10}, + {data_util.mod_prefix .. "naquium-tessaract", 10}, + }, + results= + { + {name = data_util.mod_prefix .. "wide-beacon-2", amount=1} + }, + icon = "__space-exploration-graphics__/graphics/icons/wide-beacon-2.png", + icon_size = 64, + enabled = false, + always_show_made_in = false, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/supercomputing.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/supercomputing.lua new file mode 100644 index 0000000..25cf737 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/supercomputing.lua @@ -0,0 +1,1325 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +-- formating (junk) +make_recipe({ + name = data_util.mod_prefix .. "formatting-1", + ingredients = { + { name = data_util.mod_prefix .. "junk-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "empty-data", amount_min = 1, amount_max = 1, probability = 0.7 }, + { name = data_util.mod_prefix .. "broken-data", amount_min = 1, amount_max = 1, probability = 0.29 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 1}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/junk.png", scale = 0.85, shift = {2, -4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "space-supercomputer-1"].icon, scale = 0.5, shift = {-24, 24}, icon_size = 64 }, + }, + energy_required = 1.5, + subgroup = "data-generic", + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "formatting-2", + ingredients = { + { name = data_util.mod_prefix .. "junk-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "empty-data", amount_min = 1, amount_max = 1, probability = 0.8 }, + { name = data_util.mod_prefix .. "broken-data", amount_min = 1, amount_max = 1, probability = 0.19 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 1}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/junk.png", scale = 0.85, shift = {2, -4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "space-supercomputer-2"].icon, scale = 0.5, shift = {-24, 24}, icon_size = 64 }, + }, + energy_required = 4, + subgroup = "data-generic", + category = "space-supercomputing-2", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "formatting-3", + ingredients = { + { name = data_util.mod_prefix .. "junk-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "empty-data", amount_min = 1, amount_max = 1, probability = 0.9 }, + { name = data_util.mod_prefix .. "broken-data", amount_min = 1, amount_max = 1, probability = 0.09 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 1}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/junk.png", scale = 0.85, shift = {2, -4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "space-supercomputer-3"].icon, scale = 0.5, shift = {-24, 24}, icon_size = 64 }, + }, + energy_required = 10, + subgroup = "data-generic", + category = "space-supercomputing-3", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "formatting-4", + ingredients = { + { name = data_util.mod_prefix .. "junk-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 1}, + { name = data_util.mod_prefix .. "cryonite-rod", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "empty-data", amount_min = 1, amount_max = 1, probability = 0.95 }, + { name = data_util.mod_prefix .. "broken-data", amount_min = 1, amount_max = 1, probability = 0.05 }, + { name = data_util.mod_prefix .. "cryonite-rod", amount_min = 1, amount_max = 1, probability = 0.9}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 1}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/junk.png", scale = 0.85, shift = {2, -4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "space-supercomputer-4"].icon, scale = 0.5, shift = {-12, 12}, icon_size = 64 }, + }, + energy_required = 16, + subgroup = "data-generic", + category = "space-supercomputing-4", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "machine-learning-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 1 }, + { name = "electronic-circuit", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-warm", amount = 5}, + }, + results = { + { name = data_util.mod_prefix .. "machine-learning-data", amount = 1 }, + { name = data_util.mod_prefix .. "scrap", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 5}, + }, + main_product = data_util.mod_prefix .. "machine-learning-data", + energy_required = 10, + subgroup = "data-generic", + category = "space-supercomputing-1", + always_show_made_in = true, +}) + +-- simulation +make_recipe({ + name = data_util.mod_prefix .. "simulation-a", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 36 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 4 }, + { name = data_util.mod_prefix .. "empty-data", amount = 32 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-insight"].icon, scale = 0.4/2, shift = {0, -12}, icon_size = 64 }, + }, + energy_required = 30, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim1-a", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-s", + ingredients = { + { name = data_util.mod_prefix .. "energy-insight", amount = 36 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 4 }, + { name = data_util.mod_prefix .. "empty-data", amount = 32 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "energy-insight"].icon, scale = 0.4/2, shift = {0, -12}, icon_size = 64 }, + }, + energy_required = 30, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim1-b", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-b", + ingredients = { + { name = data_util.mod_prefix .. "biological-insight", amount = 36 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 4 }, + { name = data_util.mod_prefix .. "empty-data", amount = 32 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "biological-insight"].icon, scale = 0.4/2, shift = {0, -12}, icon_size = 64 }, + }, + energy_required = 30, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim1-c", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-m", + ingredients = { + { name = data_util.mod_prefix .. "material-insight", amount = 36 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 4 }, + { name = data_util.mod_prefix .. "empty-data", amount = 32 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "material-insight"].icon, scale = 0.4/2, shift = {0, -12}, icon_size = 64 }, + }, + energy_required = 30, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim1-d", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-as", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 18 }, + { name = data_util.mod_prefix .. "energy-insight", amount = 18 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 6 }, + { name = data_util.mod_prefix .. "empty-data", amount = 30 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-insight"].icon, scale = 0.4/2, shift = {-10, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "energy-insight"].icon, scale = 0.4/2, shift = {10, -12}, icon_size = 64 }, + }, + energy_required = 60, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim2-a", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-ab", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 18 }, + { name = data_util.mod_prefix .. "biological-insight", amount = 18 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 6 }, + { name = data_util.mod_prefix .. "empty-data", amount = 30 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-insight"].icon, scale = 0.4/2, shift = {-10, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "biological-insight"].icon, scale = 0.4/2, shift = {10, -12}, icon_size = 64 }, + }, + energy_required = 60, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim2-b", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-am", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 18 }, + { name = data_util.mod_prefix .. "material-insight", amount = 18 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 6 }, + { name = data_util.mod_prefix .. "empty-data", amount = 30 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-insight"].icon, scale = 0.4/2, shift = {-10, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "material-insight"].icon, scale = 0.4/2, shift = {10, -12}, icon_size = 64 }, + }, + energy_required = 60, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim2-c", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-sb", + ingredients = { + { name = data_util.mod_prefix .. "energy-insight", amount = 18 }, + { name = data_util.mod_prefix .. "biological-insight", amount = 18 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 6 }, + { name = data_util.mod_prefix .. "empty-data", amount = 30 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "energy-insight"].icon, scale = 0.4/2, shift = {-10, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "biological-insight"].icon, scale = 0.4/2, shift = {10, -12}, icon_size = 64 }, + }, + energy_required = 60, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim2-d", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-sm", + ingredients = { + { name = data_util.mod_prefix .. "energy-insight", amount = 18 }, + { name = data_util.mod_prefix .. "material-insight", amount = 18 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 6 }, + { name = data_util.mod_prefix .. "empty-data", amount = 30 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "energy-insight"].icon, scale = 0.4/2, shift = {-10, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "material-insight"].icon, scale = 0.4/2, shift = {10, -12}, icon_size = 64 }, + }, + energy_required = 60, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim2-e", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-bm", + ingredients = { + { name = data_util.mod_prefix .. "biological-insight", amount = 18 }, + { name = data_util.mod_prefix .. "material-insight", amount = 18 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 6 }, + { name = data_util.mod_prefix .. "empty-data", amount = 30 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "biological-insight"].icon, scale = 0.4/2, shift = {-10, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "material-insight"].icon, scale = 0.4/2, shift = {10, -12}, icon_size = 64 }, + }, + energy_required = 60, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim2-f", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-asb", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 12 }, + { name = data_util.mod_prefix .. "energy-insight", amount = 12 }, + { name = data_util.mod_prefix .. "biological-insight", amount = 12 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 8 }, + { name = data_util.mod_prefix .. "empty-data", amount = 28 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-insight"].icon, scale = 0.4/2, shift = {-10, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "energy-insight"].icon, scale = 0.4/2, shift = {0, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "biological-insight"].icon, scale = 0.4/2, shift = {10, -12}, icon_size = 64 }, + }, + energy_required = 120, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim3-a", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-asm", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 12 }, + { name = data_util.mod_prefix .. "energy-insight", amount = 12 }, + { name = data_util.mod_prefix .. "material-insight", amount = 12 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 8 }, + { name = data_util.mod_prefix .. "empty-data", amount = 28 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-insight"].icon, scale = 0.4/2, shift = {-10, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "energy-insight"].icon, scale = 0.4/2, shift = {0, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "material-insight"].icon, scale = 0.4/2, shift = {10, -12}, icon_size = 64 }, + }, + energy_required = 120, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim3-b", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-abm", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 12 }, + { name = data_util.mod_prefix .. "biological-insight", amount = 12 }, + { name = data_util.mod_prefix .. "material-insight", amount = 12 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 8 }, + { name = data_util.mod_prefix .. "empty-data", amount = 28 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-insight"].icon, scale = 0.4/2, shift = {-10, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "biological-insight"].icon, scale = 0.4/2, shift = {0, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "material-insight"].icon, scale = 0.4/2, shift = {10, -12}, icon_size = 64 }, + }, + energy_required = 120, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim3-c", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-sbm", + ingredients = { + { name = data_util.mod_prefix .. "energy-insight", amount = 12 }, + { name = data_util.mod_prefix .. "biological-insight", amount = 12 }, + { name = data_util.mod_prefix .. "material-insight", amount = 12 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 8 }, + { name = data_util.mod_prefix .. "empty-data", amount = 28 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "energy-insight"].icon, scale = 0.4/2, shift = {-10, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "biological-insight"].icon, scale = 0.4/2, shift = {0, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "material-insight"].icon, scale = 0.4/2, shift = {10, -12}, icon_size = 64 }, + }, + energy_required = 120, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-1", + order = "sim3-d", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "simulation-asbm", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 9 }, + { name = data_util.mod_prefix .. "energy-insight", amount = 9 }, + { name = data_util.mod_prefix .. "biological-insight", amount = 9 }, + { name = data_util.mod_prefix .. "material-insight", amount = 9 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "significant-data", amount = 10 }, + { name = data_util.mod_prefix .. "empty-data", amount = 26 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = "__space-exploration-graphics__/graphics/icons/data/significant.png", scale = 0.85, shift = {-2, 4}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-insight"].icon, scale = 0.4/2, shift = {-15, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "energy-insight"].icon, scale = 0.4/2, shift = {-5, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "biological-insight"].icon, scale = 0.4/2, shift = {5, -12}, icon_size = 64 }, + { icon = data.raw.item[data_util.mod_prefix .. "material-insight"].icon, scale = 0.4/2, shift = {15, -12}, icon_size = 64 }, + }, + energy_required = 240, + subgroup = "data-significant", + allow_as_intermediate = false, + category = "space-supercomputing-2", + order = "sim4-a", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "astronomic-insight-1", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-catalogue-1", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 2 }, + { name = data_util.mod_prefix .. "empty-data", amount = 2 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-catalogue-1"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/1.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 10, + subgroup = "data-catalogue-astronomic", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "energy-insight-1", + ingredients = { + { name = data_util.mod_prefix .. "energy-catalogue-1", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "energy-insight", amount = 2 }, + { name = data_util.mod_prefix .. "empty-data", amount = 2 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "energy-catalogue-1"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/1.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 10, + subgroup = "data-catalogue-energy", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "biological-insight-1", + ingredients = { + { name = data_util.mod_prefix .. "biological-catalogue-1", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "biological-insight", amount = 2 }, + { name = data_util.mod_prefix .. "empty-data", amount = 2 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "biological-catalogue-1"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/1.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 10, + subgroup = "data-catalogue-biological", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "material-insight-1", + ingredients = { + { name = data_util.mod_prefix .. "material-catalogue-1", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "material-insight", amount = 2 }, + { name = data_util.mod_prefix .. "empty-data", amount = 2 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "material-catalogue-1"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/1.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 10, + subgroup = "data-catalogue-material", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "astronomic-insight-2", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "astronomic-catalogue-2", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 6 }, + { name = data_util.mod_prefix .. "empty-data", amount = 2 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-catalogue-2"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/2.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 20, + subgroup = "data-catalogue-astronomic", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "energy-insight-2", + ingredients = { + { name = data_util.mod_prefix .. "energy-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "energy-catalogue-2", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "energy-insight", amount = 6 }, + { name = data_util.mod_prefix .. "empty-data", amount = 2 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "energy-catalogue-2"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/2.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 20, + subgroup = "data-catalogue-energy", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "biological-insight-2", + ingredients = { + { name = data_util.mod_prefix .. "biological-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "biological-catalogue-2", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "biological-insight", amount = 6 }, + { name = data_util.mod_prefix .. "empty-data", amount = 2 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "biological-catalogue-2"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/2.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 20, + subgroup = "data-catalogue-biological", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "material-insight-2", + ingredients = { + { name = data_util.mod_prefix .. "material-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "material-catalogue-2", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "material-insight", amount = 6 }, + { name = data_util.mod_prefix .. "empty-data", amount = 2 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "material-catalogue-2"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/2.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 20, + subgroup = "data-catalogue-material", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "astronomic-insight-3", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "astronomic-catalogue-2", amount = 1 }, + { name = data_util.mod_prefix .. "astronomic-catalogue-3", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 12 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-catalogue-3"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/3.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 30, + subgroup = "data-catalogue-astronomic", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "energy-insight-3", + ingredients = { + { name = data_util.mod_prefix .. "energy-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "energy-catalogue-2", amount = 1 }, + { name = data_util.mod_prefix .. "energy-catalogue-3", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "energy-insight", amount = 12 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "energy-catalogue-3"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/3.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 30, + subgroup = "data-catalogue-energy", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "biological-insight-3", + ingredients = { + { name = data_util.mod_prefix .. "biological-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "biological-catalogue-2", amount = 1 }, + { name = data_util.mod_prefix .. "biological-catalogue-3", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "biological-insight", amount = 12 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "biological-catalogue-3"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/3.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 30, + subgroup = "data-catalogue-biological", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "material-insight-3", + ingredients = { + { name = data_util.mod_prefix .. "material-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "material-catalogue-2", amount = 1 }, + { name = data_util.mod_prefix .. "material-catalogue-3", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "material-insight", amount = 12 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "material-catalogue-3"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/3.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 30, + subgroup = "data-catalogue-material", + allow_as_intermediate = false, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "astronomic-insight-4", + ingredients = { + { name = data_util.mod_prefix .. "astronomic-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "astronomic-catalogue-2", amount = 1 }, + { name = data_util.mod_prefix .. "astronomic-catalogue-3", amount = 1 }, + { name = data_util.mod_prefix .. "astronomic-catalogue-4", amount = 1 }, + { name = data_util.mod_prefix .. "empty-data", amount = 6 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "astronomic-insight", amount = 22 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "astronomic-catalogue-4"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/4.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 40, + subgroup = "data-catalogue-astronomic", + allow_as_intermediate = false, + category = "space-supercomputing-2", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "energy-insight-4", + ingredients = { + { name = data_util.mod_prefix .. "energy-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "energy-catalogue-2", amount = 1 }, + { name = data_util.mod_prefix .. "energy-catalogue-3", amount = 1 }, + { name = data_util.mod_prefix .. "energy-catalogue-4", amount = 1 }, + { name = data_util.mod_prefix .. "empty-data", amount = 6 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "energy-insight", amount = 22 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "energy-catalogue-4"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/4.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 40, + subgroup = "data-catalogue-energy", + allow_as_intermediate = false, + category = "space-supercomputing-2", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "biological-insight-4", + ingredients = { + { name = data_util.mod_prefix .. "biological-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "biological-catalogue-2", amount = 1 }, + { name = data_util.mod_prefix .. "biological-catalogue-3", amount = 1 }, + { name = data_util.mod_prefix .. "biological-catalogue-4", amount = 1 }, + { name = data_util.mod_prefix .. "empty-data", amount = 6 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "biological-insight", amount = 22 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "biological-catalogue-4"].icon,scale = 1, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/4.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 40, + subgroup = "data-catalogue-biological", + allow_as_intermediate = false, + category = "space-supercomputing-2", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "material-insight-4", + ingredients = { + { name = data_util.mod_prefix .. "material-catalogue-1", amount = 1 }, + { name = data_util.mod_prefix .. "material-catalogue-2", amount = 1 }, + { name = data_util.mod_prefix .. "material-catalogue-3", amount = 1 }, + { name = data_util.mod_prefix .. "material-catalogue-4", amount = 1 }, + { name = data_util.mod_prefix .. "empty-data", amount = 6 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "material-insight", amount = 22 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + icons = { + { icon = data.raw.item[data_util.mod_prefix .. "material-catalogue-4"].icon, scale = 1, shift = {8, 0}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-insight.png", scale = 0.7, shift = {-16, 8}, icon_size = 64 }, + { icon = "__space-exploration-graphics__/graphics/icons/number/4.png", scale = 1, shift = {-20, -20}, icon_size = 20 }, + }, + energy_required = 40, + subgroup = "data-catalogue-material", + allow_as_intermediate = false, + category = "space-supercomputing-2", + always_show_made_in = true, +}) + + +make_recipe({ + name = data_util.mod_prefix .. "astronomic-catalogue-1", + ingredients = { + { name = data_util.mod_prefix .. "astrometric-data", amount = 1 }, + { name = data_util.mod_prefix .. "visible-observation-data", amount = 1 }, + { name = data_util.mod_prefix .. "infrared-observation-data", amount = 1 }, + { name = data_util.mod_prefix .. "uv-observation-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "astronomic-catalogue-1", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "astronomic-catalogue-1", + subgroup = "data-catalogue-astronomic", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-1.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "astronomic-catalogue-2", + ingredients = { + { name = data_util.mod_prefix .. "microwave-observation-data", amount = 1 }, + { name = data_util.mod_prefix .. "xray-observation-data", amount = 1 }, + { name = data_util.mod_prefix .. "gravitational-lensing-data", amount = 1 }, + { name = data_util.mod_prefix .. "gravity-wave-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "astronomic-catalogue-2", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "astronomic-catalogue-2", + subgroup = "data-catalogue-astronomic", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-2.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "astronomic-catalogue-3", + ingredients = { + { name = data_util.mod_prefix .. "radio-observation-data", amount = 1 }, + { name = data_util.mod_prefix .. "gammaray-observation-data", amount = 1 }, + { name = data_util.mod_prefix .. "darkmatter-data", amount = 1 }, + { name = data_util.mod_prefix .. "negative-pressure-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "astronomic-catalogue-3", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 30, + main_product = data_util.mod_prefix .. "astronomic-catalogue-3", + subgroup = "data-catalogue-astronomic", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-3.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "astronomic-catalogue-4", + ingredients = { + { name = data_util.mod_prefix .. "dark-energy-data", amount = 1 }, + { name = data_util.mod_prefix .. "micro-black-hole-data", amount = 1 }, + { name = data_util.mod_prefix .. "zero-point-energy-data", amount = 1 }, + { name = data_util.mod_prefix .. "belt-probe-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "astronomic-catalogue-4", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 40, + main_product = data_util.mod_prefix .. "astronomic-catalogue-4", + subgroup = "data-catalogue-astronomic", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/astronomic-catalogue-4.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "energy-catalogue-1", + ingredients = { + { name = data_util.mod_prefix .. "polarisation-data", amount = 1 }, + { name = data_util.mod_prefix .. "conductivity-data", amount = 1 }, + { name = data_util.mod_prefix .. "radiation-data", amount = 1 }, + { name = data_util.mod_prefix .. "electromagnetic-field-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "energy-catalogue-1", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "energy-catalogue-1", + subgroup = "data-catalogue-energy", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-1.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "energy-catalogue-2", + ingredients = { + { name = data_util.mod_prefix .. "atomic-data", amount = 1 }, + { name = data_util.mod_prefix .. "subatomic-data", amount = 1 }, + { name = data_util.mod_prefix .. "quantum-phenomenon-data", amount = 1 }, + { name = data_util.mod_prefix .. "forcefield-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "energy-catalogue-2", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "energy-catalogue-2", + subgroup = "data-catalogue-energy", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-2.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "energy-catalogue-3", + ingredients = { + { name = data_util.mod_prefix .. "entanglement-data", amount = 1 }, + { name = data_util.mod_prefix .. "superconductivity-data", amount = 1 }, + { name = data_util.mod_prefix .. "quark-data", amount = 1 }, + { name = data_util.mod_prefix .. "lepton-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "energy-catalogue-3", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 30, + main_product = data_util.mod_prefix .. "energy-catalogue-3", + subgroup = "data-catalogue-energy", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-3.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "energy-catalogue-4", + ingredients = { + { name = data_util.mod_prefix .. "boson-data", amount = 1 }, + { name = data_util.mod_prefix .. "fusion-test-data", amount = 1 }, + { name = data_util.mod_prefix .. "magnetic-monopole-data", amount = 1 }, + { name = data_util.mod_prefix .. "star-probe-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "energy-catalogue-4", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 40, + main_product = data_util.mod_prefix .. "energy-catalogue-4", + subgroup = "data-catalogue-energy", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/energy-catalogue-4.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "biological-catalogue-1", + ingredients = { + { name = data_util.mod_prefix .. "bio-combustion-data", amount = 1 }, + --{ name = data_util.mod_prefix .. "bio-spectral-data", amount = 1 }, + { name = data_util.mod_prefix .. "biomechanical-data", amount = 1 }, + { name = data_util.mod_prefix .. "biochemical-data", amount = 1 }, + { name = data_util.mod_prefix .. "genetic-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "biological-catalogue-1", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "biological-catalogue-1", + subgroup = "data-catalogue-biological", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-1.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "biological-catalogue-2", + ingredients = { + { name = data_util.mod_prefix .. "bio-combustion-resistance-data", amount = 1 }, + { name = data_util.mod_prefix .. "experimental-genetic-data", amount = 1 }, + { name = data_util.mod_prefix .. "biochemical-resistance-data", amount = 1 }, + { name = data_util.mod_prefix .. "biomechanical-resistance-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "biological-catalogue-2", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "biological-catalogue-2", + subgroup = "data-catalogue-biological", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-2.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "biological-catalogue-3", + ingredients = { + { name = data_util.mod_prefix .. "bioelectrics-data", amount = 1 }, + { name = data_util.mod_prefix .. "cryogenics-data", amount = 1 }, + { name = data_util.mod_prefix .. "decompression-data", amount = 1 }, + { name = data_util.mod_prefix .. "radiation-exposure-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "biological-catalogue-3", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 30, + main_product = data_util.mod_prefix .. "biological-catalogue-3", + subgroup = "data-catalogue-biological", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-3.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "biological-catalogue-4", + ingredients = { + { name = data_util.mod_prefix .. "comparative-genetic-data", amount = 1 }, + { name = data_util.mod_prefix .. "decompression-resistance-data", amount = 1 }, + { name = data_util.mod_prefix .. "neural-anomaly-data", amount = 1 }, + { name = data_util.mod_prefix .. "radiation-exposure-resistance-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "biological-catalogue-4", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 40, + main_product = data_util.mod_prefix .. "biological-catalogue-4", + subgroup = "data-catalogue-biological", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/biological-catalogue-4.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "material-catalogue-1", + ingredients = { + { name = data_util.mod_prefix .. "cold-thermodynamics-data", amount = 1 }, + { name = data_util.mod_prefix .. "hot-thermodynamics-data", amount = 1 }, + { name = data_util.mod_prefix .. "tensile-strength-data", amount = 1 }, + { name = data_util.mod_prefix .. "compressive-strength-data", amount = 1 }, + --{ name = data_util.mod_prefix .. "shear-strength-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "material-catalogue-1", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "material-catalogue-1", + subgroup = "data-catalogue-material", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-1.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "material-catalogue-2", + ingredients = { + { name = data_util.mod_prefix .. "rigidity-data", amount = 1 }, + { name = data_util.mod_prefix .. "pressure-containment-data", amount = 1 }, + { name = data_util.mod_prefix .. "corrosion-resistance-data", amount = 1 }, + { name = data_util.mod_prefix .. "impact-shielding-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "material-catalogue-2", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 20, + main_product = data_util.mod_prefix .. "material-catalogue-2", + subgroup = "data-catalogue-material", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-2.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "material-catalogue-3", + ingredients = { + { name = data_util.mod_prefix .. "friction-data", amount = 1 }, + { name = data_util.mod_prefix .. "radiation-shielding-data", amount = 1 }, + { name = data_util.mod_prefix .. "explosion-shielding-data", amount = 1 }, + { name = data_util.mod_prefix .. "ballistic-shielding-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "material-catalogue-3", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 30, + main_product = data_util.mod_prefix .. "material-catalogue-3", + subgroup = "data-catalogue-material", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-3.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) +make_recipe({ + name = data_util.mod_prefix .. "material-catalogue-4", + ingredients = { + { name = data_util.mod_prefix .. "laser-shielding-data", amount = 1 }, + { name = data_util.mod_prefix .. "particle-beam-shielding-data", amount = 1 }, + { name = data_util.mod_prefix .. "electrical-shielding-data", amount = 1 }, + { name = data_util.mod_prefix .. "experimental-alloys-data", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "material-catalogue-4", amount = 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + energy_required = 40, + main_product = data_util.mod_prefix .. "material-catalogue-4", + subgroup = "data-catalogue-material", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/material-catalogue-4.png", + icon_size = 64, + category = "space-supercomputing-1", + always_show_made_in = true, +}) + +--[[ +make_recipe({ + name = data_util.mod_prefix .. "universal-catalogue", + ingredients = { + { data_util.mod_prefix .. "astronomic-catalogue-4", 1 }, + { data_util.mod_prefix .. "energy-catalogue-4", 1 }, + { data_util.mod_prefix .. "biological-catalogue-4", 1 }, + { data_util.mod_prefix .. "material-catalogue-4", 1 }, + { data_util.mod_prefix .. "deep-catalogue-4", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 100}, + }, + results = { + { name = data_util.mod_prefix .. "universal-catalogue", amount = 5 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 100}, + }, + energy_required = 50, + main_product = data_util.mod_prefix .. "universal-catalogue", + icon = "__space-exploration-graphics__/graphics/icons/catalogue/universal-catalogue.png", + icon_size = 64, + category = "space-supercomputing-4", + always_show_made_in = true, +}) +]] + +data:extend({ + + { + type = "recipe", + name = data_util.mod_prefix .. "deep-catalogue-1", + main_product = data_util.mod_prefix .. "deep-catalogue-1", + enabled = false, + energy_required = 60, + ingredients = { + { data_util.mod_prefix .. "void-probe-data", 1 }, + { data_util.mod_prefix .. "nano-engineering-data", 1 }, + { data_util.mod_prefix .. "naquium-structural-data", 1 }, + { data_util.mod_prefix .. "naquium-energy-data", 1 }, + { data_util.mod_prefix .. "cryonite-rod", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { data_util.mod_prefix .. "deep-catalogue-1", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 10}, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + category = "space-supercomputing-3", + }, + + { + type = "recipe", + name = data_util.mod_prefix .. "deep-catalogue-2", + main_product = data_util.mod_prefix .. "deep-catalogue-2", + enabled = false, + energy_required = 70, + ingredients = { + { data_util.mod_prefix .. "timespace-anomaly-data", 1 }, + { data_util.mod_prefix .. "singularity-data", 1 }, + { data_util.mod_prefix .. "hyperlattice-data", 1 }, + { data_util.mod_prefix .. "annihilation-data", 1 }, + { data_util.mod_prefix .. "cryonite-rod", 2 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 20}, + }, + results = { + { data_util.mod_prefix .. "deep-catalogue-2", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 20}, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + category = "space-supercomputing-3", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "deep-catalogue-3", + main_product = data_util.mod_prefix .. "deep-catalogue-3", + enabled = false, + energy_required = 80, + ingredients = { + { data_util.mod_prefix .. "space-fold-data", 1 }, + { data_util.mod_prefix .. "space-warp-data", 1 }, + { data_util.mod_prefix .. "space-dialation-data", 1 }, + { data_util.mod_prefix .. "space-injection-data", 1 }, + { data_util.mod_prefix .. "cryonite-rod", 3 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 30}, + }, + results = { + { data_util.mod_prefix .. "deep-catalogue-3", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 30}, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + category = "space-supercomputing-3", + }, + { + type = "recipe", + name = data_util.mod_prefix .. "deep-catalogue-4", + main_product = data_util.mod_prefix .. "deep-catalogue-4", + enabled = false, + energy_required = 90, + ingredients = { + { data_util.mod_prefix .. "interstellar-data", 1 }, + { data_util.mod_prefix .. "teleportation-data", 1 }, + { data_util.mod_prefix .. "wormhole-data", 1 }, + { data_util.mod_prefix .. "rhga-data", 1 }, + { data_util.mod_prefix .. "cryonite-rod", 4 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 40}, + }, + results = { + { data_util.mod_prefix .. "deep-catalogue-4", 1 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 40}, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + category = "space-supercomputing-4", + }, + + { + type = "recipe", + name = data_util.mod_prefix .. "rhga-data", + main_product = data_util.mod_prefix .. "rhga-data", + enabled = false, + energy_required = 1000, + ingredients = { + { data_util.mod_prefix .. "empty-data", 50 }, + { data_util.mod_prefix .. "naquium-processor", 1 }, + { data_util.mod_prefix .. "cryonite-rod", 100 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 1000}, + }, + results = { + { data_util.mod_prefix .. "rhga-data", 50 }, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 1000}, + }, + requester_paste_multiplier = 1, + always_show_made_in = true, + category = "space-supercomputing-4", + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/thermodynamics-laboratory.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/thermodynamics-laboratory.lua new file mode 100644 index 0000000..0bec9d9 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/recipe/thermodynamics-laboratory.lua @@ -0,0 +1,206 @@ +local data_util = require("data_util") +local make_recipe = data_util.make_recipe + +local recipe_multiplier = 4 + +make_recipe({ + name = data_util.mod_prefix .. "thermodynamics-coal", + ingredients = { + { name = data_util.mod_prefix .. "experimental-specimen", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "plasma-stream", amount = 10}, + }, + results = { + { name = "coal", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-space-water", amount = 20}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 1}, + }, + energy_required = 5 * recipe_multiplier, + subgroup = "space-components", + category = "space-thermodynamics", + allow_as_intermediate = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "bio-combustion-data", + ingredients = { + { name = data_util.mod_prefix .. "specimen", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "plasma-stream", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "bio-combustion-data", amount_min = 1, amount_max = 1, probability = 0.75}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.24}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 2}, + }, + energy_required = 5 * recipe_multiplier, + main_product = data_util.mod_prefix .. "bio-combustion-data", + category = "space-thermodynamics", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "bio-combustion-resistance-data", + ingredients = { + { name = data_util.mod_prefix .. "experimental-specimen", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "plasma-stream", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "bio-combustion-resistance-data", amount = 1}, + { name = data_util.mod_prefix .. "experimental-specimen", amount_min = 1, amount_max = 1, probability = 0.5}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 7}, + }, + energy_required = 10 * recipe_multiplier, + main_product = data_util.mod_prefix .. "bio-combustion-resistance-data", + category = "space-thermodynamics", + always_show_made_in = true, +}) + +--[[ +-- removed +make_recipe({ + name = data_util.mod_prefix .. "bio-combustion-suppression-data", + ingredients = { + { name = data_util.mod_prefix .. "significant-specimen", amount = 1}, + { name = data_util.mod_prefix .. "experimental-material", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "plasma-stream", amount = 100}, + }, + results = { + { name = data_util.mod_prefix .. "bio-combustion-suppression-data", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "junk-data", amount_min = 1, amount_max = 1, probability = 0.49}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 3}, + { type = "fluid", name = data_util.mod_prefix .. "contaminated-bio-sludge", amount = 100}, + }, + category = "space-thermodynamics", +}) +]]-- + +make_recipe({ + name = data_util.mod_prefix .. "cold-thermodynamics-data", + ingredients = { + { name = data_util.mod_prefix .. "material-testing-pack", amount = 4}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-cold", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "cold-thermodynamics-data", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 8}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-hot", amount = 8}, + }, + energy_required = 10 * recipe_multiplier, + main_product = data_util.mod_prefix .. "cold-thermodynamics-data", + category = "space-thermodynamics", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "hot-thermodynamics-data", + ingredients = { + { name = data_util.mod_prefix .. "material-testing-pack", amount = 4}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "plasma-stream", amount = 10}, + }, + results = { + { name = data_util.mod_prefix .. "hot-thermodynamics-data", amount = 1}, + { name = data_util.mod_prefix .. "contaminated-scrap", amount = 8}, + }, + energy_required = 10 * recipe_multiplier, + main_product = data_util.mod_prefix .. "hot-thermodynamics-data", + category = "space-thermodynamics", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "pressure-containment-data", + ingredients = { + { name = data_util.mod_prefix .. "empty-data", amount = 3}, + { name = data_util.mod_prefix .. "heavy-girder", amount = 1}, + { name = "storage-tank", amount = 1}, + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 1000}, + }, + results = { + { name = data_util.mod_prefix .. "pressure-containment-data", amount = 3}, + { name = data_util.mod_prefix .. "scrap", amount = 50}, + { type = "fluid", name = data_util.mod_prefix .. "space-water", amount = 990}, + }, + energy_required = 6 * recipe_multiplier, + main_product = data_util.mod_prefix .. "pressure-containment-data", + category = "space-thermodynamics", + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "explosion-shielding-data", + ingredients = { + { name = "explosives", amount = 20}, + { name = data_util.mod_prefix .. "material-testing-pack", amount = 4}, + { name = data_util.mod_prefix .. "heavy-girder", amount = 1}, + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 1}, + }, + results = { + { name = data_util.mod_prefix .. "explosion-shielding-data", amount = 1}, + { name = data_util.mod_prefix .. "heavy-girder", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "iridium-plate", amount_min = 1, amount_max = 1, probability = 0.5}, + { name = data_util.mod_prefix .. "scrap", amount = 10}, + }, + energy_required = 10, + main_product = data_util.mod_prefix .. "explosion-shielding-data", + category = "space-thermodynamics", + enabled = false, + always_show_made_in = true, +}) + +make_recipe({ + name = data_util.mod_prefix .. "experimental-alloys-data", + ingredients = { + { name = data_util.mod_prefix .. "iridium-plate", amount = 1}, + { name = data_util.mod_prefix .. "beryllium-plate", amount = 1}, + { name = data_util.mod_prefix .. "holmium-plate", amount = 1}, + { name = "iron-plate", amount = 1}, + { name = "copper-plate", amount = 1}, + { name = data_util.mod_prefix .. "empty-data", amount = 6}, + }, + results = { + { name = data_util.mod_prefix .. "experimental-alloys-data", amount = 6}, + { name = data_util.mod_prefix .. "scrap", amount = 5}, + }, + energy_required = 18, + main_product = data_util.mod_prefix .. "experimental-alloys-data", + category = "space-thermodynamics", + enabled = false, + always_show_made_in = true, +}) + +data_util.make_recipe({ + name = data_util.mod_prefix .. "cryogun", + ingredients = { + { data_util.mod_prefix .. "beryllium-plate", 10}, + { data_util.mod_prefix .. "aeroframe-pole", 10}, + { data_util.mod_prefix .. "cryonite-rod", 10}, + }, + results = { + { data_util.mod_prefix .. "cryogun", 1}, + }, + energy_required = 60, + category = "space-thermodynamics", + enabled = false, +}) + +data_util.make_recipe({ + name = data_util.mod_prefix .. "cryogun-ammo", + ingredients = { + { data_util.mod_prefix .. "beryllium-plate", 1}, + { data_util.mod_prefix .. "cryonite-rod", 10}, + { type = "fluid", name = data_util.mod_prefix .. "space-coolant-supercooled", amount = 10}, + }, + results = { + { data_util.mod_prefix .. "cryogun-ammo", 1}, + }, + energy_required = 10, + category = "space-thermodynamics", + enabled = false, + always_show_made_in = true, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/shortcut.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/shortcut.lua new file mode 100644 index 0000000..30571c9 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/shortcut.lua @@ -0,0 +1,109 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "shortcut", + name = data_util.mod_prefix .. "remote-view", + localised_name = { "shortcut."..data_util.mod_prefix .. "remote-view"}, + order = "a", + action = "lua", + style = "blue", + icon = { + filename = "__space-exploration-graphics__/graphics/icons/uplink.png", + flags = { + "icon" + }, + priority = "extra-high-no-scale", + scale = 1, + size = 64 + }, + small_icon = { + filename = "__space-exploration-graphics__/graphics/icons/uplink.png", + flags = { + "icon" + }, + priority = "extra-high-no-scale", + scale = 1, + size = 64 + }, + disabled_small_icon = { + filename = "__space-exploration-graphics__/graphics/icons/shortcut-toolbar/remote-view-24-black.png", + flags = { + "icon" + }, + priority = "extra-high-no-scale", + scale = 1, + size = 24 + }, + }, + { + type = "shortcut", + name = data_util.mod_prefix .. "universe-explorer", + localised_name = { "shortcut."..data_util.mod_prefix .. "universe-explorer"}, + order = "a", + action = "lua", + style = "blue", + icon = { + filename = "__space-exploration-graphics__/graphics/icons/astronomic/planet-orbit.png", + flags = { + "icon" + }, + priority = "extra-high-no-scale", + scale = 1, + size = 64 + }, + small_icon = { + filename = "__space-exploration-graphics__/graphics/icons/astronomic/planet-orbit.png", + flags = { + "icon" + }, + priority = "extra-high-no-scale", + scale = 1, + size = 64 + }, + disabled_small_icon = { + filename = "__space-exploration-graphics__/graphics/icons/astronomic/planet-orbit.png", + flags = { + "icon" + }, + priority = "extra-high-no-scale", + scale = 1, + size = 64 + }, + }, + { + type = "shortcut", + name = data_util.mod_prefix .. "respawn", + localised_name = { "shortcut."..data_util.mod_prefix .. "respawn"}, + order = "a", + action = "lua", + style = "red", + icon = { + filename = "__space-exploration-graphics__/graphics/icons/scull.png", + flags = { + "icon" + }, + priority = "extra-high-no-scale", + scale = 1, + size = 64 + }, + small_icon = { + filename = "__space-exploration-graphics__/graphics/icons/scull.png", + flags = { + "icon" + }, + priority = "extra-high-no-scale", + scale = 1, + size = 64 + }, + disabled_small_icon = { + filename = "__space-exploration-graphics__/graphics/icons/shortcut-toolbar/respawn-24-black.png", + flags = { + "icon" + }, + priority = "extra-high-no-scale", + scale = 1, + size = 24 + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/signal.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/signal.lua new file mode 100644 index 0000000..2fef312 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/signal.lua @@ -0,0 +1,237 @@ +local data_util = require("data_util") + +-- utility sprites don't work right now so use hidden signals +data:extend({ + { + type = "virtual-signal", + name = "signal-speed", + icon = "__space-exploration-graphics__/graphics/icons/signal/signal-speed.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "aai-speed" + }, + { + type = "virtual-signal", + name = "signal-distance", + icon = "__space-exploration-graphics__/graphics/icons/signal/signal-distance.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "aai-distance" + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "star", + icon = "__space-exploration-graphics__/graphics/icons/astronomic/star.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-a", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "planet", + icon = "__space-exploration-graphics__/graphics/icons/astronomic/planet-small.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-b", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "planet-orbit", + icon = "__space-exploration-graphics__/graphics/icons/astronomic/planet-orbit.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-b", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "moon", + icon = "__space-exploration-graphics__/graphics/icons/astronomic/moon-small.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-c", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "moon-orbit", + icon = "__space-exploration-graphics__/graphics/icons/astronomic/moon-orbit.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-c", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "asteroid-belt", + icon = "__space-exploration-graphics__/graphics/icons/astronomic/asteroid-belt.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-d", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "asteroid-field", + icon = "__space-exploration-graphics__/graphics/icons/astronomic/asteroid-field.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-e", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "anomaly", + icon = "__space-exploration-graphics__/graphics/icons/astronomic/anomaly.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-f", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "meteor", + icon = "__space-exploration-graphics__/graphics/icons/astronomic/meteor.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-g", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "cargo-rocket", + icon = "__space-exploration-graphics__/graphics/icons/cargo-rocket.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-g", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "spaceship", + icon = "__space-exploration-graphics__/graphics/icons/spaceship.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-g-b", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "spaceship-launch", + icon = "__space-exploration-graphics__/graphics/icons/spaceship-launch.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-g-b-a", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "anchor-using-left-clamp", + icon = "__space-exploration-graphics__/graphics/icons/anchor-using-left-clamp.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-g-b-b", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "anchor-using-right-clamp", + icon = "__space-exploration-graphics__/graphics/icons/anchor-using-right-clamp.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-g-b-c", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "anchor-to-left-clamp", + icon = "__space-exploration-graphics__/graphics/icons/anchor-to-left-clamp.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-g-b-d", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "anchor-to-right-clamp", + icon = "__space-exploration-graphics__/graphics/icons/anchor-to-right-clamp.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-a-g-b-e", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "remote-view", + icon = "__space-exploration-graphics__/graphics/icons/uplink.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-z-f", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "death", + icon = "__space-exploration-graphics__/graphics/icons/scull.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-z-g", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "character-corpse", + icon = "__space-exploration-graphics__/graphics/icons/character-corpse.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-z-h", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "ruin", + icon = "__space-exploration-graphics__/graphics/icons/ruin.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-z-h-b", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "accolade", + icon = "__space-exploration-graphics__/graphics/icons/accolade.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-z-i", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "pin", + icon = "__space-exploration-graphics__/graphics/icons/signal/pin.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-z-i-b", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "remove", + icon = "__space-exploration-graphics__/graphics/icons/remove.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-z-j", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "radius", + icon = "__space-exploration-graphics__/graphics/icons/radius.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-z-k", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "hierarchy", + icon = "__space-exploration-graphics__/graphics/icons/hierarchy.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-z-l", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "beacon-overload", + icon = "__space-exploration-graphics__/graphics/icons/alerts/beacon-overload.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-z-m", + }, + { + type = "virtual-signal", + name = data_util.mod_prefix .. "heat", + icon = "__space-exploration-graphics__/graphics/icons/heat.png", + icon_size = 64, + subgroup = "virtual-signal-utility", + order = "z-z-n", + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/sound.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/sound.lua new file mode 100644 index 0000000..af74a0c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/sound.lua @@ -0,0 +1,113 @@ +local data_util = require("data_util") + +-- use projectile for sounds becuase they are can be positioned, moved, and removed at a specific time. +-- the entity MUST be removed otherwise it will loop forever +local function make_sound_continous(name, path, volume) + data:extend( { + { + type = "projectile", + name = data_util.mod_prefix .. "sound-continous-" .. name, + acceleration = 0, + animation = { + filename = "__space-exploration-graphics__/graphics/blank.png", + frame_count = 1, + height = 1, + line_length = 1, + priority = "high", + width = 1 + }, + flags = { "not-on-map" }, + working_sound = { + apparent_volume = volume or 1, + sound = { + { + filename = path, + volume = volume or 1 + } + } + } + } + }) +end + +-- use an explosion because it if fire and forget +local function make_sound(name, path, volume) + data:extend( { + { + type = "explosion", + name = data_util.mod_prefix .. "sound-" .. name, + animations = { { + filename = "__space-exploration-graphics__/graphics/blank.png", + frame_count = 1, + height = 1, + line_length = 1, + priority = "high", + width = 1 + }}, + flags = { "not-on-map" }, + sound = { + aggregation = { max_count = 1, remove = true }, + variations = { + { + filename = path, + volume = volume or 1 + }, + } + }, + } + }) +end + +make_sound("machine-close", "__base__/sound/machine-close.ogg", 1) +make_sound("machine-open", "__base__/sound/machine-open.ogg", 1) +make_sound("silo-clamps-off", "__base__/sound/silo-clamps-off.ogg", 1.5) +make_sound("silo-clamps-on", "__base__/sound/silo-clamps-on.ogg", 1.5) +make_sound("silo-doors", "__base__/sound/silo-doors.ogg", 1) +make_sound("silo-raise-rocket", "__base__/sound/silo-raise-rocket.ogg", 1) +make_sound("silo-rocket", "__base__/sound/silo-rocket.ogg", 1) +make_sound_continous("silo-rocket", "__base__/sound/silo-rocket.ogg", 1) +make_sound("train-breaks", "__base__/sound/train-breaks.ogg", 1) + +data:extend({ + { + type = "sound", + name = data_util.mod_prefix .. "meteor-woosh", + aggregation = { max_count = 1, remove = true }, + variations = { + { + filename = "__space-exploration__/sound/meteor-woosh.ogg", + volume = 1 + }, + } + }, + { + type = "sound", + name = data_util.mod_prefix .. "spaceship-woosh", + aggregation = { max_count = 1, remove = true }, + variations = { + { + filename = "__space-exploration__/sound/spaceship-woosh.ogg", + volume = 1 + }, + } + }, + { + type = "sound", + name = data_util.mod_prefix .. "game-lost", + aggregation = { max_count = 1, remove = true }, + variations = { + { + filename = "__core__/sound/game-lost.ogg", + volume = 1 + }, + } + } +}) + + +make_sound_continous("gate-turning", "__space-exploration__/sound/gate-turning.ogg", 1) +make_sound_continous("gate-power-on", "__space-exploration__/sound/gate-power-on.ogg", 1.2) +make_sound("gate-power-up", "__space-exploration__/sound/gate-power-up.ogg", 1) +make_sound("gate-power-down", "__space-exploration__/sound/gate-power-down.ogg", 0.9) +make_sound("gate-button", "__space-exploration__/sound/gate-button.ogg", 1) +make_sound("gate-lock", "__space-exploration__/sound/gate-lock.ogg", 1) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/styles.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/styles.lua new file mode 100644 index 0000000..1db2a48 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/styles.lua @@ -0,0 +1,592 @@ +local data_util = require("data_util") + +local ui_width = 300 +local margin_right = 20 +local space_for_button = 36 + + +data.raw["gui-style"]["default"]["space_platform_textfield"] = { + width = ui_width - margin_right, + type = "textbox_style", +} +data.raw["gui-style"]["default"]["space_platform_textfield_short"] = { + width = ui_width - margin_right - space_for_button, + type = "textbox_style", +} +data.raw["gui-style"]["default"]["space_platform_label"] = { + width = ui_width - margin_right, + parent= "label", + type = "label_style", + single_line = false, +} +data.raw["gui-style"]["default"]["space_platform_label_short"] = { + width = ui_width - margin_right - space_for_button, + parent= "label", + type = "label_style", + single_line = false, +} +data.raw["gui-style"]["default"]["space_platform_title"] = { + width = ui_width - margin_right, + parent= "label", + type = "label_style", + font = "default-large-semibold", + single_line = false, +} +data.raw["gui-style"]["default"]["space_platform_title_short"] = { + width = ui_width - margin_right - space_for_button, + parent= "label", + type = "label_style", + font = "default-large-semibold", + single_line = false, +} +data.raw["gui-style"]["default"]["space_platform_fieldset"] = { + width = ui_width - margin_right, + type = "frame_style", + parent = "frame", +} +data.raw["gui-style"]["default"]["space_platform_container"] = { + minimal_width = ui_width, + type = "frame_style", + parent = "frame", +} +data.raw["gui-style"]["default"]["space_platform_sprite_button"] = { + type = "button_style", + parent = "button", + width = 32, + height = 32, + top_padding = 1, + right_padding = 1, + bottom_padding = 1, + left_padding = 1, +} +data.raw["gui-style"]["default"]["space_platform_sprite_button_small"] = { + type = "button_style", + parent = "space_platform_sprite_button", + width = 20, + height = 20, +} +data.raw["gui-style"]["default"]["space_platform_button"] = { + type = "button_style", + parent = "button", +} +data.raw["gui-style"]["default"]["space_platform_progressbar_capsule"] = { + type = "progressbar_style", + parent = "progressbar", + color = { + r = 0/255, + g = 255/255, + b = 0/255 + } +} +data.raw["gui-style"]["default"]["space_platform_progressbar_sections"] = { + type = "progressbar_style", + parent = "progressbar", + color = { + r = 255/255, + g = 255/255, + b = 0/255 + } +} +data.raw["gui-style"]["default"]["space_platform_progressbar_fuel"] = { + type = "progressbar_style", + parent = "progressbar", + color = { + r = 233/255, + g = 93/255, + b = 0/255 + } +} +data.raw["gui-style"]["default"]["space_platform_progressbar_cargo"] = { + type = "progressbar_style", + parent = "progressbar", + color = { + r = 52/255, + g = 107/255, + b = 219/255 + } +} +data.raw["gui-style"]["default"]["space_platform_progressbar_integrity"] = { + type = "progressbar_style", + parent = "progressbar", + color = { + r = 233/255, + g = 0/255, + b = 0/255 + } +} +data.raw["gui-style"]["default"]["spaceship_progressbar_energy"] = { + type = "progressbar_style", + parent = "progressbar", + bar_width = 24, + color = { + r = 233/255, + g = 120/255, + b = 0/255 + } +} +data.raw["gui-style"]["default"]["spaceship_progressbar_streamline"] = { + type = "progressbar_style", + parent = "progressbar", + bar_width = 24, + color = { + r = 0/255, + g = 120/255, + b = 253/255 + } +} +data.raw["gui-style"]["default"]["spaceship_progressbar_integrity"] = { + type = "progressbar_style", + parent = "progressbar", + bar_width = 24, + color = { + r = 233/255, + g = 0/255, + b = 0/255 + } +} +data.raw["gui-style"]["default"]["view_zone_button"] = { + type = "button_style", + vertical_align = "center", + scale = 1, + scalable = false, + width = 300, + height = 32, + horizontally_stretchable = "off", + vertically_stretchable = "off", + horizontally_squashable = "off", + vertically_squashable = "off", + top_padding = 0, + bottom_padding = 0, + left_padding = 0, + right_padding = 0, + top_margin = 0, + bottom_margin = 0, + left_margin = 0, + right_margin = 0, +} +data.raw["gui-style"]["default"]["view_zone_button_flow"] = { + type = "horizontal_flow_style", + vertical_align = "center", + scale = 1, + scalable = false, + width = 300, + height = 32, + horizontally_stretchable = "off", + vertically_stretchable = "off", + horizontally_squashable = "off", + vertically_squashable = "off", + top_padding = 0, + bottom_padding = 0, + left_padding = 0, + right_padding = 0, + top_margin = 0, + bottom_margin = 0, + left_margin = 0, + right_margin = 0, +} +data.raw["gui-style"]["default"]["view_zone_button_label"] = { + type = "label_style", + scale = 1, + scalable = false, + width = 200, + height = 32, + horizontally_stretchable = "off", + vertically_stretchable = "off", + horizontally_squashable = "off", + vertically_squashable = "off", + top_padding = 0, + bottom_padding = 0, + left_padding = 0, + right_padding = 0, + top_margin = 0, + bottom_margin = 0, + left_margin = 0, + right_margin = 0, +} +data.raw["gui-style"]["default"]["view_zone_button_sprite"] = { + type = "button_style", + parent = "map_generator_preview_button", + icon_horizontal_align = "left", + width = 300 +} + +--icon_horizontal_align = "left", + +-- ZONELIST UI +data.raw["gui-style"]["default"]["zonelist_priority_textfield"] = { + type = "textbox_style", + default_background = { + base = { + center = { + position = {43,8}, + size = 1 + }, + corner_size = 8, + draw_type = "inner", + position = {34, 0} + }, + shadow = nil + }, + active_background = { + base = { + center = { + position = {60,26}, + size = 1 + }, + corner_size = 8, + draw_type = "inner", + position = {51, 17} + }, + } +} +data.raw["gui-style"]["default"]["zonelist_priority_button"] = { + default_graphical_set = { + base = { + corner_size = 8, + position = { + 247, + 17 + } + }, + --[[shadow = { + corner_size = 8, + draw_type = "outer", + position = { + 395, + 86 + } + }]]-- + }, + type = "button_style" +} + +data.raw["gui-style"]["default"]["zonelist_content_pane"] = { + type = "scroll_pane_style", + --extra_padding_when_activated = -4, + graphical_set = { + base = {}, + shadow = nil + }, + vertical_scrollbar_style = { + background_graphical_set = { + blend_mode = "multiplicative-with-alpha", + corner_size = 8, + opacity = 0.7, + position = { + 0, + 72 + } + }, + type = "vertical_scrollbar_style" + }, + vertically_stretchable = "on", + horizontally_squashable = "on", + padding = 12, +} + +data.raw["gui-style"]["default"]["zonelist_progressbar"] = { + type = "progressbar_style", + parent = "progressbar", + bar_width = 24, + color = { + r = 220/255, + g = 200/255, + b = 0/255 + } +} + +data.raw["gui-style"]["default"]["zonelist_rows_pane"] = { + type = "scroll_pane_style", + graphical_set = { + base = {}, + shadow = nil + }, + vertical_scrollbar_style = { + background_graphical_set = { + blend_mode = "multiplicative-with-alpha", + corner_size = 8, + opacity = 0.7, + position = { + 0, + 72 + } + }, + type = "vertical_scrollbar_style" + }, + vertically_stretchable = "on", + horizontally_squashable = "on", + padding = 0, + extra_padding_when_activated = 0, +} + + +data.raw["gui-style"]["default"]["zonelist_row_button"] = { + type = "button_style", + horizontally_stretchable = "on", + horizontally_squashable = "on", + bottom_margin = -3, + default_font_color = {250/255,250/255,250/255}, + hovered_font_color = { 0.0, 0.0, 0.0 }, + selected_clicked_font_color = { 0.97, 0.54, 0.15 }, + selected_font_color = { 0.97, 0.54, 0.15 }, + selected_hovered_font_color = { 0.97, 0.54, 0.15 }, + clicked_graphical_set = { + corner_size = 8, + position = { 51, 17 } + }, + default_graphical_set = { + corner_size = 8, + position = { 208, 17 } + }, + disabled_graphical_set = { + corner_size = 8, + position = { 17, 17 } + }, + hovered_graphical_set = { + base = { + corner_size = 8, + position = { 34, 17 } + } + } +} + +data.raw["gui-style"]["default"]["zonelist_row_button_selected"] = { + type = "button_style", + parent = "zonelist_row_button", + top_padding = 3, + left_padding = 11, + default_font_color = { 0.0, 0.0, 0.0 }, + hovered_font_color = { 0.0, 0.0, 0.0 }, + selected_clicked_font_color = { 0.0, 0.0, 0.0 }, + selected_font_color = { 0.0, 0.0, 0.0 }, + selected_hovered_font_color = { 0.0, 0.0, 0.0 }, + clicked_graphical_set = { + border = 1, + filename = "__core__/graphics/gui.png", + position = { 75, 108 }, + scale = 1, + size = 36 + }, + default_graphical_set = { + border = 1, + filename = "__core__/graphics/gui.png", + position = {75,108}, + scale = 1, + size = 36 + }, + hovered_graphical_set = { + border = 1, + filename = "__core__/graphics/gui.png", + position = {75,108}, + scale = 1, + size = 36 + }, +} + +data.raw["gui-style"]["default"]["se_frame_deep_slots_small"] = { + type = "frame_style", + parent = "slot_button_deep_frame", + background_graphical_set = { + position = {282, 17}, + corner_size = 8, + overall_tiling_vertical_size = 32, + overall_tiling_vertical_spacing = 8, + overall_tiling_vertical_padding = 4, + overall_tiling_horizontal_size = 32, + overall_tiling_horizontal_spacing = 8, + overall_tiling_horizontal_padding = 4 + } +} + +data.raw["gui-style"]["default"]["se_sprite-button_inset"] = { + type = "button_style", + size = 40, + padding = 0, + default_graphical_set = data.raw["gui-style"]["default"].textbox.default_background, + hovered_graphical_set = data.raw["gui-style"]["default"].rounded_button.clicked_graphical_set, + clicked_graphical_set = data.raw["gui-style"]["default"].textbox.active_background, + disabled_graphical_set = data.raw["gui-style"]["default"].rounded_button.disabled_graphical_set +} + +data.raw["gui-style"]["default"]["se_sprite-button_inset_tiny"] = { + type = "button_style", + parent = "se_sprite-button_inset", + size = 32 +} + +local graphic_set_down = { + default_graphical_set = { + base = { + center = { + position = {43,8}, + size = 1 + }, + corner_size = 8, + draw_type = "inner", + position = {34, 0} + }, + shadow = { + corner_size = 8, + draw_type = "outer", + position = { + 440, + 24 + } + } + }, +} +local graphic_set_active_a = { + default_font_color = { 0.0, 0.0, 0.0 }, + hovered_font_color = { 0.0, 0.0, 0.0 }, + selected_clicked_font_color = { 0.0, 0.0, 0.0 }, + selected_font_color = { 0.0, 0.0, 0.0 }, + selected_hovered_font_color = { 0.0, 0.0, 0.0 }, + default_graphical_set = { + base = { + corner_size = 8, + position = { + 369, + 17 + } + }, + shadow = { + corner_size = 8, + draw_type = "outer", + position = { + 440, + 24 + } + } + }, +} +data.raw["gui-style"]["default"]["se_button_discovery"] = { + type = "button_style", + parent = "se_generic_button", + width = 165, + height = 90, + top_padding = 20, + horizontal_align = "center", + vertical_align = "center" +} +data.raw["gui-style"]["default"]["se_button_discovery_down"] = { + type = "button_style", + parent = "se_generic_button_down", + width = 165, + height = 90, + top_padding = 20, + horizontal_align = "center", + vertical_align = "center" +} +data.raw["gui-style"]["default"]["se_button_discovery_active"] = { + type = "button_style", + parent = "se_generic_button_active", + width = 165, + height = 90, + top_padding = 20, + horizontal_align = "center", + vertical_align = "center" +} + +data.raw["gui-style"]["default"]["se_button_discovery_any"] = { + type = "button_style", + parent = "se_generic_button", + width = 340, + height = 70, + padding = 10, + horizontal_align = "center", + vertical_align = "center", + horizontally_stretchable = "on", + font="heading-2", +} +data.raw["gui-style"]["default"]["se_button_discovery_any_down"] = { + type = "button_style", + parent = "se_generic_button_down", + width = 340, + height = 70, + padding = 10, + horizontal_align = "center", + vertical_align = "center", + horizontally_stretchable = "on", + font="heading-2", +} +data.raw["gui-style"]["default"]["se_button_discovery_any_active"] = { + type = "button_style", + parent = "se_generic_button_active", + width = 340, + height = 70, + padding = 10, + horizontal_align = "center", + vertical_align = "center", + horizontally_stretchable = "on", + font="heading-2", +} + +local graphic_set_active_b = { + default_graphical_set = { + base = { + center = { + position = {43+17,8+17}, + size = 1 + }, + corner_size = 8, + draw_type = "inner", + position = {34+17, 0+17} + }, + shadow = { + corner_size = 8, + draw_type = "outer", + position = { + 440, + 24 + } + } + } +} + +data_util.extend_style("frame_button", "se_generic_button", { + padding = -4, + default_font_color = { 1,1,1 }, +}) +data_util.extend_style("se_generic_button", "se_generic_button_down", graphic_set_down) +data_util.extend_style("se_generic_button", "se_generic_button_active", graphic_set_active_a) + +local discovery_overrides = { + width = 165, + height = 90, + top_padding = 20, + horizontal_align = "center", + vertical_align = "center" +} +data_util.extend_style("se_generic_button", "se_button_discovery", discovery_overrides) +data_util.extend_style("se_generic_button_down", "se_button_discovery_down", discovery_overrides) +data_util.extend_style("se_generic_button_active", "se_button_discovery_active", discovery_overrides) + +local discovery_any_overrides = data_util.apply_styles(table.deepcopy(discovery_overrides), { + width = 340, + height = 70, + padding = 10, + horizontally_stretchable = "on", + font="heading-2", +}) +data_util.extend_style("se_generic_button", "se_button_discovery_any", discovery_any_overrides) +data_util.extend_style("se_generic_button_down", "se_button_discovery_any_down", discovery_any_overrides) +data_util.extend_style("se_generic_button_active", "se_button_discovery_any_active", discovery_any_overrides) + +data_util.extend_style("frame_button", "se_generic_square_button", { + size = 28, + top_padding = -2, + top_margin = -4, + default_font_color = { 1,1,1 }, +}) +data_util.extend_style("se_generic_square_button", "se_generic_square_button_down", graphic_set_down) +data_util.extend_style("se_generic_square_button", "se_generic_square_button_active", graphic_set_active_b) + +local zone_list_overrides = { + height = 28, + width = 28, + right_margin = 5, + top_margin = -2 +} + +data_util.extend_style("se_generic_square_button", "se_zone_list_filter", zone_list_overrides) +data_util.extend_style("se_generic_square_button_down", "se_zone_list_filter_down", zone_list_overrides) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/technology/bio-upgrades.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/technology/bio-upgrades.lua new file mode 100644 index 0000000..c09d224 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/technology/bio-upgrades.lua @@ -0,0 +1,46 @@ +local data_util = require("data_util") + +local upgrade_types = { + {name = "constitution", tint = {r = 1, g = 0, b = 0}, effects = {{type = "character-health-bonus", modifier = 50}}}, + {name = "strength", tint = {r = 1, g = 1, b = 0}, effects = {{type = "character-inventory-slots-bonus", modifier = 5}}}, + {name = "agility", tint = {r = 0, g = 1, b = 0}, effects = {{type = "character-running-speed", modifier = 0.1}}}, + {name = "dexterity", tint = {r = 0, g = 1, b = 1}, effects = {{type = "character-crafting-speed", modifier = 0.2}}}, + {name = "intelligence", tint = {r = 0, g = 0, b = 1}, effects = {{type = "laboratory-productivity", modifier = 0.05}}}, +} + +for _, upgrade_type in pairs(upgrade_types) do + for i = 1, 5 do + data:extend({ + { + type = "technology", + name = data_util.mod_prefix .. "bio-upgrade-"..upgrade_type.name.."-"..i, + effects = table.deepcopy(upgrade_type.effects), + icons = { + { icon = "__space-exploration-graphics__/graphics/technology/bio-upgrade-base.png", icon_size = 128 }, + { icon = "__space-exploration-graphics__/graphics/technology/bio-upgrade-flask.png", icon_size = 128 }, + { icon = "__space-exploration-graphics__/graphics/technology/bio-upgrade-mask.png", icon_size = 128, tint = upgrade_type.tint}, + }, + order = "e-g", + upgrade = true, + prerequisites = { + i == 5 and (data_util.mod_prefix .. "deep-space-science-pack-1") or (data_util.mod_prefix .. "biological-science-pack-"..math.min(4,i)), + i > 1 and (data_util.mod_prefix .. "bio-upgrade-"..upgrade_type.name.."-"..(i-1)) or nil, + }, + unit = { + count = 2^i*50, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-"..math.min(4,i), 1 }, + i == 5 and { data_util.mod_prefix .. "deep-space-science-pack-1", 1 } or nil, + } + }, + }, + }) + end +end + +data.raw.technology[data_util.mod_prefix .. "bio-upgrade-strength-5"].effects[1].modifier = 10 diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/technology/technology.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/technology/technology.lua new file mode 100644 index 0000000..44e2ef5 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/technology/technology.lua @@ -0,0 +1,5564 @@ +local data_util = require("data_util") + + +if not data.raw.technology["sand-processing"] then + data:extend({{ + type = "technology", + name = "sand-processing", + effects = { + { type = "unlock-recipe", recipe = "sand-from-stone"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/sand-processing.png", + icon_size = 128, + order = "a", + prerequisites = {}, -- if basic automation existed from AAI Industry then this would not fire anyway + unit = { + count = 10, + ingredients = { + {"automation-science-pack", 1}, + }, + time = 30 + }, + }}) +end + +if not data.raw.technology["glass-processing"] then + data:extend({{ + type = "technology", + name = "glass-processing", + effects = { + { type = "unlock-recipe", recipe = "glass-from-sand"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/glass-processing.png", + icon_size = 128, + order = "a", + prerequisites = {"sand-processing"}, + unit = { + count = 40, + ingredients = { + {"automation-science-pack", 1}, + }, + time = 30 + }, + }}) +end + +data:extend({ + -- alphabetical + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-science-pack", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "rocket-science-pack", }, + }, + icons = { + {icon = "__space-exploration-graphics__/graphics/technology/catalogue/deep-1.png", icon_size = 128}, + {icon = "__space-exploration-graphics__/graphics/technology/catalogue/mask-1.png", icon_size = 128}, + }, + order = "g-e-c", + prerequisites = { + data_util.mod_prefix .. "space-science-lab", + }, + unit = { + count = 500, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = "energy-shield-mk3-equipment", + effects = { + { type = "unlock-recipe", recipe = "energy-shield-mk3-equipment", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/energy-shield-green.png", + icon_size = 128, + order = "g-e-c", + prerequisites = { + "energy-shield-mk2-equipment", + }, + unit = { + count = 1000, + time = 60, + ingredients = {} + }, + }, + { + type = "technology", + name = "energy-shield-mk4-equipment", + effects = { + { type = "unlock-recipe", recipe = "energy-shield-mk4-equipment", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/energy-shield-cyan.png", + icon_size = 128, + order = "g-e-d", + prerequisites = { + "energy-shield-mk3-equipment", + }, + unit = { + count = 2000, + time = 60, + ingredients = {} + }, + }, + { + type = "technology", + name = "energy-shield-mk5-equipment", + effects = { + { type = "unlock-recipe", recipe = "energy-shield-mk5-equipment", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/energy-shield-blue.png", + icon_size = 128, + order = "g-e-e", + prerequisites = { + data_util.mod_prefix.."nanomaterial", + "energy-shield-mk4-equipment", + }, + unit = { + count = 4000, + time = 60, + ingredients = {} + }, + }, + { + type = "technology", + name = "energy-shield-mk6-equipment", + effects = { + { type = "unlock-recipe", recipe = "energy-shield-mk6-equipment", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/energy-shield-magenta.png", + icon_size = 128, + order = "g-e-f", + prerequisites = { + "energy-shield-mk5-equipment", + }, + unit = { + count = 8000, + time = 60, + ingredients = {} + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "adaptive-armour-1", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "adaptive-armour-equipment-1", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/adaptive-armour-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "modular-armor", + }, + unit = { + count = 100, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "adaptive-armour-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "adaptive-armour-equipment-2", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/adaptive-armour-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "military-science-pack", + data_util.mod_prefix .. "adaptive-armour-1", + }, + unit = { + count = 200, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "military-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "adaptive-armour-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "adaptive-armour-equipment-3", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/adaptive-armour-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-science-pack", + data_util.mod_prefix .. "adaptive-armour-2", + }, + unit = { + count = 300, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "military-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "adaptive-armour-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "adaptive-armour-equipment-4", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/adaptive-armour-4.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "material-science-pack-1", + data_util.mod_prefix .. "adaptive-armour-3", + }, + unit = { + count = 400, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "military-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "adaptive-armour-5", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "adaptive-armour-equipment-5", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/adaptive-armour-5.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "nanomaterial", + data_util.mod_prefix .. "material-science-pack-4", + data_util.mod_prefix .. "adaptive-armour-4", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "military-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "aeroframe-pole", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "aeroframe-pole", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/aeroframe-pole.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-beryllium", + data_util.mod_prefix .. "astronomic-science-pack-1", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "aeroframe-scaffold", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "aeroframe-scaffold", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "low-density-structure-beryllium"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/aeroframe-scaffold.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "aeroframe-pole", + data_util.mod_prefix .. "astronomic-science-pack-2", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "aeroframe-bulkhead", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "aeroframe-bulkhead", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/aeroframe-bulkhead.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "aeroframe-scaffold", + data_util.mod_prefix .. "astronomic-science-pack-3", + }, + unit = { + count = 200, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "antimatter-reactor", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "antimatter-reactor", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/antimatter-reactor.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "nuclear-power", + data_util.mod_prefix .. "antimatter-production" + }, + unit = { + count = 1000, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "astronomic-science-pack-1", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-science-pack-1", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-science-pack-1-no-beryllium", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "cargo-rocket-section-beryllium", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/astronomic-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-beryllium", + data_util.mod_prefix .. "space-catalogue-astronomic-1" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "astronomic-science-pack-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-science-pack-2", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/astronomic-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-astronomic-2" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "astronomic-science-pack-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-science-pack-3", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/astronomic-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-astronomic-3" + }, + unit = { + count = 200, + time = 60, + ingredients = { + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "astronomic-science-pack-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-science-pack-4", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/astronomic-4.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-astronomic-4" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "biological-science-pack-1", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "biological-science-pack-1", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/biological-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-vitamelange", + data_util.mod_prefix .. "space-catalogue-biological-1" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "biological-science-pack-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biological-science-pack-2", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/biological-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-biological-2", + data_util.mod_prefix .. "bioscrubber" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "biological-science-pack-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biological-science-pack-3", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/biological-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-biological-3" + }, + unit = { + count = 200, + time = 60, + ingredients = { + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + { data_util.mod_prefix .. "biological-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "biological-science-pack-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biological-science-pack-4", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/biological-4.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-biological-4" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + { data_util.mod_prefix .. "biological-science-pack-2", 1 }, + { data_util.mod_prefix .. "biological-science-pack-3", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "core-miner", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "core-miner", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/core-miner.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "oil-processing", + data_util.mod_prefix .. "pulveriser", + "electric-mining" + }, + unit = { + count = 200, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + } + }, + }, + { + name = data_util.mod_prefix .. "cryogun", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "cryogun" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "cryogun-ammo" } + }, + icon = "__space-exploration-graphics__/graphics/technology/cryogun.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + "military-3", + data_util.mod_prefix .. "aeroframe-pole", + data_util.mod_prefix .. "processing-cryonite", + data_util.mod_prefix .. "space-thermodynamics-laboratory", + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "meteor-point-defence", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .."meteor-point-defence" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .."meteor-point-defence-ammo" } + }, + icons = { + {icon="__space-exploration-graphics__/graphics/technology/meteor-point-defence-base.png", icon_size = 128}, + {icon="__space-exploration-graphics__/graphics/technology/meteor-point-defence-mask.png", icon_size = 128, tint = {r=255,g=0,b=0}} + }, + order = "g-b-z", + prerequisites = { + "steel-processing", + "concrete", + "electronics", + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + }, + time = 30 + } + }, + { + name = data_util.mod_prefix .. "meteor-defence", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .."meteor-defence" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .."meteor-defence-ammo" } + }, + icon = "__space-exploration-graphics__/graphics/technology/meteor-defence.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + "laser", + "advanced-electronics-2", + "battery", + data_util.mod_prefix .. "meteor-point-defence", + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + }, + time = 30 + } + }, + { + type = "technology", + name = data_util.mod_prefix .. "deep-catalogue-1", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "deep-catalogue-1", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "nano-engineering-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-structural-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-energy-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "void-probe" }, + }, + icons = { + {icon = "__space-exploration-graphics__/graphics/technology/catalogue/base-catalogue-1.png", icon_size = 128}, + {icon = "__space-exploration-graphics__/graphics/technology/catalogue/mask-catalogue-1.png", icon_size = 128}, + }, + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-naquium", + data_util.mod_prefix .. "nanomaterial", + data_util.mod_prefix .. "energy-science-pack-4", + data_util.mod_prefix .. "biological-science-pack-4", + data_util.mod_prefix .. "space-supercomputer-3", + }, + unit = { + count = 1000, + time = 60, + ingredients = { + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "deep-catalogue-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "deep-catalogue-2", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "singularity-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "hyperlattice-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "timespace-anomaly-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "annihilation-data" }, + }, + icons = { + {icon = "__space-exploration-graphics__/graphics/technology/catalogue/base-catalogue-2.png", icon_size = 128}, + {icon = "__space-exploration-graphics__/graphics/technology/catalogue/mask-catalogue-2.png", icon_size = 128}, + }, + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "antimatter-production", + data_util.mod_prefix .. "deep-space-science-pack-1", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "deep-catalogue-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "deep-catalogue-3" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-fold-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-fold-data-alt" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-warp-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-warp-data-alt" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-dialation-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-dialation-data-alt" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-injection-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-injection-data-alt" }, + }, + icons = { + {icon = "__space-exploration-graphics__/graphics/technology/catalogue/base-catalogue-3.png", icon_size = 128}, + {icon = "__space-exploration-graphics__/graphics/technology/catalogue/mask-catalogue-3.png", icon_size = 128}, + }, + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "naquium-tessaract", + data_util.mod_prefix .. "deep-space-science-pack-2", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "deep-catalogue-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "deep-catalogue-4" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "interstellar-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "teleportation-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "wormhole-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "rhga-data" }, + }, + icons = { + {icon = "__space-exploration-graphics__/graphics/technology/catalogue/base-catalogue-4.png", icon_size = 128}, + {icon = "__space-exploration-graphics__/graphics/technology/catalogue/mask-catalogue-4.png", icon_size = 128}, + }, + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "nexus", + data_util.mod_prefix .. "deep-space-science-pack-3", + }, + unit = { + count = 5000, + time = 60, + ingredients = { + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-3", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "deep-space-science-pack-1", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "deep-space-science-pack-1", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/deep-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "deep-catalogue-1", + }, + unit = { + count = 2000, + time = 60, + ingredients = { + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "deep-space-science-pack-2", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "deep-space-science-pack-2", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/deep-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "deep-catalogue-2", + }, + unit = { + count = 2000, + time = 60, + ingredients = { + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "deep-space-science-pack-3", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "deep-space-science-pack-3", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/deep-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "deep-catalogue-3", + }, + unit = { + count = 2000, + time = 60, + ingredients = { + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "deep-space-science-pack-4", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "deep-space-science-pack-4", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/deep-4.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "deep-catalogue-4", + }, + unit = { + count = 2000, + time = 60, + ingredients = { + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-3", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "energy-science-pack-1", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "energy-science-pack-1", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/energy-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-holmium", + data_util.mod_prefix .. "space-catalogue-energy-1" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "energy-science-pack-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-science-pack-2", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/energy-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-energy-2" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "energy-science-pack-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-science-pack-3", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/energy-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-energy-3" + }, + unit = { + count = 200, + time = 60, + ingredients = { + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "energy-science-pack-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-science-pack-4", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/energy-4.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-energy-4" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "fluid-burner-generator", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "fluid-burner-generator", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/fluid-burner-generator.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-radiator-1" + }, + unit = { + count = 200, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "fuel-refining", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "fuel-refinery", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/fuel-refinery.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "oil-processing" + }, + unit = { + count = 100, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "heat-shielding", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "heat-shielding", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/heat-shielding.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "chemical-science-pack", + "sulfur-processing" + }, + unit = { + count = 100, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "heavy-girder", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "heavy-girder", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/heavy-girder.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-iridium", + data_util.mod_prefix .. "material-science-pack-1", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "heavy-bearing", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "heavy-bearing", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/heavy-bearing.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "heavy-girder", + data_util.mod_prefix .. "material-science-pack-2", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "heavy-composite", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "heavy-composite", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/heavy-composite.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "heavy-bearing", + data_util.mod_prefix .. "material-science-pack-3", + }, + unit = { + count = 200, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "heavy-assembly", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "heavy-assembly", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/heavy-assembly.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "heavy-composite", + data_util.mod_prefix .. "material-science-pack-4", + }, + unit = { + count = 400, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "holmium-cable", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "holmium-cable", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "processing-unit-holmium", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/holmium-cable.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-holmium", + data_util.mod_prefix .. "energy-science-pack-1", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "holmium-solenoid", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "holmium-solenoid", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/holmium-solenoid.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "holmium-cable", + data_util.mod_prefix .. "energy-science-pack-2", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "quantum-processor", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "quantum-processor", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/quantum-processor.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "holmium-solenoid", + data_util.mod_prefix .. "energy-science-pack-3", + }, + unit = { + count = 200, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "dynamic-emitter", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "dynamic-emitter", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/dynamic-emitter.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "quantum-processor", + data_util.mod_prefix .. "energy-science-pack-4", + }, + unit = { + count = 400, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "lattice-pressure-vessel", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "lattice-pressure-vessel", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/lattice-pressure-vessel.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "aeroframe-bulkhead", + data_util.mod_prefix .. "astronomic-science-pack-4", + }, + unit = { + count = 400, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "long-range-star-mapping", + effects = {}, + icon = "__space-exploration-graphics__/graphics/technology/long-range-star-mapping.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-2", + }, + max_level = "30", -- probably shouldn't go over 40 + unit = { + count_formula = "1.25^L*100", + time = 60, + ingredients = { + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 }, + } + }, + enabled = false -- unlocked by building gate + }, + { + type = "technology", + name = data_util.mod_prefix .. "dimensional-anchor", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "dimensional-anchor", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/dimensional-anchor.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "naquium-tessaract", + }, + unit = { + count_formula = "1000", + time = 60, + ingredients = { + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-3", 1 }, + } + }, + enabled = false -- unlocked by building gate + }, + + { + type = "technology", + name = data_util.mod_prefix .. "material-science-pack-1", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "material-science-pack-1", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/material-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-iridium", + data_util.mod_prefix .. "space-catalogue-material-1" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "material-science-pack-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-science-pack-2", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/material-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-material-2" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "material-science-pack-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-science-pack-3", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/material-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-material-3" + }, + unit = { + count = 200, + time = 60, + ingredients = { + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "material-science-pack-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-science-pack-4", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/material-4.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-material-4" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "medpack", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "medpack", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/medpack-1.png", + icon_size = 128, + order = "a-a-a", + unit = { + count = 10, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "medpack-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "medpack-plastic", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "medpack-2", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/medpack-2.png", + icon_size = 128, + order = "a-a-b", + prerequisites = { + data_util.mod_prefix .. "lifesupport-facility", + data_util.mod_prefix .. "medpack" + }, + unit = { + count = 200, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "medpack-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "medpack-3", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/medpack-3.png", + icon_size = 128, + order = "a-b", + prerequisites = { + data_util.mod_prefix .. "biological-science-pack-1", + data_util.mod_prefix .. "medpack-2" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "medpack-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "medpack-4", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/medpack-4.png", + icon_size = 128, + order = "a-c", + prerequisites = { + data_util.mod_prefix .. "biological-science-pack-4", + data_util.mod_prefix .. "medpack-3" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "naquium-cube", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-cube", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/naquium-cube.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-1", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "naquium-tessaract", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-tessaract", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-tessaract-alt", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/naquium-tessaract.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "arcosphere-folding", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "naquium-processor", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-processor", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-processor-alt", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/naquium-processor.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-3", + }, + unit = { + count = 1000, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-3", 1 }, + } + }, + }, + + { + name = data_util.mod_prefix .. "plague", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "plague-bomb" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/plague.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + "military-3", + "rocketry", + data_util.mod_prefix .. "biological-science-pack-4", + }, + type = "technology", + unit = { + count = 1000, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1 }, + }, + time = 60 + } + }, + + { + type = "technology", + name = data_util.mod_prefix .. "processing-beryllium", + effects = { + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "beryllium-ore-crushed"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "beryllium-sulfate"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "beryllium-hydroxide"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "beryllium-powder"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "beryllium-ingot"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "beryllium-plate"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/beryllium-processing.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-cryonite", + data_util.mod_prefix .. "rocket-science-pack", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "processing-cryonite", + effects = { + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "cryonite-crushed"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "cryonite-washed"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "cryonite-rod"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "cryonite-ion-exchange-beads"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "cryonite-slush"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "cryonite-lubricant"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "cryonite-to-water-ice"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "melting-water-ice"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/cryonite-processing.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "pulveriser", + "industrial-furnace", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "processing-holmium", + effects = { + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "holmium-ore-crushed"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "holmium-ore-washed"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "holmium-powder"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "holmium-ingot"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "holmium-plate"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/holmium-processing.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-vulcanite", + data_util.mod_prefix .. "rocket-science-pack", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "processing-iridium", + effects = { + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "iridium-ore-crushed"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "iridium-ore-washed"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "iridium-powder"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "iridium-ingot"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "iridium-plate"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "heat-shielding-iridium"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/iridium-processing.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-vulcanite", + data_util.mod_prefix .. "processing-cryonite", + data_util.mod_prefix .. "rocket-science-pack", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "processing-naquium", + effects = { + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-ore-crushed"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-ore-washed"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-powder"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-ingot"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-plate"}, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-heat-pipe", }, + --{ type = "unlock-recipe", recipe = data_util.mod_prefix .. "naquium-heat-pipe-long", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/naquium-processing.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "material-science-pack-4", + data_util.mod_prefix .. "astronomic-science-pack-4" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + } + }, + }, + --[[{ + type = "technology", + name = data_util.mod_prefix .. "enriched-naquium", + effects = { + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "enriched-naquium"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/naquium-processing.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-1" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + } + }, + },]] + { + type = "technology", + name = data_util.mod_prefix .. "processing-vitamelange", + effects = { + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "vitamelange-nugget"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "vitamelange-roast"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "vitamelange-spice"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "vitamelange-extract"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/vitamelange-processing.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-vulcanite", + data_util.mod_prefix .. "rocket-science-pack", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "processing-vulcanite", + effects = { + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "vulcanite-crushed"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "vulcanite-washed"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "vulcanite-block"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "vulcanite-ion-exchange-beads"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "iron-smelting-vulcanite"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "copper-smelting-vulcanite"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "stone-brick-vulcanite"}, + {type = "unlock-recipe", recipe = data_util.mod_prefix .. "glass-vulcanite"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/vulcanite-processing.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "core-miner", + "industrial-furnace", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "pulveriser", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "pulveriser", + }, + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "pulverised-sand" + } + }, + icon = "__space-exploration-graphics__/graphics/technology/pulveriser.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "fluid-handling", + "concrete", + "steel-processing", + }, + unit = { + count = 150, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "addon-power-pole", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "addon-power-pole", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/addon-power-pole.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "aeroframe-pole", + data_util.mod_prefix .. "holmium-cable", + }, + unit = { + count = 50, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "pylon", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "pylon", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/pylon.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "aeroframe-pole", + data_util.mod_prefix .. "holmium-cable", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "pylon-substation", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "pylon-substation", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/pylon-substation.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "pylon", + data_util.mod_prefix .. "holmium-solenoid", + }, + unit = { + count = 200, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "pylon-construction", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "pylon-construction", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/pylon-construction.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "pylon", + data_util.mod_prefix .. "holmium-solenoid", + data_util.mod_prefix .. "aeroframe-scaffold", + data_util.mod_prefix .. "heavy-girder", + }, + unit = { + count = 200, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "pylon-construction-radar", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "pylon-construction-radar", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/pylon-construction-radar.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "pylon-construction", + data_util.mod_prefix .. "quantum-processor", + data_util.mod_prefix .. "aeroframe-bulkhead", + data_util.mod_prefix .. "heavy-bearing", + }, + unit = { + count = 300, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + } + }, + }, + + { + name = data_util.mod_prefix .. "railgun", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "railgun" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "railgun-ammo" } + }, + icon = "__space-exploration-graphics__/graphics/technology/railgun.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + "military-3", + data_util.mod_prefix .. "space-electromagnetics-laboratory", + data_util.mod_prefix .. "material-science-pack-1", + data_util.mod_prefix .. "heavy-girder", + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + }, + time = 60 + } + }, + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-fuel-from-water", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "rocket-fuel-from-water-copper", } + }, + icon = "__base__/graphics/technology/rocket-fuel.png", + icon_size = 256, + order = "e-g", + prerequisites = { + "rocket-fuel" + }, + unit = { + count = 500, + time = 15, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-landing-pad", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "rocket-landing-pad", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "cargo-rocket-section-pack", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "cargo-rocket-section-unpack", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/rocket-landing-pad.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-launch-pad" + }, + unit = { + count = 500, + time = 15, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-launch-pad", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-capsule", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "cargo-rocket-section", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "cargo-rocket-cargo-pod", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "cargo-rocket-fuel-tank", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "rocket-launch-pad", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/rocket-launch-pad.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "thruster-suit", + "electric-engine", + "battery", + }, + unit = { + count = 500, + time = 15, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "rocket-cargo-safety-1", + effects = { }, + icon = "__space-exploration-graphics__/graphics/technology/rocket-cargo-safety.png", + icon_size = 128, + order = "e-g", + prerequisites = { data_util.mod_prefix .. "rocket-launch-pad" }, + unit = { + count = 100, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-cargo-safety-2", + effects = { }, + icon = "__space-exploration-graphics__/graphics/technology/rocket-cargo-safety.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-cargo-safety-1", + data_util.mod_prefix .. "rocket-science-pack" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-cargo-safety-3", + effects = { }, + icon = "__space-exploration-graphics__/graphics/technology/rocket-cargo-safety.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-cargo-safety-2", + data_util.mod_prefix .. "astronomic-science-pack-1" + }, + max_level = "infinite", + unit = { + count_formula = "2^L", + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + upgrade = true + }, + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-reusability-1", + effects = { }, + icon = "__space-exploration-graphics__/graphics/technology/rocket-reusability.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-landing-pad" + }, + unit = { + count = 100, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-reusability-2", + effects = { }, + icon = "__space-exploration-graphics__/graphics/technology/rocket-reusability.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-reusability-1", + data_util.mod_prefix .. "rocket-science-pack" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-reusability-3", + effects = { }, + icon = "__space-exploration-graphics__/graphics/technology/rocket-reusability.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-reusability-2", + data_util.mod_prefix .. "astronomic-science-pack-1" + }, + max_level = "20", + unit = { + count_formula = "2^L", + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + upgrade = true + }, + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-survivability-1", + effects = { }, + icon = "__space-exploration-graphics__/graphics/technology/rocket-survivability.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-landing-pad" + }, + unit = { + count = 100, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-survivability-2", + effects = { }, + icon = "__space-exploration-graphics__/graphics/technology/rocket-survivability.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-survivability-1", + data_util.mod_prefix .. "rocket-science-pack" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "rocket-survivability-3", + effects = { }, + icon = "__space-exploration-graphics__/graphics/technology/rocket-survivability.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-survivability-2", + data_util.mod_prefix .. "astronomic-science-pack-1" + }, + max_level = "infinite", + unit = { + count_formula = "2^L", + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + upgrade = true + }, + + { + name = data_util.mod_prefix .. "rtg-equipment", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .."rtg-equipment" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/rtg-equipment.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + "advanced-electronics-2", + "low-density-structure", + "solar-panel-equipment", + "uranium-processing", + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + }, + time = 30 + } + }, + { + name = data_util.mod_prefix .. "rtg-equipment-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .."rtg-equipment-2" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/rtg-equipment-2.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "rtg-equipment", + data_util.mod_prefix .. "energy-science-pack-2", + data_util.mod_prefix .. "holmium-solenoid", + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 } + }, + time = 60 + } + }, + + + { + name = data_util.mod_prefix .. "space-accumulator", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-accumulator" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/accumulator.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + "electric-energy-accumulators", + data_util.mod_prefix .. "holmium-cable", + data_util.mod_prefix .. "heavy-girder", + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 } + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "space-accumulator-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-accumulator-2" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/accumulator-2.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "space-accumulator", + data_util.mod_prefix .. "superconductive-cable", + data_util.mod_prefix .. "naquium-cube", + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + }, + time = 60 + }, + localised_name = {"technology-name."..data_util.mod_prefix .. "space-accumulator-2"} + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-astrometrics-laboratory", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-astrometrics-laboratory"}, + }, + icon = "__space-exploration-graphics__/graphics/technology/astrometrics-laboratory.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-telescope", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-assembling", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-assembling-machine" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/space-assembling.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-platform-scaffold", + "automation-2" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "condenser-turbine", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "condenser-turbine" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/condenser-turbine.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-science-pack", + "nuclear-power" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-biochemical-laboratory", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-biochemical-laboratory" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bio-sludge-from-wood" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bio-sludge-from-fish" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bio-sludge" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bio-sludge-crude-oil" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "nutrient-gel" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "nutrient-gel-methane" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "nutrient-vat" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "melting-methane-ice" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/biochemical-laboratory.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-science-pack" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-astronomic-1", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-a" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-insight-1" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-catalogue-1" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astrometric-analysis-multispectral-1" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "visible-observation-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "uv-observation-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "infrared-observation-data" }, + --{ type = "unlock-recipe", recipe = data_util.mod_prefix .. "doppler-shift-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/astronomic-catalogue-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-gravimetrics-laboratory", + data_util.mod_prefix .. "space-laser-laboratory", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-astronomic-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-insight-2" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-catalogue-2" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astrometric-analysis-multispectral-2" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "microwave-observation-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "xray-observation-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "gravitational-lensing-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "gravity-wave-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/astronomic-catalogue-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "astronomic-science-pack-1", + data_util.mod_prefix .. "space-telescope-xray", + data_util.mod_prefix .. "space-telescope-microwave", + data_util.mod_prefix .. "aeroframe-pole", + data_util.mod_prefix .. "space-gravimetrics-laboratory", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-astronomic-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-insight-3" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-catalogue-3" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astrometric-analysis-multispectral-3" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "radio-observation-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "gammaray-observation-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "negative-pressure-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "darkmatter-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/astronomic-catalogue-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "astronomic-science-pack-2", + data_util.mod_prefix .. "space-telescope-gammaray", + data_util.mod_prefix .. "space-telescope-radio", + data_util.mod_prefix .. "aeroframe-scaffold", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-astronomic-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-insight-4" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "astronomic-catalogue-4" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "dark-energy-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "micro-black-hole-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "zero-point-energy-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "belt-probe" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/astronomic-catalogue-4.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "astronomic-science-pack-3", + data_util.mod_prefix .. "space-particle-collider", + data_util.mod_prefix .. "space-electromagnetics-laboratory", + data_util.mod_prefix .. "aeroframe-bulkhead", + data_util.mod_prefix .. "space-probe", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-biological-1", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-b" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biological-insight-1" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biological-catalogue-1" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bio-combustion-data" }, + --{ type = "unlock-recipe", recipe = data_util.mod_prefix .. "bio-spectral-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biomechanical-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biochemical-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/biological-catalogue-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-growth-facility", + data_util.mod_prefix .. "space-thermodynamics-laboratory", + data_util.mod_prefix .. "space-mechanical-laboratory", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-biological-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biological-insight-2" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biological-catalogue-2" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "experimental-genetic-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biochemical-resistance-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biomechanical-resistance-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bio-combustion-resistance-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "experimental-specimen" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/biological-catalogue-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "biological-science-pack-1", + data_util.mod_prefix .. "vitalic-acid", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-biological-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biological-insight-3" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biological-catalogue-3" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bioelectrics-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "decompression-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "cryogenics-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "radiation-exposure-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "neural-gel-2" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "significant-specimen" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/biological-catalogue-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "biological-science-pack-2", + data_util.mod_prefix .. "space-radiation-laboratory", + data_util.mod_prefix .. "vitalic-reagent", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + { data_util.mod_prefix .. "biological-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-biological-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biological-insight-4" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "biological-catalogue-4" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "comparative-genetic-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "decompression-resistance-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "neural-anomaly-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "radiation-exposure-resistance-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/biological-catalogue-4.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "biological-science-pack-3", + data_util.mod_prefix .. "vitalic-epoxy", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + { data_util.mod_prefix .. "biological-science-pack-2", 1 }, + { data_util.mod_prefix .. "biological-science-pack-3", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-material-1", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-m" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-insight-1" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-catalogue-1" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "cold-thermodynamics-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "hot-thermodynamics-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "tensile-strength-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "compressive-strength-data" }, + --{ type = "unlock-recipe", recipe = data_util.mod_prefix .. "shear-strength-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/material-catalogue-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-thermodynamics-laboratory", + data_util.mod_prefix .. "space-mechanical-laboratory", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-material-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-insight-2" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-catalogue-2" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "rigidity-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "impact-shielding-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "pressure-containment-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "corrosion-resistance-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/material-catalogue-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "material-science-pack-1", + data_util.mod_prefix .. "space-biochemical-laboratory", + data_util.mod_prefix .. "heavy-girder", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-material-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-insight-3" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-catalogue-3" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "friction-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "ballistic-shielding-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "explosion-shielding-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "radiation-shielding-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/material-catalogue-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "material-science-pack-2", + data_util.mod_prefix .. "space-radiation-laboratory", + data_util.mod_prefix .. "heavy-bearing", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-material-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-insight-4" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-catalogue-4" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "electrical-shielding-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "laser-shielding-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "particle-beam-shielding-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "experimental-alloys-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/material-catalogue-4.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "material-science-pack-3", + data_util.mod_prefix .. "space-electromagnetics-laboratory", + data_util.mod_prefix .. "space-laser-laboratory", + data_util.mod_prefix .. "space-particle-collider", + data_util.mod_prefix .. "heavy-composite", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-energy-1", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-s" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-insight-1" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-catalogue-1" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "conductivity-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "electromagnetic-field-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "polarisation-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "radiation-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/energy-catalogue-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-laser-laboratory", + data_util.mod_prefix .. "space-radiation-laboratory", + data_util.mod_prefix .. "space-electromagnetics-laboratory", + data_util.mod_prefix .. "space-particle-accelerator", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-energy-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-insight-2" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-catalogue-2" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "atomic-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "subatomic-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "quantum-phenomenon-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "forcefield-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/energy-catalogue-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "energy-science-pack-1", + data_util.mod_prefix .. "space-particle-collider", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-energy-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-insight-3" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-catalogue-3" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "superconductivity-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "entanglement-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "quark-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "lepton-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/energy-catalogue-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "energy-science-pack-2", + data_util.mod_prefix .. "holmium-solenoid", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-energy-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-insight-4" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "energy-catalogue-4" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "boson-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "fusion-test-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "magnetic-monopole-data" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "star-probe" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/energy-catalogue-4.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "energy-science-pack-3", + data_util.mod_prefix .. "space-supercomputer-2", + data_util.mod_prefix .. "space-probe", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + } + }, + }, +--[[ + { + type = "technology", + name = data_util.mod_prefix .. "space-catalogue-universal", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "universal-catalogue" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/universal-catalogue.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-supercomputer-3", + data_util.mod_prefix .. "astronomic-science-pack-4", + data_util.mod_prefix .. "energy-science-pack-4", + data_util.mod_prefix .. "biological-science-pack-4", + data_util.mod_prefix .. "material-science-pack-4", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + } + }, + }, + ]] + + { + type = "technology", + name = data_util.mod_prefix .. "space-data-card", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "data-storage-substrate" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "data-storage-substrate-cleaned" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "data-storage-substrate-cleaned-chemical" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "empty-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/data-card.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-manufactory", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "space-decontamination-facility", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-decontamination-facility" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-water" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bio-sludge-decontamination" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-water-decontamination" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "scrap-decontamination" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "used-lifesupport-canister-cleaning-space" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/decontamination-facility.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-assembling", + data_util.mod_prefix .. "processing-vulcanite" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-electromagnetics-laboratory", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-electromagnetics-laboratory", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/electromagnetics-laboratory.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-science-pack" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "space-genetics-laboratory", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-genetics-laboratory" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "experimental-bioculture" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bioculture" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "genetic-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/genetics-laboratory.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-biochemical-laboratory" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-gravimetrics-laboratory", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-gravimetrics-laboratory" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/gravimetrics-laboratory.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-astrometrics-laboratory" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-growth-facility", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-growth-facility" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "neural-gel" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "specimen" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "specimen-fish" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "specimen-wood" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "lifesupport-canister-specimen" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bio-methane-to-crude-oil" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/growth-facility.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-genetics-laboratory" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + + + { + type = "technology", + name = data_util.mod_prefix .. "space-hypercooling-1", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "space-hypercooler", + }, + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "space-coolant-cold", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/hypercooler.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-science-pack" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-hypercooling-2", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "space-coolant-supercooled", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/hypercooler.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-hypercooling-1" + }, + unit = { + count = 200, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-hypercooling-3", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "space-coolant-cold-cryonite", + }, + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "space-coolant-supercooled-cryonite", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/hypercooler.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-hypercooling-2", + data_util.mod_prefix .. "energy-science-pack-1", + data_util.mod_prefix .. "processing-cryonite", + }, + unit = { + count = 200, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-laser-laboratory", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-laser-laboratory" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/laser-laboratory.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "laser", + data_util.mod_prefix .. "rocket-science-pack" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "lifesupport-facility", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "lifesupport-facility" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "canister" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "empty-lifesupport-canister" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "lifesupport-canister-fish" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "lifesupport-canister-coal" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "used-lifesupport-canister-cleaning" }, + + }, + icon = "__space-exploration-graphics__/graphics/technology/lifesupport-facility.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "recycling-facility", + }, + unit = { + count = 100, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-manufactory", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-manufactory" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "chemical-gel" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-mirror" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-mirror-alternate" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "material-testing-pack" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/space-manufactory.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-decontamination-facility" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-material-fabricator", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-material-fabricator" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "matter-fusion-dirty" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/material-fabricator.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-catalogue-energy-4", + data_util.mod_prefix .. "material-science-pack-2", + "speed-module-6", + "effectivity-module-6", + }, + unit = { + count = 250, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + } + }, + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "space-matter-fusion", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "matter-fusion-iron" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "matter-fusion-copper" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "matter-fusion-stone" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "matter-fusion-uranium" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "matter-fusion-beryllium" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "matter-fusion-holmium" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "matter-fusion-iridium" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "matter-fusion-vulcanite" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "matter-fusion-cryonite" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/material-fabricator.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-material-fabricator", + data_util.mod_prefix .. "energy-science-pack-2" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "nanomaterial", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "nanomaterial" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/nanomaterial.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-material-fabricator", + data_util.mod_prefix .. "astronomic-science-pack-4", + data_util.mod_prefix .. "dynamic-emitter", + data_util.mod_prefix .. "material-science-pack-4", + data_util.mod_prefix .. "biological-science-pack-4", + }, + unit = { + count = 250, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-mechanical-laboratory", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-mechanical-laboratory" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/mechanical-laboratory.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-science-pack" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-rail", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-rail" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/space-rail.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "energy-science-pack-1" + }, + unit = { + count = 50, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-telescope", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-telescope" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "observation-frame-blank" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "observation-frame-blank-beryllium" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "observation-frame-visible" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "observation-frame-uv" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "observation-frame-infrared" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/telescope.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-hypercooling-1" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-telescope-xray", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-telescope-xray" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "observation-frame-xray" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/telescope-xray.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-telescope", + data_util.mod_prefix .. "astronomic-science-pack-1", + data_util.mod_prefix .. "aeroframe-pole", + }, + unit = { + count = 20, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-telescope-microwave", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-telescope-microwave" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "observation-frame-microwave" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/telescope-microwave.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-telescope", + data_util.mod_prefix .. "astronomic-science-pack-1", + data_util.mod_prefix .. "aeroframe-pole", + }, + unit = { + count = 20, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-telescope-gammaray", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-telescope-gammaray" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "gammaray-detector" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "observation-frame-gammaray" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/telescope-gammaray.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-telescope-xray" + }, + unit = { + count = 50, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-telescope-radio", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-telescope-radio" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "observation-frame-radio" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/telescope-radio.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-telescope-microwave" + }, + unit = { + count = 50, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + } + }, + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "space-particle-accelerator", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-particle-accelerator" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "ion-stream" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/particle-accelerator.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-plasma-generator", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-particle-collider", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-particle-collider" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "proton-stream" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "particle-stream" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/particle-collider.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-particle-accelerator", + data_util.mod_prefix .."energy-science-pack-1", + data_util.mod_prefix .. "holmium-cable", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."energy-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "antimatter-production", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "antimatter-stream" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "antimatter-canister" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "empty-antimatter-canister" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/material-fabricator.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-1", + data_util.mod_prefix .. "naquium-cube" + }, + unit = { + count = 1000, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .."energy-science-pack-4", 1 }, + { data_util.mod_prefix .."material-science-pack-4", 1 }, + { data_util.mod_prefix .."deep-space-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "antimatter-engine", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "spaceship-antimatter-engine" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "spaceship-antimatter-booster-tank" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/antimatter-engine.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "spaceship", + data_util.mod_prefix .. "lattice-pressure-vessel", + data_util.mod_prefix .. "antimatter-production", + }, + unit = { + count = 2000, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .."energy-science-pack-4", 1 }, + { data_util.mod_prefix .."material-science-pack-4", 1 }, + { data_util.mod_prefix .."deep-space-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "teleportation", + effects = { + }, + icon = "__space-exploration-graphics__/graphics/technology/teleportation.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-4", + }, + unit = { + count = 10000, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "utility-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .."energy-science-pack-4", 1 }, + { data_util.mod_prefix .."material-science-pack-4", 1 }, + { data_util.mod_prefix .."deep-space-science-pack--4", 1 }, + } + }, + enabled = true -- if a mod adds teleportation, enable this tech, add it as a prerequiste, and add "se-deep-space-science-pack-4" as an ingredient + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "space-plasma-generator", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-plasma-generator" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "plasma-stream" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/plasma-generator.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-science-pack", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "space-platform-plating", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "space-platform-plating", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/space-platform-plating.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "heavy-girder" + }, + unit = { + count = 50, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-platform-scaffold", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-platform-scaffold", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-transport-belt", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-underground-belt", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-splitter", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-pipe", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-pipe-to-ground", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/space-platform-scaffold.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-launch-pad" + }, + unit = { + count = 500, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-radiation-laboratory", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-radiation-laboratory" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/radiation-laboratory.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "rocket-science-pack", + "uranium-processing", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + + + { + type = "technology", + name = data_util.mod_prefix .. "space-radiator-1", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "space-coolant", + }, + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "space-coolant-cryonite", + }, + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "space-radiator", + }, + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "radiating-space-coolant-normal", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/radiator-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-manufactory" + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-radiating-efficiency", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "radiating-space-coolant-slow", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/radiator-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "astronomic-science-pack-1" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-radiating-speed", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "radiating-space-coolant-fast", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/radiator-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "energy-science-pack-1" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-radiator-2", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "space-radiator-2", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/radiator-blue.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-radiator-1", + data_util.mod_prefix .. "astronomic-science-pack-1", + data_util.mod_prefix .. "processing-cryonite" + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "recycling-facility", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "recycling-facility" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "scrap-recycling" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "broken-data-scrapping" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "empty-barrel-scrapping" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "empty-barrel-reprocessing" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-capsule-scrapping" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "cargo-pod-scrapping" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/recycling-facility.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "advanced-material-processing-2", + }, + unit = { + count = 300, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + -- Space Science + { + type = "technology", + name = data_util.mod_prefix .. "space-science-lab", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "space-science-lab", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/space-science-lab.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-manufactory", + data_util.mod_prefix .. "space-supercomputer-1", + }, + unit = { + count = 500, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "space-simulation-ab", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-ab" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/simulation-ab.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "astronomic-science-pack-1", + data_util.mod_prefix .. "biological-science-pack-1", + data_util.mod_prefix .. "space-hypercooling-2", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .."biological-science-pack-1", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-simulation-as", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-as" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/simulation-as.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "astronomic-science-pack-1", + data_util.mod_prefix .. "energy-science-pack-1", + data_util.mod_prefix .. "space-hypercooling-2", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .."energy-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-simulation-am", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-am" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/simulation-am.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "astronomic-science-pack-1", + data_util.mod_prefix .. "material-science-pack-1", + data_util.mod_prefix .. "space-hypercooling-2", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .."material-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-simulation-bm", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-bm" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/simulation-bm.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "biological-science-pack-1", + data_util.mod_prefix .. "material-science-pack-1", + data_util.mod_prefix .. "space-hypercooling-2", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."biological-science-pack-1", 1 }, + { data_util.mod_prefix .."material-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-simulation-sb", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-sb" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/simulation-sb.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "biological-science-pack-1", + data_util.mod_prefix .. "energy-science-pack-1", + data_util.mod_prefix .. "space-hypercooling-2", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."biological-science-pack-1", 1 }, + { data_util.mod_prefix .."energy-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-simulation-sm", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-sm" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/simulation-sm.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "energy-science-pack-1", + data_util.mod_prefix .. "material-science-pack-1", + data_util.mod_prefix .. "space-hypercooling-2", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."energy-science-pack-1", 1 }, + { data_util.mod_prefix .."material-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-simulation-abm", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-abm" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/simulation-abm.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-simulation-ab", + data_util.mod_prefix .. "space-simulation-am", + data_util.mod_prefix .. "space-simulation-bm", + }, + unit = { + count = 50, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .."biological-science-pack-1", 1 }, + { data_util.mod_prefix .."material-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-simulation-asb", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-asb" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/simulation-asb.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-simulation-ab", + data_util.mod_prefix .. "space-simulation-as", + data_util.mod_prefix .. "space-simulation-sb", + }, + unit = { + count = 50, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .."biological-science-pack-1", 1 }, + { data_util.mod_prefix .."energy-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-simulation-asm", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-asm" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/simulation-asm.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-simulation-am", + data_util.mod_prefix .. "space-simulation-as", + data_util.mod_prefix .. "space-simulation-sm", + }, + unit = { + count = 50, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .."energy-science-pack-1", 1 }, + { data_util.mod_prefix .."material-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-simulation-sbm", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-sbm" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/simulation-sbm.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-simulation-bm", + data_util.mod_prefix .. "space-simulation-sb", + data_util.mod_prefix .. "space-simulation-sm", + }, + unit = { + count = 50, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."biological-science-pack-1", 1 }, + { data_util.mod_prefix .."energy-science-pack-1", 1 }, + { data_util.mod_prefix .."material-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-simulation-asbm", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "simulation-asbm" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/catalogue/simulation-asbm.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-simulation-abm", + data_util.mod_prefix .. "space-simulation-asb", + data_util.mod_prefix .. "space-simulation-asm", + data_util.mod_prefix .. "space-simulation-sbm", + data_util.mod_prefix .. "space-supercomputer-2", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .."biological-science-pack-1", 1 }, + { data_util.mod_prefix .."energy-science-pack-1", 1 }, + { data_util.mod_prefix .."material-science-pack-1", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-solar-panel", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-solar-panel" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/solar-panel.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "solar-energy", + data_util.mod_prefix .. "rocket-science-pack", + }, + unit = { + count = 500, + time = 30, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-solar-panel-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-solar-panel-2" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/solar-panel-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-solar-panel", + data_util.mod_prefix .. "holmium-cable", + }, + unit = { + count = 200, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "space-solar-panel-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-solar-panel-3" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/solar-panel-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-solar-panel-2", + data_util.mod_prefix .. "deep-space-science-pack-1", + data_util.mod_prefix .. "naquium-cube", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-supercomputer-1", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-supercomputer-1" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "formatting-1" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "machine-learning-data" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/supercomputer-1.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-data-card", + data_util.mod_prefix .. "space-radiator-1", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-supercomputer-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-supercomputer-2" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "formatting-2" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/supercomputer-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "quantum-processor", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-supercomputer-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-supercomputer-3" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "formatting-3" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/supercomputer-3.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-supercomputer-2", + data_util.mod_prefix .. "superconductive-cable", + data_util.mod_prefix .. "biological-science-pack-3", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + { data_util.mod_prefix .. "biological-science-pack-3", 1 }, + } + }, + }, + + { + type = "technology", + name = data_util.mod_prefix .. "space-supercomputer-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-supercomputer-4" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "formatting-4" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/supercomputer-4.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "naquium-processor", + }, + unit = { + count = 1000, + time = 60, + ingredients = { + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1}, + { data_util.mod_prefix .. "deep-space-science-pack-3", 1 }, + } + }, + }, + + + { + type = "technology", + name = data_util.mod_prefix .. "space-thermodynamics-laboratory", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-thermodynamics-laboratory" }, + --{ type = "unlock-recipe", recipe = data_util.mod_prefix .. "space-coolant" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "thermodynamics-coal" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/thermodynamics-laboratory.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "space-plasma-generator", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + + { + name = data_util.mod_prefix .. "spaceship", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "spaceship-console" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "spaceship-floor" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "spaceship-wall" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "spaceship-gate" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "spaceship-rocket-engine" }, + --{ type = "unlock-recipe", recipe = data_util.mod_prefix .. "spaceship-rocket-engine-burn" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "spaceship-rocket-booster-tank" }, + { type = "nothing", effect_description={"spaceship-integrity300"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "astronomic-science-pack-3", + data_util.mod_prefix .. "aeroframe-bulkhead", + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 } + }, + time = 60 + } + }, + + { + name = data_util.mod_prefix .. "spaceship-integrity-1", + effects = { + { type = "nothing", effect_description={"spaceship-integrity100"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "material-science-pack-1", + data_util.mod_prefix .. "spaceship", + }, + type = "technology", + unit = { + count_formula = "2^L*50", + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 } + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "spaceship-integrity-2", + effects = { + { type = "nothing", effect_description={"spaceship-integrity100"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "material-science-pack-2", + data_util.mod_prefix .. "spaceship-integrity-1", + }, + type = "technology", + unit = { + count_formula = "2^L*50", + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 } + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "spaceship-integrity-3", + effects = { + { type = "nothing", effect_description={"spaceship-integrity100"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "material-science-pack-3", + data_util.mod_prefix .. "spaceship-integrity-2", + }, + type = "technology", + unit = { + count_formula = "2^L*50", + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 } + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "spaceship-integrity-4", + effects = { + { type = "nothing", effect_description={"spaceship-integrity100"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "energy-science-pack-1", + data_util.mod_prefix .. "spaceship-integrity-3", + }, + type = "technology", + unit = { + count_formula = "2^L*50", + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 } + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "spaceship-integrity-5", + effects = { + { type = "nothing", effect_description={"spaceship-integrity100"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "energy-science-pack-2", + data_util.mod_prefix .. "spaceship-integrity-4", + }, + type = "technology", + unit = { + count_formula = "2^L*50", + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "spaceship-integrity-6", + effects = { + { type = "nothing", effect_description={"spaceship-integrity100"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "energy-science-pack-3", + data_util.mod_prefix .. "spaceship-integrity-5", + }, + type = "technology", + unit = { + count_formula = "2^L*50", + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "spaceship-integrity-7", + effects = { + { type = "nothing", effect_description={"spaceship-integrity100"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "astronomic-science-pack-4", + data_util.mod_prefix .. "spaceship-integrity-6", + }, + type = "technology", + unit = { + count_formula = "2^L*50", + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + }, + time = 60 + } + }, + --[[{ + name = data_util.mod_prefix .. "spaceship-integrity-8", + effects = { + { type = "nothing", effect_description={"spaceship-integrity100"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "material-science-pack-4", + data_util.mod_prefix .. "energy-science-pack-4", + data_util.mod_prefix .. "spaceship-integrity-7", + }, + type = "technology", + unit = { + count_formula = "2^L*50", + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 } + }, + time = 60 + } + },]]-- + { + name = data_util.mod_prefix .. "factory-spaceship-1", + effects = { + { type = "nothing", effect_description={"spaceship-integrity500"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-1", + data_util.mod_prefix .. "spaceship-integrity-7", + }, + type = "technology", + unit = { + count_formula = "2^L*250", + time = 60, + ingredients = { + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 } + }, + }, + upgrade = false + }, + { + name = data_util.mod_prefix .. "factory-spaceship-2", + effects = { + { type = "nothing", effect_description={"spaceship-integrity500"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "factory-spaceship-1", + }, + type = "technology", + unit = { + count_formula = "2^L*250", + time = 60, + ingredients = { + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 } + }, + }, + upgrade = false + }, + { + name = data_util.mod_prefix .. "factory-spaceship-3", + effects = { + { type = "nothing", effect_description={"spaceship-integrity500"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-2", + data_util.mod_prefix .. "factory-spaceship-2", + }, + type = "technology", + unit = { + count_formula = "2^L*250", + time = 60, + ingredients = { + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 } + }, + }, + upgrade = false + }, + { + name = data_util.mod_prefix .. "factory-spaceship-4", + effects = { + { type = "nothing", effect_description={"spaceship-integrity500"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-3", + data_util.mod_prefix .. "factory-spaceship-3", + }, + type = "technology", + unit = { + count_formula = "2^L*250", + time = 60, + ingredients = { + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-3", 1 } + }, + }, + upgrade = false + }, + { + name = data_util.mod_prefix .. "factory-spaceship-5", + effects = { + { type = "nothing", effect_description={"spaceship-integrity500"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-integrity.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-4", + data_util.mod_prefix .. "factory-spaceship-4", + }, + max_level = "infinite", + type = "technology", + unit = { + count_formula = "2^L*250", + time = 60, + ingredients = { + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-4", 1 } + }, + }, + upgrade = false + }, + { + name = data_util.mod_prefix .. "spaceship-victory", + effects = { + { type = "nothing", effect_description={"unlock-spaceship-victory"} }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "distortion-drive" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/spaceship-victory.png", + icon_size = 128, + order = "zzzzzzz", + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-4", + data_util.mod_prefix .. "antimatter-engine", + data_util.mod_prefix .. "factory-spaceship-3", + }, + type = "technology", + unit = { + count = 10000, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "utility-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-4", 1 } + }, + time = 60 + } + }, + + { + name = data_util.mod_prefix .. "superconductive-cable", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "superconductive-cable" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "magnetic-canister", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "plasma-canister" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "plasma-canister-empty" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/superconductive-cable.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "material-science-pack-3", + data_util.mod_prefix .. "energy-science-pack-3", + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 } + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "tesla-gun", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "tesla-gun" }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "tesla-ammo" } + }, + icon = "__space-exploration-graphics__/graphics/technology/tesla-gun.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + "military-3", + data_util.mod_prefix .. "holmium-cable", + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 } + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "thruster-suit", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "thruster-suit" } + }, + icon = "__space-exploration-graphics__/graphics/technology/thruster-suit-orange.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + "glass-processing", + "modular-armor", + "rocket-silo", + "jetpack-1", + --data_util.mod_prefix .. "lifesupport-facility", + data_util.mod_prefix .. "lifesupport-equipment-1" + }, + type = "technology", + unit = { + count = 200, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 } + }, + time = 30 + } + }, + { + name = data_util.mod_prefix .. "thruster-suit-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "thruster-suit-2" } + }, + icon = "__space-exploration-graphics__/graphics/technology/thruster-suit-red.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "thruster-suit", + data_util.mod_prefix .. "material-science-pack-1", + }, + type = "technology", + unit = { + count = 50, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "thruster-suit-3", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "thruster-suit-3" } + }, + icon = "__space-exploration-graphics__/graphics/technology/thruster-suit-blue.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "astronomic-science-pack-3", + data_util.mod_prefix .. "biological-science-pack-1", + data_util.mod_prefix .. "superconductive-cable", + data_util.mod_prefix .. "thruster-suit-2", + data_util.mod_prefix .. "aeroframe-bulkhead" + }, + type = "technology", + unit = { + count = 300, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + }, + time = 60 + } + }, + { + name = data_util.mod_prefix .. "thruster-suit-4", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "thruster-suit-4" } + }, + icon = "__space-exploration-graphics__/graphics/technology/thruster-suit-black.png", + icon_size = 128, + order = "g-b-z", + prerequisites = { + data_util.mod_prefix .. "antimatter-production", + data_util.mod_prefix .. "nanomaterial", + data_util.mod_prefix .. "self-sealing-gel", + data_util.mod_prefix .. "thruster-suit-3", + data_util.mod_prefix .. "naquium-processor", + }, + type = "technology", + unit = { + count = 500, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-3", 1 } + }, + time = 60 + } + }, + + { + type = "technology", + name = data_util.mod_prefix .. "vitalic-acid", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "vitalic-acid", }, + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bio-sludge-from-vitamelange" }, + }, + icon = "__space-exploration-graphics__/graphics/technology/vitalic-acid.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "processing-vitamelange", + data_util.mod_prefix .. "biological-science-pack-1", + }, + unit = { + count = 10, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "bioscrubber", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "bioscrubber", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/bioscrubber.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "vitalic-acid", + }, + unit = { + count = 20, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "vitalic-reagent", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "vitalic-reagent", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/vitalic-reagent.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "biological-science-pack-2", + }, + unit = { + count = 100, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "vitalic-epoxy", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "vitalic-epoxy", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/vitalic-epoxy.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "vitalic-reagent", + data_util.mod_prefix .. "biological-science-pack-3", + }, + unit = { + count = 200, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-3", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "self-sealing-gel", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "self-sealing-gel", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/self-sealing-gel.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "vitalic-epoxy", + data_util.mod_prefix .. "biological-science-pack-4", + }, + unit = { + count = 400, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "supercharger", + effects = { + { + type = "unlock-recipe", + recipe = data_util.mod_prefix .. "supercharger", + }, + }, + icon = "__space-exploration-graphics__/graphics/technology/supercharger.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "construction-robotics", + data_util.mod_prefix .. "aeroframe-scaffold", + data_util.mod_prefix .. "heavy-girder", + data_util.mod_prefix .. "holmium-solenoid", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "wide-beacon", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "wide-beacon", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/wide-beacon.png", + icon_size = 128, + order = "e-g", + prerequisites = { + "effect-transmission", + data_util.mod_prefix .. "holmium-solenoid", + }, + unit = { + count = 500, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "wide-beacon-2", + effects = { + { type = "unlock-recipe", recipe = data_util.mod_prefix .. "wide-beacon-2", }, + }, + icon = "__space-exploration-graphics__/graphics/technology/wide-beacon-2.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "wide-beacon", + data_util.mod_prefix .. "dynamic-emitter", + data_util.mod_prefix .. "naquium-tessaract", + }, + unit = { + count = 1000, + time = 60, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "zone-discovery-random", + effects = { + { type = "nothing", effect_description={data_util.mod_prefix .. "zone-discovery-random"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/discovery.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .."astronomic-science-pack-1", + }, + max_level = "infinite", + unit = { + count_formula = "10+L", + time = 60, + ingredients = { + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "zone-discovery-targeted", + effects = { + { type = "nothing", effect_description={data_util.mod_prefix .. "zone-discovery-targeted"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/discovery.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .."astronomic-science-pack-2", + }, + max_level = "infinite", + unit = { + count_formula = "20+L", + time = 60, + ingredients = { + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + } + }, + }, + { + type = "technology", + name = data_util.mod_prefix .. "zone-discovery-deep", + effects = { + { type = "nothing", effect_description={data_util.mod_prefix .. "zone-discovery-deep"} } + }, + icon = "__space-exploration-graphics__/graphics/technology/discovery.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .."astronomic-science-pack-3", + }, + max_level = "infinite", + unit = { + count_formula = "100+L*10", + time = 60, + ingredients = { + { data_util.mod_prefix .. "astronomic-science-pack-1", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-2", 1 }, + { data_util.mod_prefix .. "astronomic-science-pack-3", 1 }, + } + }, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/asteroid.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/asteroid.lua new file mode 100644 index 0000000..63b0a77 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/asteroid.lua @@ -0,0 +1,293 @@ +local data_util = require("data_util") +local noise = require("noise") + + +data:extend( +{ + { + type = "tile", + name = data_util.mod_prefix.."asteroid", + collision_mask = {space_collision_layer}, -- nothing? + autoplace = { -- see final-noise-programs + }, + layer = 20, + variants = tile_variations_template( + "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid.png", + "__base__/graphics/terrain/masks/transition-3.png", + "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid.png", + "__base__/graphics/terrain/masks/hr-transition-3.png", + { + max_size = 4, + [1] = { weights = {0.085, 0.085, 0.085, 0.085, 0.087, 0.085, 0.065, 0.085, 0.045, 0.045, 0.045, 0.045, 0.005, 0.025, 0.045, 0.045 } }, + [2] = { probability = 1, weights = {0.018, 0.020, 0.015, 0.025, 0.015, 0.020, 0.025, 0.015, 0.025, 0.025, 0.010, 0.025, 0.020, 0.025, 0.025, 0.010 }, }, + [4] = { probability = 0.1, weights = {0.018, 0.020, 0.015, 0.025, 0.015, 0.020, 0.025, 0.015, 0.025, 0.025, 0.010, 0.025, 0.020, 0.025, 0.025, 0.010 }, }, + --[8] = { probability = 1.00, weights = {0.090, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.025, 0.125, 0.005, 0.010, 0.100, 0.100, 0.010, 0.020, 0.020} }, + } + ), + walking_sound = table.deepcopy(data.raw.tile["dirt-1"].walking_sound), + map_color = {r = 80, g = 80, b = 80}, + ageing=0.0001, + walking_speed_modifier = 1, + vehicle_friction_modifier = 1, + transitions = { + { + to_tiles = { + "water", + "deepwater", + "water-green", + "deepwater-green", + "water-shallow", + "water-mud", + data_util.mod_prefix .. "space" + }, + transition_group = 1, + inner_corner = { + count = 5, + hr_version = { + count = 5, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + tall = true, + x = 0, + y = 0 + }, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + tall = true, + x = 0, + y = 0 + }, + inner_corner_background = { + count = 5, + hr_version = { + count = 5, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + tall = true, + x = 1088, + y = 0 + }, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + tall = true, + x = 544, + y = 0 + }, + inner_corner_mask = { + count = 5, + hr_version = { + count = 5, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + x = 2176, + y = 0 + }, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + x = 1088, + y = 0 + }, + o_transition = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + tall = false, + x = 0, + y = 2304 + }, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + tall = false, + x = 0, + y = 1152 + }, + o_transition_background = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + tall = false, + x = 1088, + y = 2304 + }, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + tall = false, + x = 544, + y = 1152 + }, + o_transition_mask = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + x = 2176, + y = 2304 + }, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + x = 1088, + y = 1152 + }, + outer_corner = { + count = 5, + hr_version = { + count = 5, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + tall = true, + x = 0, + y = 576 + }, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + tall = true, + x = 0, + y = 288 + }, + outer_corner_background = { + count = 5, + hr_version = { + count = 5, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + tall = true, + x = 1088, + y = 576 + }, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + tall = true, + x = 544, + y = 288 + }, + outer_corner_mask = { + count = 5, + hr_version = { + count = 5, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + x = 2176, + y = 576 + }, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + x = 1088, + y = 288 + }, + side = { + count = 5, + hr_version = { + count = 5, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + tall = true, + x = 0, + y = 1152 + }, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + tall = true, + x = 0, + y = 576 + }, + side_background = { + count = 5, + hr_version = { + count = 5, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1152 + }, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + tall = true, + x = 544, + y = 576 + }, + side_mask = { + count = 5, + hr_version = { + count = 5, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + x = 2176, + y = 1152 + }, + line_length = 5, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + x = 1088, + y = 576 + }, + u_transition = { + count = 2, + hr_version = { + count = 2, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + tall = true, + x = 0, + y = 1728 + }, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + tall = true, + x = 0, + y = 864 + }, + u_transition_background = { + count = 2, + hr_version = { + count = 2, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1728 + }, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + tall = true, + x = 544, + y = 864 + }, + u_transition_mask = { + count = 2, + hr_version = { + count = 2, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid-cliff.png", + scale = 0.5, + x = 2176, + y = 1728 + }, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid-cliff.png", + x = 1088, + y = 864 + } + }, + } + }, +}) +table.insert(data.raw.tile[data_util.mod_prefix.."asteroid"].transitions[1].to_tiles, data_util.mod_prefix.."space") diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/plating.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/plating.lua new file mode 100644 index 0000000..3134384 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/plating.lua @@ -0,0 +1,366 @@ +local data_util = require("data_util") +data:extend( +{ + { + type = "tile", + name = data_util.mod_prefix .. "space-platform-plating", + needs_correction = false, + minable = { mining_time = 0.2, result = data_util.mod_prefix .. "space-platform-plating"}, + mined_sound = { filename = "__base__/sound/deconstruct-bricks.ogg" }, + collision_mask = { + space_collision_layer, + --"resource-layer" + }, + walking_speed_modifier = 1.5, + layer = 208, + decorative_removal_probability = 1, + variants = + { + main = + { + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile1.png", + count = 12, + size = 1, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile1.png", + size = 1, + scale = 0.5 + } + } + }, + inner_corner = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-inner-corner.png", + count = 1, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-inner-corner.png", + scale = 0.5 + } + }, + outer_corner = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-outer-corner.png", + count = 1, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-outer-corner.png", + scale = 0.5 + } + }, + side = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-side.png", + count = 16, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-side.png", + scale = 0.5 + } + }, + u_transition = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-u.png", + count = 1, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-u.png", + scale = 0.5 + } + }, + o_transition = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-o.png", + count = 1, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-o.png", + scale = 0.5 + } + } + }, + walking_sound = + { + { + filename = "__base__/sound/walking/concrete-01.ogg", + volume = 1.2 + }, + { + filename = "__base__/sound/walking/concrete-02.ogg", + volume = 1.2 + }, + { + filename = "__base__/sound/walking/concrete-03.ogg", + volume = 1.2 + }, + { + filename = "__base__/sound/walking/concrete-04.ogg", + volume = 1.2 + } + }, + map_color={r=100, g=100, b=100}, + ageing=0, + vehicle_friction_modifier = 100, + transitions = { + { + to_tiles = { + "water", + "deepwater", + "water-green", + "deepwater-green", + "water-shallow", + "water-mud", + data_util.mod_prefix .. "space" + }, + transition_group = 1, + inner_corner = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + tall = true, + x = 0, + y = 0 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + tall = true, + x = 0, + y = 0 + }, + inner_corner_background = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + tall = true, + x = 1088, + y = 0 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + tall = true, + x = 544, + y = 0 + }, + inner_corner_mask = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + x = 2176, + y = 0 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + x = 1088, + y = 0 + }, + o_transition = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + tall = false, + x = 0, + y = 2304 + }, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + tall = false, + x = 0, + y = 1152 + }, + o_transition_background = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + tall = false, + x = 1088, + y = 2304 + }, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + tall = false, + x = 544, + y = 1152 + }, + o_transition_mask = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + x = 2176, + y = 2304 + }, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + x = 1088, + y = 1152 + }, + outer_corner = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + tall = true, + x = 0, + y = 576 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + tall = true, + x = 0, + y = 288 + }, + outer_corner_background = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + tall = true, + x = 1088, + y = 576 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + tall = true, + x = 544, + y = 288 + }, + outer_corner_mask = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + x = 2176, + y = 576 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + x = 1088, + y = 288 + }, + side = { + count = 16, + hr_version = { + count = 16, + line_length = 16, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + tall = true, + x = 0, + y = 1152 + }, + line_length = 16, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + tall = true, + x = 0, + y = 576 + }, + side_background = { + count = 16, + hr_version = { + count = 16, + line_length = 16, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1152 + }, + line_length = 16, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + tall = true, + x = 544, + y = 576 + }, + side_mask = { + count = 16, + hr_version = { + count = 16, + line_length = 16, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + x = 2176, + y = 1152 + }, + line_length = 16, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + x = 1088, + y = 576 + }, + u_transition = { + count = 2, + hr_version = { + count = 2, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + tall = true, + x = 0, + y = 1728 + }, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + tall = true, + x = 0, + y = 864 + }, + u_transition_background = { + count = 2, + hr_version = { + count = 2, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1728 + }, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + tall = true, + x = 544, + y = 864 + }, + u_transition_mask = { + count = 2, + hr_version = { + count = 2, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/hr-tile-transitions.png", + scale = 0.5, + x = 2176, + y = 1728 + }, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-plating/tile-transitions.png", + x = 1088, + y = 864 + } + }, + } + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/regolith.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/regolith.lua new file mode 100644 index 0000000..86f5f85 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/regolith.lua @@ -0,0 +1,37 @@ +local data_util = require("data_util") +local noise = require("noise") + +local transitions = require("tile-transitions-static") + + +data:extend( +{ + { + type = "tile", + name = data_util.mod_prefix.."regolith", + collision_mask = {space_collision_layer}, -- nothing? + autoplace = { -- see final-noise-programs + }, + layer = 206, + variants = tile_variations_template( + "__space-exploration-graphics__/graphics/terrain/asteroid/asteroid.png", + "__base__/graphics/terrain/masks/transition-3.png", + "__space-exploration-graphics__/graphics/terrain/asteroid/hr-asteroid.png", + "__base__/graphics/terrain/masks/hr-transition-3.png", + { + max_size = 4, + [1] = { weights = {0.085, 0.085, 0.085, 0.085, 0.087, 0.085, 0.065, 0.085, 0.045, 0.045, 0.045, 0.045, 0.005, 0.025, 0.045, 0.045 } }, + [2] = { probability = 1, weights = {0.018, 0.020, 0.015, 0.025, 0.015, 0.020, 0.025, 0.015, 0.025, 0.025, 0.010, 0.025, 0.020, 0.025, 0.025, 0.010 }, }, + [4] = { probability = 0.1, weights = {0.018, 0.020, 0.015, 0.025, 0.015, 0.020, 0.025, 0.015, 0.025, 0.025, 0.010, 0.025, 0.020, 0.025, 0.025, 0.010 }, }, + --[8] = { probability = 1.00, weights = {0.090, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.025, 0.125, 0.005, 0.010, 0.100, 0.100, 0.010, 0.020, 0.020} }, + } + ), + transitions = transitions.cliff_transitions(), + transitions_between_transitions = transitions.cliff_transitions_between_transitions(), + walking_sound = table.deepcopy(data.raw.tile["dirt-1"].walking_sound), + map_color = {r = 128, g = 128, b = 128}, + ageing=0.0001, + walking_speed_modifier = 1, + vehicle_friction_modifier = 1, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/scaffold.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/scaffold.lua new file mode 100644 index 0000000..b1693f5 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/scaffold.lua @@ -0,0 +1,139 @@ +local data_util = require("data_util") +data:extend( +{ + { + type = "tile", + name = data_util.mod_prefix .. "space-platform-scaffold", + needs_correction = false, + minable = {mining_time = 0.1, result = data_util.mod_prefix .. "space-platform-scaffold"}, + mined_sound = { filename = "__base__/sound/deconstruct-bricks.ogg" }, + collision_mask = { + space_collision_layer, + --"resource-layer" + }, + walking_speed_modifier = 0.75, + layer = 207, + decorative_removal_probability = 0.75, + variants = + { + main = + { + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/tile1.png", + count = 16, + size = 1, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/hr-tile1.png", + count = 16, + size = 1, + scale = 0.5 + } + }, + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/tile2.png", + count = 5, + size = 2, + probability = 0.05, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/hr-tile2.png", + count = 5, + size = 2, + scale = 0.5 + } + }, + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/tile4.png", + count = 1, + size = 4, + probability = 0.02, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/hr-tile4.png", + count = 1, + size = 4, + scale = 0.5 + } + }, + }, + inner_corner = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/tile-inner-corner.png", + count = 8, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/hr-tile-inner-corner.png", + count = 8, + scale = 0.5 + } + }, + outer_corner = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/tile-outer-corner.png", + count = 8, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/hr-tile-outer-corner.png", + count = 8, + scale = 0.5 + } + }, + side = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/tile-side.png", + count = 8, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/hr-tile-side.png", + count = 8, + scale = 0.5 + } + }, + u_transition = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/tile-u.png", + count = 1, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/hr-tile-u.png", + count = 1, + scale = 0.5 + } + }, + o_transition = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/tile-o.png", + count = 8, + hr_version = + { + picture = "__space-exploration-graphics__/graphics/terrain/space-platform-scaffold/hr-tile-o.png", + count = 8, + scale = 0.5 + } + } + }, + walking_sound = + { + { + filename = "__base__/sound/walking/concrete-01.ogg", + volume = 1.2 + }, + { + filename = "__base__/sound/walking/concrete-02.ogg", + volume = 1.2 + }, + { + filename = "__base__/sound/walking/concrete-03.ogg", + volume = 1.2 + }, + { + filename = "__base__/sound/walking/concrete-04.ogg", + volume = 1.2 + } + }, + map_color={r=50, g=50, b=50}, + ageing=0, + vehicle_friction_modifier = 100 + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/space.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/space.lua new file mode 100644 index 0000000..4b709ec --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/space.lua @@ -0,0 +1,44 @@ +local data_util = require("data_util") + +local space = { + type = "tile", + name = data_util.mod_prefix.."space", + collision_mask = { + --"floor-layer", -- to prevent, belts + "object-layer", -- to prevent certain other structures + --"item-layer", -- to prevent structures + "resource-layer", -- to prevent resources + "doodad-layer", -- to prevent decoratives + space_collision_layer, -- to block vehicles and identify as "in space" + empty_space_collision_layer + }, + autoplace = {}, + draw_in_water_layer = true, + layer = 0, + variants = tile_variations_template( + "__space-exploration-graphics__/graphics/terrain/space/space.png", + "__base__/graphics/terrain/masks/transition-3.png", + "__space-exploration-graphics__/graphics/terrain/space/hr-space.png", + "__base__/graphics/terrain/masks/hr-transition-3.png", + { + max_size = 2, + [1] = { weights = { 0.185, 0.085, 0.085, 0.085, 0.087, 0.085, 0.065, 0.085, 0.045, 0.045, 0.045, 0.045, 0.005, 0.025, 0.045, 0.045 } }, + [2] = { probability = 0.1, weights = {0.018, 0.0010, 0.0015, 0.0025, 0.0015, 0.0010, 0.0025, 0.0015, 0.0010, 0.0025, 0.0010, 0.0025, 0.0020, 0.0025, 0.0025, 0.0010 }, }, + --[4] = { probability = 0.1, weights = {0.018, 0.020, 0.015, 0.025, 0.015, 0.020, 0.025, 0.015, 0.025, 0.025, 0.010, 0.025, 0.020, 0.025, 0.025, 0.010 }, }, + --[8] = { probability = 1.00, weights = {0.090, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.025, 0.125, 0.005, 0.010, 0.100, 0.100, 0.010, 0.020, 0.020} }, + } + ), + --transitions = biomes.transitions[biome.transition .. "_transitions"], + --transitions_between_transitions = biomes.transitions[biome.transition .. "_transitions_between_transitions"], + --walking_sound = {}, + map_color = {r=11, g=13, b=15}, + pollution_absorption_per_second=0.0001, + walking_speed_modifier = 0.1, + vehicle_friction_modifier = 10000, + decorative_removal_probability = 1, + needs_correction = false, +} + +-- fix tile_variations_template for only size 2 and below +space.variants.main[3] = nil +data:extend{space} diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/spaceship.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/spaceship.lua new file mode 100644 index 0000000..1b4b25f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/spaceship.lua @@ -0,0 +1,102 @@ +local data_util = require("data_util") +data:extend( +{ + { + type = "tile", + name = data_util.mod_prefix .. "spaceship-floor", + needs_correction = false, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "spaceship-floor"}, + mined_sound = { filename = "__base__/sound/deconstruct-bricks.ogg" }, + collision_mask = { + space_collision_layer, + spaceship_collision_layer, + "resource-layer" + }, + walking_speed_modifier = 1.2, + layer = 208, + decorative_removal_probability = 1, + variants = + { + main = + { + { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/tile1.png", + count = 12, + size = 1, + hr_version = { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/hr-tile1.png", + size = 1, + scale = 0.5 + } + } + }, + inner_corner = + { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/tile-inner-corner.png", + count = 1, + hr_version = { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/hr-tile-inner-corner.png", + scale = 0.5 + } + }, + outer_corner = + { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/tile-outer-corner.png", + count = 1, + hr_version = { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/hr-tile-outer-corner.png", + scale = 0.5 + } + }, + side = + { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/tile-side.png", + count = 16, + hr_version = { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/hr-tile-side.png", + scale = 0.5 + } + }, + u_transition = + { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/tile-u.png", + count = 1, + hr_version = { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/hr-tile-u.png", + scale = 0.5 + } + }, + o_transition = + { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/tile-o.png", + count = 1, + hr_version = { + picture = "__space-exploration-graphics__/graphics/terrain/spaceship-floor/hr-tile-o.png", + scale = 0.5 + } + } + }, + walking_sound = + { + { + filename = "__base__/sound/walking/concrete-01.ogg", + volume = 1.2 + }, + { + filename = "__base__/sound/walking/concrete-02.ogg", + volume = 1.2 + }, + { + filename = "__base__/sound/walking/concrete-03.ogg", + volume = 1.2 + }, + { + filename = "__base__/sound/walking/concrete-04.ogg", + volume = 1.2 + } + }, + map_color={r=100, g=100, b=100}, + ageing=0, + vehicle_friction_modifier = 100 + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/tile-transitions-static.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/tile-transitions-static.lua new file mode 100644 index 0000000..fcca8b3 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/tile/tile-transitions-static.lua @@ -0,0 +1,996 @@ +local data_util = require("data_util") + +function space_exploration_cliff_transitions() + return { + { + inner_corner = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + tall = true, + x = 0, + y = 0 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + tall = true, + x = 0, + y = 0 + }, + inner_corner_background = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + tall = true, + x = 1088, + y = 0 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + tall = true, + x = 544, + y = 0 + }, + inner_corner_mask = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + x = 2176, + y = 0 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + x = 1088, + y = 0 + }, + o_transition = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + tall = false, + x = 0, + y = 2304 + }, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + tall = false, + x = 0, + y = 1152 + }, + o_transition_background = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + tall = false, + x = 1088, + y = 2304 + }, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + tall = false, + x = 544, + y = 1152 + }, + o_transition_mask = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + x = 2176, + y = 2304 + }, + line_length = 4, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + x = 1088, + y = 1152 + }, + outer_corner = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + tall = true, + x = 0, + y = 576 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + tall = true, + x = 0, + y = 288 + }, + outer_corner_background = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + tall = true, + x = 1088, + y = 576 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + tall = true, + x = 544, + y = 288 + }, + outer_corner_mask = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + x = 2176, + y = 576 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + x = 1088, + y = 288 + }, + side = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + tall = true, + x = 0, + y = 1152 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + tall = true, + x = 0, + y = 576 + }, + side_background = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1152 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + tall = true, + x = 544, + y = 576 + }, + side_mask = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + x = 2176, + y = 1152 + }, + line_length = 8, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + x = 1088, + y = 576 + }, + to_tiles = { + "water", + "deepwater", + "water-green", + "deepwater-green", + "water-shallow", + "water-mud" + }, + transition_group = 1, + u_transition = { + count = 2, + hr_version = { + count = 2, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + tall = true, + x = 0, + y = 1728 + }, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + tall = true, + x = 0, + y = 864 + }, + u_transition_background = { + count = 2, + hr_version = { + count = 2, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1728 + }, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + tall = true, + x = 544, + y = 864 + }, + u_transition_mask = { + count = 2, + hr_version = { + count = 2, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff.png", + scale = 0.5, + x = 2176, + y = 1728 + }, + line_length = 2, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff.png", + x = 1088, + y = 864 + } + }, + { + background_layer_group = "zero", + background_layer_offset = 1, + inner_corner_background = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 0 + }, + line_length = 4, + picture = "__base__/graphics/terrain/out-of-map-transition/out-of-map-transition.png", + tall = true, + x = 544, + y = 0 + }, + inner_corner_mask = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 0 + }, + line_length = 4, + picture = "__base__/graphics/terrain/out-of-map-transition/out-of-map-transition.png", + x = 1088, + y = 0 + }, + o_transition_background = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-out-of-map-transition.png", + scale = 0.5, + tall = false, + x = 1088, + y = 2304 + }, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/out-of-map-transition.png", + tall = false, + x = 544, + y = 1152 + }, + o_transition_mask = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 2304 + }, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/out-of-map-transition.png", + x = 1088, + y = 1152 + }, + offset_background_layer_by_tile_layer = true, + outer_corner_background = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 576 + }, + line_length = 4, + picture = "__base__/graphics/terrain/out-of-map-transition/out-of-map-transition.png", + tall = true, + x = 544, + y = 288 + }, + outer_corner_mask = { + count = 4, + hr_version = { + count = 4, + line_length = 4, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 576 + }, + line_length = 4, + picture = "__base__/graphics/terrain/out-of-map-transition/out-of-map-transition.png", + x = 1088, + y = 288 + }, + side_background = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1152 + }, + line_length = 8, + picture = "__base__/graphics/terrain/out-of-map-transition/out-of-map-transition.png", + tall = true, + x = 544, + y = 576 + }, + side_mask = { + count = 8, + hr_version = { + count = 8, + line_length = 8, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 1152 + }, + line_length = 8, + picture = "__base__/graphics/terrain/out-of-map-transition/out-of-map-transition.png", + x = 1088, + y = 576 + }, + to_tiles = { + "out-of-map" + }, + transition_group = 2, + u_transition_background = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1728 + }, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/out-of-map-transition.png", + tall = true, + x = 544, + y = 864 + }, + u_transition_mask = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 1728 + }, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/out-of-map-transition.png", + x = 1088, + y = 864 + } + } + } + +end + +function space_exploration_cliff_transitions_between_transitions() + return { + { + inner_corner = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + tall = true, + x = 0, + y = 0 + }, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + tall = true, + x = 0, + y = 0 + }, + inner_corner_background = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 0 + }, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + tall = true, + x = 544, + y = 0 + }, + inner_corner_mask = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + x = 2176, + y = 0 + }, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + x = 1088, + y = 0 + }, + outer_corner = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + tall = true, + x = 0, + y = 576 + }, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + tall = true, + x = 0, + y = 288 + }, + outer_corner_background = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 576 + }, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + tall = true, + x = 544, + y = 288 + }, + outer_corner_mask = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + x = 2176, + y = 576 + }, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + x = 1088, + y = 288 + }, + side = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + tall = true, + x = 0, + y = 1152 + }, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + tall = true, + x = 0, + y = 576 + }, + side_background = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1152 + }, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + tall = true, + x = 544, + y = 576 + }, + side_mask = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + x = 2176, + y = 1152 + }, + line_length = 3, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + x = 1088, + y = 576 + }, + transition_group = 0, + transition_group1 = 0, + transition_group2 = 1, + u_transition = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + tall = true, + x = 0, + y = 1728 + }, + line_length = 1, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + tall = true, + x = 0, + y = 864 + }, + u_transition_background = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1728 + }, + line_length = 1, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + tall = true, + x = 544, + y = 864 + }, + u_transition_mask = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/hr/cliff-transition.png", + scale = 0.5, + x = 2176, + y = 1728 + }, + line_length = 1, + picture = "__space-exploration-graphics__/graphics/terrain/water-transitions/sr/cliff-transition.png", + x = 1088, + y = 864 + }, + water_patch = { + filename = "__base__/graphics/terrain/water-transitions/water-patch.png", + height = 32, + hr_version = { + filename = "__base__/graphics/terrain/water-transitions/hr-water-patch.png", + height = 64, + scale = 0.5, + width = 64 + }, + width = 32 + } + }, + { + background_layer_group = "zero", + background_layer_offset = 1, + inner_corner_background = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dirt-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 0 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dirt-out-of-map-transition.png", + tall = true, + x = 544, + y = 0 + }, + inner_corner_mask = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dirt-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 0 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dirt-out-of-map-transition.png", + x = 1088, + y = 0 + }, + offset_background_layer_by_tile_layer = true, + outer_corner_background = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dirt-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 576 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dirt-out-of-map-transition.png", + tall = true, + x = 544, + y = 288 + }, + outer_corner_mask = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dirt-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 576 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dirt-out-of-map-transition.png", + x = 1088, + y = 288 + }, + side_background = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dirt-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1152 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dirt-out-of-map-transition.png", + tall = true, + x = 544, + y = 576 + }, + side_mask = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dirt-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 1152 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dirt-out-of-map-transition.png", + x = 1088, + y = 576 + }, + transition_group = 0, + transition_group1 = 0, + transition_group2 = 2, + u_transition_background = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dirt-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1728 + }, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/dirt-out-of-map-transition.png", + tall = true, + x = 544, + y = 864 + }, + u_transition_mask = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dirt-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 1728 + }, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/dirt-out-of-map-transition.png", + x = 1088, + y = 864 + }, + water_patch = nil + }, + { + background_layer_group = "zero", + background_layer_offset = 1, + inner_corner = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 0, + y = 0 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + tall = true, + x = 0, + y = 0 + }, + inner_corner_background = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 0 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + tall = true, + x = 544, + y = 0 + }, + inner_corner_mask = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 0 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + x = 1088, + y = 0 + }, + offset_background_layer_by_tile_layer = true, + outer_corner = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 0, + y = 576 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + tall = true, + x = 0, + y = 288 + }, + outer_corner_background = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 576 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + tall = true, + x = 544, + y = 288 + }, + outer_corner_mask = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 576 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + x = 1088, + y = 288 + }, + side = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 0, + y = 1152 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + tall = true, + x = 0, + y = 576 + }, + side_background = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1152 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + tall = true, + x = 544, + y = 576 + }, + side_mask = { + count = 3, + hr_version = { + count = 3, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 1152 + }, + line_length = 3, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + x = 1088, + y = 576 + }, + transition_group = 1, + transition_group1 = 1, + transition_group2 = 2, + u_transition = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 0, + y = 1728 + }, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + tall = true, + x = 0, + y = 864 + }, + u_transition_background = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + tall = true, + x = 1088, + y = 1728 + }, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + tall = true, + x = 544, + y = 864 + }, + u_transition_mask = { + count = 1, + hr_version = { + count = 1, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/hr-dark-dirt-shore-out-of-map-transition.png", + scale = 0.5, + x = 2176, + y = 1728 + }, + line_length = 1, + picture = "__base__/graphics/terrain/out-of-map-transition/dark-dirt-shore-out-of-map-transition.png", + x = 1088, + y = 864 + }, + water_patch = nil + } + } +end + +return { + cliff_transitions = space_exploration_cliff_transitions, + cliff_transitions_between_transitions = space_exploration_cliff_transitions_between_transitions, +} diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-1/utility-sprites.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/utility-sprites.lua new file mode 100644 index 0000000..48ab2bb --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-1/utility-sprites.lua @@ -0,0 +1,22 @@ +local data_util = require("data_util") + +data:extend({ + { + type = "sprite", + name = data_util.mod_prefix .. "pin-add", + filename = "__space-exploration-graphics__/graphics/icons/signal/pin-add.png", + priority = "extra-high", + width = 64, + height = 64, + shift = {0,0} + }, + { + type = "sprite", + name = data_util.mod_prefix .. "pin-list", + filename = "__space-exploration-graphics__/graphics/icons/signal/pin-list.png", + priority = "extra-high", + width = 64, + height = 64, + shift = {0,0} + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-2/capsules.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/capsules.lua new file mode 100644 index 0000000..25e58dc --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/capsules.lua @@ -0,0 +1,216 @@ +local data_util = require("data_util") +local mod_prefix = data_util.mod_prefix +local unit_settings = { + { + name="small-biter", + stack_size = 100, + cooldown = 10, + craft_time = 10, + prerequisites = {mod_prefix .. "vitalic-acid"}, + ingredients = { + { name = mod_prefix .. "specimen", amount = 1 }, + { name = mod_prefix .. "vitalic-acid", amount = 4 }, + { type = "fluid", name = mod_prefix .. "nutrient-gel", amount = 20 }, + }, + tech_unit = { count = 100, time = 60, ingredients = { { mod_prefix .. "biological-science-pack-1", 1 }, } } + }, + { + name="medium-biter", + stack_size = 75, + cooldown = 15, + craft_time = 20, + prerequisites = {mod_prefix.."capsule-small-biter", mod_prefix .. "vitalic-reagent"}, + ingredients = { + { name = mod_prefix .. "capsule-small-biter", amount = 1 }, + { name = mod_prefix .. "vitalic-reagent", amount = 4 }, + { type = "fluid", name = mod_prefix .. "nutrient-gel", amount = 40 }, + }, + tech_unit = { count = 200, time = 60, ingredients = { { mod_prefix .. "biological-science-pack-2", 1 }, } } + }, + { + name="big-biter", + stack_size = 50, + cooldown = 20, + craft_time = 30, + prerequisites = {mod_prefix.."capsule-medium-biter", mod_prefix .. "vitalic-epoxy"}, + ingredients = { + { name = mod_prefix .. "capsule-medium-biter", amount = 1 }, + { name = mod_prefix .. "vitalic-epoxy", amount = 4 }, + { type = "fluid", name = mod_prefix .. "nutrient-gel", amount = 60 }, + }, + tech_unit = { count = 300, time = 60, ingredients = { { mod_prefix .. "biological-science-pack-3", 1 }, } } + }, + { + name="behemoth-biter", + stack_size = 25, + cooldown = 25, + craft_time = 40, + prerequisites = {mod_prefix.."capsule-big-biter", mod_prefix .. "self-sealing-gel"}, + ingredients = { + { name = mod_prefix .. "capsule-big-biter", amount = 1 }, + { name = mod_prefix .. "self-sealing-gel", amount = 4 }, + { type = "fluid", name = mod_prefix .. "nutrient-gel", amount = 80 }, + }, + tech_unit = { count = 400, time = 60, ingredients = { { mod_prefix .. "biological-science-pack-4", 1 }, } } + }, + { + name="small-spitter", + stack_size = 100, + cooldown = 10, + craft_time = 10, + prerequisites = {mod_prefix .. "vitalic-acid"}, + ingredients = { + { name = mod_prefix .. "specimen", amount = 1 }, + { name = mod_prefix .. "vitalic-acid", amount = 4 }, + { type = "fluid", name = mod_prefix .. "nutrient-gel", amount = 20 }, + }, + tech_unit = { count = 100, time = 60, ingredients = { { mod_prefix .. "biological-science-pack-1", 1 }, } } + }, + { + name="medium-spitter", + stack_size = 75, + cooldown = 15, + craft_time = 20, + prerequisites = {mod_prefix.."capsule-small-spitter", mod_prefix .. "vitalic-reagent"}, + ingredients = { + { name = mod_prefix .. "capsule-small-spitter", amount = 1 }, + { name = mod_prefix .. "vitalic-reagent", amount = 4 }, + { type = "fluid", name = mod_prefix .. "nutrient-gel", amount = 40 }, + }, + tech_unit = { count = 200, time = 60, ingredients = { { mod_prefix .. "biological-science-pack-2", 1 }, } } + }, + { + name="big-spitter", + stack_size = 50, + cooldown = 20, + craft_time = 30, + prerequisites = {mod_prefix.."capsule-medium-spitter", mod_prefix .. "vitalic-epoxy"}, + ingredients = { + { name = mod_prefix .. "capsule-medium-spitter", amount = 1 }, + { name = mod_prefix .. "vitalic-epoxy", amount = 4 }, + { type = "fluid", name = mod_prefix .. "nutrient-gel", amount = 60 }, + }, + tech_unit = { count = 300, time = 60, ingredients = { { mod_prefix .. "biological-science-pack-3", 1 }, } } + }, + { + name="behemoth-spitter", + stack_size = 25, + cooldown = 25, + craft_time = 40, + prerequisites = {mod_prefix.."capsule-big-spitter", mod_prefix .. "self-sealing-gel"}, + ingredients = { + { name = mod_prefix .. "capsule-big-spitter", amount = 1 }, + { name = mod_prefix .. "self-sealing-gel", amount = 4 }, + { type = "fluid", name = mod_prefix .. "nutrient-gel", amount = 80 }, + }, + tech_unit = { count = 400, time = 60, ingredients = { { mod_prefix .. "biological-science-pack-4", 1 }, } } + }, +} + +for i, unit_setting in pairs(unit_settings) do + local name = mod_prefix .. "capsule-"..unit_setting.name + local base_entity = data.raw.unit[unit_setting.name] + data:extend({ + { + type = "capsule", + subgroup = "capsule", + name = name, + capsule_action = { + attack_parameters = { + ammo_category = "capsule", + ammo_type = { + action = { + action_delivery = { + projectile = name, + starting_speed = 0.3, + type = "projectile" + }, + type = "direct" + }, + category = "capsule", + target_type = "position" + }, + cooldown = unit_setting.cooldown, + projectile_creation_distance = 0.6, + range = 25, + type = "projectile" + }, + type = "throw" + }, + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/vatling.png", icon_size = 64, shift = {-8, 0}}, + {icon = base_entity.icon, icon_size = base_entity.icon_size, shift = {2, 0}} + }, + order = "u[unit-capsule]-"..string.format("%02d", i), + stack_size = unit_setting.stack_size, + localised_name = {"space-exploration.unit-capsule", {"entity-name."..unit_setting.name}} + }, + { + type = "projectile", + name = name, + acceleration = 0.005, + action = { + action_delivery = { + target_effects = { + entity_name = unit_setting.name, + show_in_tooltip = true, + type = "create-entity" + }, + type = "instant" + }, + type = "direct" + }, + animation = { + filename = "__base__/graphics/entity/poison-capsule/poison-capsule.png", + frame_count = 1, + height = 32, + priority = "high", + width = 32 + }, + flags = { + "not-on-map" + }, + light = { + intensity = 0.5, + size = 4 + }, + shadow = { + filename = "__base__/graphics/entity/poison-capsule/poison-capsule-shadow.png", + frame_count = 1, + height = 32, + priority = "high", + width = 32 + }, + smoke = nil, + }, + { + type = "recipe", + name = name, + result = name, + enabled = false, + energy_required = unit_setting.craft_time, + ingredients = unit_setting.ingredients, + requester_paste_multiplier = 1, + always_show_made_in = true, + category = "space-growth" + }, + { + type = "technology", + name = name, + effects = { + { + type = "unlock-recipe", + recipe = name, + }, + }, + icons = { + {icon = "__space-exploration-graphics__/graphics/technology/vatling.png", icon_size = 128}, + {icon = base_entity.icon, icon_size = base_entity.icon_size, shift = {0, 8}} + }, + order = "e-g", + prerequisites = unit_setting.prerequisites, + unit = unit_setting.tech_unit, + localised_name = {"space-exploration.unit-capsule", {"entity-name."..unit_setting.name}} + }, + }) +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/general.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/general.lua new file mode 100644 index 0000000..f53efe2 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/general.lua @@ -0,0 +1,47 @@ +local allow_in_space = function(type, name) + if data.raw[type][name] then + data.raw[type][name].se_allow_in_space = true + end +end + +local add_crafting_category = function(type, name, category) + if data.raw[type][name] then + table.insert( data.raw[type][name].crafting_categories, category) + end +end +-- by Bernd +allow_in_space("storage-tank", "angels-pressure-tank-1") + +-- by Walter +for name in pairs(data.raw["assembling-machine"]) do + if( string.match(name,'[.]*chemical.plant[.]*')) then + table.insert(data.raw["assembling-machine"][name].crafting_categories, "pressure-washing") + --add_crafting_category("assembling-machine", name, "pressure-washing") + end +end + + +local armor = data.raw.armor + +for _, damage_type in pairs({"radioactive", "radiation", "radioactivity"}) do + + if data.raw["damage-type"][damage_type] then + + local resistances = table.deepcopy(armor["se-thruster-suit"].resistances) + table.insert(resistances, {type = damage_type, decrease = 3, percent = 30}) + armor["se-thruster-suit"].resistances = resistances + + resistances = table.deepcopy(armor["se-thruster-suit-2"].resistances) + table.insert(resistances, {type = damage_type, decrease = 4, percent = 45}) + armor["se-thruster-suit-2"].resistances = resistances + + resistances = table.deepcopy(armor["se-thruster-suit-3"].resistances) + table.insert(resistances, {type = damage_type, decrease = 5, percent = 60}) + armor["se-thruster-suit-3"].resistances = resistances + + resistances = table.deepcopy(armor["se-thruster-suit-3"].resistances) + table.insert(resistances, {type = damage_type, decrease = 6, percent = 80}) + armor["se-thruster-suit-4"].resistances = resistances + + end +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/krastorio2.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/krastorio2.lua new file mode 100644 index 0000000..06b1a6e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/krastorio2.lua @@ -0,0 +1,25 @@ +local data_util = require("data_util") + +if mods["Krastorio2"] then + + require("prototypes/phase-2/compatibility/krastorio2/matter") + require("prototypes/phase-2/compatibility/krastorio2/resources") + require("prototypes/phase-2/compatibility/krastorio2/recipes") + + -- temporarilty remove space-science-pack from any non-k2 techs. + -- after the procedural stop later add it back again, if it is at a certain complexity + for _, tech in pairs(data.raw.technology) do + if tech.mod ~= "Krastorio2" then + data_util.tech_remove_ingredients(tech.name, {"space-science-pack"}) + data_util.tech_remove_prerequisites(tech.name, {"space-science-pack"}) + tech.space_science_pack_removed = true + end + end + + data.raw["assembling-machine"]["kr-quantum-computer"].se_allow_in_space = true + + if data.raw.beacon["kr-singularity-beacon"] then + data.raw.beacon["kr-singularity-beacon"].se_allow_in_space = true + end + +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/matter.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/matter.lua new file mode 100644 index 0000000..3388237 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/matter.lua @@ -0,0 +1,133 @@ +local data_util = require("data_util") + +local value_multiplier = 2 + +local matter = require("__Krastorio2__/lib/public/data-stages/matter-util") +--[[matter_func.createMatterRecipe(args) { + item_name = a, -- (string) the name of raw product. + minimum_conversion_quantity = b, -- (integer) the quantity of item necessary to make one conversion, is also the returned quantity from one deconversion. + matter_value = c, -- (integer) how much matter is gained by conversion and necessary to create the item from matter(minimum_conversion_quantity corresponds to matter_value). + conversion_matter_value = d, -- (optional)(integer) Different value from the matter_value of the item, that specify the matter gained by converting this item to matter (used when wanted different values on conversions). + return_item = e, -- (optional)(string) if the return item from the decoversion(matter to item) is different from the first one. + unlocked_by_technology = f, -- (optional)(string) what technology(the name) unlock the recipes, if isn't setted will be the first that make access to matter conversions. + energy_required = g, -- (optional)(integer) how much time need the conversion. + only_conversion = h, -- (optional)(boolean) if this param is true will be added only the recipe to get matter from the item, but not the deconversion from matter. + only_deconversion = i, -- (optional)(boolean) if this param is true will be added only the recipe to get the item(or return_item) from matter, but not the conversion to matter. + need_stabilizer = l, (optional)(boolean) if the item need stabilizer to be deconverted from matter to the original item(or return_item). + allow_productivity = m, (optional)(boolean) if true, productivity modules can be used on de-conversion from matter (matter->item). +} +default values: + wood 2 + iron ore 5 + raw rare metals 8 + stone 3.5 + water 0.5 + uranium ore 8 + copper plate 7.5 + rare metals 14 + plastic bar 6.6 + matter cube 1000 +]] + +-- matter has a similar role to the fusion-based matter fabricator, +-- but K2 matter is better in almost every way so is the clear upgrade +-- material fabricator is lat energy tech +-- matter system should be deep space tech (deep space tech needs some nice new toys anyway) +-- matter system also shouldn't be too early as it makes the resource logistic challenge much easier. +-- matter system fits well conceptually with deep space theme. +data_util.tech_add_prerequisites("kr-matter-processing", {data_util.mod_prefix .. "space-matter-fusion", data_util.mod_prefix .. "deep-space-science-pack-1"}) + +local make_tech = function(name, tech_image, item_name) + data:extend({ + { + type = "technology", + name = data_util.mod_prefix .. "kr-matter-"..name.."-processing", + mod = "space-exploration", + icons = { + { icon = "__Krastorio2__/graphics/technologies/backgrounds/matter.png", icon_size = 256}, + { icon = "__space-exploration-graphics__/graphics/technology/"..tech_image..".png", icon_size = 128} + }, + effects = {}, + prerequisites = {"kr-matter-processing"}, + order = "g-e-e", + unit = + { + count = 500, + ingredients = + { + {"production-science-pack", 1}, + {"utility-science-pack", 1}, + {"matter-tech-card", 1} + }, + time = 60 + }, + localised_name = {"technology-name.k2-conversion", {"item-name."..item_name}} + } + }) +end + +-- add as sand sink +krastorio.matter_func.createMatterRecipe({ + item_name = "sand", + minimum_conversion_quantity = 10, + matter_value = 1.5, + conversion_matter_value = 1, + energy_required = 0.5, + need_stabilizer = false, + unlocked_by_technology = "kr-matter-stone-processing" +}) + +make_tech("vulcanite", "vulcanite-processing", "se-vulcanite") +krastorio.matter_func.createMatterRecipe({ + item_name = data_util.mod_prefix .. "vulcanite", + minimum_conversion_quantity = 10, + matter_value = value_multiplier * 4*8, -- x8 + conversion_matter_value = value_multiplier * 4, + energy_required = value_multiplier * 4, + need_stabilizer = true, + unlocked_by_technology = data_util.mod_prefix .. "kr-matter-vulcanite-processing" +}) + +make_tech("cryonite", "cryonite-processing", "se-cryonite") +krastorio.matter_func.createMatterRecipe({ + item_name = data_util.mod_prefix .. "cryonite", + minimum_conversion_quantity = 10, + matter_value = value_multiplier * 5*8, -- x8 + conversion_matter_value = value_multiplier * 5, + energy_required = value_multiplier * 5, + need_stabilizer = true, + unlocked_by_technology = data_util.mod_prefix .. "kr-matter-cryonite-processing" +}) + +make_tech("beryllium", "beryllium-processing", "se-beryllium-ore") +krastorio.matter_func.createMatterRecipe({ + item_name = data_util.mod_prefix .. "beryllium-ore", + minimum_conversion_quantity = 10, + matter_value = value_multiplier * 6*8, -- x8 + conversion_matter_value = value_multiplier * 6, + energy_required = value_multiplier * 6, + need_stabilizer = true, + unlocked_by_technology = data_util.mod_prefix .. "kr-matter-beryllium-processing" +}) + +make_tech("holmium", "holmium-processing", "se-holmium-ore") +krastorio.matter_func.createMatterRecipe({ + item_name = data_util.mod_prefix .. "holmium-ore", + minimum_conversion_quantity = 10, + matter_value = value_multiplier * 7*8, -- x8 + conversion_matter_value = value_multiplier * 7, + energy_required = value_multiplier * 7, + need_stabilizer = true, + unlocked_by_technology = data_util.mod_prefix .. "kr-matter-holmium-processing" +}) + +make_tech("iridium", "iridium-processing", "se-iridium-ore") +krastorio.matter_func.createMatterRecipe({ + item_name = data_util.mod_prefix .. "iridium-ore", + minimum_conversion_quantity = 10, + matter_value = value_multiplier * 8*8, -- x8 + conversion_matter_value = value_multiplier * 8, + energy_required = value_multiplier * 8, + need_stabilizer = true, + unlocked_by_technology = data_util.mod_prefix .. "kr-matter-iridium-processing" +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/recipes.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/recipes.lua new file mode 100644 index 0000000..f39b148 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/recipes.lua @@ -0,0 +1,93 @@ +local data_util = require("data_util") + +local recipe = data.raw.recipe +local tech = data.raw.technology + + --Add various K2 products to the delivery cannon. +se_delivery_cannon_recipes = se_delivery_cannon_recipes or {} + +se_delivery_cannon_recipes["mineral-water"] = {name="water-barrel"} +se_delivery_cannon_recipes["biomethanol"] = {name="biomethanol-barrel"} +se_delivery_cannon_recipes["chlorine"] = {name="chlorine-barrel"} +se_delivery_cannon_recipes["dirty-water"] = {name="dirty-water-barrel"} +se_delivery_cannon_recipes["heavy-water"] = {name="heavy-water-barrel"} +se_delivery_cannon_recipes["hydrogen-chloride"] = {name="hydrogen-chloride-barrel"} +se_delivery_cannon_recipes["nitric-acid"] = {name="nitric-acid-barrel"} + +se_delivery_cannon_recipes["raw-imersite"] = {name="raw-imersite"} +se_delivery_cannon_recipes["imersite-powder"] = {name="imersite-powder"} +se_delivery_cannon_recipes["imersium-plate"] = {name="imersium-plate"} +se_delivery_cannon_recipes["imersite-crystal"] = {name="imersite-crystal"} +se_delivery_cannon_recipes["coke"] = {name="coke"} +se_delivery_cannon_recipes["quartz"] = {name="quartz"} +se_delivery_cannon_recipes["silicon"] = {name="silicon"} +se_delivery_cannon_recipes["enriched-iron"] = {name="enriched-iron"} +se_delivery_cannon_recipes["enriched-copper"] = {name="enriched-copper"} +se_delivery_cannon_recipes["enriched-rare-metals"] = {name="enriched-rare-metals"} +se_delivery_cannon_recipes["raw-rare-metals"] = {name="raw-rare-metals"} +se_delivery_cannon_recipes["rare-metals"] = {name="rare-metals"} +se_delivery_cannon_recipes["lithium"] = {name="lithium"} +se_delivery_cannon_recipes["lithium-chloride"] = {name="lithium-chloride"} +se_delivery_cannon_recipes["tritium"] = {name="tritium"} +se_delivery_cannon_recipes["fuel"] = {name="fuel"} +se_delivery_cannon_recipes["bio-fuel"] = {name="bio-fuel"} +se_delivery_cannon_recipes["advanced-fuel"] = {name="advanced-fuel"} +se_delivery_cannon_recipes["fertilizer"] = {name="fertilizer"} + +table.insert(tech["se-processing-vulcanite"].prerequisites, "kr-enriched-ores") + +recipe["se-iron-smelting-vulcanite"].ingredients = { + {"enriched-iron", 8}, + {"se-vulcanite-block", 1} +} + +recipe["se-copper-smelting-vulcanite"].ingredients = { + {"enriched-copper", 8}, + {"se-vulcanite-block", 1} +} + +local rare_metals_vulcanite = table.deepcopy(recipe["se-copper-smelting-vulcanite"]) +rare_metals_vulcanite.name = "rare-metals-vulcanite" +rare_metals_vulcanite.ingredients = { + {"enriched-rare-metals", 8}, + {"se-vulcanite-block", 1} +} +rare_metals_vulcanite.icons = { + {icon = data.raw.item["rare-metals"].icon, icon_size = data.raw.item["rare-metals"].icon_size, scale = 32/data.raw.item["rare-metals"].icon_size}, + {icon = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + scale = 0.5 * 32/data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + shift = {-10, -10} + }, +} +rare_metals_vulcanite.results = {{"rare-metals", 12}} +rare_metals_vulcanite.group = "resources" +rare_metals_vulcanite.subgroup = "raw-material" +recipe["rare-metals-vulcanite"] = rare_metals_vulcanite +table.insert(tech["se-processing-vulcanite"].effects, {type = "unlock-recipe", recipe = "rare-metals-vulcanite"}) + +local silicon_vulcanite = table.deepcopy(recipe["se-copper-smelting-vulcanite"]) +silicon_vulcanite.name = "silicon-vulcanite" +silicon_vulcanite.ingredients = { + {"quartz", 18}, + {"se-vulcanite-block", 1} +} +silicon_vulcanite.icons = { + {icon = data.raw.item["silicon"].icon, icon_size = data.raw.item["silicon"].icon_size, scale = 32/data.raw.item["silicon"].icon_size}, + {icon = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + scale = 0.5 * 32/data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + shift = {-10, -10} + }, +} +silicon_vulcanite.results = {{"silicon", 18}} +recipe["silicon-vulcanite"] = silicon_vulcanite +table.insert(tech["se-processing-vulcanite"].effects, {type = "unlock-recipe", recipe = "silicon-vulcanite"}) + +recipe["se-stone-brick-vulcanite"].group = "resources" +recipe["se-stone-brick-vulcanite"].subgroup = "raw-material" + +data_util.allow_productivity({ + "rare-metals-vulcanite", + "silicon-vulcanite", +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/resources.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/resources.lua new file mode 100644 index 0000000..d1b8815 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/compatibility/krastorio2/resources.lua @@ -0,0 +1,43 @@ +local data_util = require("data_util") + +-- vanilla resource changed. Need more uranium. +se_resources["uranium-ore"] = se_resources["uranium-ore"] or { + order = "c-d", + has_starting_area_placement = false, + base_density = 5, + base_spots_per_km2 = 8, + random_spot_size_minimum = 5, + random_spot_size_maximum = 10 +} + +-- Krastorio 2 resources +se_resources["rare-metals"] = {order = "c-c", has_starting_area_placement = false, base_density = 8, starting_rq_factor_multiplier = 1.5} +se_resources["mineral-water"] = { + order = "e-b", + has_starting_area_placement = false, + base_density = 8, + base_spots_per_km2 = 2, + random_probability = 1/48, + random_spot_size_minimum = 1, + random_spot_size_maximum = 1, -- don't randomize spot size + additional_richness = 120000, -- this increases the total everywhere, so base_density needs to be decreased to compensate + regular_rq_factor_multiplier = 1, + starting_rq_factor_multiplier = 1 +} +se_resources["imersite"] = { + order = "e-c", + has_starting_area_placement = false, + base_density = 1, + base_spots_per_km2 = 0.05, + random_spot_size_minimum = 0.01, + random_spot_size_maximum = 0.1, + additional_richness = 250000, -- this increases the total everywhere, so base_density needs to be decreased to compensate + regular_rq_factor_multiplier = 1, + starting_rq_factor_multiplier = 1 +} + +se_core_fragment_resources["raw-imersite"] = { multiplier = 0.5, omni_multiplier = 0} +se_core_fragment_resources["mineral-water"] = { multiplier = 1, omni_multiplier = 0} + +-- more uranium in fragments +se_core_fragment_resources["uranium-ore"] = se_core_fragment_resources["uranium-ore"] or { multiplier = 0.5, omni_multiplier = 0.02} diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-2/generic-recycling.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/generic-recycling.lua new file mode 100644 index 0000000..2ff53d9 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/generic-recycling.lua @@ -0,0 +1,170 @@ +local data_util = require("data_util") + +local function scrapping_recipe(item_name, input_count, results) + local item = data.raw.item[item_name] + if not item then return end + -- return can be a number or a result list + if type(results) == "number" then + if results < 1 then + results = {{ name = data_util.mod_prefix .. "scrap", amount_min = 1, amount_max = 1, probability = results}} + else + results = {{ data_util.mod_prefix .. "scrap", results}} + end + end + + local recipe = { + type = "recipe", + name = data_util.mod_prefix .. "-scrapping-"..item_name, + ingredients = { + { item_name, input_count} + }, + results = results, + category = "hard-recycling", + subgroup = "space-recycling", + icons = data_util.transition_icons( + { + icon = item.icon, + icon_size = item.icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .. "scrap"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "scrap"].icon_size, scale = 0.5 + } + ), + energy_required = 1, + allow_as_intermediate = false, + localised_name = {"recipe-name." .. data_util.mod_prefix .. "generic-scrapping", {"entity-name."..item_name}}, + enabled = false, + always_show_made_in = true, + allow_decomposition = false, + --hide_from_player_crafting = true, + } + data:extend({recipe}) + data_util.tech_lock_recipes(data_util.mod_prefix.."recycling-facility", {data_util.mod_prefix .. "-scrapping-"..item_name}) +end + +local function reverse_recipe(recipe_name, item_name) + local o_recipe = data.raw.recipe[recipe_name] + if not o_recipe then return end + if not item_name then item_name = recipe_name end + local item = data.raw.item[item_name] + if not item then return end + + + local recipe = { + type = "recipe", + name = data_util.mod_prefix .. "recycle-"..recipe_name, + category = "hard-recycling", + subgroup = "space-recycling", + icons = data_util.transition_icons( + { + icon = item.icon, + icon_size = item.icon_size, scale = 0.5 + }, + { + icon = data.raw.item[data_util.mod_prefix .. "scrap"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "scrap"].icon_size, scale = 0.5 + } + ), + energy_required = 1, + allow_as_intermediate = false, + localised_name = {"recipe-name." .. data_util.mod_prefix .. "generic-recycling", {"entity-name."..item_name}}, + enabled = false, + always_show_made_in = true, + allow_decomposition = false, + --hide_from_player_crafting = true, + } + recipe.ingredients = {{name=item_name, amount = 1}} + recipe.results = table.deepcopy(o_recipe.ingredients or o_recipe.normal.ingredients) + data_util.result_to_results(recipe.results) + + for k, result in pairs(recipe.results) do + local name = result.name or result[1] + local count = result.amount or (result[2] or 1) + local return_count = count*0.75 + if return_count < 1 then + recipe.results[k] = {name=name, amount_min = 1, amount_max = 1, probability = return_count} + else + recipe.results[k] = {name=name, amount = math.floor(return_count)} + end + end + data:extend({recipe}) + data_util.tech_lock_recipes(data_util.mod_prefix.."recycling-facility", {data_util.mod_prefix .. "recycle-"..recipe_name}) +end + +reverse_recipe("small-electric-pole") +reverse_recipe("small-iron-electric-pole") +reverse_recipe("medium-electric-pole") +reverse_recipe("big-electric-pole") +reverse_recipe("substation") +reverse_recipe("radar") +reverse_recipe("pistol") + +data:extend({ + { + type = "recipe", + name = "landfill", + energy_required = 1, + enabled = false, + category = "crafting", + ingredients = + { + {"stone", 50} + }, + result= "landfill", + result_count = 1, + order = "z-a-a" + }, + { + type = "recipe", + name = "landfill-sand", + energy_required = 1, + enabled = false, + category = "crafting", + icons = { + {icon = data.raw.item.landfill.icon, icon_size = data.raw.item.landfill.icon_size}, + {icon = data.raw.item.sand.icon, icon_size = data.raw.item.sand.icon_size, scale = 0.33*64/data.raw.item.sand.icon_size}, + }, + ingredients = + { + {"sand", 200} + }, + result= "landfill", + result_count = 1, + order = "z-a-b", + allow_decomposition = false, + } +}) +data_util.tech_lock_recipes("landfill", {"landfill-sand"}) + +local function landfil_recipe(item_name, count) + data:extend({ + { + type = "recipe", + name = "landfill-"..item_name, + energy_required = 1, + enabled = false, + category = "hard-recycling", + icons = { + {icon = data.raw.item.landfill.icon, icon_size = data.raw.item.landfill.icon_size}, + {icon = data.raw.item[item_name].icon, icon_size = data.raw.item[item_name].icon_size, scale = 0.33*64/data.raw.item[item_name].icon_size}, + }, + ingredients = + { + {item_name, count} + }, + result= "landfill", + result_count = 1, + order = "z-b-"..item_name, + allow_decomposition = false, + } + }) + data_util.tech_lock_recipes(data_util.mod_prefix.."recycling-facility", {"landfill-"..item_name}) +end + +landfil_recipe(data_util.mod_prefix.."scrap", 100) +landfil_recipe("iron-ore", 50) +landfil_recipe("copper-ore", 50) +landfil_recipe(data_util.mod_prefix.."iridium-ore", 25) +landfil_recipe(data_util.mod_prefix.."holmium-ore", 50) +landfil_recipe(data_util.mod_prefix.."beryllium-ore", 50) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-2/linked-containers-old.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/linked-containers-old.lua new file mode 100644 index 0000000..ca75e18 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/linked-containers-old.lua @@ -0,0 +1,90 @@ +local data_util = require("data_util") +local tech_effects = {} +if mods["aai-containers"] then + local base_models = { + "logistic-chest-passive-provider", + "aai-strongbox-passive-provider", + "aai-storehouse-passive-provider", + "aai-warehouse-passive-provider" + } + local inventory_sizes = {1, 4, 9, 25} + local arcosphere_cost = {2, 4, 7, 10} + local base_containers = {"steel-chest", "aai-strongbox", "aai-storehouse", "aai-warehouse"} + for i, base_model in pairs(base_models) do + local item = table.deepcopy(data.raw.item[base_model]) + local entity = table.deepcopy(data.raw["logistic-container"][base_model]) + + local name = data_util.replace(item.name, "passive-provider", "linked") + name = data_util.replace(name, "logistic-chest", "chest") + + item.name = name + item.place_result = name + item.icons[2].tint = {1,1,1} + item.order = "z" ..item.order + + local recipe = { + type = "recipe", + name = name, + ingredients = { + { base_containers[i], 1 }, + { name = data_util.mod_prefix .. "naquium-processor", amount = inventory_sizes[i]}, + { name = data_util.mod_prefix .. "arcosphere-a", amount = arcosphere_cost[i]}, + }, + result = name, + energy_required = 60 * i, + category = "space-manufacturing", + enabled = false, + always_show_made_in = true, + } + table.insert(tech_effects, { type = "unlock-recipe", recipe = name}) + + entity.type = "linked-container" + entity.name = name + entity.inventory_size = inventory_sizes[i] + entity.minable.result = name + entity.type = "linked-container" + entity.circuit_wire_connection_point = nil + entity.circuit_connector_sprites = nil + entity.circuit_wire_max_distance = nil + entity.gui_mode = "none" + entity.picture = entity.animation + entity.animation = nil + entity.picture.layers[3].tint = {1,1,1} + entity.picture.layers[3].hr_version.tint = {1,1,1} + data:extend({item, recipe, entity}) + end +end +data:extend({ + { + type = "technology", + name = data_util.mod_prefix .. "linked-containers", + effects = tech_effects, + icons = mods["aai-containers"] and { + { icon = "__aai-containers__/graphics/technology/container-6-base.png", icon_size = 128 }, + { icon = "__aai-containers__/graphics/technology/container-6-mask.png", icon_size = 128 } + } or nil, + icon = mods["aai-containers"] and nil or "__space-exploration-graphics__/graphics/technology/teleportation.png", + icon_size = 128, + order = "e-g", + prerequisites = { + data_util.mod_prefix .. "teleportation", + }, + unit = { + count = 5000, + time = 60, + ingredients = { + { "logistic-science-pack", 1 }, + { "utility-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .."astronomic-science-pack-4", 1 }, + { data_util.mod_prefix .."energy-science-pack-4", 1 }, + { data_util.mod_prefix .."deep-space-science-pack-4", 1 }, + } + }, + enabled = true + }, +}) +if not mods["aai-containers"] then + data.raw.technology[data_util.mod_prefix .. "linked-containers"].localised_description = {"technology-description."..data_util.mod_prefix .. "linked-containers-disabled"} +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-2/modules.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/modules.lua new file mode 100644 index 0000000..ab684c0 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/modules.lua @@ -0,0 +1,1331 @@ +local data_util = require("data_util") + +local modules_per_tier = 3 + +data.raw.technology["productivity-module"].icon = "__space-exploration-graphics__/graphics/technology/modules/productivity-1.png" +data.raw.technology["productivity-module"].icon_size = 128 +data.raw.technology["productivity-module-2"].icon = "__space-exploration-graphics__/graphics/technology/modules/productivity-2.png" +data.raw.technology["productivity-module-2"].icon_size = 128 +data.raw.technology["productivity-module-3"].icon = "__space-exploration-graphics__/graphics/technology/modules/productivity-3.png" +data.raw.technology["productivity-module-3"].icon_size = 128 + +data.raw.technology["speed-module"].icon = "__space-exploration-graphics__/graphics/technology/modules/speed-1.png" +data.raw.technology["speed-module"].icon_size = 128 +data.raw.technology["speed-module-2"].icon = "__space-exploration-graphics__/graphics/technology/modules/speed-2.png" +data.raw.technology["speed-module-2"].icon_size = 128 +data.raw.technology["speed-module-3"].icon = "__space-exploration-graphics__/graphics/technology/modules/speed-3.png" +data.raw.technology["speed-module-3"].icon_size = 128 + +data.raw.technology["effectivity-module"].icon = "__space-exploration-graphics__/graphics/technology/modules/effectivity-1.png" +data.raw.technology["effectivity-module"].icon_size = 128 +data.raw.technology["effectivity-module-2"].icon = "__space-exploration-graphics__/graphics/technology/modules/effectivity-2.png" +data.raw.technology["effectivity-module-2"].icon_size = 128 +data.raw.technology["effectivity-module-3"].icon = "__space-exploration-graphics__/graphics/technology/modules/effectivity-3.png" +data.raw.technology["effectivity-module-3"].icon_size = 128 + +data_util.tech_add_prerequisites("productivity-module-3", {"battery"}) +data_util.tech_add_prerequisites("speed-module-3", {"battery"}) +data_util.tech_add_prerequisites("effectivity-module-3", {"battery"}) + +data_util.replace_or_add_ingredient("productivity-module-2", "productivity-module", "productivity-module", modules_per_tier) +data_util.replace_or_add_ingredient("speed-module-2", "speed-module", "speed-module", modules_per_tier) +data_util.replace_or_add_ingredient("effectivity-module-2", "effectivity-module", "effectivity-module", modules_per_tier) + +data_util.replace_or_add_ingredient("productivity-module-3", "productivity-module-2", "productivity-module-2", modules_per_tier) +data_util.replace_or_add_ingredient("speed-module-3", "speed-module-2", "speed-module-2", modules_per_tier) +data_util.replace_or_add_ingredient("effectivity-module-3", "effectivity-module-2", "effectivity-module-2", modules_per_tier) + +data.raw.module["productivity-module"].icon = "__space-exploration-graphics__/graphics/icons/modules/productivity-1.png" +data.raw.module["productivity-module"].icon_size = 64 +data.raw.module["productivity-module"].icon_mipmaps = 1 +data.raw.module["productivity-module"].subgroup = "module-productivity" +data.raw.module["productivity-module"].effect = + { + productivity = {bonus = 0.04}, + consumption = {bonus = 0.5}, + pollution = {bonus = 0.05}, + speed = {bonus = -0.1} + } +data.raw.module["productivity-module-2"].icon = "__space-exploration-graphics__/graphics/icons/modules/productivity-2.png" +data.raw.module["productivity-module-2"].icon_size = 64 +data.raw.module["productivity-module-2"].icon_mipmaps = 1 +data.raw.module["productivity-module-2"].subgroup = "module-productivity" +data.raw.module["productivity-module-2"].effect = + { + productivity = {bonus = 0.06}, + consumption = {bonus = 0.6}, + pollution = {bonus = 0.06}, + speed = {bonus = -0.15} + } +data.raw.module["productivity-module-3"].icon = "__space-exploration-graphics__/graphics/icons/modules/productivity-3.png" +data.raw.module["productivity-module-3"].icon_size = 64 +data.raw.module["productivity-module-3"].icon_mipmaps = 1 +data.raw.module["productivity-module-3"].subgroup = "module-productivity" +data.raw.module["productivity-module-3"].effect = + { + productivity = {bonus = 0.08}, + consumption = {bonus = 0.8}, + pollution = {bonus = 0.08}, + speed = {bonus = -0.2} + } + +data.raw.module["speed-module"].icon = "__space-exploration-graphics__/graphics/icons/modules/speed-1.png" +data.raw.module["speed-module"].icon_size = 64 +data.raw.module["speed-module"].icon_mipmaps = 1 +data.raw.module["speed-module"].subgroup = "module-speed" +data.raw.module["speed-module"].effect = + { + consumption = {bonus = 0.5}, + pollution = {bonus = 0.04}, + speed = {bonus = 0.2} + } +data.raw.module["speed-module-2"].icon = "__space-exploration-graphics__/graphics/icons/modules/speed-2.png" +data.raw.module["speed-module-2"].icon_size = 64 +data.raw.module["speed-module-2"].icon_mipmaps = 1 +data.raw.module["speed-module-2"].subgroup = "module-speed" +data.raw.module["speed-module-2"].effect = + { + consumption = {bonus = 0.6}, + pollution = {bonus = 0.06}, + speed = {bonus = 0.3} + } +data.raw.module["speed-module-3"].icon = "__space-exploration-graphics__/graphics/icons/modules/speed-3.png" +data.raw.module["speed-module-3"].icon_size = 64 +data.raw.module["speed-module-3"].icon_mipmaps = 1 +data.raw.module["speed-module-3"].subgroup = "module-speed" +data.raw.module["speed-module-3"].effect = + { + consumption = {bonus = 0.8}, + pollution = {bonus = 0.08}, + speed = {bonus = 0.4} + } + +data.raw.module["effectivity-module"].icon = "__space-exploration-graphics__/graphics/icons/modules/effectivity-1.png" +data.raw.module["effectivity-module"].icon_size = 64 +data.raw.module["effectivity-module"].icon_mipmaps = 1 +data.raw.module["effectivity-module"].subgroup = "module-effectivity" +data.raw.module["effectivity-module"].effect = + { + consumption = {bonus = -0.4}, + pollution = {bonus = -0.1}, + } +data.raw.module["effectivity-module-2"].icon = "__space-exploration-graphics__/graphics/icons/modules/effectivity-2.png" +data.raw.module["effectivity-module-2"].icon_size = 64 +data.raw.module["effectivity-module-2"].icon_mipmaps = 1 +data.raw.module["effectivity-module-2"].subgroup = "module-effectivity" +data.raw.module["effectivity-module-2"].effect = + { + consumption = {bonus = -0.6}, + pollution = {bonus = -0.15}, + } +data.raw.module["effectivity-module-3"].icon = "__space-exploration-graphics__/graphics/icons/modules/effectivity-3.png" +data.raw.module["effectivity-module-3"].icon_size = 64 +data.raw.module["effectivity-module-3"].icon_mipmaps = 1 +data.raw.module["effectivity-module-3"].subgroup = "module-effectivity" +data.raw.module["effectivity-module-3"].effect = + { + consumption = {bonus = -1}, + pollution = {bonus = -0.2}, + } + +data:extend({ + + --productivity + { + type = "recipe", + name = "productivity-module", + ingredients = { + {name = "electronic-circuit", amount = 5}, + {name = "advanced-circuit", amount = 1}, + }, + energy_required = 2^1, + result = "productivity-module", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "recipe", + name = "productivity-module-2", + ingredients = { + {name = "productivity-module", amount = modules_per_tier}, + {name = "advanced-circuit", amount = 5}, + {name = "processing-unit", amount = 1}, + }, + energy_required = 2^2, + result = "productivity-module-2", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "recipe", + name = "productivity-module-3", + ingredients = { + {name = "productivity-module-2", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = "battery", amount = 1}, + }, + energy_required = 2^3, + result = "productivity-module-3", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "module", + name = "productivity-module-4", + icon = "__space-exploration-graphics__/graphics/icons/modules/productivity-4.png", + icon_size = 64, + subgroup = "module-productivity", + category = "productivity", + tier = 4, + order = "c[productivity]-d[productivity-module-4]", + stack_size = 50, + effect = + { + productivity = {bonus = 0.1}, + consumption = {bonus = 1}, + pollution = {bonus = 0.1}, + speed = {bonus = -0.25} + }, + limitation = productivity_module_limitation(), + limitation_message_key = "production-module-usable-only-on-intermediates" + }, + { + type = "recipe", + name = "productivity-module-4", + ingredients = { + {name = "productivity-module-3", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "vulcanite-block", amount = 5}, + {name = data_util.mod_prefix .. "machine-learning-data", amount = 1}, + }, + energy_required = 2^4, + result = "productivity-module-4", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "productivity-module-4", + effects = { + {type = "unlock-recipe", recipe = "productivity-module-4"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/productivity-4.png", + icon_size = 128, + order = "i-e-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "rocket-science-pack", + "productivity-module-3" + }, + unit = { + count = 300, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + }, + { + type = "module", + name = "productivity-module-5", + icon = "__space-exploration-graphics__/graphics/icons/modules/productivity-5.png", + icon_size = 64, + subgroup = "module-productivity", + category = "productivity", + tier = 5, + order = "c[productivity]-e[productivity-module-5]", + stack_size = 50, + effect = + { + productivity = {bonus = 0.12}, + consumption = {bonus = 1.2}, + pollution = {bonus = 0.12}, + speed = {bonus = -0.3} + }, + limitation = productivity_module_limitation(), + limitation_message_key = "production-module-usable-only-on-intermediates" + }, + { + type = "recipe", + name = "productivity-module-5", + ingredients = { + {name = "productivity-module-4", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "vitamelange-extract", amount = 10}, + {name = data_util.mod_prefix .. "biological-catalogue-1", amount = 1}, + }, + energy_required = 2^5, + result = "productivity-module-5", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "productivity-module-5", + effects = { + {type = "unlock-recipe", recipe = "productivity-module-5"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/productivity-5.png", + icon_size = 128, + order = "i-e-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-biological-1", + "productivity-module-4", + }, + unit = { + count = 500, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-1", 1 }, + } + }, + }, + { + type = "module", + name = "productivity-module-6", + icon = "__space-exploration-graphics__/graphics/icons/modules/productivity-6.png", + icon_size = 64, + subgroup = "module-productivity", + category = "productivity", + tier = 6, + order = "c[productivity]-f[productivity-module-6]", + stack_size = 50, + effect = + { + productivity = {bonus = 0.14}, + consumption = {bonus = 1.4}, + pollution = {bonus = 0.14}, + speed = {bonus = -0.35} + }, + limitation = productivity_module_limitation(), + limitation_message_key = "production-module-usable-only-on-intermediates" + }, + { + type = "recipe", + name = "productivity-module-6", + ingredients = { + {name = "productivity-module-5", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "biological-catalogue-2", amount = 1} + }, + energy_required = 2^6, + result = "productivity-module-6", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "productivity-module-6", + effects = { + {type = "unlock-recipe", recipe = "productivity-module-6"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/productivity-6.png", + icon_size = 128, + order = "i-e-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-biological-2", + "productivity-module-5", + }, + unit = { + count = 200, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-2", 1 }, + } + }, + + }, + { + type = "module", + name = "productivity-module-7", + icon = "__space-exploration-graphics__/graphics/icons/modules/productivity-7.png", + icon_size = 64, + subgroup = "module-productivity", + category = "productivity", + tier = 7, + order = "c[productivity]-f[productivity-module-7]", + stack_size = 50, + effect = + { + productivity = {bonus = 0.16}, + consumption = {bonus = 1.6}, + pollution = {bonus = 0.16}, + speed = {bonus = -0.4} + }, + limitation = productivity_module_limitation(), + limitation_message_key = "production-module-usable-only-on-intermediates" + }, + { + type = "recipe", + name = "productivity-module-7", + ingredients = { + {name = "productivity-module-6", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "biological-catalogue-3", amount = 1} + }, + energy_required = 2^7, + result = "productivity-module-7", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "productivity-module-7", + effects = { + {type = "unlock-recipe", recipe = "productivity-module-7"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/productivity-7.png", + icon_size = 128, + order = "i-e-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-biological-3", + "productivity-module-6" + }, + unit = { + count = 500, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-3", 1 }, + } + }, + + }, + { + type = "module", + name = "productivity-module-8", + icon = "__space-exploration-graphics__/graphics/icons/modules/productivity-8.png", + icon_size = 64, + subgroup = "module-productivity", + category = "productivity", + tier = 8, + order = "c[productivity]-h[productivity-module-8]", + stack_size = 50, + effect = + { + productivity = {bonus = 0.18}, + consumption = {bonus = 1.8}, + pollution = {bonus = 0.18}, + speed = {bonus = -0.45} + }, + limitation = productivity_module_limitation(), + limitation_message_key = "production-module-usable-only-on-intermediates" + }, + { + type = "recipe", + name = "productivity-module-8", + ingredients = { + {name = "productivity-module-7", amount = modules_per_tier}, + {name = data_util.mod_prefix .. "neural-gel", amount = 10, type="fluid"}, + {name = data_util.mod_prefix .. "biological-catalogue-4", amount = 1} + }, + energy_required = 2^8, + category = "crafting-with-fluid", + result = "productivity-module-8", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "productivity-module-8", + effects = { + {type = "unlock-recipe", recipe = "productivity-module-8"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/productivity-8.png", + icon_size = 128, + order = "i-e-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-biological-4", + "productivity-module-7" + }, + unit = { + count = 800, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1 }, + } + }, + + }, + { + type = "module", + name = "productivity-module-9", + icon = "__space-exploration-graphics__/graphics/icons/modules/productivity-9.png", + icon_size = 64, + subgroup = "module-productivity", + category = "productivity", + tier = 9, + order = "c[productivity]-i[productivity-module-9]", + stack_size = 50, + effect = + { + productivity = {bonus = 0.2}, + consumption = {bonus = 2}, + pollution = {bonus = 0.2}, + speed = {bonus = -0.5} + }, + limitation = productivity_module_limitation(), + limitation_message_key = "production-module-usable-only-on-intermediates" + }, + { + type = "recipe", + name = "productivity-module-9", + ingredients = { + {name = "productivity-module-8", amount = modules_per_tier}, + {name = data_util.mod_prefix .. "superconductive-cable", amount = 5}, + {name = data_util.mod_prefix .. "neural-gel-2", amount = 50, type="fluid"}, + {name = data_util.mod_prefix .. "biological-catalogue-4", amount = 1} + }, + energy_required = 2^9, + category = "crafting-with-fluid", + result = "productivity-module-9", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "productivity-module-9", + effects = { + {type = "unlock-recipe", recipe = "productivity-module-9"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/productivity-9.png", + icon_size = 128, + order = "i-e-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-1", + "productivity-module-8" + }, + unit = { + count = 1000, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "biological-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-1", 1}, + } + }, + + }, + + --speed + { + type = "recipe", + name = "speed-module", + ingredients = { + {name = "electronic-circuit", amount = 5}, + {name = "advanced-circuit", amount = 1}, + }, + energy_required = 2^1, + result = "speed-module", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "recipe", + name = "speed-module-2", + ingredients = { + {name = "speed-module", amount = modules_per_tier}, + {name = "advanced-circuit", amount = 5}, + {name = "processing-unit", amount = 1}, + }, + energy_required = 2^2, + result = "speed-module-2", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "recipe", + name = "speed-module-3", + ingredients = { + {name = "speed-module-2", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = "battery", amount = 1}, + }, + energy_required = 2^3, + result = "speed-module-3", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "module", + name = "speed-module-4", + icon = "__space-exploration-graphics__/graphics/icons/modules/speed-4.png", + icon_size = 64, + subgroup = "module-speed", + category = "speed", + tier = 4, + order = "a[speed]-d[speed-module-4]", + stack_size = 50, + effect = { + speed = {bonus = 0.5}, + consumption = {bonus = 1.1}, + pollution = {bonus = 0.1} + } + }, + { + type = "recipe", + name = "speed-module-4", + ingredients = { + {name = "speed-module-3", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "iridium-plate", amount = 5}, + {name = data_util.mod_prefix .. "machine-learning-data", amount = 1}, + }, + energy_required = 2^4, + result = "speed-module-4", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "speed-module-4", + effects = { + {type = "unlock-recipe", recipe = "speed-module-4"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/speed-4.png", + icon_size = 128, + order = "i-c-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "rocket-science-pack", + "speed-module-3" + }, + unit = { + count = 300, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + + }, + { + type = "module", + name = "speed-module-5", + icon = "__space-exploration-graphics__/graphics/icons/modules/speed-5.png", + icon_size = 64, + subgroup = "module-speed", + category = "speed", + tier = 5, + order = "a[speed]-e[speed-module-5]", + stack_size = 50, + effect = { + speed = {bonus = 0.6}, + consumption = {bonus = 1.5}, + pollution = {bonus = 0.12} + } + }, + { + type = "recipe", + name = "speed-module-5", + ingredients = { + {name = "speed-module-4", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "material-catalogue-1", amount = 1} + }, + energy_required = 2^5, + result = "speed-module-5", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "speed-module-5", + effects = { + {type = "unlock-recipe", recipe = "speed-module-5"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/speed-5.png", + icon_size = 128, + order = "i-c-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-material-1", + "speed-module-4" + }, + unit = { + count = 500, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-1", 1 }, + } + }, + + }, + { + type = "module", + name = "speed-module-6", + icon = "__space-exploration-graphics__/graphics/icons/modules/speed-6.png", + icon_size = 64, + subgroup = "module-speed", + category = "speed", + tier = 6, + order = "a[speed]-f[speed-module-6]", + stack_size = 50, + effect = { + speed = {bonus = 0.7}, + consumption = {bonus = 2}, + pollution = {bonus = 0.14} + } + }, + { + type = "recipe", + name = "speed-module-6", + ingredients = { + {name = "speed-module-5", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "material-catalogue-2", amount = 1} + }, + energy_required = 2^6, + result = "speed-module-6", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "speed-module-6", + effects = { + {type = "unlock-recipe", recipe = "speed-module-6"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/speed-6.png", + icon_size = 128, + order = "i-c-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-material-2", + "speed-module-5" + }, + unit = { + count = 200, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-2", 1 }, + } + }, + + }, + { + type = "module", + name = "speed-module-7", + icon = "__space-exploration-graphics__/graphics/icons/modules/speed-7.png", + icon_size = 64, + subgroup = "module-speed", + category = "speed", + tier = 7, + order = "a[speed]-g[speed-module-7]", + stack_size = 50, + effect = { + speed = {bonus = 0.8}, + consumption = {bonus = 2.6}, + pollution = {bonus = 0.16} + } + }, + { + type = "recipe", + name = "speed-module-7", + ingredients = { + {name = "speed-module-6", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "material-catalogue-3", amount = 1} + }, + energy_required = 2^7, + result = "speed-module-7", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "speed-module-7", + effects = { + {type = "unlock-recipe", recipe = "speed-module-7"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/speed-7.png", + icon_size = 128, + order = "i-c-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-material-3", + "speed-module-6" + }, + unit = { + count = 500, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-3", 1 }, + } + }, + + }, + { + type = "module", + name = "speed-module-8", + icon = "__space-exploration-graphics__/graphics/icons/modules/speed-8.png", + icon_size = 64, + subgroup = "module-speed", + category = "speed", + tier = 8, + order = "a[speed]-h[speed-module-8]", + stack_size = 50, + effect = { + speed = {bonus = 0.9}, + consumption = {bonus = 3.3}, + pollution = {bonus = 0.18} + } + }, + { + type = "recipe", + name = "speed-module-8", + ingredients = { + {name = "speed-module-7", amount = modules_per_tier}, + {name = data_util.mod_prefix .. "superconductive-cable", amount = 5}, + {name = data_util.mod_prefix .. "material-catalogue-4", amount = 1} + }, + energy_required = 2^8, + result = "speed-module-8", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "speed-module-8", + effects = { + {type = "unlock-recipe", recipe = "speed-module-8"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/speed-8.png", + icon_size = 128, + order = "i-c-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-material-4", + "speed-module-7" + }, + unit = { + count = 800, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + } + }, + + }, + { + type = "module", + name = "speed-module-9", + icon = "__space-exploration-graphics__/graphics/icons/modules/speed-9.png", + icon_size = 64, + subgroup = "module-speed", + category = "speed", + tier = 9, + order = "a[speed]-i[speed-module-9]", + stack_size = 50, + effect = { + speed = {bonus = 1}, + consumption = {bonus = 4}, + pollution = {bonus = 0.2} + } + }, + { + type = "recipe", + name = "speed-module-9", + ingredients = { + {name = "speed-module-8", amount = modules_per_tier}, + {name = data_util.mod_prefix .. "superconductive-cable", amount = 5}, + {name = data_util.mod_prefix .. "nanomaterial", amount = 25}, + {name = data_util.mod_prefix .. "material-catalogue-4", amount = 1} + }, + energy_required = 2^9, + result = "speed-module-9", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "speed-module-9", + effects = { + {type = "unlock-recipe", recipe = "speed-module-9"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/speed-9.png", + icon_size = 128, + order = "i-c-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-1", + data_util.mod_prefix .. "nanomaterial", + "speed-module-8" + }, + unit = { + count = 1000, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "material-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + } + }, + + }, + --efficiency + { + type = "recipe", + name = "effectivity-module", + ingredients = { + {name = "electronic-circuit", amount = 5}, + {name = "advanced-circuit", amount = 1}, + }, + energy_required = 2^1, + result = "effectivity-module", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "recipe", + name = "effectivity-module-2", + ingredients = { + {name = "effectivity-module", amount = modules_per_tier}, + {name = "advanced-circuit", amount = 5}, + {name = "processing-unit", amount = 1}, + }, + energy_required = 2^2, + result = "effectivity-module-2", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "recipe", + name = "effectivity-module-3", + ingredients = { + {name = "effectivity-module-2", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = "battery", amount = 1}, + }, + energy_required = 2^3, + result = "effectivity-module-3", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "module", + name = "effectivity-module-4", + icon = "__space-exploration-graphics__/graphics/icons/modules/effectivity-4.png", + icon_size = 64, + subgroup = "module-effectivity", + category = "effectivity", + tier = 4, + order = "c[effectivity]-d[effectivity-module-4]", + stack_size = 50, + effect = { + consumption = {bonus = -1.7}, + pollution = {bonus = -0.25}, + } + }, + { + type = "recipe", + name = "effectivity-module-4", + ingredients = { + {name = "effectivity-module-3", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "holmium-plate", amount = 5}, + {name = data_util.mod_prefix .. "machine-learning-data", amount = 1} + }, + energy_required = 2^4, + result = "effectivity-module-4", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "effectivity-module-4", + effects = { + {type = "unlock-recipe", recipe = "effectivity-module-4"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/effectivity-4.png", + icon_size = 128, + order = "i-g-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "rocket-science-pack", + "effectivity-module-3" + }, + unit = { + count = 300, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + } + }, + + }, + { + type = "module", + name = "effectivity-module-5", + icon = "__space-exploration-graphics__/graphics/icons/modules/effectivity-5.png", + icon_size = 64, + subgroup = "module-effectivity", + category = "effectivity", + tier = 5, + order = "c[effectivity]-e[effectivity-module-5]", + stack_size = 50, + effect = { + consumption = {bonus = -2.7}, + pollution = {bonus = -0.3}, + } + }, + { + type = "recipe", + name = "effectivity-module-5", + ingredients = { + {name = "effectivity-module-4", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "energy-catalogue-1", amount = 1} + }, + energy_required = 2^5, + result = "effectivity-module-5", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "effectivity-module-5", + effects = { + {type = "unlock-recipe", recipe = "effectivity-module-5"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/effectivity-5.png", + icon_size = 128, + order = "i-g-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-energy-1", + "effectivity-module-4" + }, + unit = { + count = 500, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-1", 1 }, + } + }, + + }, + { + type = "module", + name = "effectivity-module-6", + icon = "__space-exploration-graphics__/graphics/icons/modules/effectivity-6.png", + icon_size = 64, + subgroup = "module-effectivity", + category = "effectivity", + tier = 6, + order = "c[effectivity]-f[effectivity-module-6]", + stack_size = 50, + effect = { + consumption = {bonus = -4}, + pollution = {bonus = -0.35}, + } + }, + { + type = "recipe", + name = "effectivity-module-6", + ingredients = { + {name = "effectivity-module-5", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "energy-catalogue-2", amount = 1} + }, + energy_required = 2^6, + result = "effectivity-module-6", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "effectivity-module-6", + effects = { + {type = "unlock-recipe", recipe = "effectivity-module-6"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/effectivity-6.png", + icon_size = 128, + order = "i-g-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-energy-2", + "effectivity-module-5" + }, + unit = { + count = 200, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-2", 1 }, + } + }, + + }, + { + type = "module", + name = "effectivity-module-7", + icon = "__space-exploration-graphics__/graphics/icons/modules/effectivity-7.png", + icon_size = 64, + subgroup = "module-effectivity", + category = "effectivity", + tier = 7, + order = "c[effectivity]-g[effectivity-module-7]", + stack_size = 50, + effect = { + consumption = {bonus = -5.6}, + pollution = {bonus = -0.4}, + } + }, + { + type = "recipe", + name = "effectivity-module-7", + ingredients = { + {name = "effectivity-module-6", amount = modules_per_tier}, + {name = "processing-unit", amount = 5}, + {name = data_util.mod_prefix .. "energy-catalogue-3", amount = 1} + }, + energy_required = 2^7, + result = "effectivity-module-7", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "effectivity-module-7", + effects = { + {type = "unlock-recipe", recipe = "effectivity-module-7"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/effectivity-7.png", + icon_size = 128, + order = "i-g-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-energy-3", + "effectivity-module-6" + }, + unit = { + count = 500, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-3", 1 }, + } + }, + + }, + { + type = "module", + name = "effectivity-module-8", + icon = "__space-exploration-graphics__/graphics/icons/modules/effectivity-8.png", + icon_size = 64, + subgroup = "module-effectivity", + category = "effectivity", + tier = 8, + order = "c[effectivity]-h[effectivity-module-8]", + stack_size = 50, + effect = { + consumption = {bonus = -7.6}, + pollution = {bonus = -0.45} + } + }, + { + type = "recipe", + name = "effectivity-module-8", + ingredients = { + {name = "effectivity-module-7", amount = modules_per_tier}, + {name = data_util.mod_prefix .. "superconductive-cable", amount = 5}, + {name = data_util.mod_prefix .. "energy-catalogue-4", amount = 1} + }, + energy_required = 2^8, + result = "effectivity-module-8", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "effectivity-module-8", + effects = { + {type = "unlock-recipe", recipe = "effectivity-module-8"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/effectivity-8.png", + icon_size = 128, + order = "i-g-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "space-catalogue-energy-4", + "effectivity-module-7" + }, + unit = { + count = 800, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + } + }, + + }, + { + type = "module", + name = "effectivity-module-9", + icon = "__space-exploration-graphics__/graphics/icons/modules/effectivity-9.png", + icon_size = 64, + subgroup = "module-effectivity", + category = "effectivity", + tier = 9, + order = "c[effectivity]-i[effectivity-module-9]", + stack_size = 50, + effect = { + consumption = {bonus = -10}, + pollution = {bonus = -0.5} + } + }, + { + type = "recipe", + name = "effectivity-module-9", + ingredients = { + {name = "effectivity-module-8", amount = modules_per_tier}, + {name = data_util.mod_prefix .. "superconductive-cable", amount = 5}, + {name = data_util.mod_prefix .. "antimatter-canister", amount = 1}, + {name = data_util.mod_prefix .. "energy-catalogue-4", amount = 1} + }, + energy_required = 512, + result = "effectivity-module-9", + enabled = false, + always_show_products = true, + always_show_made_in = true, + }, + { + type = "technology", + name = "effectivity-module-9", + effects = { + {type = "unlock-recipe", recipe = "effectivity-module-9"} + }, + icon = "__space-exploration-graphics__/graphics/technology/modules/effectivity-9.png", + icon_size = 128, + order = "i-g-a", + upgrade = true, + prerequisites = { + data_util.mod_prefix .. "deep-space-science-pack-1", + "effectivity-module-8" + }, + unit = { + count = 1000, + time = 10, + ingredients = { + { "automation-science-pack", 1 }, + { "logistic-science-pack", 1 }, + { "chemical-science-pack", 1 }, + { "production-science-pack", 1 }, + { data_util.mod_prefix .. "rocket-science-pack", 1 }, + { data_util.mod_prefix .. "energy-science-pack-4", 1 }, + { data_util.mod_prefix .. "deep-space-science-pack-1", 1 }, + } + }, + + }, +} +) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-2/recipe-update.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/recipe-update.lua new file mode 100644 index 0000000..d31e6b6 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-2/recipe-update.lua @@ -0,0 +1,169 @@ +local data_util = require("data_util") + + +if data.raw.item['electric-motor'] then + data_util.replace_or_add_ingredient(data_util.mod_prefix .. "space-transport-belt", "iron-plate", 'electric-motor', 2) + data_util.replace_or_add_ingredient(data_util.mod_prefix .. "core-fragment-processor", "iron-plate", 'electric-motor', 15) + data_util.replace_or_add_ingredient(data_util.mod_prefix .. "meteor-point-defence", "iron-gear-wheel", 'electric-motor', 10) + + data_util.replace_or_add_ingredient(data_util.mod_prefix .. "fluid-burner-generator", "iron-gear-wheel", 'electric-motor', 10) + data_util.replace_or_add_ingredient(data_util.mod_prefix .. "fuel-refinery", "iron-gear-wheel", 'electric-motor', 20) +end + + +if data.raw.item["solid-sand"] and not data.raw.recipe["sand-to-solid-sand"]then -- angels sand + data:extend({{ + type = "recipe", + name = "sand-to-solid-sand", + category = "washing-plant", + normal = { + energy_required = 0.5, + enabled = false, + ingredients = { + {type="item", name="sand", amount=10}, + {type="fluid", name="water", amount=100}, + }, + results= { {type="item", name="solid-sand", amount=10} }, + }, + expensive = { + energy_required = 0.5, + enabled = false, + ingredients = { + {type="item", name="sand", amount=10}, + {type="fluid", name="water", amount=100}, + }, + results= { {type="item", name="solid-sand", amount=10} }, + }, + }}) +end + +data:extend({ + { + type = "recipe", + category = "smelting", + name = data_util.mod_prefix .. "iron-smelting-vulcanite", + results = { + {name = "iron-plate", amount = 12}, + }, + energy_required = 24, + ingredients = { + {name = "iron-ore", amount = 8}, + {name = data_util.mod_prefix .. "vulcanite-block", amount = 1}, + }, + icons = { + {icon = data.raw.item["iron-plate"].icon, icon_size = data.raw.item["iron-plate"].icon_size, scale = 32/data.raw.item["iron-plate"].icon_size}, + {icon = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + scale = 0.5 * 32/data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + shift = {-10, -10} + }, + }, + enabled = false, + always_show_made_in = true, + allow_as_intermediate = false, + }, + { + type = "recipe", + category = "smelting", + name = data_util.mod_prefix .. "copper-smelting-vulcanite", + results = { + {name = "copper-plate", amount = 12}, + }, + energy_required = 24, + ingredients = { + {name = "copper-ore", amount = 8}, + {name = data_util.mod_prefix .. "vulcanite-block", amount = 1}, + }, + icons = { + {icon = data.raw.item["copper-plate"].icon, icon_size = data.raw.item["copper-plate"].icon_size, scale = 32/data.raw.item["copper-plate"].icon_size}, + {icon = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + scale = 0.5 * 32/data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + shift = {-10, -10} + }, + }, + enabled = false, + always_show_made_in = true, + allow_as_intermediate = false, + }, + { + type = "recipe", + category = "smelting", + name = data_util.mod_prefix .. "stone-brick-vulcanite", + results = { + {name = "stone-brick", amount = 6}, + }, + energy_required = 24, + ingredients = { + {name = "stone", amount = 8}, + {name = data_util.mod_prefix .. "vulcanite-block", amount = 1}, + }, + icons = { + {icon = data.raw.item["stone-brick"].icon, icon_size = data.raw.item["stone-brick"].icon_size, scale = 32/data.raw.item["stone-brick"].icon_size}, + {icon = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + scale = 0.5 * 32/data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + shift = {-10, -10} + }, + }, + enabled = false, + always_show_made_in = true, + allow_as_intermediate = false, + }, + { + type = "recipe", + category = "smelting", + name = data_util.mod_prefix .. "glass-vulcanite", + results = { + {name = "glass", amount = 6}, + }, + energy_required = 24, + ingredients = { + {name = "sand", amount = 16}, + {name = data_util.mod_prefix .. "vulcanite-block", amount = 1}, + }, + icons = { + {icon = data.raw.item["glass"].icon, icon_size = data.raw.item["glass"].icon_size, scale = 32/data.raw.item["glass"].icon_size}, + {icon = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon, + icon_size = data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + scale = 0.5 * 32/data.raw.item[data_util.mod_prefix .. "vulcanite-block"].icon_size, + shift = {-10, -10} + }, + }, + enabled = false, + always_show_made_in = true, + allow_as_intermediate = false, + }, +}) + +data_util.replace_or_add_ingredient("small-lamp", "electronic-circuit", 'glass', 1) + +data_util.replace_or_add_ingredient("solar-panel", nil, 'glass', 5) +data_util.replace_or_add_ingredient("laser-turret", nil, 'glass', 20) + +data_util.replace_or_add_ingredient("electric-furnace", "stone-brick", data_util.mod_prefix .. "heat-shielding", 2) +data_util.replace_or_add_ingredient("electric-furnace", "concrete", data_util.mod_prefix .. "heat-shielding", 2) +data_util.replace_or_add_ingredient("industrial-furnace", nil, data_util.mod_prefix .. "heat-shielding", 4) + +data_util.replace_or_add_ingredient("fusion-reactor-equipment", nil, data_util.mod_prefix .. 'fusion-test-data', 50) +data_util.replace_or_add_ingredient("fusion-reactor-equipment", nil, data_util.mod_prefix .. 'superconductive-cable', 50) +data_util.replace_or_add_ingredient("fusion-reactor-equipment", nil, data_util.mod_prefix .. 'heat-shielding', 50) + +data_util.replace_or_add_ingredient("satellite", "glass", "glass", 50) +data_util.replace_or_add_ingredient("satellite", "processing-unit", "processing-unit", 50) +data_util.replace_or_add_ingredient("satellite", "low-density-structure", "low-density-structure", 50) +data_util.replace_or_add_ingredient("satellite", "solar-panel", "solar-panel", 10) +data_util.replace_or_add_ingredient("satellite", "accumulator", "accumulator", 10) +data_util.replace_or_add_ingredient("satellite", "radar", "radar", 1) + +data_util.replace_or_add_ingredient("atomic-bomb", "explosives", "explosives", 50) +data_util.replace_or_add_ingredient("atomic-bomb", "uranium-235", "uranium-235", 100) +data_util.replace_or_add_ingredient("atomic-bomb", "rocket-fuel", "rocket-fuel", 10) + +data_util.replace_or_add_ingredient("jetpack-2", nil, "low-density-structure", 10) -- space +data_util.replace_or_add_ingredient("jetpack-3", nil, data_util.mod_prefix .. "aeroframe-pole", 30) -- astro +data_util.replace_or_add_ingredient("jetpack-4", nil, data_util.mod_prefix .. "naquium-cube", 4) -- deep + +data_util.replace_or_add_ingredient("spidertron", "fusion-reactor-equipment", data_util.mod_prefix .. "rtg-equipment", 8) +data_util.replace_or_add_ingredient("spidertron", "raw-fish", data_util.mod_prefix .. "specimen", 1) +data_util.replace_or_add_ingredient("spidertron", "effectivity-module-3", data_util.mod_prefix .. "heavy-girder", 16) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/character.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/character.lua new file mode 100644 index 0000000..2d341eb --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/character.lua @@ -0,0 +1,9 @@ +local data_util = require("data_util") + +local characters = {"character", "character-jetpack"} +for _, character in pairs(characters) do + table.insert(data.raw.character[character]["crafting_categories"], "hand-hard-recycling") + + data.raw.character[character].collision_box = {{-0.15, -0.15},{0.15,0.15}} + data.raw.character[character].healing_per_tick = 0.001 +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/collision-common.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/collision-common.lua new file mode 100644 index 0000000..4411d16 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/collision-common.lua @@ -0,0 +1,52 @@ +-- Collisions shared between SE, combat mechanics overhaul & alien biomes + +local vehicle_layer = collision_mask_util_extended.get_make_named_collision_mask("vehicle-layer") + +for _, tile in pairs(data.raw.tile) do + if string.find(tile.name, "water") then + table.insert(tile.collision_mask, "item-layer") + end +end + +if data.raw.tile.water and collision_mask_util_extended.mask_contains_layer(data.raw.tile.water.collision_mask, "resource-layer") then + table.insert(data.raw.tile.landfill.collision_mask, "resource-layer") -- prevent regenerated ores from spawning on landfill +end + +for _, type in pairs({"car"}) do + for _, prototype in pairs(data.raw[type]) do + prototype.collision_mask = collision_mask_util_extended.get_mask(prototype) + if collision_mask_util_extended.mask_contains_layer(prototype.collision_mask, "player-layer") then + collision_mask_util_extended.add_layer(prototype.collision_mask, vehicle_layer) + end + end +end + +-- make trees collide with resources so they won't be placed on top +-- make trees collide with vehicles (train-layer) but not characters (player-layer) +for _, type in pairs({"tree"}) do + for _, prototype in pairs(data.raw[type]) do + if string.find(prototype.name, "tree", 1, true) then + prototype.collision_mask = collision_mask_util_extended.get_mask(prototype) + if collision_mask_util_extended.mask_contains_layer(prototype.collision_mask, "player-layer") then + collision_mask_util_extended.remove_layer(prototype.collision_mask, "player-layer") + collision_mask_util_extended.add_layer(prototype.collision_mask, vehicle_layer) + end + collision_mask_util_extended.add_layer(prototype.collision_mask, "resource-layer") + if prototype.collision_box + and ((prototype.collision_box[1][1] == -1/32 and prototype.collision_box[1][2] == -1/32 -- AB tree + and prototype.collision_box[2][1] == 1/32 and prototype.collision_box[2][2] == 1/32) + or (prototype.collision_box[1][1] == -0.080000000000000018 and prototype.collision_box[1][2] == -0.080000000000000018 -- squeak tree + and prototype.collision_box[2][1] == 0.080000000000000018 and prototype.collision_box[2][2] == 0.080000000000000018)) then + prototype.collision_box = {{-0.4, -0.4}, {0.4, 0.4}} + end + end + end +end + +for _, prototype in pairs(data.raw["spider-leg"]) do + prototype.collision_mask = collision_mask_util_extended.get_mask(prototype) + if collision_mask_util_extended.mask_contains_layer(prototype.collision_mask, "player-layer") then + collision_mask_util_extended.add_layer(prototype.collision_mask, "object-layer") + collision_mask_util_extended.add_layer(prototype.collision_mask, "water-tile") + end +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/compatibility/angels.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/compatibility/angels.lua new file mode 100644 index 0000000..10acfaa --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/compatibility/angels.lua @@ -0,0 +1,34 @@ +local data_util = require("data_util") + +if data.raw["recipe-category"]["ore-sorting-t1"] then + table.insert( data.raw["assembling-machine"][data_util.mod_prefix .. "space-mechanical-laboratory"].crafting_categories, "ore-sorting-t1") -- crushing +end + +if data.raw["recipe-category"]["ore-sorting"] then + table.insert( data.raw["assembling-machine"][data_util.mod_prefix .. "space-manufactory"].crafting_categories, "ore-sorting") +end + +if data.raw["fluid"]["gas-methane"] then + + data.raw.fluid[data_util.mod_prefix .. "methane-gas"].localised_name = {"fluid-name."..data_util.mod_prefix .."methane-gas-mixed"} + local results = { + { type = "fluid", name = "gas-methane", amount = 90}, + } + if data.raw["fluid"]["gas-natural-1"] then + table.insert(results, { type = "fluid", name = "gas-natural-1", amount = 10}) + end + data_util.make_recipe({ + name = data_util.mod_prefix .. "mixed-methane-gas-separation", + ingredients = { + { type = "fluid", name = data_util.mod_prefix .. "methane-gas", amount = 10}, + }, + results = results, + energy_required = 1, + subgroup = "space-fluids", + category = "chemistry", + always_show_made_in = true, + }) + data_util.tech_lock_recipes(data_util.mod_prefix .. "space-biochemical-laboratory", data_util.mod_prefix .. "mixed-methane-gas-separation") + + +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/compatibility/notnotmelon.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/compatibility/notnotmelon.lua new file mode 100644 index 0000000..8c4ea13 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/compatibility/notnotmelon.lua @@ -0,0 +1,5 @@ +local data_util = require("data_util") + +data_util.replace_or_add_ingredient("empty-memory-element", nil, data_util.mod_prefix .. "teleportation-data", 1) +data_util.tech_add_prerequisites("empty-memory-element", {data_util.mod_prefix .. "deep-space-science-pack-4"}) +data_util.tech_add_ingredients("empty-memory-element", {data_util.mod_prefix .. "deep-space-science-pack-4"}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/core-fragments.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/core-fragments.lua new file mode 100644 index 0000000..cc1174a --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/core-fragments.lua @@ -0,0 +1,332 @@ +local data_util = require("data_util") + +local resource_image = { + filename = "__space-exploration-graphics__/graphics/blank.png", + width = 1, + height = 1, + frame_count = 1, + line_length = 1, + shift = { 0, 0 }, + variation_count = 1, +} + +-- core fragments (cooled magma) +-- A generic mining recipe is used, the actual output item is chosen by script +-- default is 1, set 0 to exclude +se_core_fragment_resources = se_core_fragment_resources or {} +se_core_fragment_resources["water"] = se_core_fragment_resources["water"] or { multiplier = 0, omni_multiplier = 0.1} +se_core_fragment_resources["crude-oil"] = se_core_fragment_resources["crude-oil"] or { multiplier = 1, omni_multiplier = 0.1} +se_core_fragment_resources["stone"] = se_core_fragment_resources["stone"] or { multiplier = 1, omni_multiplier = 0.5} +se_core_fragment_resources["iron-ore"] = se_core_fragment_resources["iron-ore"] or { multiplier = 1.2, omni_multiplier = 0.6} +se_core_fragment_resources["copper-ore"] = se_core_fragment_resources["copper-ore"] or { multiplier = 1, omni_multiplier = 0.5} +se_core_fragment_resources["coal"] = se_core_fragment_resources["coal"] or { multiplier = 1, omni_multiplier = 0.5} +se_core_fragment_resources["uranium-ore"] = se_core_fragment_resources["uranium-ore"] or { multiplier = 0.2, omni_multiplier = 0.005} +se_core_fragment_resources[data_util.mod_prefix .. "vulcanite"] = se_core_fragment_resources[data_util.mod_prefix .. "vulcanite"] or { multiplier = 1, omni_multiplier = 0.2} + +se_core_fragment_resources[data_util.mod_prefix .. "beryllium-ore"] = se_core_fragment_resources[data_util.mod_prefix .. "beryllium-ore"] or { multiplier = 1, omni_multiplier = 0} +se_core_fragment_resources[data_util.mod_prefix .. "iridium-ore"] = se_core_fragment_resources[data_util.mod_prefix .. "iridium-ore"] or { multiplier = 1, omni_multiplier = 0} +se_core_fragment_resources[data_util.mod_prefix .. "holmium-ore"] = se_core_fragment_resources[data_util.mod_prefix .. "holmium-ore"] or { multiplier = 1, omni_multiplier = 0} +se_core_fragment_resources[data_util.mod_prefix .. "vitamelange"] = se_core_fragment_resources[data_util.mod_prefix .. "vitamelange"] or { multiplier = 1, omni_multiplier = 0} +se_core_fragment_resources[data_util.mod_prefix .. "cryonite"] = se_core_fragment_resources[data_util.mod_prefix .. "cryonite"] or { multiplier = 1, omni_multiplier = 0} + +se_core_fragment_resources[data_util.mod_prefix .. "water-ice"] = se_core_fragment_resources[data_util.mod_prefix .. "water-ice"] or { multiplier = 0, omni_multiplier = 0} +se_core_fragment_resources[data_util.mod_prefix .. "methane-ice"] = se_core_fragment_resources[data_util.mod_prefix .. "methane-ice"] or { multiplier = 0, omni_multiplier = 0} +se_core_fragment_resources[data_util.mod_prefix .. "naquium-ore"] = se_core_fragment_resources[data_util.mod_prefix .. "naquium-ore"] or { multiplier = 0, omni_multiplier = 0} + +local fragments = {} +local omni_name = data_util.mod_prefix .. "core-fragment-omni" +fragments[omni_name] = {name = omni_name, divisor = 1, products = {}} + +for _, resource in pairs(data.raw.resource) do + --log("add fragment resource " .. resource.name ) + if resource.autoplace then -- don't add removed resources? + local fragment = { + name = data_util.mod_prefix .. "core-fragment-" .. resource.name, + item_name = "entity-name."..resource.name + } + --log(resource.name) + local products = {} + if resource.minable.result and type(resource.minable.result) == "string" then + products[resource.minable.result] = {name = resource.minable.result, amount = 1} + elseif type(resource.minable.result) == "table" then + local product = data_util.collapse_product(resource.minable.result) + products[product.name] = product + elseif resource.minable.results and resource.minable.results.name then + products = {data_util.collapse_product(resource.minable.results)} + elseif resource.minable.results and resource.minable.results[1] and type(resource.minable.results[1]) == "table" then + for _, p in pairs(resource.minable.results) do + table.insert(products, data_util.collapse_product(p)) + end + elseif resource.minable.results then + products = data_util.collapse_product(resource.minable.results) + end + local valid_products = 0 + if table_size(products) > 0 then + fragment.products = products + for _, product in pairs(products) do + local amount = 0 + if product.amount then + amount = product.amount + elseif product.amount_min and product.amount_max then + amount = (product.amount_min + product.amount_max) / 2 + end + if product.probability then amount = amount * product.probability end + + product.amount = amount + if se_core_fragment_resources[product.name] and se_core_fragment_resources[product.name].multiplier then + product.amount = amount * se_core_fragment_resources[product.name].multiplier + end + + product.amount_min = nil + product.amount_max = nil + product.probability = 1 + + if product.amount == 0 then + products[product.name] = nil + else + valid_products = valid_products + 1 + end + + local omni_multiplier = 0.5 + if se_core_fragment_resources[product.name] and se_core_fragment_resources[product.name].omni_multiplier then + omni_multiplier = se_core_fragment_resources[product.name].omni_multiplier + end + if omni_multiplier > 0 then + fragments[omni_name].products[product.name] = fragments[omni_name].products[product.name] or {name = product.name, amount = 0, type = product.type} + fragments[omni_name].divisor = fragments[omni_name].divisor + 1 + fragments[omni_name].products[product.name].amount = fragments[omni_name].products[product.name].amount + amount * omni_multiplier + end + end + end + if valid_products > 0 then + fragments[fragment.name] = fragment + end + end +end + +-- water, can be hard to find on some planets, +-- adding water to the omni measn there's a small chance that +-- a different fragment type breaks down into something with water +if not fragments[omni_name].products["water"] then + fragments[omni_name].products.water = {name = "water", type = "fluid", amount = 5} +end + +-- TODO: test with high fluid resource modpack +local omni_fluids = 0 +for _, product in pairs(fragments[omni_name].products) do + if product.type == "fluid" then + omni_fluids = omni_fluids + 1 + end +end +if omni_fluids > 4 then -- water infinite anyway + fragments[omni_name].products.water = nil + omni_fluids = omni_fluids - 1 +end +if omni_fluids > 4 then -- crude-oil infinite anyway + fragments[omni_name].products["crude-oil"] = nil + omni_fluids = omni_fluids - 1 +end +if omni_fluids > 4 then + local safe_products = {} + omni_fluids = 0 + for _, product in pairs(fragments[omni_name].products) do + if product.type == "fluid" then + if omni_fluids < 4 then + safe_products[product.name] = product + omni_fluids = omni_fluids + 1 + end + else + safe_products[product.name] = product + end + end + fragments[omni_name].products = safe_products +end + + +local c = 0 +for _, fragment in pairs(fragments) do + c = c + 1 + local key_product = fragment.products[1] + local locale + if fragment.resource_name then + locale = "resource-name." .. fragment.resource_name + end + local item = + { + type = "item", + name = fragment.name, + icon_size = 64, + icons = { + {icon = "__space-exploration-graphics__/graphics/icons/core-fragment.png", scale = 0.5, icon_size = 64} + }, + subgroup = "core-fragments", + order = "a"..c, + stack_size = 100, + localised_name = {"item-name.core-fragment", {fragment.item_name}}, + pictures = { + { layers = { + {filename = "__space-exploration-graphics__/graphics/icons/core-fragment.png", + scale = 0.25, + size = 64 + }}}, + { layers = {{ + filename = "__space-exploration-graphics__/graphics/icons/core-fragment-1.png", + scale = 0.25, + size = 64 + }}}, + { layers = {{ + filename = "__space-exploration-graphics__/graphics/icons/core-fragment-2.png", + scale = 0.25, + size = 64 + }}}, + { layers = {{ + filename = "__space-exploration-graphics__/graphics/icons/core-fragment-3.png", + scale = 0.25, + size = 64 + }}}, + }, + } + if table_size(fragment.products) == 1 then + for _, product in pairs(fragment.products) do + if product.type == "fluid" and data.raw.fluid[product.name] and data.raw.fluid[product.name].icon then + table.insert(item.icons, { + icon = data.raw.fluid[product.name].icon, + icon_size = data.raw.fluid[product.name].icon_size, + scale = 32 / data.raw.fluid[product.name].icon_size, + tint = {r = 0.5, g = 0.5, b = 0.5, a = 0.5}, + }) + for _, variant in pairs(item.pictures) do + table.insert(variant.layers, { + filename = data.raw.fluid[product.name].icon, + size = data.raw.fluid[product.name].icon_size, + scale = 16 / data.raw.fluid[product.name].icon_size, + tint = {r = 0.5, g = 0.5, b = 0.5, a = 0.5}, + }) + end + elseif data.raw.item[product.name] and data.raw.item[product.name].icon then + table.insert(item.icons, { + icon = data.raw.item[product.name].icon, + icon_size = data.raw.item[product.name].icon_size, + scale = 32 / data.raw.item[product.name].icon_size, + tint = {r = 0.5, g = 0.5, b = 0.5, a = 0.5} + }) + + for i, variant in pairs(item.pictures) do + if data.raw.item[product.name].pictures and data.raw.item[product.name].pictures[i] then + local pic = table.deepcopy(data.raw.item[product.name].pictures[i]) + pic.tint = {r = 0.5, g = 0.5, b = 0.5, a = 0.5} + table.insert(variant.layers, pic) + else + table.insert(variant.layers, { + filename = data.raw.item[product.name].icon, + size = data.raw.item[product.name].icon_size, + scale = 16 / data.raw.item[product.name].icon_size, + tint = {r = 0.5, g = 0.5, b = 0.5, a = 0.5}, + }) + end + end + + end + end + end + local recipe_products = { } + if _ ~= omni_name then + table.insert(recipe_products, {name = omni_name, amount = 5}) + else + item.localised_name = nil + end + local has_stone = false + --local has_vulcanite = false + for _, product in pairs(fragment.products) do + if product.name == "stone" then has_stone = true end + --if product.name == data_util.mod_prefix.."vulcanite" then has_vulcanite = true end + local prod = {type = product.type, name = product.name} + if product.amount * 10 >= 1 then + prod.amount = product.amount * 10 + else + prod.amount = nil + prod.probability = product.amount * 10 + prod.amount_min = 1 + prod.amount_max = 1 + end + table.insert(recipe_products, prod) + end + if not has_stone then + table.insert(recipe_products, {name = "stone", amount = 1}) + end + --if not has_vulcanite then + -- table.insert(recipe_products, {name = data_util.mod_prefix.."vulcanite", amount = 1}) + --end + local recipe = { + type = "recipe", + name = fragment.name, + icon_size = 64, + icons = item.icons, + subgroup = "core-fragments", + category = "core-fragment-processing", + order = "a"..c, + flags = { + "goes-to-main-inventory" + }, + ingredients = {{name = item.name, amount = 16}}, + results = recipe_products, + allow_as_intermediate = false, -- prevent being sown as a base resource? + energy_required = 16, + enabled = false, + localised_name = {"recipe-name.core-fragment", {fragment.item_name}}, + always_show_made_in = true, + allow_decomposition = false + } + if _ == omni_name then + recipe.localised_name = nil + end + local core_resource_patch = { + type = "resource", + name = fragment.name, + category = data_util.mod_prefix.."core-mining", + collision_box = { { -1.4, -1.4 }, { 1.4, 1.4 } }, + selection_box = { { -1.4, -1.4 }, { 1.4, 1.4 } }, + selectable_in_game = false, + --collision_mask = {"not-colliding-with-itself"}, + flags = { "placeable-neutral" }, + highlight = false, + icon_size = 64, + icons = item.icons, + infinite = true, + infinite_depletion_amount = 0, + map_color = { b = 0, g = 0, r = 0, a = 0 }, + map_grid = false, + minable = { + mining_time = 12.5, + results = { + { + amount_max = 1, + amount_min = 1, + name = fragment.name, + probability = 1, + } + } + }, + minimum = 1, + normal = 1000000, + order = "a-b-a", + resource_patch_search_radius = 0, + stage_counts = { 0 }, + stages = { sheet = resource_image }, + localised_name = {"entity-name."..data_util.mod_prefix .. "core-fissure"} + } + data:extend({ + core_resource_patch, + item, + recipe + }) + table.insert( + data.raw.technology[data_util.mod_prefix .. "core-miner"].effects, + { + type = "unlock-recipe", + recipe = recipe.name, + } + ) + data_util.allow_productivity(fragment.name) + se_delivery_cannon_recipes[fragment.name] = {name=fragment.name, amount=50} +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/delivery-cannon.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/delivery-cannon.lua new file mode 100644 index 0000000..35c2753 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/delivery-cannon.lua @@ -0,0 +1,126 @@ +local data_util = require("data_util") + +for _, resource in pairs(se_delivery_cannon_recipes) do + local type = resource.type or "item" + if data.raw[type][resource.name] then + local base = data.raw[type][resource.name] + local amount = resource.amount + if not amount then + if type == "fluid" then + amount = 1000 + else + amount = base.stack_size or 1 + end + end + local order = "" + local o_subgroup = data.raw["item-subgroup"][base.subgroup] + local o_group = data.raw["item-group"][o_subgroup.group] + order = o_group.order .. "-|-"..o_subgroup.order.."-|-"..base.order + data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "delivery-cannon-package-"..resource.name, + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon-capsule.png", + icon_size = 64, + order = order, + flags = {"hidden"}, + subgroup = base.subgroup or "delivery-cannon-capsules", + stack_size = 1, + localised_name = {"item-name.se-delivery-cannon-capsule-packed", base.localised_name or {type.."-name."..resource.name}} + }, + { + type = "recipe", + name = data_util.mod_prefix .. "delivery-cannon-pack-" .. resource.name, + icon = base.icon, + icon_size = base.icon_size, + icon_mipmaps = base.icon_mipmaps, + icons = base.icons, + result = data_util.mod_prefix .. "delivery-cannon-package-"..resource.name, + enabled = true, + energy_required = 5, + ingredients = { + { data_util.mod_prefix .. "delivery-cannon-capsule", 1 }, + { type = type, name = resource.name, amount = amount * 10}, --ftobler changed 10x amount + }, + requester_paste_multiplier = 1, + always_show_made_in = false, + category = "delivery-cannon", + hide_from_player_crafting = true, + hide_from_stats = true, + localised_name = {"item-name.se-delivery-cannon-capsule-packed", base.localised_name or {type.."-name."..resource.name}}, + allow_decomposition = false + }, + }) + if is_debug_mode then + --log(serpent.block(data.raw.item[data_util.mod_prefix .. "delivery-cannon-package-"..resource.name])) + end + end +end + +-- ammo and capsules can't be ingredients. +-- the delivery cannon will need to assemble the item based on the original recipe +for _, dcar in pairs(se_delivery_cannon_ammo_recipes) do + local type = dcar.type or "ammo" -- could be "capsule" + if data.raw[type][dcar.name] then + local proto = data.raw[type][dcar.name] + local recipe_name = dcar.recipe_name or proto.name + if data.raw.recipe[recipe_name] then + local recipe = data.raw.recipe[recipe_name] + local ingredients = table.deepcopy(recipe.ingredients or recipe.expensive.ingredients or recipe.normal.ingredients) + local energy_required = recipe.energy_required or recipe.expensive.energy_required or recipe.normal.energy_required + table.insert(ingredients, { data_util.mod_prefix .. "delivery-cannon-weapon-capsule", 1 }) + local order = "" + local o_subgroup = data.raw["item-subgroup"][proto.subgroup] + local o_group = data.raw["item-group"][o_subgroup.group] + order = o_group.order .. "-|-"..o_subgroup.order.."-|-"..proto.order + local unlock_tech + for _, technology in pairs(data.raw.technology) do + if technology.effects then + for _, effect in pairs(technology.effects) do + if effect.recipe == recipe_name then + table.insert(technology.effects, { type = "unlock-recipe", recipe = data_util.mod_prefix .. "delivery-cannon-weapon-pack-" .. dcar.name}) + unlock_tech = technology + break + end + end + if unlock_tech then break end + end + end + data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "delivery-cannon-weapon-package-"..proto.name, + icon = "__space-exploration-graphics__/graphics/icons/delivery-cannon-weapon-capsule.png", + icon_size = 64, + order = order, + flags = {"hidden"}, + subgroup = proto.subgroup or "delivery-cannon-capsules", + stack_size = 1, + localised_name = {"item-name.se-delivery-cannon-weapon-capsule-packed", proto.localised_name or {"item-name."..dcar.name}} + }, + { + type = "recipe", + name = data_util.mod_prefix .. "delivery-cannon-weapon-pack-" .. dcar.name, + icon = proto.icon, + icon_size = proto.icon_size, + icon_mipmaps = proto.icon_mipmaps, + icons = proto.icons, + result = data_util.mod_prefix .. "delivery-cannon-weapon-package-"..dcar.name, + enabled = unlock_tech == nil, + energy_required = energy_required, + ingredients = dcar.ingredients or ingredients, + requester_paste_multiplier = 1, + always_show_made_in = false, + category = "delivery-cannon-weapon", + hide_from_player_crafting = true, + localised_name = {"item-name.se-delivery-cannon-weapon-capsule-packed", proto.localised_name or {"item-name."..dcar.name}}, + allow_decomposition = false + }, + }) + + if is_debug_mode then + --log(serpent.block(data.raw.item[data_util.mod_prefix .. "delivery-cannon-weapon-package-"..proto.name])) + end + end + end +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/electric-boiling.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/electric-boiling.lua new file mode 100644 index 0000000..3c82e5d --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/electric-boiling.lua @@ -0,0 +1,99 @@ +local data_util = require("data_util") + +local heat_capacity = data_util.string_to_number(data.raw.fluid.steam.heat_capacity) +local boiler_power = 5000000 +local efficiency = 0.9 + +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "electric-boiling-void", + results = { + { type = "fluid", name = "steam", amount = 0, temperature = 100 }, + }, + enabled = false, + energy_required = (100-15) * 100 * heat_capacity / boiler_power / efficiency, + ingredients = { + { type = "fluid", name = "water", amount = 100 }, + }, + icons = { + {icon = data.raw.fluid.steam.icon }, + {icon = "__space-exploration-graphics__/graphics/icons/cross.png" }, + }, + icon_size = data.raw.fluid.steam.icon_size, + subgroup = "fluid-recipes", + requester_paste_multiplier = 1, + always_show_made_in = false, + category = data_util.mod_prefix .. "electric-boiling", + order = "a-a-a-a" + }, + { + type = "recipe", + name = data_util.mod_prefix .. "electric-boiling-steam-100", + results = { + { type = "fluid", name = "steam", amount = 100, temperature = 100 }, + }, + enabled = false, + energy_required = (100-15) * 100 * heat_capacity / boiler_power / efficiency, + ingredients = { + { type = "fluid", name = "water", amount = 100 }, + }, + subgroup = "fluid-recipes", + requester_paste_multiplier = 1, + always_show_made_in = false, + category = data_util.mod_prefix .. "electric-boiling", + order = "a-a-b-a" + }, + { + type = "recipe", + name = data_util.mod_prefix .. "electric-boiling-steam-165", + results = { + { type = "fluid", name = "steam", amount = 100, temperature = 165 }, + }, + enabled = false, + energy_required = (165-15) * 100 * heat_capacity / boiler_power / efficiency, + ingredients = { + { type = "fluid", name = "water", amount = 100 }, + }, + subgroup = "fluid-recipes", + requester_paste_multiplier = 1, + always_show_made_in = false, + category = data_util.mod_prefix .. "electric-boiling", + order = "a-a-b-b" + }, + { + type = "recipe", + name = data_util.mod_prefix .. "electric-boiling-steam-500", + results = { + { type = "fluid", name = "steam", amount = 100, temperature = 500 }, + }, + enabled = false, + energy_required = (500-15) * 100 * heat_capacity / boiler_power / efficiency, + ingredients = { + { type = "fluid", name = "water", amount = 100 }, + }, + subgroup = "fluid-recipes", + requester_paste_multiplier = 1, + always_show_made_in = false, + category = data_util.mod_prefix .. "electric-boiling", + order = "a-a-b-c" + }, + { + type = "recipe", + name = data_util.mod_prefix .. "electric-boiling-steam-5000", + results = { + { type = "fluid", name = "steam", amount = 100, temperature = 5000 }, + }, + enabled = false, + energy_required = (5000-15) * 100 * heat_capacity / boiler_power / efficiency, + ingredients = { + { type = "fluid", name = "water", amount = 100 }, + }, + subgroup = "fluid-recipes", + requester_paste_multiplier = 1, + always_show_made_in = false, + category = data_util.mod_prefix .. "electric-boiling", + order = "a-a-b-d" + } + +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/energy-shield-equipment.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/energy-shield-equipment.lua new file mode 100644 index 0000000..11b4670 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/energy-shield-equipment.lua @@ -0,0 +1,115 @@ +local data_util = require("data_util") + + +data_util.tech_add_prerequisites("energy-shield-equipment", { + data_util.mod_prefix .. "energy-science-pack-1" +}) +data_util.tech_add_ingredients("energy-shield-equipment", { + "automation-science-pack", "logistic-science-pack", "chemical-science-pack", data_util.mod_prefix .. "rocket-science-pack", data_util.mod_prefix .. "energy-science-pack-1"}, true) +data.raw.technology["energy-shield-equipment"].icon = "__space-exploration-graphics__/graphics/technology/energy-shield-red.png" +data.raw.item["energy-shield-equipment"].icon = "__space-exploration-graphics__/graphics/icons/energy-shield-red.png" +data.raw.item["energy-shield-equipment"].icon_size = 64 +data.raw.item["energy-shield-equipment"].icon_mipmaps = 1 +data.raw.item["energy-shield-equipment"].subgroup = "equipment" +data.raw.item["energy-shield-equipment"].order = "b[shield]-a[energy-shield]" +data.raw["energy-shield-equipment"]["energy-shield-equipment"].max_shield_value = 100 +data.raw["energy-shield-equipment"]["energy-shield-equipment"].energy_source.input_flow_limit = "1MW" +data.raw["energy-shield-equipment"]["energy-shield-equipment"].sprite.filename = "__space-exploration-graphics__/graphics/equipment/energy-shield-red.png" +data_util.replace_or_add_ingredient("energy-shield-equipment", nil, data_util.mod_prefix .. 'holmium-cable', 20) +data_util.replace_or_add_ingredient("energy-shield-equipment", nil, data_util.mod_prefix .. 'electromagnetic-field-data', 5) + +data_util.tech_add_prerequisites("energy-shield-mk2-equipment", { + data_util.mod_prefix .. "space-catalogue-energy-2", + data_util.mod_prefix .. "material-science-pack-1", + data_util.mod_prefix .. "holmium-solenoid" +}) +data_util.tech_add_ingredients("energy-shield-mk2-equipment", {data_util.mod_prefix .. "energy-science-pack-2"}, true) +data.raw.technology["energy-shield-mk2-equipment"].icon = "__space-exploration-graphics__/graphics/technology/energy-shield-yellow.png" +data.raw.item["energy-shield-mk2-equipment"].icon = "__space-exploration-graphics__/graphics/icons/energy-shield-yellow.png" +data.raw.item["energy-shield-mk2-equipment"].icon_size = 64 +data.raw.item["energy-shield-mk2-equipment"].icon_mipmaps = 1 +data.raw.item["energy-shield-mk2-equipment"].subgroup = "equipment" +data.raw.item["energy-shield-mk2-equipment"].order = "b[shield]-b[energy-shield]" +data.raw["energy-shield-equipment"]["energy-shield-mk2-equipment"].max_shield_value = 250 +data.raw["energy-shield-equipment"]["energy-shield-mk2-equipment"].energy_source.input_flow_limit = "3MW" +data.raw["energy-shield-equipment"]["energy-shield-mk2-equipment"].sprite.filename = "__space-exploration-graphics__/graphics/equipment/energy-shield-yellow.png" +data_util.replace_or_add_ingredient("energy-shield-mk2-equipment", "energy-shield-equipment", "energy-shield-equipment", 5) +data_util.replace_or_add_ingredient("energy-shield-mk2-equipment", nil, data_util.mod_prefix .. 'forcefield-data', 5) +data_util.replace_or_add_ingredient("energy-shield-mk2-equipment", nil, data_util.mod_prefix .. 'iridium-plate', 10) +data_util.replace_or_add_ingredient("energy-shield-mk2-equipment", nil, data_util.mod_prefix .. 'holmium-solenoid', 20) + +data_util.tech_add_prerequisites("energy-shield-mk3-equipment", { + data_util.mod_prefix .. "space-catalogue-energy-3", + data_util.mod_prefix .. 'quantum-processor' +}) +data_util.tech_add_ingredients("energy-shield-mk3-equipment", {data_util.mod_prefix .. "energy-science-pack-3"}, true) +data.raw.technology["energy-shield-mk3-equipment"].icon = "__space-exploration-graphics__/graphics/technology/energy-shield-green.png" +data.raw.item["energy-shield-mk3-equipment"].icon = "__space-exploration-graphics__/graphics/icons/energy-shield-green.png" +data.raw.item["energy-shield-mk3-equipment"].icon_size = 64 +data.raw.item["energy-shield-mk3-equipment"].icon_mipmaps = 1 +data.raw["energy-shield-equipment"]["energy-shield-mk3-equipment"].max_shield_value = 500 +data.raw["energy-shield-equipment"]["energy-shield-mk3-equipment"].energy_source.input_flow_limit = "7MW" +data.raw["energy-shield-equipment"]["energy-shield-mk3-equipment"].sprite.filename = "__space-exploration-graphics__/graphics/equipment/energy-shield-green.png" +data_util.replace_or_add_ingredient("energy-shield-mk3-equipment", nil, data_util.mod_prefix .. 'superconductivity-data', 10) +data_util.replace_or_add_ingredient("energy-shield-mk3-equipment", nil, data_util.mod_prefix .. 'quantum-processor', 10) + +data_util.tech_add_prerequisites("energy-shield-mk4-equipment", { + data_util.mod_prefix .. "superconductive-cable", + data_util.mod_prefix .. 'heavy-composite' +}) +data_util.tech_add_ingredients("energy-shield-mk4-equipment", {data_util.mod_prefix .. "energy-science-pack-4", data_util.mod_prefix .. "material-science-pack-3"}, true) +data.raw.technology["energy-shield-mk4-equipment"].icon = "__space-exploration-graphics__/graphics/technology/energy-shield-cyan.png" +data.raw.item["energy-shield-mk4-equipment"].icon = "__space-exploration-graphics__/graphics/icons/energy-shield-cyan.png" +data.raw.item["energy-shield-mk4-equipment"].icon_size = 64 +data.raw.item["energy-shield-mk4-equipment"].icon_mipmaps = 1 +data.raw["energy-shield-equipment"]["energy-shield-mk4-equipment"].max_shield_value = 1000 +data.raw["energy-shield-equipment"]["energy-shield-mk4-equipment"].energy_source.input_flow_limit = "15MW" +data.raw["energy-shield-equipment"]["energy-shield-mk4-equipment"].sprite.filename = "__space-exploration-graphics__/graphics/equipment/energy-shield-cyan.png" +data_util.replace_or_add_ingredient("energy-shield-mk4-equipment", nil, data_util.mod_prefix .. 'superconductive-cable', 50) +data_util.replace_or_add_ingredient("energy-shield-mk4-equipment", nil, data_util.mod_prefix .. 'heavy-composite', 50) + +data_util.tech_add_prerequisites("energy-shield-mk5-equipment", { + data_util.mod_prefix .. "space-catalogue-energy-4", + data_util.mod_prefix .. 'dynamic-emitter', + data_util.mod_prefix .. 'deep-space-science-pack-1' +}) +data_util.tech_add_ingredients("energy-shield-mk5-equipment", {data_util.mod_prefix .. "astronomic-science-pack-4", data_util.mod_prefix .. "material-science-pack-4", data_util.mod_prefix .. "deep-space-science-pack-1"}, true) +data_util.tech_add_prerequisites("energy-shield-mk5-equipment", { data_util.mod_prefix .. "space-catalogue-material-4"}) +data.raw.technology["energy-shield-mk5-equipment"].icon = "__space-exploration-graphics__/graphics/technology/energy-shield-blue.png" +data.raw.item["energy-shield-mk5-equipment"].icon = "__space-exploration-graphics__/graphics/icons/energy-shield-blue.png" +data.raw.item["energy-shield-mk5-equipment"].icon_size = 64 +data.raw.item["energy-shield-mk5-equipment"].icon_mipmaps = 1 +data.raw["energy-shield-equipment"]["energy-shield-mk5-equipment"].max_shield_value = 2000 +data.raw["energy-shield-equipment"]["energy-shield-mk5-equipment"].energy_source.input_flow_limit = "30MW" +data.raw["energy-shield-equipment"]["energy-shield-mk5-equipment"].sprite.filename = "__space-exploration-graphics__/graphics/equipment/energy-shield-blue.png" +data_util.replace_or_add_ingredient("energy-shield-mk5-equipment", nil, data_util.mod_prefix .. 'nanomaterial', 50) +data_util.replace_or_add_ingredient("energy-shield-mk5-equipment", nil, data_util.mod_prefix .. 'magnetic-monopole-data', 50) +data_util.replace_or_add_ingredient("energy-shield-mk5-equipment", nil, data_util.mod_prefix .. 'dynamic-emitter', 50) + +data_util.tech_add_prerequisites("energy-shield-mk6-equipment", { + data_util.mod_prefix .. "antimatter-production", + data_util.mod_prefix .. 'naquium-processor', + data_util.mod_prefix .. 'deep-space-science-pack-3' +}) +data_util.tech_add_ingredients("energy-shield-mk6-equipment", { data_util.mod_prefix .. "deep-space-science-pack-3"}, true) +data.raw.technology["energy-shield-mk6-equipment"].icon = "__space-exploration-graphics__/graphics/technology/energy-shield-magenta.png" +data.raw.item["energy-shield-mk6-equipment"].icon = "__space-exploration-graphics__/graphics/icons/energy-shield-magenta.png" +data.raw.item["energy-shield-mk6-equipment"].icon_size = 64 +data.raw.item["energy-shield-mk6-equipment"].icon_mipmaps = 1 +data.raw["energy-shield-equipment"]["energy-shield-mk6-equipment"].max_shield_value = 4000 +data.raw["energy-shield-equipment"]["energy-shield-mk6-equipment"].energy_source.input_flow_limit = "60MW" +data.raw["energy-shield-equipment"]["energy-shield-mk6-equipment"].sprite.filename = "__space-exploration-graphics__/graphics/equipment/energy-shield-magenta.png" +data_util.replace_or_add_ingredient("energy-shield-mk6-equipment", nil, data_util.mod_prefix .. 'antimatter-canister', 50) +data_util.replace_or_add_ingredient("energy-shield-mk6-equipment", nil, data_util.mod_prefix .. 'naquium-cube', 50) +data_util.replace_or_add_ingredient("energy-shield-mk6-equipment", nil, data_util.mod_prefix .. 'naquium-processor', 20) + +for _, proto in pairs(data.raw["energy-shield-equipment"]) do + if not string.find(proto.name, "adaptive-armour", 1, true) then + local max_shield = proto.max_shield_value + proto.energy_per_shield = (25 + max_shield / 150) .. "kJ" + local input_flow = data_util.string_to_number(proto.energy_source.input_flow_limit) + local drain = (input_flow / 100) + proto.energy_source.drain = drain.."W" + end +end +--log( serpent.block( data.raw["energy-shield-equipment"], {comment = false, numformat = '%1.8g' } ) ) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/incompatibility.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/incompatibility.lua new file mode 100644 index 0000000..cddfda7 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/incompatibility.lua @@ -0,0 +1,22 @@ +local data_util = require("data_util") +--[[ +mods are incompatible if they: +Break Surfaces +Teleport Items +Are incompatible with the tech tree +Reduce resource variety +Have conflicting game mechanics. +]]-- + +-- if a mod in this list any item teleportation mechanics when this mod is enabled it can be removed from the list +local incompatible_mod_keywords = { + "teleport", +} -- can add a white list if these cause problems +for mod_name, version in pairs(mods) do + local mod_name_format = string.lower(data_util.replace(mod_name, "_", "-")) + for _, keyword in pairs(incompatible_mod_keywords) do + if string.find(mod_name_format, keyword, 1, true) and mod_name ~= "Teleporters" then + error("Incompatibe mod: " .. mod_name) -- this should not happen unless a teleportation mod has been missed from the incompatability list + end + end +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/interior-divider.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/interior-divider.lua new file mode 100644 index 0000000..7de1e5a --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/interior-divider.lua @@ -0,0 +1,14 @@ +local data_util = require("data_util") +local noise = require("noise") + +local tile = table.deepcopy(data.raw.tile["mineral-black-dirt-1"]) +tile.name = "interior-divider" +tile.layer = 0 +table.insert(tile.collision_mask, spaceship_collision_layer) -- prevents nukes from removing +table.insert(tile.collision_mask, flying_collision_layer) +tile.autoplace = nil + +data:extend( +{ + tile +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/noise-programs.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/noise-programs.lua new file mode 100644 index 0000000..153d76b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/noise-programs.lua @@ -0,0 +1,248 @@ +local noise = require("noise") +local util = require("util") +local tne = noise.to_noise_expression +local data_util = require("data_util") + +local function scaled_noise_layer_expression(scale) + return noise.function_application("factorio-multioctave-noise", + { + x = noise.var("x") / scale, + y = noise.var("y") / scale, + persistence = 0.7, + seed0 = noise.var("map_seed"), + seed1 = 1, + input_scale = noise.fraction(1, 6), + output_scale = 1, + octaves = 4, + } + ) +end + +local function make_basis_noise_function(seed0,seed1,outscale0,inscale0) + outscale0 = outscale0 or 1 + inscale0 = inscale0 or 1/outscale0 + return function(x,y,inscale,outscale) + return tne + { + type = "function-application", + function_name = "factorio-basis-noise", + arguments = + { + x = tne(x), + y = tne(y), + seed0 = tne(seed0), + seed1 = tne(seed1), + input_scale = tne((inscale or 1) * inscale0), + output_scale = tne((outscale or 1) * outscale0) + } + } + end +end + +local function make_multioctave_noise_function(seed0,seed1,octaves,octave_output_scale_multiplier,octave_input_scale_multiplier,output_scale0,input_scale0) + octave_output_scale_multiplier = octave_output_scale_multiplier or 2 + octave_input_scale_multiplier = octave_input_scale_multiplier or 1 / octave_output_scale_multiplier + return function(x,y,inscale,outscale) + return tne{ + type = "function-application", + function_name = "factorio-multioctave-noise", + arguments = { + x = tne(x), + y = tne(y), + seed0 = tne(seed0), + seed1 = tne(seed1), + input_scale = tne((inscale or 1) * (input_scale0 or 1)), + output_scale = tne((outscale or 1) * (output_scale0 or 1)), + octaves = tne(octaves), + octave_output_scale_multiplier = tne(octave_output_scale_multiplier), + octave_input_scale_multiplier = tne(octave_input_scale_multiplier), + } + } + end +end + +local function make_split_multioctave_noise_function(seed0,seed1,octaveses,octave_output_scale_multiplier,octave_input_scale_multiplier,output_scale0,input_scale0) + output_scale0 = output_scale0 or 1 + input_scale0 = input_scale0 or 1 + octave_output_scale_multiplier = octave_output_scale_multiplier or 1 + octave_input_scale_multiplier = octave_input_scale_multiplier or 1 + local funx = {} + for i=1,#octaveses do + funx[i] = make_multioctave_noise_function(seed0,seed1,octaveses[i],octave_output_scale_multiplier,octave_input_scale_multiplier,output_scale0,input_scale0) + output_scale0 = output_scale0 * octave_output_scale_multiplier ^ octaveses[i] + input_scale0 = input_scale0 * octave_input_scale_multiplier ^ octaveses[i] + end + return funx +end + +local function peak_to_noise_expression(variable, optimal, range) + local distance_from_optimal = noise.ridge(variable - optimal, 0, math.huge) + -- Idea is to have a plateau in the center of the rectangle, + -- edges that taper off at a consistent slope for all rectangles (so that interactions between rectangles are predictable), + return range - distance_from_optimal +end + +local function rectangle_peak_to_noise_expression(variable, optimal, range) + -- Clamp rectangle-based peaks so that large rectangles don't become + -- super powerful at their centers, because we want to be able to override + -- them e.g. with beach peaks or whatever + return noise.min(peak_to_noise_expression(variable, optimal, range) * 20, 1) +end + +-- restrict planet size by placing out-of-map tiles at a certain radius from the center. +-- elevation is not required, put the expression on out-of-map + +data:extend({ + { + type = "autoplace-control", + name = "planet-size", + order = "z-z", + category = "terrain", + richness = true, + }, + { + type = "noise-expression", + name = "control-setting:planet-size:frequency:multiplier", + expression = noise.to_noise_expression(1) + }, + { + type = "noise-expression", + name = "control-setting:planet-size:size:multiplier", + expression = noise.to_noise_expression(1) + }, + { + type = "noise-expression", + name = "vault-land-probability", + expression = 2 + noise.max(0, 20 - noise.var("distance")) - noise.var("distance")/30 - noise.absolute_value(scaled_noise_layer_expression(2)) + }, + { + type = "autoplace-control", + name = data_util.mod_prefix.."cryonite", + order = "r-c-a", + category = "resource", + richness = true, + hidden = true, + enabled = false + }, + { + type = "autoplace-control", + name = data_util.mod_prefix.."vulcanite", + order = "r-c-b", + category = "resource", + richness = true, + hidden = true, + enabled = false + }, + { + type = "autoplace-control", + name = data_util.mod_prefix.."vitamelange", + order = "r-c-c", + category = "resource", + richness = true, + hidden = true, + enabled = false + }, + { + type = "autoplace-control", + name = data_util.mod_prefix.."beryllium-ore", + order = "r-c-d", + category = "resource", + richness = true, + hidden = true, + enabled = false + }, + { + type = "autoplace-control", + name = data_util.mod_prefix.."holmium-ore", + order = "r-c-e", + category = "resource", + richness = true, + hidden = true, + enabled = false + }, + { + type = "autoplace-control", + name = data_util.mod_prefix.."iridium-ore", + order = "r-c-f", + category = "resource", + richness = true, + hidden = true, + enabled = false + }, + { + type = "autoplace-control", + name = data_util.mod_prefix.."water-ice", + order = "r-s-a", + category = "resource", + richness = true, + hidden = true, + enabled = false + }, + { + type = "autoplace-control", + name = data_util.mod_prefix.."methane-ice", + order = "r-s-b", + category = "resource", + richness = true, + hidden = true, + enabled = false + }, + { + type = "autoplace-control", + name = data_util.mod_prefix.."naquium-ore", + order = "r-s-c", + category = "resource", + richness = true, + hidden = true, + enabled = false + }, +}) + +-- biggest planet size is 10000 at max(600%) +-- planet_radius = 10000 / 6 * (6 + log(1/planet_frequency/6, 2)) +-- planet_frequency = 1 / 6 / 2 ^ (planet_radius * 6 / 10000 - 6) +data.raw.tile["out-of-map"].autoplace = { + probability_expression = 10000 * (noise.distance_from( + noise.var("x"), + noise.var("y"), + --noise.make_point_list({{0,0}})) - 10000 / 6 / noise.var("control-setting:planet-size:frequency:multiplier")) + -- increase number, decrease multiplier, smaller planet + -- smaller scale should have mneat bigger frequency, so smaller planet + -- that worked, so if it actually frequency. + + noise.make_point_list({{0,0}})) - 10000 / 6 * (6 + noise.log2(1/noise.var("control-setting:planet-size:frequency:multiplier")/6))) +} + +-- add the fallback land +data.raw.tile[data_util.mod_prefix.."regolith"].autoplace = { + probability_expression = noise.to_noise_expression(-10000) +} + +-- space in space: --(1000 - 100) * 10000 = 9,000,00 +-- otherwise -100 * 10000 = -1,000,00 +data.raw.tile[data_util.mod_prefix.."space"].autoplace = { + probability_expression = (1 / noise.var("control-setting:planet-size:frequency:multiplier") - 100) * 1000 +} + +-- asteroids are mainly in asteroid belts and asteroid fields +-- asteroid belts have a band around X +-- asteroid fields are all over +--[[ +noise.get_control_setting("planet-size").size_multiplier sets the width of the asteroid belt +asteroid field = 10000 width +asteroid belt = 200 width +planet ring is zone.parent.radius / 200 +Sun is 50 +spaceship is 1 <- this need to not be here +]]-- +data.raw.tile[data_util.mod_prefix.."asteroid"].autoplace = { + probability_expression = (1 / noise.var("control-setting:planet-size:frequency:multiplier") - 100) * 1000 + - 1 + + noise.max(-25, noise.min(0, noise.get_control_setting("planet-size").size_multiplier - 25)) -- Anything below 25 starts to disappear + + (noise.min(noise.var("y") / noise.get_control_setting("planet-size").size_multiplier, 0 - noise.var("y") / noise.get_control_setting("planet-size").size_multiplier) -- this is the ridge + --+ 0.25 * rectangle_peak_to_noise_expression(noise.var("y"), tne(0), noise.get_control_setting("planet-size").size_multiplier) + + noise.max(scaled_noise_layer_expression(5), 0 -scaled_noise_layer_expression(5))) -- billows +} + +-- we do need noise for asteroid spawning in space +-- unless that is all scripted diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/recipe.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/recipe.lua new file mode 100644 index 0000000..367c4c8 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/recipe.lua @@ -0,0 +1,217 @@ +local data_util = require("data_util") + + +local washlist = {"chemical-plant", data_util.mod_prefix.."space-decontamination-facility"} +for _, name in pairs(washlist) do + if data.raw["assembling-machine"][name] then + table.insert(data.raw["assembling-machine"][name].crafting_categories, "pressure-washing") + end +end + +data_util.replace_or_add_ingredient("low-density-structure", "steel-plate", "steel-plate", 5) +data_util.replace_or_add_ingredient("low-density-structure", "copper-plate", "copper-plate", 10) +if data.raw.item.glass then + data_util.replace_or_add_ingredient("low-density-structure", nil, "glass", 10) +else + data_util.replace_or_add_ingredient("low-density-structure", nil, "stone", 10) +end +data_util.replace_or_add_ingredient("low-density-structure", "plastic-bar", "plastic-bar", 10) + +data_util.replace_or_add_ingredient("rocket-control-unit", nil, "iron-plate", 5) +data_util.replace_or_add_ingredient("rocket-control-unit", nil, "glass", 5) +data_util.replace_or_add_ingredient("rocket-control-unit", "speed-module", "battery", 5) +data_util.replace_or_add_ingredient("rocket-control-unit", "advanced-circuit", "advanced-circuit", 5) +data_util.replace_or_add_ingredient("rocket-control-unit", "processing-unit", "processing-unit", 1) + +data_util.replace_or_add_ingredient("rocket-part", "low-density-structure", "low-density-structure", 5) +data_util.replace_or_add_ingredient("rocket-part", "rocket-control-unit", "rocket-control-unit", 5) +data_util.replace_or_add_ingredient("rocket-part", nil, data_util.mod_prefix .. "heat-shielding", 5) +data.raw["rocket-silo"]["rocket-silo"].rocket_parts_required = 50 +data.raw["rocket-silo"]["rocket-silo"].rocket_result_inventory_size = 20 -- needed for 50x20 = 1000 data returned + +data.raw.recipe["solid-fuel-from-heavy-oil"].category = "fuel-refining" +data.raw.recipe["solid-fuel-from-heavy-oil"].energy_required = 0.5 +data.raw.recipe["solid-fuel-from-light-oil"].category = "fuel-refining" +data.raw.recipe["solid-fuel-from-light-oil"].energy_required = 0.5 +data.raw.recipe["solid-fuel-from-petroleum-gas"].category = "fuel-refining" +data.raw.recipe["solid-fuel-from-petroleum-gas"].energy_required = 0.5 + +data.raw.recipe["rocket-fuel"].crafting_machine_tint = +{ + primary = {r = 0.290, g = 0.027, b = 0.000, a = 0.000}, -- #49060000 + secondary = {r = 0.722, g = 0.465, b = 0.190, a = 0.000}, -- #b8763000 + tertiary = {r = 0.870, g = 0.365, b = 0.000, a = 0.000}, -- #dd5d0000 +} +data.raw.recipe["rocket-fuel"].category = "fuel-refining" +data.raw.recipe["rocket-fuel"].subgroup = "processed-fuel" +data.raw.recipe["rocket-fuel"].order = "p" +data.raw.recipe["rocket-fuel"].energy_required = 1 + +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "liquid-rocket-fuel", + ingredients = { + { name = "rocket-fuel", amount = 1 }, + }, + results = { + {name = data_util.mod_prefix.."liquid-rocket-fuel", type="fluid", amount=data_util.liquid_rocket_fuel_per_solid} + }, + energy_required = 1, + enabled = false, + category = "fuel-refining", + subgroup = "processed-fuel", + order = "p", + crafting_machine_tint = + { + primary = {r = 0.290, g = 0.027, b = 0.000, a = 0.000}, -- #49060000 + secondary = {r = 0.722, g = 0.465, b = 0.190, a = 0.000}, -- #b8763000 + tertiary = {r = 0.870, g = 0.365, b = 0.000, a = 0.000}, -- #dd5d0000 + } + }, + { + type = "recipe", + name = data_util.mod_prefix .. "vulcanite-rocket-fuel", + ingredients = { + { name = data_util.mod_prefix .. "vulcanite-block", amount = 8 }, + }, + results = { + { name = "rocket-fuel", amount= 1 } + }, + energy_required = 1, + enabled = false, + category = "fuel-refining", + subgroup = "processed-fuel", + order = "p", + crafting_machine_tint = + { + primary = {r = 0.290, g = 0.027, b = 0.000, a = 0.000}, -- #49060000 + secondary = {r = 0.722, g = 0.465, b = 0.190, a = 0.000}, -- #b8763000 + tertiary = {r = 0.870, g = 0.365, b = 0.000, a = 0.000}, -- #dd5d0000 + }, + allow_as_intermediate = false, + allow_decomposition = false + }, +}) + +data:extend({ + { + type = "recipe", + name = data_util.mod_prefix .. "rocket-fuel-from-water-copper", + ingredients = { + { type = "fluid", name = "water", amount = 1000 }, + { name = "copper-plate", amount = 1 }, + }, + results = { + {name = "rocket-fuel", amount = 1 }, + {name = data_util.mod_prefix .. "scrap", probability = 0.1, amount_min = 1, amount_max = 1 }, + }, + icons = data_util.transition_icons( + { + icon = data.raw.fluid["water"].icon, + icon_size = data.raw.fluid["water"].icon_size, scale = 0.5 + }, + { + icon = data.raw.item["rocket-fuel"].icon, + icon_size = data.raw.item["rocket-fuel"].icon_size, scale = 0.5 + } + ), + energy_required = 500, + enabled = false, + category = "fuel-refining", + subgroup = "processed-fuel", + order = "p", + crafting_machine_tint = + { + primary = {r = 0.290, g = 0.027, b = 0.000, a = 0.000}, -- #49060000 + secondary = {r = 0.722, g = 0.465, b = 0.190, a = 0.000}, -- #b8763000 + tertiary = {r = 0.870, g = 0.365, b = 0.000, a = 0.000}, -- #dd5d0000 + }, + allow_decomposition = false + }, +}) +data_util.allow_productivity(data_util.mod_prefix .. "liquid-rocket-fuel") +data_util.allow_productivity(data_util.mod_prefix .. "rocket-fuel-from-water-copper") +data_util.allow_productivity("sand-from-stone") +data_util.allow_productivity("glass-from-sand") +data_util.allow_productivity("sand-to-solid-sand") +data_util.allow_productivity(data_util.mod_prefix .. "heat-shielding") +--data_util.allow_productivity(data_util.mod_prefix .. "rocket-science-pack") +data_util.allow_productivity(data_util.mod_prefix .. "data-storage-substrate") +data_util.allow_productivity(data_util.mod_prefix .. "material-testing-pack") + +data_util.disallow_productivity("empty-barrel") +data.raw.recipe["empty-barrel"].normal = nil +data.raw.recipe["empty-barrel"].expensive = nil +data.raw.recipe["empty-barrel"].result = nil +data.raw.recipe["empty-barrel"].ingredients = { { name = "steel-plate", amount = 1 } } +data.raw.recipe["empty-barrel"].results = { { name = "empty-barrel", amount = 1 } } + +data_util.allow_productivity({ + data_util.mod_prefix .. "cargo-rocket-section", + data_util.mod_prefix .. "cargo-rocket-section-beryllium", + data_util.mod_prefix .. "cargo-rocket-cargo-pod", + data_util.mod_prefix .. "cargo-rocket-fuel-tank", + data_util.mod_prefix .. "cryonite-crushed", + data_util.mod_prefix .. "cryonite-washed", + data_util.mod_prefix .. "cryonite-rod", + data_util.mod_prefix .. "cryonite-ion-exchange-beads", + data_util.mod_prefix .. "beryllium-ore-crushed", + data_util.mod_prefix .. "beryllium-ore-washed", + data_util.mod_prefix .. "beryllium-sulfate", + data_util.mod_prefix .. "beryllium-hydroxide", + data_util.mod_prefix .. "beryllium-powder", + data_util.mod_prefix .. "beryllium-ingot", + data_util.mod_prefix .. "beryllium-plate", + data_util.mod_prefix .. "holmium-ore-crushed", + data_util.mod_prefix .. "holmium-ore-washed", + data_util.mod_prefix .. "holmium-powder", + data_util.mod_prefix .. "holmium-ingot", + data_util.mod_prefix .. "holmium-plate", + data_util.mod_prefix .. "iridium-ore-crushed", + data_util.mod_prefix .. "iridium-ore-washed", + data_util.mod_prefix .. "iridium-powder", + data_util.mod_prefix .. "iridium-ingot", + data_util.mod_prefix .. "iridium-plate", + data_util.mod_prefix .. "naquium-ore-crushed", + data_util.mod_prefix .. "naquium-ore-washed", + data_util.mod_prefix .. "naquium-powder", + data_util.mod_prefix .. "naquium-ingot", + data_util.mod_prefix .. "naquium-plate", + data_util.mod_prefix .. "vitamelange-nugget", + data_util.mod_prefix .. "vitamelange-roast", + data_util.mod_prefix .. "vitamelange-spice", + data_util.mod_prefix .. "vitamelange-extract", + data_util.mod_prefix .. "vulcanite-crushed", + data_util.mod_prefix .. "vulcanite-washed", + data_util.mod_prefix .. "vulcanite-block", + data_util.mod_prefix .. "vulcanite-ion-exchange-beads", + data_util.mod_prefix .. "vulcanite-rocket-fuel", + data_util.mod_prefix .. "aeroframe-pole", + data_util.mod_prefix .. "aeroframe-scaffold", + data_util.mod_prefix .. "aeroframe-bulkhead", + data_util.mod_prefix .. "lattice-pressure-vessel", + data_util.mod_prefix .. "heavy-girder", + data_util.mod_prefix .. "heavy-bearing", + data_util.mod_prefix .. "heavy-composite", + data_util.mod_prefix .. "heavy-assembly", + data_util.mod_prefix .. "vitalic-acid", + data_util.mod_prefix .. "bioscrubber", + data_util.mod_prefix .. "vitalic-reagent", + data_util.mod_prefix .. "vitalic-epoxy", + data_util.mod_prefix .. "self-sealing-gel", + data_util.mod_prefix .. "holmium-cable", + data_util.mod_prefix .. "holmium-solenoid", + data_util.mod_prefix .. "quantum-processor", + data_util.mod_prefix .. "dynamic-emitter", + data_util.mod_prefix .. "iron-smelting-vulcanite", + data_util.mod_prefix .. "copper-smelting-vulcanite", + data_util.mod_prefix .. "stone-brick-vulcanite", + data_util.mod_prefix .. "glass-vulcanite", + data_util.mod_prefix .. "cryonite-lubricant", + data_util.mod_prefix .. "heat-shielding-iridium", + data_util.mod_prefix .. "pulverised-sand", + data_util.mod_prefix .. "low-density-structure-beryllium", + data_util.mod_prefix .. "processing-unit-holmium", + data_util.mod_prefix .. "space-probe-rocket", +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/resources.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/resources.lua new file mode 100644 index 0000000..5ae1981 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/resources.lua @@ -0,0 +1,100 @@ +local data_util = require("data_util") +local Shared = require("shared") +local noise = require("noise"); +local tne = noise.to_noise_expression; +resource_autoplace = require("prototypes/resource_autoplace_overrides") -- make sure there were not changed + +local resource_controls = {} + +for _, resource in pairs(data.raw.resource) do + + -- no infinte versions of otherwise existing resources + if string.find(resource.name, "infinite", 1, true) + or string.find(resource.name, "unlimited", 1, true) + or string.find(resource.name, "endless", 1, true) + then + log("Resource detected as infinite: " .. resource.name) + resource.autoplace = nil + end + + -- no resources without controls + if resource.autoplace == nil or not resource.autoplace.control then + log("Resource has no control: " .. resource.name) + resource.autoplace = nil + else + log("Resource has control: " .. resource.name .. ": " .. resource.autoplace.control) + end + + if resource.autoplace and not data_util.table_contains(Shared.resources_with_shared_controls, resource.name) then + if resource_controls[resource.autoplace.control] then + -- resources MUST have thier own control - critical for surface resource difference + -- actually in cases where there are multiple sub-types of a resource sharing the same control is acceptable, example: ground water and lithia water. + -- it would not be useful to have a planet with just ground water as a resource + resource.autoplace = nil + log("Resource control already occupied: " .. resource.name) + else + resource_controls[resource.autoplace.control] = "taken" + end + end + + if resource.autoplace == nil then + log("Resource cannot place: " .. resource.name) + else + log("Resource can place: " .. resource.name) + end + + --[[if not (resource.category == "basic-fluid" and resource.minable and resource.minable.results + and #resource.minable.results == 1 and resource.minable.results[1] and resource.minable.results[1].type == "fluid") then + -- no endless non-fluids + resource.infinite = false + resource.minimum = nil + resource.normal = nil + resource.maximum = nil + end]]-- + + if resource.minable and resource.minable.results then + for _, result in ipairs(resource.minable.results) do + if result and result.type ~= "fluid" then + -- no endless non-fluids + resource.infinite = false + resource.minimum = nil + resource.normal = nil + resource.maximum = nil + end + end + end + + -- the prevent overlapping (blocks a differnet resource or makes weird halos) + if resource.autoplace then + local tile_restriction = resource.autoplace.tile_restriction + local resource_setting = se_resources[resource.name] or {} + resource_setting.name = resource.name + + -- apply defaults + resource_setting.order = resource_setting.order or "z-"..resource.name + if resource_setting.has_starting_area_placement == nil then resource_setting.has_starting_area_placement = true end + resource_setting.base_density = resource_setting.base_density or 5 + resource_setting.regular_rq_factor_multiplier = resource_setting.regular_rq_factor_multiplier or 1.1 + resource_setting.starting_rq_factor_multiplier = resource_setting.starting_rq_factor_multiplier or 1 + + if resource.collision_box[1][1] < -0.5 then + -- based on crude oil + resource_setting.base_spots_per_km2 = resource_setting.base_spots_per_km2 or 1.8 + if not resource_setting.random_probability then + resource_setting.random_probability = 1/48 + resource_setting.random_spot_size_minimum = resource_setting.random_spot_size_minimum or 1 + resource_setting.random_spot_size_maximum = resource_setting.random_spot_size_maximum or 1 -- don't randomize spot size + resource_setting.additional_richness = resource_setting.additional_richness or 220000 -- this increases the total everywhere, so base_density needs to be decreased to compensate + end + if resource_setting.has_starting_area_placement == nil then resource_setting.has_starting_area_placement = false end + else + if resource_setting.has_starting_area_placement == nil then resource_setting.has_starting_area_placement = true end + end + + resource.autoplace = resource_autoplace.resource_autoplace_settings(resource_setting) + + resource.autoplace.tile_restriction = tile_restriction + end + +end +data.raw.resource["crude-oil"].resource_patch_search_radius = 32 -- was 12 diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/ruin-remnants.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/ruin-remnants.lua new file mode 100644 index 0000000..e07ff06 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/ruin-remnants.lua @@ -0,0 +1,180 @@ +local data_util = require("data_util") + +local base_remnants = { + --"small-scorchmark", + + "1x2-remnants", + "small-remnants", + "small-generic-remnants", + "medium-small-remnants", + "medium-remnants", + "big-remnants", + + "wooden-chest-remnants", + "iron-chest-remnants", + "active-provider-chest-remnants", + "buffer-chest-remnants", + "passive-provider-chest-remnants", + "requester-chest-remnants", + "steel-chest-remnants", + "storage-chest-remnants", + + "arithmetic-combinator-remnants", + "constant-combinator-remnants", + "decider-combinator-remnants", + "programmable-speaker-remnants", + + "big-electric-pole-remnants", + "medium-electric-pole-remnants", + "small-electric-pole-remnants", + "substation-remnants", + + "accumulator-remnants", + "artillery-turret-remnants", + "boiler-remnants", + "burner-mining-drill-remnants", + "centrifuge-remnants", + "chemical-plant-remnants", + "electric-furnace-remnants", + "heat-exchanger-remnants", + "heat-pipe-remnants", + "lab-remnants", + "nuclear-reactor-remnants", + "oil-refinery-remnants", + "pumpjack-remnants", + "radar-remnants", + "roboport-remnants", + "rocket-silo-generic-remnants", + "solar-panel-remnants", + "steam-engine-remnants", + "steam-turbine-remnants", + "steel-furnace-remnants", + "stone-furnace-remnants", + + "train-stop-remnants", + "rail-chain-signal-remnants", + "rail-signal-remnants", + + "transport-belt-remnants", + "underground-belt-remnants", + "splitter-remnants", + "express-splitter-remnants", + "express-transport-belt-remnants", + "express-underground-belt-remnants", + "fast-splitter-remnants", + "fast-transport-belt-remnants", + "fast-underground-belt-remnants", + + "pipe-remnants", + "pipe-to-ground-remnants", + "pump-remnants", + "storage-tank-remnants", + + "wall-remnants", + "gate-remnants", + "gun-turret-remnants", + "flamethrower-turret-remnants", + "laser-turret-remnants", + + "artillery-wagon-remqnants", + "car-remnants", + "tank-remnants", + "cargo-wagon-remnants", + "fluid-wagon-remnants", + "locomotive-remnants", + + "burner-inserter-remnants", + "fast-inserter-remnants", + "filter-inserter-remnants", + "inserter-remnants", + "long-handed-inserter-remnants", + "stack-filter-inserter-remnants", + "stack-inserter-remnants", +} +-- remnants and corpses tha can be used for ruins decoration. +for _, corpse_name in pairs(base_remnants) do + local corpse = data.raw.corpse[corpse_name] + if corpse then + local ruin = table.deepcopy(corpse) + ruin.name = "ruin-"..corpse.name + ruin.localised_name = corpse.localised_name or {"entity-name."..corpse.name} + ruin.type = "simple-entity-with-force" + ruin.time_before_removed = nil + ruin.animations = corpse.animation + ruin.collision_mask = {"object-layer", "player-layer"} + ruin.minable = { + mining_time = 0.1, + results={ + {name=data_util.mod_prefix .. "scrap", amount = 1}, + } + } + ruin.order = "r[ruin]-" .. (corpse.order or "") + ruin.collision_box = corpse.collision_box or {{-0.45,-0.45},{0.45,0.45}} + ruin.selectable_in_game = true + ruin.flags = ruin.flags or {} + data_util.remove_from_table(ruin.flags, "placeable-neutral") + if not data_util.table_contains(ruin.flags, "placeable-player") then + table.insert(ruin.flags, "placeable-player") + end + if not data_util.table_contains(ruin.flags, "player-creation") then + table.insert(ruin.flags, "player-creation") + end + data:extend({ + { + type = "item", + name = ruin.name, + icon = ruin.icon, + icons = ruin.icons, + icon_size = ruin.icon_size, + order = ruin.order, + stack_size = 50, + subgroup = "ruins", + place_result = ruin.name, + flags = { "hidden" }, + localised_name = ruin.localised_name + }, + ruin + }) + end +end + +--[[ +-- TODO: corpses that don't time out +local base_corpses = { + "behemoth-biter-corpse", "behemoth-spitter-corpse", "behemoth-worm-corpse", + "big-biter-corpse", "big-spitter-corpse", "big-worm-corpse", + "medium-biter-corpse", "medium-spitter-corpse", "medium-worm-corpse", + "small-biter-corpse", "small-spitter-corpse", "small-worm-corpse", + "biter-spawner-corpse", "spiter-spawner-corpse" +}]]-- + +data:extend({ + { + type = "item", + name = data_util.mod_prefix .. "blueprint-registration-point", + icon = "__space-exploration-graphics__/graphics/icons/circle-x.png", + icon_size = 64, + stack_size = 50, + subgroup = "ruins", + order = "a", + flags = { "hidden" }, + place_result = data_util.mod_prefix .. "blueprint-registration-point", + }, + { + type = "simple-entity-with-force", + name = data_util.mod_prefix .. "blueprint-registration-point", + collision_box = {{-0.45,-0.45}, {0.45,0.45}}, + collision_mask = {"not-colliding-with-itself"}, + selection_box = {{-0.45,-0.45}, {0.45,0.45}}, + selection_priority = 200, + icon = "__space-exploration-graphics__/graphics/icons/circle-x.png", + icon_size = 64, + animations = { + filename = "__space-exploration-graphics__/graphics/icons/circle-x.png", + width = 32, + height = 32, + }, + flags = { "hidden" }, + minable = {mining_time = 0.2, result = data_util.mod_prefix .. "blueprint-registration-point"}, + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/ruins.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/ruins.lua new file mode 100644 index 0000000..1854333 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/ruins.lua @@ -0,0 +1,310 @@ +local data_util = require("data_util") + +-- Versions of normal items but can't be mined, maybe have higher health. +for _, wall_name in pairs({"stone-wall", "concrete-wall", "steel-wall"}) do + local wall = table.deepcopy(data.raw.wall[wall_name]) + wall.name = wall_name .. "-ruin" + wall.localised_name = {"space-exploration.suffix_ruin", {"entity-name."..wall_name}} + wall.minable = nil + wall.next_upgrade = nil + wall.max_health = 1000 + wall.max_health + wall.placeable_by = {item=wall_name, count = 1}, + table.insert(wall.flags, "not-deconstructable") + data:extend({wall}) +end + +-- convert decals to ruins bits +for _, decal_name in pairs({"sand-decal", "sand-decal-black", "sand-decal-tan", "sand-decal-white", "sand-decal-black", "light-mud-decal", "dark-mud-decal", "puberty-decal", "red-desert-decal", "shroom-decal", "lichen-decal", "enemy-decal"}) do + data:extend({{ + type = "simple-entity", + name = decal_name.."-ruin", + icon = "__space-exploration-graphics__/graphics/icons/stone-rubble.png", + icon_size = 64, + flags = {"placeable-neutral", "not-on-map", "placeable-off-grid"}, + order = "a-b-a", + collision_mask = {}, + selection_box = {{-0.45, -0.45}, {0.45, 0.45}}, + max_health = 50, + selection_priority = 1, + selectable_in_game = false, + render_layer = "decals", + pictures = data.raw["optimized-decorative"][decal_name].pictures, + }}) +end + +data:extend({ + { + type = "container", + name = "iron-wood-chest", + icon = "__space-exploration-graphics__/graphics/icons/iron-wood-chest.png", + icon_size = 64, icon_mipmaps = 4, + flags = {"placeable-neutral", "player-creation", "not-deconstructable"}, + placeable_by = {item="iron-chest", count = 1}, -- blueprintable + max_health = 1000, + corpse = "iron-wood-chest-remnants", + dying_explosion = "iron-chest-explosion", + open_sound = { filename = "__base__/sound/metallic-chest-open.ogg", volume=0.43 }, + close_sound = { filename = "__base__/sound/metallic-chest-close.ogg", volume = 0.43 }, + resistances = + { + { + type = "fire", + percent = 80 + }, + { + type = "impact", + percent = 30 + } + }, + collision_box = {{-0.35, -0.35}, {0.35, 0.35}}, + selection_box = {{-0.5, -0.5}, {0.5, 0.5}}, + damaged_trigger_effect = table.deepcopy(data.raw.container["wooden-chest"].damaged_trigger_effect), + inventory_size = 20, + vehicle_impact_sound = table.deepcopy(data.raw.container["wooden-chest"].vehicle_impact_sound), + picture = + { + layers = + { + { + filename = "__space-exploration-graphics__/graphics/entity/ruins/sr/iron-wood-chest.png", + priority = "extra-high", + width = 33, + height = 38, + shift = util.by_pixel(0, -0.5), + hr_version = + { + filename = "__space-exploration-graphics__/graphics/entity/ruins/hr/iron-wood-chest.png", + priority = "extra-high", + width = 66, + height = 76, + shift = util.by_pixel(-0.5, -0.5), + scale = 0.5 + } + }, + { + filename = "__base__/graphics/entity/iron-chest/iron-chest-shadow.png", + priority = "extra-high", + width = 56, + height = 26, + shift = util.by_pixel(10, 6.5), + draw_as_shadow = true, + hr_version = + { + filename = "__base__/graphics/entity/iron-chest/hr-iron-chest-shadow.png", + priority = "extra-high", + width = 110, + height = 50, + shift = util.by_pixel(10.5, 6), + draw_as_shadow = true, + scale = 0.5 + } + } + } + }, + }, + { + type = "simple-entity", + name = "iron-wood-chest-remnants", + icon = "__space-exploration-graphics__/graphics/icons/iron-wood-chest.png", + icon_size = 64, icon_mipmaps = 4, + flags = {"placeable-neutral", "not-on-map"}, + placeable_by = {item="iron-chest", count = 1}, -- blueprintable + subgroup = "storage-remnants", + order = "a-b-a", + collision_mask = {"floor-layer", "object-layer"}, + collision_box = {{-0.45, -0.45}, {0.45, 0.45}}, + selection_box = {{-0.45, -0.45}, {0.45, 0.45}}, + selectable_in_game = is_debug_mode, + final_render_layer = "remnants", + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/ruins/hr/iron-wood-chest-remnant.png", + line_length = 1, + width = 126, + height = 78, + frame_count = 1, + direction_count = 1, + shift = util.by_pixel(12, 0), + scale = 0.5, + }), + }, + { + type = "simple-entity", + name = "wood-half-chest-left", + icon = "__base__/graphics/icons/wooden-chest.png", + icon_size = 64, icon_mipmaps = 4, + flags = {"placeable-neutral", "not-on-map", "placeable-off-grid"}, + placeable_by = {item="wooden-chest", count = 1}, -- blueprintable + subgroup = "storage-remnants", + order = "a-b-a", + collision_mask = {"floor-layer", "object-layer"}, + collision_box = {{-0.45, -0.45}, {0.45, 0.45}}, + selection_box = {{-0.45, -0.45}, {0.45, 0.45}}, + selectable_in_game = is_debug_mode, + final_render_layer = "remnants", + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/ruins/hr/wood-half-chest-left.png", + line_length = 1, + width = 110, + height = 73, + frame_count = 1, + direction_count = 1, + shift = util.by_pixel(12, 0), + scale = 0.5, + }), + }, + { + type = "simple-entity", + name = "wood-half-chest-right", + icon = "__base__/graphics/icons/wooden-chest.png", + icon_size = 64, icon_mipmaps = 4, + flags = {"placeable-neutral", "not-on-map", "placeable-off-grid"}, + placeable_by = {item="wooden-chest", count = 1}, -- blueprintable + subgroup = "storage-remnants", + order = "a-b-a", + collision_mask = {"floor-layer", "object-layer"}, + collision_box = {{-0.45, -0.45}, {0.45, 0.45}}, + selection_box = {{-0.45, -0.45}, {0.45, 0.45}}, + selectable_in_game = is_debug_mode, + final_render_layer = "remnants", + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/ruins/hr/wood-half-chest-right.png", + line_length = 1, + width = 110, + height = 73, + frame_count = 1, + direction_count = 1, + shift = util.by_pixel(12, 0), + scale = 0.5, + }), + }, + { + type = "simple-entity", + name = "vase", + icon = "__space-exploration-graphics__/graphics/icons/vase.png", + icon_size = 64, icon_mipmaps = 4, + flags = {"placeable-neutral", "not-on-map", "placeable-off-grid"}, + placeable_by = {item="wood", count = 1}, -- blueprintable + subgroup = "storage-remnants", + order = "a-b-a", + collision_mask = {"floor-layer", "object-layer"}, + collision_box = {{-0.1, -0.1}, {0.1, 0.1}}, + selection_box = {{-0.1, -0.1}, {0.1, 0.1}}, + max_health = 10, + selectable_in_game = is_debug_mode, + final_render_layer = "remnants", + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/ruins/hr/vase.png", + line_length = 1, + width = 32, + height = 68, + frame_count = 1, + direction_count = 1, + shift = util.by_pixel(0, -10), + scale = 0.5, + }), + }, + { + type = "simple-entity", + name = "wooden-barrel", + icon = "__space-exploration-graphics__/graphics/icons/wooden-barrel.png", + icon_size = 64, icon_mipmaps = 4, + flags = {"placeable-neutral", "not-on-map", "placeable-off-grid"}, + placeable_by = {item="wood", count = 1}, -- blueprintable + subgroup = "storage-remnants", + order = "a-b-a", + collision_mask = {"floor-layer", "object-layer"}, + collision_box = {{-0.2, -0.2}, {0.2, 0.2}}, + selection_box = {{-0.2, -0.2}, {0.2, 0.2}}, + max_health = 20, + selectable_in_game = is_debug_mode, + final_render_layer = "remnants", + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/ruins/hr/wooden-barrel.png", + line_length = 1, + width = 52, + height = 86, + frame_count = 1, + direction_count = 1, + shift = util.by_pixel(0, -10), + scale = 0.5, + }), + }, + { + type = "simple-entity", + name = "furnace-ruin", + icon = "__space-exploration-graphics__/graphics/icons/ruin.png", + icon_size = 64, icon_mipmaps = 4, + flags = {"placeable-neutral", "not-on-map"}, + placeable_by = {item="stone-furnace", count = 1}, -- blueprintable + subgroup = "storage-remnants", + order = "a-b-a", + collision_box = data_util.auto_box(1.5, 1.5, 0.1), + selection_box = data_util.auto_box(1.5, 1.5), + selectable_in_game = is_debug_mode, + max_health = 200, + final_render_layer = "remnants", + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/ruins/hr/furnace-ruin.png", + line_length = 1, + width = 128, + height = 128, + frame_count = 1, + direction_count = 1, + shift = util.by_pixel(0, -6), + scale = 0.5, + }), + }, + { + type = "simple-entity", + name = "workshop-ruin", + icon = "__space-exploration-graphics__/graphics/icons/workshop.png", + icon_size = 64, icon_mipmaps = 4, + flags = {"placeable-neutral", "not-on-map"}, + placeable_by = {item="assembling-machine-1", count = 1}, -- blueprintable + subgroup = "storage-remnants", + order = "a-b-a", + collision_mask = {"floor-layer"}, + collision_box = {{-1.45, -1.45}, {1.45, 1.45}}, + selection_box = {{-1.45, -1.45}, {1.45, 1.45}}, + selectable_in_game = is_debug_mode, + max_health = 200, + final_render_layer = "remnants", + picture = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/ruins/hr/workshop.png", + line_length = 1, + width = 255, + height = 228, + frame_count = 1, + direction_count = 1, + shift = util.by_pixel(6, 3), + scale = 0.5, + }), + }, + { + type = "simple-entity", + name = "stone-rubble", + icon = "__space-exploration-graphics__/graphics/icons/stone-rubble.png", + icon_size = 64, icon_mipmaps = 4, + flags = {"placeable-neutral", "not-on-map", "placeable-off-grid"}, + placeable_by = {item="stone-wall", count = 1}, -- blueprintable + subgroup = "storage-remnants", + order = "a-b-a", + collision_mask = {"floor-layer", "object-layer"}, + collision_box = {{-0.45, -0.45}, {0.45, 0.45}}, + selection_box = {{-0.45, -0.45}, {0.45, 0.45}}, + max_health = 50, + selectable_in_game = is_debug_mode, + final_render_layer = "remnants", + pictures = data_util.auto_sr_hr({ + filename = "__space-exploration-graphics__/graphics/entity/ruins/hr/stone-rubble.png", + line_length = 1, + width = 118, + height = 912/8, + frame_count = 1, + direction_count = 1, + shift = util.by_pixel(0, 0), + scale = 0.5, + variation_count = 8 + }), + }, +}) diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/space-collision.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/space-collision.lua new file mode 100644 index 0000000..c132f5f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/space-collision.lua @@ -0,0 +1,233 @@ +local data_util = require("data_util") + +local block_from_space = { + "beacon", + "assembling-machine", -- chemical planets, etc + "furnace", + "unit-spawner", + "lab", + "market", + "offshore-pump", + "pipe", + "pipe-to-ground", + "curved-rail", + "straight-rail", + "storage-tank", + "splitter", + "transport-belt", + "underground-belt", + "tree", + "turret", + "fluid-turret", +} + + +-- make vehicles collide with trees and pipes (train-layer) +-- stop characters colliding with pipes (player-layer) +for _, type in pairs({"pipe", "pipe-to-ground"}) do + for _, prototype in pairs(data.raw[type]) do + prototype.collision_mask = collision_mask_util_extended.get_mask(prototype) + collision_mask_util_extended.remove_layer(prototype.collision_mask, "player-layer") + collision_mask_util_extended.add_layer(prototype.collision_mask, collision_mask_util_extended.get_make_named_collision_mask("vehicle-layer")) + end +end + + +-- disable paving over space and other space platform +for _, item in pairs(data.raw.item) do + + -- space + if item.name ~= data_util.mod_prefix.."space-platform-scaffold" + and item.name ~= data_util.mod_prefix.."space-platform-plating" + and item.name ~= data_util.mod_prefix.."spaceship-floor" then + if item.place_as_tile then + if not item.place_as_tile.condition then + item.place_as_tile.condition = {space_collision_layer} + item.place_as_tile.condition_size = 1 + else + table.insert(item.place_as_tile.condition, space_collision_layer) + item.place_as_tile.condition_size = math.max(item.place_as_tile.condition_size or 1) + end + end + end + if item.place_as_tile then + if item.localised_description then + item.localised_description = {"space-exploration.simple-a-b-break", item.localised_description, {"space-exploration.tile_warning"}} + elseif item.name == data_util.mod_prefix.."space-platform-scaffold" + or item.name == data_util.mod_prefix.."space-platform-plating" + or item.name == data_util.mod_prefix.."spaceship-floor" then + -- flooring with description + item.localised_description = {"space-exploration.simple-a-b-break", {"item-description."..item.name}, {"space-exploration.tile_warning"}} + else -- assumed without description + item.localised_description = {"space-exploration.tile_warning"} + end + end +end + +for _, prototype in pairs(data.raw["rocket-silo"]) do + prototype.collision_mask = collision_mask_util_extended.get_mask(prototype) + collision_mask_util_extended.add_layer(prototype.collision_mask, spaceship_collision_layer) -- block from spaceship + data_util.collision_description(prototype) +end + +for _, prototype in pairs(data.raw["mining-drill"]) do + local type = "mining-drill" + if prototype.resource_categories and prototype.resource_categories[1] == "basic-solid" then + -- allow in space + else + prototype.collision_mask = collision_mask_util_extended.get_mask(prototype) + collision_mask_util_extended.add_layer(prototype.collision_mask, space_collision_layer) + end +end + +for _, type in pairs(block_from_space) do + for _, prototype in pairs(data.raw[type]) do + + prototype.collision_mask = collision_mask_util_extended.get_mask(prototype) + + if (not prototype.se_allow_in_space) + and (not se_allow_in_space[prototype.name]) -- see data.lua for how to allow your entity in space + and string.sub(prototype.name, 1, 8) ~= "se-space" + and string.sub(prototype.name, 1, 13) ~= "se-deep-space" + and (not string.find( prototype.name, "storage-tank", 1, true)) + and (not string.find( prototype.name, "valve", 1, true)) + and ( + type == "offshore-pump" + or + not ( + string.find( prototype.name, "pump", 1, true) + --and not string.find( prototype.name, "water", 1, true) + ) + ) -- not water pump + and (not string.find(prototype.name, data_util.mod_prefix.."rocket-", 1, true)) + and prototype.name ~= data_util.mod_prefix.."big-turbine" + and prototype.name ~= data_util.mod_prefix.."condenser-turbine" + and prototype.name ~= data_util.mod_prefix.."meteor-defence-charger" + and prototype.name ~= data_util.mod_prefix.."meteor-point-defence-charger" + and prototype.name ~= data_util.mod_prefix.."meteor-point-defence-charger-overcharged" + --and prototype.name ~= data_util.mod_prefix.."fuel-refinery" + and prototype.name ~= data_util.mod_prefix .. "space-straight-rail" + and prototype.name ~= data_util.mod_prefix .. "space-curved-rail" + and prototype.name ~= data_util.mod_prefix .. "gate-tank-input" + and prototype.name ~= data_util.mod_prefix .. "gate-tank-output" + and prototype.name ~= data_util.mod_prefix .. "gate-platform-scaffold" + and prototype.name ~= data_util.mod_prefix .. "wide-beacon" + and prototype.name ~= "realistic-reactor-eccs" + --and prototype.name ~= "barreling-pump" -- angels + then + --log("space-collide: " .. prototype.name) + collision_mask_util_extended.add_layer(prototype.collision_mask, space_collision_layer) + else + -- is alloweed + if prototype.allowed_effects and data_util.table_contains(prototype.allowed_effects, "productivity") then + local spaced = table.deepcopy(prototype) + spaced.name = spaced.name .. "-spaced" + spaced.localised_name = {"space-exploration.structure_name_spaced", prototype.localised_name or {"entity-name."..prototype.name}} + spaced.localised_description = {"space-exploration.structure_description_spaced", prototype.localised_description or {"entity-description."..prototype.name}} + spaced.flags = spaced.flags or {} + if not data_util.table_contains(spaced.flags, "hidden") then + table.insert(spaced.flags, "hidden") + end + if not spaced.placeable_by then + for _, item in pairs(data.raw.item) do + if item.place_result == prototype.name then + spaced.placeable_by = spaced.placeable_by or {item = item.name, count=1} + break + end + end + end + local allowed_effects = {} + for _, effect in pairs(prototype.allowed_effects) do + if effect ~= "productivity" then + table.insert(allowed_effects, effect) + end + end + spaced.allowed_effects = allowed_effects + data:extend({spaced}) + end + end + if prototype.name ~= data_util.mod_prefix.."dimensional-anchor" + and type ~= "tree" + and type ~= "turret" + and type ~= "unit-spawner" then + data_util.collision_description(prototype) + end + if prototype.crafting_categories and (not data_util.table_contains(prototype.collision_mask, spaceship_collision_layer)) then + local has_space_recipe = false + for _, category in pairs(prototype.crafting_categories) do + if string.sub(category, 1, 6) == "space-" then + has_space_recipe = true + break + end + end + if has_space_recipe then + local grounded = table.deepcopy(prototype) + grounded.name = grounded.name .. "-grounded" + grounded.localised_name = {"space-exploration.structure_name_grounded", prototype.localised_name or {"entity-name."..prototype.name}} + grounded.localised_description = {"space-exploration.structure_description_grounded", prototype.localised_description or {"entity-description."..prototype.name}} + grounded.flags = grounded.flags or {} + if not data_util.table_contains(grounded.flags, "hidden") then + table.insert(grounded.flags, "hidden") + end + grounded.crafting_categories = {} + for _, category in pairs(prototype.crafting_categories) do + if string.sub(category, 1, 6) ~= "space-" then + table.insert(grounded.crafting_categories, category) + end + end + if #grounded.crafting_categories == 0 then + grounded.crafting_categories = {"no-category"} + end + if not grounded.placeable_by then + for _, item in pairs(data.raw.item) do + if item.place_result == prototype.name then + grounded.placeable_by = grounded.placeable_by or {item = item.name, count=1} + break + end + end + end + data:extend({grounded}) + end + end + end +end + +for _, type in pairs({"accumulator"}) do + for _, prototype in pairs(data.raw[type]) do + data_util.collision_description(prototype) + end +end + +for _, container in pairs({"container", "logistic-container"}) do + for _, prototype in pairs(data.raw[container]) do + if (not prototype.se_allow_in_space) + and string.sub(prototype.name, 1, 8) ~= "se-space" + and prototype.name ~= data_util.mod_prefix .. "cargo-rocket-cargo-pod" + and prototype.name ~= data_util.mod_prefix.."meteor-defence-container" + and prototype.name ~= data_util.mod_prefix.."meteor-point-defence-container" + and (not string.find(prototype.name, data_util.mod_prefix.."rocket-", 1, true)) + and (not string.find(prototype.name, "silo", 1, true)) + and (not string.find(prototype.name, "chest", 1, true)) + and (not string.find(prototype.name, "warehouse", 1, true)) + and (not string.find(prototype.name, "storehouse", 1, true)) then + --log(prototype.name) + prototype.collision_mask = collision_mask_util_extended.get_mask(prototype) + collision_mask_util_extended.add_layer(prototype.collision_mask, space_collision_layer) + end + end +end + +--[[ -- this prevents cars from driving over belts +for _, prototype in pairs(data.raw.car) do + if prototype.name ~= "se-space-capsule-_-vehicle" then + prototype.collision_mask = prototype.collision_mask or {"player-layer", "train-layer"} + table.insert(prototype.collision_mask, space_collision_layer) + end +end +]]-- +for _, prototype in pairs(data.raw.fish) do + if not string.find(prototype.name, "space", 1, true) then + prototype.collision_mask = collision_mask_util_extended.get_mask(prototype) + collision_mask_util_extended.add_layer(prototype.collision_mask, space_collision_layer) + end +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/technology-procedural.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/technology-procedural.lua new file mode 100644 index 0000000..a02cfe0 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/technology-procedural.lua @@ -0,0 +1,176 @@ +local data_util = require("data_util") + +-- Procedural tech +debug_log("Procedural tech") + +local function update_tech_unit_counts(complexity, multiplier) + if not (complexity and complexity.unit) then return end + if complexity.unit.count then + complexity.unit.original_count = complexity.unit.original_count or complexity.unit.count + complexity.unit.count = math.ceil(complexity.unit.original_count * multiplier) + end + if complexity.unit.count_formula then + complexity.unit.original_count_formula = complexity.unit.original_count_formula or complexity.unit.count_formula + complexity.unit.count_formula = multiplier.."*("..complexity.unit.original_count_formula..")" + end +end + +local function update_tech_for_complexity(tech, complexity, space_flavour) + local multiplier = 1 + if complexity >= 4 then -- would be at complexity 3 except for military + data_util.tech_add_ingredients_with_prerequisites(tech.name, {"chemical-science-pack" }) + end + if complexity >= 5 then + data_util.tech_add_ingredients_with_prerequisites(tech.name, {data_util.mod_prefix .. "rocket-science-pack" }) + end + if complexity == 6 then + data_util.tech_add_ingredients_with_prerequisites(tech.name, { space_flavour.."-1" }) + multiplier = 0.6 + elseif complexity == 7 then + data_util.tech_add_ingredients_with_prerequisites(tech.name, { space_flavour.."-2" }) + multiplier = 0.5 + elseif complexity == 8 then + data_util.tech_add_ingredients_with_prerequisites(tech.name, { space_flavour.."-3" }) + multiplier = 0.4 + elseif complexity >= 9 then + data_util.tech_add_ingredients_with_prerequisites(tech.name, { space_flavour.."-4" }) + multiplier = 0.3 + end + if complexity >= 10 then + data_util.tech_add_ingredients_with_prerequisites(tech.name, { data_util.mod_prefix .. "deep-space-science-pack-1" }) + multiplier = 0.2 + end + if complexity >= 11 then + data_util.tech_add_ingredients_with_prerequisites(tech.name, { data_util.mod_prefix .. "deep-space-science-pack-2" }) + multiplier = 0.15 + end + if complexity >= 12 then + data_util.tech_add_ingredients_with_prerequisites(tech.name, { data_util.mod_prefix .. "deep-space-science-pack-3" }) + multiplier = 0.12 + end + if complexity >= 13 then + data_util.tech_add_ingredients_with_prerequisites(tech.name, { data_util.mod_prefix .. "deep-space-science-pack-4" }) + multiplier = 0.1 + end + if complexity >= 14 then + data_util.tech_add_ingredients_with_prerequisites(tech.name, { "space-science-pack" }) + end + + update_tech_unit_counts(tech, multiplier) + update_tech_unit_counts(tech.normal, multiplier) + update_tech_unit_counts(tech.expensive, multiplier) + +end +local techs_static = {} +for _, tech in pairs(data.raw.technology) do + table.insert(techs_static, tech.name) +end + +for _, tech_name in pairs(techs_static) do + local tech = data.raw.technology[tech_name] + if tech and string.sub(tech.name, 1, 3) ~= "se-" then + --debug_log("consider tech: " .. tech.name) + local exclude = false + if mods["NPUtilsTech"] and string.len(tech.name) == 3 and string.sub(tech.name, 1, 1) == "n" then + exclude = true + end + if not exclude then + for _, exclusion in pairs(se_prodecural_tech_exclusions) do + if string.find(tech.name, exclusion, 1, true) then + exclude = true + break + end + end + end + if not exclude then + -- if it already needs space science then starting complexity is 1 (space) + -- otherwise if it requires utility/production then it is -1 + -- otherwise if it requires chemical it is -2, + -- otherwise if it requires logistic it is -3 + -- otherwise if it requires automation it is -4 + local this_level = data_util.string_to_simple_int(tech.name) + local max_level = tech.max_level + if this_level or max_level then + this_level = this_level or 1 + max_level = max_level or this_level + --debug_log("tech (" .. tech.name..") level: " .. this_level) + --debug_log("tech (" .. tech.name..") max level: " .. max_level) + local min_complexity = 4 -- pre-space + if data_util.tech_has_ingredient (tech.name, "deep-science-pack") then + exclude = true -- already done + elseif data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "astronomic-science-pack-4") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "biological-science-pack-4") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "energy-science-pack-4") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "material-science-pack-4") then + min_complexity = 9 + elseif data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "astronomic-science-pack-3") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "biological-science-pack-3") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "energy-science-pack-3") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "material-science-pack-3") then + min_complexity = 8 + elseif data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "astronomic-science-pack-2") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "biological-science-pack-2") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "energy-science-pack-2") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "material-science-pack-2") then + min_complexity = 7 + elseif data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "astronomic-science-pack-1") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "biological-science-pack-1") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "energy-science-pack-1") + or data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "material-science-pack-1") then + min_complexity = 6 + elseif data_util.tech_has_ingredient (tech.name, data_util.mod_prefix .. "rocket-science-pack") then + min_complexity = 5 + elseif data_util.tech_has_ingredient (tech.name, "utility-science-pack") + or data_util.tech_has_ingredient (tech.name, "production-science-pack") then + min_complexity = 4 + elseif data_util.tech_has_ingredient (tech.name, "chemical-science-pack") then + min_complexity = 3 + elseif data_util.tech_has_ingredient (tech.name, "logistic-science-pack") then + min_complexity = 2 + elseif data_util.tech_has_ingredient (tech.name, "automation-science-pack") then + min_complexity = 1 + end + if not exclude then + local complexity = math.max(this_level, min_complexity) + local complexity_adjust = complexity - this_level + --debug_log("tech (" .. tech.name..") complexity_adjust: " .. complexity_adjust) + local max_complexity = 10 + local level_of_max_complexity = max_complexity - complexity_adjust + --debug_log("tech (" .. tech.name..") level_of_max_complexity: " .. level_of_max_complexity) + local max_level_to_make = level_of_max_complexity + if max_level ~= "infinite" then + max_level_to_make = math.min(max_level_to_make, max_level) + end + --debug_log("tech (" .. tech.name..") max_level_to_make: " .. max_level_to_make) + local space_flavour = data_util.mod_prefix .. "material-science-pack" + if string.find(tech.name, "laser", 1, true) + or string.find(tech.name, "energy", 1, true) + or string.find(tech.name, "robots-speed", 1, true) then + space_flavour = data_util.mod_prefix .. "energy-science-pack" + end + --debug_log("tech (" .. tech.name..") space_flavour: " .. space_flavour) + -- Update packs for this + update_tech_for_complexity(tech, complexity, space_flavour) + -- make new levels as required + if max_level_to_make > this_level then + local raw_name = data_util.remove_number_suffix(tech.name) + --debug_log("tech (" .. tech.name..") raw_name: " .. raw_name) + for i = this_level+1, max_level_to_make do + --debug_log("tech (" .. tech.name..") try to make tech for level: " .. i.."("..raw_name.."-"..i..")") + local new_tech = data_util.tech_split_at_level(raw_name, i) + if new_tech then + update_tech_for_complexity(new_tech, i+complexity_adjust, space_flavour) + --debug_log("new tech level created: " .. new_tech.name.."") + else + --debug_log("tech (" .. tech.name..") create tech failed") + end + end + else + --debug_log("tech (" .. tech.name..") no new levels needed") + end + + end + end + end + end +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-3/technology.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/technology.lua new file mode 100644 index 0000000..1899c9d --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-3/technology.lua @@ -0,0 +1,184 @@ +local data_util = require("data_util") + +data_util.tech_lock_recipes("rocket-fuel", {data_util.mod_prefix .."liquid-rocket-fuel", data_util.mod_prefix .. "vulcanite-rocket-fuel"}) + +local function auto() return {"automation-science-pack", 1} end +local function logi() return {"logistic-science-pack", 1} end +local function chem() return {"chemical-science-pack", 1} end +local function mili() return {"military-science-pack", 1} end +local function util() return {"utility-science-pack", 1} end +local function prod() return {"production-science-pack", 1} end +local function rock() return {data_util.mod_prefix .. "rocket-science-pack", 1} end +local function spac() return {"space-science-pack", 1} end +local function deep() return {data_util.mod_prefix .."deep-space-science-pack-1", 1} end + +--[[ +data.raw.technology["logistic-science-pack"].icon = "__space-exploration-graphics__/graphics/technology/beaker/teal.png" +data.raw.technology["chemical-science-pack"].icon = "__space-exploration-graphics__/graphics/technology/beaker/cyan.png" +data.raw.technology["military-science-pack"].icon = "__space-exploration-graphics__/graphics/technology/beaker/grey.png" +data.raw.technology["production-science-pack"].icon = "__space-exploration-graphics__/graphics/technology/beaker/purple.png" +data.raw.technology["utility-science-pack"].icon = "__space-exploration-graphics__/graphics/technology/beaker/yellow.png" +data.raw.technology["space-science-pack"].icon = "__space-exploration-graphics__/graphics/technology/beaker/white.png" + +data.raw.tool["automation-science-pack"].icon = "__space-exploration-graphics__/graphics/icons/beaker/red.png" +data.raw.tool["automation-science-pack"].icon_size = 64 +data.raw.tool["automation-science-pack"].icon_mipmaps = 1 +data.raw.tool["logistic-science-pack"].icon = "__space-exploration-graphics__/graphics/icons/beaker/teal.png" +data.raw.tool["logistic-science-pack"].icon_size = 64 +data.raw.tool["logistic-science-pack"].icon_mipmaps = 1 +data.raw.tool["chemical-science-pack"].icon = "__space-exploration-graphics__/graphics/icons/beaker/cyan.png" +data.raw.tool["chemical-science-pack"].icon_size = 64 +data.raw.tool["chemical-science-pack"].icon_mipmaps = 1 +data.raw.tool["military-science-pack"].icon = "__space-exploration-graphics__/graphics/icons/beaker/grey.png" +data.raw.tool["military-science-pack"].icon_size = 64 +data.raw.tool["military-science-pack"].icon_mipmaps = 1 +data.raw.tool["production-science-pack"].icon = "__space-exploration-graphics__/graphics/icons/beaker/purple.png" +data.raw.tool["production-science-pack"].icon_size = 64 +data.raw.tool["production-science-pack"].icon_mipmaps = 1 +data.raw.tool["utility-science-pack"].icon = "__space-exploration-graphics__/graphics/icons/beaker/yellow.png" +data.raw.tool["utility-science-pack"].icon_size = 64 +data.raw.tool["utility-science-pack"].icon_mipmaps = 1 +data.raw.tool["space-science-pack"].icon = "__space-exploration-graphics__/graphics/icons/beaker/white.png" +data.raw.tool["space-science-pack"].icon_size = 64 +data.raw.tool["space-science-pack"].icon_mipmaps = 1 +]]-- + +--data_util.tech_remove_prerequisites("space-science-pack", {"rocket-silo"}) +--data_util.tech_add_prerequisites("space-science-pack", {data_util.mod_prefix .."space-science-lab"}) +--data.raw.technology["space-science-pack"].prerequisites = {"production-science-pack", data_util.mod_prefix .. "processing-cryonite"} +--data.raw.technology["space-science-pack"].unit.ingredients = {auto(), logi(), chem(), prod()} +data_util.tech_lock_recipes("space-science-pack", {"space-science-pack"}) +data_util.tech_remove_ingredients("space-science-pack", {"utility-science-pack"}) + +data_util.tech_add_prerequisites("rocket-fuel", {"chemical-science-pack"}) +data_util.tech_add_prerequisites("rocket-fuel", {data_util.mod_prefix .. "fuel-refining"}) +data.raw.technology["rocket-fuel"].unit.ingredients = {auto(), logi(), chem()} +data_util.tech_lock_recipes("rocket-fuel", {data_util.mod_prefix .."liquid-rocket-fuel"}) + +data.raw.technology["rocket-silo"].unit.count = 500 +data.raw.technology["rocket-silo"].unit.time = 30 +data.raw.technology["rocket-silo"].unit.ingredients = {auto(), logi(), chem()} +data_util.tech_lock_recipes("rocket-silo", {"satellite"}) +data.raw.technology['rocket-silo'].prerequisites = {"concrete", "low-density-structure", "rocket-control-unit", "rocket-fuel", "solar-energy", data_util.mod_prefix .. "heat-shielding"} +if data.raw.technology['radar'] then + data_util.tech_add_prerequisites('rocket-silo', {'radar'}) + data.raw.technology['radar'].enabled = true + data_util.tech_lock_recipes("radar", {"radar"}) +end + + +data.raw.technology["rocket-control-unit"].unit.ingredients = {auto(), logi(), chem()} +data_util.tech_remove_prerequisites("rocket-control-unit", {"utility-science-pack", "speed-module", "speed-module-1"}) +data_util.tech_add_prerequisites("rocket-control-unit", {"advanced-electronics-2", "battery"}) + +data_util.tech_add_prerequisites("basic-optics", {"glass-processing"}) + +data_util.tech_add_prerequisites("chemical-science-pack", {"optics"}) + +data_util.tech_remove_prerequisites("advanced-material-processing-2", {"chemical-science-pack"}) +data_util.tech_add_prerequisites("advanced-material-processing-2", {data_util.mod_prefix .. "heat-shielding"}) + +--data_util.tech_add_prerequisites("logistic-robotics", {"utility-science-pack"}) +--data_util.tech_add_ingredients("logistic-robotics", { "chemical-science-pack", "utility-science-pack"}, true) +data_util.tech_add_ingredients("logistic-robotics", { "chemical-science-pack"}, true) + +--data_util.tech_remove_prerequisites("logistic-system", {"utility-science-pack"}) + +data_util.tech_add_ingredients_with_prerequisites("worker-robots-storage-1", {"utility-science-pack", "space-science-pack"}) +data_util.tech_add_ingredients_with_prerequisites("worker-robots-storage-2", {data_util.mod_prefix .. "material-science-pack-1"}) + + +data_util.tech_remove_prerequisites("worker-robots-speed-3", {"utility-science-pack"}) +data_util.tech_remove_ingredients_recursive ("worker-robots-speed-5", {"utility-science-pack"}) -- forces prereq at later step + +data_util.tech_add_ingredients_with_prerequisites("worker-robots-speed-3", {"production-science-pack", "space-science-pack"}) +data_util.tech_add_ingredients_with_prerequisites("worker-robots-speed-4", {data_util.mod_prefix .. "rocket-science-pack"}) +data_util.tech_add_ingredients_with_prerequisites("worker-robots-speed-5", {"utility-science-pack", data_util.mod_prefix .. "energy-science-pack-1"}) + +--data_util.tech_add_ingredients_with_prerequisites("speed-module-2", {"production-science-pack"}) +--data_util.tech_add_ingredients_with_prerequisites("productivity-module-2", {"production-science-pack"}) +--data_util.tech_add_ingredients_with_prerequisites("effectivity-module-2", {"production-science-pack"}) + +--data_util.tech_remove_prerequisites("speed-module-3", {"production-science-pack"}) +--data_util.tech_add_prerequisites("speed-module-3", {"space-science-pack", data_util.mod_prefix .. "material-science-pack-1"}) +--data_util.tech_add_ingredients("speed-module-3", { "space-science-pack", data_util.mod_prefix .. "material-science-pack-1" }, true) + +--data_util.tech_remove_prerequisites("productivity-module-3", {"production-science-pack"}) +--data_util.tech_add_prerequisites("productivity-module-3", {"space-science-pack", data_util.mod_prefix .. "biological-science-pack-1"}) +--data_util.tech_add_ingredients("productivity-module-3", { "space-science-pack", data_util.mod_prefix .. "biological-science-pack-1" }, true) + +--data_util.tech_remove_prerequisites("effectivity-module-3", {"production-science-pack"}) +--data_util.tech_add_prerequisites("effectivity-module-3", {"space-science-pack", data_util.mod_prefix .. "energy-science-pack-1"}) +--data_util.tech_add_ingredients("effectivity-module-3", { "space-science-pack", data_util.mod_prefix .. "energy-science-pack-1" }, true) + +--data_util.tech_add_prerequisites("effect-transmission", { "utility-science-pack", data_util.mod_prefix .. "energy-science-pack-1"}) +--data_util.tech_add_ingredients("effect-transmission", { "utility-science-pack", "space-science-pack", data_util.mod_prefix .. "energy-science-pack-1"}, true) +data_util.tech_add_prerequisites("effect-transmission", { "production-science-pack"}) +data_util.tech_add_ingredients("effect-transmission", { "production-science-pack"}, true) + +--data_util.tech_add_ingredients_with_prerequisites("modular-armor", {"chemical-science-pack"}) +--data_util.tech_add_ingredients_with_prerequisites("power-armor", {"utility-science-pack"}) +--data_util.tech_add_prerequisites("power-armor-mk2", {data_util.mod_prefix.."processing-iridium"}) +--data_util.tech_add_ingredients("power-armor-mk2", { "space-science-pack"}, true) + +data_util.tech_add_ingredients_with_prerequisites("battery-mk2-equipment", { "space-science-pack"}) + +--data_util.tech_add_ingredients_with_prerequisites("personal-roboport-equipment", {"utility-science-pack"}) +--data_util.tech_remove_prerequisites("personal-roboport-mk2-equipment", {"utility-science-pack"}) +data_util.tech_add_ingredients_with_prerequisites("personal-roboport-mk2-equipment", {data_util.mod_prefix .. "material-science-pack-1"}) + +data_util.tech_add_prerequisites("fusion-reactor-equipment", { data_util.mod_prefix .. "deep-space-science-pack-1", data_util.mod_prefix .. "rtg-equipment-2",}) + + +data_util.tech_lock_recipes(data_util.mod_prefix.."fuel-refining", {"solid-fuel-from-heavy-oil", "solid-fuel-from-light-oil", "solid-fuel-from-petroleum-gas"}) + +--data_util.tech_split_at_levels("artillery-shell-range", {3, 5}) +--data_util.tech_add_ingredients_with_prerequisites("artillery-shell-range-3", { data_util.mod_prefix .. "material-science-pack-1"}) +--data_util.tech_split_at_levels("artillery-shell-speed", {3, 5}) +--data_util.tech_add_ingredients_with_prerequisites("artillery-shell-speed-3", { data_util.mod_prefix .. "material-science-pack-1"}) + +data_util.tech_remove_prerequisites("spidertron", {"fusion-reactor-equipment", "effectivity-module-3"}) +data_util.tech_add_prerequisites("spidertron", { + data_util.mod_prefix .. "biological-science-pack-1", + data_util.mod_prefix .. "heavy-girder", + data_util.mod_prefix .. "rtg-equipment"}) +data_util.tech_add_ingredients("spidertron", { data_util.mod_prefix .. "rocket-science-pack", data_util.mod_prefix .. "biological-science-pack-1", data_util.mod_prefix .. "material-science-pack-1"}, true) +data_util.tech_remove_ingredients("spidertron", { "production-science-pack"}) +if data.raw.technology.spidertron then + data.raw.technology.spidertron.unit.count = 1000 +end + +data_util.tech_remove_ingredients("mining-productivity-3", {"utility-science-pack"}) +data_util.tech_remove_ingredients("mining-productivity-4", {"utility-science-pack"}) +data_util.tech_split_at_levels("mining-productivity", {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}) +data_util.tech_add_ingredients_with_prerequisites("mining-productivity-3", {"production-science-pack"}) +data_util.tech_add_ingredients_with_prerequisites("mining-productivity-4", {"utility-science-pack", "space-science-pack"}) +data_util.tech_add_ingredients_with_prerequisites("mining-productivity-5", {data_util.mod_prefix .. "rocket-science-pack"}) +data_util.tech_add_ingredients_with_prerequisites("mining-productivity-6", {data_util.mod_prefix .. "biological-science-pack-1"}) +data_util.tech_add_ingredients_with_prerequisites("mining-productivity-7", {data_util.mod_prefix .. "biological-science-pack-2"}) +data_util.tech_add_ingredients_with_prerequisites("mining-productivity-8", {data_util.mod_prefix .. "biological-science-pack-3"}) +data_util.tech_add_ingredients_with_prerequisites("mining-productivity-9", {data_util.mod_prefix .. "biological-science-pack-4"}) +data_util.tech_add_ingredients("mining-productivity-10", { data_util.mod_prefix .. "biological-science-pack-4" }, true) +data_util.tech_add_ingredients("mining-productivity-11", { data_util.mod_prefix .. "biological-science-pack-4" }, true) +data_util.tech_add_ingredients("mining-productivity-12", { data_util.mod_prefix .. "biological-science-pack-4" }, true) +data_util.tech_add_ingredients("mining-productivity-13", { data_util.mod_prefix .. "biological-science-pack-4" }, true) +data_util.tech_add_ingredients_with_prerequisites("mining-productivity-10", {data_util.mod_prefix .. "deep-space-science-pack-1"}) +data_util.tech_add_ingredients_with_prerequisites("mining-productivity-11", {data_util.mod_prefix .. "deep-space-science-pack-2"}) +data_util.tech_add_ingredients_with_prerequisites("mining-productivity-12", {data_util.mod_prefix .. "deep-space-science-pack-3"}) +data_util.tech_add_ingredients_with_prerequisites("mining-productivity-13", {data_util.mod_prefix .. "deep-space-science-pack-4"}) + +data_util.tech_add_prerequisites("jetpack-2", { data_util.mod_prefix .. "rocket-science-pack"}) +data_util.tech_add_prerequisites("jetpack-3", { data_util.mod_prefix .. "aeroframe-pole"}) +data_util.tech_add_prerequisites("jetpack-4", { data_util.mod_prefix .. "naquium-cube"}) +data_util.tech_add_ingredients_with_prerequisites("jetpack-2", {data_util.mod_prefix .. "rocket-science-pack"}) +data_util.tech_add_ingredients_with_prerequisites("jetpack-3", {data_util.mod_prefix .. "astronomic-science-pack-1"}) +data_util.tech_add_ingredients_with_prerequisites("jetpack-4", {data_util.mod_prefix .. "deep-space-science-pack-1"}) + +if not data.raw.technology["industrial-furnace"] then error("Mod conflict, industrial-furnace tech is missing.") end +data_util.tech_remove_ingredients_recursive("industrial-furnace", {"production-science-pack"}) +data_util.tech_remove_prerequisites("industrial-furnace", {"production-science-pack"}) +data_util.tech_add_prerequisites("industrial-furnace", { "advanced-material-processing-2"}) + +if data.raw.technology["electric-mining"] and not data.raw.technology["electric-mining"].enabled == false then + data_util.tech_add_prerequisites(data_util.mod_prefix .. "core-miner", {"electric-mining"}) +end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-multi/item-group-assign.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-multi/item-group-assign.lua new file mode 100644 index 0000000..4da5056 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-multi/item-group-assign.lua @@ -0,0 +1,110 @@ +local data_util = require("data_util") +local types = {"item", "item-with-entity-data", "rail-planner", "capsule"} + +local function change_group (name, group, order) + if data.raw["item-subgroup"][name] then + data.raw["item-subgroup"][name].group = group + if order then + data.raw["item-subgroup"][name].order = order + end + end +end + +change_group("fluid-recipes", "resources") +change_group("fuel-processing", "resources") +change_group("fill-barrel", "resources") +change_group("empty-barrel", "resources") +change_group("raw-resource", "resources") +change_group("raw-material", "resources") +change_group("science-pack", "science", "a") +change_group("tool", "combat", "a-a") +change_group("gun", "combat", "a-b") + +local function change_subgroup (name, subgroup, order) + for _, type in pairs(types) do + if data.raw[type][name] then + data.raw[type][name].subgroup = subgroup + if order then + data.raw[type][name].order = order + end + end + end +end + +if mods["aai-containers"] then + change_subgroup("logistic-chest-active-provider", "container-1") + change_subgroup("logistic-chest-passive-provider", "container-1") + change_subgroup("logistic-chest-storage", "container-1") + change_subgroup("logistic-chest-buffer", "container-1") + change_subgroup("logistic-chest-requester", "container-1") +else + change_subgroup("logistic-chest-active-provider", "storage") + change_subgroup("logistic-chest-passive-provider", "storage") + change_subgroup("logistic-chest-storage", "storage") + change_subgroup("logistic-chest-buffer", "storage") + change_subgroup("logistic-chest-requester", "storage") +end + +change_subgroup("transport-belt", "transport-belt") +change_subgroup("fast-transport-belt", "transport-belt") +change_subgroup("express-transport-belt", "transport-belt") + +change_subgroup("underground-belt", "underground-belt") +change_subgroup("fast-underground-belt", "underground-belt") +change_subgroup("express-underground-belt", "underground-belt") + +change_subgroup("splitter", "splitter") +change_subgroup("fast-splitter", "splitter") +change_subgroup("express-splitter", "splitter") + +change_subgroup("pipe", "pipe") +change_subgroup("pipe-to-ground", "pipe") +change_subgroup("pump", "pipe") +change_subgroup("storage-tank", "pipe") + +change_subgroup("rail", "rail") +change_subgroup("train-stop", "rail") +change_subgroup("rail-signal", "rail") +change_subgroup("rail-chain-signal", "rail") +change_subgroup("locomotive", "rail") +change_subgroup("cargo-wagon", "rail") +change_subgroup("fluid-wagon", "rail") +change_subgroup("artillery-wagon", "rail") + +change_subgroup("burner-lab", "lab") +change_subgroup("lab", "lab") + +change_subgroup("solar-panel", "solar") +change_subgroup("accumulator", "solar") + +change_subgroup("chemical-plant", "chemistry") +change_subgroup("oil-refinery", "chemistry") +change_subgroup("fuel-processor", "chemistry") + +change_subgroup("burner-assembling-machine", "assembling") +change_subgroup("assembling-machine-1", "assembling") +change_subgroup("assembling-machine-2", "assembling") +change_subgroup("assembling-machine-3", "assembling") + +change_subgroup("centrifuge", "radiation") + +change_subgroup("processed-fuel", "processed-fuel") +change_subgroup("rocket-fuel", "processed-fuel") +change_subgroup("nuclear-fuel", "processed-fuel") + +change_subgroup("sand", "pulverised") +change_subgroup("glass", "plates") +change_subgroup("iron-plate", "plates") +change_subgroup("copper-plate", "plates") +change_subgroup("steel-plate", "plates") +change_subgroup("plastic-bar", "plates") +change_subgroup("stone-tablet", "plates") + +change_subgroup("battery", "intermediate-product") +change_subgroup("explosives", "intermediate-product") + +change_subgroup("cliff-explosives", "capsule") + +if data.raw.item["logistic-train-stop"] then data.raw.item["logistic-train-stop"].subgroup = "rail" end +if data.raw["item-subgroup"]["angels-warehouses"] then data.raw["item-subgroup"]["angels-warehouses"].order = "a1-"..data.raw["item-subgroup"]["angels-warehouses"].order end +if data.raw.item["angels-pressure-tank-1"] then data.raw.item["angels-pressure-tank-1"].subgroup = "pipe" end diff --git a/space-exploration_0.5.58/space-exploration/prototypes/phase-multi/no-recycle.lua b/space-exploration_0.5.58/space-exploration/prototypes/phase-multi/no-recycle.lua new file mode 100644 index 0000000..3a435fa --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/phase-multi/no-recycle.lua @@ -0,0 +1,48 @@ + +-- reverse factory +--table.insert(rf.norecycle_items, "example-recipe") +rf = rf or {} +rf.norecycle_categories = rf.norecycle_categories or {} +rf.norecycle_items = rf.norecycle_items or {} + +local function norecycle_category(category) + if rf and rf.norecycle_categories then + table.insert(rf.norecycle_categories, category) + end +end + +local function norecycle_recipe(recipe) + if rf and rf.norecycle_items then + table.insert(rf.norecycle_items, recipe) + end +end + + +norecycle_recipe("se-micro-black-hole-data") + +norecycle_category("condenser-turbine") +norecycle_category("core-mining") +norecycle_category("space-accelerator") +norecycle_category("space-astrometrics") +norecycle_category("space-collider") +norecycle_category("space-materialisation") +norecycle_category("space-genetics") +norecycle_category("space-gravimetrics") +norecycle_category("space-growth") +norecycle_category("space-hypercooling") +norecycle_category("space-mechanical") +norecycle_category("space-observation-gammaray") +norecycle_category("space-observation-xray") +norecycle_category("space-observation-uv") +norecycle_category("space-observation-visible") +norecycle_category("space-observation-infrared") +norecycle_category("space-observation-microwave") +norecycle_category("space-observation-radio") +norecycle_category("space-radiator") +norecycle_category("space-radiation") +norecycle_category("space-research") +norecycle_category("space-supercomputing-1") +norecycle_category("space-supercomputing-2") +norecycle_category("space-supercomputing-3") +norecycle_category("space-antimatter-engine") +norecycle_category("space-rocket-engine") diff --git a/space-exploration_0.5.58/space-exploration/prototypes/resource_autoplace_overrides.lua b/space-exploration_0.5.58/space-exploration/prototypes/resource_autoplace_overrides.lua new file mode 100644 index 0000000..0305565 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/prototypes/resource_autoplace_overrides.lua @@ -0,0 +1,476 @@ +local noise = require("noise") +local expression_to_ascii_math = require("noise.expression-to-ascii-math") +local tne = noise.to_noise_expression +local litexp = noise.literal_expression + +local function get_patch_metaset_patch_set_index(patch_metaset, patch_set_name) + if patch_metaset.patch_set_indexes[patch_set_name] == nil then + patch_metaset.patch_set_indexes[patch_set_name] = patch_metaset.next_patch_set_index + patch_metaset.next_patch_set_index = patch_metaset.next_patch_set_index + 1 + data.raw["noise-expression"][patch_metaset.count_expression_name].expression = tne(patch_metaset.next_patch_set_index) + end + return patch_metaset.patch_set_indexes[patch_set_name] +end + +local function new_patch_metaset(params) + data.raw["noise-expression"][params.count_expression_name] = + { + type = "noise-expression", + name = params.count_expression_name, + expression = tne(0) + } + + return + { + count_expression_name = params.count_expression_name, + next_patch_set_index = 0, + patch_set_indexes = {}, + get_patch_set_index = get_patch_metaset_patch_set_index + } +end + +-- This has to be global so that all calls into this library +-- use the same object and get unique patchset indexes. +-- It is not indended to be used directly from outside of this library. +if not resource_autoplace__patch_metasets then + resource_autoplace__patch_metasets = + { + regular = new_patch_metaset{ count_expression_name = "regular-resource-patch-set-count" }, + starting = new_patch_metaset{ count_expression_name = "starting-resource-patch-set-count" }, + } +end + +local regular_patch_metaset = resource_autoplace__patch_metasets.regular +local starting_patch_metaset = resource_autoplace__patch_metasets.starting + +-- Indicate that a patch set exists and optionally that it also needs a separate starting patch set. +-- Call this to initialize patch sets' indexes in a more deterministic order +-- (see demo-resources.lua for an example) before calling resource_autoplace_settings. +local function initialize_patch_set(patch_set_name, has_starting_area_placement) + regular_patch_metaset:get_patch_set_index(patch_set_name) + if has_starting_area_placement then + starting_patch_metaset:get_patch_set_index(patch_set_name) + end +end + +local pointillist_mode = false +local patch_blobbiness_enabled = true + +local function dump_expression(name, expr) + log(name..":\n"..tostring(expression_to_ascii_math(expr))) +end + +local onethird = tne(1)/3 -- Looks nicer in output than 0.333333 + +--- Creates and returns an AutoplaceSpecification that will generate spot-based ore patches. +-- Required parameters: +-- - name - name for the type, used as the default autoplace control name and patch set name +-- (each of which can be overridden separately) +-- - base_density - amount of stuff, on average, to be placed per tile +-- Optional parameters: +-- - patch_set_name - name of the patch set; patches sets of the same name and seed1 will overlap; default: name +-- - autoplace_control_name - name of the corresponding autoplace control; default: name +-- - random_probability - probability of placement at any given tile within a patch; default: 1 +-- - base_spots_per_km2 - number of patches per square kilometer near the starting area +-- - has_starting_area_placement - true|false|nil - yes, no, and there is no special starting area, respectively +-- - seed1 - random seed to use when generating patch positions; default: 100 +-- More obscure parameters can be read about in the inline comments. +local function resource_autoplace_settings(params) + + local function setting_scale(value) + --return value + --return value * value + return (value ^ 0.8) + end + + local name = params.name + local order = params.order or "d" + + local patch_set_name = params.patch_set_name or name + local autoplace_control_name = params.autoplace_control_name or name + + -- How much of this stuff (probability * richness) should occur per tile on average near the starting area? + local base_density = params.base_density + -- Random probability that this stuff is placed when probability is otherwise positive + -- This IS automatically compensated for by richness, so you don't need to adjust base_density + local random_probability = params.random_probability or 1 + local base_spots_per_km2 = params.base_spots_per_km2 or 2.5 + local random_spot_size_minimum = params.random_spot_size_minimum or 0.25 + local random_spot_size_maximum = params.random_spot_size_maximum or 2.00 + -- Amplitude of spot 'blob noise' relative to typical spot amplitude + local regular_blob_amplitude_multiplier = 1/8 * (params.regular_blob_amplitude_multiplier or 1) + local starting_blob_amplitude_multiplier = 1/8 * (params.starting_blob_amplitude_multiplier or 1) + + local control_setting = noise.get_control_setting(autoplace_control_name) + local frequency_multiplier = setting_scale(control_setting.frequency_multiplier) + local size_multiplier = setting_scale(control_setting.size_multiplier) + local size_boost = 4 + local density_multiplier = frequency_multiplier * size_multiplier + + local planet_control_setting = noise.get_control_setting("planet-size") + + -- The following are more dangerous, since they'll throw total quantities off if you don't compensate for them: + + -- additional_richness will be added to richness but does not affect probability of anything being placed at all. + -- This is NOT automatically compensated for, because that would be difficult to calculate. + -- The caller will need to compensate for any additional_richness by adjusting base_density. + local additional_richness = params.additional_richness or 0 + -- richness will be clamped to minimum_richness at the low end anywhere the stuff is otherwise placed + -- Not automatically compensated for. + local minimum_richness = params.minimum_richness or 0 + -- 'post' as in multiplied after everything else is calculated, including additional_richness + -- and minimum_richness. + local richness_post_multiplier = (params.richness_post_multiplier or 1) * setting_scale(control_setting.richness_multiplier) + + local seed1 = params.seed1 or 100 + + -- rq_factor is the ratio of the radius of a patch to the cube root of its quantity, + -- i.e. radius of a quantity=1 patch; higher values = fatter, shallower patches + -- Watch out! Shallower patches are more heavily thrown off by noise, + -- so adjust noise amplitude accordingly! + -- (this is automatically done -- se *_blob_amplitude, below) + local regular_rq_factor = (params.regular_rq_factor_multiplier or 1) * 1 / 10 + local starting_rq_factor = (params.starting_rq_factor_multiplier or 1) * 1 / 8 + + local elevation = noise.var("elevation") + + + -- vanilla placement rules don't work well for most planets. + -- they don't work at all well for asteroid fields. + -- remove resource size and richness change over distance for space zones + -- space zones are defined by ____? + local distance_affects_resources = tne(0) -- 0 to 1, 1 is where distance is a full factor + local distance_affects_resources = noise.clamp(planet_control_setting.richness_multiplier, 0, 1) -- 0 to 1, 1 is where distance is a full factor + -- note: Set planet-size richness to 0 for all non-homeworld zones. + + --local distance = noise.var("distance") + local base_distance = 5000 -- (effective assumed if real distance is not used) + local distance = noise.clamp(base_distance + distance_affects_resources * (noise.var("distance") - base_distance), 0, base_distance) -- treat as permenant 5000 + + -- > I just realized because of the new rule of "keep ores outside the + -- > starting area", the starting area size setting should not affect ore + -- > placement. The ore's starting area should be it's own fixed value + -- > that ignores the setting. + -- Twinsen, August 2018 + local starting_resource_placement_radius = 140 --120 + local regular_modulation + -- has_starting_area_placement values: + -- - true - place in starting area and outside starting area independently + -- - false - place outside starting area but not inside + -- - nil - place everywhere as if there is no starting area + + local regular_patch_fade_in_distance = 320--300 + local regular_ns_multiplier_at + if params.has_starting_area_placement == nil then + regular_ns_multiplier_at = function(dist) return 1 end + else + regular_ns_multiplier_at = function(dist) + return noise.clamp((dist - starting_resource_placement_radius) / regular_patch_fade_in_distance, 0, 1) + end + end + + -- local double_density_distance = 1300 -- distance at which patches have twice as much stuff in them + local double_density_distance = base_distance -- distance at which patches have twice as much stuff in them + + -- Maximum distance at which blob amplitude should keep increasing along with spot height + local regular_blob_amplitude_maximum_distance = double_density_distance + local spot_enlargement_maximum_distance = regular_blob_amplitude_maximum_distance + + -- Get distance for purposes of calculating regular ore density, patch size, and richness + local function size_effective_distance_at(dist) + if params.has_starting_area_placement == nil then + return dist + else + -- If there's a starting area measure from the edge of the fade-in radius + return dist - regular_patch_fade_in_distance + end + end + + local function regular_density_at(dist) + -- Don't increase density beyond spot_enlargement_maximum_distance + -- because large spots get unwieldy. We'll increase richness after that, instead. + effective_distance = noise.clamp(size_effective_distance_at(dist), 0, spot_enlargement_maximum_distance) + local distance_density_multiplier = 1 + effective_distance / double_density_distance + return base_density * density_multiplier * distance_density_multiplier * regular_ns_multiplier_at(dist) + end + local spots_per_km2_near_start = base_spots_per_km2 * frequency_multiplier + local candidate_spot_count = params.candidate_spot_count or 21 + + if pointillist_mode then + -- Split ore into lots and lots and lots of little patches + -- so that we can get a better idea of the underlying distribution + candidate_spot_count = 10000 -- hardcoded max so we don't melt the player's CPU + spots_per_km2_near_start = candidate_spot_count + end + + -- Regular spot quantity without randomization added + local function regular_spot_quantity_base_at(dist) + return regular_density_at(dist) * 1000000 / spots_per_km2_near_start + end + -- Regular spot quantity averaging over randomization + local function regular_spot_quantity_typical_at(dist) + local average_random_size_multiplier = (random_spot_size_minimum + random_spot_size_maximum) / 2 + return average_random_size_multiplier * regular_spot_quantity_base_at(dist) + end + local function regular_spot_height_typical_at(dist) + return regular_spot_quantity_typical_at(dist)^(onethird) / ((math.pi/3) * regular_rq_factor^2) + end + + local regular_density_expression = regular_density_at(distance) + local regular_spot_quantity_expression = noise.random_between(random_spot_size_minimum, random_spot_size_maximum) * regular_spot_quantity_base_at(distance) + local regular_spot_radius_expression = noise.min(32, regular_rq_factor * regular_spot_quantity_expression ^ (onethird)) + + if params.has_starting_area_placement ~= nil then + regular_blob_amplitude_maximum_distance = regular_blob_amplitude_maximum_distance + regular_patch_fade_in_distance + end + local function regular_blob_amplitude_at(dist) + return regular_blob_amplitude_multiplier * noise.min( + regular_spot_height_typical_at(regular_blob_amplitude_maximum_distance), + regular_spot_height_typical_at(dist) + ) + end + local regular_blob_amplitude_maximum = regular_blob_amplitude_at(regular_blob_amplitude_maximum_distance) + local regular_blob_amplitude_expression = regular_blob_amplitude_at(distance) + + -- Values for starting spots. + -- Simpler calculations than for regular spots because they are only placed + -- in one place and therefore there are fewer variables! + + -- reduce the influence of the frequency slider over the amount of ore in the starting area. + -- note that starting_spot_count is still set to frequency_multiplier below, so we still split the ore to a fairly high amount of patches. + local starting_frequency_multiplier = ((frequency_multiplier - 1) * 0.25) + 1 + --local starting_amount = 40000 * base_density * starting_frequency_multiplier * size_multiplier + local starting_amount = 100000 * base_density * starting_frequency_multiplier * size_multiplier + --local starting_amount = 1000000 -- nicer for testing - just check that all spots have ~1.0M + local starting_area_sharpness = tne(math.huge) + local starting_resource_placement_area = math.pi*starting_resource_placement_radius*starting_resource_placement_radius + local starting_density = starting_amount / starting_resource_placement_area + -- Goes < 0 outside of starting area and at negative elevations + local starting_modulation = + noise.clamp((starting_resource_placement_radius - distance) * starting_area_sharpness, 0, 1) + local starting_feasibility = + noise.clamp((elevation - 1) / 10, 0, 1) * starting_modulation + -- Allow resources at lower elevations for starting + + -- Set minimum_favorability_for_full_placement to lower numbers to decrease the likelihood that the starting patches get split. + -- Quantity will automatically be clamped by the spot noise function + -- and radius will be automatically adjusted, too, + -- so it's fine for the spot quantity to be more than the region target quantity. + local minimum_favorability_for_full_placement = 1/4--1/2 + local starting_spot_count = frequency_multiplier + local starting_area_spot_quantity = starting_amount / minimum_favorability_for_full_placement / starting_spot_count + local starting_spot_height = starting_area_spot_quantity ^ (1/3) / ((math.pi/3) * starting_rq_factor^2) + local starting_blob_amplitude = starting_blob_amplitude_multiplier * starting_spot_height + + -- since starting and regular spots get maxed together, + -- the basement value should be the lower of the two. + -- This value needs to be low enough that any noise added to it is still below zero + -- so that we don't get bits of ores sticking out between spot noise spots. + -- It also needs to be constant because that's how the spot noise op works. + -- Simply using -infinity would work, but calculating it based on blob amplitude: + -- a) looks nicer if you render the value on a map preview + -- b) acts as a check on our blob_amplitude calculations + local basement_value = noise.min(-6 * regular_blob_amplitude_maximum, + -6 * starting_blob_amplitude) + + local regular_spots = tne{ + type = "function-application", + function_name = "spot-noise", + arguments = + { + x = noise.var("x"), + y = noise.var("y"), + seed0 = noise.var("map_seed"), + seed1 = tne(seed1), + region_size = tne(1024), + candidate_spot_count = tne(candidate_spot_count), + suggested_minimum_candidate_point_spacing = tne(128),--tne(45.254833995939045), -- Magic number to match 0.17.50 spot placement, when candidate_point_count was always 128 + skip_span = noise.var("regular-resource-patch-set-count"), + skip_offset = tne(regular_patch_metaset:get_patch_set_index(patch_set_name)), + density_expression = litexp(regular_density_expression), -- low-frequency noise evaluate for an entire region + spot_quantity_expression = litexp(regular_spot_quantity_expression), -- used to figure out where spots go + hard_region_target_quantity = tne(false), -- it's fine for large spots to push region quantity past the target + spot_radius_expression = litexp(size_boost + regular_spot_radius_expression), + spot_favorability_expression = litexp(1), + basement_value = basement_value, + maximum_spot_basement_radius = tne(128) + } + } + + -- Don't want to distrurb starting_patch_metaset unless we actually need to. + local starting_patch_set_index = 0 + if params.has_starting_area_placement == true then + starting_patch_set_index = tne(starting_patch_metaset:get_patch_set_index(patch_set_name)) + end + + -- If you change starting area region size, + -- also change the default starting area position in MapGenSettings + local starting_spots = tne{ + type = "function-application", + function_name = "spot-noise", + arguments = + { + x = noise.var("x"), + y = noise.var("y"), + seed0 = noise.var("map_seed"), + seed1 = tne(seed1+1), + skip_span = noise.var("starting-resource-patch-set-count"), + skip_offset = starting_patch_set_index, + region_size = tne(starting_resource_placement_radius * 2), + candidate_spot_count = tne(64),--tne(32), + suggested_minimum_candidate_point_spacing = tne(128), -- unset in vanilla + minimum_candidate_point_spacing = tne(32), + density_expression = litexp(starting_density * starting_modulation), + spot_quantity_expression = litexp(starting_area_spot_quantity), + hard_region_target_quantity = tne(true), -- Since there's [usually] only one spot, clamp its quantity to the target quantity + spot_radius_expression = litexp(size_boost/2 + starting_rq_factor * starting_area_spot_quantity ^ (onethird)), + spot_favorability_expression = litexp(1), --[[litexp( -- this seems to make the resources cluster a lot + starting_feasibility * 2 - + 1 * distance / starting_resource_placement_radius + + noise.random(0.5) + ),]] + basement_value = basement_value, + maximum_spot_basement_radius = tne(64) -- does making this huge make a difference? + } + } + + if pointillist_mode or not patch_blobbiness_enabled then + regular_blob_amplitude_expression = 0 + end + if not patch_blobbiness_enabled then + starting_blob_amplitude = 0 + end + + -- Add some blobbiness + local blobs0 = tne{ + type = "function-application", + function_name = "factorio-basis-noise", + arguments = + { + x = noise.var("x"), + y = noise.var("y"), + seed0 = noise.var("map_seed"), + seed1 = tne(seed1), + input_scale = tne(1/8), + output_scale = tne(1) + } + } + tne{ + type = "function-application", + function_name = "factorio-basis-noise", + arguments = + { + x = noise.var("x"), + y = noise.var("y"), + seed0 = noise.var("map_seed"), + seed1 = tne(seed1), + input_scale = tne(1/24), + output_scale = tne(1) + } + } + local blobs0f = blobs0 - 1/4 + + local blobs1 = blobs0 + tne{ + type = "function-application", + function_name = "factorio-basis-noise", + arguments = + { + x = noise.var("x"), + y = noise.var("y"), + seed0 = noise.var("map_seed"), + seed1 = tne(seed1), + input_scale = tne(1/64), + output_scale = tne(1.5) + } + } + local blobs1f = blobs1 - onethird -- attempt to remove positive bias + + local vein = 1 - 10 * noise.absolute_value(noise.function_application("factorio-multioctave-noise", + { + x = noise.var("x"), + y = noise.var("y"), + persistence = 0.5, + seed0 = noise.var("map_seed"), + seed1 = tne(seed1), + input_scale = noise.fraction(1, 4), -- smaller 2nd value means smaller frequency + output_scale = 1, + octaves = 6, + } + )) + local start_vein = 1 - 10 * noise.absolute_value(noise.function_application("factorio-multioctave-noise", + { + x = noise.var("x"), + y = noise.var("y"), + persistence = 0.5, + seed0 = noise.var("map_seed"), + seed1 = tne(seed1), + input_scale = noise.fraction(1, 1), -- smaller 2nd value means smaller frequency + output_scale = 1, + octaves = 6, + } + )) + + --local regular_patches = regular_spots + ( 1 * blobs1f + 1.1 * vein * random_probability) * regular_blob_amplitude_expression + local regular_patches = regular_spots + ( 1 * blobs1f + 0.8 * vein * random_probability) * regular_blob_amplitude_expression + local starting_patches = starting_spots + ( 0.4 * blobs0f + 0.2 * start_vein * random_probability) * starting_blob_amplitude + + local all_patches + if params.has_starting_area_placement == true then + all_patches = noise.max(starting_patches, regular_patches) + elseif params.has_starting_area_placement == false then + all_patches = regular_patches + else -- nil or unspecified means just make it uniform everywhere + all_patches = regular_patches + end + + local richness_expression = noise.delimit_procedure(all_patches) -- Re-use all that stuff between richness/probability! + local probability_expression = noise.clamp(richness_expression, 0, 1) + if random_probability < 1 then + richness_expression = richness_expression / random_probability + probability_expression = probability_expression * tne{ + type = "function-application", + function_name = "random-penalty", + arguments = + { + source = tne(1), + x = noise.var("x"), + y = noise.var("y"), + amplitude = tne(1/random_probability) -- put random_probability points with probability < 0 + } + } + end + if additional_richness > 0 then + richness_expression = richness_expression + additional_richness + end + if minimum_richness > 0 then + richness_expression = noise.max(richness_expression, minimum_richness) + end + + -- sed = size-effective distance + local function post_semd_richness_distance_multiplier_at(sed) + local ddd = double_density_distance + local semd = spot_enlargement_maximum_distance + -- density = pre-richness-mutliplied density * richness_distance_multiplier. + -- Since pre-richness-multiplied density plateaus at semd, + -- richness needs to increase at that point, and by this much: + return (ddd + sed)/(ddd + semd) + end + local richness_distance_multiplier = noise.max(1, post_semd_richness_distance_multiplier_at(size_effective_distance_at(distance))) + + richness_expression = richness_expression * richness_distance_multiplier * richness_post_multiplier + + local ret = + { + order = order, + control = autoplace_control_name, + probability_expression = probability_expression, + richness_expression = richness_expression + } + + return ret +end + +return +{ + initialize_patch_set = initialize_patch_set, + resource_autoplace_settings = resource_autoplace_settings +} diff --git a/space-exploration_0.5.58/space-exploration/scripts/ancient.lua b/space-exploration_0.5.58/space-exploration/scripts/ancient.lua new file mode 100644 index 0000000..7fb727c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/ancient.lua @@ -0,0 +1,2476 @@ +local Ancient = {} + +--[[ +IMPORTANT + +The pyramids and anomaly gate puzzle in-game is supposed to be the crowning achievement of completing Space Exploration. +Please don't try to reverse engineer this code to figure out a solution to the puzzle, it will spoil it for you and for others. + +]]-- + +-- STATIC +if true then + -- rectangles + Ancient.name_tech_coordinates = mod_prefix .. "long-range-star-mapping" + Ancient.name_tech_anchor = mod_prefix .. "dimensional-anchor" + Ancient.name_gate_tryplace = mod_prefix .. "gate-tryplace" + Ancient.name_gate_blocker = mod_prefix .. "gate-blocker" + Ancient.name_gate_blocker_void = mod_prefix .. "gate-blocker-void" + Ancient.name_gate_void_sprite = mod_prefix.."gate-void-sprite" + Ancient.name_gate_glyph_prefix = mod_prefix.."glyph-a-energy-" + Ancient.name_gate_glyph_locked_suffix = "-locked" + Ancient.name_gate_light = mod_prefix .. "gate-light" + Ancient.name_gate_light_middle = mod_prefix .. "gate-light-middle" + Ancient.name_gate_lock_combinator = mod_prefix .. "gate-lock-combinator" + Ancient.name_gate_lock_switch = mod_prefix .. "gate-lock-switch" + Ancient.name_gate_fluid_input = mod_prefix .. "gate-tank-input" + Ancient.name_gate_fluid_output = mod_prefix .. "gate-tank-output" + Ancient.name_button_player_track_glyphs = "player_track_glyphs" + + Ancient.name_gate_cloud = mod_prefix .. "gate-cloud" + Ancient.name_gate_spec_white = mod_prefix .. "gate-spec-white" + Ancient.name_gate_spec_cyan = mod_prefix .. "gate-spec-cyan" + + Ancient.name_sound_gate_turning = mod_prefix .. "sound-continous-gate-turning" + Ancient.name_sound_gate_power_on = mod_prefix .. "sound-continous-gate-power-on" + Ancient.name_sound_gate_power_up = mod_prefix .. "sound-gate-power-up" + Ancient.name_sound_gate_power_down = mod_prefix .. "sound-gate-power-down" + Ancient.name_sound_gate_button = mod_prefix .. "sound-gate-button" + Ancient.name_sound_gate_lock = mod_prefix .. "sound-gate-lock" + + Ancient.timer_power_up_complete = 395 -- based on audio + Ancient.timer_power_up_ghyph_light_interval = 3 + Ancient.timer_power_down_complete = 283 + Ancient.timer_shunt_step = 0.03 + Ancient.timer_shunt_glyph_lock = 1.09 + Ancient.timer_shunt_complete = 3.5 + + Ancient.unit_power_draw = 10000000000/60 + + Ancient.gate_temperature_resting = 25 + Ancient.gate_temperature_partial = -200 -- required for glyph lock + Ancient.gate_temperature_required = -250 -- required for gate activation + Ancient.gate_temperature_zero = -273.15 + Ancient.gate_temperature_per_coolant_max = 1 + Ancient.gate_temperature_per_coolant_min = 0.001 -- lerp between resting and zero + Ancient.gate_temperature_return_per_tick = 0.00001 -- multiplied by -temp + Ancient.gate_temperature_while_powered = 0.001 + Ancient.gate_temperature_while_turning = 0.01 + Ancient.gate_temperature_while_locked = 0.1 + Ancient.gate_temperature_while_portal = 1 + + Ancient.gate_cloud_tint_1 = {r = 0.2, g = 0.6, b = 1} + Ancient.gate_cloud_tint_2 = {r = 0.2, g = 0.2, b = 1} + + Ancient.vault_entrance_structures = { -- also used in zone deletion + mod_prefix .. "pyramid-a", + mod_prefix .. "pyramid-b", + mod_prefix .. "pyramid-c", + } + + Ancient.gate_default_position = {x =0, y = -128} + Ancient.galaxy_ship_default_position = {x = 100, y = -400} + + -- rows + Ancient.gate_blockers_phase_1 = { + [-26] = {{-8,9}}, + [-25] = {{-15,5}}, + [-24] = {{-16,5}}, + [-23] = {{-18,5}}, + [-22] = {{-20,5}}, + [-21] = {{-22,-9}}, + [-20] = {{-24,-13}, {23,25}}, + [-19] = {{-25,-16}}, + [-18] = {{-27,-18}}, + [-17] = {{-28,-20}, {21,23}}, + [-16] = {{-29,-21}, {22,23}}, + [-15] = {{-30,-22}}, + [-14] = {{-31,-24}}, + [-13] = {{-32,-25}}, + [-12] = {{-34,-26}}, + [-11] = {{-34,-27}}, + [-10] = {{-34,-27}}, + [-9] = {{-34,-28}}, + [-8] = {{-34,-28}, {29,31}}, + [-7] = {{-34,-29}, {30,31}}, + [-6] = {{-35,-29}, {30,31}, {35,36}}, + [-5] = {{-35,-30}, {35,36}}, + [-4] = {{-35,-30}}, + [-3] = {{-35,-30}}, + [-2] = {{-35,-30}}, + [-1] = {{-35,-30}}, + [0] = {{-35,-30}}, + [1] = {{-35,-30}}, + [2] = {{-35,-30}}, + [3] = {{-35,-30}, {35,36}}, + [4] = {{-35,-30}, {35,36}}, + [5] = {{-34,-29}}, + [6] = {{-34,-29}}, + [7] = {{-34,-28}}, + [8] = {{-34,-28}}, + [9] = {{-34,-27}}, + [10] = {{-34,-26}, {27,28}}, + [11] = {{-32,-28}, {26,28}}, + [12] = {{-31,-28}, {25,28}}, + [13] = {{-30,-28}, {29,31}}, + [14] = {{-29,-28}, {29,30}}, + [15] = {{21,23}}, + [16] = {{-20,-19}}, + [17] = {{-25,-23}, {18,19}, {25,26}}, + [18] = {{-24,-23}}, + [20] = {{8,9}}, + [24] = {{-8,-7}}, + [25] = {{-5,6}}, + [26] = {{-4,5}}, + } + Ancient.gate_blockers_void_phase_1 = { + [-21] = {{-9,5}}, + [-20] = {{-13,5}}, + [-19] = {{-16,5}}, + [-18] = {{-18,5}}, + [-17] = {{-20,21}}, + [-16] = {{-21,22}}, + [-15] = {{-22,23}}, + [-14] = {{-24,23}}, + [-13] = {{-25,23}}, + [-12] = {{-26,23}}, + [-11] = {{-27,23}}, + [-10] = {{-27,23}}, + [-9] = {{-28,23}}, + [-8] = {{-28,29}}, + [-7] = {{-29,30}}, + [-6] = {{-29,30}}, + [-5] = {{-30,31}}, + [-4] = {{-30,31}}, + [-3] = {{-30,31}}, + [-2] = {{-30,31}}, + [-1] = {{-30,31}}, + [0] = {{-30,31}}, + [1] = {{-30,31}}, + [2] = {{-30,31}}, + [3] = {{-30,28}}, + [4] = {{-30,28}}, + [5] = {{-29,28}}, + [6] = {{-29,28}}, + [7] = {{-28,28}}, + [8] = {{-28,28}}, + [9] = {{-27,28}}, + [10] = {{-26,27}}, + [11] = {{-20,26}}, + [12] = {{-20,25}}, + [13] = {{-20,23}}, + [14] = {{-20,23}}, + [15] = {{-20,21}}, + [16] = {{-19,19}}, + [17] = {{-7,18}}, + [18] = {{-7,9}}, + [19] = {{-7,9}}, + [20] = {{-7,8}}, + } + Ancient.gate_blockers_phase_2 = { + [-25] = {{5,16}}, + [-24] = {{5,17}}, + [-23] = {{5,19}}, + [-22] = {{5,21}}, + [-21] = {{10,23}}, + [-20] = {{14,23}}, + [-19] = {{17,26}}, + [-18] = {{19,28}}, + [-17] = {{23,29}}, + [-16] = {{23,30}}, + [-15] = {{23,31}}, + [-14] = {{25,32}}, + [-13] = {{26,33}}, + [-12] = {{27,35}}, + [-11] = {{28,35}}, + [-10] = {{28,35}}, + [-9] = {{29,35}}, + [-8] = {{31,35}}, + [-7] = {{31,35}}, + [-6] = {{31,35}}, + [-5] = {{31,35}}, + [-4] = {{31,36}}, + [-3] = {{31,36}}, + [-2] = {{31,36}}, + [-1] = {{31,36}}, + [0] = {{31,36}}, + [1] = {{31,36}}, + [2] = {{31,36}}, + [3] = {{31,35}}, + [4] = {{31,35}}, + [5] = {{30,35}}, + [6] = {{30,35}}, + [7] = {{29,35}}, + [8] = {{29,35}}, + [9] = {{28,35}}, + [10] = {{28,35}}, + [11] = {{-28,-25}, {28,33}}, + [12] = {{-28,-24}, {28,32}}, + [13] = {{-28,-23}, {24,29}}, + [14] = {{-28,-22}, {23,29}}, + [15] = {{-28,-20}, {23,29}}, + [16] = {{-27,-20}, {20,28}}, + [17] = {{-23,-17}, {19,25}}, + [18] = {{-23,-15}, {16,25}}, + [19] = {{-22,-10}, {11,23}}, + [20] = {{-20,-7}, {9,21}}, + [21] = {{-18,19}}, + [22] = {{-16,17}}, + [23] = {{-15,16}}, + [24] = {{-7,9}}, + } + Ancient.gate_blockers_void_phase_2 = { + [-21] = {{5,10}}, + [-20] = {{5,14}}, + [-19] = {{5,17}}, + [-18] = {{5,19}}, + [-14] = {{23,25}}, + [-13] = {{23,26}}, + [-12] = {{23,27}}, + [-11] = {{23,28}}, + [-10] = {{23,28}}, + [-9] = {{23,29}}, + [3] = {{28,31}}, + [4] = {{28,31}}, + [5] = {{28,30}}, + [6] = {{28,30}}, + [7] = {{28,29}}, + [8] = {{28,29}}, + [11] = {{-25,-20}}, + [12] = {{-24,-20}}, + [13] = {{-23,-20}, {23,24}}, + [14] = {{-22,-20}}, + [16] = {{19,20}}, + [17] = {{-17,-7}}, + [18] = {{-15,-7}, {9,16}}, + [19] = {{-10,-7}, {9,11}}, + } + Ancient.gate_fragments = { + [mod_prefix .. "gate-fragment-1"] = {placeable = true, position = {x = 28, y = -10}, required_position = {14,23}}, + [mod_prefix .. "gate-fragment-2"] = {placeable = true, position = {x = 39, y = -3}, required_position = {1,22}}, + [mod_prefix .. "gate-fragment-3"] = {placeable = true, position = {x = 38, y = 9.5}, required_position = {-13,20.5}}, + [mod_prefix .. "gate-fragment-4"] = {placeable = true, position = {x = 41, y = 19}, required_position = {-24,14}}, + [mod_prefix .. "gate-fragment-5"] = {placeable = true, position = {x = 40, y = 28}, required_position = {24,18}}, + [mod_prefix .. "gate-fragment-6"] = {placeable = true, position = {x = 0, y = 24}, required_position = {21,17}}, + [mod_prefix .. "gate-fragment-7"] = {placeable = true, position = {x = -23, y = 15}, required_position = {26,15}}, + [mod_prefix .. "gate-fragment-8"] = {placeable = true, position = {x = 27.5, y = 26}, required_position = {31.5,8}}, + [mod_prefix .. "gate-fragment-9"] = {placeable = true, position = {x = 52.5, y = 28.5}, required_position = {33.5,0.5}}, + [mod_prefix .. "gate-fragment-10"] = {placeable = true, position = {x = 12, y = -19}, required_position = {32,-5}}, + [mod_prefix .. "gate-fragment-11"] = {placeable = true, position = {x = 24, y = -18}, required_position = {34,-7}}, + [mod_prefix .. "gate-fragment-12"] = {placeable = true, position = {x = 16, y = 24.5}, required_position = {30,-12.5}}, + [mod_prefix .. "gate-fragment-13"] = {placeable = true, position = {x = -17, y = 21}, required_position = {14,-23}}, + [mod_prefix .. "gate-fragment-14-a"] = {placeable = false, position = {x = -28, y = -4}}, + [mod_prefix .. "gate-fragment-14-b"] = {placeable = false, position = {x = -8.5, y = -24}}, + } + Ancient.gate_parts_main = { + [mod_prefix .. "gate-main-e"] = {32,0}, + [mod_prefix .. "gate-main-en"] = {28.5,-15.5}, + [mod_prefix .. "gate-main-es"] = {28.5,15}, + [mod_prefix .. "gate-main-n"] = {0.5,-23}, + [mod_prefix .. "gate-main-ne"] = {17.5,-20.5}, + [mod_prefix .. "gate-main-nw"] = {-16.5,-20.5}, + [mod_prefix .. "gate-main-s"] = {0.5,22.5}, + [mod_prefix .. "gate-main-se"] = {16.5,19.5}, + [mod_prefix .. "gate-main-sw"] = {-15.5,19.5}, + [mod_prefix .. "gate-main-w"] = {-31,0}, + [mod_prefix .. "gate-main-wn"] = {-27.5,-15.5}, + [mod_prefix .. "gate-main-ws"] = {-27.5,15}, + } + Ancient.gate_parts_main_shadow = { + [mod_prefix .. "gate-main-e-shadow"] = {35.5,0}, + [mod_prefix .. "gate-main-en-shadow"] = {30.0,-14.5}, + [mod_prefix .. "gate-main-es-shadow"] = {28.5,15}, + [mod_prefix .. "gate-main-ne-shadow"] = {16.0,-20.5}, + [mod_prefix .. "gate-main-s-shadow"] = {0.5,24.0}, + [mod_prefix .. "gate-main-se-shadow"] = {16.5,21.5}, + [mod_prefix .. "gate-main-sw-shadow"] = {-15.5,21.5}, + [mod_prefix .. "gate-main-w-shadow"] = {-34,0}, + [mod_prefix .. "gate-main-ws-shadow"] = {-27.5,15}, + } + Ancient.gate_parts_underlay = { + [mod_prefix .. "gate-underlay-e"] = {32.5,-1}, + [mod_prefix .. "gate-underlay-en"] = {28,-15}, + [mod_prefix .. "gate-underlay-es"] = {27.5,12.5}, + [mod_prefix .. "gate-underlay-n"] = {0.5,-23.5}, + [mod_prefix .. "gate-underlay-ne"] = {19,-20}, + [mod_prefix .. "gate-underlay-nw"] = {-18,-20}, + [mod_prefix .. "gate-underlay-s"] = {0.5,22}, + [mod_prefix .. "gate-underlay-se"] = {19.5,19}, + [mod_prefix .. "gate-underlay-sw"] = {-18.5,19}, + [mod_prefix .. "gate-underlay-w"] = {-31.5,-1}, + [mod_prefix .. "gate-underlay-wn"] = {-27,-15}, + [mod_prefix .. "gate-underlay-ws"] = {-26.5,12.5}, + } + Ancient.gate_parts_rails = { + [mod_prefix .. "gate-rails-1"] = {-12.5,21}, + [mod_prefix .. "gate-rails-2"] = {-30.5,8}, + [mod_prefix .. "gate-rails-3"] = {-30.5,-10}, + [mod_prefix .. "gate-rails-4"] = {-12.5,-23}, + [mod_prefix .. "gate-rails-5"] = {13.5,-23}, + [mod_prefix .. "gate-rails-6"] = {31.5,-10}, + [mod_prefix .. "gate-rails-7"] = {31.5,8}, + [mod_prefix .. "gate-rails-8"] = {13.5,21}, + } + Ancient.gate_parts_shunts = { + [1] = {name = mod_prefix .. "gate-shunt-1", position = {-13,21.5}, lock_offset = {0.45,-0.8}}, + [2] = {name = mod_prefix .. "gate-shunt-2", position = {-31,8.5}, lock_offset = {1.1,-0.4}}, + [3] = {name = mod_prefix .. "gate-shunt-3", position = {-31,-10.5}, lock_offset = {1.1,0.4}}, + [4] = {name = mod_prefix .. "gate-shunt-4", position = {-13,-23.5}, lock_offset = {0.45,0.8}}, + [5] = {name = mod_prefix .. "gate-shunt-5", position = {14,-23.5}, lock_offset = {-0.45,0.8}}, + [6] = {name = mod_prefix .. "gate-shunt-6", position = {32,-10.5}, lock_offset = {-1.1,0.4}}, + [7] = {name = mod_prefix .. "gate-shunt-7", position = {32,8.5}, lock_offset = {-1.1,-0.4}}, + [8] = {name = mod_prefix .. "gate-shunt-8", position = {14,21.5}, lock_offset = {-0.45,-0.8}}, + } + Ancient.gate_parts_addons = { + [mod_prefix .. "gate-addon-1"] = {-13,22}, + [mod_prefix .. "gate-addon-2"] = {-32,9}, + [mod_prefix .. "gate-addon-3"] = {-32,-10}, + [mod_prefix .. "gate-addon-4"] = {-13,-23}, + [mod_prefix .. "gate-addon-5"] = {14,-23}, + [mod_prefix .. "gate-addon-6"] = {33,-10}, + [mod_prefix .. "gate-addon-7"] = {33,9}, + [mod_prefix .. "gate-addon-8"] = {14,22}, + } + Ancient.gate_parts_lock_combinators = { + [1] = {direction = defines.direction.south, position = {-13.062, 23.543}}, + [2] = {direction = defines.direction.west, position = {-33.644, 8.933}}, + [3] = {direction = defines.direction.west, position = {-33.625, -9.476}}, + [4] = {direction = defines.direction.north, position = {-12.968, -24.746}}, + [5] = {direction = defines.direction.north, position = {13.675, -24.753}}, + [6] = {direction = defines.direction.east, position = {34.468, -10.558}}, + [7] = {direction = defines.direction.east, position = {34.582, 8.433}}, + [8] = {direction = defines.direction.south, position = {13.96, 23.519}}, + } + Ancient.gate_parts_lock_fluid_inputs = { + [1] = {direction = defines.direction.south, position = {-14.5, 23.5}}, + [2] = {direction = defines.direction.west, position = {-33.5, 7.5}}, + [3] = {direction = defines.direction.west, position = {-33.5, -11.5}}, + [4] = {direction = defines.direction.north, position = {-11.5, -24.5}}, + [5] = {direction = defines.direction.north, position = {15.5, -24.5}}, + [6] = {direction = defines.direction.east, position = {34.5, -8.5}}, + [7] = {direction = defines.direction.east, position = {34.5, 10.5}}, + [8] = {direction = defines.direction.south, position = {12.5, 23.5}}, + } + Ancient.gate_parts_lock_fluid_outputs = { + [1] = {direction = defines.direction.south, position = {-11.5, 23.5}}, + [2] = {direction = defines.direction.west, position = {-33.5, 10.5}}, + [3] = {direction = defines.direction.west, position = {-33.5, -8.5}}, + [4] = {direction = defines.direction.north, position = {-14.5, -24.5}}, + [5] = {direction = defines.direction.north, position = {12.5, -24.5}}, + [6] = {direction = defines.direction.east, position = {34.5, -11.5}}, + [7] = {direction = defines.direction.east, position = {34.5, 7.5}}, + [8] = {direction = defines.direction.south, position = {15.5, 23.5}}, + } + Ancient.gate_parts_platform = { + name = mod_prefix .. "gate-platform", + name_scaffold = mod_prefix .. "gate-platform-scaffold", + position = {0.5,25}, + energy_interface = { + name = mod_prefix .. "gate-energy-interface", + position = {0.5,25} + }, + buttons = { + name_switch = mod_prefix .. "gate-platform-button-switch", + left = {name = mod_prefix .. "gate-platform-button-left", position = {2.5234,26.04}, switch_position = {2.5234,26.04}}, + middle = {name = mod_prefix .. "gate-platform-button-middle", position = {3.37,26.04}, switch_position = {3.37,26.04}}, + right = {name = mod_prefix .. "gate-platform-button-right", position = {4.19,26.04}, switch_position = {4.19,26.04}}, + }, + indicators = { + names = { + [1] = mod_prefix .. "gate-platform-indicator-red", + [2] = mod_prefix .. "gate-platform-indicator-yellow", + [3] = mod_prefix .. "gate-platform-indicator-green", + }, + x_start = -2.789, + x_spacing = 7/32, + anchor_y = 24.859, + temperature_y = 25.421, + lock_y = 25.984, + }, + combinator = { + name = mod_prefix .. "gate-platform-combinator", + position = {4.55, 26.2} + } + } + Ancient.gate_sound_positions = { + [1] = {-13,21.5}, + [2] = {-31,8.5}, + [3] = {-31,-10.5}, + [4] = {-13,-23.5}, + [5] = {14,-23.5}, + [6] = {32,-10.5}, + [7] = {32,8.5}, + [8] = {14,21.5}, + [9] = {0.5,25}, -- platform + } + + + Ancient.gate_glyphs_x = 0.5 + Ancient.gate_glyphs_x_mult = 33.4 + Ancient.gate_glyphs_y = -0.9 + Ancient.gate_glyphs_y_mult = 23.55 + + Ancient.gate_parts_locked_glyphs = { + [1] = {-11.75,19.91}, + [2] = {-29.09,7.64}, + [3] = {-29.09,-9.66}, + [4] = {-11.75,-21.91}, + [5] = {12.75,-21.91}, + [6] = {30.09,-9.66}, + [7] = {30.09,7.64}, + [8] = {12.75,19.91}, + } + + Ancient.gate_acceleration = 0.002 + Ancient.gate_decceleration = 0.02 + Ancient.gate_max_speed = 0.1 + + Ancient.pyramid_width = 9*2 + Ancient.pyramid_height = 7*2 + Ancient.cartouche_path_width = 4 + Ancient.cartouche_path_wall_width = 12 + Ancient.cartouche_path_start = 0 + Ancient.cartouche_path_wall_start = 30 + Ancient.cartouche_path_end = 40 + Ancient.cartouche_path_wall_end= 100 +end + +local crypto = 0 +local cryptl = 1 +local cryptf = 5 +local cryptc = 8 +local crypte = 11 +local crypti = 60 +local cryptr = cryptl+math.sqrt(cryptf) +local cryptg = (cryptr)/2 +local crypta = (cryptl+cryptr)/3 +local cryptb = (cryptr)/6 + +local cryptx = { +cryptl,cryptg,crypto,cryptl,-cryptg,crypto,-cryptl,cryptg,crypto,-cryptl, +-cryptg,crypto,cryptg,crypto,cryptl,cryptg,crypto,-cryptl,-cryptg,crypto, +cryptl,-cryptg,crypto,-cryptl,crypto,cryptl,cryptg,crypto,cryptl,-cryptg, +crypto,-cryptl,cryptg,crypto,-cryptl,-cryptg,cryptl,cryptl,cryptl,cryptl, +cryptl,-cryptl,cryptl,-cryptl,cryptl,cryptl,-cryptl,-cryptl,-cryptl,cryptl, +cryptl,-cryptl,cryptl,-cryptl,-cryptl,-cryptl,cryptl,-cryptl,-cryptl,-cryptl, +crypta,cryptb,crypto,crypta,-cryptb,crypto,-crypta,cryptb,crypto,-crypta, +-cryptb,crypto,cryptb,crypto,crypta,cryptb,crypto,-crypta,-cryptb,crypto, +crypta,-cryptb,crypto,-crypta,crypto,crypta,cryptb,crypto,crypta,-cryptb, +crypto,-crypta,cryptb,crypto,-crypta,-cryptb} + +local cryptv = { 1,29,30,1,30,14,1,14,21,1,21,13,1,13,29,2,32,31,2,31,15,2,15, +22,2,22,16,2,16,32,3,30,29,3,29,17,3,17,23,3,23,18,3,18,30,4,31,32,4,32,20,4,20, +24,4,24,19,4,19,31,5,21,22,5,22,15,5,15,25,5,25,13,5,13,21,6,22,21,6,21,14,6,14, +26,6,26,16,6,16,22,7,24,23,7,23,17,7,17,27,7,27,19,7,19,24,8,23,24,8,24,20,8,20, +28,8,28,18,8,18,23,9,25,27,9,27,17,9,17,29,9,29,13,9,13,25,10,28,26,10,26,14,10, +14,30,10,30,18,10,18,28,11,27,25,11,25,15,11,15,31,11,31,19,11,19,27,12,26,28, +12,28,20,12,20,32,12,32,16,12,16,26 } + +local cryptn = { 2,5,11,15,49,48,3,4,44,43,12,3,1,48,47,28,27,4,5,11,15,49,4,2, +27,26,21,25,5,1,48,47,28,5,3,25,24,45,44,1,2,27,26,21,1,4,44,43,12,11,2,3,25,24, +45,7,10,16,20,54,53,8,9,59,58,17,8,6,53,52,23,22,9,10,16,20,54,9,7,22,21,26,30, +10,6,53,52,23,10,8,30,29,60,59,6,7,22,21,26,6,9,59,58,17,16,7,8,30,29,60,12,15, +1,5,44,43,13,14,49,48,2,13,11,43,42,33,32,14,15,1,5,44,14,12,32,31,36,40,15,11, +43,42,33,15,13,40,39,50,49,11,12,32,31,36,11,14,49,48,2,1,12,13,40,39,50,17,20, +6,10,59,58,18,19,54,53,7,18,16,58,57,38,37,19,20,6,10,59,19,17,37,36,31,35,20 +,16,58,57,38,20,18,35,34,55,54,16,17,37,36,31,16,19,54,53,7,6,17,18,35,34,55,22, +25,26,30,9,8,23,24,4,3,27,23,21,8,7,53,52,24,25,26,30,9,24,22,52,51,41,45,25,21, +8,7,53,25,23,45,44,5,4,21,22,52,51,41,21,24,4,3,27,26,22,23,45,44,5,27,30,21,25, +4,3,28,29,9,8,22,28,26,3,2,48,47,29,30,21,25,4,29,27,47,46,56,60,30,26,3,2,48, +30,28,60,59,10,9,26,27,47,46,56,26,29,9,8,22,21,27,28,60,59,10,32,35,36,40,14, +13,33,34,19,18,37,33,31,13,12,43,42,34,35,36,40,14,34,32,42,41,51,55,35,31,13, +12,43,35,33,55,54,20,19,31,32,42,41,51,31,34,19,18,37,36,32,33,55,54,20,37,40, +31,35,19,18,38,39,14,13,32,38,36,18,17,58,57,39,40,31,35,19,39,37,57,56,46,50, +40,36,18,17,58,40,38,50,49,15,14,36,37,57,56,46,36,39,14,13,32,31,37,38,50,49, +15,42,45,51,55,34,33,43,44,24,23,52,43,41,33,32,13,12,44,45,51,55,34,44,42,12, +11,1,5,45,41,33,32,13,45,43,5,4,25,24,41,42,12,11,1,41,44,24,23,52,51,42,43,5,4, +25,47,50,56,60,29,28,48,49,39,38,57,48,46,28,27,3,2,49,50,56,60,29,49,47,2,1,11, +15,50,46,28,27,3,50,48,15,14,40,39,46,47,2,1,11,46,49,39,38,57,56,47,48,15,14, +40,52,55,41,45,24,23,53,54,34,33,42,53,51,23,22,8,7,54,55,41,45,24,54,52,7,6,16, +20,55,51,23,22,8,55,53,20,19,35,34,51,52,7,6,16,51,54,34,33,42,41,52,53,20,19, +35,57,60,46,50,39,38,58,59,29,28,47,58,56,38,37,18,17,59,60,46,50,39,59,57,17, +16,6,10,60,56,38,37,18,60,58,10,9,30,29,56,57,17,16,6,56,59,29,28,47,46,57,58, +10,9,30 } + +local crypts = {3,4,5,6,1,7,8,2,9,10,11} + +local cryptt = { 7,0,0,-1,-1,3,6,1,0,-4,3,6,6,0,0,1,4,2,6,0,1,3,-2,8,5,2,0,-9,6, +11,5,1,0,2,7,5,5,1,1,6,8,13,5,0,1,4,9,7,5,0,2,8,-5,15,4,3,0,-16,11,18,4,2,0,5, +12,10,4,2,1,11,13,20,4,1,1,7,14,12,4,1,2,13,15,22,4,0,2,9,16,14,4,0,3,15,-10,24, +3,4,0,-25,18,27,3,3,0,10,19,17,3,3,1,18,20,29,3,2,1,12,21,19,3,2,2,20,22,31,3,1, +2,14,23,21,3,1,3,22,24,33,3,0,3,16,25,23,3,0,4,24,-17,35,2,5,0,-36,27,38,2,4,0, +17,28,26,2,4,1,27,29,40,2,3,1,19,30,28,2,3,2,29,31,42,2,2,2,21,32,30,2,2,3,31, +33,44,2,1,3,23,34,32,2,1,4,33,35,46,2,0,4,25,36,34,2,0,5,35,-26,48,1,6,0,-49,38, +51,1,5,0,26,39,37,1,5,1,38,40,53,1,4,1,28,41,39,1,4,2,40,42,55,1,3,2,30,43,41,1, +3,3,42,44,57,1,2,3,32,45,43,1,2,4,44,46,59,1,1,4,34,47,45,1,1,5,46,48,61,1,0,5, +36,49,47,1,0,6,48,-37,63,0,7,0,-64,51,-64,0,6,0,37,52,50,0,6,1,51,53,-62,0,5,1, +39,54,52,0,5,2,53,55,-60,0,4,2,41,56,54,0,4,3,55,57,-58,0,3,3,43,58,56,0,3,4,57, +59,-56,0,2,4,45,60,58,0,2,5,59,61,-54,0,1,5,47,62,60,0,1,6,61,63,-52,0,0,6,49, +64,62,0,0,7,63,-50,-50 } + +function Ancient.cryptf1(a) + local b = cryptt[a*6-5] + local c = cryptt[a*6-4] + local d = cryptt[a*6-3] + if not (b + c + d == 6) then + return {{(b + 1)/cryptc, c/cryptc, d/cryptc},{b/cryptc, (c + 1)/cryptc, d/cryptc},{b/cryptc, c/cryptc, (d + 1)/cryptc}} + else + return {{b/cryptc, (c + 1)/cryptc, (d + 1)/cryptc},{(b + 1)/cryptc, c/cryptc, (d + 1)/cryptc},{(b + 1)/cryptc, (c + 1)/cryptc, d/cryptc}} + end +end + +function Ancient.cryptf2(a,b,c,d) + local e = {a[1],a[2],a[3]} + local f = {b[1],b[2],b[3]} + local g = {c[1],c[2],c[3]} + if d then + for _, h in pairs(d) do + local w = Ancient.cryptf1(h) + local n2a = { + e[1] * w[1][1] + f[1] * w[1][2] + g[1] * w[1][3], + e[2] * w[1][1] + f[2] * w[1][2] + g[2] * w[1][3], + e[3] * w[1][1] + f[3] * w[1][2] + g[3] * w[1][3] + } + local n2b = { + e[1] * w[2][1] + f[1] * w[2][2] + g[1] * w[2][3], + e[2] * w[2][1] + f[2] * w[2][2] + g[2] * w[2][3], + e[3] * w[2][1] + f[3] * w[2][2] + g[3] * w[2][3] + } + local n2c = { + e[1] * w[3][1] + f[1] * w[3][2] + g[1] * w[3][3], + e[2] * w[3][1] + f[2] * w[3][2] + g[2] * w[3][3], + e[3] * w[3][1] + f[3] * w[3][2] + g[3] * w[3][3] + } + e = n2a + f = n2b + g = n2c + end + end + return {e, f, g} +end + +function Ancient.cryptf3 (a) + local b = math.sqrt(a[1]*a[1] + a[2]*a[2] + a[3]*a[3]) + return {a[1]/b, a[2]/b, a[3]/b} +end + +function Ancient.cryptf4(a, b) + local c = Ancient.cryptf5(a) + local d = Ancient.cryptf2(c[1],c[2],c[3],b) + return Ancient.cryptf3({ + (d[1][1] + d[2][1] + d[3][1])/3, + (d[1][2] + d[2][2] + d[3][2])/3, + (d[1][3] + d[2][3] + d[3][3])/3 + }) +end + +function Ancient.cryptf4b(a) + local b = Ancient.gtf(a[1]) + local c = {} + for i, j in pairs(a) do + if i ~= 1 then table.insert(c, Ancient.gtt(j)) end + end + return Ancient.cryptf4(b, c) +end + +function Ancient.cryptf5(a) + local b = cryptv[a*3-2] + local c = cryptv[a*3-1] + local d = cryptv[a*3] + return { + Ancient.cryptf3({cryptx[b*3-2], cryptx[b*3-1], cryptx[b*3]}), + Ancient.cryptf3({cryptx[c*3-2], cryptx[c*3-1], cryptx[c*3]}), + Ancient.cryptf3({cryptx[d*3-2], cryptx[d*3-1], cryptx[d*3]})} +end + +function Ancient.ftg(a) + if not global.ftg then + local ftg = {} + for i = 1, crypti, 1 do ftg[i] = i end + Util.shuffle(ftg) + global.ftg = ftg + end + if a then return global.ftg[a] end +end + +function Ancient.gtf(a) + if not global.gtf then + Ancient.ftg() + local gtf = {} + for i, j in pairs(global.ftg) do gtf[j] = i end + global.gtf = gtf + end + if a then return global.gtf[a] end +end + +function Ancient.gtt(a) + if not global.gtt then + local gtt = {} + for i = 2, crypti+3, 1 do + if not(i == 31 or i == 50) then gtt[#gtt+1] = i end + end + Util.shuffle(gtt) + gtt[#gtt+1] = #gtt-10 + gtt[#gtt+1] = #gtt+3 + gtt[#gtt+1] = 1 + gtt[#gtt+1] = (#gtt-1)/2 + global.gtt = gtt + end + if a then return global.gtt[a] end +end + +function Ancient.ttg(a) + if not global.ttg then + Ancient.gtt() + local ttg = {} + for i, j in pairs(global.gtt) do ttg[j] = i end + global.ttg = ttg + end + if a then return global.ttg[a] end +end + +function Ancient.cryptf6() + if global.hcoord then return end + Ancient.ftg() + Ancient.gtt() + local a = {} + for i = 1, crypti, 1 do a[i] = i end + Util.shuffle(a) + local gdp = a[crypti] + local gdpf = Ancient.gtf(gdp) + a[crypti] = crypti+1 + a[crypti+1] = crypti+2 + a[crypti+2] = crypti+3 + a[crypti+3] = crypti+4 + Util.shuffle(a) + local gda = {} + local gdat = {} + local gds = gdp + for i = 1, cryptc-1, 1 do + gda[i] = a[i] + gdat[i] = Ancient.gtt(a[i]) + gds = gds .. "|" .. a[i] + end + global.hcoord = Ancient.cryptf4(gdpf, gdat) + global.gds = sha2.hash256(gds) + local vgo = {} + for i, j in pairs(gda) do if j <= 60 then vgo[#vgo + 1] = j end end + local b = Ancient.ftg(cryptn[(gdpf-1)*crypte + math.random(1,crypte)]) + if not Util.table_contains(vgo, b) then vgo[#vgo + 1] = b end + while #vgo < 20 do + local c = math.random(1,60) + if c ~= gdp and not Util.table_contains(vgo, c) then vgo[#vgo + 1] = c end + end + Util.shuffle(vgo) + local d = math.random(41,crypti) + local e = table.deepcopy(global.ftg) + Util.shuffle(e) + for i, j in pairs(e) do + if #vgo == d - 1 then vgo[#vgo + 1] = gdp end + if j ~= gdp and not Util.table_contains(vgo, j)then vgo[#vgo + 1] = j end + end + global.vgo = vgo + local gco = {} + local f = {gdp} + for i = 1, crypte, 1 do f[#f + 1] = Ancient.ftg(cryptn[(gdpf-1)*crypte+i]) end + for i = 1, crypti, 1 do if not Util.table_contains(f, i) then gco[#gco+1] = i end end + Util.shuffle(gco) + for i = 31, crypti, 1 do f[#f+1] = gco[i] gco[i] = nil end + Util.shuffle(f) + for i, j in pairs(f) do gco[#gco+1] = j end + global.gco = gco +end + +function Ancient.cryptf7(a) + a = table.deepcopy(a) + for b,c in pairs(a) do + a[b]=c*-1 + end + return a +end + +function Ancient.place_cartouche_a(surface, glyph, position) + local x = position.x or position[1] + local y = position.y or position[2] + + surface.request_to_generate_chunks({x,y}, 1) + surface.force_generate_chunk_requests() + local entity + entity = surface.create_entity{ + name = mod_prefix .. "cartouche-a", + position = {x,y} + } + entity.destructible = false + entity = surface.create_entity{ + name = mod_prefix .. "glyph-a-" .. glyph , + position = {x,y-6/32} + } + entity.destructible = false + for j = 1, crypte, 1 do + local k = cryptn[(Ancient.gtf(glyph)-1) * crypte + crypts[j]] + local jy = Util.cos((j-1)/crypte * 2 * Util.pi) * 4.5 + local jx = Util.sin((j-1)/crypte * 2 * Util.pi) * 6.32 + entity = surface.create_entity{ + name = mod_prefix .. "glyph-a-" .. Ancient.ftg(k).."-small", + position = {x + jx, y + jy - 4/32} + } + entity.destructible = false + end +end + +function Ancient.place_cartouche_b(surface, glyph, position) + local entity + local x = position.x or position[1] + local y = position.y or position[2] + local tes = Ancient.gtt(glyph) + surface.request_to_generate_chunks({x,y}, 1) + surface.force_generate_chunk_requests() + if cryptt[tes*6-5] + cryptt[tes*6-4] + cryptt[tes*6-3] > 6 then + entity = surface.create_entity{ + name = mod_prefix .. "cartouche-b-a", + position = {x,y} + } + entity.destructible = false + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. tes, + position = {x,y-cryptc/32} + } + entity.destructible = false + if cryptt[tes*6-2] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[tes*6-2].."-small", + position = {x-1.6, y-0.5} + } + entity.destructible = false + end + if cryptt[tes*6-1] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[tes*6-1] .."-small", + position = {x+1.6, y-0.5} + } + entity.destructible = false + end + if cryptt[tes*6] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[tes*6] .."-small", + position = {x, y+1.5} + } + entity.destructible = false + end + else + entity = surface.create_entity{ + name = mod_prefix .. "cartouche-b-b", + position = {x,y} + } + entity.destructible = false + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. tes, + position = {x,y+4/32} + } + entity.destructible = false + if cryptt[tes*6-2] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[tes*6-2].."-small", + position = {x, y-1.5} + } + entity.destructible = false + end + if cryptt[tes*6-1] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[tes*6-1] .."-small", + position = {x+1.6, y+0.5} + } + entity.destructible = false + end + if cryptt[tes*6] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[tes*6] .."-small", + position = {x-1.6, y+0.5} + } + entity.destructible = false + end + + end +end + +function Ancient.assign_zone_next_glyph(zone) + if not(zone.type == "planet" and zone.glyph==nil) then return end + if zone.name == "Nauvis" or zone.is_homeworld or zone.ruins then return end + Ancient.cryptf6() + for _, g in pairs(global.vgo) do + global.glyph_vaults = global.glyph_vaults or {} + if not global.glyph_vaults[g] then + zone.glyph = g + global.glyph_vaults[g] = {} + global.glyph_vaults[g][zone.index] = { + glyph = g, + zone_index = zone.index + } + if zone.surface_index then + Ancient.make_vault_exterior(zone) + end + return + end + end +end + +function Ancient.make_vault_exterior(zone) + + if zone.glyph == nil or zone.surface_index == nil then return end + if zone.vault_pyramid and (not zone.vault_pyramid.valid) then + zone.vault_pyramid = nil + end + if zone.vault_pyramid then return end + + local zone_surface = Zone.get_make_surface(zone) + if not zone.seed then + zone.seed = zone_surface.map_gen_settings.seed + end + local zrng = game.create_random_generator(zone.seed) + + local glyph = zone.glyph + local pyramid_pos = zone.vault_pyramid_position or nil + + if not pyramid_pos then + local base_pos + for i = 1, 4, 1 do + base_pos = {zrng(-256,256),zrng(-256,256)} + zone_surface.request_to_generate_chunks(base_pos, 4) + zone_surface.force_generate_chunk_requests() + pyramid_pos = zone_surface.find_non_colliding_position(mod_prefix .. "pyramid-a", base_pos, 256, 1) + if pyramid_pos then break end + end + if not pyramid_pos then pyramid_pos = base_pos end + end + + local entity = Ancient.vault_entrance_structures[zrng(1,#Ancient.vault_entrance_structures)] + local box = game.entity_prototypes[entity].collision_box + local area = util.area_add_position(box, pyramid_pos) + local entities = zone_surface.find_entities_filtered{ + area = area + } + for _, entity in pairs(entities) do + entity.destroy() + end + local pyramid = zone_surface.create_entity{ + name = entity, + position = pyramid_pos + } + pyramid.destructible = false + zone.vault_pyramid = pyramid + zone.vault_pyramid_position = pyramid_pos +end + +function Ancient.make_vault_interior(zone) + + if zone.glyph == nil or zone.vault_pyramid == nil then return end + if global.glyph_vaults[zone.glyph][zone.index].surface_index and game.surfaces[global.glyph_vaults[zone.glyph][zone.index].surface_index] then + return -- already exists + end + + local glyph = zone.glyph + + local surface_name = Ancient.vault_surface_name(zone, glyph) + if game.surfaces[surface_name] then + global.glyph_vaults[glyph][zone.index].surface_index = game.surfaces[surface_name].index + return + end + + local tile = "mineral-beige-dirt-1" + + local map_gen_settings = { + autoplace_controls = { + ["planet-size"] = { frequency = 1/1000, size = 1 } + } + } + map_gen_settings.seed = glyph * 10000000 + map_gen_settings.cliff_settings = {richness = 0} + map_gen_settings.autoplace_settings={ + ["decorative"]={ + treat_missing_as_default=false, + settings={ + ['rock-medium-beige'] = {}, + ['rock-small-beige'] = {}, + ['rock-tiny-beige'] = {} + } + }, + ["entity"]={ + treat_missing_as_default=false, + settings={ + ['rock-huge-beige'] = {}, + ['rock-big-beige'] = {}, + ['biter-spawner'] = {}, + ['spitter-spawner'] = {}, + } + }, + ["tile"]={ + treat_missing_as_default=false, + settings={ + --[mod_prefix.. "regolith"]={}, + [tile]={}, + ["out-of-map"]={} + } + }, + } + map_gen_settings.property_expression_names = { + ["tile:"..tile..":probability"] = "vault-land-probability", + ["tile:out-of-map:probability"] = 0, + ["entity:biter-spawner:probability"] = 0, + ["entity:spitter-spawner:probability"] = 0, + } + + local surface = game.create_surface(surface_name, map_gen_settings) + + surface.freeze_daytime = true + surface.daytime = 0.5 -- night + surface.min_brightness = 0.02 + + surface.request_to_generate_chunks({0,0}, 2) + surface.request_to_generate_chunks({0,32*1}, 2) + surface.request_to_generate_chunks({0,32*2}, 2) + surface.force_generate_chunk_requests() + + map_gen_settings.property_expression_names["entity:biter-spawner:probability"] = 0.01 + surface.map_gen_settings = map_gen_settings + surface.regenerate_entity({"biter-spawner"}) + map_gen_settings.property_expression_names["entity:spitter-spawner:probability"] = 0.05 + surface.map_gen_settings = map_gen_settings + surface.regenerate_entity({"spitter-spawner"}) + map_gen_settings.property_expression_names["entity:biter-spawner:probability"] = 0.05 + surface.map_gen_settings = map_gen_settings + local entities = surface.find_entities_filtered{ + force = "enemy", + area = {{-9,-11},{9,Ancient.cartouche_path_wall_end}} + } + for _, entity in pairs(entities) do entity.destroy() end + + + local tiles = {} + for i = -Ancient.cartouche_path_width/2,Ancient.cartouche_path_width/2,1 do + for j = Ancient.cartouche_path_start,Ancient.cartouche_path_wall_start,1 do + table.insert(tiles, {name = tile, position = {x=i,y=j}}) + end + end + + for i = -Ancient.cartouche_path_wall_width/2,Ancient.cartouche_path_wall_width/2,1 do + for j = Ancient.cartouche_path_wall_start+1,Ancient.cartouche_path_end,1 do + if i >= -Ancient.cartouche_path_width/2 and i <= Ancient.cartouche_path_width/2 then + table.insert(tiles, {name = tile, position = {x=i,y=j}}) + else + table.insert(tiles, {name = "out-of-map", position = {x=i,y=j}}) + end + end + end + + for i = -Ancient.cartouche_path_wall_width/2,Ancient.cartouche_path_wall_width/2,1 do + for j = Ancient.cartouche_path_end+1,Ancient.cartouche_path_wall_end,1 do + table.insert(tiles, {name = "out-of-map", position = {x=i,y=j}}) + end + end + + surface.set_tiles(tiles, true) + local light = surface.create_entity{ + name="se-lightbeam-a", + position = {0,Ancient.cartouche_path_end}, + target={0,0}, + speed = 0 + } + light.destructible = false + + Ancient.place_cartouche_a(surface, glyph, {x=0,y=-6}) + Ancient.place_cartouche_b(surface, glyph, {x=0,y=4}) + local items = {"productivity-module-", "speed-module-", "effectivity-module-"} + local chest = surface.create_entity{ + name = mod_prefix .. "cartouche-chest", + position = {0, -14}, + force = "neutral" + } + chest.destructible = false + + -- mark that the module has been generated + global.glyph_vaults_made_loot = global.glyph_vaults_made_loot or {} + if not global.glyph_vaults_made_loot[glyph] then + chest.insert({name = items[Ancient.gtf(zone.glyph)%#items+1].."9", amount = 1}) + global.glyph_vaults_made_loot[glyph] = true + end + + global.glyph_vaults[glyph][zone.index].surface_index = surface.index + +end + +function Ancient.vault_surface_name(zone, glyph) + if not glyph then glyph = zone.glyph end + return "Vault "..zone.index.."."..glyph +end + +function Ancient.vault_from_surface(surface) + if string.find(surface.name, "Vault ", 1, true) then + for glyph, vaults in pairs(global.glyph_vaults) do + for zone_index, try_vault in pairs(vaults) do + if try_vault.surface_index == surface.index then + return try_vault + end + end + end + end +end + +function Ancient.make_test_surface() + + if game.surfaces["vault-test"] then + game.delete_surface("vault-test") + end + + Ancient.ftg() + + local map_gen_settings = { + autoplace_controls = { + ["planet-size"] = { frequency = 1/1000, size = 1 } + } + } + map_gen_settings.autoplace_settings={ + ["decorative"]={ + treat_missing_as_default=false, + settings={ + ['rock-medium-beige'] = {}, + ['rock-small-beige'] = {}, + ['rock-tiny-beige'] = {} + } + }, + ["entity"]={ + treat_missing_as_default=false, + settings={ + ['rock-huge-beige'] = {}, + ['rock-big-beige'] = {}, + } + }, + ["tile"]={ + treat_missing_as_default=false, + settings={ + --[mod_prefix.. "regolith"]={}, + ["mineral-beige-dirt-1"]={}, + ["out-of-map"]={} + } + }, + } + map_gen_settings.property_expression_names = { + ["tile:mineral-beige-dirt-1:probability"] = "vault-land-probability", + ["tile:out-of-map:probability"] = 0 + } + + local surface = game.create_surface("vault-test", map_gen_settings) + + surface.freeze_daytime = true + surface.daytime = 0.5 -- night + + surface.request_to_generate_chunks({0,0}, 1) + surface.force_generate_chunk_requests() + game.players[1].teleport({0,0}, surface) + local entity + + for k = 1, crypti, 1 do + local x = (k-1)%cryptc * 16 - 200 + local y = math.floor((k-1)/cryptc)* 20 + surface.request_to_generate_chunks({x,y}, 1) + surface.force_generate_chunk_requests() + entity = surface.create_entity{ + name = mod_prefix .. "cartouche-a", + position = {x,y} + } + entity.destructible = false + entity = surface.create_entity{ + name = mod_prefix .. "glyph-a-" .. Ancient.ftg(k), + position = {x,y-6/32} + } + entity.destructible = false + for j = 1, crypte, 1 do + local k = cryptn[(k-1) * crypte + crypts[j]] + local jy = Util.cos((j-1)/crypte * 2 * Util.pi) * 4.5 + local jx = Util.sin((j-1)/crypte * 2 * Util.pi) * 6.32 + entity = surface.create_entity{ + name = mod_prefix .. "glyph-a-" .. Ancient.ftg(k).."-small", + position = {x + jx, y + jy - 4/32} + } + entity.destructible = false + end + y = y + 8 + + i = Ancient.gtt(Ancient.ftg(k)) + + + surface.request_to_generate_chunks({x,y}, 1) + surface.force_generate_chunk_requests() + if cryptt[i*6-5] + cryptt[i*6-4] + cryptt[i*6-3] > 6 then + entity = surface.create_entity{ + name = mod_prefix .. "cartouche-b-a", + position = {x,y} + } + entity.destructible = false + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. i, + position = {x,y-cryptc/32} + } + entity.destructible = false + if cryptt[i*6-2] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6-2].."-small", + position = {x-1.6, y-0.5} + } + entity.destructible = false + end + if cryptt[i*6-1] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6-1] .."-small", + position = {x+1.6, y-0.5} + } + entity.destructible = false + end + if cryptt[i*6] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6] .."-small", + position = {x, y+1.5} + } + entity.destructible = false + end + else + entity = surface.create_entity{ + name = mod_prefix .. "cartouche-b-b", + position = {x,y} + } + entity.destructible = false + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. i, + position = {x,y+4/32} + } + entity.destructible = false + if cryptt[i*6-2] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6-2].."-small", + position = {x, y-1.5} + } + entity.destructible = false + end + if cryptt[i*6-1] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6-1] .."-small", + position = {x+1.6, y+0.5} + } + entity.destructible = false + end + if cryptt[i*6] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6] .."-small", + position = {x-1.6, y+0.5} + } + entity.destructible = false + end + + end + + + end + + for i = 1, crypti, 1 do + local x = (i-1)%cryptc * 16 + local y = math.floor((i-1)/cryptc)* 12 + surface.request_to_generate_chunks({x,y}, 1) + surface.force_generate_chunk_requests() + entity = surface.create_entity{ + name = mod_prefix .. "cartouche-a", + position = {x,y} + } + entity.destructible = false + entity = surface.create_entity{ + name = mod_prefix .. "glyph-a-" .. Ancient.ftg(i), + position = {x,y-6/32} + } + entity.destructible = false + for j = 1, crypte, 1 do + local k = cryptn[(i-1) * crypte + crypts[j]] + local jy = Util.cos((j-1)/crypte * 2 * Util.pi) * 4.5 + local jx = Util.sin((j-1)/crypte * 2 * Util.pi) * 6.32 + entity = surface.create_entity{ + name = mod_prefix .. "glyph-a-" .. Ancient.ftg(k).."-small", + position = {x + jx, y + jy - 4/32} + } + entity.destructible = false + end + end + + for i = 1, crypti+4, 1 do + local x = -16 - (i-1)%cryptc * cryptc + local y = math.floor((i-1)/cryptc)* 5 + y = - 16 - cryptt[i*6-5] * 5 + x = (-cryptt[i*6-4] + cryptt[i*6-3]) * 8 + surface.request_to_generate_chunks({x,y}, 1) + surface.force_generate_chunk_requests() + if cryptt[i*6-5] + cryptt[i*6-4] + cryptt[i*6-3] > 6 then + entity = surface.create_entity{ + name = mod_prefix .. "cartouche-b-a", + position = {x,y} + } + entity.destructible = false + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. i, + position = {x,y-cryptc/32} + } + entity.destructible = false + if cryptt[i*6-2] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6-2].."-small", + position = {x-1.6, y-0.5} + } + entity.destructible = false + end + if cryptt[i*6-1] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6-1] .."-small", + position = {x+1.6, y-0.5} + } + entity.destructible = false + end + if cryptt[i*6] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6] .."-small", + position = {x, y+1.5} + } + entity.destructible = false + end + else + entity = surface.create_entity{ + name = mod_prefix .. "cartouche-b-b", + position = {x,y} + } + entity.destructible = false + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. i, + position = {x,y+4/32} + } + entity.destructible = false + if cryptt[i*6-2] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6-2].."-small", + position = {x, y-1.5} + } + entity.destructible = false + end + if cryptt[i*6-1] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6-1] .."-small", + position = {x+1.6, y+0.5} + } + entity.destructible = false + end + if cryptt[i*6] > 0 then + entity = surface.create_entity{ + name = mod_prefix .. "glyph-b-" .. cryptt[i*6] .."-small", + position = {x-1.6, y+0.5} + } + entity.destructible = false + end + + end + + end + + return surface +end + +function Ancient.make_gate_blockers(surface, position, set, name) + for y, row in pairs(set) do + for _, start_end in pairs(row) do + for x = start_end[1], start_end[2]-1, 1 do + local entity = surface.create_entity{ + name = name, + position = {x = position.x + x, y = position.y + y} + } + entity.destructible = false + end + end + end +end + +function Ancient.make_gate_phase_1_blockers(surface, position) + Ancient.make_gate_blockers(surface, position, Ancient.gate_blockers_phase_1, Ancient.name_gate_blocker) +end + +function Ancient.make_gate_phase_1_void_blockers(surface, position) + Ancient.make_gate_blockers(surface, position, Ancient.gate_blockers_void_phase_1, Ancient.name_gate_blocker_void) +end + +function Ancient.make_gate_phase_2_blockers(surface, position) + Ancient.make_gate_blockers(surface, position, Ancient.gate_blockers_phase_2, Ancient.name_gate_blocker) +end + +function Ancient.make_gate_phase_2_void_blockers(surface, position) + Ancient.make_gate_blockers(surface, position, Ancient.gate_blockers_void_phase_2, Ancient.name_gate_blocker_void) +end + +function Ancient.make_gate(position) + -- gate middle X tile is effectivly at +0.5 + -- gate middle is along the actual y + Ancient.cryptf6() + local gate = { + status = "fragments", + status_progress = 0, + rotation = 0, + rotation_velocity = 0, -- -1 to 1 + rotation_direction = 0, -- -1 to 1 + } + + global.gate = gate + gate.position = position + local zone = Zone.from_name("Foenestra") + local surface = Zone.get_make_surface(zone) + gate.surface = surface + gate.void_sprite = rendering.draw_sprite({ + sprite= Ancient.name_gate_void_sprite, + --sprite = "file/__space-exploration-graphics__/graphics/entity/gate/hr/void.png", + --sprite = "virtual-signal.se-star", + surface = surface, + x_scale = 4, + y_scale = 4, + render_layer = "28", -- just above decals + target = position, + }) + Ancient.make_gate_phase_1_blockers(surface, position) + Ancient.make_gate_phase_1_void_blockers(surface, position) + + for fragment_name, fragment in pairs(Ancient.gate_fragments) do + local entity = surface.create_entity{ + name = fragment_name, + position = {x = position.x + fragment.position.x, y = position.y + fragment.position.y} + } + entity.destructible = false + end + +end + +function Ancient.check_gate_fragments() + local gate = global.gate + if not (gate and gate.status == "fragments") then return end + local zone = Zone.from_name("Foenestra") + local surface = Zone.get_make_surface(zone) + + for fragment_name, fragment in pairs(Ancient.gate_fragments) do + if fragment.placeable then + local entity = surface.find_entity(fragment_name, { + x = gate.position.x + fragment.required_position[1], + y = gate.position.y + fragment.required_position[2] + }) + if not entity then + return + end + end + end + Ancient.gate_phase_2(gate) +end + +function Ancient.gate_phase_2(gate) + gate.status = "scaffold" + local surface = gate.surface + + -- all here + local fragment_names = {} + for fragment_name, fragment in pairs(Ancient.gate_fragments) do + table.insert(fragment_names, fragment_name) + end + + local entities = surface.find_entities_filtered{name = fragment_names} + for _, entity in pairs(entities) do + entity.destroy() + end + + Ancient.make_gate_phase_2_blockers(surface, gate.position) + Ancient.make_gate_phase_2_void_blockers(surface, gate.position) + + for part_name, position in pairs(Ancient.gate_parts_main) do + local entity = surface.create_entity{ + name = part_name, + position = {x = gate.position.x + position[1], y = gate.position.y + position[2]} + } + entity.destructible = false + end + + for part_name, position in pairs(Ancient.gate_parts_main_shadow) do + local entity = surface.create_entity{ + name = part_name, + position = {x = gate.position.x + position[1], y = gate.position.y + position[2]} + } + entity.destructible = false + end + + for part_name, position in pairs(Ancient.gate_parts_underlay) do + local entity = surface.create_entity{ + name = part_name, + position = {x = gate.position.x + position[1], y = gate.position.y + position[2]} + } + entity.destructible = false + end + + local entity = surface.create_entity{ + name = Ancient.name_gate_light_middle, + target = {x = gate.position.x, y = gate.position.y + 1}, + position = {x = gate.position.x, y = gate.position.y}, + speed = 0 + } + entity.destructible = false + + gate.lock_switches = {} + local i = 0 + for part_name, position in pairs(Ancient.gate_parts_rails) do + i = i + 1 + local entity = surface.create_entity{ + name = part_name, + position = {x = gate.position.x + position[1], y = gate.position.y + position[2]} + } + entity.destructible = false + local entity = surface.create_entity{ + name = Ancient.name_gate_light, + target = {x = gate.position.x + position[1], y = gate.position.y + position[2] + 1}, + position = {x = gate.position.x + position[1], y = gate.position.y + position[2]}, + speed = 0 + } + entity.destructible = false + gate.lock_switches[i] = surface.create_entity{ + name = Ancient.name_gate_lock_switch, + position = {x = gate.position.x + position[1], y = gate.position.y + position[2]}, + force = "neutral" + } + gate.lock_switches[i].destructible = false + end + + gate.shunts = {} + for i, part in pairs(Ancient.gate_parts_shunts) do + gate.shunts[i] = surface.create_entity{ + name = part.name, + position = {x = gate.position.x + part.position[1], y = gate.position.y + part.position[2]} + } + gate.shunts[i].destructible = false + end + + gate.platform_scaffold = surface.create_entity{ + name = Ancient.gate_parts_platform.name_scaffold, + position = {x = gate.position.x + Ancient.gate_parts_platform.position[1], y = gate.position.y + Ancient.gate_parts_platform.position[2]}, + force = "neutral" + } + gate.platform_scaffold.destructible = false + + Ancient.update_unlocks() + +end + +function Ancient.gate_phase_3(gate) + local surface = gate.surface + gate.status = "unpowered" + gate.status_progress = 0 + if gate.platform_scaffold and gate.platform_scaffold.valid then + -- give back any excess + local inv = gate.platform_scaffold.get_inventory(defines.inventory.assembling_machine_input) + if not inv.is_empty() then + local pos = gate.platform_scaffold.position + pos.x = pos.x - 8 + pos.y = pos.y - 1 + if not (gate.overflow_chest and gate.overflow_chest.valid) then + gate.overflow_chest = gate.platform_scaffold.surface.create_entity{ + name = "steel-chest", + force = gate.platform_scaffold.force, + position = pos + } + end + for name, count in pairs(inv.get_contents()) do + gate.overflow_chest.insert({name=name, count=count}) + end + end + gate.platform_scaffold.destroy() + end + gate.platform_scaffold = nil + + for part_name, position in pairs(Ancient.gate_parts_addons) do + local entity = surface.create_entity{ + name = part_name, + position = {x = gate.position.x + position[1], y = gate.position.y + position[2]} + } + entity.destructible = false + end + + gate.lock_combinators = {} + for i, part in pairs(Ancient.gate_parts_lock_combinators) do + gate.lock_combinators[i] = surface.create_entity{ + name = Ancient.name_gate_lock_combinator, + position = {x = gate.position.x + part.position[1], y = gate.position.y + part.position[2]}, + direction = part.direction, + force = "neutral" + } + gate.lock_combinators[i].destructible = false + gate.lock_combinators[i].operable = false + gate.lock_combinators[i].rotatable = false + end + + gate.lock_fluid_inputs = {} + for i, part in pairs(Ancient.gate_parts_lock_fluid_inputs) do + gate.lock_fluid_inputs[i] = surface.create_entity{ + name = Ancient.name_gate_fluid_input, + position = {x = gate.position.x + part.position[1], y = gate.position.y + part.position[2]}, + direction = part.direction, + force = "neutral" + } + gate.lock_fluid_inputs[i].destructible = false + gate.lock_fluid_inputs[i].rotatable = false + end + + gate.lock_fluid_outputs = {} + for i, part in pairs(Ancient.gate_parts_lock_fluid_outputs) do + gate.lock_fluid_outputs[i] = surface.create_entity{ + name = Ancient.name_gate_fluid_output, + position = {x = gate.position.x + part.position[1], y = gate.position.y + part.position[2]}, + direction = part.direction, + force = "neutral" + } + gate.lock_fluid_outputs[i].destructible = false + gate.lock_fluid_outputs[i].rotatable = false + end + + entity = surface.create_entity{ + name = Ancient.gate_parts_platform.name, + position = {x = gate.position.x + Ancient.gate_parts_platform.position[1], y = gate.position.y + Ancient.gate_parts_platform.position[2]} + } + entity.destructible = false + + gate.platform_combinator = surface.create_entity{ + name = Ancient.gate_parts_platform.combinator.name, + position = {x = gate.position.x + Ancient.gate_parts_platform.combinator.position[1], y = gate.position.y + Ancient.gate_parts_platform.combinator.position[2]}, + direction = defines.direction.east, + force = "neutral" + } + gate.platform_combinator.destructible = false + gate.platform_combinator.rotatable = false + + gate.platform_energy_interfaces = {} + gate.platform_energy_interfaces[9] = surface.create_entity{ + name = Ancient.gate_parts_platform.energy_interface.name, + position = {x = gate.position.x + Ancient.gate_parts_platform.energy_interface.position[1], y = gate.position.y + Ancient.gate_parts_platform.energy_interface.position[2]}, + direction = defines.direction.north, + force = "neutral" + } + gate.platform_energy_interfaces[9].destructible = false + gate.platform_energy_interfaces[9].rotatable = false + + gate.buttons = {} + gate.buttons.left_switch = surface.create_entity{ + name = Ancient.gate_parts_platform.buttons.name_switch, + position = { + x = gate.position.x + Ancient.gate_parts_platform.buttons.left.switch_position[1], + y = gate.position.y + Ancient.gate_parts_platform.buttons.left.switch_position[2]}, + force = "neutral" + } + gate.buttons.left_switch.destructible = false + gate.buttons.left_display = surface.create_entity{ + name = Ancient.gate_parts_platform.buttons.left.name, + position = { + x = gate.position.x + Ancient.gate_parts_platform.buttons.left.position[1], + y = gate.position.y + Ancient.gate_parts_platform.buttons.left.position[2]} + } + gate.buttons.left_display.graphics_variation = 1 + gate.buttons.left_display.destructible = false + + gate.buttons.middle_switch = surface.create_entity{ + name = Ancient.gate_parts_platform.buttons.name_switch, + position = { + x = gate.position.x + Ancient.gate_parts_platform.buttons.middle.switch_position[1], + y = gate.position.y + Ancient.gate_parts_platform.buttons.middle.switch_position[2]}, + force = "neutral" + } + gate.buttons.middle_switch.destructible = false + gate.buttons.middle_display = surface.create_entity{ + name = Ancient.gate_parts_platform.buttons.middle.name, + position = { + x = gate.position.x + Ancient.gate_parts_platform.buttons.middle.position[1], + y = gate.position.y + Ancient.gate_parts_platform.buttons.middle.position[2]} + } + gate.buttons.middle_display.graphics_variation = 1 + gate.buttons.middle_display.destructible = false + + gate.buttons.right_switch = surface.create_entity{ + name = Ancient.gate_parts_platform.buttons.name_switch, + position = { + x = gate.position.x + Ancient.gate_parts_platform.buttons.right.switch_position[1], + y = gate.position.y + Ancient.gate_parts_platform.buttons.right.switch_position[2]}, + force = "neutral" + } + gate.buttons.right_switch.destructible = false + gate.buttons.right_display = surface.create_entity{ + name = Ancient.gate_parts_platform.buttons.right.name, + position = { + x = gate.position.x + Ancient.gate_parts_platform.buttons.right.position[1], + y = gate.position.y + Ancient.gate_parts_platform.buttons.right.position[2]} + } + gate.buttons.right_display.graphics_variation = 1 + gate.buttons.right_display.destructible = false + + Ancient.gate_set_glyph_order(gate) + + gate.glyphs = {} + + + Ancient.update_unlocks() + +end + + + +function Ancient.gate_set_glyph_order(gate) + if gate.glyph_order then return end + local glyph_order = {} + for i = 1,64,1 do + glyph_order[i]=i + end + Util.shuffle(glyph_order) + gate.glyph_order = glyph_order +end + +function Ancient.gate_update_indicators_anchor(gate) + gate.indicators = gate.indicators or {} + gate.indicators.anchor = gate.indicators.anchor or {} + gate.indicators.anchor.statuses = gate.indicators.anchor.statuses or {} + gate.indicators.anchor.entities = gate.indicators.anchor.entities or {} + + local anchors = 0 + local active_anchors = 0 + if global.dimensional_anchors then + for zone_index, anchor in pairs(global.dimensional_anchors) do + anchors = anchors + 1 + if anchor.active then active_anchors = active_anchors + 1 end + end + end + + for i = 1,8,1 do + local status = 1 + if anchors >= i then + status = 2 + end + if active_anchors >= i then + status = 3 + end + if gate.indicators.anchor.statuses[i] ~= status then + gate.indicators.anchor.statuses[i] = status + if gate.indicators.anchor.entities[i] and gate.indicators.anchor.entities[i] then + gate.indicators.anchor.entities[i].destroy() + end + gate.indicators.anchor.entities[i] = gate.surface.create_entity{ + name = Ancient.gate_parts_platform.indicators.names[status], + position = { + x = gate.position.x + Ancient.gate_parts_platform.indicators.x_start + Ancient.gate_parts_platform.indicators.x_spacing * (i - 1), + y = gate.position.y + Ancient.gate_parts_platform.indicators.anchor_y} + } + end + end +end + +function Ancient.gate_update_indicators_temperature(gate) + gate.indicators = gate.indicators or {} + gate.indicators.temperature = gate.indicators.temperature or {} + gate.indicators.temperature.statuses = gate.indicators.temperature.statuses or {} + gate.indicators.temperature.entities = gate.indicators.temperature.entities or {} + + for i = 1,8,1 do + local status = 1 + if gate.lock_temperatures and gate.lock_temperatures[i] and gate.lock_temperatures[i] <= Ancient.gate_temperature_partial then + status = 2 + end + if gate.lock_temperatures and gate.lock_temperatures[i] and gate.lock_temperatures[i] <= Ancient.gate_temperature_required then + status = 3 + end + if gate.indicators.temperature.statuses[i] ~= status then + gate.indicators.temperature.statuses[i] = status + if gate.indicators.temperature.entities[i] and gate.indicators.temperature.entities[i] then + gate.indicators.temperature.entities[i].destroy() + end + gate.indicators.temperature.entities[i] = gate.surface.create_entity{ + name = Ancient.gate_parts_platform.indicators.names[status], + position = { + x = gate.position.x + Ancient.gate_parts_platform.indicators.x_start + Ancient.gate_parts_platform.indicators.x_spacing * (i - 1), + y = gate.position.y + Ancient.gate_parts_platform.indicators.temperature_y} + } + end + end +end + +function Ancient.gate_update_indicators_lock(gate) + gate.indicators = gate.indicators or {} + gate.indicators.lock = gate.indicators.lock or {} + gate.indicators.lock.statuses = gate.indicators.lock.statuses or {} + gate.indicators.lock.entities = gate.indicators.lock.entities or {} + + for i = 1,8,1 do + local status = 1 + if gate.shunts_actions and gate.shunts_actions[i] and gate.shunts_actions[i].active then + status = 2 + end + if gate.locked_glyphs and gate.locked_glyphs[i] then + status = 3 + end + + if gate.indicators.lock.statuses[i] ~= status then + gate.indicators.lock.statuses[i] = status + if gate.indicators.lock.entities[i] and gate.indicators.lock.entities[i] then + gate.indicators.lock.entities[i].destroy() + end + gate.indicators.lock.entities[i] = gate.surface.create_entity{ + name = Ancient.gate_parts_platform.indicators.names[status], + position = { + x = gate.position.x + Ancient.gate_parts_platform.indicators.x_start + Ancient.gate_parts_platform.indicators.x_spacing * (i - 1), + y = gate.position.y + Ancient.gate_parts_platform.indicators.lock_y} + } + end + end +end + +function Ancient.gate_update_indicators(gate) + -- don't update every frame, once per second is ok + if gate.status == "fragments" or gate.status == "scaffold" or gate.status == "unpowered" or gate.status == "powering-up" or gate.status == "powering-down" then + local indicators = gate.surface.find_entities_filtered{name=Ancient.gate_parts_platform.indicators.names} + for _, indicator in pairs(indicators) do indicator.destroy() end + gate.indicators = nil + return + end + Ancient.gate_update_indicators_anchor(gate) + + Ancient.gate_update_indicators_temperature(gate) + + Ancient.gate_update_indicators_lock(gate) +end + +function Ancient.gate_set_rotation(gate, direction) + if direction == 0 then + gate.rotation_direction = 0 + gate.buttons.left_display.graphics_variation = 1 + gate.buttons.middle_display.graphics_variation = 2 + gate.buttons.right_display.graphics_variation = 1 + gate.surface.create_entity{ + name= Ancient.name_sound_gate_button, + position= Ancient.gate_parts_platform.buttons.middle.position, + target= gate.position, + speed=0 + } + elseif direction == 1 then + gate.rotation_direction = 1 + gate.buttons.left_display.graphics_variation = 2 + gate.buttons.middle_display.graphics_variation = 1 + gate.buttons.right_display.graphics_variation = 1 + gate.surface.create_entity{ + name= Ancient.name_sound_gate_button, + position= Ancient.gate_parts_platform.buttons.left.position, + target= gate.position, + speed=0 + } + elseif direction == -1 then + gate.rotation_direction = -1 + gate.buttons.left_display.graphics_variation = 1 + gate.buttons.middle_display.graphics_variation = 1 + gate.buttons.right_display.graphics_variation = 2 + gate.surface.create_entity{ + name= Ancient.name_sound_gate_button, + position= Ancient.gate_parts_platform.buttons.right.position, + target= gate.position, + speed=0 + } + end +end + +function Ancient.gate_activate_lock(gate, lock_id) + gate.shunts_actions = gate.shunts_actions or {} + gate.shunts_actions[lock_id] = gate.shunts_actions[lock_id] or { + active = false, -- default + progress = 0, -- 0 to 1, 1 is lock point, 1-2 is return + } + if not gate.shunts_actions[lock_id].active == true then + gate.shunts_actions[lock_id].active = true + gate.surface.create_entity{ + name= Ancient.name_sound_gate_lock, + position= {x = Ancient.gate_parts_shunts[lock_id].position[1] + gate.position.x, y = Ancient.gate_parts_shunts[lock_id].position[2] + gate.position.y} , + target= gate.position, + speed=0 + } + end + Ancient.gate_clear_glyph(gate, lock_id) +end + +function Ancient.on_player_rotated_entity(event) + if event.entity and event.entity.valid then + local entity = event.entity + if event.entity.name == Ancient.gate_parts_platform.buttons.name_switch then + local gate = global.gate + if gate.status == "powered" then + if entity == gate.buttons.left_switch then + Ancient.gate_set_rotation(gate, 1) + end + if entity == gate.buttons.middle_switch then + Ancient.gate_set_rotation(gate, 0) + end + if entity == gate.buttons.right_switch then + Ancient.gate_set_rotation(gate, -1) + end + end + elseif event.entity.name == Ancient.name_gate_lock_switch then + local gate = global.gate + if gate.status == "powered" then + for i, switch in pairs(gate.lock_switches) do + if entity == switch then + Ancient.gate_activate_lock(gate, i) + end + end + end + end + end +end +Event.addListener(defines.events.on_player_rotated_entity, Ancient.on_player_rotated_entity) + +function Ancient.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.type == "simple-entity" then + for fragment_name, fragment in pairs(Ancient.gate_fragments) do + if entity.name == fragment_name then + local anomaly = Zone.from_name("Foenestra") + local anomaly_surface = Zone.get_surface(anomaly) + if anomaly_surface and anomaly_surface.index == entity.surface.index then + -- valid zone + Ancient.check_gate_fragments() + return + else + cancel_entity_creation(entity, event.player_index, "Cannot place here.") + return + end + end + end + end + +end +Event.addListener(defines.events.on_built_entity, Ancient.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, Ancient.on_entity_created) +Event.addListener(defines.events.script_raised_built, Ancient.on_entity_created) +Event.addListener(defines.events.script_raised_revive, Ancient.on_entity_created) + + +function Ancient.gate_begin_power_down(gate) + gate.status = "powering-down" + gate.status_progress = 0 + gate.portal_leads_to = nil + for j, sound_position in pairs(Ancient.gate_sound_positions) do + gate.surface.create_entity{ + name= Ancient.name_sound_gate_power_down, + position= {x = sound_position[1] + gate.position.x, y = sound_position[2] + gate.position.y}, + target= gate.position, + speed=0 + } + end + gate.rotation_velocity = 0 + gate.rotation_direction = 0 + Ancient.gate_remove_rotation_sounds(gate) + Ancient.gate_remove_powered_sounds(gate) + + -- removed locked glyphs + gate.locked_glyphs = {} + if gate.locked_glyphs_entities then + for _, entity in pairs(gate.locked_glyphs_entities) do + if entity and entity.valid then entity.destroy() end + end + end + + -- removed extra power draw + for i, entity in pairs(gate.platform_energy_interfaces) do + if i ~= 9 then + entity.destroy() + gate.platform_energy_interfaces[i] = nil + end + end + +end + +function Ancient.gate_begin_power_up(gate) + gate.queue_power_down = false + gate.status = "powering-up" + gate.status_progress = 0 + for j, sound_position in pairs(Ancient.gate_sound_positions) do + gate.surface.create_entity{ + name= Ancient.name_sound_gate_power_up, + position= {x = sound_position[1] + gate.position.x, y = sound_position[2] + gate.position.y}, + target= gate.position, + speed=0 + } + end +end + +function Ancient.gate_power_up_complete(gate) + gate.status = "powered" + gate.status_progress = 0 + Ancient.gate_update_indicators(gate) + + gate.powered_sounds = {} + for j, sound_position in pairs(Ancient.gate_sound_positions) do + gate.powered_sounds[j] = gate.surface.create_entity{ + name= Ancient.name_sound_gate_power_on, + position= {x = sound_position[1] + gate.position.x, y = sound_position[2] + gate.position.y}, + target= gate.position, + speed=0 + } + end + +end + +function Ancient.gate_evaluate_power(gate) + + local energy = 0 + local energy_capacity = 0 + for i, energy_interface in pairs(gate.platform_energy_interfaces) do + energy = energy + energy_interface.energy + energy_capacity = energy_capacity + energy_interface.prototype.electric_energy_source_prototype.buffer_capacity + energy_interface.power_usage = Ancient.unit_power_draw + end + -- buffer capacity was reduced from + local energy_of_required = energy/energy_capacity + if energy_of_required < 0.99 then + if gate.status == "powered" then + Ancient.gate_begin_power_down(gate) + gate.surface.print("Gate tried to draw more power than available.") + else + gate.queue_power_down = true + end + return + end + -- has power + if gate.status == "unpowered" then + Ancient.gate_begin_power_up(gate) + end + +end + +function Ancient.gate_remove_powered_sounds(gate) + if gate.powered_sounds then + for _, sound in pairs(gate.powered_sounds) do + if sound and sound.valid then sound.destroy() end + end + gate.powered_sounds = nil + end +end + +function Ancient.gate_remove_rotation_sounds(gate) + if gate.rotation_sounds then + for _, sound in pairs(gate.rotation_sounds) do + if sound and sound.valid then sound.destroy() end + end + gate.rotation_sounds = nil + end +end + +function Ancient.gate_position_glyph(gate, glyph, index) + glyph.teleport({ + x = gate.position.x + Ancient.gate_glyphs_x - math.sin(2*math.pi*(index/64+gate.rotation/64))*Ancient.gate_glyphs_x_mult, + y = gate.position.y + Ancient.gate_glyphs_y + math.cos(2*math.pi*(index/64+gate.rotation/64))*Ancient.gate_glyphs_y_mult + }) +end + +function Ancient.gate_position_glyphs(gate) + if gate.glyphs then + for i, glyph in pairs(gate.glyphs) do + Ancient.gate_position_glyph(gate, glyph, i) + end + end +end + +function Ancient.gate_update_temperatures(gate) + gate.lock_temperatures = gate.lock_temperatures or {} + for i = 1, 8, 1 do + gate.lock_temperatures[i] = gate.lock_temperatures[i] or Ancient.gate_temperature_resting + local diff = gate.lock_temperatures[i] - Ancient.gate_temperature_resting + local change = -diff * Ancient.gate_temperature_return_per_tick + if gate.status ~= "powering-down" and gate.status ~= "unpowered" then + change = change + Ancient.gate_temperature_while_powered + if gate.rotation_direction ~= 0 then + change = change + Ancient.gate_temperature_while_turning + end + if gate.status == "opening-portal" or gate.status == "portal-open" then + change = change + Ancient.gate_temperature_while_portal + end + if gate.locked_glyphs and gate.locked_glyphs[i] then + change = change + Ancient.gate_temperature_while_locked + end + end + gate.lock_temperatures[i] = gate.lock_temperatures[i] + change + if gate.lock_temperatures[i] >= Ancient.gate_temperature_required then + local fluid_available = gate.lock_fluid_inputs[i].get_fluid_count() + if fluid_available > 0 then + local fluid_in_output = gate.lock_fluid_outputs[i].get_fluid_count() + + -- from gate_temperature_resting to gate_temperature_zero + local temp_range = math.abs(Ancient.gate_temperature_zero - Ancient.gate_temperature_resting) + local temperature_as_percent = -(gate.lock_temperatures[i] - Ancient.gate_temperature_resting) / temp_range + local fluid_efficiency = Util.lerp(Ancient.gate_temperature_per_coolant_max, Ancient.gate_temperature_per_coolant_min, temperature_as_percent) + local temperature_drop_goal = (Ancient.gate_temperature_zero - gate.lock_temperatures[i]) / 10 -- don't do all in 1 step + local fluid_required = math.min(100, math.max(0, -temperature_drop_goal / fluid_efficiency)) + if fluid_required > 0 then + local used_fluid = gate.lock_fluid_outputs[i].insert_fluid({name = name_thermofluid_hot, amount = math.min(fluid_available, fluid_required)}) + if used_fluid > 0 then + gate.lock_fluid_inputs[i].remove_fluid({name = name_thermofluid_supercooled, amount = used_fluid}) + gate.lock_temperatures[i] = gate.lock_temperatures[i] - fluid_efficiency * used_fluid + end + end + end + end + end +end + + +function Ancient.on_tick(event) + if global.gate then + local gate = global.gate + + if gate.status == "fragments" then + -- nothing to do anymore + elseif gate.status == "scaffold" then + if gate.platform_scaffold.products_finished > 0 then + Ancient.gate_phase_3(gate) + end + else + + Ancient.gate_evaluate_power(gate) + + if game.tick % 60 == 0 then + Ancient.gate_update_temperatures(gate) + Ancient.gate_update_indicators(gate) + end + + if gate.status == "powering-up" then + gate.status_progress = gate.status_progress + 1 + + local glyphs_active = math.min(64, (gate.status_progress - Ancient.timer_power_up_complete) / Ancient.timer_power_up_ghyph_light_interval + 65) + gate.glyphs = gate.glyphs or {} + if glyphs_active > #gate.glyphs then + local i = #gate.glyphs + 1 + gate.glyphs[i] = gate.surface.create_entity{ + name = Ancient.name_gate_glyph_prefix .. gate.glyph_order[i], + position = gate.position + } + Ancient.gate_position_glyph(gate, gate.glyphs[i], i) -- move to correct place + gate.glyphs[i].destructible = false + end + if gate.status_progress > Ancient.timer_power_up_complete then + if gate.queue_power_down == true then + Ancient.gate_begin_power_down(gate) + else + Ancient.gate_power_up_complete(gate) + end + end + end + + if gate.status == "powering-down" then + gate.status_progress = gate.status_progress + 1 + for _, glyph in pairs(gate.glyphs) do + if glyph and glyph.valid then glyph.destroy() end + end + gate.glyphs = {} + if gate.status_progress > Ancient.timer_power_down_complete then + gate.status = "unpowered" + gate.status_progress = 0 + end + end + + if gate.status == "powered" then + + if gate.rotation_direction == 0 then + --gate.rotation_velocity = gate.rotation_velocity + math.min(math.max((gate.rotation_direction-gate.rotation_velocity),-Ancient.gate_decceleration), Ancient.gate_decceleration) + if gate.rotation_velocity > 0 then + local next_snap = math.ceil(gate.rotation) + local next_snap_distance = math.max(0, next_snap - gate.rotation - 0.01) + gate.rotation_velocity = gate.rotation_velocity + math.min(math.max((next_snap_distance-gate.rotation_velocity),-Ancient.gate_decceleration), Ancient.gate_acceleration) + else + local next_snap = math.floor(gate.rotation) + local next_snap_distance = math.min(0, next_snap - gate.rotation + 0.01) + gate.rotation_velocity = gate.rotation_velocity + math.min(math.max((next_snap_distance-gate.rotation_velocity),-Ancient.gate_acceleration), Ancient.gate_decceleration) + end + + elseif math.abs(gate.rotation_direction-gate.rotation_velocity) >= 1 then + gate.rotation_velocity = gate.rotation_velocity + math.min(math.max((gate.rotation_direction-gate.rotation_velocity),-Ancient.gate_decceleration), Ancient.gate_decceleration) + else + gate.rotation_velocity = gate.rotation_velocity + math.min(math.max((gate.rotation_direction-gate.rotation_velocity),-Ancient.gate_acceleration), Ancient.gate_acceleration) + end + + gate.rotation = gate.rotation + gate.rotation_velocity * Ancient.gate_max_speed + + if math.abs(gate.rotation_velocity) > 0.01 then + if not gate.rotation_sounds then + gate.rotation_sounds = {} + for j, sound_position in pairs(Ancient.gate_sound_positions) do + gate.rotation_sounds[j] = gate.surface.create_entity{ + name= Ancient.name_sound_gate_turning, + position= {x = sound_position[1] + gate.position.x, y = sound_position[2] + gate.position.y}, + target= gate.position, + speed=0 + } + end + end + elseif gate.rotation_sounds then + Ancient.gate_remove_rotation_sounds(gate) + end + + if game.tick % 60 == 0 then + Ancient.gate_try_open_portal(gate) + end + end + + if gate.status == "powered" or gate.status == "powering-up" then + -- gate track rotation + Ancient.gate_position_glyphs(gate) + end + + if gate.status == "opening-portal" then + gate.status_progress = gate.status_progress + 1 + local open_percent = gate.status_progress / 600 + rendering.set_x_scale(gate.activation_fx.cloud_1, 2.5 * open_percent) + rendering.set_x_scale(gate.activation_fx.cloud_2, 2.5 * open_percent) + rendering.set_y_scale(gate.activation_fx.cloud_1, 2 * open_percent) + rendering.set_y_scale(gate.activation_fx.cloud_2, 2 * open_percent) + for i = 0, 2, 1 do + local angle = math.random() * 360 + local target_offset = { + x = -math.sin(2*math.pi*angle) * 30, + y = math.cos(2*math.pi*angle) * 20 + } + local magnitude = Util.vector_length(target_offset); + local target_position = {x = target_offset.x + gate.position.x, y = target_offset.y + gate.position.y} + gate.surface.create_entity{ + name = (i%2==0) and Ancient.name_gate_spec_white or Ancient.name_gate_spec_cyan, + position = Util.lerp_vectors(gate.position, target_position, 0.1), + target = target_position, + speed = magnitude / 50 * (0.5 + math.random()) + } + end + if gate.status_progress >= 600 then + gate.status = "portal-open" + gate.status_progress = 0 + local coordinate = Ancient.cryptf4b(gate.locked_glyphs) + for force_name in pairs(global.forces) do + local force = game.forces[force_name] + if force and force_name ~= "friendly" and force_name ~= "ignore" and force_name ~= "capture" + and table_size(force.players) > 0 and Zone.is_visible_to_force(Zone.from_surface(gate.surface), force_name) then + Ancient.add_to_coordinate_logs(force, gate.locked_glyphs, coordinate) + end + end + local string = gate.locked_glyphs[1] + for i = 2, 8 do + string = string .. "|" .. gate.locked_glyphs[i] + end + local hash = sha2.hash256(string) + game.print({"space-exploration.gate-portal-coordinates", Ancient.coordinate_to_string(coordinate)}) + if hash == global.gds or (coordinate[1] == global.hcoord[1] and coordinate[2] == global.hcoord[2] and coordinate[3] == global.hcoord[3]) then + gate.portal_leads_to = "home" + game.print("The portal is stable and leads to your final destination. Enter the portal to win the game.") + else + local hash1 = string.sub(hash, 1, 1) + if tonumber(hash1) then + gate.portal_leads_to = "biter" + game.print("Something is coming through the portal.") + else + game.print("The distortion is unstable. The distortion vector does not lead anywhere.") + end + end + end + end + + if gate.status == "portal-open" then + -- TODO: check sequence and show victory screen if correct. + -- otherwise chance for gate close or invasion from : biters / robots / ancients + if gate.portal_leads_to and gate.queue_power_down ~= true then + if gate.portal_leads_to == "home" then + -- TODO: look for player in the portal. + local characters = gate.surface.find_entities_filtered{type = "character", position = gate.position, radius = 5} + if characters and #characters >= 1 then + game.set_game_state{ + game_finished=true, + player_won=true, + can_continue=true, + victorious_force=characters[1].force + } + gate.status = "closing-portal" + gate.status_progress = 0 + gate.portal_leads_to = nil + end + for _, character in pairs(characters) do + if character.player then + local playerdata = get_make_playerdata(character.player) + if playerdata and not playerdata.gate_victory then + playerdata.gate_victory = game.tick + character.player.print({"space-exploration.victory-message-gate-player"}) + end + end + end + else + if game.tick % 10 == 0 then + -- assume a biter world for now. + local names = { + "small-spitter", + "small-biter", + "medium-spitter", + "medium-biter", + "big-spitter", + "big-biter", + "behemoth-spitter", + "behemoth-biter", + } + local name = names[math.random(#names)] + local pos = gate.surface.find_non_colliding_position(name, gate.position, 10, 1, false) + if pos then + gate.surface.create_entity{name = name, position = pos, force = "enemy"} + end + end + end + else + gate.status = "closing-portal" + gate.status_progress = 0 + gate.portal_leads_to = nil + end + end + + if gate.status == "closing-portal" then + gate.status_progress = gate.status_progress + 1 + local closed_percent = gate.status_progress / 600 + local tint_1 = table.deepcopy(Ancient.gate_cloud_tint_1) + local tint_2 = table.deepcopy(Ancient.gate_cloud_tint_2) + for a, b in pairs(tint_1) do tint_1[a] = b * (1 - closed_percent) end + for a, b in pairs(tint_2) do tint_2[a] = b * (1 - closed_percent) end + rendering.set_color(gate.activation_fx.cloud_1, tint_1) + rendering.set_color(gate.activation_fx.cloud_2, tint_2) + if gate.status_progress >= 600 then + Ancient.gate_begin_power_down(gate) + end + end + + -- shunts + if gate.shunts_actions then + for i, action in pairs(gate.shunts_actions) do + if action.active then + action.progress = action.progress + Ancient.timer_shunt_step + if action.progress > Ancient.timer_shunt_glyph_lock and action.progress < (Ancient.timer_shunt_glyph_lock+Ancient.timer_shunt_step) + and math.abs(gate.rotation_velocity) < 0.02 + and gate.status == "powered" then + -- Lock the glyph + gate.locked_glyphs = gate.locked_glyphs or {} + gate.locked_glyphs_entities = gate.locked_glyphs_entities or {} + + local glyph = Ancient.gate_get_glyph_at_lock(gate, i) + Ancient.gate_lock_glyph(gate, i, glyph) + Ancient.gate_update_indicators_lock(gate) + end + if action.progress > Ancient.timer_shunt_complete then + action.progress = 0 + action.active = false + if not gate.locked_glyphs[i] then + if gate.platform_energy_interfaces and gate.platform_energy_interfaces[i] and gate.platform_energy_interfaces[i].valid then + gate.platform_energy_interfaces[i].destroy() + end + gate.platform_energy_interfaces[i] = nil + end + Ancient.gate_update_indicators(gate) + end + local track_pos = math.min(1, math.min(action.progress, Ancient.timer_shunt_complete -action.progress)) + if action.progress < 1 then + track_pos = track_pos * track_pos + elseif action.progress > (Ancient.timer_shunt_complete - 1) then + --track_pos = math.sqrt(track_pos) + end + local base_position = util.vectors_add(gate.position, {x = Ancient.gate_parts_shunts[i].position[1], y = Ancient.gate_parts_shunts[i].position[2]}) + local locked_position = util.vectors_add(base_position, {x = Ancient.gate_parts_shunts[i].lock_offset[1], y = Ancient.gate_parts_shunts[i].lock_offset[2]}) + + gate.shunts[i].teleport(util.lerp_vectors(base_position, locked_position, track_pos)) + end + end + end + + end + end +end +Event.addListener(defines.events.on_tick, Ancient.on_tick) + +function Ancient.coordinate_to_string(coordinate) + return coordinate[1] .. ", "..coordinate[2] .. ", " ..coordinate[3] +end + +function Ancient.glyphs_to_string(glyphs) + local glyphs_string = "" + for _, glyph_id in pairs(glyphs) do + glyphs_string = glyphs_string.."[img=entity/"..mod_prefix.."glyph-a-energy-"..glyph_id.."]" + end + return glyphs_string +end + +function Ancient.get_coordinate_logs(force) + local force_data = global.forces[force.name] + if force_data then + return force_data.coordinate_logs + end +end + +function Ancient.add_to_coordinate_logs(force, glyphs, coordinates) + local force_data = global.forces[force.name] + if force_data then + local coordinate_logs = force_data.coordinate_logs or {} + local glyph_coordinate_pair = {glyph_string = Ancient.glyphs_to_string(glyphs), coordinate_string = Ancient.coordinate_to_string(coordinates)} + table.insert(coordinate_logs, glyph_coordinate_pair) + force_data.coordinate_logs = coordinate_logs + end +end + +function Ancient.gate_clear_glyph(gate, lock_id, skip_indicators) + gate.locked_glyphs = gate.locked_glyphs or {} + gate.locked_glyphs[lock_id] = nil + gate.locked_glyphs_entities = gate.locked_glyphs_entities or {} + if gate.locked_glyphs_entities[lock_id] and gate.locked_glyphs_entities[lock_id].valid then + gate.locked_glyphs_entities[lock_id].destroy() -- remove old + end + gate.locked_glyphs_entities[lock_id] = nil + if not skip_indicators then + Ancient.gate_update_indicators_lock(gate) + end +end + +function Ancient.gate_lock_glyph(gate, lock_id, glyph) -- real glyph id + Ancient.gate_clear_glyph(gate, lock_id, true) + if glyph and (lock_id > 1 or Ancient.gtf(glyph)) then + gate.locked_glyphs[lock_id] = glyph + gate.locked_glyphs_entities[lock_id] = gate.shunts[lock_id].surface.create_entity{ + name = Ancient.name_gate_glyph_prefix .. glyph .. Ancient.name_gate_glyph_locked_suffix, -- suffix changes render layer + position = { + x = gate.position.x + Ancient.gate_parts_locked_glyphs[lock_id][1], + y = gate.position.y + Ancient.gate_parts_locked_glyphs[lock_id][2] + } + } + gate.locked_glyphs_entities[lock_id].destructible = false + end + + if not (gate.platform_energy_interfaces[lock_id] and gate.platform_energy_interfaces[lock_id].valid) then + gate.platform_energy_interfaces[lock_id] = gate.shunts[lock_id].surface.create_entity{ + name = Ancient.gate_parts_platform.energy_interface.name, + position = {x = gate.position.x + Ancient.gate_parts_platform.energy_interface.position[1], y = gate.position.y + Ancient.gate_parts_platform.energy_interface.position[2]}, + direction = defines.direction.north, + force = "neutral" + } + gate.platform_energy_interfaces[lock_id].destructible = false + gate.platform_energy_interfaces[lock_id].rotatable = false + gate.platform_energy_interfaces[lock_id].energy = 1000000000000 -- max out to start + end + Ancient.gate_update_indicators_lock(gate) +end + +function Ancient.gate_try_open_portal(gate) + if not (gate.locked_glyphs and gate.lock_temperatures and global.dimensional_anchors) then return end + local n_locked = 0 + for i = 1, 8, 1 do + if not gate.locked_glyphs[i] then return end + if not (gate.lock_temperatures[i] and gate.lock_temperatures[i] <= Ancient.gate_temperature_required) then return end + end + local active_anchors = 0 + for zone_index, anchor in pairs(global.dimensional_anchors) do + if anchor.active then active_anchors = active_anchors + 1 end + end + if active_anchors < 8 then return end + + -- still going, all good + gate.status = "opening-portal" + gate.status_progress = 0 + gate.activation_fx = gate.activation_fx or {} + for _, fx in pairs(gate.activation_fx) do + rendering.destroy(fx) + end + gate.activation_fx.cloud_1 = rendering.draw_animation{ + animation=Ancient.name_gate_cloud, + target=gate.position, + surface=gate.surface, + x_scale = 2.5 / 100, + y_scale = 2 / 100, + tint = Ancient.gate_cloud_tint_1, + animation_speed = -1 + } + gate.activation_fx.cloud_2 = rendering.draw_animation{ + animation=Ancient.name_gate_cloud, + target=gate.position, + surface=gate.surface, + x_scale = 2.5 / 100, + y_scale = 2 / 100, + tint = Ancient.gate_cloud_tint_2, + animation_speed = 0.5, + orientation = 0.5 + } +end + + +function Ancient.gate_get_glyph_at_lock(gate, lock_id) + local lock_rotation = (lock_id-0.5)/8*64 + local effective_rotation = (lock_rotation - gate.rotation) + local snapped_rotation = math.floor(effective_rotation +0.5) % 64 + if snapped_rotation <= 0 then snapped_rotation = snapped_rotation + 64 end + local glyph = gate.glyph_order[snapped_rotation] + return glyph +end + + +function Ancient.on_research_finished(event) + + local force = event.research.force + Ancient.update_force_unlocks(force.name) + + if event.research.name == Ancient.name_tech_coordinates then + local force_data = global.forces[force.name] + if force_data then + if force.technologies[Ancient.name_tech_coordinates].enabled then + local level = force.technologies[Ancient.name_tech_coordinates].level - 1 + if force.technologies[Ancient.name_tech_coordinates].researched then + level = level + 1 + end + if level >= 1 then + if not force_data.coordinates_discovered then + force_data.coordinates_discovered = {} + end + while level > #force_data.coordinates_discovered do + local glyph_id = global.gco[#force_data.coordinates_discovered+1] + table.insert(force_data.coordinates_discovered, glyph_id) + local coordinate = Ancient.cryptf4b({glyph_id}) + force.print({"space-exploration.starmapping-found-constellation", "[img=entity/"..mod_prefix .. "glyph-a-energy-"..glyph_id.."]"}) + end + end + end + end + end +end +Event.addListener(defines.events.on_research_finished, Ancient.on_research_finished) + +function Ancient.update_force_unlocks(force_name) + local force = game.forces[force_name] + if global.gate and global.gate.status ~= "fragments" then + if not force.technologies[Ancient.name_tech_coordinates].enabled then + force.technologies[Ancient.name_tech_coordinates].enabled = true + force.print({"space-exploration.technology-unlocked", "[img=technology."..Ancient.name_tech_coordinates.."]",{"technology-name."..Ancient.name_tech_coordinates}}) + end + if not force.technologies[Ancient.name_tech_anchor].enabled then + force.print({"space-exploration.technology-unlocked", "[img=technology."..Ancient.name_tech_anchor.."]",{"technology-name."..Ancient.name_tech_anchor}}) + force.technologies[Ancient.name_tech_anchor].enabled = true + end + else + force.technologies[Ancient.name_tech_coordinates].enabled = false + force.technologies[Ancient.name_tech_anchor].enabled = false + end +end + +function Ancient.update_unlocks() + for force_name, forcedata in pairs(global.forces) do -- only player forces + Ancient.update_force_unlocks(force_name) + end +end + +return Ancient diff --git a/space-exploration_0.5.58/space-exploration/scripts/arco.lua b/space-exploration_0.5.58/space-exploration/scripts/arco.lua new file mode 100644 index 0000000..d30c042 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/arco.lua @@ -0,0 +1,161 @@ +local Arco = {} + +Arco.name_gravimetrics_lab = mod_prefix.."space-gravimetrics-laboratory" +Arco.name_arcosphere_collector = mod_prefix.."arcosphere-collector" +Arco.name_arcosphere = mod_prefix.."arcosphere" +Arco.collection_global = 0.8 +Arco.collection_local = 0.2 -- there are 44 space zones so this needs to be low, 0.2 means 8.8x the number of spheres are available. + +function Arco.collector_get_orbs(force_name, zone_index) + local forcedata = global.forces[force_name] + + -- global factor + forcedata.arcosphere_collectors_launched = forcedata.arcosphere_collectors_launched or 0 + forcedata.arcospheres_collected = forcedata.arcospheres_collected or 0 + + local launched_global = forcedata.arcosphere_collectors_launched + local collected_next_global = math.ceil(Arco.collection_global * (math.log(launched_global+1+10)*50-math.log(10)*50)) + local collect_global = math.max(0, collected_next_global - forcedata.arcospheres_collected) + + -- local factor + forcedata.zone_arcospheres = forcedata.zone_arcospheres or {} + forcedata.zone_arcospheres[zone_index] = forcedata.zone_arcospheres[zone_index] or {} + forcedata.zone_arcospheres[zone_index].arcosphere_collectors_launched = forcedata.zone_arcospheres[zone_index].arcosphere_collectors_launched or 0 + forcedata.zone_arcospheres[zone_index].arcospheres_collected = forcedata.zone_arcospheres[zone_index].arcospheres_collected or 0 + + local launched_local = forcedata.zone_arcospheres[zone_index].arcosphere_collectors_launched + local collected_next_local = math.ceil(Arco.collection_local * (math.log(launched_local+1+10)*50-math.log(10)*50)) + local collect_local = math.max(0, collected_next_local - forcedata.zone_arcospheres[zone_index].arcospheres_collected) + + Log.trace("launched global "..launched_global.." local "..launched_local) + Log.trace("collect global "..collect_global.." local "..collect_local) + return collect_global, collect_local -- returns 2 values +end + +function Arco.collector_increment(force_name, zone_index) + local forcedata = global.forces[force_name] + + forcedata.arcosphere_collectors_launched = (forcedata.arcosphere_collectors_launched or 0) + 1 + + forcedata.zone_arcospheres = forcedata.zone_arcospheres or {} + forcedata.zone_arcospheres[zone_index] = forcedata.zone_arcospheres[zone_index] or {} + forcedata.zone_arcospheres[zone_index].arcosphere_collectors_launched = (forcedata.zone_arcospheres[zone_index].arcosphere_collectors_launched or 0) + 1 +end + +function Arco.on_rocket_launched(event) + if event.rocket and event.rocket.valid then + local zone = Zone.from_surface(event.rocket.surface) + if event.rocket.get_item_count(Arco.name_arcosphere_collector) > 0 then + if zone and zone.type == "asteroid-field" then + local inv = event.rocket_silo.get_inventory(defines.inventory.rocket_silo_result) + local empty = inv.count_empty_stacks(true) + local forcedata = global.forces[event.rocket.force.name] + local inserted = 0 + local spheres_global, spheres_local = Arco.collector_get_orbs(event.rocket.force.name, zone.index) -- gets 2 values + Log.trace("on_rocket_launched empty slots: " .. empty) + if empty > 0 then + if spheres_global + spheres_local > 0 then + inserted = inserted + inv.insert({name=Arco.name_arcosphere, count= spheres_global + spheres_local}) + end + if inserted > 1 then + event.rocket.force.item_production_statistics.on_flow(Arco.name_arcosphere, inserted) + end + end + local inserted_global = math.min(spheres_global, inserted) -- remove from global pool first + local inserted_local = inserted - inserted_global + if inserted_global > 0 then + forcedata.arcospheres_collected = (forcedata.arcospheres_collected or 0) + inserted_global + end + if inserted_local > 0 then + forcedata.zone_arcospheres[zone.index].arcospheres_collected = (forcedata.zone_arcospheres[zone.index].arcospheres_collected or 0) + inserted_local + end + Arco.collector_increment(event.rocket.force.name, zone.index) + end + end + end +end +Event.addListener(defines.events.on_rocket_launched, Arco.on_rocket_launched) + +function Arco.on_rocket_launch_ordered(event) + if event.rocket and event.rocket.valid then + local zone = Zone.from_surface(event.rocket.surface) + if event.rocket.get_item_count(Arco.name_arcosphere_collector) > 0 then + if not (zone and zone.type == "asteroid-field") then + -- launch location is invalid. + local tick_task = new_tick_task("force-message") + tick_task.force_name = event.rocket.force.name + tick_task.message = {"space-exploration.arcosphere_collector_invalid_launch"} + tick_task.delay_until = game.tick + 750 --5s + event.rocket.remove_item({name=Arco.name_arcosphere_collector, count=1}) + end + end + end +end +Event.addListener(defines.events.on_rocket_launch_ordered, Arco.on_rocket_launch_ordered) + +function Arco.on_entity_created(event) + + local entity + if event.entity and event.entity.valid then entity = event.entity end + if event.created_entity and event.created_entity.valid then entity = event.created_entity end + if not entity then return end + + if entity.name == Arco.name_gravimetrics_lab then + global.gravimetrics_labs = global.gravimetrics_labs or {} + global.gravimetrics_labs[entity.unit_number] = { + unit_unber = entity.unit_number, + force_name = entity.force.name, + entity = entity, + products_finished = 0 + } + end +end +Event.addListener(defines.events.on_built_entity, Arco.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, Arco.on_entity_created) +Event.addListener(defines.events.script_raised_built, Arco.on_entity_created) +Event.addListener(defines.events.script_raised_revive, Arco.on_entity_created) + +function Arco.reset_surface(surface) + for _, entity in pairs(surface.find_entities_filtered{name = Arco.name_gravimetrics_lab}) do + Arco.on_entity_created({entity = entity}) + end +end + +function Arco.swap_recipe(lab) + local recipe = lab.entity.get_recipe() + local set_recipe + if recipe then + if string.find(recipe.name, "-alt", 1, true) then + set_recipe = Util.replace(recipe.name, "-alt", "") + else + if game.recipe_prototypes[recipe.name.."-alt"] then + set_recipe = recipe.name.."-alt" + end + end + end + if set_recipe then + local crafting_progress = lab.entity.crafting_progress + lab.entity.set_recipe(set_recipe) + lab.entity.crafting_progress = crafting_progress + end +end + +function Arco.on_nth_tick_600() + if global.gravimetrics_labs then + for unit_number, lab in pairs(global.gravimetrics_labs) do + if lab.entity and lab.entity.valid then + if lab.entity.products_finished ~= lab.products_finished then + lab.products_finished = lab.entity.products_finished + if math.random() < 0.314 then + Arco.swap_recipe(lab) + end + end + else + global.gravimetrics_labs[unit_number] = nil + end + end + end +end +Event.addListener("on_nth_tick_60", Arco.on_nth_tick_600) -- 10 seconds + +return Arco diff --git a/space-exploration_0.5.58/space-exploration/scripts/beacon.lua b/space-exploration_0.5.58/space-exploration/scripts/beacon.lua new file mode 100644 index 0000000..c59e290 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/beacon.lua @@ -0,0 +1,151 @@ +local Beacon = {} + +-- Note: supply_area_distance -- extends from edge of collision box +Beacon.affected_types = {"assembling-machine", "furnace", "lab", "mining-drill", "rocket-silo"} + +function Beacon.get_beacon_prototypes() + if not Beacon.list_beacon_prototypes then + Beacon.list_beacon_prototypes = {} + for name, prototype in pairs(game.entity_prototypes) do + if prototype.type == "beacon" and prototype.supply_area_distance then + table.insert(Beacon.list_beacon_prototypes, prototype) + end + end + end + return Beacon.list_beacon_prototypes +end + +function Beacon.get_max_beacon_range() + if not Beacon.max_beacon_range then + Beacon.max_beacon_range = 0 + for _, prototype in pairs(Beacon.list_beacon_prototypes()) do + if prototype.supply_area_distance > Beacon.max_beacon_range then + Beacon.max_beacon_range = prototype.supply_area_distance + end + end + end + return Beacon.max_beacon_range +end + +function Beacon.validate_entity(entity, ignore_count) + -- make sure not affected by more than 1 beacon + if (not entity.prototype.allowed_effects) or table_size(entity.prototype.allowed_effects) == 0 + or (not entity.prototype.module_inventory_size) or entity.prototype.module_inventory_size == 0 then return end + local ignore = ignore_count and ignore_count or 0 + local bounding_box = entity.bounding_box + local beacons = 0 + for _, prototype in pairs(Beacon.get_beacon_prototypes()) do + local area = util.area_extend(bounding_box, prototype.supply_area_distance) + beacons = beacons + entity.surface.count_entities_filtered{type="beacon", name=prototype.name, area = area} + end + if beacons > 1 + ignore then + if entity.active == true then + entity.active = false + entity.surface.create_entity{ + name = "flying-text", + position = entity.position, + text = {"space-exploration.beacon-overload"} + } + global.beacon_overloaded_entities = global.beacon_overloaded_entities or {} + global.beacon_overloaded_entities[entity.unit_number] = entity + + global.beacon_overloaded_shapes = global.beacon_overloaded_shapes or {} + local shape_id = global.beacon_overloaded_shapes[entity.unit_number] + if shape_id and rendering.is_valid(shape_id) then rendering.destroy(shape_id) end -- shouldn't happen but best to check if other mods broke something + shape_id = rendering.draw_sprite{ + sprite = "virtual-signal/"..mod_prefix.."beacon-overload", + surface = entity.surface, + target = entity, + x_scale = 1, + y_scale = 1, + target_offset = entity.prototype.alert_icon_shift + } + global.beacon_overloaded_shapes[entity.unit_number] = shape_id + end + else + -- TODO: add hook here so other things can cancel + if not entity.active then + global.beacon_overloaded_entities = global.beacon_overloaded_entities or {} + global.beacon_overloaded_shapes = global.beacon_overloaded_shapes or {} + local deactivated_by_beacons = false + for unit_number, overloaed_entity in pairs(global.beacon_overloaded_entities) do + if not overloaed_entity.valid then + global.beacon_overloaded_entities[unit_number] = nil + if global.beacon_overloaded_shapes[unit_number] then + local shape_id = global.beacon_overloaded_shapes[unit_number] + if rendering.is_valid(shape_id) then rendering.destroy(shape_id) end + global.beacon_overloaded_shapes[unit_number] = nil + end + elseif entity == overloaed_entity then + global.beacon_overloaded_entities[unit_number] = nil + if global.beacon_overloaded_shapes[unit_number] then + local shape_id = global.beacon_overloaded_shapes[unit_number] + if rendering.is_valid(shape_id) then rendering.destroy(shape_id) end + global.beacon_overloaded_shapes[unit_number] = nil + end + deactivated_by_beacons = true + end + end + if deactivated_by_beacons then + entity.active = true + entity.surface.create_entity{ + name = "flying-text", + position = entity.position, + text = {"space-exploration.beacon-overload-ended"} + } + for interface, functions in pairs(remote.interfaces) do -- allow other mods to deactivate after + if interface ~= "space-exploration" and functions["on_entity_activated"] then + remote.call(interface, "on_entity_activated", {entity = entity, mod = "space-exploration"}) + end + end + + end + end + end +end + +function Beacon.validate_beacon(entity, is_deconstructing) + local prototype = entity.prototype + local area = util.area_extend(entity.bounding_box, prototype.supply_area_distance) + local structures = entity.surface.find_entities_filtered{type = Beacon.affected_types, area = area} + local ignore = is_deconstructing and 1 or 0 + for _, structure in pairs(structures) do + Beacon.validate_entity(structure, ignore) + end +end + +function Beacon.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.type == "beacon" then + Beacon.validate_beacon(entity) + elseif util.table_contains(Beacon.affected_types, entity.type) then + Beacon.validate_entity(entity) + end +end +Event.addListener(defines.events.on_built_entity, Beacon.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, Beacon.on_entity_created) +Event.addListener(defines.events.script_raised_built, Beacon.on_entity_created) +Event.addListener(defines.events.script_raised_revive, Beacon.on_entity_created) + +function Beacon.on_entity_removed(event) + if event.entity and event.entity.valid then + if event.entity.type == "beacon" then + -- do validation but counting 1 beacon fewer + Beacon.validate_beacon(event.entity, true) + end + end +end + +Event.addListener(defines.events.on_player_mined_entity, Beacon.on_entity_removed) +Event.addListener(defines.events.on_robot_mined_entity, Beacon.on_entity_removed) +Event.addListener(defines.events.on_entity_died, Beacon.on_entity_removed) +Event.addListener(defines.events.script_raised_destroy, Beacon.on_entity_removed) + +return Beacon diff --git a/space-exploration_0.5.58/space-exploration/scripts/big-turbine.lua b/space-exploration_0.5.58/space-exploration/scripts/big-turbine.lua new file mode 100644 index 0000000..6ffe517 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/big-turbine.lua @@ -0,0 +1,99 @@ +local BigTurbine = {} + +BigTurbine.name_big_turbine = mod_prefix.."big-turbine" +BigTurbine.name_big_turbine_generator = mod_prefix.."big-turbine-generator" +BigTurbine.name_big_turbine_tank = mod_prefix.."big-turbine-tank" +BigTurbine.big_turbine_tank_offset = 4.5 + +function BigTurbine.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.name == BigTurbine.name_big_turbine then + local direction_vector = Util.vector_multiply(Util.direction_to_vector(entity.direction), -1) + local tank_position_offset = Util.vector_multiply(direction_vector, BigTurbine.big_turbine_tank_offset) + local tank_position = Util.vectors_add(entity.position, tank_position_offset) + + local generator = entity.surface.create_entity{ + name = BigTurbine.name_big_turbine_generator, + position = entity.position, + direction = entity.direction, + force = entity.force + } + generator.destructible = false + local tank = entity.surface.create_entity{ + name = BigTurbine.name_big_turbine_tank, + position = tank_position, + direction = entity.direction, + force = entity.force + } + if tank then + tank.destructible = false + else + game.print("big-turbine-tank error") + end + end +end +Event.addListener(defines.events.on_built_entity, BigTurbine.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, BigTurbine.on_entity_created) +Event.addListener(defines.events.script_raised_built, BigTurbine.on_entity_created) +Event.addListener(defines.events.script_raised_revive, BigTurbine.on_entity_created) + + +function BigTurbine.on_removed_entity(event) + if event.entity and event.entity.valid and event.entity.surface + and event.entity.name == BigTurbine.name_big_turbine then + local entity = event.entity + + local direction_vector = Util.vector_multiply(Util.direction_to_vector(entity.direction), -1) + local tank_position_offset = Util.vector_multiply(direction_vector, BigTurbine.big_turbine_tank_offset) + local tank_position = Util.vectors_add(entity.position, tank_position_offset) + + local generator = entity.surface.find_entity(BigTurbine.name_big_turbine_generator, entity.position) + if generator then generator.destroy() end + + local tank = entity.surface.find_entity(BigTurbine.name_big_turbine_tank, tank_position) + if tank then tank.destroy() end + + end +end +Event.addListener(defines.events.on_entity_died, BigTurbine.on_removed_entity) +Event.addListener(defines.events.on_robot_mined_entity, BigTurbine.on_removed_entity) +Event.addListener(defines.events.on_player_mined_entity, BigTurbine.on_removed_entity) +Event.addListener(defines.events.script_raised_destroy, BigTurbine.on_removed_entity) + +function BigTurbine.on_player_rotated_entity(event) + if event.entity and event.entity.valid and event.entity.surface + and event.entity.name == BigTurbine.name_big_turbine then + local entity = event.entity + + local direction_vector = Util.vector_multiply(Util.direction_to_vector(entity.direction), -1) + local tank_position_offset = Util.vector_multiply(direction_vector, BigTurbine.big_turbine_tank_offset) + local tank_position = Util.vectors_add(entity.position, tank_position_offset) + + local tank = entity.surface.find_entity(BigTurbine.name_big_turbine_tank, tank_position) + if tank then + local direction_vector = Util.direction_to_vector(entity.direction) + local tank_position_offset = Util.vector_multiply(direction_vector, BigTurbine.big_turbine_tank_offset) + local tank_position = Util.vectors_add(entity.position, tank_position_offset) + tank.teleport(tank_position) + tank.rotate() + tank.rotate() + end + + end +end +Event.addListener(defines.events.on_player_rotated_entity, BigTurbine.on_player_rotated_entity) + +function BigTurbine.reset_surface(surface) + for _, entity in pairs(surface.find_entities_filtered{name = BigTurbine.name_big_turbine_tank }) do + entity.direction = entity.direction + end +end + +return BigTurbine diff --git a/space-exploration_0.5.58/space-exploration/scripts/capsule.lua b/space-exploration_0.5.58/space-exploration/scripts/capsule.lua new file mode 100644 index 0000000..ec26658 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/capsule.lua @@ -0,0 +1,311 @@ +Capsule = {} + +-- constants +Capsule.name_space_capsule_gui_root = mod_prefix.."space-capsule-gui" +Capsule.name_space_capsule = mod_prefix.."space-capsule" +Capsule.name_space_capsule_vehicle = mod_prefix.."space-capsule-_-vehicle" +Capsule.name_space_capsule_vehicle_shadow = mod_prefix.."space-capsule-_-vehicle-shadow" +Capsule.name_space_capsule_vehicle_light = mod_prefix.."light-space-capsule" +Capsule.name_space_capsule_vehicle_light_launch = mod_prefix.."light-space-capsule-launch" + +function Capsule.launch(vehicle) + + local current_zone = Zone.from_surface(vehicle.surface) + if current_zone and Zone.is_space(current_zone) then + + local shadow = vehicle.surface.find_entities_filtered{ area=util.position_to_area(vehicle.position, 1), name=Capsule.name_space_capsule_vehicle_shadow}[1] + local light = vehicle.surface.find_entities_filtered{ area=util.position_to_area(vehicle.position, 1), name=Capsule.name_space_capsule_vehicle_light}[1] + if light then light.destroy() end + light = vehicle.surface.create_entity{name = Capsule.name_space_capsule_vehicle_light_launch, position = vehicle.position, target=vehicle, speed = 0} + + local passengers = {} -- characters not players + if vehicle.get_driver() then + table.insert(passengers, vehicle.get_driver()) + end + if vehicle.get_passenger() then + table.insert(passengers, vehicle.get_passenger()) + end + + for _, passenger in pairs(passengers) do + if passenger.valid then passenger.destructible = false end + if remote.interfaces["jetpack"] and remote.interfaces["jetpack"]["block_jetpack"] then + remote.call("jetpack", "block_jetpack", {character=passenger}) + end + if passenger.player then + close_own_guis(passenger.player) + end + end + + local target_zone = Zone.find_nearest_solid_zone_from_zone(current_zone) + Zone.get_make_surface(target_zone) + + local zone_assets = Zone.get_force_assets(vehicle.force.name, target_zone.index) + + local landing_pads = {} + if zone_assets.rocket_landing_pad_names then + for name, pads in pairs(zone_assets.rocket_landing_pad_names) do + for _, pad in pairs(pads) do + table.insert(landing_pads, pad) + end + end + end + + local destination_position + if #landing_pads > 0 then + local pad = landing_pads[math.random(#landing_pads)] + if pad and pad.container and pad.container.valid then + local surface = Zone.get_make_surface(target_zone) + destination_position = surface.find_non_colliding_position(Capsule.name_space_capsule_vehicle, pad.container.position, 32, 1) or pad.container.position + end + end + if not destination_position then + destination_position = Zone.find_zone_landing_position(target_zone) + end + + global.space_capsule_launches = global.space_capsule_launches or {} + global.space_capsule_launches[vehicle.unit_number] = { + force_name = vehicle.force.name, + unit_number = vehicle.unit_number, + vehicle = vehicle, + shadow = shadow, + light = light, + start_position = vehicle.position, + launch_progress = 1, + destination_zone = target_zone, + destination_position = destination_position, + passengers = passengers, + } + + else -- invalid + if vehicle.get_driver() and vehicle.get_driver().player then + vehicle.get_driver().player.print("Invalid launch location") + end + if vehicle.get_passenger() and vehicle.get_passenger().player then + vehicle.get_driver().player.print("Invalid launch location") + end + end + +end + +function Capsule.gui_close (player) + if player.gui.left[Capsule.name_space_capsule_gui_root] then + player.gui.left[Capsule.name_space_capsule_gui_root].destroy() + end +end + +function Capsule.gui_open(player) + + local gui = player.gui.left + close_own_guis(player) + + local container = gui.add{ type = "frame", name = Capsule.name_space_capsule_gui_root, style="space_platform_container", direction="vertical"} + + local zone = Zone.from_surface(player.surface) + + local title = container.add{ type="label", name="title", caption={"space-exploration.space-capsule"}, style="space_platform_title"} + if not zone then + container.add{ type="label", name="status", caption="Status: Invalid launch location."} + container.add{ type="label", name="info", caption="If placed in space, this capsule can take you to the nearest planet or moon."} + elseif Zone.is_solid(zone) then + container.add{ type="label", name="status", caption="Not enough thrust to escape the ".. zone.type .. " " .. zone.name .. " gravity well. Insert into a Cargo Rocket Silo."} + container.add{ type="label", name="info", caption="If placed in space, this capsule can take you to the nearest planet or moon."} + else + local destination = Zone.find_nearest_solid_zone_from_zone(zone) + container.add{ type="label", name="info", caption="If placed in space, this capsule can take you to the nearest planet or moon."} + if destination then + container.add{ type="label", name="status", caption="Status: Ready to launch"} + container.add{ type="label", name="destination", caption="Destination: " .. destination.name} + local launch_button = container.add{ type="button", name="launch", caption={"space-exploration.button-launch"}, style="confirm_button"} + launch_button.style.top_margin = 10 + launch_button.style.horizontally_stretchable = true + launch_button.style.horizontal_align = "left" + else + container.add{ type="label", name="status", caption="Status: Unknown start position"} + end + end + +end + + +function Capsule.on_gui_click(event) + if event.element and event.element.valid and event.element.name == "launch" then + local element = event.element + local root = gui_element_or_parent(element, Capsule.name_space_capsule_gui_root) + if root then + local player = game.players[event.player_index] + local vehicle = player.vehicle + if vehicle then + Capsule.launch(vehicle) + end + end + end + +end +Event.addListener(defines.events.on_gui_click, Capsule.on_gui_click) + + +function Capsule.on_tick() + + if global.space_capsule_launches then + for _, space_capsule in pairs(global.space_capsule_launches) do + if not(space_capsule.vehicle and space_capsule.vehicle.valid) then + global.space_capsule_launches[space_capsule.unit_number] = nil + if space_capsule.rocket_sound and space_capsule.rocket_sound.valid then + space_capsule.rocket_sound.destroy() + end + if space_capsule.light and space_capsule.light.valid then + space_capsule.light.destroy() + end + if space_capsule.shadow and space_capsule.shadow.valid then + space_capsule.shadow.destroy() + end + else + space_capsule.launch_progress = space_capsule.launch_progress + 1 + local animation_speed = 1/3 + local animation_move_frame = 19 + local target_surface = Zone.get_make_surface(space_capsule.destination_zone) + + space_capsule.vehicle.destructible = false + + if space_capsule.launch_progress < animation_move_frame / animation_speed + 60 * 5 then + local animation_frames = 24 + local animation_frame = math.max(math.min(math.floor(space_capsule.launch_progress * animation_speed), animation_frames), 1) + + if animation_frame == 1 and not space_capsule.sounds_frame_1 then + space_capsule.sounds_frame_1 = true + space_capsule.rocket_sound = space_capsule.vehicle.surface.create_entity{ + name=mod_prefix.."sound-continous-silo-rocket", position=space_capsule.vehicle.position, target=space_capsule.vehicle, speed=0} + space_capsule.vehicle.surface.create_entity{ + name=mod_prefix.."sound-silo-clamps-on", position=space_capsule.vehicle.position, target=space_capsule.vehicle, speed=0} + space_capsule.vehicle.surface.create_entity{ + name=mod_prefix.."sound-machine-close", position=space_capsule.vehicle.position, target=space_capsule.vehicle, speed=0} + + end + if animation_frame == 19 and not space_capsule.sounds_frame_19 then + space_capsule.sounds_frame_19 = true + space_capsule.vehicle.surface.create_entity{ + name=mod_prefix.."sound-train-breaks", position=space_capsule.vehicle.position, target=space_capsule.vehicle, speed=0} + end + + local move_progress = math.max( 0, space_capsule.launch_progress - (animation_move_frame / animation_speed)) + local move_y = math.pow( math.max(0, move_progress), 1.5) / 100 + local position = { + x = space_capsule.start_position.x, + y = space_capsule.start_position.y - move_y + } + + if space_capsule.light then + space_capsule.light.teleport({x = position.x, y = position.y + 1}) + end + if space_capsule.rocket_sound and space_capsule.rocket_sound.valid then + space_capsule.rocket_sound.teleport(position) + end + space_capsule.vehicle.teleport(position) + space_capsule.vehicle.orientation = (animation_frame - 1) / animation_frames + if space_capsule.shadow then + space_capsule.shadow.graphics_variation = animation_frame + space_capsule.shadow.teleport({ + x = space_capsule.start_position.x + move_y, + y = space_capsule.start_position.y + }) + end + for _, passenger in pairs(space_capsule.passengers) do + if passenger.valid then + passenger.teleport({x = position.x, y = position.y - 0.5}) -- behind graphic + end + end + else + -- done + global.space_capsule_launches[space_capsule.unit_number] = nil + if space_capsule.rocket_sound and space_capsule.rocket_sound.valid then space_capsule.rocket_sound.destroy() end + if space_capsule.light and space_capsule.light.valid then space_capsule.light.destroy() end + if space_capsule.shadow and space_capsule.shadow.valid then space_capsule.shadow.destroy() end + + local safe_pos = target_surface.find_non_colliding_position(Capsule.name_space_capsule_vehicle, space_capsule.destination_position, 32, 1) + safe_pos = safe_pos or space_capsule.destination_position + target_surface.request_to_generate_chunks(safe_pos, 1) + target_surface.force_generate_chunk_requests() + local vehicle_2 = target_surface.create_entity{ + name = space_capsule.vehicle.name, + position = safe_pos, + force = space_capsule.vehicle.force + } + + local inv_a = space_capsule.vehicle.get_inventory(defines.inventory.car_trunk) + local inv_b = vehicle_2.get_inventory(defines.inventory.car_trunk) + Util.copy_inventory(inv_a, inv_b) + + space_capsule.vehicle.destroy() + space_capsule.vehicle = vehicle_2 + space_capsule.vehicle.orientation = 0 + space_capsule.shadow = target_surface.create_entity{name = Capsule.name_space_capsule_vehicle_shadow, position=safe_pos, force = "neutral"} + space_capsule.shadow.graphics_variation = 1 + space_capsule.light = target_surface.create_entity{name = Capsule.name_space_capsule_vehicle_light, position = space_capsule.vehicle.position, speed = 0, target = space_capsule.vehicle} + + for _, passenger in pairs(space_capsule.passengers) do + if passenger.valid then + passenger.destructible = true + if remote.interfaces["jetpack"] and remote.interfaces["jetpack"]["unblock_jetpack"] then + remote.call("jetpack", "unblock_jetpack", {character=passenger}) + end + teleport_character_to_surface(passenger, target_surface, safe_pos) + end + end + end + end + end + end + +end +-- TODO: only register this if that are any +Event.addListener(defines.events.on_tick, Capsule.on_tick) + +function Capsule.on_entity_removed(event) + local entity = event.entity + if entity and entity.valid then + if entity.name == Capsule.name_space_capsule_vehicle then + local shadow = entity.surface.find_entities_filtered{ area=util.position_to_area(entity.position, 1), name=Capsule.name_space_capsule_vehicle_shadow}[1] + local light = entity.surface.find_entities_filtered{ area=util.position_to_area(entity.position, 1), name=Capsule.name_space_capsule_vehicle_light}[1] + if shadow then shadow.destroy() end + if light then light.destroy() end + end + end +end +Event.addListener(defines.events.on_entity_died, Capsule.on_entity_removed) +Event.addListener(defines.events.on_robot_mined_entity, Capsule.on_entity_removed) +Event.addListener(defines.events.on_player_mined_entity, Capsule.on_entity_removed) +Event.addListener(defines.events.script_raised_destroy, Capsule.on_entity_removed) + +function Capsule.on_player_driving_changed_state(event) + local player = game.players[event.player_index] + if player then + if player.vehicle and player.vehicle.name == Capsule.name_space_capsule_vehicle then + Capsule.gui_open(player) + elseif player.gui.left[Capsule.name_space_capsule_gui_root] then + player.gui.left[Capsule.name_space_capsule_gui_root].destroy() + end + end +end +Event.addListener(defines.events.on_player_driving_changed_state, Capsule.on_player_driving_changed_state) + +function Capsule.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.name == Capsule.name_space_capsule_vehicle then + entity.orientation = 0 + entity.surface.create_entity{name = Capsule.name_space_capsule_vehicle_shadow, position = entity.position, force="neutral"} + entity.surface.create_entity{name = Capsule.name_space_capsule_vehicle_light, position = entity.position, speed = 0, target = entity} + end +end +Event.addListener(defines.events.on_built_entity, Capsule.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, Capsule.on_entity_created) +Event.addListener(defines.events.script_raised_built, Capsule.on_entity_created) +Event.addListener(defines.events.script_raised_revive, Capsule.on_entity_created) + +return Capsule diff --git a/space-exploration_0.5.58/space-exploration/scripts/compatibility/abandoned-ruins.lua b/space-exploration_0.5.58/space-exploration/scripts/compatibility/abandoned-ruins.lua new file mode 100644 index 0000000..72016ac --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/compatibility/abandoned-ruins.lua @@ -0,0 +1,14 @@ +local AbandonedRuins = {} +function AbandonedRuins.exclude_surfaces() + if remote.interfaces["AbandonedRuins"] and remote.interfaces["AbandonedRuins"]["exclude_surface"] then + remote.call("AbandonedRuins", "exclude_surface", "Vault") + remote.call("AbandonedRuins", "exclude_surface", "spaceship") + remote.call("AbandonedRuins", "exclude_surface", "Asteroid") + remote.call("AbandonedRuins", "exclude_surface", "Orbit") + remote.call("AbandonedRuins", "exclude_surface", "Foenestra") -- Note orbits, asteroid fields, etc should already be handled. + for _, space_zone in pairs(UniverseRaw.universe.space_zones) do + remote.call("AbandonedRuins", "exclude_surface", space_zone.name) + end + end +end +return AbandonedRuins diff --git a/space-exploration_0.5.58/space-exploration/scripts/compatibility/entity-move.lua b/space-exploration_0.5.58/space-exploration/scripts/compatibility/entity-move.lua new file mode 100644 index 0000000..c81a67d --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/compatibility/entity-move.lua @@ -0,0 +1,126 @@ +local EntityMove = {} + +-- whitelist is MUCH easier +EntityMove.whitelist_exact = { + "se-linked-container", + "se-pylon", + "se-pylon-substation", + "se-space-curved-rail", + "se-space-stright-rail", + "se-supercharger", + "se-delivery-cannon-chest", + "se-space-probe-rocket-silo", + "se-fluid-burner-generator", + +} +EntityMove.whitelist_find = { -- include grunded/spaced version, colour variants, etc + "se-linked-container", + "se-space-pipe", + "se-deep-space-transport-belt", + "se-deep-space-underground-belt", + "se-deep-space-splitter", + "se-addon-power-pole", + "se-naquium-heat-pipe", + "se-space-thermodynamics-laboratory", + "se-recycling-facility", + "se-space-mechanical-laboratory", + "se-pulveriser", + "se-space-assembling-machine", + "se-space-manufactory", + "se-lifesupport-facility", + "se-space-biochemical-laboratory", + "se-space-decontamination-facility", + "se-space-genetics-laboratory", + "se-space-growth-facility", + "se-fuel-refinery", + "se-space-radiation-laboratory", + "se-space-electromagnetics-laboratory", + "se-space-laser-laboratory", + "se-space-material-fabricator", + "se-space-laser-laboratory", + "se-space-particle-accelerator", + "se-space-particle-collider", + "se-space-plasma-generator", + "se-space-hypercooler", + "se-space-radiator", + "se-space-astrometrics-laboratory", + "se-space-gravimetrics-laboratory", + "se-space-supercomputer", + "se-space-laser-laboratory", + "se-space-telescope", + "se-space-science-lab", + "se-cargo-rocket-cargo-pod", + "se-space-laser-laboratory", + "se-big-heat-exchanger", + "se-antimatter-reactor", + "se-electric-boiler", + "se-space-solar-panel", + "se-space-accumulator", + "se-wide-beacon", +} + +function EntityMove.on_dolly_moved(event) + if event.moved_entity and event.moved_entity.valid then + local entity = event.moved_entity + if event.moved_entity.type == "beacon" then + local prototype = entity.prototype + local area = util.area_extend(entity.bounding_box, prototype.supply_area_distance) + local structures = entity.surface.find_entities_filtered{type = Beacon.affected_types, area = area} + for _, structure in pairs(structures) do + Beacon.validate_entity(structure, 0) + end + local start_area = Util.area_add_position(area, Util.vectors_delta(entity.position, event.start_pos)) + structures = entity.surface.find_entities_filtered{type = Beacon.affected_types, area = start_area} + for _, structure in pairs(structures) do + Beacon.validate_entity(structure, 0) + end + else + Beacon.validate_entity(entity, 0) + end + end +end + +function EntityMove.allow_move() + if remote.interfaces["PickerDollies"] and remote.interfaces["PickerDollies"]["add_blacklist_name"] then + for prototype_name, prototype in pairs(game.entity_prototypes) do + if string.starts(prototype_name, mod_prefix) then + local allowed = false + for _, name in pairs(EntityMove.whitelist_find) do + if string.find(prototype_name, name, 1, true) then + allowed = true + end + end + for _, name in pairs(EntityMove.whitelist_exact) do + if prototype_name == name then + allowed = true + end + end + if not allowed then + remote.call("PickerDollies", "add_blacklist_name", prototype_name) + end + end + end + end +end + +function EntityMove.on_load() + if remote.interfaces["PickerDollies"] and remote.interfaces["PickerDollies"]["dolly_moved_entity_id"] then + script.on_event(remote.call("PickerDollies", "dolly_moved_entity_id"), EntityMove.on_dolly_moved) + end +end +Event.addListener("on_load", EntityMove.on_load, true) + +function EntityMove.on_init() + if remote.interfaces["PickerDollies"] and remote.interfaces["PickerDollies"]["dolly_moved_entity_id"] then + script.on_event(remote.call("PickerDollies", "dolly_moved_entity_id"), EntityMove.on_dolly_moved) + end + EntityMove.allow_move() +end +Event.addListener("on_init", EntityMove.on_init, true) + +function EntityMove.on_configuration_changed() + EntityMove.allow_move() +end +Event.addListener("on_configuration_changed", EntityMove.on_configuration_changed, true) + +return EntityMove diff --git a/space-exploration_0.5.58/space-exploration/scripts/compatibility/miniloaders.lua b/space-exploration_0.5.58/space-exploration/scripts/compatibility/miniloaders.lua new file mode 100644 index 0000000..8b610db --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/compatibility/miniloaders.lua @@ -0,0 +1,16 @@ +-- NOTE: Always use the Event object for events otherwise it replaces other event handlers. +if script.active_mods["miniloader"] then + local miniloader_util = require("__miniloader__/lualib/util.lua") + + function miniloader_on_area_cloned(ev) + local miniloaders = miniloader_util.find_miniloaders{ + surface = ev.destination_surface, + area = ev.destination_area, + } + for _, loader in ipairs(miniloaders) do + miniloader_util.update_inserters(loader) + end + end + + Event.addListener(defines.events.on_area_cloned, miniloader_on_area_cloned) +end diff --git a/space-exploration_0.5.58/space-exploration/scripts/composites.lua b/space-exploration_0.5.58/space-exploration/scripts/composites.lua new file mode 100644 index 0000000..79389ab --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/composites.lua @@ -0,0 +1,98 @@ +local Composites = {} + +-- Simple composite_entites + +Composites.entities = { + ["pylon-construction"] = { + set = { + { name = mod_prefix.."pylon-construction"}, + { name = mod_prefix.."pylon-construction-roboport", destructible=false }, + } + }, + ["pylon-construction-radar"] = { + set = { + { name = mod_prefix.."pylon-construction-radar" }, + { name = mod_prefix.."pylon-construction-radar-radar", destructible=false }, + { name = mod_prefix.."pylon-construction-radar-roboport", destructible=false }, + } + } +} + +function Composites.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + for _, ce in pairs(Composites.entities) do + for i, struct in pairs(ce.set) do + if entity.name == struct.name then + for j, struct in pairs(ce.set) do + local e + if i == j then + e = entity + else + -- look for ghost or current + e = entity.surface.find_entity(struct.name, entity.position) + if not e then + local e_ghost = entity.surface.find_entities_filtered{ + ghost_name = struct.name, + position = entity.position + } + if e_ghost[1] then + local collides = nil + collides, e = e_ghost[1].silent_revive({return_item_request_proxy =false,raise_revive=false}) + end + end + if not e then + e = entity.surface.create_entity{ + name=struct.name, + position=entity.position, + direction=entity.direction, + force=entity.force + } + end + end + e.destructible = struct.destructible == nil and true or struct.destructible + end + return + end + end + end +end +Event.addListener(defines.events.on_built_entity, Composites.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, Composites.on_entity_created) +Event.addListener(defines.events.script_raised_built, Composites.on_entity_created) +Event.addListener(defines.events.script_raised_revive, Composites.on_entity_created) + + +function Composites.on_removed_entity(event) + if event.entity and event.entity.valid and event.entity.surface then + local entity = event.entity + for _, ce in pairs(Composites.entities) do + for i, struct in pairs(ce.set) do + if entity.name == struct.name then + for j, struct in pairs(ce.set) do + if j ~= i then + local e = entity.surface.find_entity(struct.name, entity.position) + if e then e.destroy() end + end + end + end + end + end + end +end +Event.addListener(defines.events.on_entity_died, Composites.on_removed_entity) +Event.addListener(defines.events.on_robot_mined_entity, Composites.on_removed_entity) +Event.addListener(defines.events.on_player_mined_entity, Composites.on_removed_entity) +Event.addListener(defines.events.script_raised_destroy, Composites.on_removed_entity) + +--function Composites.on_player_rotated_entity(event) +--end +--Event.addListener(defines.events.on_player_rotated_entity, Composites.on_player_rotated_entity) + +return Composites diff --git a/space-exploration_0.5.58/space-exploration/scripts/condenser-turbine.lua b/space-exploration_0.5.58/space-exploration/scripts/condenser-turbine.lua new file mode 100644 index 0000000..54d8814 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/condenser-turbine.lua @@ -0,0 +1,99 @@ +local CondenserTurbine = {} + +CondenserTurbine.name_condenser_turbine = mod_prefix.."condenser-turbine" +CondenserTurbine.name_condenser_turbine_generator = mod_prefix.."condenser-turbine-generator" +CondenserTurbine.name_condenser_turbine_tank = mod_prefix.."condenser-turbine-tank" +CondenserTurbine.condenser_turbine_tank_offset = 2 + +function CondenserTurbine.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.name == CondenserTurbine.name_condenser_turbine then + local direction_vector = Util.vector_multiply(Util.direction_to_vector(entity.direction), -1) + local tank_position_offset = Util.vector_multiply(direction_vector, CondenserTurbine.condenser_turbine_tank_offset) + local tank_position = Util.vectors_add(entity.position, tank_position_offset) + + local generator = entity.surface.create_entity{ + name = CondenserTurbine.name_condenser_turbine_generator, + position = entity.position, + direction = entity.direction, + force = entity.force + } + generator.destructible = false + local tank = entity.surface.create_entity{ + name = CondenserTurbine.name_condenser_turbine_tank, + position = tank_position, + direction = entity.direction, + force = entity.force + } + if tank then + tank.destructible = false + else + game.print("condenser-turbine-tank error") + end + end +end +Event.addListener(defines.events.on_built_entity, CondenserTurbine.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, CondenserTurbine.on_entity_created) +Event.addListener(defines.events.script_raised_built, CondenserTurbine.on_entity_created) +Event.addListener(defines.events.script_raised_revive, CondenserTurbine.on_entity_created) + + +function CondenserTurbine.on_removed_entity(event) + if event.entity and event.entity.valid and event.entity.surface + and event.entity.name == CondenserTurbine.name_condenser_turbine then + local entity = event.entity + + local direction_vector = Util.vector_multiply(Util.direction_to_vector(entity.direction), -1) + local tank_position_offset = Util.vector_multiply(direction_vector, CondenserTurbine.condenser_turbine_tank_offset) + local tank_position = Util.vectors_add(entity.position, tank_position_offset) + + local generator = entity.surface.find_entity(CondenserTurbine.name_condenser_turbine_generator, entity.position) + if generator then generator.destroy() end + + local tank = entity.surface.find_entity(CondenserTurbine.name_condenser_turbine_tank, tank_position) + if tank then tank.destroy() end + + end +end +Event.addListener(defines.events.on_entity_died, CondenserTurbine.on_removed_entity) +Event.addListener(defines.events.on_robot_mined_entity, CondenserTurbine.on_removed_entity) +Event.addListener(defines.events.on_player_mined_entity, CondenserTurbine.on_removed_entity) +Event.addListener(defines.events.script_raised_destroy, CondenserTurbine.on_removed_entity) + +function CondenserTurbine.on_player_rotated_entity(event) + if event.entity and event.entity.valid and event.entity.surface + and event.entity.name == CondenserTurbine.name_condenser_turbine then + local entity = event.entity + + local direction_vector = Util.vector_multiply(Util.direction_to_vector(entity.direction), -1) + local tank_position_offset = Util.vector_multiply(direction_vector, CondenserTurbine.condenser_turbine_tank_offset) + local tank_position = Util.vectors_add(entity.position, tank_position_offset) + + local tank = entity.surface.find_entity(CondenserTurbine.name_condenser_turbine_tank, tank_position) + if tank then + local direction_vector = Util.direction_to_vector(entity.direction) + local tank_position_offset = Util.vector_multiply(direction_vector, CondenserTurbine.condenser_turbine_tank_offset) + local tank_position = Util.vectors_add(entity.position, tank_position_offset) + tank.teleport(tank_position) + tank.rotate() + tank.rotate() + end + + end +end +Event.addListener(defines.events.on_player_rotated_entity, CondenserTurbine.on_player_rotated_entity) + +function CondenserTurbine.reset_surface(surface) + for _, entity in pairs(surface.find_entities_filtered{name = CondenserTurbine.name_condenser_turbine_tank }) do + entity.direction = entity.direction + end +end + +return CondenserTurbine diff --git a/space-exploration_0.5.58/space-exploration/scripts/core-miner.lua b/space-exploration_0.5.58/space-exploration/scripts/core-miner.lua new file mode 100644 index 0000000..49259b7 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/core-miner.lua @@ -0,0 +1,199 @@ +Coreminer = {} + +-- constants +Coreminer.name_core_miner = mod_prefix.."core-miner" +Coreminer.name_core_miner_drill = mod_prefix.."core-miner-drill" +Coreminer.name_core_mining_recipe = mod_prefix.."core-mining" +Coreminer.resource_normal = 1000000 + +function Coreminer.resource_to_fragment_name(resource_name) + local try_name = util.mod_prefix .. "core-fragment-" .. resource_name + if game.item_prototypes[try_name] then + return try_name + end + -- otherwise there is no fragment +end + +function Coreminer.variation_to_direction(var) + if var == 1 then + return defines.direction.south + elseif var == 2 then + return defines.direction.west + elseif var == 3 then + return defines.direction.north + else + return defines.direction.east + end +end + +function Coreminer.direction_to_variation(dir) + if dir == defines.direction.south then + return 1 + elseif dir == defines.direction.west then + return 2 + elseif dir == defines.direction.north then + return 3 + else + return 4 + end +end + +function Coreminer.default_fragment_name(zone) + if not zone.fragment_name then + zone.fragment_name = Coreminer.resource_to_fragment_name(zone.primary_resource) + if not zone.fragment_name then + -- maybe choose something at random? + error("Primary resource has no core fragment: " .. zone.name ) + zone.fragment_name = util.mod_prefix .. "core-fragment-omni" + end + end +end + +function Coreminer.equalise(zone, surface) + if not zone then + zone = Zone.from_surface(surface) + end + if not (zone and surface) then return end + Coreminer.default_fragment_name(zone) + + local resources = surface.find_entities_filtered{ + type = "resource", + name = zone.fragment_name + } + --local zone_efficiency = zone.type == "planet" and 0.5 or 0.25 + local zone_efficiency = zone.radius / 6000 + local efficiency = math.sqrt(#resources) / #resources + for _, resource in pairs(resources) do + local new_amount = Coreminer.resource_normal * zone_efficiency * efficiency + if resource.amount ~= new_amount then + resource.amount = new_amount + surface.create_entity{ + name = "flying-text", + position = resource.position, + text = string.format("%.2f", efficiency * 100).."% effective", + } + end + end +end + +function Coreminer.equalise_all() + if global.zone_index then + for _, zone in pairs(global.zone_index) do + if zone.surface_index and Zone.is_solid(zone) then + Coreminer.equalise(zone, Zone.get_surface(zone)) + end + end + end +end + +function Coreminer.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.name == Coreminer.name_core_miner or entity.name == Coreminer.name_core_miner_drill then + local zone = Zone.from_surface(entity.surface) + if zone and Zone.is_solid(zone) then + Coreminer.default_fragment_name(zone) + if not zone.fragment_name then + game.print("[color=red]Error: This surface is missing a core fragment setting. Please report the issue.[/color]") + cancel_entity_creation(entity, event.player_index, "Error") + else + local resource = entity.surface.create_entity{ + name = zone.fragment_name, + position = entity.position, + direction = entity.direction, + amount = 1, + } + + if entity.name ~= Coreminer.name_core_miner_drill then + local drill = entity.surface.create_entity{ + name = Coreminer.name_core_miner_drill, + position = {x = entity.position.x, y = entity.position.y + 1/32}, + direction = entity.direction, + --direction = defines.direction.south, + --direction = Coreminer.variation_to_direction(entity.graphics_variation), + force = entity.force + } + -- drill is selectable so make that the one that takes damage + --drill.destructible = false + entity.destructible = false + end + Coreminer.equalise(zone, entity.surface) + end + else + cancel_entity_creation(entity, event.player_index, "Must be placed on a Planet or Moon.") + return + end + end + +end +Event.addListener(defines.events.on_built_entity, Coreminer.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, Coreminer.on_entity_created) +Event.addListener(defines.events.script_raised_built, Coreminer.on_entity_created) +Event.addListener(defines.events.script_raised_revive, Coreminer.on_entity_created) + +function Coreminer.on_entity_removed(event) + if event.entity and event.entity.valid then + local surface = event.entity.surface + if event.entity.name == Coreminer.name_core_miner then + local e = event.entity.surface.find_entity(Coreminer.name_core_miner_drill, event.entity.position) + if e then e.destroy() end + local resources = event.entity.surface.find_entities_filtered{ type="resource", area = Util.position_to_area(event.entity.position, 1)} + for _, resource in pairs(resources) do + resource.destroy() + end + Coreminer.equalise(nil, surface) + elseif event.entity.name == Coreminer.name_core_miner_drill then + local e = event.entity.surface.find_entity(Coreminer.name_core_miner, event.entity.position) + if e then e.destroy() end + local resources = event.entity.surface.find_entities_filtered{ type="resource", area = Util.position_to_area(event.entity.position, 1)} + for _, resource in pairs(resources) do + resource.destroy() + end + Coreminer.equalise(nil, surface) + end + end +end +Event.addListener(defines.events.on_player_mined_entity, Coreminer.on_entity_removed) +Event.addListener(defines.events.on_robot_mined_entity, Coreminer.on_entity_removed) +Event.addListener(defines.events.on_entity_died, Coreminer.on_entity_removed) +Event.addListener(defines.events.script_raised_destroy, Coreminer.on_entity_removed) + +-- simple entity does not support rotation, bake into graphics variation +function Coreminer.on_player_rotated_entity(event) + if event.entity and event.entity.valid then + local surface = event.entity.surface + if event.entity.name == Coreminer.name_core_miner_drill then + local e = event.entity.surface.find_entity(Coreminer.name_core_miner, event.entity.position) + --if e then e.graphics_variation = Coreminer.direction_to_variation(event.entity.direction) end + if e then e.direction = event.entity.direction end + end + end +end +Event.addListener(defines.events.on_player_rotated_entity, Coreminer.on_player_rotated_entity) + +function Coreminer.update_zone_fragment_resources(zone) + local surface = Zone.get_surface(zone) + if surface then + for _, entity in pairs(surface.find_entities_filtered{name = mod_prefix.."core-miner"}) do + local resources = surface.find_entities_filtered{type = "resource", area = Util.position_to_area(entity.position, 2)} + for _, resource in pairs(resources) do + resource.destroy() + end + local resource = entity.surface.create_entity{ + name = zone.fragment_name, + position = entity.position, + direction = entity.direction, + amount = 1, + } + end + Coreminer.equalise(zone, surface) + end +end + +return Coreminer diff --git a/space-exploration_0.5.58/space-exploration/scripts/delivery-cannon-gui.lua b/space-exploration_0.5.58/space-exploration/scripts/delivery-cannon-gui.lua new file mode 100644 index 0000000..30a7ac3 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/delivery-cannon-gui.lua @@ -0,0 +1,379 @@ +local DeliveryCannonGUI = {} + +DeliveryCannonGUI.name_delivery_cannon_gui_root = mod_prefix.."delivery-cannon" + +--- Create the delivery cannon gui for a player +---@param player any +---@param delivery_cannon any +function DeliveryCannonGUI.gui_open(player, delivery_cannon) + DeliveryCannonGUI.gui_close(player) + if not delivery_cannon then Log.trace('DeliveryCannonGUI.gui_open delivery_cannon not found') return end + + local gui = player.gui.relative + local playerdata = get_make_playerdata(player) + + local anchor = {gui=defines.relative_gui_type.assembling_machine_gui, position=defines.relative_gui_position.right} + local container = gui.add{ + type = "frame", + name = DeliveryCannonGUI.name_delivery_cannon_gui_root, + style="space_platform_container", + direction="vertical", + anchor = anchor, + -- use gui element tags to store a reference to what delivery cannon this gui is displaying/controls + tags = { + unit_number = delivery_cannon.unit_number + } + } + container.style.vertically_stretchable = "stretch_and_expand" + + local title_flow = container.add{type = "flow", "cannon-title-flow", direction = "horizontal"} + title_flow.add{type = "label", name = "cannon-title-label", style = "frame_title", caption = {"space-exploration.relative-window-settings"}, ignored_by_interaction = true} + local title_empty = title_flow.add { + type = "empty-widget", + style = "draggable_space", + ignored_by_interaction = true + } + title_empty.style.horizontally_stretchable = "on" + title_empty.style.left_margin = 4 + title_empty.style.right_margin = 0 + title_empty.style.height = 24 + + local bar + + container.add{ type="label", name="energy", caption="Energy: "} + bar = container.add{ type="progressbar", name="energy_progress", size = 300, value=0, style="space_platform_progressbar_capsule"} + bar.style.horizontally_stretchable = true + + container.add{ type="label", name="payload", caption="Payload: "} + + local active_container = container.add{ type="flow", name="active_container", direction="horizontal"} + active_container.style.vertical_align = "center" + + local self_button = active_container.add{ type="sprite-button", name=DeliveryCannonGUI.name_delivery_cannon_gui_root.."_show", tooltip = {"space-exploration.show-own-location"}, + sprite = "item/".. DeliveryCannon.variants[delivery_cannon.variant].name} + self_button.style.right_margin = 10 + + local switch = active_container.add{type="switch", name="off_switch", left_label_caption={"space-exploration.off"}, right_label_caption={"space-exploration.on"}, switch_state = delivery_cannon.is_off and "left" or "right"} + + container.add{ type="line", name="line"} + + container.add{ type="label", name="destination-label", caption="Destination:"} + container.add{type="checkbox", name="list-zones-alphabetical", caption="List destinations alphabetically", state=playerdata.zones_alphabetical and true or false} + + local filter_container = container.add{ type="flow", name="filter_flow", direction="horizontal"} + local filter_field = filter_container.add{ type="textfield", name="filter_list"} + filter_field.style.width = 275 + local filter_button = filter_container.add{ type = "sprite-button", name="clear_filter", sprite="utility/search_icon", + tooltip={"space-exploration.clear-filter"},} + filter_button.style.left_margin = 5 + filter_button.style.width = 28 + filter_button.style.height = 28 + + local destination_zone = delivery_cannon.destination.zone + + local list, selected_index, values + if delivery_cannon.zone.type == "anomaly" or (delivery_cannon.zone.space_distortion and delivery_cannon.zone.space_distortion > 0) then -- only target none or self + list = {"None", Zone.dropdown_name_from_zone(delivery_cannon.zone)} + values = { {type = "none"}, {type = delivery_cannon.zone.type == "spaceship" and "spaceship" or "zone", index = delivery_cannon.zone.index}} + selected_index = destination_zone and 2 or 1 + else + local star = Zone.find_parent_star(delivery_cannon.zone) or Zone.find_nearest_star(delivery_cannon.zone.stellar_position) + list, selected_index, values = Zone.dropdown_list_zone_destinations( + delivery_cannon.force_name, + destination_zone, + playerdata.zones_alphabetical, + nil, + {list = "None", value = {type = "none"}}, -- wildcard + star + ) + if selected_index == 1 then selected_index = 2 end + end + local zones_dropdown = container.add{ type="drop-down", name="delivery-cannon-list-zones", items=list, selected_index=selected_index or 2} + zones_dropdown.style.horizontally_stretchable = true + player_set_dropdown_values(player, "delivery-cannon-list-zones", values) + + container.add{ type="label", name="destination-location-label", caption="Destination Position:"} + + local destination_location_table = container.add{type="table", name="destination_location_table", column_count=3, draw_horizontal_lines=false} + destination_location_table.style.horizontally_stretchable = true + destination_location_table.style.column_alignments[1] = "left" -- title, search, zone list table + destination_location_table.style.column_alignments[2] = "right" -- starmap, close, selected zone info + + destination_location_table.add{ type="sprite-button", name="destination_location_button", + sprite="item/artillery-targeting-remote", tooltip = "Choose coordinates"} + destination_location_table.destination_location_button.style.right_margin = 10 + destination_location_table.add{ type="label", name="destination_location_coordinates", caption=""} + destination_location_table.style.bottom_margin = 10 + + if delivery_cannon.variant == "weapon" then + local auto_switch = container.add{type="switch", name="auto_switch", left_label_caption={"space-exploration.wdc_auto_off"}, right_label_caption={"space-exploration.wdc_auto_on"}, switch_state = delivery_cannon.auto_select_targets and "right" or "left"} + end + + if settings.get_player_settings(player)["se-show-zone-preview"].value then + container.add{ type="label", name="destination-location-preview-label", caption="Destination Preview:"} + local preview_frame = container.add{type="frame", name="destination-location-preview-frame", style="informatron_inside_deep_frame"} + preview_frame.style.horizontally_stretchable = true + preview_frame.style.vertically_stretchable = true + preview_frame.style.top_margin = 10 + end + DeliveryCannonGUI.gui_update(player) +end + +function DeliveryCannonGUI.preview_frame_update(preview_frame, delivery_cannon) + local valid_location = false + local surface = nil + if DeliveryCannon.has_destination(delivery_cannon) then + surface = Zone.get_surface(delivery_cannon.destination.zone) + if surface then + valid_location = true + end + end + preview_frame.clear() + if valid_location then + local camera = preview_frame.add{type="camera", name="preview_camera", position=delivery_cannon.destination.coordinate, zoom=0.5, surface_index=surface.index} + camera.style.vertically_stretchable = true + camera.style.horizontally_stretchable = true + end +end + +function DeliveryCannonGUI.gui_update(player) + local root = player.gui.relative[DeliveryCannonGUI.name_delivery_cannon_gui_root] + if (root and root.tags) then + local delivery_cannon = DeliveryCannon.from_unit_number(root.tags.unit_number) + if delivery_cannon then + local valid = DeliveryCannon.is_valid(delivery_cannon) + if valid then + local format_energy = function(energy) + return string.format("%.2f",energy/1000000) .. "MJ" + end + if root["energy"] then + root["energy"].caption={ + "space-exploration.delivery_cannon_label_energy", + format_energy(delivery_cannon.energy_interface.energy) .. " / " .. (delivery_cannon.required_energy and format_energy(delivery_cannon.required_energy) or "?") + } + root["energy_progress"].value = delivery_cannon.required_energy and ((delivery_cannon.energy or 0) / delivery_cannon.required_energy) or 0 + end + + if root["payload"] then + root["payload"].caption={ + "space-exploration.delivery_cannon_label_payload", + delivery_cannon.payload_name and (game.item_prototypes[delivery_cannon.payload_name].localised_name) or "Empty" + } + end + + if root.destination_location_table and root.destination_location_table.destination_location_coordinates then + local coordinate = DeliveryCannon.get_coordinate(delivery_cannon) + if coordinate then + root.destination_location_table.destination_location_coordinates.caption = {"space-exploration.delivery-cannon-valid-coordinates", coordinate.x, coordinate.y} + else + root.destination_location_table.destination_location_coordinates.caption = {"space-exploration.delivery-cannon-invalid-coordinates"} + end + end + + if root["auto_switch"] then + root["auto_switch"].switch_state = delivery_cannon.auto_select_targets and "right" or "left" + end + + if root["off_switch"] then + root["off_switch"].switch_state = delivery_cannon.is_off and "left" or "right" + end + + if root["destination-location-preview-frame"] then + DeliveryCannonGUI.preview_frame_update(root["destination-location-preview-frame"], delivery_cannon) + end + end + end + end +end + +function DeliveryCannonGUI.gui_update_destinations_list(player) + local playerdata = get_make_playerdata(player) + local root = player.gui.relative[DeliveryCannonGUI.name_delivery_cannon_gui_root] + if root and root.tags then + local delivery_cannon = DeliveryCannon.from_unit_number(root.tags.unit_number) + if not delivery_cannon then return end + + local filter = nil + if root.filter_flow and root.filter_flow.filter_list then + filter = string.trim(root.filter_flow.filter_list.text) + if filter == "" then + filter = nil + end + end + + -- update the list + local destination_zone = delivery_cannon.destination.zone + + if delivery_cannon.zone.type == "anomaly" or (delivery_cannon.zone.space_distortion and delivery_cannon.zone.space_distortion > 0) then -- only target none or self + list = {"None", Zone.dropdown_name_from_zone(delivery_cannon.zone)} + values = { {type = "none"}, {type = delivery_cannon.zone.type == "spaceship" and "spaceship" or "zone", index = delivery_cannon.zone.index}} + selected_index = destination_zone and 2 or 1 + else + local star = Zone.find_parent_star(delivery_cannon.zone) or Zone.find_nearest_star(delivery_cannon.zone.stellar_position) + list, selected_index, values = Zone.dropdown_list_zone_destinations( + delivery_cannon.force_name, + destination_zone, + playerdata.zones_alphabetical, + filter, + {list = "None", value = {type = "none"}}, -- wildcard + star + ) + if selected_index == 1 then selected_index = 2 end + end + root["delivery-cannon-list-zones"].items = list + root["delivery-cannon-list-zones"].selected_index = selected_index or 2 + player_set_dropdown_values(player, "delivery-cannon-list-zones", values) + end +end + +function DeliveryCannonGUI.on_gui_click(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, DeliveryCannonGUI.name_delivery_cannon_gui_root) + if not (root and root.tags) then return end + local delivery_cannon = DeliveryCannon.from_unit_number(root.tags.unit_number) + if not delivery_cannon then return end + if element.name == "delivery-cannon-list-zones" then + + local value = player_get_dropdown_value(player, element.name, element.selected_index) + if type(value) == "table" then + if value.type == "zone" then + local zone_index = value.index + local zone = Zone.from_zone_index(zone_index) + if zone then + if delivery_cannon.destination.zone ~= zone then + delivery_cannon.destination.zone = zone + delivery_cannon.destination.coordinate = nil + end + delivery_cannon.required_energy = DeliveryCannon.variants[delivery_cannon.variant].energy_per_delta_v * DeliveryCannon.get_delta_v(delivery_cannon.zone, delivery_cannon.destination.zone) + Log.trace("set destination to location: " .. zone.name ) + else + delivery_cannon.destination.zone = nil + delivery_cannon.required_energy = nil + end + else + delivery_cannon.destination.zone = nil + delivery_cannon.required_energy = nil + end + DeliveryCannonGUI.gui_update(player) + else + DeliveryCannonGUI.gui_close(player) + Log.trace("Error: Non-table value ") + end + elseif element.name == "clear_filter" then + element.parent.filter_list.text = "" + DeliveryCannonGUI.gui_update_destinations_list(player) + elseif element.name == DeliveryCannonGUI.name_delivery_cannon_gui_root.."_show" then + local playerdata = get_make_playerdata(player) + RemoteView.start(player, delivery_cannon.zone) + if not player.character then + local surface = Zone.get_surface(delivery_cannon.zone) + player.teleport(delivery_cannon.main.position, surface) + end + playerdata.remote_view_activity = nil + if player.opened == delivery_cannon.main then player.opened = nil end + elseif element.name == "destination_location_button" then + local playerdata = get_make_playerdata(player) + local player_zone = Zone.from_surface(player.surface) + RemoteView.start(player, delivery_cannon.destination.zone) + -- only change the player's position to that of the delivery cannon if its on a different surface + -- this lets the player keep updating the position of the delivery cannon as long as they stay in nav + -- view on the targeted surface + if delivery_cannon.destination.coordinate and (not player.character) and player_zone ~= delivery_cannon.destination.zone then + player.teleport(DeliveryCannon.get_coordinate(delivery_cannon)) + end + playerdata.remote_view_activity = { + type = DeliveryCannon.name_target_activity_type, + delivery_cannon = delivery_cannon + } + player.cursor_stack.set_stack({name = DeliveryCannon.name_delivery_cannon_targeter, count = 1}) + player.opened = nil + end +end +Event.addListener(defines.events.on_gui_click, DeliveryCannonGUI.on_gui_click) +Event.addListener(defines.events.on_gui_selection_state_changed, DeliveryCannonGUI.on_gui_click) + +function DeliveryCannonGUI.on_gui_switch_state_changed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, DeliveryCannonGUI.name_delivery_cannon_gui_root) + if not (root and root.tags) then return end + local delivery_cannon = DeliveryCannon.from_unit_number(root.tags.unit_number) + if not delivery_cannon then return end + if element.name == "off_switch" then + delivery_cannon.is_off = element.switch_state == "left" + elseif element.name == "auto_switch" then + delivery_cannon.auto_select_targets = element.switch_state == "right" + end +end +Event.addListener(defines.events.on_gui_switch_state_changed, DeliveryCannonGUI.on_gui_switch_state_changed) + +function DeliveryCannonGUI.on_gui_checked_state_changed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, DeliveryCannonGUI.name_delivery_cannon_gui_root) + if not (root and root.tags) then return end + local delivery_cannon = DeliveryCannon.from_unit_number(root.tags.unit_number) + if not delivery_cannon then return end + if element.name == "list-zones-alphabetical" then + local playerdata = get_make_playerdata(player) + playerdata.zones_alphabetical = element.state + DeliveryCannonGUI.gui_update_destinations_list(player) + end +end +Event.addListener(defines.events.on_gui_checked_state_changed, DeliveryCannonGUI.on_gui_checked_state_changed) + +function DeliveryCannonGUI.on_gui_text_changed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, DeliveryCannonGUI.name_delivery_cannon_gui_root) + if root then -- remote view + if element.name == "filter_list" then + DeliveryCannonGUI.gui_update_destinations_list(player) + end + end +end +Event.addListener(defines.events.on_gui_text_changed, DeliveryCannonGUI.on_gui_text_changed) + +--- Close the delivery cannon gui for a player +---@param player any +function DeliveryCannonGUI.gui_close (player) + if player.gui.relative[DeliveryCannonGUI.name_delivery_cannon_gui_root] then + player.gui.relative[DeliveryCannonGUI.name_delivery_cannon_gui_root].destroy() + end +end + +--- Respond to the main entity GUI being closed by destroying the relative GUI +---@param event any +function DeliveryCannonGUI.on_gui_closed(event) + local player = game.players[event.player_index] + if player and event.entity and (event.entity.name == DeliveryCannon.variants["logistic"].name or event.entity.name == DeliveryCannon.variants["weapon"].name) then + DeliveryCannonGUI.gui_close(player) + end +end +Event.addListener(defines.events.on_gui_closed, DeliveryCannonGUI.on_gui_closed) + +--- Opens the delivery cannon gui when a delivery cannon is clicked +--- Closes the delivery cannon gui when another gui is opened +---@param event any +function DeliveryCannonGUI.on_gui_opened(event) + local player = game.players[event.player_index] + if event.entity and event.entity.valid and + (event.entity.name == DeliveryCannon.variants["logistic"].name or event.entity.name == DeliveryCannon.variants["weapon"].name) then + if RemoteView.is_unlocked(player) then + DeliveryCannonGUI.gui_open(player, DeliveryCannon.from_entity(event.entity)) + else + player.print({"space-exploration.remote-view-requires-satellite"}) + end + else + DeliveryCannonGUI.gui_close(player) + end +end +Event.addListener(defines.events.on_gui_opened, DeliveryCannonGUI.on_gui_opened) + + +return DeliveryCannonGUI diff --git a/space-exploration_0.5.58/space-exploration/scripts/delivery-cannon.lua b/space-exploration_0.5.58/space-exploration/scripts/delivery-cannon.lua new file mode 100644 index 0000000..0a8a56e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/delivery-cannon.lua @@ -0,0 +1,602 @@ +local DeliveryCannon = {} + +DeliveryCannon.variants = { + ["logistic"] = { + name = mod_prefix.."delivery-cannon", + name_energy_interface = mod_prefix.."delivery-cannon-energy-interface", + name_beam = mod_prefix.."delivery-cannon-beam", + beam_offset = {x = -0.5, y = -5}, + name_capsule = mod_prefix.."delivery-cannon-capsule", + name_capsule_projectile = mod_prefix.."delivery-cannon-capsule-projectile", + energy_per_delta_v = 50000, + }, + ["weapon"] = { + name = mod_prefix.."delivery-cannon-weapon", + name_energy_interface = mod_prefix.."delivery-cannon-weapon-energy-interface", + name_beam = mod_prefix.."delivery-cannon-weapon-beam", + beam_offset = {x = -1, y = -5}, + name_capsule = mod_prefix.."delivery-cannon-weapon-capsule", + name_capsule_projectile = mod_prefix.."delivery-cannon-weapon-capsule-projectile", + energy_per_delta_v = 500000, + } +} + +DeliveryCannon.name_delivery_cannon_chest = mod_prefix.."delivery-cannon-chest" + +DeliveryCannon.name_delivery_cannon_capsule_shadow = mod_prefix.."delivery-cannon-capsule-shadow" +DeliveryCannon.name_delivery_cannon_capsule_explosion = mod_prefix.."delivery-cannon-capsule-explosion" + +DeliveryCannon.name_delivery_cannon_targeter = mod_prefix.."delivery-cannon-targeter" +DeliveryCannon.name_target_activity_type = "delivery-cannon-target" + +DeliveryCannon.capsule_fall_altitude = 100 +DeliveryCannon.capsule_fall_time = 2 * 60 + +DeliveryCannon.name_event_copy_entity_settings = mod_prefix.."copy-entity-settings" + +---@class DeliveryCannon All data necessary to maintain the state of a delivery cannon + +--- Gets the DeliveryCannon for this unit_number +---@param unit_number number +function DeliveryCannon.from_unit_number (unit_number) + if not unit_number then Log.trace("DeliveryCannon.from_unit_number: invalid unit_number: nil") return end + unit_number = tonumber(unit_number) + -- NOTE: only supports container as the entity + if global.delivery_cannons[unit_number] then + return global.delivery_cannons[unit_number] + else + Log.trace("DeliveryCannon.from_unit_number: invalid unit_number: " .. unit_number) + end +end + +--- Gets the DeliveryCannon for this entity +---@param entity LuaEntity +function DeliveryCannon.from_entity (entity) + if not(entity and entity.valid) then + Log.trace("DeliveryCannon.from_entity: invalid entity") + return + end + -- NOTE: only supports container as the entity + return DeliveryCannon.from_unit_number(entity.unit_number) +end + +--- Computes the cost to launch a delivery cannon +---@param origin Zone launch zone +---@param destination Zone destination zone +function DeliveryCannon.get_delta_v(origin, destination) + if origin and destination then + return Zone.get_launch_delta_v(origin) + Zone.get_travel_delta_v(origin, destination) + end +end + +--- Get the coordinate the delivery cannon is targetting +---@param delivery_cannon DeliveryCannon delivery cannon data +function DeliveryCannon.get_coordinate(delivery_cannon) + if delivery_cannon.destination and delivery_cannon.destination.coordinate then + return delivery_cannon.destination.coordinate + end + return nil +end + +--- Does the delivery cannon have a destination set +---@param delivery_cannon DeliveryCannon delivery cannon data +function DeliveryCannon.has_destination(delivery_cannon) + return delivery_cannon and delivery_cannon.destination and delivery_cannon.destination.coordinate and delivery_cannon.destination.zone +end + +--- Returns if this delivery cannon is valid +---@param delivery_cannon DeliveryCannon delivery cannon data +function DeliveryCannon.is_valid(delivery_cannon) + return delivery_cannon and delivery_cannon.main and delivery_cannon.main.valid + and delivery_cannon.energy_interface and delivery_cannon.energy_interface.valid +end + +--- Returns if this delivery cannon can fire +---@param delivery_cannon DeliveryCannon delivery cannon data +function DeliveryCannon.can_fire(delivery_cannon) + return delivery_cannon and (not delivery_cannon.is_off) + and delivery_cannon.energy and delivery_cannon.required_energy + and delivery_cannon.energy >= delivery_cannon.required_energy +end + +--- Gets the stack that this delivery cannon is ready to fire +---@param delivery_cannon any +function DeliveryCannon.get_stack(delivery_cannon) + if not delivery_cannon then return end + local recipe = delivery_cannon.main.get_recipe() + if not recipe then return end + if string.find(recipe.name, "se-delivery-cannon-weapon-pack-", 1, true) then + local ammo_name = Util.replace(recipe.name, "se-delivery-cannon-weapon-pack-", "") + local ammo = game.item_prototypes[ammo_name] + if ammo then + return {name = ammo_name, count = 1} + end + else + for _, ingredient in pairs(recipe.ingredients) do + if ingredient.name ~= DeliveryCannon.variants[delivery_cannon.variant].name_capsule then + local stack = ingredient + stack.count = stack.amount or stack.count + return stack + end + end + end +end + +--- Displays a message that the delivery cannon projectile was destroyed by an opposing force +---@param delivery_cannon DeliveryCannon delivery cannon data +---@param defence_data any info about the destruction +---@param target_zone Zone the zone the delivery cannon was firing at +function DeliveryCannon.display_destroyed_projectile_message(delivery_cannon, defence_data, target_zone) + game.forces[delivery_cannon.force_name].print("Your delivery cannon canister from "..delivery_cannon.zone.name.." was destroyed by "..target_zone.name.." defences. ") + for force_name, shots_fired in pairs(defence_data) do + game.forces[force_name].print("Defences on "..target_zone.name + .." successfully shot down an enemy delivery cannon capsule. Shots fired: [img=item/se-meteor-defence] " + ..shots_fired.defence_shots.." [img=item/se-meteor-point-defence] "..shots_fired.point_defence_shots) + end +end + +--- Displays a message that the delivery cannon projectile was not destroyed by an opposing force +---@param delivery_cannon DeliveryCannon delivery cannon data +---@param defence_data any info about the (failed) destruction +---@param target_zone Zone the zone the delivery cannon was firing at +function DeliveryCannon.display_not_destroyed_projectile_message(delivery_cannon, defence_data, target_zone) + for force_name, shots_fired in pairs(defence_data) do + game.forces[force_name].print("[color=red]Defences on "..target_zone.name + .." failed to shoot down an enemy delivery cannon capsule. Shots fired: [img=item/se-meteor-defence] " + ..shots_fired.defence_shots.." [img=item/se-meteor-point-defence] "..shots_fired.point_defence_shots.."[/color]") + end +end + +--- Picks a new target for a delivery cannon +---@param delivery_cannon DeliveryCannon delivery cannon data +---@param target_zone Zone the zone to pick a target from +---@param target_surface LuaSurface the surface to pick a target from +function DeliveryCannon.pick_new_target(delivery_cannon, target_zone, target_surface) + local random_chunk = target_surface.get_random_chunk() + local position = {x = (random_chunk.x + math.random()) * 32, y = (random_chunk.y + math.random()) * 32} + if target_zone.radius and Util.vector_length(position) > target_zone.radius then + position = Util.vector_set_length(position, target_zone.radius * math.random()) + end + if math.random() < 0.99 then + local enemy = find_enemy(game.forces[delivery_cannon.force_name], target_surface, position) + if enemy then + position = enemy.position + end + end + delivery_cannon.destination.coordinate = position +end + +--- Adds a delivery cannon to the zone assets +---@param delivery_cannon DeliveryCannon delivery cannon data +function DeliveryCannon.add_delivery_cannon_to_table(delivery_cannon) + local type_table = DeliveryCannon.get_delivery_cannon_type_table(delivery_cannon) + type_table[delivery_cannon.unit_number] = delivery_cannon +end + +--- Gets the delivery cannon zone assets +---@param delivery_cannon DeliveryCannon delivery cannon data +function DeliveryCannon.get_delivery_cannon_type_table(delivery_cannon) + local zone_assets = Zone.get_force_assets(delivery_cannon.force_name, delivery_cannon.zone.index) + zone_assets.delivery_cannons = zone_assets.delivery_cannons or {} + return zone_assets.delivery_cannons +end + +--- Removes a delivery cannon from the zone assets +---@param delivery_cannon DeliveryCannon delivery cannon data +function DeliveryCannon.remove_delivery_cannon_from_table(delivery_cannon) + local type_table = DeliveryCannon.get_delivery_cannon_type_table(delivery_cannon) + if not type_table[delivery_cannon.unit_number] then return end + type_table[delivery_cannon.unit_number] = nil +end + +--- Fires a delivery cannon if it's ready to fire +---@param delivery_cannon DeliveryCannon delivery cannon data +function DeliveryCannon.attempt_fire(delivery_cannon) + -- only fire cannons that are valid, have a valid destination, and have enough energy to fire at that destination + if not DeliveryCannon.is_valid(delivery_cannon) then DeliveryCannon.destroy(delivery_cannon) return end + if not DeliveryCannon.has_destination(delivery_cannon) then return end + delivery_cannon.energy = delivery_cannon.energy_interface.energy + if not delivery_cannon.required_energy then + delivery_cannon.required_energy = DeliveryCannon.variants[delivery_cannon.variant].energy_per_delta_v * DeliveryCannon.get_delta_v(delivery_cannon.zone, delivery_cannon.destination.zone) + end + if not DeliveryCannon.can_fire(delivery_cannon) then return end + + -- only fire cannons with a valid payload ready + local cannon_inv = delivery_cannon.main.get_output_inventory() + delivery_cannon.payload_name = nil + delivery_cannon.payload_count = 0 + for name, count in pairs(cannon_inv.get_contents()) do -- should only be 1 + delivery_cannon.payload_name = name + delivery_cannon.payload_count = count + end + if not (delivery_cannon.payload_count > 0) then return end + + -- fire the cannon + local target_zone = delivery_cannon.destination.zone + local target_surface = Zone.get_make_surface(target_zone) + local target_position = DeliveryCannon.get_coordinate(delivery_cannon) + if delivery_cannon.force_name then game.forces[delivery_cannon.force_name].chart(target_surface, Util.position_to_area(target_position, 64)) end + local stack = DeliveryCannon.get_stack(delivery_cannon) + if not stack then error("Delivery Cannon tried to fire invalid stack") return end + cannon_inv.remove({name=delivery_cannon.payload_name, count=1}) + delivery_cannon.energy_interface.energy = delivery_cannon.energy_interface.energy - delivery_cannon.required_energy + delivery_cannon.main.surface.create_entity{ + name = DeliveryCannon.variants[delivery_cannon.variant].name_beam, + position = Util.vectors_add(delivery_cannon.main.position, DeliveryCannon.variants[delivery_cannon.variant].beam_offset ), + target = Util.vectors_add(delivery_cannon.main.position, {x = 0, y = -100}) + } + + -- give opposing force's meteor defence a chance to destroy the projectile + local payload = { + variant = delivery_cannon.variant, + stack = stack, + target_zone = target_zone, + target_position = target_position, + force_name = delivery_cannon.force_name, + eta = game.tick + DeliveryCannon.capsule_fall_time, + health = 1 + } + local defence_data = Meteor.defence_vs_projectile(payload) + if payload.health <= 0 then DeliveryCannon.display_destroyed_projectile_message(delivery_cannon, defence_data, target_zone) return end + + -- the projectile went through + DeliveryCannon.display_not_destroyed_projectile_message(delivery_cannon, defence_data, target_zone) + global.delivery_cannon_payloads = global.delivery_cannon_payloads or {} + table.insert(global.delivery_cannon_payloads, payload) + + local projectile_start_position = Util.vectors_add(target_position, {x = 0, y = -DeliveryCannon.capsule_fall_altitude}) + local shadow_start_position = Util.vectors_add(target_position, {x = DeliveryCannon.capsule_fall_altitude, y = 0}) + target_surface.create_entity{ + name = DeliveryCannon.variants[delivery_cannon.variant].name_capsule_projectile, + position = projectile_start_position, + target = target_position, + force = delivery_cannon.force_name, + speed = DeliveryCannon.capsule_fall_altitude/DeliveryCannon.capsule_fall_time + } + target_surface.create_entity{ + name = DeliveryCannon.name_delivery_cannon_capsule_shadow, + position = shadow_start_position, + target = target_position, + force = delivery_cannon.force_name, + speed = DeliveryCannon.capsule_fall_altitude/DeliveryCannon.capsule_fall_time + } + target_surface.request_to_generate_chunks(projectile_start_position) + target_surface.request_to_generate_chunks(shadow_start_position) + target_surface.request_to_generate_chunks(target_position) + + -- select a new target if it automatic mode + if delivery_cannon.auto_select_targets then + DeliveryCannon.pick_new_target(delivery_cannon, target_zone, target_surface) + end +end + +--- Performs the effect of a payload landing +--- If there is a delivery chest at the landing location, try to insert the payload item, +--- otherwise causes an explosion at the target and spills the items on the ground +---@param payload any the payload that is landing +function DeliveryCannon.do_payload_effect(payload) + local surface = Zone.get_make_surface(payload.target_zone) + local spill = payload.stack.count + local chest = surface.find_entity(DeliveryCannon.name_delivery_cannon_chest, payload.target_position) + if chest then + spill = spill - chest.insert(payload.stack) + end + if spill > 0 then + + surface.create_entity{ + name = DeliveryCannon.name_delivery_cannon_capsule_explosion, + position = payload.target_position, + force = payload.force_name + } + if payload.stack.name == "explosives" then -- double damage + surface.create_entity{ + name = DeliveryCannon.name_delivery_cannon_capsule_explosion, + position = payload.target_position, + force = payload.force_name + } + end + + local proto = game.item_prototypes[payload.stack.name] + local projectiles = {} + if proto.type == "ammo" then + local ammo_type = proto.get_ammo_type() + for _, action in pairs(ammo_type.action) do + for _, action_delivery in pairs(action.action_delivery) do + if action_delivery.type == "projectile" or action_delivery.type == "artillery" then + projectiles[action_delivery.projectile] = (projectiles[action_delivery.projectile] or 0) + 1 + end + end + end + end + if proto.type == "capsule" then + local ammo_type = proto.capsule_action.attack_parameters.ammo_type + for _, action in pairs(ammo_type.action) do + for _, action_delivery in pairs(action.action_delivery) do + if action_delivery.type == "projectile" or action_delivery.type == "artillery" then + projectiles[action_delivery.projectile] = (projectiles[action_delivery.projectile] or 0) + 1 + end + end + end + end + local no_items = false + for projectile_name, projectile_count in pairs(projectiles) do + no_items = true + surface.create_entity{ + name = projectile_name, + position = payload.target_position, + target = payload.target_position, + speed = 0.1, + force = payload.force_name + } + end + if not no_items then + local spill_stack = table.deepcopy(payload.stack) + spill_stack.count = math.ceil(spill/4) + surface.spill_item_stack(payload.target_position, spill_stack, true, payload.force_name, true) + end + end +end + +--- Updates all delivery cannons, potentially firing them or updating their guis +--- Checks are done infrequently, but still frequently enough that the cannon will never +--- get backed up while assembling at full speed +--- Updates all delivery cannons payloads, causing their effect when they hit +---@param delivery_cannon DeliveryCannon delivery cannon data +function DeliveryCannon.on_tick() + -- fire cannons + for _, delivery_cannon in pairs(global.delivery_cannons) do + if (game.tick + delivery_cannon.unit_number) % 60 == 0 then + DeliveryCannon.attempt_fire(delivery_cannon) + end + end + + -- update guis + if game.tick % 60 == 0 then + for _, player in pairs(game.connected_players) do + DeliveryCannonGUI.gui_update(player) + end + end + + -- process payloads + if global.delivery_cannon_payloads then + for i = #global.delivery_cannon_payloads, 1, -1 do + local payload = global.delivery_cannon_payloads[i] + if payload then + if game.tick >= payload.eta then + DeliveryCannon.do_payload_effect(payload) + table.remove(global.delivery_cannon_payloads, i) + end + end + end + end +end +Event.addListener(defines.events.on_tick, DeliveryCannon.on_tick) + +--- When the player selects an area using the targeter, set the delivery cannon to target that location +---@param event any +function DeliveryCannon.on_player_selected_area(event) + if (event.item == DeliveryCannon.name_delivery_cannon_targeter) then + local player = game.players[event.player_index] + local playerdata = get_make_playerdata(player) + if playerdata.remote_view_activity and playerdata.remote_view_activity.type == DeliveryCannon.name_target_activity_type then + local delivery_cannon = playerdata.remote_view_activity.delivery_cannon + if delivery_cannon.main and delivery_cannon.main.valid then + delivery_cannon.destination.coordinate = { + x = (event.area.left_top.x + event.area.right_bottom.x) / 2, + y = (event.area.left_top.y + event.area.right_bottom.y) / 2 + } + delivery_cannon.destination.zone = Zone.from_surface(player.surface) + player.print({"space-exploration.delivery-cannon-coordinates-set", math.floor(delivery_cannon.destination.coordinate.x), math.floor(delivery_cannon.destination.coordinate.y)}) + -- reopen the gui and stop targetting + player.opened = delivery_cannon.main + player.cursor_stack.set_stack(nil) + end + end + end +end +Event.addListener(defines.events.on_player_selected_area, DeliveryCannon.on_player_selected_area) + +function DeliveryCannon.get_make_energy_interface(entity, delivery_cannon) + local energy_interface = entity.surface.find_entity(DeliveryCannon.variants[delivery_cannon.variant].name_energy_interface, entity.position) + if energy_interface then return energy_interface end + local energy_interface_ghosts = entity.surface.find_entities_filtered{ + ghost_name = DeliveryCannon.variants[delivery_cannon.variant].name_energy_interface, + position = entity.position + } + if energy_interface_ghosts[1] and energy_interface_ghosts[1].valid then + local collisions, energy_interface = energy_interface_ghosts[1].revive({}) + if energy_interface then return energy_interface end + end + energy_interface = entity.surface.create_entity{ + name = DeliveryCannon.variants[delivery_cannon.variant].name_energy_interface, + force = entity.force, + position = {entity.position.x, entity.position.y} + } + return energy_interface +end + +function DeliveryCannon.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + + if not entity then return end + if entity.name == DeliveryCannon.variants["logistic"].name or entity.name == DeliveryCannon.variants["weapon"].name then + if not RemoteView.is_unlocked_force(entity.force.name) then + return cancel_entity_creation(entity, event.player_index, {"space-exploration.generic-requires-satellite"}) + end + local force_name = entity.force.name + + local zone = Zone.from_surface(entity.surface) + + if not zone then + return cancel_entity_creation(entity, event.player_index, "Invalid launch location") + end + + local delivery_cannon = { + type = entity.name, + variant = entity.name == DeliveryCannon.variants["logistic"].name and "logistic" or "weapon", + valid = true, + force_name = force_name, + unit_number = entity.unit_number, + main = entity, + zone = zone, + is_off = true, + destination = { + zone = nil + }, + launch_status = -1 + } + + global.delivery_cannons[entity.unit_number] = delivery_cannon + Log.trace("DeliveryCannon: delivery_cannon added") + + DeliveryCannon.add_delivery_cannon_to_table(delivery_cannon) -- assigns to zone_assets + + -- spawn energy interface + delivery_cannon.energy_interface = DeliveryCannon.get_make_energy_interface(entity, delivery_cannon) + delivery_cannon.energy_interface.destructible = false + + -- set settings + if event.tags then + if event.tags.destination then + delivery_cannon.destination.coordinate = event.tags.destination.coordinate + delivery_cannon.destination.zone = Zone.from_name(event.tags.destination.zone_name) + end + delivery_cannon.is_off = event.tags.is_off + delivery_cannon.auto_selects_targets = event.tags.auto_selects_targets + end + + if event.player_index and game.players[event.player_index] and game.players[event.player_index].connected then + DeliveryCannonGUI.gui_open(game.players[event.player_index], delivery_cannon) + end + end +end +Event.addListener(defines.events.on_entity_cloned, DeliveryCannon.on_entity_created) +Event.addListener(defines.events.on_built_entity, DeliveryCannon.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, DeliveryCannon.on_entity_created) +Event.addListener(defines.events.script_raised_built, DeliveryCannon.on_entity_created) +Event.addListener(defines.events.script_raised_revive, DeliveryCannon.on_entity_created) + +function DeliveryCannon.destroy_sub(delivery_cannon, key) + if delivery_cannon[key] and delivery_cannon[key].valid then + delivery_cannon[key].destroy() + delivery_cannon[key] = nil + end +end + +function DeliveryCannon.destroy(delivery_cannon, player_index) + if not delivery_cannon then + Log.trace("delivery_cannon_destroy: no delivery_cannon") + return + end + + delivery_cannon.valid = false + + DeliveryCannon.destroy_sub(delivery_cannon, 'main') + DeliveryCannon.destroy_sub(delivery_cannon, 'energy_interface') + + DeliveryCannon.remove_delivery_cannon_from_table(delivery_cannon) + global.delivery_cannons[delivery_cannon.unit_number] = nil + + -- if a player has this gui open then close it + local gui_name = DeliveryCannonGUI.name_delivery_cannon_gui_root + for _, player in pairs(game.connected_players) do + local root = player.gui.relative[gui_name] + if root and root.tags and root.tags.unit_number == delivery_cannon.unit_number then + root.destroy() + end + end +end + +function DeliveryCannon.on_entity_removed(event) + local entity = event.entity + if entity and entity.valid and + (entity.name == DeliveryCannon.variants["logistic"].name or entity.name == DeliveryCannon.variants["weapon"].name) then + DeliveryCannon.destroy(DeliveryCannon.from_entity(entity), event.player_index ) + end +end +Event.addListener(defines.events.on_entity_died, DeliveryCannon.on_entity_removed) +Event.addListener(defines.events.on_robot_mined_entity, DeliveryCannon.on_entity_removed) +Event.addListener(defines.events.on_player_mined_entity, DeliveryCannon.on_entity_removed) +Event.addListener(defines.events.script_raised_destroy, DeliveryCannon.on_entity_removed) + +--- Handles the player creating a blueprint by setting tags to store the state of delivery cannons +---@param event any +function DeliveryCannon.on_player_setup_blueprint(event) + local player_index = event.player_index + if player_index and game.players[player_index] and game.players[player_index].connected then + local player = game.players[player_index] + + -- this setup code and checks is a workaround for the fact that the event doesn't specify the blueprint on the event + -- and the player.blueprint_to_setup isn't actually set in the case of copy/paste or blueprint library or select new contents + local blueprint = nil + if player and player.blueprint_to_setup and player.blueprint_to_setup.valid_for_read then blueprint = player.blueprint_to_setup + elseif player and player.cursor_stack.valid_for_read and player.cursor_stack.is_blueprint then blueprint = player.cursor_stack end + if blueprint and blueprint.is_blueprint_setup() then + + + local mapping = event.mapping.get() + local blueprint_entities = blueprint.get_blueprint_entities() + if blueprint_entities then + for _, blueprint_entity in pairs(blueprint_entities) do + if blueprint_entity.name == DeliveryCannon.variants["logistic"].name or blueprint_entity.name == DeliveryCannon.variants["weapon"].name then + local entity = mapping[blueprint_entity.entity_number] + if entity then + local delivery_cannon = DeliveryCannon.from_entity(entity) + if delivery_cannon then + local tags = {} + if delivery_cannon.destination then + tags.destination = { + coordinate = delivery_cannon.destination.coordinate, + zone_name = delivery_cannon.destination.zone and delivery_cannon.destination.zone.name + } + end + tags.is_off = delivery_cannon.is_off + tags.auto_select_targets = delivery_cannon.auto_selects_targets + blueprint.set_blueprint_entity_tags(blueprint_entity.entity_number, tags) + end + end + end + end + end + end + end +end +Event.addListener(defines.events.on_player_setup_blueprint, DeliveryCannon.on_player_setup_blueprint) + +--- Handles the player copy/pasting settings between delivery cannons +---@param event any +function DeliveryCannon.on_entity_settings_pasted(event) + local player_index = event.player_index + if player_index and game.players[player_index] and game.players[player_index].connected + and event.source and event.source.valid and event.destination and event.destination.valid then + if not string.find(event.source.name, "delivery-cannon", 1, true) then return end + if not string.find(event.destination.name, "delivery-cannon", 1, true) then return end + local player = game.players[player_index] + local delivery_cannon_from = DeliveryCannon.from_entity(event.source) + local delivery_cannon_to = DeliveryCannon.from_entity(event.destination) + if delivery_cannon_from and delivery_cannon_to then + -- actual settings copy + delivery_cannon_to.destination.coordinate = table.deepcopy(delivery_cannon_from.destination.coordinate) + delivery_cannon_to.destination.zone = delivery_cannon_from.destination.zone + delivery_cannon_to.is_off = delivery_cannon_from.is_off + delivery_cannon_to.auto_select_targets = delivery_cannon_from.auto_select_targets + if delivery_cannon_to.destination.coordinate then + player.print({"space-exploration.delivery-cannon-coordinates-pasted", math.floor(delivery_cannon_to.destination.coordinate.x), math.floor(delivery_cannon_to.destination.coordinate.y)}) + end + end + end +end +Event.addListener(defines.events.on_entity_settings_pasted, DeliveryCannon.on_entity_settings_pasted) + +function DeliveryCannon.on_init(event) + global.delivery_cannons = {} +end +Event.addListener("on_init", DeliveryCannon.on_init, true) + +return DeliveryCannon diff --git a/space-exploration_0.5.58/space-exploration/scripts/dimensional-anchor.lua b/space-exploration_0.5.58/space-exploration/scripts/dimensional-anchor.lua new file mode 100644 index 0000000..95ddeb6 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/dimensional-anchor.lua @@ -0,0 +1,112 @@ +DAnchor = {} + +-- constants +DAnchor.name_structure = mod_prefix.."dimensional-anchor" +DAnchor.name_effects = mod_prefix.."dimensional-anchor-fx" +DAnchor.check_interval = 60 +DAnchor.energy_per_tick = 1000000000 -- match the charge speed + +function DAnchor.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.name == DAnchor.name_structure then + local zone = Zone.from_surface(entity.surface) + if zone.parent and zone.parent.type == "star" then + if entity.surface.count_entities_filtered{name = DAnchor.name_structure} > 1 then + cancel_entity_creation(entity, event.player_index, "You cannot have more than 1 dimensional anchor per star.") + return + end + global.dimensional_anchors = global.dimensional_anchors or {} + global.dimensional_anchors[zone.index] = { + zone_index = zone.index, + structure = entity, + effects = nil, + active = false, + low_power_icon = nil + } + global.dimensional_anchors[zone.index].low_power_icon = rendering.draw_sprite{ + sprite = "utility/recharge_icon", + surface = entity.surface, + target = entity, + x_scale = 0.5, + y_scale = 0.5, + } + else + cancel_entity_creation(entity, event.player_index, "Must be placed in close orbit of a star.") + return + end + end + +end +Event.addListener(defines.events.on_built_entity, DAnchor.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, DAnchor.on_entity_created) +Event.addListener(defines.events.script_raised_built, DAnchor.on_entity_created) +Event.addListener(defines.events.script_raised_revive, DAnchor.on_entity_created) + +function DAnchor.on_entity_removed(event) + if event.entity and event.entity.valid then + if event.entity.name == DAnchor.name_structure and global.dimensional_anchors then + for zone_index, anchor in pairs(global.dimensional_anchors) do + if anchor.structure == event.entity then + if anchor.effects and anchor.effects.valid then + anchor.effects.destroy() + anchor.effects = nil + end + global.dimensional_anchors[zone_index] = nil + end + end + end + end +end +Event.addListener(defines.events.on_player_mined_entity, DAnchor.on_entity_removed) +Event.addListener(defines.events.on_robot_mined_entity, DAnchor.on_entity_removed) +Event.addListener(defines.events.on_entity_died, DAnchor.on_entity_removed) +Event.addListener(defines.events.script_raised_destroy, DAnchor.on_entity_removed) + +function DAnchor.on_tick(event) + if game.tick % DAnchor.check_interval == 0 and global.dimensional_anchors then + for zone_index, anchor in pairs(global.dimensional_anchors) do + if anchor.structure and anchor.structure.valid then + if anchor.structure.energy > DAnchor.check_interval * DAnchor.energy_per_tick then + anchor.structure.energy = anchor.structure.energy - DAnchor.check_interval * DAnchor.energy_per_tick + if not anchor.active then + anchor.active = true + anchor.effects = anchor.structure.surface.create_entity{ + name = DAnchor.name_effects, + position = anchor.structure.position, + target = {x = anchor.structure.position.x, y = anchor.structure.position.y - 1}, + speed = 0} + rendering.destroy(anchor.low_power_icon) + end + else + if anchor.effects and anchor.effects.valid then + anchor.effects.destroy() + anchor.effects = nil + end + if anchor.active ~= false then + anchor.active = false + anchor.low_power_icon = rendering.draw_sprite{ + sprite = "utility/recharge_icon", + surface = anchor.structure.surface, + target = anchor.structure, + x_scale = 0.5, + y_scale = 0.5, + } + end + end + else + -- missing entity + end + end + end +end + +Event.addListener(defines.events.on_tick, DAnchor.on_tick) + +return DAnchor diff --git a/space-exploration_0.5.58/space-exploration/scripts/energy-beam-defence.lua b/space-exploration_0.5.58/space-exploration/scripts/energy-beam-defence.lua new file mode 100644 index 0000000..2cbb399 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/energy-beam-defence.lua @@ -0,0 +1,232 @@ +local EnergyBeamDefence = {} + +--[[ +The defence has a base power use. +It starts with full charge. +When under attack energy usage is increased based on the attack strength. +If the buffer has not recoverd sufficently between ticks then the structure is not providing defence. + + +Make a list of defences per zone +When an attack comes in, disrtibute the load of the attack on all enemy defences weighted by the defences current energy vs energy max. +Update once per second? + +zone.energy_beams = {} +zone.energy_beam_defences = {} +beam.stress_factores = {beams} +Apply a share of the load (energy) + +]] +EnergyBeamDefence.name_energy_beam_defence = mod_prefix.."energy-beam-defence" +EnergyBeamDefence.name_energy_beam_defence_glow = mod_prefix.."energy-beam-defence-glow" +EnergyBeamDefence.beam_defence_passive_draw = 10000000 --10MW +EnergyBeamDefence.beam_defence_buffer = 1000000000 --1GJ +EnergyBeamDefence.beam_defence_efficiency = 10 -- takes 1/10th the power of the emitter +EnergyBeamDefence.beam_defence_peak_flare_power = 2000000000 -- 2GW +EnergyBeamDefence.beam_defence_required = 0.5 -- + +function EnergyBeamDefence.zone_is_defended(zone, pressure_force_name) + -- force == nil == neutral + for force_name, forcedata in pairs(global.forces) do + local force = game.forces[force_name] + if pressure_force_name == nil or ((force_name ~= pressure_force_name) and (not (force.get_friend(pressure_force_name) or force.get_cease_fire(pressure_force_name)))) then + local zone_assets = Zone.get_force_assets(force_name, zone.index) + if zone_assets and zone_assets.energy_beam_defence then + for unit_number, defence in pairs(zone_assets.energy_beam_defence) do + --Log.trace(defence.entity.energy) + if defence.operational then + --Log.trace("defended") + return true + end + end + end + end + end + --Log.trace("not defended") + return false +end + +function EnergyBeamDefence.zone_add_pressure(zone, pressure) + + global.energy_beam_target_zones = global.energy_beam_target_zones or {} + global.energy_beam_target_zones[zone.index] = zone + zone.energy_beam_pressures = zone.energy_beam_pressures or { + solar = {}, + emitters = {}, + } + + if pressure.type == "solar-flare" then + if not zone.energy_beam_pressures.solar[pressure.id] then + --TODO: print message to defenecs + zone.energy_beam_pressures.solar[pressure.id] = pressure + EnergyBeamDefence.defences_apply_pressure(zone) + end + else --if pressure.type == "energy-beam-emitter-tree" then -- restore later, legacy test is missing this property + if not zone.energy_beam_pressures.emitters[pressure.unit_number] then + --TODO: print message to defenecs + zone.energy_beam_pressures.emitters[pressure.unit_number] = pressure + EnergyBeamDefence.defences_apply_pressure(zone) + end + end + + +end + +function EnergyBeamDefence.defences_apply_pressure(zone) + -- validate + if not zone.energy_beam_pressures then + global.energy_beam_target_zones[zone.index] = nil + return + end + + -- gather and validate + local pressures_count = 0 + local force_emitter_pressures = {} + + for id, tick_task in pairs(zone.energy_beam_pressures.solar) do + if tick_task.valid then + pressures_count = pressures_count + 1 + if not force_emitter_pressures["-"] then + force_emitter_pressures["-"] = 0 + end + force_emitter_pressures["-"] = force_emitter_pressures["-"] + (0.1 + 0.9 * (tick_task.age_peak or 0.0001)) * EnergyBeamDefence.beam_defence_peak_flare_power * tick_task.power_multiplier + else + zone.energy_beam_pressures.solar[id] = nil + end + end + --Log.trace(table_size(zone.energy_beam_pressures.emitters)) + for unit_number, emitter_tree in pairs(zone.energy_beam_pressures.emitters) do + --Log.trace(emitter_tree.last_temperature) + if emitter_tree.destination and emitter_tree.destination.zone and emitter_tree.destination.zone.index == zone.index and emitter_tree.emitter.valid and (emitter_tree.mode == "glaive" or emitter_tree.mode == "auto-glaive") then + pressures_count = pressures_count + 1 + if not force_emitter_pressures[emitter_tree.force_name] then + force_emitter_pressures[emitter_tree.force_name] = 0 + end + force_emitter_pressures[emitter_tree.force_name] = force_emitter_pressures[emitter_tree.force_name] + + emitter_tree.last_temperature * emitter_tree.last_efficiency * EnergyBeam.specific_heat / EnergyBeamDefence.beam_defence_efficiency + else + zone.energy_beam_pressures.emitters[unit_number] = nil + end + end + + for force_name, forcedata in pairs(global.forces) do + local zone_assets = Zone.get_force_assets(force_name, zone.index) + if zone_assets and zone_assets.energy_beam_defence then + for unit_number, defence in pairs(zone_assets.energy_beam_defence) do + if defence.entity and defence.entity.valid then + defence.pressure = 0 + defence.operational = true + defence.entity.power_usage = EnergyBeamDefence.beam_defence_passive_draw/60 + if defence.glow_id and rendering.is_valid(defence.glow_id) then + rendering.destroy(defence.glow_id) + defence.glow_id = nil + end + else + zone_assets.energy_beam_defence[unit_number] = nil + end + end + end + end + + if pressures_count == 0 then + zone.energy_beam_pressures = nil + return + end + + -- equalise + for pressure_force_name, pressure in pairs(force_emitter_pressures) do + + local defences = {} + local defences_total_energy = 0 + for force_name, forcedata in pairs(global.forces) do + local force = game.forces[force_name] + if pressure_force_name == "-" or ((force_name ~= pressure_force_name) and (not (force.get_friend(pressure_force_name) or force.get_cease_fire(pressure_force_name)))) then + local zone_assets = Zone.get_force_assets(force_name, zone.index) + if zone_assets and zone_assets.energy_beam_defence then + for unit_number, defence in pairs(zone_assets.energy_beam_defence) do + table.insert(defences, defence) + defences_total_energy = defences_total_energy + defence.entity.energy + end + end + end + end + for _, defence in pairs(defences) do + local defence_share = defences_total_energy > 0 and (defence.entity.energy / defences_total_energy) or 0.01 + defence.pressure = defence.pressure + pressure * defence_share + end + end + + for force_name, forcedata in pairs(global.forces) do + local force = game.forces[force_name] + local zone_assets = Zone.get_force_assets(force_name, zone.index) + if zone_assets and zone_assets.energy_beam_defence then + for unit_number, defence in pairs(zone_assets.energy_beam_defence) do + defence.entity.power_usage = (EnergyBeamDefence.beam_defence_passive_draw + defence.pressure)/60 + defence.operational = defence.entity.energy / EnergyBeamDefence.beam_defence_buffer > EnergyBeamDefence.beam_defence_required + if defence.pressure > 0.001 then + defence.glow_id = rendering.draw_sprite{ + sprite = EnergyBeamDefence.name_energy_beam_defence_glow, + target = defence.entity, + surface = defence.entity.surface + } + end + end + end + end + +end + +function EnergyBeamDefence.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.name == EnergyBeamDefence.name_energy_beam_defence then + local zone = Zone.from_surface(entity.surface) + if not zone then + return cancel_entity_creation(entity, event.player_index, "Invalid location") + end + local force = entity.force + local force_name = force.name + local force_data = global.forces[force.name] + if force_data then + local zone_assets = Zone.get_force_assets(force_name, zone.index) + zone_assets.energy_beam_defence = zone_assets.energy_beam_defence or {} + local defence = { + type = "energy-beam-defence", + unit_number = entity.unit_number, + force_name = force_name, + entity = entity, + zone_index = zone.index, + pressures = { + solar = {}, + emitters = {}, + }, + operational = false + } + zone_assets.energy_beam_defence[defence.unit_number] = defence + + entity.power_usage = EnergyBeamDefence.beam_defence_passive_draw/60 + entity.electric_buffer_size = EnergyBeamDefence.beam_defence_buffer + end + end +end +Event.addListener(defines.events.on_built_entity, EnergyBeamDefence.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, EnergyBeamDefence.on_entity_created) +Event.addListener(defines.events.script_raised_built, EnergyBeamDefence.on_entity_created) +Event.addListener(defines.events.script_raised_revive, EnergyBeamDefence.on_entity_created) + +function EnergyBeamDefence.on_nth_tick_60() + if global.energy_beam_target_zones then + for zone_index, zone in pairs(global.energy_beam_target_zones) do + EnergyBeamDefence.defences_apply_pressure(zone) + end + end +end +Event.addListener("on_nth_tick_60", EnergyBeamDefence.on_nth_tick_60) -- 1 minute + +return EnergyBeamDefence diff --git a/space-exploration_0.5.58/space-exploration/scripts/energy-beam-gui.lua b/space-exploration_0.5.58/space-exploration/scripts/energy-beam-gui.lua new file mode 100644 index 0000000..4f5c8c6 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/energy-beam-gui.lua @@ -0,0 +1,396 @@ +local EnergyBeamGUI = {} + +EnergyBeamGUI.name_transmitter_gui_root = "energy_transmitter" +EnergyBeamGUI.dropdown_options = { + {caption={"space-exploration.energy_transmitter_label_off"},tooltip={"space-exploration.energy_transmitter_tooltip_off"}}, + {caption={"space-exploration.energy_transmitter_label_energise"},tooltip={"space-exploration.energy_transmitter_tooltip_energise"}}, + {caption={"space-exploration.energy_transmitter_label_glaive"},tooltip={"space-exploration.energy_transmitter_tooltip_glaive"}}, + {caption={"space-exploration.energy_transmitter_label_auto_glaive"},tooltip={"space-exploration.energy_transmitter_tooltip_auto_glaive"}} +} +EnergyBeamGUI.dropdown_idxs = { + "off", + "energise", + "glaive", + "auto-glaive" +} + +--- Creates the energy beamer gui for a player +---@param player any +---@param tree any +function EnergyBeamGUI.gui_open(player, tree) + EnergyBeamGUI.gui_close(player) + if not tree then + Log.trace('EnergyBeamGUI.gui_open tree not found') + return + end + + local gui = player.gui.relative + local playerdata = get_make_playerdata(player) + + local anchor = {gui=defines.relative_gui_type.assembling_machine_gui, position=defines.relative_gui_position.right} + local container = gui.add{ + type = "frame", + name = EnergyBeamGUI.name_transmitter_gui_root, + direction="vertical", + anchor = anchor, + -- use gui element tags to store a reference to what energy beam transmitter thhis gui is displaying/controls + tags = { + unit_number = tree.unit_number + } + } + container.style.vertically_stretchable = "stretch_and_expand" + + local title_flow = container.add{type = "flow", "energy-beam-title-flow", direction = "horizontal"} + title_flow.add{type = "label", name = "energy-beam-title-label", style = "frame_title", caption = {"space-exploration.relative-window-settings"}, ignored_by_interaction = true} + local title_empty = title_flow.add { + type = "empty-widget", + style = "draggable_space", + ignored_by_interaction = true + } + title_empty.style.horizontally_stretchable = "on" + title_empty.style.left_margin = 4 + title_empty.style.right_margin = 0 + title_empty.style.height = 24 + + container.add{ type="label", name="energy", caption="Energy: "} + container.add{ type="label", name="efficiency", caption="Efficiency: "} + + local active_container = container.add{ type="flow", name="active_container", direction="horizontal"} + active_container.style.vertical_align = "center" + + local self_button = active_container.add{ type="sprite-button", name=EnergyBeamGUI.name_transmitter_gui_root.."_show", tooltip = {"space-exploration.show-own-location"}, + sprite = "item/".. EnergyBeam.name_emitter} + self_button.style.right_margin = 10 + + local dropdown_tooltip_merged = {} + for _, option in pairs(EnergyBeamGUI.dropdown_options) do + local option_tooltip = {"space-exploration.simple-a-b-space", {"space-exploration.simple-bold", option.caption}, option.tooltip} + if #dropdown_tooltip_merged == 0 then + dropdown_tooltip_merged = option_tooltip + else + dropdown_tooltip_merged = {"space-exploration.simple-a-b-break", dropdown_tooltip_merged, option_tooltip} + end + end + + local dropdown = active_container.add{ + type = "drop-down", + tooltip=dropdown_tooltip_merged, + name = EnergyBeamGUI.name_transmitter_gui_root.."_dropdown", + items = { + {"space-exploration.energy_transmitter_label_off"}, + {"space-exploration.energy_transmitter_label_energise"}, + {"space-exploration.energy_transmitter_label_glaive"}, + {"space-exploration.energy_transmitter_label_auto_glaive"} + }, + selected_index = 1 -- start with off selected + } + + container.add{ type="line", name="line"} + + container.add{ type="label", name="destination-label", caption="Destination:"} + container.add{type="checkbox", name="list-zones-alphabetical", caption="List destinations alphabetically", state=playerdata.zones_alphabetical and true or false} + + local filter_container = container.add{ type="flow", name="filter_flow", direction="horizontal"} + local filter_field = filter_container.add{ type="textfield", name="filter_list"} + filter_field.style.width = 275 + local filter_button = filter_container.add{ type = "sprite-button", name="clear_filter", sprite="utility/search_icon", + tooltip={"space-exploration.clear-filter"},} + filter_button.style.left_margin = 5 + filter_button.style.width = 28 + filter_button.style.height = 28 + + local destination_zone = tree.destination and tree.destination.zone + + local list, selected_index, values = Zone.dropdown_list_zone_destinations( + tree.force_name, + destination_zone, + playerdata.zones_alphabetical, + nil, + {list = "None", value = {type = "none"}} -- wildcard + ) + if selected_index == 1 then selected_index = 2 end + local zones_dropdown = container.add{ type="drop-down", name="energy-transmitter-list-zones", items=list, selected_index=selected_index or 2} + zones_dropdown.style.horizontally_stretchable = true + player_set_dropdown_values(player, "energy-transmitter-list-zones", values) + + container.add{ type="label", name="destination-location-label", caption="Destination Position:"} + + local destination_location_table = container.add{type="table", name="destination_location_table", column_count=2, draw_horizontal_lines=false} + destination_location_table.style.horizontally_stretchable = true + destination_location_table.style.column_alignments[1] = "left" -- title, search, zone list table + destination_location_table.style.column_alignments[2] = "right" -- starmap, close, selected zone info + + destination_location_table.add{ type="sprite-button", name="destination_location_button", + sprite="item/artillery-targeting-remote", tooltip = "Choose coordinates"} + destination_location_table.destination_location_button.style.right_margin = 10 + destination_location_table.add{ type="label", name="destination_location_coordinates", caption=""} + + if settings.get_player_settings(player)["se-show-zone-preview"].value then + container.add{ type="label", name="destination-location-preview-label", caption="Destination Preview:"} + local preview_frame = container.add{type="frame", name="destination-location-preview-frame", style="informatron_inside_deep_frame"} + preview_frame.style.horizontally_stretchable = true + preview_frame.style.vertically_stretchable = true + preview_frame.style.top_margin = 10 + end + + EnergyBeamGUI.gui_update(player) +end + +function EnergyBeamGUI.preview_frame_update(preview_frame, tree) + local valid_location = false + local surface = nil + if EnergyBeam.has_destination(tree) then + surface = Zone.get_surface(tree.destination.zone) + if surface then + valid_location = true + end + end + preview_frame.clear() + if valid_location then + local camera + if tree.glaive_beam and tree.glaive_beam.valid then + camera = preview_frame.add{type="camera", name="preview_camera", position=tree.destination.coordinate, zoom=0.5, surface_index=surface.index} + camera.entity = tree.glaive_beam + else + camera = preview_frame.add{type="camera", name="preview_camera", position=tree.destination.coordinate, zoom=0.5, surface_index=surface.index} + end + camera.style.vertically_stretchable = true + camera.style.horizontally_stretchable = true + end +end + +function EnergyBeamGUI.gui_update(player) + local root = player.gui.relative[EnergyBeamGUI.name_transmitter_gui_root] + if root and root.tags and root.tags.unit_number then + local tree = EnergyBeam.from_unit_number(root.tags.unit_number) + if tree then + local transfer_per_tick = (tree.last_temperature or 0) / EnergyBeam.transfer_interval + local energy_per_tick = transfer_per_tick * EnergyBeam.specific_heat + local format_energy = function(energy) + return string.format("%.2f",energy*60/1000000000) .. "GW" + end + if root["energy"] then + root["energy"].caption={ + "space-exploration.energy_transmitter_label_transfer", + format_energy(energy_per_tick) + } + end + if root["efficiency"] then + if Zone.is_solid(tree.zone) then + root["efficiency"].caption={ + "space-exploration.energy_transmitter_label_efficiency_atmo", + string.format("%.2f", (tree.last_efficiency or 0) * 100).."%" + } + else + root["efficiency"].caption={ + "space-exploration.energy_transmitter_label_efficiency", + string.format("%.2f", (tree.last_efficiency or 0) * 100).."%" + } + end + end + + local mode = tree.mode or "off" + if root["active_container"] then + local dropdown = root["active_container"][EnergyBeamGUI.name_transmitter_gui_root.."_dropdown"] + if dropdown then + for idx, item in pairs(EnergyBeamGUI.dropdown_idxs) do + if mode == item then + dropdown.selected_index = idx + end + end + end + end + + if root.destination_location_table and root.destination_location_table.destination_location_coordinates then + local coordinate = EnergyBeam.get_coordinate(tree) + if coordinate then + root.destination_location_table.destination_location_coordinates.caption = "X:"..string.format("%.0f", coordinate.x) .. " Y:"..string.format("%.0f", coordinate.y) + else + root.destination_location_table.destination_location_coordinates.caption = {"space-exploration.no-coordinates-set"} + end + end + + if root["destination-location-preview-frame"] then + EnergyBeamGUI.preview_frame_update(root["destination-location-preview-frame"], tree) + end + end + end +end + + +function EnergyBeamGUI.on_gui_click(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, EnergyBeamGUI.name_transmitter_gui_root) + if not (root and root.tags and root.tags.unit_number) then return end + local tree = EnergyBeam.from_unit_number(root.tags.unit_number) + if not tree then return end + if element.name == "energy-transmitter-list-zones" then + + local value = player_get_dropdown_value(player, element.name, element.selected_index) + if type(value) == "table" then + if value.type == "zone" then + local zone_index = value.index + local zone = Zone.from_zone_index(zone_index) + if zone then + tree.destination.zone = zone + tree.destination.coordinate = nil + Log.trace("set destination to location: " .. zone.name ) + else + tree.destination.zone = nil + end + else + tree.destination.zone = nil + end + EnergyBeamGUI.gui_update(player) + else + EnergyBeamGUI.gui_close(player) + Log.trace("Error: Non-table value ") + end + elseif element.name == "clear_filter" then + element.parent.filter_list.text = "" + EnergyBeamGUI.gui_update_destinations_list(player) + elseif element.name == "destination_location_button" then + if RemoteView.is_unlocked(player) then + if not player.cursor_stack then + player.print("Error, invalid player control mode. Cannot set player.cursor_stack") + else + local playerdata = get_make_playerdata(player) + local player_zone = Zone.from_surface(player.surface) + RemoteView.start(player, tree.destination and tree.destination.zone) + -- only change the player's position to that of the energy emitter if its on a different surface + -- this lets the player keep updating the position of the energy emitter as long as they stay in nav + -- view on the targeted surface + local coordinate = EnergyBeam.get_coordinate(tree) + if coordinate and (not player.character) and player_zone ~= tree.destination.zone then + player.teleport(EnergyBeam.get_coordinate(tree)) + end + playerdata.remote_view_activity = { + type = EnergyBeam.name_target_activity_type, + tree = tree + } + player.cursor_stack.set_stack({name = EnergyBeam.name_transmitter_targeter, count = 1}) + player.opened = nil + end + else + player.print({"space-exploration.satellite-required"}) + end + elseif element.name == EnergyBeamGUI.name_transmitter_gui_root.."_show" then + local playerdata = get_make_playerdata(player) + RemoteView.start(player, tree.zone) + if not player.character then + local surface = Zone.get_surface(tree.zone) + player.teleport(tree.emitter.position, surface) + end + playerdata.remote_view_activity = nil + if player.opened == tree.emitter then player.opened = nil end + elseif element.name == EnergyBeamGUI.name_transmitter_gui_root.."_dropdown" then + tree.mode = EnergyBeamGUI.dropdown_idxs[element.selected_index] + EnergyBeamGUI.gui_update(player) + Log.trace(tree.mode) + end +end +Event.addListener(defines.events.on_gui_click, EnergyBeamGUI.on_gui_click) +Event.addListener(defines.events.on_gui_selection_state_changed, EnergyBeamGUI.on_gui_click) + +function EnergyBeamGUI.gui_update_destinations_list(player) + local playerdata = get_make_playerdata(player) + local root = player.gui.relative[EnergyBeamGUI.name_transmitter_gui_root] + if root then + + local filter = nil + if root.filter_flow and root.filter_flow.filter_list then + filter = string.trim(root.filter_flow.filter_list.text) + if filter == "" then + filter = nil + end + end + + -- update the list + local unit_number = root and root.tags and root.tags.unit_number + local tree = EnergyBeam.from_unit_number(unit_number) + if not tree then + EnergyBeamGUI.gui_close(player) + return + end + local destination_zone + if tree then destination_zone = tree.destination.zone end + + local list, selected_index, values = Zone.dropdown_list_zone_destinations( + tree.force_name, + destination_zone, + playerdata.zones_alphabetical, + filter, + {list = "None", value = {type = "none"}} -- wildcard + ) + if selected_index == 1 then selected_index = 2 end + root["energy-transmitter-list-zones"].items = list + root["energy-transmitter-list-zones"].selected_index = selected_index or 2 + player_set_dropdown_values(player, "energy-transmitter-list-zones", values) + + end +end + +function EnergyBeamGUI.on_gui_checked_state_changed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, EnergyBeamGUI.name_transmitter_gui_root) + if not (root and root.tags and root.tags.unit_number) then return end + local tree = EnergyBeam.from_unit_number(root.tags.unit_number) + if not tree then return end + if element.name == "list-zones-alphabetical" then + local playerdata = get_make_playerdata(player) + playerdata.zones_alphabetical = element.state + EnergyBeamGUI.gui_update_destinations_list(player) + end +end +Event.addListener(defines.events.on_gui_checked_state_changed, EnergyBeamGUI.on_gui_checked_state_changed) + +function EnergyBeamGUI.on_gui_text_changed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, EnergyBeamGUI.name_transmitter_gui_root) + if root then -- remote view + if element.name == "filter_list" then + EnergyBeamGUI.gui_update_destinations_list(player) + end + end +end +Event.addListener(defines.events.on_gui_text_changed, EnergyBeamGUI.on_gui_text_changed) + +--- Close the energy beamer gui for a player +---@param player any +function EnergyBeamGUI.gui_close (player) + if player.gui.relative[EnergyBeamGUI.name_transmitter_gui_root] then + player.gui.relative[EnergyBeamGUI.name_transmitter_gui_root].destroy() + end +end + +--- Respond to the main entity GUI being closed by destroying the relative GUI +---@param event any +function EnergyBeamGUI.on_gui_closed(event) + local player = game.players[event.player_index] + if player and event.entity and event.entity.name == EnergyBeam.name_emitter then + EnergyBeamGUI.gui_close(player) + end +end +Event.addListener(defines.events.on_gui_closed, EnergyBeamGUI.on_gui_closed) + +--- Opens the energy beamer gui when an energy beamer is clicked +--- Closes the energy beamer gui when another gui is opened +---@param event any +function EnergyBeamGUI.on_gui_opened(event) + local player = game.players[event.player_index] + if event.entity and event.entity.valid and event.entity.name == EnergyBeam.name_emitter then + EnergyBeamGUI.gui_open(player, EnergyBeam.from_entity(event.entity)) + else + EnergyBeamGUI.gui_close(player) + end +end +Event.addListener(defines.events.on_gui_opened, EnergyBeamGUI.on_gui_opened) + + +return EnergyBeamGUI \ No newline at end of file diff --git a/space-exploration_0.5.58/space-exploration/scripts/energy-beam.lua b/space-exploration_0.5.58/space-exploration/scripts/energy-beam.lua new file mode 100644 index 0000000..18984f5 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/energy-beam.lua @@ -0,0 +1,952 @@ +-- Used for energy transmission and cross-surface energy beam weapons. +local EnergyBeam = {} + +EnergyBeam.name_emitter = mod_prefix.."energy-transmitter-emitter" +EnergyBeam.name_chamber = mod_prefix.."energy-transmitter-chamber" +EnergyBeam.name_injector = mod_prefix.."energy-transmitter-injector" +EnergyBeam.name_injector_reactor = mod_prefix.."energy-transmitter-injector-reactor" +EnergyBeam.name_receiver = mod_prefix.."energy-receiver" +EnergyBeam.name_receiver_beam = mod_prefix.."energy-receiver-beam" -- projectile +EnergyBeam.name_glaive_beam = mod_prefix.."energy-glaive-beam" -- projectile +EnergyBeam.name_glaive_beam_sprite = mod_prefix.."energy-glaive-beam-sprite" -- sprite +EnergyBeam.name_glaive_path_fx = mod_prefix.."energy-glaive-path-fx" +EnergyBeam.name_glaive_damage_projectile = mod_prefix.."energy-glaive-damage-projectile" +EnergyBeam.name_glaive_damage_aoe = mod_prefix.."energy-glaive-damage-aoe" +EnergyBeam.name_glaive_damage_aoe_large = mod_prefix.."energy-glaive-damage-aoe-large" + +EnergyBeam.emitter_width = 10 +EnergyBeam.chamber_box = {x=8, y=4} +EnergyBeam.injector_length = 5 + +EnergyBeam.name_transmitter_targeter = mod_prefix .. "energy-transmitter-targeter" +EnergyBeam.name_target_activity_type = "energy-transmitter-target" +EnergyBeam.name_transmitter_effect = mod_prefix .. "energy-transmitter-beam" +EnergyBeam.transfer_interval = 60 +EnergyBeam.specific_heat = 1000000000 -- 1GJ +EnergyBeam.injector_donate_rate = 0.05 +EnergyBeam.injector_waste_rate = 0.005 +EnergyBeam.beam_speed_base = 0.05 +EnergyBeam.beam_speed_temperature_multiplier = 0.05 +EnergyBeam.beam_speed_temperature_exponent = 0.9 +EnergyBeam.large_aoe_heat = 100 + +EnergyBeam.glaive_cost_aoe = 0.5 +EnergyBeam.glaive_cost_aoe_large = 1.2 + +--- Gets the EnergyBeam for this unit_number +---@param unit_number number +function EnergyBeam.from_unit_number (unit_number) + if not unit_number then Log.trace("EnergyBeam.from_unit_number: invalid unit_number: nil") return end + unit_number = tonumber(unit_number) + if global.energy_transmitters[unit_number] then + return global.energy_transmitters[unit_number] + else + Log.trace("EnergyBeam.from_unit_number: invalid unit_number: " .. unit_number) + end +end + +--- Gets the EnergyBeam for this entity +---@param entity LuaEntity +function EnergyBeam.from_entity (entity) + if not(entity and entity.valid) then + Log.trace("EnergyBeam.from_entity: invalid entity") + return + end + return EnergyBeam.from_unit_number(entity.unit_number) +end + +--- Does the enery beamer have a destination set +---@param tree any +function EnergyBeam.has_destination(tree) + return tree and tree.destination and tree.destination.coordinate and tree.destination.zone +end + +function EnergyBeam.get_transmission_efficiency(origin, destination) + if origin and destination then + local delta_v = Zone.get_launch_delta_v(origin) + Zone.get_travel_delta_v(origin, destination) + local efficiency = 1- delta_v/(delta_v+10000) + + local origin_stellar_position = Zone.get_stellar_position(origin) + local destination_stellar_position = Zone.get_stellar_position(destination) + + if destination.type == "anomaly" or origin.type == "anomaly" then + efficiency = efficiency * 0.01 + else + if origin_stellar_position and destination_stellar_position then -- interstellar less effective + if Util.vectors_delta_length(origin_stellar_position, destination_stellar_position) > 0.001 then + efficiency = efficiency * 0.5 + end + else + efficiency = efficiency * 0.5 + end + end + + if Zone.is_solid(origin) then + efficiency = efficiency * 0.5 + end + return efficiency + end +end + + +function EnergyBeam.get_coordinate(tree) + if tree.destination and tree.destination.coordinate then + return tree.destination.coordinate + end + --return tree.emitter.position -- return nil +end + +function EnergyBeam.clear_end_beam(tree) + if tree.receiver_beam and tree.receiver_beam.valid then + tree.receiver_beam.destroy() + tree.receiver_beam = nil + end + if tree.glaive_beam and tree.glaive_beam.valid then + tree.glaive_beam.destroy() + tree.glaive_beam = nil + end + EnergyBeam.remove_markers(tree) +end + +function EnergyBeam.collect_heat(tree, waste) + local temperature = 0 + for _, injector_reactor in pairs(tree.injector_reactors) do + if injector_reactor.valid then + local heat = (injector_reactor.temperature - 15) * EnergyBeam.injector_donate_rate + if heat > 1 then heat = math.pow(heat, 0.5) end -- reduce overload charge efficiency + local remove = (injector_reactor.temperature - 15) * (waste and EnergyBeam.injector_waste_rate or EnergyBeam.injector_donate_rate) + injector_reactor.temperature = injector_reactor.temperature - remove + temperature = temperature + heat + end + end + return temperature +end + +function EnergyBeam.beam_step_idle(tree) + EnergyBeam.clear_end_beam(tree) + if tree.emitter_beam and tree.emitter_beam.valid then + tree.emitter_beam.destroy() + end + + local temperature = EnergyBeam.collect_heat(tree, true) -- waste + tree.last_temperature = temperature + + if tree.destination and tree.destination.zone then + local efficiency = EnergyBeam.get_transmission_efficiency(tree.zone, tree.destination.zone) + tree.last_efficiency = efficiency + else + tree.last_efficiency = 0 + end +end + +function EnergyBeam.find_enemy(tree) + local destination_surface = Zone.get_make_surface(tree.destination.zone) + local position = tree.destination.coordinate or {x = 0, y = 0} + local force = game.forces[tree.force_name] + local enemy = find_enemy(force, destination_surface, position) + + if enemy then + tree.destination.coordinate = enemy.position + tree.destination.enemy = enemy + force.chart(destination_surface, Util.position_to_area(enemy.position, 32)) + return + end + -- nothing found + game.forces[tree.force_name].print({ + "space-exploration.energy-transmitter-no-enemies-found", + "[gps="..math.floor(tree.emitter.position.x)..","..math.floor(tree.emitter.position.y)..","..destination_surface.name.."]" + }) + tree.mode = "off" +end + +function EnergyBeam.scale_glaive_sprite(tree) + local position = EnergyBeam.get_coordinate(tree) + if not position then + if not (tree.glaive_beam and tree.glaive_beam.valid) then return end + position = tree.glaive_beam.position + end + + if not (tree.glaive_beam and tree.glaive_beam.valid) then + local destination_surface = Zone.get_make_surface(tree.destination.zone) + tree.glaive_beam = destination_surface.create_entity{ + name = EnergyBeam.name_glaive_beam, + position = position, + target = Util.vectors_add(position, {x=0,y=-1}), + speed = 0, + force = tree.force_name + } + end + if not (tree.glaive_beam_sprite_id and rendering.is_valid(tree.glaive_beam_sprite_id)) then + tree.glaive_beam_sprite_id = rendering.draw_sprite{ + target = tree.glaive_beam, + sprite = EnergyBeam.name_glaive_beam_sprite, + surface = tree.glaive_beam.surface, + } + end + rendering.set_y_scale(tree.glaive_beam_sprite_id, 0.5 + 1.5 * math.min(1, tree.last_temperature / 100)) + rendering.set_x_scale(tree.glaive_beam_sprite_id, 0.4 + 2 * math.min(1, tree.last_temperature / 100)) + rendering.set_color(tree.glaive_beam_sprite_id, { + r = 1, + g = 0.5 + 0.5 * math.min(1, tree.last_temperature / 100), + b = 0.5 + 0.5 * math.min(1, tree.last_temperature / 100) }) + +end + +function EnergyBeam.remove_markers(tree) + if tree.markers then + for _, marker in pairs(tree.markers) do + if marker and marker.valid then + marker.destroy() + end + end + end + tree.markers = nil +end + +function EnergyBeam.add_markers(tree) + EnergyBeam.remove_markers(tree) + if tree.glaive_beam and tree.glaive_beam.valid then + tree.markers = {} + for force_name, forcedata in pairs(global.forces) do + if force_name ~= "friendly" and force_name ~= "ignore" and force_name ~= "capture" then + tree.markers[force_name] = game.forces[force_name].add_chart_tag(tree.glaive_beam.surface, { + icon = {type = "virtual", name = mod_prefix.."heat"}, + position = tree.glaive_beam.position, + text = "Energy Glaive" + }) + end + end + end +end + +function EnergyBeam.beam_step(tree) + local mode = tree.mode or "off" + local position = EnergyBeam.get_coordinate(tree) + if position == nil and mode == "auto-glaive" then + EnergyBeam.find_enemy(tree) + position = EnergyBeam.get_coordinate(tree) + end + + if mode == "off" or (not position) or not (tree.destination and tree.destination.zone) then + EnergyBeam.beam_step_idle(tree) + else + + local zone = tree.zone + local efficiency = EnergyBeam.get_transmission_efficiency(zone, tree.destination.zone) + tree.last_efficiency = efficiency + local destination_surface = Zone.get_make_surface(tree.destination.zone) + local emitter_beam = false + + if mode == "energise" then + local receiver = destination_surface.find_entity(EnergyBeam.name_receiver, position) + if receiver then + local temperature = EnergyBeam.collect_heat(tree) + tree.last_temperature = temperature + if temperature > 0.1 then + emitter_beam = true + if tree.glaive_beam then EnergyBeam.clear_end_beam(tree) end + receiver.temperature = receiver.temperature + temperature * efficiency + if not (tree.receiver_beam and tree.receiver_beam.valid) then + tree.receiver_beam = destination_surface.create_entity{ + name = EnergyBeam.name_receiver_beam, + position = receiver.position, + target = Util.vectors_add(receiver.position, {x=0,y=-1}), + speed = 0 + } + end + end + else + EnergyBeam.beam_step_idle(tree) + end + if emitter_beam == false then EnergyBeam.clear_end_beam(tree) end + + elseif mode == "glaive" or mode == "auto-glaive" then + + local temperature = EnergyBeam.collect_heat(tree) + tree.last_temperature = temperature + if temperature > 0.1 then + EnergyBeamDefence.zone_add_pressure(tree.destination.zone, tree) + + if tree.receiver_beam then EnergyBeam.clear_end_beam(tree) end + tree.glaive_energy = (tree.glaive_energy or 0) + temperature * efficiency + if EnergyBeamDefence.zone_is_defended(tree.destination.zone, tree.force_name) then + -- the beam is blocked but pressure is being applied + if tree.glaive_beam and tree.glaive_beam.valid then + tree.glaive_beam.destroy() + tree.glaive_beam = nil + end + tree.glaive_energy = 0 + emitter_beam = true + else + if tree.glaive_energy > 0.1 then + emitter_beam = true + end + if emitter_beam == false then + EnergyBeam.beam_move(tree) -- removes? + else + EnergyBeam.scale_glaive_sprite(tree) + if mode == "auto-glaive" then + -- find target + if tree.destination.coordinate == nil or Util.vectors_delta_length(tree.destination.coordinate, tree.glaive_beam.position) < 0.1 then + EnergyBeam.find_enemy(tree) + end + end + tree.glaive_beam.surface.create_entity{ + name = "fire-flame-on-tree", + position = tree.glaive_beam.position, + force = tree.force_name + } + + EnergyBeam.add_markers(tree) + + end + end + end + end + + if emitter_beam then + if not (tree.emitter_beam and tree.emitter_beam.valid) then + tree.emitter_beam = tree.emitter.surface.create_entity{ + name = EnergyBeam.name_transmitter_effect, + position = tree.emitter.position, + target = {x = tree.emitter.position.x, y = tree.emitter.position.y - 1}, + speed = 0} + end + else + if tree.emitter_beam and tree.emitter_beam.valid then + tree.emitter_beam.destroy() + end + end + + end + +end + +function EnergyBeam.beam_move(tree) + if not tree.destination.zone then + tree.mode = "off" + EnergyBeam.beam_step_idle(tree) + return + end + local position = EnergyBeam.get_coordinate(tree) + if not position then + if not (tree.glaive_beam and tree.glaive_beam.valid) then return end + position = tree.glaive_beam.position + end + + EnergyBeam.scale_glaive_sprite(tree) + local curent_position = tree.glaive_beam.position + + local move_speed = EnergyBeam.beam_speed_base * (1 + math.pow(EnergyBeam.beam_speed_temperature_multiplier * tree.last_temperature, EnergyBeam.beam_speed_temperature_exponent)) + local new_position = util.move_to(curent_position, position, move_speed, false) + tree.glaive_beam.teleport(new_position) + + -- update the target position to a potentially moving enemy + local target_valid = tree.destination.enemy and tree.destination.enemy.valid and tree.destination.enemy.destructible + if target_valid then + tree.destination.coordinate = tree.destination.enemy.position + end + + -- find a new enemy if we are at the destination and the enemy is not still alive + if Util.vectors_delta_length(new_position, position) < 0.1 and tree.mode == "auto-glaive" and not target_valid then + EnergyBeam.find_enemy(tree) + end + + tree.glaive_energy_2 = tree.glaive_energy_2 or 0 + if tree.glaive_energy_2 < tree.glaive_energy then + tree.glaive_energy_2 = tree.glaive_energy_2 + tree.glaive_energy / 600 + tree.glaive_energy = tree.glaive_energy - tree.glaive_energy / 600 + end + + local energy_to_use = tree.glaive_energy_2 / 100 + local energy_used = 0 + --local cost_projectile = 0.05 + + if new_position.x ~= curent_position.x and new_position.y ~= curent_position.y and math.random() < 0.1 then + tree.glaive_beam.surface.create_entity{ + name = "fire-flame-on-tree", + position = tree.glaive_beam.position, + force = tree.force_name + } + tree.glaive_beam.surface.create_entity{ + name = EnergyBeam.name_glaive_path_fx, + position = tree.glaive_beam.position, + force = tree.force_name + } + end + + while energy_used + EnergyBeam.glaive_cost_aoe_large <= energy_to_use do + local r = math.random() + if r < tree.last_temperature/EnergyBeam.large_aoe_heat then -- transition the damage to lower direct dps but larger area as it gets towards 100 GW + energy_used = energy_used + EnergyBeam.glaive_cost_aoe_large + tree.glaive_beam.surface.create_entity{ + name = EnergyBeam.name_glaive_damage_aoe_large, + position = tree.glaive_beam.position, + force = tree.force_name + } + else + energy_used = energy_used + EnergyBeam.glaive_cost_aoe + tree.glaive_beam.surface.create_entity{ + name = EnergyBeam.name_glaive_damage_aoe, + position = tree.glaive_beam.position, + force = tree.force_name + } + end + --[[else + energy_used = energy_used + cost_projectile + tree.glaive_beam.surface.create_entity{ + name = EnergyBeam.name_glaive_damage_projectile, + position = tree.glaive_beam.position, + target = Util.vectors_add(tree.glaive_beam.position, Util.orientation_to_vector(math.random(), 5)), + speed = 1, + max_range = 5, + force = tree.force_name + } + end]] + end + tree.glaive_energy_2 = tree.glaive_energy_2 - energy_used +end + +function EnergyBeam.destroy(tree) + if not tree then + Log.trace("tree_destroy: no tree") + return + end + + tree.valid = false + EnergyBeam.clear_end_beam(tree) + if tree.emitter_beam and tree.emitter_beam.valid then + tree.emitter_beam.destroy() + end + global.energy_transmitters[tree.unit_number] = nil + + -- if a player has this gui open then close item-layer + local gui_name = EnergyBeamGUI.name_transmitter_gui_root + for _, player in pairs(game.connected_players) do + local root = player.gui.relative[gui_name] + if root and root.tags and root.tags.unit_number == tree.unit_number then + root.destroy() + end + end +end + +function EnergyBeam.on_tick(tree) + if global.energy_transmitters then + -- beam update + for _, tree in pairs(global.energy_transmitters) do + if (game.tick + tree.unit_number) % 60 == 0 then + EnergyBeam.beam_step(tree) + elseif tree.glaive_beam then + EnergyBeam.beam_move(tree) + end + end + + -- gui update + if game.tick % 60 == 0 then + for _, player in pairs(game.connected_players) do + EnergyBeamGUI.gui_update(player) + end + end + end +end +Event.addListener(defines.events.on_tick, EnergyBeam.on_tick) + +function EnergyBeam.on_player_selected_area(event) + if (event.item == EnergyBeam.name_transmitter_targeter) then + local player = game.players[event.player_index] + local playerdata = get_make_playerdata(player) + if playerdata.remote_view_activity and playerdata.remote_view_activity.type == EnergyBeam.name_target_activity_type then + local tree = playerdata.remote_view_activity.tree + if tree.emitter and tree.emitter.valid then + tree.destination.coordinate = { + x = (event.area.left_top.x + event.area.right_bottom.x) / 2, + y = (event.area.left_top.y + event.area.right_bottom.y) / 2 + } + tree.destination.zone = Zone.from_surface(player.surface) + player.print({"space-exploration.energy-transmitter-coordinates-set", math.floor(tree.destination.coordinate.x), math.floor(tree.destination.coordinate.y)}) + if tree.mode == "energise" then + EnergyBeam.clear_end_beam(tree) + end + -- reopned the gui and stop targetting + player.opened = tree.emitter + player.cursor_stack.set_stack(nil) + end + end + end +end +Event.addListener(defines.events.on_player_selected_area, EnergyBeam.on_player_selected_area) + +function EnergyBeam.on_init(event) + global.energy_transmitters = {} +end +Event.addListener("on_init", EnergyBeam.on_init, true) + +function EnergyBeam.chamber_connections(entity, update_neighbours) + local surface = entity.surface + local is_horizontal = entity.direction == defines.direction.east or entity.direction == defines.direction.west + local x = (is_horizontal and EnergyBeam.chamber_box.x or EnergyBeam.chamber_box.y)/2 + local y = (is_horizontal and EnergyBeam.chamber_box.y or EnergyBeam.chamber_box.x)/2 + + local north = surface.find_entity(EnergyBeam.name_chamber, Util.vectors_add(entity.position, {x=0, y= -y -1})) + if north and north.position.x == entity.position.x then + if north.position.y == entity.position.y - y - EnergyBeam.chamber_box.y / 2 then -- north is connected by side + --Log.trace("north is connected by side") + if not is_horizontal then + surface.create_entity{ + name=mod_prefix .. "energy-transmitter-chamber-addon-bottom", + position= Util.vectors_add(north.position, {x=0, y=1}), + surface=surface, + } + end + elseif north.position.y == entity.position.y - y - EnergyBeam.chamber_box.x / 2 then -- north is connected by end + --Log.trace("north is connected by end") + if is_horizontal then + surface.create_entity{ + name=mod_prefix .. "energy-transmitter-chamber-addon-top", + position= Util.vectors_add(entity.position, {x=0, y=0.5}), + surface=surface, + } + end + end + end + local south = surface.find_entity(EnergyBeam.name_chamber, Util.vectors_add(entity.position, {x=0, y= y +1})) + if south and south.position.x == south.position.x then + if south.position.y == entity.position.y + y + EnergyBeam.chamber_box.y / 2 then -- south is connected by side + --Log.trace("south is connected by side") + if not is_horizontal then + surface.create_entity{ + name=mod_prefix .. "energy-transmitter-chamber-addon-top", + position= Util.vectors_add(south.position, {x=0, y=0.5}), + surface=surface, + } + end + elseif south.position.y == entity.position.y + y + EnergyBeam.chamber_box.x / 2 then -- south is connected by end + --Log.trace("south is connected by end") + if is_horizontal then + surface.create_entity{ + name=mod_prefix .. "energy-transmitter-chamber-addon-bottom", + position= Util.vectors_add(entity.position, {x=0, y=1}), + surface=surface, + } + end + end + end + local east = surface.find_entity(EnergyBeam.name_chamber, Util.vectors_add(entity.position, {x=x+1, y=0})) + if east and east.position.y == entity.position.y then + if east.position.x == entity.position.x + x + EnergyBeam.chamber_box.y / 2 then -- east is connected by side + --Log.trace("east is connected by side") + if is_horizontal then + surface.create_entity{ + name=mod_prefix .. "energy-transmitter-chamber-addon-left", + position= Util.vectors_add(east.position, {x=-1, y=0.01}), + surface=surface, + } + end + elseif east.position.x == entity.position.x + x + EnergyBeam.chamber_box.x / 2 then -- east is connected by end + --Log.trace("east is connected by end") + if not is_horizontal then + surface.create_entity{ + name=mod_prefix .. "energy-transmitter-chamber-addon-right", + position= Util.vectors_add(entity.position, {x=1, y=0}), + surface=surface, + } + end + end + end + local west = surface.find_entity(EnergyBeam.name_chamber, Util.vectors_add(entity.position, {x=-x-1, y=0})) + if west and west.position.y == entity.position.y then + if west.position.x == entity.position.x - x - EnergyBeam.chamber_box.y / 2 then -- west is connected by side + --Log.trace("west is connected by side") + if is_horizontal then + surface.create_entity{ + name=mod_prefix .. "energy-transmitter-chamber-addon-right", + position= Util.vectors_add(west.position, {x=1, y=0}), + surface=surface, + } + end + elseif west.position.x == entity.position.x - x - EnergyBeam.chamber_box.x / 2 then -- west is connected by end + --Log.trace("west is connected by end") + if not is_horizontal then + surface.create_entity{ + name=mod_prefix .. "energy-transmitter-chamber-addon-left", + position= Util.vectors_add(entity.position, {x=-1, y=0.01}), + surface=surface, + } + end + end + end + + -- injector connections + local leaves + if is_horizontal then + leaves = surface.find_entities_filtered{ + name = EnergyBeam.name_injector, + area = Util.area_add_position({{-EnergyBeam.chamber_box.x / 2 + 1, -EnergyBeam.chamber_box.y / 2 - 1}, {EnergyBeam.chamber_box.x / 2 - 1, EnergyBeam.chamber_box.y / 2 + 1}}, entity.position) + } + else + leaves = surface.find_entities_filtered{ + name = EnergyBeam.name_injector, + area = Util.area_add_position({{-EnergyBeam.chamber_box.y / 2 - 1, -EnergyBeam.chamber_box.x / 2 + 1}, {EnergyBeam.chamber_box.y / 2 + 1, EnergyBeam.chamber_box.x / 2 - 1}}, entity.position) + } + end + for _, injector in pairs(leaves) do + -- update + EnergyBeam.remove_injector_connections(injector) + EnergyBeam.injector_connections(injector) + end + +end + +function EnergyBeam.remove_chamber_connections(entity) + local surface = entity.surface + local is_horizontal = entity.direction == defines.direction.east or entity.direction == defines.direction.west + local x = is_horizontal and (EnergyBeam.chamber_box.x / 2 + 1) or (EnergyBeam.chamber_box.y / 2) + local y = is_horizontal and (EnergyBeam.chamber_box.y / 2) or (EnergyBeam.chamber_box.x / 2 + 1) + local addons = surface.find_entities_filtered{ + name = { + mod_prefix .. "energy-transmitter-chamber-addon-top", + mod_prefix .. "energy-transmitter-chamber-addon-bottom", + mod_prefix .. "energy-transmitter-chamber-addon-left", + mod_prefix .. "energy-transmitter-chamber-addon-right", + }, + area = {{entity.position.x-x, entity.position.y-y}, {entity.position.x+x,entity.position.y+y+1.5}} + } + for _, addon in pairs(addons) do + addon.destroy() + end +end + +function EnergyBeam.injector_connections(entity) + local surface = entity.surface + local direction = entity.direction + local is_horizontal = direction == defines.direction.east or direction == defines.direction.west + local vector = Util.direction_to_vector(direction) + + local chamber = surface.find_entity(EnergyBeam.name_chamber, Util.vectors_add(entity.position, Util.vector_multiply(vector, (EnergyBeam.injector_length + 1)/2))) + if chamber then + local chamber_is_horizontal = chamber.direction == defines.direction.east or chamber.direction == defines.direction.west + if is_horizontal ~= chamber_is_horizontal then + local addon = surface.create_entity{ + name = mod_prefix .. "energy-transmitter-injector-addon", + position = Util.vectors_add(entity.position, Util.vector_multiply(vector, (EnergyBeam.injector_length)/2)) + } + addon.graphics_variation = (direction + 2) / 2 + end + end +end + +function EnergyBeam.remove_injector_connections(entity) + local surface = entity.surface + local direction = entity.direction + local addons + if entity.name == EnergyBeam.name_injector then + local vector = Util.direction_to_vector(direction) + addons = {surface.find_entity(mod_prefix .. "energy-transmitter-injector-addon", Util.vectors_add(entity.position, Util.vector_multiply(vector, (EnergyBeam.injector_length)/2)))} + elseif entity.name == EnergyBeam.name_chamber then + local is_horizontal = direction == defines.direction.east or direction == defines.direction.west + local x = (is_horizontal and EnergyBeam.chamber_box.x or EnergyBeam.chamber_box.y)/2+0.5 + local y = (is_horizontal and EnergyBeam.chamber_box.y or EnergyBeam.chamber_box.x)/2+0.5 + addons = surface.find_entities_filtered{ + name = mod_prefix .. "energy-transmitter-injector-addon", + area = Util.area_add_position({{-x,-y},{x,y}}, entity.position) + } + end + if addons then + for _, addon in pairs(addons) do + addon.destroy() + end + end +end + +function EnergyBeam.rebuild_trees(zone, immediate) + + -- remove old tick tasks + if global.tick_tasks then + for _, tick_task in pairs(global.tick_tasks) do + if tick_task.type == "grow_energy_tree" and tick_task.zone == zone then + tick_task.valid = false + global.tick_tasks[tick_task.id] = nil + end + end + end + + if zone then + local tick_task = new_tick_task("grow_energy_tree") + tick_task.zone = zone + + if immediate then + EnergyBeam.grow_energy_tree(tick_task) + end + end +end + +function EnergyBeam.grow_energy_tree(tick_task) + local zone = tick_task.zone + local surface = Zone.get_make_surface(zone) + + if not tick_task.emitters then + -- init + zone.energy_transmitters = zone.energy_transmitters or {} + global.energy_transmitters = global.energy_transmitters or {} + for unit_number, tree in pairs(zone.energy_transmitters) do + if not tree.emitter.valid then + -- remove invalid trees + zone.energy_transmitters[unit_number] = nil + global.energy_transmitters[unit_number] = nil + + else + tree.chamberes = {} + tree.leaves = {} + tree.injector_reactors = {} + tree.open = {tree.emitter} + end + end + + tick_task.emitters = surface.find_entities_filtered{name = EnergyBeam.name_emitter} + for _, emitter in pairs(tick_task.emitters) do + if not zone.energy_transmitters[emitter.unit_number] then + zone.energy_transmitters[emitter.unit_number] = { + type = "energy-beam-emitter-tree", + unit_number = emitter.unit_number, + valid = true, + zone = zone, + force_name = emitter.force.name, + emitter = emitter, + chamberes = {}, + leaves = {}, + injector_reactors = {}, + open = {emitter}, + destination = {type = "zone", zone = zone} + } + global.energy_transmitters[emitter.unit_number] = zone.energy_transmitters[emitter.unit_number] + end + end + -- chamberes are moreved from the list as they are assigned to trees + tick_task.chamberes = surface.find_entities_filtered{name = EnergyBeam.name_chamber} + + -- when a chamber is added to a tree, trach the tree for the chamber (so leaves can find the tree by finding the chamber) + tick_task.chamber_trees = {} + end + + tick_task.valid = false -- end unless chamberes are found + + for _, tree in pairs(zone.energy_transmitters) do + local open = tree.open + tree.open = {} + for _, entity in pairs(open) do + if entity.name == EnergyBeam.name_emitter then + -- find chamberes connected end-on + local extent = (EnergyBeam.emitter_width + EnergyBeam.chamber_box.x)/2 + for i, chamber in pairs(tick_task.chamberes) do + if (chamber.position.x == entity.position.x and (chamber.position.y == entity.position.y + extent or chamber.position.y == entity.position.y - extent)) + or (chamber.position.y == entity.position.y and (chamber.position.x == entity.position.x + extent or chamber.position.x == entity.position.x - extent)) then + tree.chamberes[chamber.unit_number] = chamber + tree.open[chamber.unit_number] = chamber + tick_task.chamber_trees[chamber.unit_number] = tree + tick_task.chamberes[i] = nil + tick_task.valid = true + end + end + elseif entity.name == EnergyBeam.name_chamber then + -- find chamberes connected + local extent_short = (EnergyBeam.chamber_box.x + EnergyBeam.chamber_box.y) / 2 + local extent_long = (EnergyBeam.chamber_box.x + EnergyBeam.chamber_box.x) / 2 + local is_horizontal = entity.direction == defines.direction.east or entity.direction == defines.direction.west + for i, chamber in pairs(tick_task.chamberes) do + local chamber_is_horizontal = chamber.direction == defines.direction.east or chamber.direction == defines.direction.west + if (is_horizontal ~= chamber_is_horizontal and ((chamber.position.x == entity.position.x and (chamber.position.y == entity.position.y + extent_short or chamber.position.y == entity.position.y - extent_short)) + or (chamber.position.y == entity.position.y and (chamber.position.x == entity.position.x + extent_short or chamber.position.x == entity.position.x - extent_short)))) + or (is_horizontal == chamber_is_horizontal and ((chamber.position.x == entity.position.x and (chamber.position.y == entity.position.y + extent_long or chamber.position.y == entity.position.y - extent_long)) + or (chamber.position.y == entity.position.y and (chamber.position.x == entity.position.x + extent_long or chamber.position.x == entity.position.x - extent_long)))) then + tree.chamberes[chamber.unit_number] = chamber + tick_task.chamber_trees[chamber.unit_number] = tree + tree.open[chamber.unit_number] = chamber + tick_task.chamberes[i] = nil + tick_task.valid = true + end + end + end + end + end + + if not tick_task.valid then -- finished the chamberes, add the leaves + for _, entity in pairs(surface.find_entities_filtered{name = EnergyBeam.name_injector}) do + local direction = entity.direction + local is_horizontal = direction == defines.direction.east or direction == defines.direction.west + local vector = Util.direction_to_vector(direction) + + local chamber = surface.find_entity(EnergyBeam.name_chamber, Util.vectors_add(entity.position, Util.vector_multiply(vector, (EnergyBeam.injector_length + 1)/2))) + if chamber then + local chamber_is_horizontal = chamber.direction == defines.direction.east or chamber.direction == defines.direction.west + if is_horizontal ~= chamber_is_horizontal then + -- if the chamber is part of a tree + if tick_task.chamber_trees[chamber.unit_number] then + -- add the injector to the tree + local injector_reactor = surface.find_entity(EnergyBeam.name_injector_reactor, entity.position) + if injector_reactor then + tick_task.chamber_trees[chamber.unit_number].leaves[entity.unit_number] = entity + tick_task.chamber_trees[chamber.unit_number].injector_reactors[injector_reactor.unit_number] = injector_reactor + end + end + end + end + end + for _, tree in pairs(zone.energy_transmitters) do + Log.trace(table_size(tree.leaves)) + end + end + +end + + +function EnergyBeam.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.name == EnergyBeam.name_chamber or entity.name == EnergyBeam.name_injector or entity.name == EnergyBeam.name_emitter then + local zone = Zone.from_surface(entity.surface) + if zone and zone.type ~= "spaceship" then + if entity.name == EnergyBeam.name_chamber then + -- check connections + EnergyBeam.chamber_connections(entity, true) + elseif entity.name == EnergyBeam.name_injector then + -- check connections + EnergyBeam.injector_connections(entity, true) + local reactor = entity.surface.create_entity{ name = EnergyBeam.name_injector_reactor, position = entity.position, force = entity.force} + reactor.destructible = false + end + EnergyBeam.rebuild_trees(zone, true) + local tree = global.energy_transmitters[entity.unit_number] + + -- set settings + if tree and event.tags then + tree.destination.coordinate = event.tags.destination.coordinate + tree.destination.zone = Zone.from_name(event.tags.destination.zone_name) + tree.mode = event.tags.mode + end + + if tree and entity.name == EnergyBeam.name_emitter and event.player_index and game.players[event.player_index] and game.players[event.player_index].connected then + EnergyBeamGUI.gui_open(game.players[event.player_index], tree) + end + else + cancel_entity_creation(entity, event.player_index, "Invalid surface.") + return + end + end + +end +Event.addListener(defines.events.on_built_entity, EnergyBeam.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, EnergyBeam.on_entity_created) +Event.addListener(defines.events.script_raised_built, EnergyBeam.on_entity_created) +Event.addListener(defines.events.script_raised_revive, EnergyBeam.on_entity_created) + + +function EnergyBeam.on_entity_removed(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.name == EnergyBeam.name_chamber then + EnergyBeam.remove_chamber_connections(entity, true) + EnergyBeam.remove_injector_connections(entity, true) + EnergyBeam.rebuild_trees(Zone.from_surface(entity.surface)) + elseif entity.name == EnergyBeam.name_injector then + EnergyBeam.remove_injector_connections(entity, true) + EnergyBeam.rebuild_trees(Zone.from_surface(entity.surface)) + local reactor = entity.surface.find_entity(EnergyBeam.name_injector_reactor, entity.position) + if reactor then reactor.destroy() end + elseif entity.name == EnergyBeam.name_emitter then + EnergyBeam.rebuild_trees(Zone.from_surface(entity.surface)) + local tree = EnergyBeam.from_entity(entity) + if tree then + EnergyBeam.destroy(tree) + end + elseif entity.name == EnergyBeam.name_receiver then + local beam = entity.surface.find_entity(EnergyBeam.name_receiver_beam, entity.position) + if beam then beam.destroy() end + end + +end +Event.addListener(defines.events.on_player_mined_entity, EnergyBeam.on_entity_removed) +Event.addListener(defines.events.on_robot_mined_entity, EnergyBeam.on_entity_removed) +Event.addListener(defines.events.on_entity_died, EnergyBeam.on_entity_removed) +Event.addListener(defines.events.script_raised_destroy, EnergyBeam.on_entity_removed) + + +--- Handles the player creating a blueprint by setting tags to store the state of energy emitters +---@param event any +function EnergyBeam.on_player_setup_blueprint(event) + local player_index = event.player_index + if player_index and game.players[player_index] and game.players[player_index].connected then + local player = game.players[player_index] + + -- this setup code and checks is a workaround for the fact that the event doesn't specify the blueprint on the event + -- and the player.blueprint_to_setup isn't actually set in the case of copy/paste or blueprint library or select new contents + local blueprint = nil + if player and player.blueprint_to_setup and player.blueprint_to_setup.valid_for_read then blueprint = player.blueprint_to_setup + elseif player and player.cursor_stack.valid_for_read and player.cursor_stack.is_blueprint then blueprint = player.cursor_stack end + if blueprint and blueprint.is_blueprint_setup() then + + + local mapping = event.mapping.get() + local blueprint_entities = blueprint.get_blueprint_entities() + if blueprint_entities then + for _, blueprint_entity in pairs(blueprint_entities) do + if blueprint_entity.name == EnergyBeam.name_emitter then + local entity = mapping[blueprint_entity.entity_number] + if entity then + local tree = EnergyBeam.from_entity(entity) + if tree then + local tags = {} + tags.destination = { + coordinate = tree.destination.coordinate, + zone_name = tree.destination.zone and tree.destination.zone.name + } + tags.mode = tree.mode + blueprint.set_blueprint_entity_tags(blueprint_entity.entity_number, tags) + end + end + end + end + end + end + end +end +Event.addListener(defines.events.on_player_setup_blueprint, EnergyBeam.on_player_setup_blueprint) + + +--- Handles the player copy/pasting settings between energy emitters +---@param event any +function EnergyBeam.on_entity_settings_pasted(event) + local player_index = event.player_index + if player_index and game.players[player_index] and game.players[player_index].connected + and event.source and event.source.valid and event.destination and event.destination.valid then + if not (event.source.name == EnergyBeam.name_emitter) then return end + if not (event.destination.name == EnergyBeam.name_emitter) then return end + local player = game.players[player_index] + local tree_from = EnergyBeam.from_entity(event.source) + local tree_to = EnergyBeam.from_entity(event.destination) + if tree_from and tree_to then + -- actual settings copy + tree_to.destination.coordinate = table.deepcopy(tree_from.destination.coordinate) + tree_to.destination.zone = tree_from.destination.zone + tree_to.mode = tree_from.mode + if tree_to.destination.coordinate then + player.print({"space-exploration.energy-transmitter-coordinates-pasted", math.floor(tree_to.destination.coordinate.x), math.floor(tree_to.destination.coordinate.y)}) + end + end + end +end +Event.addListener(defines.events.on_entity_settings_pasted, EnergyBeam.on_entity_settings_pasted) + + +return EnergyBeam diff --git a/space-exploration_0.5.58/space-exploration/scripts/essential.lua b/space-exploration_0.5.58/space-exploration/scripts/essential.lua new file mode 100644 index 0000000..1730a45 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/essential.lua @@ -0,0 +1,262 @@ +local Essential = {} + +mod_prefix = util.mod_prefix + +function Essential.enable_critical_techs() + + for _, force in pairs(game.forces) do + if not is_system_force(force.name) then + force.technologies["se-medpack"].enabled = true + force.technologies["se-medpack-2"].enabled = true + force.technologies["se-medpack-3"].enabled = true + force.technologies["se-medpack-4"].enabled = true + force.technologies["se-energy-beam-defence"].enabled = true + force.technologies["se-adaptive-armour-1"].enabled = true + force.technologies["se-adaptive-armour-2"].enabled = true + force.technologies["se-adaptive-armour-3"].enabled = true + force.technologies["se-adaptive-armour-4"].enabled = true + force.technologies["se-adaptive-armour-5"].enabled = true + force.technologies["se-addon-power-pole"].enabled = true + force.technologies["se-aeroframe-bulkhead"].enabled = true + force.technologies["se-aeroframe-pole"].enabled = true + force.technologies["se-aeroframe-scaffold"].enabled = true + force.technologies["se-antimatter-engine"].enabled = true + force.technologies["se-antimatter-production"].enabled = true + force.technologies["se-antimatter-reactor"].enabled = true + force.technologies["se-arcosphere"].enabled = true + force.technologies["se-arcosphere-folding"].enabled = true + force.technologies["se-astronomic-science-pack-1"].enabled = true + force.technologies["se-astronomic-science-pack-2"].enabled = true + force.technologies["se-astronomic-science-pack-3"].enabled = true + force.technologies["se-astronomic-science-pack-4"].enabled = true + force.technologies["se-big-heat-exchanger"].enabled = true + force.technologies["se-big-turbine"].enabled = true + force.technologies["se-bio-upgrade-agility-1"].enabled = true + force.technologies["se-bio-upgrade-agility-2"].enabled = true + force.technologies["se-bio-upgrade-agility-3"].enabled = true + force.technologies["se-bio-upgrade-agility-4"].enabled = true + force.technologies["se-bio-upgrade-agility-5"].enabled = true + force.technologies["se-bio-upgrade-constitution-1"].enabled = true + force.technologies["se-bio-upgrade-constitution-2"].enabled = true + force.technologies["se-bio-upgrade-constitution-3"].enabled = true + force.technologies["se-bio-upgrade-constitution-4"].enabled = true + force.technologies["se-bio-upgrade-constitution-5"].enabled = true + force.technologies["se-bio-upgrade-dexterity-1"].enabled = true + force.technologies["se-bio-upgrade-dexterity-2"].enabled = true + force.technologies["se-bio-upgrade-dexterity-3"].enabled = true + force.technologies["se-bio-upgrade-dexterity-4"].enabled = true + force.technologies["se-bio-upgrade-dexterity-5"].enabled = true + force.technologies["se-bio-upgrade-intelligence-1"].enabled = true + force.technologies["se-bio-upgrade-intelligence-2"].enabled = true + force.technologies["se-bio-upgrade-intelligence-3"].enabled = true + force.technologies["se-bio-upgrade-intelligence-4"].enabled = true + force.technologies["se-bio-upgrade-intelligence-5"].enabled = true + force.technologies["se-bio-upgrade-strength-1"].enabled = true + force.technologies["se-bio-upgrade-strength-2"].enabled = true + force.technologies["se-bio-upgrade-strength-3"].enabled = true + force.technologies["se-bio-upgrade-strength-4"].enabled = true + force.technologies["se-bio-upgrade-strength-5"].enabled = true + force.technologies["se-biogun"].enabled = true + force.technologies["se-biological-science-pack-1"].enabled = true + force.technologies["se-biological-science-pack-2"].enabled = true + force.technologies["se-biological-science-pack-3"].enabled = true + force.technologies["se-biological-science-pack-4"].enabled = true + force.technologies["se-bioscrubber"].enabled = true + force.technologies["se-capsule-behemoth-biter"].enabled = true + force.technologies["se-capsule-behemoth-spitter"].enabled = true + force.technologies["se-capsule-big-biter"].enabled = true + force.technologies["se-capsule-big-spitter"].enabled = true + force.technologies["se-capsule-medium-biter"].enabled = true + force.technologies["se-capsule-medium-spitter"].enabled = true + force.technologies["se-capsule-small-biter"].enabled = true + force.technologies["se-capsule-small-spitter"].enabled = true + force.technologies["se-condenser-turbine"].enabled = true + force.technologies["se-core-miner"].enabled = true + force.technologies["se-deep-catalogue-1"].enabled = true + force.technologies["se-deep-catalogue-2"].enabled = true + force.technologies["se-deep-catalogue-3"].enabled = true + force.technologies["se-deep-catalogue-4"].enabled = true + force.technologies["se-deep-space-science-pack-1"].enabled = true + force.technologies["se-deep-space-science-pack-2"].enabled = true + force.technologies["se-deep-space-science-pack-3"].enabled = true + force.technologies["se-deep-space-science-pack-4"].enabled = true + force.technologies["se-deep-space-transport-belt"].enabled = true + force.technologies["se-delivery-cannon"].enabled = true + force.technologies["se-delivery-cannon-weapon"].enabled = true + --force.technologies["se-dimensional-anchor"].enabled = true + force.technologies["se-dynamic-emitter"].enabled = true + force.technologies["se-electric-boiler"].enabled = true + force.technologies["se-energy-beaming"].enabled = true + force.technologies["se-energy-science-pack-1"].enabled = true + force.technologies["se-energy-science-pack-2"].enabled = true + force.technologies["se-energy-science-pack-3"].enabled = true + force.technologies["se-energy-science-pack-4"].enabled = true + force.technologies["se-fluid-burner-generator"].enabled = true + --force.technologies["se-fuel-refining"].enabled = true + force.technologies["se-heat-shielding"].enabled = true + force.technologies["se-heavy-assembly"].enabled = true + force.technologies["se-heavy-bearing"].enabled = true + force.technologies["se-heavy-composite"].enabled = true + force.technologies["se-heavy-girder"].enabled = true + force.technologies["se-holmium-cable"].enabled = true + force.technologies["se-holmium-solenoid"].enabled = true + force.technologies["se-lattice-pressure-vessel"].enabled = true + force.technologies["se-lifesupport-equipment-1"].enabled = true + force.technologies["se-lifesupport-equipment-2"].enabled = true + force.technologies["se-lifesupport-equipment-3"].enabled = true + force.technologies["se-lifesupport-equipment-4"].enabled = true + force.technologies["se-lifesupport-facility"].enabled = true + force.technologies["se-linked-container"].enabled = true + --force.technologies["se-long-range-star-mapping"].enabled = true + force.technologies["se-material-science-pack-1"].enabled = true + force.technologies["se-material-science-pack-2"].enabled = true + force.technologies["se-material-science-pack-3"].enabled = true + force.technologies["se-material-science-pack-4"].enabled = true + force.technologies["se-nanomaterial"].enabled = true + force.technologies["se-naquium-cube"].enabled = true + force.technologies["se-naquium-processor"].enabled = true + force.technologies["se-naquium-tessaract"].enabled = true + force.technologies["se-nexus"].enabled = true + force.technologies["se-processing-beryllium"].enabled = true + force.technologies["se-processing-cryonite"].enabled = true + force.technologies["se-processing-holmium"].enabled = true + force.technologies["se-processing-iridium"].enabled = true + force.technologies["se-processing-naquium"].enabled = true + force.technologies["se-processing-vitamelange"].enabled = true + force.technologies["se-processing-vulcanite"].enabled = true + force.technologies["se-pulveriser"].enabled = true + force.technologies["se-pylon"].enabled = true + force.technologies["se-pylon-construction"].enabled = true + force.technologies["se-pylon-construction-radar"].enabled = true + force.technologies["se-pylon-substation"].enabled = true + force.technologies["se-quantum-processor"].enabled = true + force.technologies["se-recycling-facility"].enabled = true + force.technologies["se-rocket-cargo-safety-1"].enabled = true + force.technologies["se-rocket-cargo-safety-2"].enabled = true + force.technologies["se-rocket-cargo-safety-3"].enabled = true + --force.technologies["se-rocket-fuel-from-water"].enabled = true + force.technologies["se-rocket-landing-pad"].enabled = true + force.technologies["se-rocket-launch-pad"].enabled = true + force.technologies["se-rocket-reusability-1"].enabled = true + force.technologies["se-rocket-reusability-2"].enabled = true + force.technologies["se-rocket-reusability-3"].enabled = true + force.technologies["se-rocket-survivability-1"].enabled = true + force.technologies["se-rocket-survivability-2"].enabled = true + force.technologies["se-rocket-survivability-3"].enabled = true + force.technologies["se-self-sealing-gel"].enabled = true + force.technologies["shield-projector"].enabled = true + force.technologies["se-space-assembling"].enabled = true + force.technologies["se-space-astrometrics-laboratory"].enabled = true + force.technologies["se-space-biochemical-laboratory"].enabled = true + force.technologies["se-space-catalogue-astronomic-1"].enabled = true + force.technologies["se-space-catalogue-astronomic-2"].enabled = true + force.technologies["se-space-catalogue-astronomic-3"].enabled = true + force.technologies["se-space-catalogue-astronomic-4"].enabled = true + force.technologies["se-space-catalogue-biological-1"].enabled = true + force.technologies["se-space-catalogue-biological-2"].enabled = true + force.technologies["se-space-catalogue-biological-3"].enabled = true + force.technologies["se-space-catalogue-biological-4"].enabled = true + force.technologies["se-space-catalogue-energy-1"].enabled = true + force.technologies["se-space-catalogue-energy-2"].enabled = true + force.technologies["se-space-catalogue-energy-3"].enabled = true + force.technologies["se-space-catalogue-energy-4"].enabled = true + force.technologies["se-space-catalogue-material-1"].enabled = true + force.technologies["se-space-catalogue-material-2"].enabled = true + force.technologies["se-space-catalogue-material-3"].enabled = true + force.technologies["se-space-catalogue-material-4"].enabled = true + force.technologies["se-space-data-card"].enabled = true + force.technologies["se-space-decontamination-facility"].enabled = true + force.technologies["se-space-electromagnetics-laboratory"].enabled = true + force.technologies["se-space-genetics-laboratory"].enabled = true + force.technologies["se-space-gravimetrics-laboratory"].enabled = true + force.technologies["se-space-growth-facility"].enabled = true + force.technologies["se-space-hypercooling-1"].enabled = true + force.technologies["se-space-hypercooling-2"].enabled = true + force.technologies["se-space-hypercooling-3"].enabled = true + force.technologies["se-space-laser-laboratory"].enabled = true + force.technologies["se-space-manufactory"].enabled = true + force.technologies["se-space-material-fabricator"].enabled = true + force.technologies["se-space-matter-fusion"].enabled = true + force.technologies["se-space-mechanical-laboratory"].enabled = true + force.technologies["se-space-particle-accelerator"].enabled = true + force.technologies["se-space-particle-collider"].enabled = true + force.technologies["se-space-plasma-generator"].enabled = true + force.technologies["se-space-platform-plating"].enabled = true + force.technologies["se-space-platform-scaffold"].enabled = true + force.technologies["se-space-probe"].enabled = true + force.technologies["se-space-radiating-efficiency"].enabled = true + force.technologies["se-space-radiating-speed"].enabled = true + force.technologies["se-space-radiation-laboratory"].enabled = true + force.technologies["se-space-radiator-1"].enabled = true + force.technologies["se-space-radiator-2"].enabled = true + force.technologies["se-space-rail"].enabled = true + force.technologies["se-space-science-lab"].enabled = true + force.technologies["se-space-simulation-ab"].enabled = true + force.technologies["se-space-simulation-abm"].enabled = true + force.technologies["se-space-simulation-am"].enabled = true + force.technologies["se-space-simulation-as"].enabled = true + force.technologies["se-space-simulation-asb"].enabled = true + force.technologies["se-space-simulation-asbm"].enabled = true + force.technologies["se-space-simulation-asm"].enabled = true + force.technologies["se-space-simulation-bm"].enabled = true + force.technologies["se-space-simulation-sb"].enabled = true + force.technologies["se-space-simulation-sbm"].enabled = true + force.technologies["se-space-simulation-sm"].enabled = true + force.technologies["se-space-solar-panel"].enabled = true + force.technologies["se-space-solar-panel-2"].enabled = true + force.technologies["se-space-solar-panel-3"].enabled = true + force.technologies["se-space-supercomputer-1"].enabled = true + force.technologies["se-space-supercomputer-2"].enabled = true + force.technologies["se-space-supercomputer-3"].enabled = true + force.technologies["se-space-supercomputer-4"].enabled = true + force.technologies["se-space-telescope"].enabled = true + force.technologies["se-space-telescope-gammaray"].enabled = true + force.technologies["se-space-telescope-microwave"].enabled = true + force.technologies["se-space-telescope-radio"].enabled = true + force.technologies["se-space-telescope-xray"].enabled = true + force.technologies["se-space-thermodynamics-laboratory"].enabled = true + force.technologies["se-spaceship-clamps"].enabled = true + force.technologies["se-supercharger"].enabled = true + force.technologies["se-teleportation"].enabled = true + force.technologies["se-vitalic-acid"].enabled = true + force.technologies["se-vitalic-epoxy"].enabled = true + force.technologies["se-vitalic-reagent"].enabled = true + force.technologies["se-wide-beacon"].enabled = true + force.technologies["se-wide-beacon-2"].enabled = true + force.technologies["se-zone-discovery-deep"].enabled = true + force.technologies["se-zone-discovery-random"].enabled = true + force.technologies["se-zone-discovery-targeted"].enabled = true + force.technologies["se-cryogun"].enabled = true + force.technologies["se-factory-spaceship-1"].enabled = true + force.technologies["se-factory-spaceship-2"].enabled = true + force.technologies["se-factory-spaceship-3"].enabled = true + force.technologies["se-factory-spaceship-4"].enabled = true + force.technologies["se-factory-spaceship-5"].enabled = true + force.technologies["se-meteor-defence"].enabled = true + force.technologies["se-meteor-point-defence"].enabled = true + force.technologies["se-plague"].enabled = true + force.technologies["se-railgun"].enabled = true + force.technologies["se-rtg-equipment"].enabled = true + force.technologies["se-rtg-equipment-2"].enabled = true + force.technologies["se-space-accumulator"].enabled = true + force.technologies["se-space-accumulator-2"].enabled = true + force.technologies["se-spaceship"].enabled = true + force.technologies["se-spaceship-integrity-1"].enabled = true + force.technologies["se-spaceship-integrity-2"].enabled = true + force.technologies["se-spaceship-integrity-3"].enabled = true + force.technologies["se-spaceship-integrity-4"].enabled = true + force.technologies["se-spaceship-integrity-5"].enabled = true + force.technologies["se-spaceship-integrity-6"].enabled = true + force.technologies["se-spaceship-integrity-7"].enabled = true + force.technologies["se-superconductive-cable"].enabled = true + force.technologies["se-tesla-gun"].enabled = true + force.technologies["se-thruster-suit"].enabled = true + force.technologies["se-thruster-suit-2"].enabled = true + force.technologies["se-thruster-suit-3"].enabled = true + force.technologies["se-thruster-suit-4"].enabled = true + force.technologies["se-rocket-science-pack"].enabled = true + force.technologies["se-spaceship-victory"].enabled = true + end + end +end +return Essential diff --git a/space-exploration_0.5.58/space-exploration/scripts/event.lua b/space-exploration_0.5.58/space-exploration/scripts/event.lua new file mode 100644 index 0000000..67ad778 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/event.lua @@ -0,0 +1,58 @@ +Event = { listeners = {} } + +-- can add multiple listeners to the same event. +-- event_key can be a uint of native events (defines.events) +-- event_key can be a string for custom input of virtual events +-- if a virtual event is added, set virtual = true + -- on_init, on_load, on_configuration_changed get triggered automatically as virtual events + -- can also do on_nth_tick_#, e.g. on_nth_tick_60 or on_nth_tick_600 +Event.addListener = function(event_key, add_callback, virtual) + if not Event.listeners[event_key] then + Event.listeners[event_key] = {} + Event.listeners[event_key].callbacks = {} + Event.listeners[event_key].sequence = function (event) + for _, callback in pairs(Event.listeners[event_key].callbacks) do + callback(event) + end + end + if string.find(event_key, "on_nth_tick_", 1, true) then + local freq = tonumber(Util.replace(event_key, "on_nth_tick_", "")) + script.on_nth_tick(freq, Event.listeners[event_key].sequence) + table.insert(Event.listeners[event_key].callbacks, add_callback) + else + if not virtual then -- custom input eventsm only works after on_init + script.on_event(event_key, Event.listeners[event_key].sequence) + end + table.insert(Event.listeners[event_key].callbacks, add_callback) + end + else + for _, callback in pairs(Event.listeners[event_key].callbacks) do + if callback == add_callback then return end + end + if not exists then + table.insert(Event.listeners[event_key].callbacks, add_callback) + end + end +end + +-- can add multiple listneers to the same event. +Event.removeListener = function(event_key, remove_callback) + if not Event.listeners[event_key] then return end + for _, callback in pairs(Event.listeners[event_key].callbacks) do + if callback == remove_callback then + Event.listeners[event_key].callbacks[_] = nil + end + end +end + +Event.trigger = function(event_key, event_data) + if Event.listeners[event_key] then + Event.listeners[event_key].sequence(event_data) + end +end + +script.on_init(function(event) Event.trigger("on_init", event) end) +script.on_load(function(event) Event.trigger("on_load", event) end) +script.on_configuration_changed(function(event) Event.trigger("on_configuration_changed", event) end) + +return Event diff --git a/space-exploration_0.5.58/space-exploration/scripts/informatron.lua b/space-exploration_0.5.58/space-exploration/scripts/informatron.lua new file mode 100644 index 0000000..b1f2fca --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/informatron.lua @@ -0,0 +1,387 @@ +local Informatron = {} -- informatron pages implementation. + +function Informatron.menu(player_index) + local player = game.players[player_index] + local playerdata = get_make_playerdata(player) + local force = player.force + local menu = { + meteor_defence = 1, + coremining = 1, + beacons = 1, + launching_satellites = 1, + pinned_locations = 1, + zone_discovery = 1, + cargo_rockets = 1, + delivery_cannons = 1, + lifesupport = 1, + space_sciences = 1, + energy_beams = 1, + spaceships = 1, + arcospheres = 1, + exploration_journal = 1, + } + if playerdata.track_glyphs then + menu["archeology"] = 1 -- shhh + end + if force.technologies[Ancient.name_tech_coordinates].enabled then + menu["starmapping"] = 1 -- shhh + end + if global.forces[force.name] and global.forces[force.name].coordinate_logs then + menu["coordinate_logs"] = 1 -- shhh + end + return menu +end + +function Informatron.set_warnings(warnings, force) + warnings.clear() + for force_name, forcedata in pairs(global.forces) do + if forcedata.solar_flare then + if Zone.is_visible_to_force(forcedata.solar_flare.zone, force.name) then + local warning = warnings.add{type="label", name="warning_"..force_name, caption={ + "space-exploration.page_energy_beam_warning_text", + forcedata.solar_flare.zone.name, + Util.seconds_to_clock((forcedata.solar_flare.tick - game.tick)/60, true), + string.format("%.2f", SolarFlare.base_power / 1000000000 * SolarFlare.default_flare_power(forcedata.solar_flare.zone) ), + math.floor(160 * SolarFlare.default_flare_power(forcedata.solar_flare.zone)) + } + } + warning.style.bottom_margin = 20 + warning.style.single_line = false + end + end + end +end + +function Informatron.page_content_update(page_name, player_index, element) + if page_name == "energy_beams" then + local player = game.players[player_index] + local force = player.force + local force_data = global.forces[force.name] + if element.warnings then + Informatron.set_warnings(element.warnings, force) + end + end +end + +function Informatron.page_content(page_name, player_index, element) + local player = game.players[player_index] + local player_data = get_make_playerdata(player) + + local force = player.force + local force_data = global.forces[force.name] + if page_name == "space-exploration" then + element.add{type="label", name="text_1", caption={"space-exploration.page_space_exploration_text_1"}} + + elseif page_name == "meteor_defence" then + element.add{type="label", name="text_1", caption={"space-exploration.page_meteor_defence_text_1"}} + + elseif page_name == "coremining" then + element.add{type="label", name="text_1", caption={"space-exploration.page_coremining_text_1"}} + + elseif page_name == "beacons" then + element.add{type="label", name="text_1", caption={"space-exploration.page_beacons_text_1"}} + + elseif page_name == "launching_satellites" then + element.add{type="label", name="text_1", caption={"space-exploration.page_launching_satellites_text_1", force_data.satellites_launched or 0}} + + elseif page_name == "pinned_locations" then + element.add{type="label", name="text_1", caption={"space-exploration.page_pinned_locations_text_1"}} + + elseif page_name == "zone_discovery" then + element.add{type="label", name="text_1", caption={"space-exploration.page_zone_discovery_text_1"}} + + local any_button_table = element.add{type="table", name="any_button_table", column_count=5, draw_horizontal_lines=false} + any_button_table.style.horizontally_stretchable = true + any_button_table.style.column_alignments[1] = "middle-center" + any_button_table.style.column_alignments[2] = "middle-center" + any_button_table.style.column_alignments[3] = "middle-center" + any_button_table.style.top_margin = 30 + any_button_table.add{type = "flow", name="cell_left"} + local any_button = any_button_table.add{type="button", name="any_resource", + caption="No preference", + style=force_data.search_for_resource == nil and "se_button_discovery_any_active" or "se_button_discovery_any" + } + any_button_table.add{type = "flow", name="cell_right"} + + local r_table = element.add{type="table", name="discover_resource_table", column_count=5, draw_horizontal_lines=false} + r_table.style.horizontally_stretchable = true + r_table.style.column_alignments[1] = "middle-center" + r_table.style.column_alignments[2] = "middle-center" + r_table.style.column_alignments[3] = "middle-center" + r_table.style.column_alignments[4] = "middle-center" + r_table.style.column_alignments[5] = "middle-center" + r_table.style.horizontal_spacing = 10 + r_table.style.vertical_spacing = 30 + r_table.style.top_margin = 30 + + local resources_settings = global.resources_and_controls.resource_settings + for _, resource in pairs(resources_settings) do + if resource.name ~= mod_prefix.."naquium-ore" then + local button = r_table.add{type="button", name=resource.name, + style=force_data.search_for_resource == resource.name and "se_button_discovery_active" or "se_button_discovery" + } + + local l = button.add{type = "label", name = "l", + caption={"space-exploration.discovery_look_for_resource_caption", "[img=entity/"..resource.name.."]", {"entity-name."..resource.name} }, + tooltip={"space-exploration.discovery_look_for_resource_tooltip", {"entity-name."..resource.name}} + } + --button.style.horizontally_stretchable = true + --button.style.width = 165 + --button.style.height = 90 + --button.style.top_padding = 20 + --button.style.bottom_padding = 20 + --button.style.horizontal_align = "center" + --button.style.vertical_align = "center" + --l.style.horizontally_stretchable = true + --l.style.vertically_stretchable = true + l.ignored_by_interaction = true + l.style.single_line = false + l.style.width = 155 + l.style.horizontal_align = "center" + l.style.vertical_align = "center" + l.style.font="heading-2" + end + end + + elseif page_name == "cargo_rockets" then + element.add{type="label", name="text_1", caption={ + "space-exploration.page_cargo_rockets_text_1", + force_data.cargo_rockets_launched or 0, + string.format("%.2f",100-100*Launchpad.get_force_cargo_loss_modifier(force)), + string.format("%.2f",100-100*Launchpad.get_force_survivability_loss_modifier(force)), + 100 * Launchpad.get_reusability(force), + }} + + elseif page_name == "delivery_cannons" then + element.add{type="label", name="text_1", caption={"space-exploration.page_delivery_cannons_text_1"}} + + elseif page_name == "lifesupport" then + element.add{type="label", name="text_1", caption={"space-exploration.page_lifesupport_text_1"}} + + elseif page_name == "space_sciences" then + element.add{type="label", name="text_1", caption={"space-exploration.page_space_sciences_text_1"}} + + elseif page_name == "energy_beams" then + element.add{type="label", name="text_1", caption={"space-exploration.page_energy_beams_text_1"}} + element.text_1.style.bottom_margin = 20 + + local warnings = element.add{type = "flow", name="warnings", direction = "vertical"} + Informatron.set_warnings(element.warnings, force) + element.add{type="label", name="text_2", caption={"space-exploration.page_energy_beams_text_2"}} + + elseif page_name == "spaceships" then + element.add{type="label", name="text_1", caption={"space-exploration.page_spaceships_text_1"}} + + elseif page_name == "arcospheres" then + element.add{type="label", name="text_1", caption={"space-exploration.page_arcospheres_text_1"}} + element.add{type="label", name="text_arco_deep", caption={"space-exploration.page_arcospheres_text_deep", force_data.arcospheres_collected or 0, force_data.arcosphere_collectors_launched or 0}} + if force_data.zone_arcospheres then + for zone_index, zone_stats in pairs(force_data.zone_arcospheres) do + local zone = Zone.from_zone_index(zone_index) + element.add{type="label", name="text_arco_zone_"..zone_index, caption={"space-exploration.page_arcospheres_text_zone", zone.name, zone_stats.arcospheres_collected or 0, zone_stats.arcosphere_collectors_launched or 0}} + end + end + elseif page_name == "exploration_journal" then + local text + element.add{type="label", name="page_journal_title_backstory", caption={"space-exploration.page_journal_title_backstory"}, style="heading_2_label"} + text = element.add{type="label", name="page_journal_text_backstory", caption={"space-exploration.page_journal_text_backstory"}} + text.style.bottom_margin = 20 + + if force_data.satellites_launched and force_data.satellites_launched > 0 then + element.add{type="label", name="page_journal_title_satellite_launch", caption={"space-exploration.page_journal_title_satellite_launch"}, style="heading_2_label"} + text = element.add{type="label", name="page_journal_text_satellite_launch", caption={"space-exploration.page_journal_text_satellite_launch"}} + text.style.bottom_margin = 20 + end + + if force_data.cargo_rockets_launched and force_data.cargo_rockets_launched > 0 then + element.add{type="label", name="page_journal_title_cargo_launch", caption={"space-exploration.page_journal_title_cargo_launch"}, style="heading_2_label"} + text = element.add{type="label", name="page_journal_text_cargo_launch", caption={"space-exploration.page_journal_text_cargo_launch"}} + text.style.bottom_margin = 20 + end + + if player_data.first_entered_vault then + element.add{type="label", name="page_journal_title_entered_vault", caption={"space-exploration.page_journal_title_entered_vault"}, style="heading_2_label"} + text = element.add{type="label", name="page_journal_text_entered_vault", caption={"space-exploration.page_journal_text_entered_vault", player_data.first_entered_vault.name}} + text.style.bottom_margin = 20 + + if not player_data.track_glyphs then + local button = element.add{type = "button", name=Ancient.name_button_player_track_glyphs, caption={"space-exploration.player_track_glyphs"}} + button.style.bottom_margin = 20 + end + end + + local anomaly = Zone.from_name("Foenestra") + if force_data.zones_discovered[anomaly.index] then + element.add{type="label", name="page_journal_title_found_gate", caption={"space-exploration.page_journal_title_found_gate"}, style="heading_2_label"} + text = element.add{type="label", name="page_journal_text_found_gate", caption={"space-exploration.page_journal_text_found_gate"}} + text.style.bottom_margin = 20 + end + if global.gate then + Ancient.cryptf6() + + if player_data.has_entered_anomaly then + element.add{type="label", name="page_journal_title_found_gate_ship", caption={"space-exploration.page_journal_title_found_gate_ship"}, style="heading_2_label"} + text = element.add{type="label", name="page_journal_text_found_gate_ship", caption={"space-exploration.page_journal_text_found_gate_ship"}} + text.style.bottom_margin = 20 + + element.add{type="label", name="page_journal_title_found_gate_ship_authenticated", caption={"space-exploration.page_journal_title_found_gate_ship_authenticated"}, style="heading_2_label"} + text = element.add{type="label", name="page_journal_text_found_gate_ship_authenticated", caption={"space-exploration.page_journal_text_found_gate_ship_authenticated"}} + text.style.bottom_margin = 20 + + --local player_name = player.name or "Engineer" + --local id = 2236067977 - player.index * 13 + --local sub_id = 5 + player.index + local player_name = game.players[1].name or "Engineer" + local id = 2236067964 + local sub_id = 5 + 1 + local fcoord = Ancient.cryptf7(global.hcoord) + + element.add{type="label", name="page_journal_title_found_gate_ship_log", caption={"space-exploration.page_journal_title_found_gate_ship_log"}, style="heading_2_label"} + local text_found_gate_ship_log_intro = element.add{type="label", name="page_journal_text_found_gate_ship_log_intro", caption={"space-exploration.page_journal_text_found_gate_ship_log_intro"}} + local log_frame = element.add{type="frame", name="log_frame", style="a_inner_frame"} + log_frame.style.vertically_stretchable = true + local text_found_gate_ship_log = log_frame.add{ + type="label", + name="page_journal_text_found_gate_ship_log", + caption={"space-exploration.page_journal_text_found_gate_ship_log", + id .. "."..sub_id.." (".. player_name.."_"..sub_id..")", + Ancient.coordinate_to_string(fcoord) + } + } + text_found_gate_ship_log.style.single_line = false + text_found_gate_ship_log.style.font_color = {r=0.6,g=0.7,b=0.8} + log_frame.style.bottom_margin = 20 + end + end + + if player_data.gate_victory then + element.add{type="label", name="page_journal_title_gate_victory", caption={"space-exploration.page_journal_title_gate_victory"}, style="heading_2_label"} + text = element.add{type="label", name="page_journal_gate_victory", caption={"space-exploration.page_journal_gate_victory"}} + text.style.bottom_margin = 20 + end + + if player_data.spaceship_victory then + element.add{type="label", name="page_journal_title_spaceship_victory", caption={"space-exploration.page_journal_title_spaceship_victory"}, style="heading_2_label"} + text = element.add{type="label", name="page_journal_spaceship_victory", caption={"space-exploration.page_journal_spaceship_victory"}} + text.style.bottom_margin = 20 + end + + elseif page_name == "archeology" then + + local count = 0 + local text_1 = element.add{type="label", name="text_1", caption={"space-exploration.page_archeology_text_1", count}} + text_1.style.bottom_margin = 20 + for _, zone in pairs(global.zone_index) do + if zone.glyph and (force_data.zones_discovered[zone.index] or global.debug_view_all_zones) then + count = count + 1 + local item = element.add{type="label", name="link_vault_"..zone.index, caption={"space-exploration.page_archeology_pyramid_link", "[img="..Zone.get_icon(zone).."]", zone.name} } + item.style.bottom_margin = 20 + end + end + text_1.caption={"space-exploration.page_archeology_text_1", count} + local text_2 = element.add{type="label", name="text_2", caption={"space-exploration.page_archeology_text_2", count}} + text_2.style.bottom_margin = 20 + text_2.style.top_margin = 20 + + + elseif page_name == "starmapping" then + local text_1 = element.add{type="label", name="text_1", caption={"space-exploration.page_starmapping_text_1", 0}, } + if force_data.coordinates_discovered then + local count = 0 + for i, glyph_id in pairs(force_data.coordinates_discovered) do + count = count + 1 + coordinate = Ancient.cryptf4b({glyph_id}) + local label = element.add{type="label", name="glyph_"..glyph_id, + caption={"space-exploration.starmapping-found-constellation-informatron", "[img=entity/"..mod_prefix .. "glyph-a-energy-"..glyph_id.."]", Ancient.coordinate_to_string(coordinate)} + } + label.style.height = 32 + end + text_1.caption = {"space-exploration.page_starmapping_text_1", count} + text_1.style.bottom_margin = 20 + text_1.style.vertical_align = "center" + end + + elseif page_name == "coordinate_logs" then + log_description = element.add{type="label", name="text_1", caption={"space-exploration.page_coordinate_logs_text_1"}} + log_description.style.bottom_margin = 16 + local log_list + + if force_data.coordinate_logs then + if #force_data.coordinate_logs == 0 then + log_empty = element.add{type="label", name="log_empty", caption={"space-exploration.page_coordinate_logs_text_empty"}} + log_empty.style.font_color = {r=1,g=1} + else + log_list = element.add{type = "flow", name="log_list", direction = "vertical"} + log_list.style.bottom_margin = 30 + local log_entry + local glyph_entry + local coordinate_entry + for i = #force_data.coordinate_logs, 1, -1 do + log_entry = log_list.add{type = "flow", name="log_entry"..i, direction = "horizontal"} + glyph_entry = log_entry.add{type="label", name="glyph_entry_"..i, caption={"space-exploration.page_coordinate_logs_glyph_entry", force_data.coordinate_logs[i].glyph_string}} + coordinate_entry = log_entry.add{type="text-box", name="coordinate_entry_"..i, text=force_data.coordinate_logs[i].coordinate_string} + log_entry.style.height = 32 + glyph_entry.style.top_margin = 5 + coordinate_entry.read_only = true + coordinate_entry.style.horizontally_stretchable = true + coordinate_entry.style.minimal_width = 450 + end + local clear_button = element.add{type="button", name="log_clear", style="red_button", mouse_button_filter={"left"}, caption={"space-exploration.page_coordinate_logs_button_clear_caption"}} + end + end + end + +end + + +function Informatron.on_gui_click (event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + + root = gui_element_or_parent(element, "informatron_main") + if root then -- informatron + if element.name == Ancient.name_button_player_track_glyphs then + local player_data = get_make_playerdata(player) + player_data.track_glyphs = true + remote.call("informatron", "informatron_open_to_page", {player_index = player.index, interface="space-exploration", page_name="archeology"}) + elseif string.find(element.name, "link_vault_", 1, true) then + local zone_index = util.string_to_number(util.replace(element.name, "link_vault_", "")) + local zone = Zone.from_zone_index(zone_index) + if zone and zone.glyph then + local surface = Zone.get_make_surface(zone) + RemoteView.start(player, zone) + if zone.vault_pyramid and zone.vault_pyramid.valid then + player.teleport(zone.vault_pyramid.position) + player.gui.center.clear() + end + end + elseif element.parent.name == "discover_resource_table" then + local force_data = global.forces[player.force.name] + force_data.search_for_resource = element.name + for _, child in pairs(util.find_first_descendant_by_name(root, "discover_resource_table").children) do + child.style = "se_button_discovery" + end + element.style = "se_button_discovery_active" + local any_button = util.find_first_descendant_by_name(root, "any_resource") + any_button.style = "se_button_discovery_any" + elseif element.name == "any_resource" then + local force_data = global.forces[player.force.name] + force_data.search_for_resource = nil + element.style = "se_button_discovery_any_active" + for _, child in pairs(util.find_first_descendant_by_name(root, "discover_resource_table").children) do + child.style = "se_button_discovery" + end + elseif element.name == "log_clear" then + local force_data = global.forces[player.force.name] + force_data.coordinate_logs = {} + log_list = util.find_first_descendant_by_name(root, "log_list") + if log_list then log_list.destroy() end + end + return + end +end +Event.addListener(defines.events.on_gui_click, Informatron.on_gui_click) + + +return Informatron diff --git a/space-exploration_0.5.58/space-exploration/scripts/interburbulator.lua b/space-exploration_0.5.58/space-exploration/scripts/interburbulator.lua new file mode 100644 index 0000000..e0efeba --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/interburbulator.lua @@ -0,0 +1,830 @@ +local Interburbulator = {} +--[[ +-- have 4 shield projectors. +-- have 1 laser turet. +-- have n input addon? +A group of 3 bots are on a planet. +Antikythera / Aigilia / Eunomia +Tritan Aurum 1.6180339 +Tritan Argent 2.41421356 +Tritan Brontion 3.3027756 +Plectrum Princeps 2.4450076 +Plectrum Aurum 0.6180339 +Plectrum Argent 1.41421356 +Plectrum Brontion 2.3027756 + +Brontion Burble 33027756 +The bots ask for numbers. +The bots move into a triangle and project a hololographic grid. + +Interburbulator bots move to intersection points. + +Hovering an Interburbulator makes them say their numbers. + +-- The grid resolution is controlled by A coordinate interface. +-- need an associated ruin. +]] +Interburbulator.display_width_tiles = 16 + +Interburbulator.threshold = 0.000000000000001 +Interburbulator.name_interburbulator_gui_root = mod_prefix.."interburbulator-control" +Interburbulator.robot_color = {r=1, g=1, b=1, a=0.1} +Interburbulator.attempts_locked_timeout = 60*15 -- 15 seconds, claimed to reset after 20s but assume lower UPS + +Interburbulator.challenges = { + { -- 1 + grid = 3, + target = {2,2}, + set = { {1,0,0}, {1,1,0}, {1,0,1}}, + prize = {name = "raw-fish", count = 1}, + attempts = 7, + success_text_prize = {"space-exploration.interburbulator_success_prize_1"} + }, + { -- 2 + grid = 4, + target = {2,3}, + set = { {1,0,0}, {0,1,0}, {0,0,1}}, + prize = {name = mod_prefix.."machine-learning-data", count = 100}, + attempts = 6, + success_text_prize = {"space-exploration.interburbulator_success_prize_2"} + }, + { -- 3 + grid = 5, + target = {3,1}, + set = { {1,1,1}, {0,1,0}, {0,0,1}}, + prize = {name = mod_prefix.."significant-data", count = 100}, + attempts = 6, + success_text_prize = {"space-exploration.interburbulator_success_prize_3"} + }, + { -- 4 + grid = 6, + target = {4,4}, + set = { {-1,0,0}, {0,1,0}, {0,0,1}}, + prize = {name = "spidertron", count = 1}, + attempts = 5, + success_text_prize = {"space-exploration.interburbulator_success_prize_4"} + }, + { -- 5 + grid = 7, + target = {2,4}, + set = { {1,0,0}, {0,2,0}, {0,0,7}}, + attempts = 5, + prize = {name = "effectivity-module-9", count = 1}, + success_text_prize = {"space-exploration.interburbulator_success_prize_5"} + }, + { -- 6 + grid = 8, + target = {7,7}, + set = { {1,6,1}, {8,0,3}, {3,9,8}}, + prize = {name = "speed-module-9", count = 1}, + attempts = 4, + success_text_prize = {"space-exploration.interburbulator_success_prize_6"} + }, + { -- 7 + grid = 10, + target = {3,6}, + set = { {0.1,0.6,0.1}, {0.8,-0.1,0.3}, {0.3,0.9,0.8}}, + prize = {name = "productivity-module-9", count = 1}, + attempts = 4, + success_text_prize = {"space-exploration.interburbulator_success_prize_7"} + }, + { -- 8 + grid = 15, + target = {13,15}, + set = { {0.87,0.49,0.89}, {0.48,0.48,0.2}, {0.45,0.86,0.83}}, + prize = {name = mod_prefix.."wide-beacon-2", count = 4}, + attempts = 3, + success_text_prize = {"space-exploration.interburbulator_success_prize_8"} + }, + { -- 9 + grid = 20, + target = {17,2}, + set = { {-436,563,-811}, {772,30,917}, {980,576,286}}, + prize = {name = mod_prefix.."naquium-processor", count = 8}, + attempts = 3, + success_text_prize = {"space-exploration.interburbulator_success_prize_9"} + }, + { -- 10 + grid = 50, + target = {33,44}, + set = { {1.618033,0.9887498,0.48204586}, {2.414213,0.5623730,0.9504880}, {3.302775,0.6377319,0.9464655}}, + prize = {name = mod_prefix.."arcosphere", count = 10}, + attempts = 2, + success_text_prize = {"space-exploration.interburbulator_success_prize_10"} + }, +} +Interburbulator.success_freeplay = {} +for i = 1, 5 do + table.insert(Interburbulator.success_freeplay, "interburbulator_success_freeplay_"..i) +end +Interburbulator.success_repeat = {} +for i = 1, 6 do + table.insert(Interburbulator.success_repeat, "interburbulator_success_repeat_"..i) +end +Interburbulator.fail_text = {} +Interburbulator.fail_bad_text = {} +for i = 1, 39 do + table.insert(Interburbulator.fail_text, "interburbulator_fail_easy_"..i) +end +for i = 1, 10 do + table.insert(Interburbulator.fail_bad_text, "interburbulator_fail_offgrid_"..i) +end +for i = 1, 9 do + table.insert(Interburbulator.fail_text, "interburbulator_fail_mixed_"..i) + table.insert(Interburbulator.fail_bad_text, "interburbulator_fail_mixed_"..i) +end +Interburbulator.locked_text = {} +for i = 1, 6 do + table.insert(Interburbulator.locked_text, "interburbulator_challenge_locked_"..i) +end + +function Interburbulator.message(player, text) + player.print({"space-exploration.interburbulator_speak", text}) +end + +function Interburbulator.make_interburbulator(zone, position) + if global.interburbulator then return end -- don't make 2 + global.interburbulator = { + zone = zone, + position = position or {x=0, y=0}, + challenge_index = 1, + challenge_set = nil, -- only used when you set a custom/random challenge. + challenge_grid_size = nil, -- only used when you set a custom/random challenge. + challenge_cell = nil, -- only used when you set a custom/random challenge. + guessed_vector = nil, -- shown after a guess + guessed_position = nil, -- shown after a guess + guessed_cell = nil, -- shown after a guess + guessed_player_index = nil, + shape_ids = {}, + prizes_won = {}, -- could be indexed by player-challenge but for now just challenge + freeplay_unlocked = false + } + zone.interburbulator = global.interburbulator + Interburbulator.build_platform() +end + +function Interburbulator.build_platform() + if global.interburbulator.robot and global.interburbulator.robot.valid and global.interburbulator.interface and global.interburbulator.interface.valid then return end + local surface = Zone.get_surface(global.interburbulator.zone) + if surface then + surface.request_to_generate_chunks(global.interburbulator.position) + surface.force_generate_chunk_requests() + Ruin.build({ruin_name = "interburbulator-platform", surface_index = surface.index, position = global.interburbulator.position}) + global.interburbulator.light = rendering.draw_light{ + sprite = mod_prefix.."interburbulator-light", + surface = surface, + target = global.interburbulator.position, + intesity = 2, + } + global.interburbulator.grid = rendering.draw_sprite{ + sprite = mod_prefix.."interburbulator-grid", + surface = surface, + target = global.interburbulator.position, + tint = {r=0.5,b=0.5,g=0.5}, + draw_on_ground = true, + alignment = "center" + } + global.interburbulator.robot = surface.find_entities_filtered{name=mod_prefix.."burbulator"}[1] + global.interburbulator.interface = surface.find_entities_filtered{name=mod_prefix.."interburbulator-control"}[1] + global.interburbulator.robot.color = Interburbulator.robot_color + global.interburbulator.robot_text = rendering.draw_text{ + surface = surface, + target = global.interburbulator.robot, + text = {"space-exploration.interburbulator_robot_name"}, + color = {r=0.6,g=0,b=0}, + alignment = "center", + target_offset = {0, -3.5} + } + game.print({"space-exploration.interburbulator_speak", {"space-exploration.interburbulator_greeting", global.interburbulator.zone.name, Zone.get_star_from_child( global.interburbulator.zone).name}}) + end +end + +function Interburbulator.on_nth_tick_300() + if global.interburbulator and global.interburbulator.robot and global.interburbulator.robot.valid then + local orientation = Util.orientation_from_to(global.interburbulator.position, global.interburbulator.robot.position) + 0.25 -- why is this 0.25 off? + if orientation > 0.5 then orientation = orientation - 1 end -- -0.5 to 0.5 + orientation = orientation * 0.8 - 0.2 + 0.4 * math.random() + local pos = Util.orientation_to_vector(orientation, math.random(12,15)) + global.interburbulator.robot.autopilot_destination = Util.vectors_add(global.interburbulator.position, pos) + if math.random() < 0.1 then + global.interburbulator.robot.autopilot_destination = Util.vectors_add(global.interburbulator.position, {x = 0, y = -10}) + end + global.interburbulator.robot.insert({name="rocket", count = 10}) + global.interburbulator.robot.color = Interburbulator.robot_color + end +end +Event.addListener("on_nth_tick_300", Interburbulator.on_nth_tick_300) -- 5s + +function Interburbulator.clear_display() + if global.interburbulator.shape_ids then + for _, shape_id in pairs(global.interburbulator.shape_ids) do + if rendering.is_valid(shape_id) then rendering.destroy(shape_id) end + end + end + global.interburbulator.shape_ids = {} +end + +function Interburbulator.get_attempts(challenge_index) + global.interburbulator.challenge_attempts = global.interburbulator.challenge_attempts or {} + global.interburbulator.challenge_attempts[challenge_index] = global.interburbulator.challenge_attempts[challenge_index] or { + attempts = 0, + tick = game.tick + } + -- reset + if global.interburbulator.challenge_attempts[challenge_index].attempts >= Interburbulator.challenges[challenge_index].attempts and game.tick > global.interburbulator.challenge_attempts[challenge_index].tick + Interburbulator.attempts_locked_timeout then + global.interburbulator.challenge_attempts[challenge_index].attempts = 0 + global.interburbulator.challenge_attempts[challenge_index].tick = game.tick + end + return global.interburbulator.challenge_attempts[challenge_index] +end + +function Interburbulator.increase_attempts(challenge_index) + Interburbulator.get_attempts(challenge_index) + global.interburbulator.challenge_attempts[challenge_index].attempts = + global.interburbulator.challenge_attempts[challenge_index].attempts + 1 + global.interburbulator.challenge_attempts[challenge_index].tick = game.tick +end + +function Interburbulator.update(player) + if not global.interburbulator then return end + Interburbulator.clear_display() + local surface = Zone.get_surface(global.interburbulator.zone) + if not surface then return end + + local vs_abc = global.interburbulator.challenge_set -- vector set: points a, b, and c. Point d is inferred to complete the square + local cells_w = global.interburbulator.challenge_grid_size + local target_cell = global.interburbulator.challenge_cell + local width + if global.interburbulator.challenge_index then + vs_abc = Interburbulator.challenges[global.interburbulator.challenge_index].set + cells_w = Interburbulator.challenges[global.interburbulator.challenge_index].grid + target_cell = Interburbulator.challenges[global.interburbulator.challenge_index].target + end + + if cells_w then + Interburbulator.draw_grid(surface, cells_w) + width = Interburbulator.display_width_tiles * cells_w/(cells_w+2) + if target_cell then + local box = { + {(target_cell[1]-1)/cells_w, (target_cell[2]-1)/cells_w}, + {target_cell[1]/cells_w, target_cell[2]/cells_w} + } + table.insert(global.interburbulator.shape_ids, rendering.draw_rectangle{ + surface = surface, + color = {r=0.4,b=0,g=0,a=0.4}, + filled = true, + left_top = { x = global.interburbulator.position.x -width/2 + box[1][1] * width, y = global.interburbulator.position.y -width/2 + box[1][2] * width }, + right_bottom = { x = global.interburbulator.position.x -width/2 + box[2][1] * width, y = global.interburbulator.position.y -width/2 + box[2][2] * width }, + draw_on_ground = true, + }) + end + else + return + end + + local v_e = global.interburbulator.guessed_vector + if v_e and v_e[1] == 0 and v_e[2] == 0 and v_e[3] == 0 then + v_e = nil + end + if not (vs_abc and v_e) then return end + + local v_a2b = {} -- a to b + local v_a2c = {} -- a to c + local n_e = Util.nvector_normalise(v_e) -- the normal of point e + + local v_bc = {} -- the bc midpoint + local v_abc = {} -- the abc midpoint + for i = 1, #v_e do + v_bc[i] = (vs_abc[2][i]+vs_abc[3][i])/2 + v_a2b[i] = vs_abc[2][i]-vs_abc[1][i] + v_a2c[i] = vs_abc[3][i]-vs_abc[1][i] + v_abc[i] = (vs_abc[1][i] + vs_abc[2][i] + vs_abc[3][i]) / 3 + end + + local n_abc = Util.nvector_normalise(v_abc) -- the normal of the abc mid point + + local n_abc_cross = Util.vector_cross(v_a2b, v_a2c) + local n_abc_cross = {n_abc_cross.x, n_abc_cross.y, n_abc_cross.z} + + -- m_i: the magnitude multiplier for vector e where it would intersect with the abc plane + local m_i = Util.nvector_dot(n_abc_cross, Util.nvector_multiply(vs_abc[1], -1)) / Util.nvector_dot(Util.nvector_multiply(v_e, -1), n_abc_cross) + + local v_i = Util.nvector_multiply(v_e, m_i) -- i, the point on the abc plane where e intersects + + local v_a2i = {} -- bc_mid to a + local v_bc2a = {} -- bc_mid to a + local v_bc2b = {} -- bc_mid to b (to c is negative this vector) + local v_bc2i = {} -- bc_mid to the i intersection + for i = 1, #v_e do + v_a2i[i] = v_i[i]-vs_abc[1][i] + v_bc2a[i] = vs_abc[1][i]-v_bc[i] + v_bc2b[i] = vs_abc[2][i]-v_bc[i] + v_bc2i[i] = v_i[i]-v_bc[i] + end + + -- need to de-skew the space + local sets = {{1,2},{1,3},{2,3}} + local mi_a2b + local mi_a2c + for _, set in pairs(sets) do + local u = set[1] + local v = set[2] + if mi_a2b == nil or tostring(mi_a2b) == "nan" then + mi_a2b = (v_a2i[v]*v_a2c[u]-v_a2i[u]*v_a2c[v])/(v_a2c[u]*v_a2b[v]-v_a2c[v]*v_a2b[u]) + end + if mi_a2c == nil or tostring(mi_a2c) == "nan" then + mi_a2c = (v_a2i[v]*v_a2b[u]-v_a2i[u]*v_a2b[v])/(v_a2b[u]*v_a2c[v]-v_a2b[v]*v_a2c[u]) + end + end + + local cursor_point_2d = { + mi_a2b, + mi_a2c, + } + -- handle innacuracy + if cursor_point_2d[1] < 0 and cursor_point_2d[1] > -Interburbulator.threshold then + cursor_point_2d[1] = 0 + end + if cursor_point_2d[2] < 0 and cursor_point_2d[2] > -Interburbulator.threshold then + cursor_point_2d[2] = 0 + end + + local best_box + local best_cell + for k = 0, cells_w do + for j = 0, cells_w do + local box + if not best_box then + box = {{k/cells_w, j/cells_w}, {(k+1)/cells_w, (j+1)/cells_w}} + if cursor_point_2d[1] >= box[1][1] + and cursor_point_2d[1] <= box[2][1] + and cursor_point_2d[2] >= box[1][2] + and cursor_point_2d[2] <= box[2][2] then + best_box = box + best_cell = {k+1, j+1} + end + end + end + end + + local challenge_index = global.interburbulator.challenge_index + local attempts = 0 + local allow = true + if challenge_index then + attempts = Interburbulator.get_attempts(challenge_index).attempts + if attempts >= Interburbulator.challenges[challenge_index].attempts then + allow = false + if player then + Interburbulator.message(player, {"space-exploration."..Interburbulator.locked_text[math.random(#Interburbulator.locked_text)]}) + end + end + end + if allow then + if cursor_point_2d and cursor_point_2d[1] > -0.1 and cursor_point_2d[1] < 1.1 + and cursor_point_2d[2] > -0.1 and cursor_point_2d[2] < 1.1 then + table.insert(global.interburbulator.shape_ids, rendering.draw_circle{ + surface = surface, + color = {r=1,b=0,g=1}, + filled = true, + radius = 0.2, + target = {x = global.interburbulator.position.x -width/2 + width * cursor_point_2d[1], y = global.interburbulator.position.y -width/2 + width * cursor_point_2d[2]}, + draw_on_ground = true, + }) + end + if best_box then + table.insert(global.interburbulator.shape_ids, rendering.draw_rectangle{ + surface = surface, + color = {r=0.4,b=0,g=0.4,a=0.4}, + filled = true, + left_top = { x = global.interburbulator.position.x -width/2 + best_box[1][1] * width, y = global.interburbulator.position.y -width/2 + best_box[1][2] * width }, + right_bottom = { x = global.interburbulator.position.x -width/2 + best_box[2][1] * width, y = global.interburbulator.position.y -width/2 + best_box[2][2] * width }, + draw_on_ground = true, + }) + table.insert(global.interburbulator.shape_ids, rendering.draw_rectangle{ + surface = surface, + color = {r=1,b=0,g=1,a=0.4}, + filled = false, + left_top = { x = global.interburbulator.position.x -width/2 + best_box[1][1] * width, y = global.interburbulator.position.y -width/2 + best_box[1][2] * width }, + right_bottom = { x = global.interburbulator.position.x -width/2 + best_box[2][1] * width, y = global.interburbulator.position.y -width/2 + best_box[2][2] * width }, + draw_on_ground = true, + }) + end + if player and global.interburbulator.challenge_index then + if best_cell and target_cell and best_cell[1] == target_cell[1] and best_cell[2] == target_cell[2] then + global.interburbulator.prizes_won = global.interburbulator.prizes_won or {} + if not global.interburbulator.prizes_won[global.interburbulator.challenge_index] then + global.interburbulator.prizes_won[global.interburbulator.challenge_index] = player.index + local prize = Interburbulator.challenges[global.interburbulator.challenge_index].prize + local inserted = 0 + if player.character and player.character.surface == surface then + inserted = player.insert(prize) + end + local remain = (prize.count or 1) - inserted + if remain > 0 then + surface.spill_item_stack( + Util.vectors_add({x=0,y=2.25}, global.interburbulator.interface.position), + {name = prize.name, count = remain}, + true, + player.force, + false) + end + Interburbulator.message(player, { + "space-exploration.simple-a-b-space", + Interburbulator.challenges[global.interburbulator.challenge_index].success_text_prize or Interburbulator.success_text_prize, + {"space-exploration.simple-a-b-space", (prize.count or 1) .." [img=item/"..prize.name.."] ", {"item-name."..prize.name}} + }) + else + Interburbulator.message(player, {"space-exploration."..Interburbulator.success_repeat[math.random(#Interburbulator.success_repeat)]}) + end + if table_size(global.interburbulator.prizes_won) >= 5 and not global.interburbulator.freeplay_unlocked then + global.interburbulator.freeplay_unlocked = true + Interburbulator.message(player, {"space-exploration.interburbulator_freeplay_unlocked"}) + end + else + Interburbulator.increase_attempts(global.interburbulator.challenge_index) + if best_box then + Interburbulator.message(player, {"space-exploration."..Interburbulator.fail_text[math.random(#Interburbulator.fail_text)]}) + else + Interburbulator.message(player, {"space-exploration."..Interburbulator.fail_bad_text[math.random(#Interburbulator.fail_bad_text)]}) + end + + if player and challenge_index then + attempts = Interburbulator.get_attempts(challenge_index).attempts + if attempts >= Interburbulator.challenges[challenge_index].attempts then + Interburbulator.message(player, {"space-exploration."..Interburbulator.locked_text[math.random(#Interburbulator.locked_text)]}) + end + end + + end + end + end +end + +function Interburbulator.draw_grid(surface, cells_w) + local pos = global.interburbulator.position + local width = Interburbulator.display_width_tiles * cells_w/(cells_w+2) + for i = 1, cells_w+1 do + local p = (i-1)/(cells_w) + table.insert(global.interburbulator.shape_ids, rendering.draw_line{ + surface = surface, + from = {x = pos.x - width/2, y = pos.y - width/2 + p * width}, + to = {x = pos.x + width/2, y = pos.y - width/2 + p * width}, + color = {r=0.5,b=0,g=0,a=0.5}, + width = 1, + draw_on_ground = true + }) + table.insert(global.interburbulator.shape_ids, rendering.draw_line{ + surface = surface, + from = {x = pos.x - width/2 + p * width, y = pos.y - width/2}, + to = {x = pos.x - width/2 + p * width, y = pos.y + width/2}, + color = {r=0.5,b=0,g=0,a=0.5}, + width = 1, + draw_on_ground = true + }) + end +end + +function Interburbulator.gui_close(player) + local gui = player.gui.screen + local root = gui[Interburbulator.name_interburbulator_gui_root] + if root then root.destroy() end +end + +function Interburbulator.gui_update(player) + local root = player.gui.screen[Interburbulator.name_interburbulator_gui_root] + if not root then return end + + local vs_abc = global.interburbulator.challenge_set + local cells_w = global.interburbulator.challenge_grid_size + local target_cell = global.interburbulator.challenge_cell + if global.interburbulator.challenge_index then + vs_abc = Interburbulator.challenges[global.interburbulator.challenge_index].set + cells_w = Interburbulator.challenges[global.interburbulator.challenge_index].grid + target_cell = Interburbulator.challenges[global.interburbulator.challenge_index].target + end + if target_cell then + target_cell = target_cell[1]..","..target_cell[2] + end + + local challenge = util.find_first_descendant_by_name(root, "challenges") + local active_name + --if global.interburbulator.challenge_set then active_name = "challenge_random" end -- need to be able to click multiple times + if global.interburbulator.challenge_index then active_name = "challenge_"..global.interburbulator.challenge_index end + for _, button in pairs(challenge.children) do + button.enabled = true + if button.name == active_name then + button.enabled = false + end + end + + if cells_w then util.find_first_descendant_by_name(root, "grid_textbox").text = ""..cells_w end + if target_cell then util.find_first_descendant_by_name(root, "target_textbox").text = ""..target_cell end + local prize_lab = util.find_first_descendant_by_name(root, "prize_lab") + if prize_lab then + if global.interburbulator.challenge_index then + local prize = Interburbulator.challenges[global.interburbulator.challenge_index].prize + local claimed = global.interburbulator.prizes_won and global.interburbulator.prizes_won[global.interburbulator.challenge_index] + local caption = { + "space-exploration.interburbulator_caption_prize", + (prize.count or 1), + "[img=item/"..prize.name.."]", + {"item-name."..prize.name}, + claimed and {"space-exploration.interburbulator_caption_claimed"} or "" + } + prize_lab.caption = caption + else + prize_lab.caption = "" + end + end + + if vs_abc then + local top_left = util.find_first_descendant_by_name(root, "top_left") + top_left.x.textbox.text = ""..vs_abc[1][1] + top_left.y.textbox.text = ""..vs_abc[1][2] + top_left.z.textbox.text = ""..vs_abc[1][3] + + local top_right = util.find_first_descendant_by_name(root, "top_right") + top_right.x.textbox.text = ""..vs_abc[2][1] + top_right.y.textbox.text = ""..vs_abc[2][2] + top_right.z.textbox.text = ""..vs_abc[2][3] + + local bottom_left = util.find_first_descendant_by_name(root, "bottom_left") + bottom_left.x.textbox.text = ""..vs_abc[3][1] + bottom_left.y.textbox.text = ""..vs_abc[3][2] + bottom_left.z.textbox.text = ""..vs_abc[3][3] + end + + if global.interburbulator.challenge_index then + local attempts = Interburbulator.get_attempts(global.interburbulator.challenge_index).attempts + local attempts_max = Interburbulator.challenges[global.interburbulator.challenge_index].attempts + if attempts < attempts_max then + util.find_first_descendant_by_name(root, "attempt").caption = {"space-exploration.interburbulator_attempt_limited", attempts, attempts_max } + else + util.find_first_descendant_by_name(root, "attempt").caption = {"space-exploration.interburbulator_attempt_locked"} + end + else + util.find_first_descendant_by_name(root, "attempt").caption = {"space-exploration.interburbulator_attempt"} + end + + if global.interburbulator.guessed_vector then + local attempt = util.find_first_descendant_by_name(root, "attempt") + if attempt.x.textbox.text == "" then attempt.x.textbox.text = ""..global.interburbulator.guessed_vector[1] end + if attempt.y.textbox.text == "" then attempt.y.textbox.text = ""..global.interburbulator.guessed_vector[2] end + if attempt.z.textbox.text == "" then attempt.z.textbox.text = ""..global.interburbulator.guessed_vector[3] end + end + + local challenge_random = util.find_first_descendant_by_name(root, "challenge_random") + if challenge_random then + challenge_random.caption = {global.interburbulator.freeplay_unlocked and "space-exploration.interburbulator_freeplay" or "space-exploration.interburbulator_random"} + end + +end + +function Interburbulator.enable_textfields(element, enabled) + if element.type == "textfield" then + element.enabled = enabled + else + for _, child in pairs(element.children) do + if child.name ~= "attempt" then + Interburbulator.enable_textfields(child, enabled) + end + end + end +end + +function Interburbulator.gui_open(player) + Interburbulator.gui_close(player) + local gui = player.gui.screen + + local container = gui.add{ type = "frame", name = Interburbulator.name_interburbulator_gui_root, direction="vertical"} + player.opened = container + + local title_flow = container.add{ type="flow", name="unit_number", direction="horizontal"} + local title = title_flow.add{ type="label", name="title", caption={"space-exploration.interburbulator_game_title"}, style="heading_1_label"} + title.ignored_by_interaction = true + if gui_name == "screen" then title_flow.drag_target = container end + + -- Trying to make the fancy "Drag me" vertical bars... + local drag_handle = title_flow.add{type = "empty-widget", style = "draggable_space_header", direction="horizontal"} + drag_handle.drag_target = container + drag_handle.style.minimal_width = 20 + drag_handle.style.horizontally_stretchable = true + drag_handle.style.vertically_stretchable = true + + local close = title_flow.add{type="sprite-button", name=mod_prefix .. "-interburbulator-close", sprite = "utility/close_white", style="informatron_close_button"} + close.style.width = 28 + close.style.height = 28 + close.style.top_margin = 0 + + local intro = container.add{type="label", name="intro", caption={"space-exploration.interburbulator_introduction"}} + intro.style.single_line = false + intro.style.width = 500 + intro.style.top_margin = 10 + intro.style.bottom_margin = 10 + + local challenges = container.add{type="flow", name="challenges", direction="horizontal"} + challenges.style.bottom_margin = 10 + for i = 1, 10 do + local button = challenges.add{type = "button", name = "challenge_"..i, caption = i} + button.style.minimal_width = 32 + end + local button = challenges.add{type = "button", name = "challenge_random", caption = { + global.interburbulator.freeplay_unlocked and "space-exploration.interburbulator_freeplay" or "space-exploration.interburbulator_random" + }} + + local grid = container.add{type="flow", name="grid_target", direction="horizontal"} + grid.style.vertical_align = "center" + local grid_lab = grid.add{type="label", name="grid_lab", caption={"space-exploration.interburbulator_grid_size"}} + local grid_textbox = grid.add{type="textfield", name="grid_textbox", numeric = true, allow_decimal = false, allow_negative = false} + grid_textbox.style.width = 100 + local target_lab = grid.add{type="label", name="target_lab", caption={"space-exploration.interburbulator_target_cell"}} + target_lab.style.left_margin = 10 + local target_textbox = grid.add{type="textfield", name="target_textbox"} + target_textbox.style.width = 100 + + local settings_flow1 = container.add{type = "flow", name="settings_flow1", direction = "horizontal"} settings_flow1.style.top_margin = 10 + local settings_flow2 = container.add{type = "flow", name="settings_flow2", direction = "horizontal"} + + local top_left = settings_flow1.add{type = "frame", name="top_left", direction="vertical", caption = {"space-exploration.interburbulator_top_left"}} top_left.style.width = 250 + local top_right = settings_flow1.add{type = "frame", name="top_right", direction="vertical", caption = {"space-exploration.interburbulator_top_right"}} top_right.style.width = 250 + local bottom_left = settings_flow2.add{type = "frame", name="bottom_left", direction="vertical", caption = {"space-exploration.interburbulator_bottom_left"}} bottom_left.style.width = 250 + local attempt = settings_flow2.add{type = "frame", name="attempt", direction="vertical", caption = {"space-exploration.interburbulator_attempt"}} attempt.style.width = 250 + + for _, frame in pairs({top_left, top_right, bottom_left, attempt}) do + local x = frame.add{type="flow", name="x", direction="horizontal"} x.add{type="label", name="lab", caption="X: "} x.add{type="textfield", name="textbox", numeric = true, allow_decimal = true, allow_negative = true} + local y = frame.add{type="flow", name="y", direction="horizontal"} y.add{type="label", name="lab", caption="Y: "} y.add{type="textfield", name="textbox", numeric = true, allow_decimal = true, allow_negative = true} + local z = frame.add{type="flow", name="z", direction="horizontal"} z.add{type="label", name="lab", caption="Z: "} z.add{type="textfield", name="textbox", numeric = true, allow_decimal = true, allow_negative = true} + end + + local bottom_table = container.add{ type="table", name="bottom_table", column_count=2, draw_horizontal_lines=false} + bottom_table.style.horizontally_stretchable = true + bottom_table.style.vertical_align = "bottom" + bottom_table.style.column_alignments[1] = "left" -- title, search, zone list table + bottom_table.style.column_alignments[2] = "right" -- starmap, close, selected zone info + + local prize_lab = bottom_table.add{type="label", name="prize_lab"} + prize_lab.style.horizontally_stretchable = true + + local submit = bottom_table.add{type="button", name=mod_prefix .. "-interburbulator-submit", style="confirm_button", caption={"space-exploration.interburbulator_submit"}} + submit.style.top_margin = 10 + + --Interburbulator.enable_textfields(container, false) + Interburbulator.gui_update(player) + + --container.force_auto_center() +end + +function Interburbulator.submit(player, skip_warnings) + local root = player.gui.screen[Interburbulator.name_interburbulator_gui_root] + if not root then return end + + if global.interburbulator.freeplay_unlocked and not global.interburbulator.challenge_index then + Interburbulator.challenge_from_gui(player) + end + + local attempt = util.find_first_descendant_by_name(root, "attempt") + local attempt_x = tonumber(attempt.x.textbox.text) + local attempt_y = tonumber(attempt.y.textbox.text) + local attempt_z = tonumber(attempt.z.textbox.text) + if attempt_x and attempt_y and attempt_z and not(attempt_x==0 and attempt_y==0 and attempt_z==0) then + global.interburbulator.guessed_vector = {attempt_x,attempt_y,attempt_z} -- shown after a guess + else + if not skip_warnings then + Interburbulator.message(player, "Invalid attempt vector") + end + end + global.interburbulator.guessed_player_index = player.index + + Interburbulator.update(player) + Interburbulator.gui_update(player) +end + +function Interburbulator.activate_challenge(challenge_index, player) + global.interburbulator.guessed_vector = nil + global.interburbulator.guessed_position = nil + global.interburbulator.guessed_cell = nil + global.interburbulator.guessed_player_index = nil + if Interburbulator.challenges[challenge_index] then + global.interburbulator.challenge_index = challenge_index + global.interburbulator.challenge_set = nil + global.interburbulator.challenge_grid_size = nil + global.interburbulator.challenge_cell = nil + else -- assume random + global.interburbulator.challenge_index = nil + global.interburbulator.challenge_grid_size = math.random(5,50) + global.interburbulator.challenge_cell = {math.random(2,global.interburbulator.challenge_grid_size-1), math.random(2,global.interburbulator.challenge_grid_size-1)} + + local multiplier = 1 + if math.random() < 0.23 then + multiplier = math.random() * 1000 + end + global.interburbulator.challenge_set = { + {(-1+math.random()*2) *multiplier,(-1+math.random()*2) *multiplier,(-1+math.random()*2) *multiplier}, + {(-1+math.random()*2) *multiplier,(-1+math.random()*2) *multiplier,(-1+math.random()*2) *multiplier}, + {(-1+math.random()*2) *multiplier,(-1+math.random()*2) *multiplier,(-1+math.random()*2) *multiplier}, + } + end + Interburbulator.update(player) + Interburbulator.gui_update(player) +end + +function Interburbulator.challenge_from_gui(player) + local root = player.gui.screen[Interburbulator.name_interburbulator_gui_root] + if not root then return end + + local grid_textbox = util.find_first_descendant_by_name(root, "grid_textbox") + local target_textbox = util.find_first_descendant_by_name(root, "target_textbox") + local top_left = util.find_first_descendant_by_name(root, "top_left") + local top_right = util.find_first_descendant_by_name(root, "top_right") + local bottom_left = util.find_first_descendant_by_name(root, "bottom_left") + + local function number_or_random(inp) + return tonumber(inp) or math.random() + end + global.interburbulator.challenge_set = { + {number_or_random(top_left.x.textbox.text),number_or_random(top_left.y.textbox.text),number_or_random(top_left.z.textbox.text)}, + {number_or_random(top_right.x.textbox.text),number_or_random(top_right.y.textbox.text),number_or_random(top_right.z.textbox.text)}, + {number_or_random(bottom_left.x.textbox.text),number_or_random(bottom_left.y.textbox.text),number_or_random(bottom_left.z.textbox.text)}, + } + + local cells_w = tonumber(grid_textbox.text) or 5 + cells_w = math.min(50, math.max(5, cells_w)) + global.interburbulator.challenge_grid_size = cells_w + local target_cell = target_textbox.text + local parts = Util.split(target_cell, ",") + local x = 2 + local y = 2 + if #parts == 2 then + x = math.min(cells_w, math.max(1, Util.string_to_number(parts[1]) or 2)) + y = math.min(cells_w, math.max(1, Util.string_to_number(parts[2]) or 2)) + end + global.interburbulator.challenge_cell = {x, y} +end + +function Interburbulator.on_gui_click(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + root = gui_element_or_parent(element, Interburbulator.name_interburbulator_gui_root) + if element.parent and element.parent.name == "challenges" then + if element.name == "challenge_random" then + Interburbulator.activate_challenge("random", player) + else + local challenge_index = Util.string_to_number(Util.replace(element.name, "challenge_", "")) + Interburbulator.activate_challenge(challenge_index, player) + end + elseif element.name == mod_prefix .. "-interburbulator-close" then + Interburbulator.gui_close(player) + elseif element.name == mod_prefix .. "-interburbulator-submit" then + Interburbulator.submit(player) + end +end +Event.addListener(defines.events.on_gui_click, Interburbulator.on_gui_click) + +function Interburbulator.on_gui_opened(event) + local player = game.players[event.player_index] + if event.entity and event.entity.valid and event.entity.name == mod_prefix.."interburbulator-control" then + player.opened = nil + if player.character and player.character.surface == event.entity.surface and Util.vectors_delta_length(player.character.position, event.entity.position) < 5 then + Interburbulator.gui_open(player) + Interburbulator.update() --Interburbulator.update(player) + else + event.entity.surface.create_entity{ + name = "flying-text", + position = event.entity.position, + text = {"space-exploration.out_of_reach"}, + render_player_index = player.index, + } + end + end +end +Event.addListener(defines.events.on_gui_opened, Interburbulator.on_gui_opened) + +function Interburbulator.on_gui_text_changed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + root = gui_element_or_parent(element, Interburbulator.name_interburbulator_gui_root) + if not (root and global.interburbulator) then return end + if element.parent and element.parent.parent and element.parent.parent.name == "attempt" then + -- always allowed + else + if not global.interburbulator.freeplay_unlocked then + Interburbulator.message(player, {"space-exploration.interburbulator_deny_freeplay_"..(game.tick%6+1)}) + Interburbulator.gui_update(player) + end + end +end +Event.addListener(defines.events.on_gui_text_changed, Interburbulator.on_gui_text_changed) + +function Interburbulator.on_gui_confirmed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + root = gui_element_or_parent(element, Interburbulator.name_interburbulator_gui_root) + if not (root and global.interburbulator) then return end + Interburbulator.submit(player, true) +end +Event.addListener(defines.events.on_gui_confirmed, Interburbulator.on_gui_confirmed) + +return Interburbulator diff --git a/space-exploration_0.5.58/space-exploration/scripts/landingpad-gui.lua b/space-exploration_0.5.58/space-exploration/scripts/landingpad-gui.lua new file mode 100644 index 0000000..e96c20a --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/landingpad-gui.lua @@ -0,0 +1,223 @@ +local LandingpadGUI = {} + +LandingpadGUI.name_rocket_landing_pad_gui_root = mod_prefix .. "rocket-landing-pad-gui" + +--- Create the landing pad gui for a player +---@param player LuaPlayer +---@param landing_pad Landingpad landing pad data +function LandingpadGUI.gui_open(player, landing_pad) + LandingpadGUI.gui_close(player) + if not landing_pad then Log.trace('LandingpadGUI.gui_open landing_pad not found') return end + + local gui = player.gui.relative + local anchor = {gui=defines.relative_gui_type.container_gui, position=defines.relative_gui_position.left} + local container = gui.add { + type = "frame", + name = LandingpadGUI.name_rocket_landing_pad_gui_root, + style = "space_platform_container", + direction = "vertical", + anchor = anchor, + -- use gui element tags to store a reference to what landing pad this gui is displaying/controls + tags = { + unit_number = landing_pad.unit_number + } + } + + local title_flow = container.add{type = "flow", "landingpad-title-flow", direction = "horizontal"} + title_flow.add{type = "label", name = "landingpad-title-label", style = "frame_title", caption = {"space-exploration.relative-window-settings"}, ignored_by_interaction = true} + local title_empty = title_flow.add { + type = "empty-widget", + style = "draggable_space", + ignored_by_interaction = true + } + title_empty.style.horizontally_stretchable = "on" + title_empty.style.left_margin = 4 + title_empty.style.right_margin = 0 + title_empty.style.height = 24 + + local name_flow = container.add { + type = "flow", + name = "name-flow", + direction = "vertical" + } + LandingpadGUI.make_change_name_button_flow(landing_pad, name_flow) + + container.add {type = "label", name = "cargo_capacity", caption = "Cargo: "} + local bar = container.add { + type = "progressbar", + name = "cargo_capacity_progress", + size = 300, + value = 0, + style = "space_platform_progressbar_cargo" + } + bar.style.horizontally_stretchable = true + + container.add {type = "label", name = "status", caption = "Status: "} + + LandingpadGUI.gui_update(player) +end + +function LandingpadGUI.gui_update(player) + local root = player.gui.relative[LandingpadGUI.name_rocket_landing_pad_gui_root] + if root then + local struct = Landingpad.from_unit_number( + root and root.tags and root.tags.unit_number) + if struct then + if not (struct.container and struct.container.valid) then + Landingpad.destroy(struct) + else + local inv = struct.container.get_inventory(defines.inventory.chest) + local inv_used = count_inventory_slots_used(inv) + + root["cargo_capacity"].caption = + "Cargo: " .. math.min(inv_used, #inv) .. " / " .. #inv + root["cargo_capacity_progress"].value = math.min(inv_used, #inv) / #inv + local message = "" + if inv_used > 0 then + message = "Unloading required before next payload" + else + message = "Ready for next payload" + end + if struct.inbound_rocket then message = "Rocket Inbound" end + root["status"].caption = "Status: " .. message + end + end + end +end + +function LandingpadGUI.make_change_name_button_flow(struct, name_flow) + name_flow.clear() + local name_horizontal_flow = name_flow.add{type="flow",direction="horizontal"} + local name_label = name_horizontal_flow.add { + type = "label", + name = "show-name", + caption = struct.name, + style = "space_platform_title_short" + } + local rename_button = name_horizontal_flow.add { + type = "sprite-button", + name = "rename", + sprite = "utility/rename_icon_normal", + tooltip = { + "space-exploration.rename-something", {"entity-name." .. Landingpad.name_rocket_landing_pad} + }, + style = "space_platform_sprite_button_small" + } + local list, selected_index, values = Landingpad.dropdown_list_force_landing_pad_names(struct.force_name, struct.name) + -- there is a default value at the start of the list, we don't want it here since landing pads always have a valid name + table.remove(list, 1) + table.remove(values, 1) + local landingpads_dropdown = name_flow.add{ type="drop-down", name="change_name_dropdown", items=values, selected_index=selected_index-1} +end + +function LandingpadGUI.make_change_name_confirm_flow(struct, name_flow) + name_flow.clear() + local name_horizontal_flow = name_flow.add{type="flow",direction="horizontal"} + local name_label = name_horizontal_flow.add { + type = "textfield", + name = "write-name", + text = struct.name, + style = "space_platform_textfield_short" + } + name_label.select_all() + name_label.focus() + local rename_button = name_horizontal_flow.add { + type = "sprite-button", + name = "rename-confirm", + sprite = "utility/enter", + tooltip = { + "space-exploration.rename-something", {"entity-name." .. Landingpad.name_rocket_landing_pad} + }, + style = "space_platform_sprite_button_small" + } +end + +function LandingpadGUI.gui_selection_state_changed(event) + if not (event.element and event.element.valid and event.element.name == "change_name_dropdown") then return end + local element = event.element + local root = gui_element_or_parent(element, + LandingpadGUI.name_rocket_landing_pad_gui_root) + if not root then return end + local struct = Landingpad.from_unit_number(root and root.tags and root.tags.unit_number) + if not struct then return end + + local name_text = struct.name + local new_name_text = element.get_item(element.selected_index) + if new_name_text ~= "" and new_name_text ~= name_text then + --do change name stuff + Landingpad.rename(struct, new_name_text) + end + + -- gui rebuild + local player = game.players[event.player_index] + LandingpadGUI.make_change_name_button_flow(struct, element.parent) +end +Event.addListener(defines.events.on_gui_selection_state_changed, LandingpadGUI.gui_selection_state_changed) + +function LandingpadGUI.on_gui_click(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, + LandingpadGUI.name_rocket_landing_pad_gui_root) + if not root then return end + local struct = Landingpad.from_unit_number(root and root.tags and root.tags.unit_number) + if not struct then return end + + if element.name == "rename" then + local name_flow = element.parent.parent + LandingpadGUI.make_change_name_confirm_flow(struct, name_flow) + elseif element.name == "rename-confirm" then -- don't confirm by clicking the textbox + local name_flow = element.parent.parent + local new_name = string.trim(element.parent["write-name"].text) + if new_name ~= "" and new_name ~= struct.name then + -- do change name stuff + Landingpad.rename(struct, new_name) + end + LandingpadGUI.make_change_name_button_flow(struct, name_flow) + end +end +Event.addListener(defines.events.on_gui_click, LandingpadGUI.on_gui_click) +Event.addListener(defines.events.on_gui_confirmed, LandingpadGUI.on_gui_click) + +function LandingpadGUI.on_tick(struct) + if game.tick % 60 == 0 then + for _, player in pairs(game.connected_players) do + LandingpadGUI.gui_update(player) + end + end +end +Event.addListener(defines.events.on_tick, LandingpadGUI.on_tick) + +--- Close the landing pad gui for a player +---@param player any +function LandingpadGUI.gui_close(player) + if player.gui.relative[LandingpadGUI.name_rocket_landing_pad_gui_root] then + player.gui.relative[LandingpadGUI.name_rocket_landing_pad_gui_root].destroy() + end +end + +--- Respond to the main entity GUI being closed by destroying the relative GUI +---@param event any +function LandingpadGUI.on_gui_closed(event) + local player = game.players[event.player_index] + if player and event.entity and event.entity.name == Landingpad.name_rocket_landing_pad then + LandingpadGUI.gui_close(player) + end +end +Event.addListener(defines.events.on_gui_closed, LandingpadGUI.on_gui_closed) + +--- Opens the landing pad gui when a landing pad is clicked +--- Closes the landing pad gui when another gui is opened +---@param event any +function LandingpadGUI.on_gui_opened(event) + local player = game.players[event.player_index] + if event.entity and event.entity.valid and event.entity.name == Landingpad.name_rocket_landing_pad then + LandingpadGUI.gui_open(player, Landingpad.from_entity(event.entity)) + else + LandingpadGUI.gui_close(player) + end +end +Event.addListener(defines.events.on_gui_opened, LandingpadGUI.on_gui_opened) + +return LandingpadGUI diff --git a/space-exploration_0.5.58/space-exploration/scripts/landingpad.lua b/space-exploration_0.5.58/space-exploration/scripts/landingpad.lua new file mode 100644 index 0000000..227e84f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/landingpad.lua @@ -0,0 +1,367 @@ +local Landingpad = {} + +-- constants +Landingpad.name_rocket_landing_pad = mod_prefix.."rocket-landing-pad" +Landingpad.name_rocket_landing_pad_settings = mod_prefix.."rocket-landing-pad-settings" + +---@class LandingPad All data necessary to maintain the state of a delivery cannon + +--- Gets the Landingpad for this unit_number +---@param unit_number number +function Landingpad.from_unit_number (unit_number) + if not unit_number then Log.trace("Landingpad.from_unit_number: invalid unit_number: nil") return end + unit_number = tonumber(unit_number) + -- NOTE: only supports container as the entity + if global.rocket_landing_pads[unit_number] then + return global.rocket_landing_pads[unit_number] + else + Log.trace("Landingpad.from_unit_number: invalid unit_number: " .. unit_number) + end +end + +--- Gets the Landingpad for this entity +---@param entity LuaEntity +function Landingpad.from_entity (entity) + if not(entity and entity.valid) then + Log.trace("Landingpad.from_entity: invalid entity") + return + end + -- NOTE: only suppors container as the entity + return Landingpad.from_unit_number(entity.unit_number) +end + +-- returns the available struct +function Landingpad.get_force_landing_pads_availability(force_name, landing_pad_name) + + local empty_landing_pads = {} + local filled_landing_pads = {} + local blocked_landing_pads = {} + + if global.forces[force_name] and global.forces[force_name].rocket_landing_pad_names and global.forces[force_name].rocket_landing_pad_names[landing_pad_name] then + local landing_pads = global.forces[force_name].rocket_landing_pad_names[landing_pad_name] + + for _, landing_pad in pairs(landing_pads) do + if landing_pad.container and landing_pad.container.valid then + if landing_pad.inbound_rocket then + table.insert(blocked_landing_pads, landing_pad) + elseif landing_pad.container.get_inventory(defines.inventory.chest).is_empty() then + table.insert(empty_landing_pads, landing_pad) + else + table.insert(filled_landing_pads, landing_pad) + end + else + Landingpad.destroy(landing_pad) + end + end + + end + + return { + empty_landing_pads = empty_landing_pads, + filled_landing_pads = filled_landing_pads, + blocked_landing_pads = blocked_landing_pads, + } + +end + +-- returns the available struct +function Landingpad.get_zone_landing_pads_availability(force_name, zone, landing_pad_name) + + local empty_landing_pads = {} + local filled_landing_pads = {} + local blocked_landing_pads = {} + + local zone_assets = Zone.get_force_assets(force_name, zone.index) + if zone_assets.rocket_landing_pad_names and zone_assets.rocket_landing_pad_names[landing_pad_name] then + local landing_pads = zone_assets.rocket_landing_pad_names[landing_pad_name] + + + for _, landing_pad in pairs(landing_pads) do + if landing_pad.container and landing_pad.container.valid then + if landing_pad.inbound_rocket then + table.insert(blocked_landing_pads, landing_pad) + elseif landing_pad.container.get_inventory(defines.inventory.chest).is_empty() then + table.insert(empty_landing_pads, landing_pad) + else + table.insert(filled_landing_pads, landing_pad) + end + else + Landingpad.destroy(landing_pad) + end + end + + end + + return { + empty_landing_pads = empty_landing_pads, + filled_landing_pads = filled_landing_pads, + blocked_landing_pads = blocked_landing_pads, + } + +end + +function Landingpad.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.name == Landingpad.name_rocket_landing_pad then + local zone = Zone.from_surface(entity.surface) + if not zone then + return cancel_entity_creation(entity, event.player_index, "Invalid landing pad location") + end + local fn = entity.force.name + + local default_name = zone.name .. " Landing Pad" + + local struct = { + type = Landingpad.name_rocket_landing_pad, + valid = true, + force_name = fn, + unit_number = entity.unit_number, + container = entity, + name = default_name, + zone = zone + } + global.rocket_landing_pads = global.rocket_landing_pads or {} + global.rocket_landing_pads[entity.unit_number] = struct + + -- set settings + if event.tags and event.tags.name then + struct.name = event.tags.name + end + + Landingpad.name(struct) -- assigns to zone_assets + + if event.player_index and game.players[event.player_index] and game.players[event.player_index].connected then + LandingpadGUI.gui_open(game.players[event.player_index], struct) + end + end +end +Event.addListener(defines.events.on_entity_cloned, Landingpad.on_entity_created) +Event.addListener(defines.events.on_built_entity, Landingpad.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, Landingpad.on_entity_created) +Event.addListener(defines.events.script_raised_built, Landingpad.on_entity_created) +Event.addListener(defines.events.script_raised_revive, Landingpad.on_entity_created) + +function Landingpad.remove_struct_from_tables(struct) + + -- force + local force_data = global.forces[struct.force_name] + force_data.rocket_landing_pad_names = force_data.rocket_landing_pad_names or {} + local force_type_table = force_data.rocket_landing_pad_names + + if not force_type_table[struct.name] then return end + force_type_table[struct.name][struct.unit_number] = nil + local count_remaining = 0 + for _, remaining in pairs(force_type_table[struct.name]) do + count_remaining = count_remaining + 1 + end + if count_remaining == 0 then + force_type_table[struct.name] = nil + end + + -- zone + local zone_assets = Zone.get_force_assets(struct.force_name, struct.zone.index) + zone_assets.rocket_landing_pad_names = zone_assets.rocket_landing_pad_names or {} + local zone_type_table = zone_assets.rocket_landing_pad_names + + if not zone_type_table[struct.name] then return end + zone_type_table[struct.name][struct.unit_number] = nil + local count_remaining = 0 + for _, remaining in pairs(zone_type_table[struct.name]) do + count_remaining = count_remaining + 1 + end + if count_remaining == 0 then + zone_type_table[struct.name] = nil + end + +end + +function Landingpad.destroy_sub(struct, key) + if struct[key] and struct[key].valid then + struct[key].destroy() + struct[key] = nil + end +end + +function Landingpad.destroy(struct) + if not struct then + Log.trace("Landingpad.destroy: no struct") + return + end + struct.valid = false + Landingpad.destroy_sub(struct, 'container') + + Landingpad.remove_struct_from_tables(struct) + global.rocket_landing_pads[struct.unit_number] = nil + + -- if a player has this gui open then close it + local gui_name = LandingpadGUI.name_rocket_landing_pad_gui_root + for _, player in pairs(game.connected_players) do + local root = player.gui.relative[gui_name] + if root and root.tags and root.tags.unit_number == struct.unit_number then + player.gui.relative[gui_name].destroy() + end + end +end + +function Landingpad.name(struct, new_name) + struct.name = (new_name or struct.name) + + -- force + local force_data = global.forces[struct.force_name] + force_data.rocket_landing_pad_names = force_data.rocket_landing_pad_names or {} + local force_type_table = force_data.rocket_landing_pad_names + + force_type_table[struct.name] = force_type_table[struct.name] or {} + force_type_table[struct.name][struct.unit_number] = struct + + local zone_assets = Zone.get_force_assets(struct.force_name, struct.zone.index) + zone_assets.rocket_landing_pad_names = zone_assets.rocket_landing_pad_names or {} + local zone_type_table = zone_assets.rocket_landing_pad_names + + zone_type_table[struct.name] = zone_type_table[struct.name] or {} + zone_type_table[struct.name][struct.unit_number] = struct +end + +function Landingpad.rename(struct, new_name) + local old_name = struct.name + Landingpad.remove_struct_from_tables(struct) + Landingpad.name(struct, new_name) +end + +function Landingpad.dropdown_list_zone_landing_pad_names(force_name, zone, current) + local selected_index + local list = {} -- names with optional [count] + local values = {} -- raw names + table.insert(list, "None - General vicinity") + table.insert(values, "") -- not sure if nil would work + + if zone and zone.type ~= "spaceship" then + local zone_assets = Zone.get_force_assets(force_name, zone.index) + for name, sites in pairs(zone_assets["rocket_landing_pad_names"]) do + local count = 0 + for _, struct in pairs(sites) do + count = count + 1 + end + if count == 1 then + table.insert(list, name) + table.insert(values, name) + if name == current then selected_index = #list end + elseif count > 1 then + table.insert(list, name .. " ["..count.."]") + table.insert(values, name) + if name == current then selected_index = #list end + end + end + end + return list, (selected_index or 1), values +end + +function Landingpad.dropdown_list_force_landing_pad_names(force_name, current) + local selected_index + local list = {} -- names with optional [count] + local values = {} -- raw names + table.insert(list, "None - Cannot launch") + table.insert(values, "") -- not sure if nil would work + + local force_data = global.forces[force_name] + if force_data.rocket_landing_pad_names then + for name, sites in pairs(force_data.rocket_landing_pad_names) do + local count = 0 + for _, struct in pairs(sites) do + count = count + 1 + end + if count == 1 then + table.insert(list, name) + table.insert(values, name) + if name == current then selected_index = #list end + elseif count > 1 then + table.insert(list, name .. " ["..count.."]") + table.insert(values, name) + if name == current then selected_index = #list end + end + end + end + return list, (selected_index or 1), values +end + +function Landingpad.on_entity_removed(event) + local entity = event.entity + if entity and entity.valid and entity.name == Landingpad.name_rocket_landing_pad then + Landingpad.destroy(Landingpad.from_entity(entity)) + end +end +Event.addListener(defines.events.on_entity_died, Landingpad.on_entity_removed) +Event.addListener(defines.events.on_robot_mined_entity, Landingpad.on_entity_removed) +Event.addListener(defines.events.on_player_mined_entity, Landingpad.on_entity_removed) +Event.addListener(defines.events.script_raised_destroy, Landingpad.on_entity_removed) + + +--- Handles the player creating a blueprint by setting tags to store the state of landing pads +---@param event any +function Landingpad.on_player_setup_blueprint(event) + local player_index = event.player_index + if player_index and game.players[player_index] and game.players[player_index].connected then + local player = game.players[player_index] + + -- this setup code and checks is a workaround for the fact that the event doesn't specify the blueprint on the event + -- and the player.blueprint_to_setup isn't actually set in the case of copy/paste or blueprint library or select new contents + local blueprint = nil + if player and player.blueprint_to_setup and player.blueprint_to_setup.valid_for_read then blueprint = player.blueprint_to_setup + elseif player and player.cursor_stack.valid_for_read and player.cursor_stack.is_blueprint then blueprint = player.cursor_stack end + if blueprint and blueprint.is_blueprint_setup() then + + + local mapping = event.mapping.get() + local blueprint_entities = blueprint.get_blueprint_entities() + if blueprint_entities then + for _, blueprint_entity in pairs(blueprint_entities) do + if blueprint_entity.name == Landingpad.name_rocket_landing_pad then + local entity = mapping[blueprint_entity.entity_number] + if entity then + local landing_pad = Landingpad.from_entity(entity) + if landing_pad then + local tags = {} + tags.name = landing_pad.name + blueprint.set_blueprint_entity_tags(blueprint_entity.entity_number, tags) + end + end + end + end + end + end + end +end +Event.addListener(defines.events.on_player_setup_blueprint, Landingpad.on_player_setup_blueprint) + +--- Handles the player copy/pasting settings between landing pads +---@param event any +function Landingpad.on_entity_settings_pasted(event) + local player_index = event.player_index + if player_index and game.players[player_index] and game.players[player_index].connected + and event.source and event.source.valid and event.destination and event.destination.valid then + if not (event.source.name == Landingpad.name_rocket_landing_pad) then return end + if not (event.destination.name == Landingpad.name_rocket_landing_pad) then return end + local player = game.players[player_index] + local landing_pad_from = Landingpad.from_entity(event.source) + local landing_pad_to = Landingpad.from_entity(event.destination) + if landing_pad_from and landing_pad_to then + -- actual settings copy + Landingpad.rename(landing_pad_to, landing_pad_from.name) + end + end +end +Event.addListener(defines.events.on_entity_settings_pasted, Landingpad.on_entity_settings_pasted) + +function Landingpad.on_init(event) + global.rocket_landing_pads = {} -- all landing pads sorted by struct[unit_unumber] +end +Event.addListener("on_init", Landingpad.on_init, true) + +return Landingpad diff --git a/space-exploration_0.5.58/space-exploration/scripts/launchpad-gui.lua b/space-exploration_0.5.58/space-exploration/scripts/launchpad-gui.lua new file mode 100644 index 0000000..a021050 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/launchpad-gui.lua @@ -0,0 +1,424 @@ +local LaunchpadGUI = {} + +LaunchpadGUI.name_rocket_launch_pad_gui_root = mod_prefix.."rocket-launch-pad-gui" +LaunchpadGUI.name_window_close = "launchpad_close_button" + +--- Create the launch pad gui for a player +---@param player any +---@param launch_pad Launchpad launch pad data +function LaunchpadGUI.gui_open(player, launch_pad) + LaunchpadGUI.gui_close(player) + if not launch_pad then Log.trace('LaunchpadGUI.gui_open launch_pad not found') return end + + local struct = launch_pad + local gui = player.gui.relative + local playerdata = get_make_playerdata(player) + + local anchor = {gui=defines.relative_gui_type.container_gui, position=defines.relative_gui_position.left} + local container = gui.add{ + type = "frame", + name = LaunchpadGUI.name_rocket_launch_pad_gui_root, + anchor = anchor, + style="space_platform_container", + direction="vertical", + -- use gui element tags to store a reference to what launch pad this gui is displaying/controls + tags = { + unit_number = struct.unit_number + } + } + + local title_table = container.add{type="table", name="launchpad-title-table", column_count=2, draw_horizontal_lines=false} + title_table.style.horizontally_stretchable = true + title_table.style.column_alignments[1] = "left" + title_table.style.column_alignments[2] = "right" + + local title_frame = title_table.add{type="frame", name="launchpad-title-frame", + caption = {"space-exploration.relative-window-settings"}, + style="informatron_title_frame"} + title_frame.style.right_padding = -5 + + local bar + container.add{ type="label", name="crew_capsules", caption="Space Capsule: "} + bar = container.add{ type="progressbar", name="crew_capsules_progress", size = 300, value=0, style="space_platform_progressbar_capsule"} + bar.style.horizontally_stretchable = true + + container.add{ type="label", name="rocket_sections", caption="Rocket Sections: "} + bar = container.add{ type="progressbar", name="rocket_sections_progress", size = 300, value=0, style="space_platform_progressbar_sections"} + bar.style.horizontally_stretchable = true + + container.add{ type="label", name="fuel_capacity", caption="Liquid Rocket Fuel: "} + bar = container.add{ type="progressbar", name="fuel_capacity_progress", size = 300, value=0, style="space_platform_progressbar_fuel"} + bar.style.horizontally_stretchable = true + + container.add{ type="label", name="cargo_capacity", caption="Cargo: "} + bar = container.add{ type="progressbar", name="cargo_capacity_progress", size = 300, value=0, style="space_platform_progressbar_cargo"} + bar.style.horizontally_stretchable = true + + container.add{ type="label", name="trigger-label", caption="Launch Trigger"} + + local list, selected_index = dropdown_from_preset(Launchpad.trigger_options, struct.launch_trigger) + local trigger_dropdown = container.add{ type="drop-down", name="trigger", items=list, selected_index = selected_index} + trigger_dropdown.style.horizontally_stretchable = true + + container.add{ type="label", name="destination-label", caption="Destination:"} + container.add{type="checkbox", name="list-zones-alphabetical", caption="List destinations alphabetically", state=playerdata.zones_alphabetical and true or false} + + local filter_container = container.add{ type="flow", name="filter_flow", direction="horizontal"} + local filter_field = filter_container.add{ type="textfield", name="filter_list"} + filter_field.style.width = 275 + local filter_button = filter_container.add{ type = "sprite-button", name="clear_filter", sprite="utility/search_icon", tooltip={"space-exploration.clear-filter"},} + filter_button.style.left_margin = 5 + filter_button.style.width = 28 + filter_button.style.height = 28 + + local destination_zone = struct.destination.zone + local list, selected_index, values = Zone.dropdown_list_zone_destinations(struct.force_name, destination_zone, playerdata.zones_alphabetical, nil, + {list = "Any landing pad with name", value = {type = "any"}} -- wildcard + ) + if selected_index == 1 then selected_index = 2 end + local zones_dropdown = container.add{ type="drop-down", name="launchpad-list-zones", items=list, selected_index=selected_index or 2} + zones_dropdown.style.horizontally_stretchable = true + player_set_dropdown_values(player, "launchpad-list-zones", values) + + container.add{ type="label", name="destination-location-label", caption="Destination Position:"} + local destination_pad_name = struct.destination.landing_pad_name + local list, selected_index, values, landingpads_dropdown + if destination_zone then + list, selected_index, values = Landingpad.dropdown_list_zone_landing_pad_names(struct.force_name, destination_zone, destination_pad_name) + landingpads_dropdown = container.add{ type="drop-down", name="launchpad-list-landing-pad-names", items=list, selected_index=selected_index} + player_set_dropdown_values(player, "launchpad-list-landing-pad-names", values) + else + list, selected_index, values = Landingpad.dropdown_list_force_landing_pad_names(struct.force_name, destination_pad_name) + landingpads_dropdown = container.add{ type="drop-down", name="launchpad-list-landing-pad-names", items=list, selected_index=selected_index} + player_set_dropdown_values(player, "launchpad-list-landing-pad-names", values) + end + landingpads_dropdown.style.horizontally_stretchable = true + + container.add{ type="label", name="cargo_loss", caption="Cargo safety:"} + container.add{ type="label", name="survivability_loss", caption="Landing chance:"} + + container.add{ type="label", name="status", caption="Status: "} + + LaunchpadGUI.gui_update(player) +end + +function LaunchpadGUI.gui_update(player) + local root = player.gui.relative[LaunchpadGUI.name_rocket_launch_pad_gui_root] + if root then + local struct = Launchpad.from_unit_number( + root and root.tags and root.tags.unit_number) + if struct then + Launchpad.prep(struct) + + local inv = struct.container.get_inventory(defines.inventory.chest) + local inv_used = count_inventory_slots_used(inv) + struct.crew_capsules = struct.crew_capsules or 0 + struct.rocket_sections = struct.rocket_sections or 0 + + if root["crew_capsules"] then + root["crew_capsules"].caption="Space Capsule: " .. struct.crew_capsules .. " / " .. Launchpad.crew_capsules_per_rocket + root["crew_capsules_progress"].value = struct.crew_capsules / Launchpad.crew_capsules_per_rocket + end + + root["rocket_sections"].caption="Cargo Rocket Sections: " .. struct.rocket_sections .. " / " .. Launchpad.rocket_sections_per_rocket + root["rocket_sections_progress"].value = struct.rocket_sections / Launchpad.rocket_sections_per_rocket + + if struct.required_fuel then + --root["fuel_capacity"].caption="Liquid Rocket Fuel: " .. math.floor(math.min(struct.total_fuel, struct.required_fuel)) .. " / " .. math.floor(struct.required_fuel) + root["fuel_capacity"].caption="Liquid Rocket Fuel: " .. Util.format_fuel(math.min(struct.total_fuel, struct.required_fuel)) .. " / " .. Util.format_fuel(struct.required_fuel) + root["fuel_capacity_progress"].value=math.min(struct.total_fuel, struct.required_fuel) / (struct.required_fuel) + else + root["fuel_capacity"].caption="Liquid Rocket Fuel: " .. math.floor(struct.total_fuel) .. " / ?" + root["fuel_capacity_progress"].value=0 + end + + root["cargo_capacity"].caption="Cargo: " .. math.min(inv_used, Launchpad.rocket_capacity) .. " / " .. Launchpad.rocket_capacity + root["cargo_capacity_progress"].value=math.min(inv_used, Launchpad.rocket_capacity) / Launchpad.rocket_capacity + + local message = "" + local ready = "disabled" + if not (global.forces[player.force.name] and global.forces[player.force.name].satellites_launched > 0) then + message = "No navigation data, launch a satellite from the Satellite rocket silo." + elseif struct.launch_status > -1 then + message = "Launching Rocket!" + elseif struct.rocket_sections < Launchpad.rocket_sections_per_rocket then + message = "Constructing Rocket" + elseif struct.crew_capsules < Launchpad.crew_capsules_per_rocket then + message = "Space Capsule Required" + elseif not struct.required_fuel then + message = "Invalid Destination" + elseif struct.total_fuel < struct.required_fuel then + message = "Loading Fuel" + elseif inv_used < Launchpad.rocket_capacity then + message = "Ready - Loading Cargo" + ready = "ready" + else + message = "Ready - Cargo Full" + ready = "ready" + end + if ready == "ready" and struct.destination.landing_pad_name then + if struct.destination.zone then + local landing_pads = Landingpad.get_zone_landing_pads_availability(struct.force_name, struct.destination.zone, struct.destination.landing_pad_name) + if #landing_pads.empty_landing_pads == 0 then + message = "Waiting for available empty landing pad." + ready = "delayed" + if #landing_pads.filled_landing_pads == 0 then + message = "Waiting for available landing pad." + ready = "disabled" + if #landing_pads.blocked_landing_pads == 0 then + message = "No landing pads found matching name." + end + end + end + else + local landing_pads = Landingpad.get_force_landing_pads_availability(struct.force_name, struct.destination.landing_pad_name) + if #landing_pads.empty_landing_pads == 0 then + message = "Waiting for available empty landing pad." + ready = "delayed" + if #landing_pads.filled_landing_pads == 0 then + message = "Waiting for available landing pad." + ready = "disabled" + if #landing_pads.blocked_landing_pads == 0 then + message = "No landing pads found matching name." + end + end + end + end + end + + local delta_v = Zone.get_travel_delta_v(struct.zone, struct.destination.zone) + if root.cargo_loss then + local cargo_loss = Launchpad.get_cargo_loss(game.forces[struct.force_name], delta_v) + if struct.destination and struct.destination.landing_pad_name then + cargo_loss = cargo_loss / 2 + end + if struct.destination.zone then + root.cargo_loss.caption = "Cargo safety: " .. string.format("%.2f", (1-cargo_loss)*100).."%" + else + root.cargo_loss.caption = "Cargo safety: Variable." + end + root.cargo_loss.tooltip = "Surviving stacks numbers are rounded up, unique items are never lost." + end + if root.survivability_loss then + local survivability_loss = Launchpad.get_survivability_loss(game.forces[struct.force_name], delta_v) + if struct.destination and struct.destination.landing_pad_name then + if struct.destination.zone then + root.survivability_loss.caption = "Landing chance: " .. string.format("%.2f", (1-survivability_loss)*100).."%" + else + root.survivability_loss.caption = "Landing chance: Variable." + end + root.survivability_loss.tooltip = "Failure results in loss of all rocket sections. Cargo is still delivered in cargo pods with minimal damage." + else + root.survivability_loss.caption = "Landing chance: Requires landing pad." + root.survivability_loss.tooltip = "All rocket sections will be lost but cargo is still delivered in cargo pods with minimal damage." + end + end + + root["status"].caption="Status: " .. message + + if ready == "ready" or ready == "delayed" then + if root["launch-disabled"] then root["launch-disabled"].destroy() end + if not root["launch"] then + local launch_button + if ready == "delayed" then + launch_button = root.add{ type="button", name="launch", caption="Launch (Delayed)", style="confirm_button", tooltip="Waiting for target launch pad to empty. Manual launch can override."} + else + launch_button = root.add{ type="button", name="launch", caption={"space-exploration.button-launch"}, style="confirm_button"} + end + launch_button.style.top_margin = 10 + launch_button.style.horizontally_stretchable = true + launch_button.style.horizontal_align = "left" + end + else + if root["launch"] then root["launch"].destroy() end + if not root["launch-disabled"] then + local launch_button = root.add{ type="button", name="launch-disabled", caption={"space-exploration.button-launch-disabled"}, style="red_confirm_button"} + launch_button.style.top_margin = 10 + launch_button.style.horizontally_stretchable = true + launch_button.style.horizontal_align = "left" + end + local launch_button = root["launch-disabled"] + if struct.launch_status > -1 then + launch_button.caption = "Launch in progress" + else + launch_button.caption = {"space-exploration.button-launch-disabled"} + end + end + + end + end +end + +function LaunchpadGUI.on_gui_click(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, LaunchpadGUI.name_rocket_launch_pad_gui_root) + if not root then return end + local struct = Launchpad.from_unit_number( + root and root.tags and root.tags.unit_number) + if not struct then return end + if element.name == "trigger" then + + struct.launch_trigger = selected_name_from_dropdown_preset(element, Launchpad.trigger_options) or "none" + + elseif element.name == "launchpad-list-zones" then + + local value = player_get_dropdown_value(player, element.name, element.selected_index) + if type(value) == "table" then + if value.type == "zone" then + local zone_index = value.index + local zone = Zone.from_zone_index(zone_index) + if zone then + struct.destination.zone = zone + Log.trace("set destination to location: " .. zone.name ) + end + local pad_names = element.parent["launchpad-list-landing-pad-names"] + local destination_pad_name = struct.destination.landing_pad_name + local list, selected_index, values = Landingpad.dropdown_list_zone_landing_pad_names(struct.force_name, struct.destination.zone, destination_pad_name) + pad_names.items = list + pad_names.selected_index = selected_index + player_set_dropdown_values(player, "launchpad-list-landing-pad-names", values) + elseif value.type == "spaceship" then + local spaceship_index = value.index + local spaceship = Spaceship.from_index(spaceship_index) + if spaceship then + struct.destination.zone = spaceship + Log.trace("set destination to spaceship : " .. spaceship.name ) + end + local pad_names = element.parent["launchpad-list-landing-pad-names"] + local destination_pad_name = struct.destination.landing_pad_name + local list, selected_index, values = Landingpad.dropdown_list_zone_landing_pad_names(struct.force_name, struct.destination.zone, destination_pad_name) + pad_names.items = list + pad_names.selected_index = selected_index + player_set_dropdown_values(player, "launchpad-list-landing-pad-names", values) + elseif value.type == "any" then + struct.destination.zone = nil + Log.trace("set destination to location: any") + local pad_names = element.parent["launchpad-list-landing-pad-names"] + local destination_pad_name = struct.destination.landing_pad_name + local list, selected_index, values = Landingpad.dropdown_list_force_landing_pad_names(struct.force_name, destination_pad_name) + pad_names.items = list + pad_names.selected_index = selected_index + player_set_dropdown_values(player, "launchpad-list-landing-pad-names", values) + end + LaunchpadGUI.gui_update(player) + else + LaunchpadGUI.gui_close(player) + Log.trace("Error: Non-table value ") + end + + elseif element.name == "launchpad-list-landing-pad-names" then + + local value = player_get_dropdown_value(player, element.name, element.selected_index) + local landing_pad_name = value + if landing_pad_name and landing_pad_name ~= "" then + struct.destination.landing_pad_name = landing_pad_name + Log.trace("set destination to landing_pad " .. landing_pad_name ) + else + struct.destination.landing_pad_name = nil + end + + elseif element.name == "launch" then + Launchpad.launch(struct, false, true) + elseif element.name == "clear_filter" then + element.parent.filter_list.text = "" + LaunchpadGUI.gui_update_destinations_list(player) + elseif element.name == LaunchpadGUI.name_window_close then + LaunchpadGUI.gui_close(player) + end +end +Event.addListener(defines.events.on_gui_click, LaunchpadGUI.on_gui_click) +Event.addListener(defines.events.on_gui_selection_state_changed, LaunchpadGUI.on_gui_click) + +function LaunchpadGUI.gui_update_destinations_list(player) + local playerdata = get_make_playerdata(player) + local root = player.gui.relative[LaunchpadGUI.name_rocket_launch_pad_gui_root] + if root then + local struct = Launchpad.from_unit_number( + root and root.tags and root.tags.unit_number) + if not struct then return end + + local filter = nil + if root.filter_flow and root.filter_flow.filter_list then + filter = string.trim(root.filter_flow.filter_list.text) + if filter == "" then + filter = nil + end + end + + -- update the list + local destination_zone = struct.destination and struct.destination.zone + local list, selected_index, values = Zone.dropdown_list_zone_destinations( struct.force_name, destination_zone, playerdata.zones_alphabetical, filter, + {list = "Any landing pad with name", value = {type = "any"}} -- wildcard + ) + if selected_index == 1 then selected_index = 2 end + root["launchpad-list-zones"].items = list + root["launchpad-list-zones"].selected_index = selected_index or 2 + player_set_dropdown_values(player, "launchpad-list-zones", values) + + end +end + +function LaunchpadGUI.on_gui_checked_state_changed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, LaunchpadGUI.name_rocket_launch_pad_gui_root) + if not root then return end + local struct = Launchpad.from_unit_number( + root and root.tags and root.tags.unit_number) + if not struct then return end + if element.name == "list-zones-alphabetical" then + local playerdata = get_make_playerdata(player) + playerdata.zones_alphabetical = element.state + LaunchpadGUI.gui_update_destinations_list(player) + end +end +Event.addListener(defines.events.on_gui_checked_state_changed, LaunchpadGUI.on_gui_checked_state_changed) + +function LaunchpadGUI.on_gui_text_changed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, LaunchpadGUI.name_rocket_launch_pad_gui_root) + if root then -- remote view + if element.name == "filter_list" then + LaunchpadGUI.gui_update_destinations_list(player) + end + end +end +Event.addListener(defines.events.on_gui_text_changed, LaunchpadGUI.on_gui_text_changed) + +--- Close the launchpad gui for a player +---@param player any +function LaunchpadGUI.gui_close (player) + if player.gui.relative[LaunchpadGUI.name_rocket_launch_pad_gui_root] then + player.gui.relative[LaunchpadGUI.name_rocket_launch_pad_gui_root].destroy() + end +end + +--- Respond to the main entity GUI being closed by destroying the relative GUI +---@param event any +function LaunchpadGUI.on_gui_closed(event) + local player = game.players[event.player_index] + if player and event.entity and event.entity.name == Launchpad.name_rocket_launch_pad then + LaunchpadGUI.gui_close(player) + end +end +Event.addListener(defines.events.on_gui_closed, LaunchpadGUI.on_gui_closed) + +--- Opens the launchpad gui when a launchpad is clicked +--- Closes the launchpad gui when another gui is opened +---@param event any +function LaunchpadGUI.on_gui_opened(event) + local player = game.players[event.player_index] + if event.entity and event.entity.valid and event.entity.name == Launchpad.name_rocket_launch_pad then + LaunchpadGUI.gui_open(player, Launchpad.from_entity(event.entity)) + else + LaunchpadGUI.gui_close(player) + end +end +Event.addListener(defines.events.on_gui_opened, LaunchpadGUI.on_gui_opened) + +return LaunchpadGUI \ No newline at end of file diff --git a/space-exploration_0.5.58/space-exploration/scripts/launchpad.lua b/space-exploration_0.5.58/space-exploration/scripts/launchpad.lua new file mode 100644 index 0000000..be22f46 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/launchpad.lua @@ -0,0 +1,1582 @@ +local Launchpad = {} +-- launchpad, cargo rockeet, and rocket landing / crashing sequences + +--custon event +Launchpad.on_cargo_rocket_launched_event = script.generate_event_name() + +-- constants +Launchpad.name_rocket_launch_pad = mod_prefix.."rocket-launch-pad" +Launchpad.name_rocket_launch_pad_section_input = mod_prefix.."rocket-launch-pad-_-section-input" +Launchpad.name_rocket_launch_pad_tank = mod_prefix.."rocket-launch-pad-tank" +Launchpad.name_rocket_launch_pad_combinator = mod_prefix.."rocket-launch-pad-combinator" +Launchpad.name_rocket_launch_pad_silo = mod_prefix.."rocket-launch-pad-silo" +Launchpad.name_rocket_launch_pad_silo_dummy = mod_prefix.."rocket-launch-pad-silo-dummy-ingredient-item" +Launchpad.name_rocket_launch_pad_seat = mod_prefix.."rocket-launch-pad-_-seat" +Launchpad.name_rocket_section = mod_prefix.."cargo-rocket-section" + +Launchpad.name_cargo_rocket = mod_prefix.."cargo-rocket" +Launchpad.name_cargo_pod = mod_prefix.."cargo-rocket-cargo-pod" + +Launchpad.name_tech_rocket_cargo_safety = mod_prefix.."rocket-cargo-safety" +Launchpad.name_tech_rocket_reusability = mod_prefix.."rocket-reusability" +Launchpad.name_tech_rocket_survivability = mod_prefix.."rocket-survivability" + +Launchpad.rocket_capacity = 500 +Launchpad.fuel_per_delta_v = 8 -- maybe this should be an energy value? +Launchpad.rocket_sections_per_rocket = 100 +Launchpad.crew_capsules_per_rocket = 1 +Launchpad.signal_for_launch = {type = "virtual", name = "signal-green"} +Launchpad.signal_for_rocket_complete = {type = "virtual", name = mod_prefix.."cargo-rocket"} + +Launchpad.trigger_options = { + { name = "none", display = {"space-exploration.trigger-none"}}, + { name = "fuel-full", display = {"space-exploration.trigger-fuel-full"}}, + { name = "cargo-full", display = {"space-exploration.trigger-cargo-full"}}, + { name = "fuel-full-signal", display = {"space-exploration.trigger-fuel-full-signal"}}, + { name = "cargo-full-signal", display = {"space-exploration.trigger-cargo-full-signal"}}, + { name = "cargo-full-or-signal", display = {"space-exploration.trigger-cargo-full-or-signal"}}, +} + +Launchpad.time_takeoff = 440 -- the delay before the rocket gets going +Launchpad.time_takeoff_finish_ascent = 1100 --1164 -- just before the rocket launch event would fire + +Launchpad.time_landing_capsule_touchdown = 6 * 60 -- when the capsule lands +Launchpad.time_landing_cargopod_first = 3 * 60 -- when the first cargopod lands +Launchpad.time_landing_cargopod_last = 5 * 60 -- when the last cargopod lands +Launchpad.time_landing_debris_first = 2 * 60 -- when the first debris lands +Launchpad.time_landing_debris_last = 7 * 60 -- when the last debris lands +Launchpad.landing_start_altitude = 128 + +Launchpad.safety_delta_v_base = 1000 +Launchpad.safety_delta_v_factor = 100000 + +Launchpad.names_cargo_fragment = { -- these are the base names, actual names are "se-falling-" + "cargo-fragment-a", + "cargo-fragment-b", + "cargo-fragment-c", + "cargo-fragment-d", +} + +Launchpad.rocket_fragments_large = 4 +Launchpad.names_rocket_fragments_large = { + "rocket-fragment-big-d", + "rocket-fragment-big-a", + "rocket-fragment-big-b", + "rocket-fragment-big-c" +} +Launchpad.rocket_fragments_medium = 6 +Launchpad.names_rocket_fragments_medium = { + "rocket-fragment-medium-a", + "rocket-fragment-medium-b", + "rocket-fragment-medium-c" +} +Launchpad.rocket_fragments_small = 20 +Launchpad.names_rocket_fragments_small = { + "rocket-fragment-small-a", + "rocket-fragment-small-b", + "rocket-fragment-small-c", + "rocket-fragment-small-d", + "rocket-fragment-small-e", + "rocket-fragment-small-f", + "rocket-fragment-small-g", + "rocket-fragment-small-h", + "rocket-fragment-small-i", + "rocket-fragment-small-j" +} +Launchpad.rocket_fragments_tiny = 20 +Launchpad.names_rocket_fragments_tiny = { + "rocket-fragment-tiny-a", + "rocket-fragment-tiny-b", + "rocket-fragment-tiny-c", + "rocket-fragment-tiny-d", + "rocket-fragment-tiny-e", + "rocket-fragment-tiny-f" +} + +function Launchpad.get_force_cargo_loss_modifier(force) + local researched_levels = 0 + local i = 1 + local current_level = force.technologies[Launchpad.name_tech_rocket_cargo_safety.."-"..i] + while current_level and (current_level.researched or current_level.level > i) do + local more_levels = (current_level.level or i) - i + i = i + 1 + more_levels + researched_levels = researched_levels + (1 + more_levels) + current_level = force.technologies[Launchpad.name_tech_rocket_cargo_safety.."-"..i] + end + return 0.9 ^ researched_levels +end + +function Launchpad.get_cargo_loss(force, delta_v) -- percentage of cargo lost + delta_v = (delta_v or Launchpad.safety_delta_v_factor) + Launchpad.safety_delta_v_base -- 50% + local loss = delta_v/(delta_v+Launchpad.safety_delta_v_factor) + --local loss = 0.5 * global.forces[force.name].cargo_rockets_launched / (global.forces[force.name].cargo_rockets_launched + 500) + return loss *Launchpad.get_force_cargo_loss_modifier(force) +end + +function Launchpad.get_reusability(force) -- percentage of parts not recoverable (all at start) + local recovery = 0.2 + local i = 1 + local current_level = force.technologies[Launchpad.name_tech_rocket_reusability.."-"..i] + while current_level and (current_level.researched or current_level.level > i) do + local more_levels = (current_level.level or i) - i + i = i + 1 + more_levels + recovery = recovery + 0.04 * (1 + more_levels) + current_level = force.technologies[Launchpad.name_tech_rocket_reusability.."-"..i] + end + return recovery +end + +function Launchpad.get_force_survivability_loss_modifier(force) -- chance to fail to land on rocket launch pad + local multiplier = 1 + local i = 1 + while force.technologies[Launchpad.name_tech_rocket_survivability.."-"..i] + and force.technologies[Launchpad.name_tech_rocket_survivability.."-"..i].researched do + i = i + 1 + multiplier = multiplier * 0.9 + end + if force.technologies[Launchpad.name_tech_rocket_survivability.."-"..i] then + local tech = force.technologies[Launchpad.name_tech_rocket_survivability.."-"..i] + if tech.prototype.max_level > 10 then -- infinite + for j = i, tech.level do + multiplier = multiplier * 0.9 + end + end + end + return multiplier +end + +function Launchpad.get_survivability_loss(force, delta_v) -- chance to fail to land on rocket launch pad + delta_v = (delta_v or Launchpad.safety_delta_v_factor) + Launchpad.safety_delta_v_base -- 50% + local loss = delta_v/(delta_v+Launchpad.safety_delta_v_factor) + --local loss = 0.5 * global.forces[force.name].cargo_rockets_launched / (global.forces[force.name].cargo_rockets_launched + 500) + return loss * Launchpad.get_force_survivability_loss_modifier(force) +end + +---@class Launchpad All data necessary to maintain the state of a launchpad + +--- Gets the Launchpad for this unit_number +---@param unit_number number +function Launchpad.from_unit_number (unit_number) + if not unit_number then Log.trace("Launchpad.from_unit_number: invalid unit_number: nil") return end + unit_number = tonumber(unit_number) + -- NOTE: only supports container as the entity + if global.rocket_launch_pads[unit_number] then + return global.rocket_launch_pads[unit_number] + else + Log.trace("Launchpad.from_unit_number: invalid unit_number: " .. unit_number) + end +end + +--- Gets the Launchpad for this entity +---@param entity any +function Launchpad.from_entity (entity) + if not(entity and entity.valid) then + Log.trace("Launchpad.from_entity: invalid entity") + return + end + -- NOTE: only supports container as the entity + return Launchpad.from_unit_number(entity.unit_number) +end + +--- Computes the cost to launch a rocket +---@param origin Zone launch zone +---@param destination Zone destination zone +function Launchpad.get_fuel_cost(origin, destination) + if origin and destination then + return Launchpad.fuel_per_delta_v * (Zone.get_launch_delta_v(origin) + Zone.get_travel_delta_v(origin, destination)) + end +end + +--[[ +Input the destination as either: + { type = "zone", zone_index = name } + { type = "landing-pad", zone_index = name, landing_pad_name = name } +Output the destination as: + { type = "zone", zone_index = name, zone = Zone, position = {x=#,y=#} } + { type = "landing-pad", landing_pad_name = name, landing_pad = rocket_landing_pad} +]]-- +function Launchpad.lock_destination (struct, allow_non_empty) + -- force launch can go to non-empty landings + + if struct.destination then + if struct.destination.zone then + -- can't have people changing destination mid-launch + local force_name = struct.force_name + -- destination to locked destination + local locked_destination = { -- don't use deepcopy be + zone = struct.destination.zone, + landing_pad_name = struct.destination.landing_pad_name, + } + + local zone = locked_destination.zone + if not zone then return false end + + if locked_destination.landing_pad_name then + + local landing_pads = Landingpad.get_zone_landing_pads_availability(force_name, zone, locked_destination.landing_pad_name) + + if #landing_pads.empty_landing_pads > 0 then + local landing_pad = landing_pads.empty_landing_pads[math.random(#landing_pads.empty_landing_pads)] + locked_destination.landing_pad = landing_pad + Zone.get_make_surface(zone) + return locked_destination + elseif allow_non_empty and #landing_pads.filled_landing_pads > 0 then + local landing_pad = landing_pads.filled_landing_pads[math.random(#landing_pads.filled_landing_pads)] + locked_destination.landing_pad = landing_pad + Zone.get_make_surface(zone) + return locked_destination + end + + else -- not landing pad name + + Zone.get_make_surface(zone) + locked_destination.position = Zone.find_zone_landing_position(zone) + + --this is the first cargo rocket to space, go to the space platform satellite + if (zone.type == "orbit" and zone.parent.name == "Nauvis") then + if (global.forces[force_name].cargo_rockets_launched or 0) == 0 and global.forces[force_name].nauvis_satellite then + local satellite_blueprint = Ruin.ruins["satellite"] + locked_destination.position = { + x = global.forces[force_name].nauvis_satellite.x + + (satellite_blueprint.landing_offset.x or satellite_blueprint.landing_offset[1]) + - (satellite_blueprint.center.x or satellite_blueprint.center[1]), + y = global.forces[force_name].nauvis_satellite.y + + (satellite_blueprint.landing_offset.y or satellite_blueprint.landing_offset[2]) + - (satellite_blueprint.center.y or satellite_blueprint.center[2]) + } + end + end + return locked_destination + end + elseif struct.destination.landing_pad_name then + -- can't have people changing destination mid-launch + local force_name = struct.force_name + + local locked_destination = { -- don't use deepcopy be + landing_pad_name = struct.destination.landing_pad_name, + } + + local landing_pads = Landingpad.get_force_landing_pads_availability(force_name, locked_destination.landing_pad_name) + + if #landing_pads.empty_landing_pads > 0 then + local landing_pad = landing_pads.empty_landing_pads[math.random(#landing_pads.empty_landing_pads)] + locked_destination.zone = landing_pad.zone + locked_destination.landing_pad = landing_pad + return locked_destination + elseif allow_non_empty and #landing_pads.filled_landing_pads > 0 then + local landing_pad = landing_pads.filled_landing_pads[math.random(#landing_pads.filled_landing_pads)] + locked_destination.zone = landing_pad.zone + locked_destination.landing_pad = landing_pad + return locked_destination + end + + end + end + return false +end + +function Launchpad.add_section_input(struct) + -- spawn section input + struct.section_input = struct.container.surface.create_entity{ + name = Launchpad.name_rocket_launch_pad_section_input, + force = struct.container.force, + position = {struct.container.position.x, struct.container.position.y}} + local inv = struct.section_input.get_inventory(defines.inventory.car_trunk) + inv.set_filter(1, Launchpad.name_rocket_section) + inv.set_filter(2, Capsule.name_space_capsule) +end + +function Launchpad.update_combinator(struct, main_inv) + if struct.combinator then + local comb = struct.combinator.get_or_create_control_behavior() + -- comb.set_signal(1, {signal={type="fluid", name=name_fluid_rocket_fuel}, count=struct.total_fuel}) + comb.set_signal(1, {signal={type="fluid", name=name_fluid_rocket_fuel}, count=struct.lua_fuel}) + comb.set_signal(2, {signal={type="item", name=Launchpad.name_rocket_section}, count=struct.rocket_sections}) + comb.set_signal(3, {signal={type="item", name=Capsule.name_space_capsule}, count=struct.crew_capsules}) + if struct.rocket_sections >= Launchpad.rocket_sections_per_rocket and struct.crew_capsules >= Launchpad.crew_capsules_per_rocket then + comb.set_signal(4, {signal=Launchpad.signal_for_rocket_complete, count=1}) + else + comb.set_signal(4, {signal=Launchpad.signal_for_rocket_complete, count=0}) + end + + local slots_free = main_inv.count_empty_stacks() + + comb.set_signal(5, {signal={type = "virtual", name = "signal-E"}, count= slots_free}) + comb.set_signal(6, {signal={type = "virtual", name = "signal-F"}, count= #main_inv - slots_free}) + comb.set_signal(7, {signal={type = "virtual", name = "signal-L"}, count= struct.required_fuel or 0}) + end +end + +function Launchpad.prep(struct) + + --local profiler = game.create_profiler() + + if not (struct.container and struct.container.valid) then + return Launchpad.destroy(struct) + end + + struct.required_fuel = nil -- invalid + if struct.destination then + local origin_zone = struct.zone + if struct.destination.landing_pad_name and not struct.destination.zone then + + if global.forces[struct.force_name] + and global.forces[struct.force_name].rocket_landing_pad_names + and global.forces[struct.force_name].rocket_landing_pad_names[struct.destination.landing_pad_name] then + local required_fuel_max = 0 + local landing_pads_list = global.forces[struct.force_name].rocket_landing_pad_names[struct.destination.landing_pad_name] + for _, landing_pad in pairs(landing_pads_list) do + required_fuel_max = math.max(required_fuel_max, Launchpad.get_fuel_cost(origin_zone, landing_pad.zone)) + end + if required_fuel_max > 0 then + struct.required_fuel = required_fuel_max + end + end + else + local destination_zone = struct.destination.zone + struct.required_fuel = Launchpad.get_fuel_cost(origin_zone, destination_zone); -- self-validates + end + else + struct.required_fuel = nil -- invalid + end + + -- balance tank fuel and lua fuel + -- fuel tank % should match total % + local fluidbox + local effective_required_fuel = (struct.required_fuel or 0) + 1000 + if not (struct.tank and struct.tank.valid) then + struct.tank = struct.container.surface.create_entity{ + name = Launchpad.name_rocket_launch_pad_tank, + force = struct.container.force, + position = {struct.container.position.x, struct.container.position.y + 1}} -- 1 tile down to be in front of silo + struct.tank.fluidbox.set_filter(1, {name = name_fluid_rocket_fuel, force = true}) + struct.container.connect_neighbour({wire = defines.wire_type.red, target_entity = struct.tank}) + struct.container.connect_neighbour({wire = defines.wire_type.green, target_entity = struct.tank}) + struct.tank.destructible = false + end + if struct.tank and #struct.tank.fluidbox > 0 then + fluidbox = struct.tank.fluidbox[1] or {name = name_fluid_rocket_fuel, amount = 0} + struct.total_fuel = (struct.lua_fuel or 0) + fluidbox.amount + if struct.total_fuel > 0 then + local percent_of_required = 1 -- overflow + percent_of_required = struct.total_fuel / effective_required_fuel -- leave 10% available to fill faster + if percent_of_required < 1 then + percent_of_required = percent_of_required * 0.5 + end + fluidbox.amount = math.min(struct.total_fuel, math.min(1, percent_of_required) * struct.tank.fluidbox.get_capacity(1)) + if fluidbox.amount < 1 then + fluidbox.amount = 1 + end + struct.lua_fuel = struct.total_fuel - fluidbox.amount + struct.tank.fluidbox[1] = fluidbox + end + end + + local main_inv = struct.container.get_inventory(defines.inventory.chest) + + struct.crew_capsules = struct.crew_capsules or 0 + struct.rocket_sections = struct.rocket_sections or 0 + + -- take from section input first + if (struct.crew_capsules or 0) < Launchpad.crew_capsules_per_rocket and struct.section_input and struct.section_input.valid then + local inv = struct.section_input.get_inventory(defines.inventory.car_trunk) + local items = inv.get_item_count(Capsule.name_space_capsule) + if items > 0 then + local take = 1 + inv.remove({name=Capsule.name_space_capsule, count=take}) + struct.crew_capsules = struct.crew_capsules + take + end + end + + -- otherwise take from main container + if (struct.crew_capsules or 0) < Launchpad.crew_capsules_per_rocket then + local items = main_inv.get_item_count(Capsule.name_space_capsule) + if items > 0 then + local take = math.min(items, Launchpad.crew_capsules_per_rocket - struct.crew_capsules) + main_inv.remove({name=Capsule.name_space_capsule, count=take}) + struct.crew_capsules = struct.crew_capsules + take + end + end + + -- take from section input first + if struct.rocket_sections < Launchpad.rocket_sections_per_rocket and struct.section_input and struct.section_input.valid then + local inv = struct.section_input.get_inventory(defines.inventory.car_trunk) + local items = inv.get_item_count(Launchpad.name_rocket_section) + if items > 0 then + local take = math.min(items, Launchpad.rocket_sections_per_rocket - struct.rocket_sections) + inv.remove({name=Launchpad.name_rocket_section, count=take}) + struct.rocket_sections = struct.rocket_sections + take + end + end + + -- otherwise take from main container + if struct.rocket_sections < Launchpad.rocket_sections_per_rocket then + local items = main_inv.get_item_count(Launchpad.name_rocket_section) + if items > 0 then + local take = math.min(items, Launchpad.rocket_sections_per_rocket - struct.rocket_sections) + main_inv.remove({name=Launchpad.name_rocket_section, count=take}) + struct.rocket_sections = struct.rocket_sections + take + end + end + + -- not enough parts, add a section input to collect parts + -- this will probably prevent input of other parts. + if struct.rocket_sections < Launchpad.rocket_sections_per_rocket + and not main_inv.can_insert{name = Launchpad.name_rocket_section, count = 1} then + if not(struct.section_input and struct.section_input.valid) then + Launchpad.add_section_input(struct) + end + else + Launchpad.destroy_sub(struct, "section_input") + end + + Launchpad.update_combinator(struct, main_inv) + + if struct.rocket_sections >= Launchpad.rocket_sections_per_rocket and struct.crew_capsules >= Launchpad.crew_capsules_per_rocket + and not struct.has_inserted_dummy then + local inserted = struct.silo.insert{name = Launchpad.name_rocket_launch_pad_silo_dummy, count = 1} + if inserted == 1 then + struct.has_inserted_dummy = true + end + end + + --game.print(profiler) + +end + +function Launchpad.launch(struct, skip_prep, allow_non_empty) + + if struct.launch_status > -1 then return end -- already launching + if skip_prep ~= true then + Launchpad.prep(struct) + end + + local destination = Launchpad.lock_destination(struct, allow_non_empty) + + if destination then + local current_zone = struct.zone + local destination_zone = destination.zone + struct.launching_to_destination = destination + + local required_fuel = Launchpad.get_fuel_cost(current_zone, destination_zone) + struct.required_fuel = required_fuel + + -- the destination is locked so let's go + if destination.landing_pad then + destination.position = Util.vectors_add(destination.landing_pad.container.position, {x = 0, y = 2}) + destination.landing_pad.inbound_rocket = true + end + + -- set the contents + local main_inv = struct.container.get_inventory(defines.inventory.chest) + local main_contents = main_inv.get_contents() + struct.launched_contents = main_contents + -- make a global temp inventory. + -- swap items to that inventory. + -- make sure to destroy later + struct.launched_inventory = game.create_inventory(#main_inv) + Util.swap_inventories(main_inv, struct.launched_inventory) + main_inv.clear() -- chould already be empty anyway. + Log.trace("make launched_inventory with size" .. #struct.launched_inventory) + + -- consume the fuel + local lua_fuel_consumed = math.min(struct.lua_fuel, required_fuel) + struct.lua_fuel = struct.lua_fuel - lua_fuel_consumed + if lua_fuel_consumed < required_fuel then + local fluidbox = struct.tank.fluidbox[1] + local tank_fuel_consumed = math.min(required_fuel - lua_fuel_consumed, fluidbox.amount) + fluidbox.amount = math.max(1, fluidbox.amount - tank_fuel_consumed) + struct.tank.fluidbox[1] = fluidbox + struct.total_fuel = struct.lua_fuel + fluidbox.amount + end + if struct.tank and struct.tank.fluidbox and struct.tank.fluidbox[1] and struct.tank.fluidbox[1].name then + struct.container.force.fluid_production_statistics.on_flow(struct.tank.fluidbox[1].name, -required_fuel) + end + + -- consume rocket parts + struct.rocket_sections = struct.rocket_sections - Launchpad.rocket_sections_per_rocket +-- struct.container.force.item_production_statistics.on_flow(Launchpad.name_rocket_section, -Launchpad.rocket_sections_per_rocket) + + -- consume crew capsule + struct.crew_capsules = struct.crew_capsules - Launchpad.crew_capsules_per_rocket +-- struct.container.force.item_production_statistics.on_flow(Capsule.name_space_capsule, -Launchpad.crew_capsules_per_rocket) + + -- start charting the landing + if destination_zone.type ~= "spaceship" then + local range = Zone.discovery_scan_radius + struct.container.force.chart(Zone.get_make_surface(destination_zone), { + {destination.position.x - range, destination.position.y - range - Launchpad.landing_start_altitude}, + {destination.position.x + range, destination.position.y + range} + }) + end + -- set launch status + struct.launch_status = 1 + + script.raise_event(Launchpad.on_cargo_rocket_launched_event, {struct = struct}) + + Launchpad.update_combinator(struct, main_inv) + end +end + + +function Launchpad.tick(struct) + -- this should only be called once per 60 ticks during prep and every tick during launch + -- actually, launch should be handles seperatly. + -- make launches and capsule launches in to tick tasks + -- Launchpad.prep can be called every tick for gui updates + if not (struct.container and struct.container.valid) then + return Launchpad.destroy(struct) + end + + if struct.launch_status < 1 then + + Launchpad.prep(struct) + + -- if struct.required_fuel then the destination must be valid + if struct.required_fuel and struct.total_fuel >= struct.required_fuel + and struct.rocket_sections >= Launchpad.rocket_sections_per_rocket + and struct.crew_capsules >= Launchpad.crew_capsules_per_rocket then + -- can launch + -- TRIGGERS + + local destination = nil + if struct.launch_trigger == "fuel-full" then + -- we already know fuel is full so launch + Launchpad.launch(struct, true) + elseif struct.launch_trigger == "cargo-full" then + local main_inv = struct.container.get_inventory(defines.inventory.chest) + if main_inv then + if not main_inv.can_insert({name = Launchpad.name_rocket_section, count = 1}) then + -- cargo is full so try launch + Launchpad.launch(struct, true) + end + end + elseif struct.launch_trigger == "fuel-full-signal" then + if struct.container.get_circuit_network(defines.wire_type.red).get_signal(Launchpad.signal_for_launch) > 0 + or struct.container.get_circuit_network(defines.wire_type.green).get_signal(Launchpad.signal_for_launch) > 0 + then + Launchpad.launch(struct, true) + end + elseif struct.launch_trigger == "cargo-full-signal" then + local main_inv = struct.container.get_inventory(defines.inventory.chest) + if main_inv then + if not main_inv.can_insert({name = Launchpad.name_rocket_section, count = 1}) then + if struct.container.get_circuit_network(defines.wire_type.red).get_signal(Launchpad.signal_for_launch) > 0 + or struct.container.get_circuit_network(defines.wire_type.green).get_signal(Launchpad.signal_for_launch) > 0 + then + Launchpad.launch(struct, true) + end + end + end + elseif struct.launch_trigger == "cargo-full-or-signal" then + local main_inv = struct.container.get_inventory(defines.inventory.chest) + if main_inv then + if not main_inv.can_insert({name = Launchpad.name_rocket_section, count = 1}) then + -- cargo is full so try launch + Launchpad.launch(struct, true) + else + if struct.container.get_circuit_network(defines.wire_type.red).get_signal(Launchpad.signal_for_launch) > 0 + or struct.container.get_circuit_network(defines.wire_type.green).get_signal(Launchpad.signal_for_launch) > 0 + then + -- signal so try launch + Launchpad.launch(struct, true) + end + end + end + end + + end + elseif struct.launch_status == 1 then + -- the rocket should be ready + if struct.silo.launch_rocket() then + --Log.trace("launching") + struct.launch_status = 2 + struct.rocket_entity = struct.container.surface.find_entities_filtered{name=Launchpad.name_cargo_rocket, area=util.position_to_area(struct.container.position, 0.5)}[1] + -- the launch pad could get removed at this point and the rocket would need to keep going. + local tick_task = new_tick_task("launchpad-journey") + tick_task.struct = struct + tick_task.force_name = struct.force_name + tick_task.rocket_entity = struct.rocket_entity + tick_task.launch_timer = 0 + tick_task.launched_contents = struct.launched_contents + tick_task.launched_inventory = struct.launched_inventory + Log.trace("Move launched_inventory to tick task " .. #tick_task.launched_inventory) + struct.launched_inventory = nil + tick_task.launching_to_destination = struct.launching_to_destination + tick_task.delta_v = Zone.get_travel_delta_v(tick_task.struct.zone, tick_task.launching_to_destination.zone) + + local target_surface = Zone.get_make_surface(tick_task.launching_to_destination.zone) + target_surface.request_to_generate_chunks(Util.vectors_add(tick_task.launching_to_destination.position, {x = 0, y = Launchpad.landing_start_altitude}), + Launchpad.landing_start_altitude / 32 / 2) + -- start the launch animation + -- move the player seats over the rocket + -- follow rocket launch + -- if not landing_pad clear destination: remove biters + -- teleport over landing zone + -- if not landing_pad start descent / crash sequence + -- place landfill, place scaffold, place cargo Pods + -- place recoverable sections + -- destroy the seats to release the players + end + else + -- stays at struct.launch_status 2 until tick_task sets it back to -1 + end +end + + +function Launchpad.drop_rocket_fragment(zone, size, name, position, start_position_x_offset) + local target_surface = Zone.get_make_surface(zone) + local falling_time + if math.random() < 0.5 then -- biggest first + falling_time = Launchpad.time_landing_debris_first + + (size - math.random()) / 4 * (Launchpad.time_landing_debris_last - Launchpad.time_landing_debris_first) + else -- or just random + falling_time = Launchpad.time_landing_debris_first + math.random() * (Launchpad.time_landing_debris_last - Launchpad.time_landing_debris_first) + end + local landing_start_altitude = Launchpad.landing_start_altitude + if Zone.is_space(zone) then + landing_start_altitude = landing_start_altitude * 0.5 + end + local random_start_offset = {x = 8 * (math.random() - 0.5), y = 8 * (math.random() - 0.5)} + local start_position = Util.vectors_add(position, { + x = random_start_offset.x + start_position_x_offset, + y = random_start_offset.y - landing_start_altitude}) + local start_position_shadow = Util.vectors_add(position, { + x = random_start_offset.x + landing_start_altitude + start_position_x_offset, + y = random_start_offset.y}) + + local land_position = Util.vectors_add(position, { + x = random_start_offset.x + 32 * (math.random() - 0.5), + y = random_start_offset.y + 32 * (math.random() - 0.5)}) + + local flat_distance = Util.vectors_delta_length(start_position, land_position) + local flat_distance_shadow = Util.vectors_delta_length(start_position_shadow, land_position) + local speed = flat_distance / falling_time + local speed_shadow = flat_distance_shadow / falling_time + + if Zone.is_space(zone) then + target_surface.create_entity{ + name = mod_prefix .. "space-" ..name, + position = start_position, + target = land_position, + speed = speed, + --max_rage = flat_distance, + } + else + target_surface.create_entity{ + name = mod_prefix .. "falling-" ..name, + position = start_position, + target = land_position, + speed = speed, + max_rage = flat_distance, + } + target_surface.create_entity{ + name = mod_prefix .. "shadow-" ..name, + position = start_position_shadow, + target = land_position, + speed = speed_shadow, + max_rage = flat_distance_shadow, + } + end +end + +function Launchpad.tick_journey(tick_task) + -- from tick_task.type = "launchpad-journey" + if tick_task.launch_timer then + tick_task.launch_timer = tick_task.launch_timer + 1 + + local struct = tick_task.struct + if struct and struct.valid then + if tick_task.launch_timer <= Launchpad.time_takeoff then + -- collect passengers while rocket is low + tick_task.passengers = tick_task.passengers or {} -- characters not players + for _, seat in pairs(struct.seats) do + if seat.get_driver() then + table.insert(tick_task.passengers, seat.get_driver()) + if remote.interfaces["jetpack"] and remote.interfaces["jetpack"]["block_jetpack"] then + remote.call("jetpack", "block_jetpack", {character=seat.get_driver()}) + end + seat.set_driver(nil) + end + if seat.get_passenger() then + table.insert(tick_task.passengers, seat.get_passenger()) + if remote.interfaces["jetpack"] and remote.interfaces["jetpack"]["block_jetpack"] then + remote.call("jetpack", "block_jetpack", {character=seat.get_passenger()}) + end + seat.set_passenger(nil) + end + end + end + end + + if tick_task.rocket_entity and tick_task.rocket_entity.valid then + -- move passengers with the rocket + if tick_task.passengers then + for _, passenger in pairs(tick_task.passengers) do + if passenger and passenger.valid then + if remote.interfaces["jetpack"] and remote.interfaces["jetpack"]["block_jetpack"] then + remote.call("jetpack", "block_jetpack", {character=passenger}) + end + local target_position = { + x = tick_task.rocket_entity.position.x, + y = tick_task.rocket_entity.position.y - 2 - math.max(0, tick_task.launch_timer - Launchpad.time_takeoff) / 64} + passenger.teleport(target_position) + passenger.destructible = false + --passenger.teleport(Util.move_to(passenger.position, target_position, tick_task.launch_timer / 100) ) + end + end + end + + if tick_task.launch_timer >= Launchpad.time_takeoff_finish_ascent then + -- skip to next phase + tick_task.launch_timer = nil + end + + else + -- skip to next phase + tick_task.launch_timer = nil + end + + else + if not tick_task.land_timer then + tick_task.land_timer = 0 + -- setup next landing sequence + + if tick_task.rocket_entity and tick_task.rocket_entity.valid then + tick_task.rocket_entity.destroy() + tick_task.rocket_entity = nil + end + -- reset the landing pad + local struct = tick_task.struct + if struct and struct.valid then + struct.launched_contents = nil + if struct.launched_inventory and struct.launched_inventory.valid then + struct.launched_inventory.destroy() + struct.launched_inventory = nil + end + struct.launch_status = -1 + struct.launching_to_destination = nil + struct.has_inserted_dummy = nil + global.forces[tick_task.force_name].cargo_rockets_launched = (global.forces[tick_task.force_name].cargo_rockets_launched or 0) + 1 + end + + --game.print("Dev note: Show capsule landing sequence and discarded rocket part debris falling from the sky.") + + -- determine success rate + + -- for landing pad: + -- show capsule descent over the pad, then put capsule inside the pad and player outside. + -- show up to 10 cargo pods the fly past to the landing pad first. + -- failed cargo pods are added to crash debris. + -- crash debris based on recovery tech. + -- put some recovered parts in the landing pad based on recovery tech. + -- no fire from spilt fuel + + --for general location or guidance failure + -- show capsule descent at random locaiton then put player outside. + -- show up to 10 cargo pods the fly past to random locations + -- failed cargo pods are added to crash debris. + -- all rocket parts added to crash debris regardless of recovery tech. + -- add fire from spilt fuel + -- add some wider area explosive damage + + local is_landingpad = (tick_task.launching_to_destination.landing_pad and tick_task.launching_to_destination.landing_pad.container and tick_task.launching_to_destination.landing_pad.container.valid) + if is_landingpad then + local error_chance = Launchpad.get_survivability_loss(game.forces[tick_task.force_name], tick_task.delta_v) + if math.random() < error_chance then + -- off course + is_landingpad = false + local force = tick_task.launching_to_destination.landing_pad.container.force + force.item_production_statistics.on_flow(Launchpad.name_rocket_section, -Launchpad.rocket_sections_per_rocket) + tick_task.launching_to_destination.landing_pad.inbound_rocket = nil + tick_task.launching_to_destination.attempted_position = tick_task.launching_to_destination.landing_pad.container.position + tick_task.launching_to_destination.attempted_landing_pad = tick_task.launching_to_destination.landing_pad + tick_task.launching_to_destination.landing_pad = nil + local new_pos = tick_task.launching_to_destination.position + new_pos.x = new_pos.x + (math.random() - 0.5) * 150 + new_pos.y = new_pos.y + (math.random() - 0.5) * 128 + tick_task.launching_to_destination.position = Zone.find_zone_landing_position(tick_task.launching_to_destination.zone, new_pos) + force.print({"space-exploration.rocket_survivability_fail", "[gps="..math.floor(new_pos.x)..","..math.floor(new_pos.y)..","..Zone.get_surface_name(tick_task.launching_to_destination.zone).."]"}) + + end + end + + local cargo_loss = Launchpad.get_cargo_loss(game.forces[tick_task.force_name], tick_task.delta_v) + if is_landingpad then + cargo_loss = cargo_loss / 2 + end + local keep_percent = 1 - cargo_loss + if tick_task.launched_inventory and tick_task.launched_inventory.valid then + Log.trace("Loss launched_inventory") + -- remove items from the inventory directly + + for item_name, item_count in pairs(tick_task.launched_contents) do + local item_type = game.item_prototypes[item_name] + if item_type and item_count > 1 and item_type.stack_size > 1 then + local loss = cargo_loss * 2 * math.random() -- +/- 100% + local lost_items = math.floor(item_count * loss) + if lost_items > 0 then + tick_task.launched_inventory.remove({name = item_name, count = lost_items}) + end + end + end + + else -- old method for legacy launches in progress. + Log.trace("Loss safe_contents") + tick_task.safe_contents = {} + for item_type, item_count in pairs(tick_task.launched_contents) do + local item_type = game.item_prototypes[item_name] + if item_type and item_count > 1 and item_type.stack_size > 1 then + local loss = 2 * cargo_loss * math.random() -- +/- 100% + -- keep 10% at a minimum + tick_task.safe_contents[item_type] = math.max(math.ceil(item_count / 10), item_count - item_count * loss) + else + tick_task.safe_contents[item_type] = item_count + end + end + end + + -- cargo loss should never go above 90%, it can be below 10% round up for number of crashing pods. + local total_pods = 10 + local crashing_pods = math.floor(total_pods * cargo_loss + 0.49) + local safe_pods = total_pods - crashing_pods + local pods = {} + + local target_surface = Zone.get_make_surface(tick_task.launching_to_destination.zone) + Zone.apply_markers(tick_task.launching_to_destination.zone) -- in case the surface exists + + for i = 1, safe_pods do + table.insert(pods, {type = "safe"}) + end + for i = 1, crashing_pods do + table.insert(pods, {type = "crash"}) + end + pods = Util.shuffle(pods) + + local landing_start_altitude = Launchpad.landing_start_altitude + if Zone.is_space(tick_task.launching_to_destination.zone) then + landing_start_altitude = landing_start_altitude * 0.5 + end + local start_position_x_offset = landing_start_altitude * (math.random() - 0.5) -- gives an angle to all pieces + local start_position = Util.vectors_add(tick_task.launching_to_destination.position, { + x = start_position_x_offset, + y = - landing_start_altitude}) + local start_position_shadow = Util.vectors_add(tick_task.launching_to_destination.position, { + x = start_position_x_offset + landing_start_altitude, + y = 0}) + + tick_task.safe_pods = {} + for i, pod in pairs(pods) do + + local falling_time = Launchpad.time_landing_cargopod_first + + (Launchpad.time_landing_cargopod_last - Launchpad.time_landing_cargopod_first) * (i - 1) / (total_pods - 1) + local land_position + if pod.type == "safe" and is_landingpad then + land_position = tick_task.launching_to_destination.position + else + land_position = Util.vectors_add(tick_task.launching_to_destination.position, {x = 32 * (math.random() - 0.5), y = 32 * (math.random() - 0.5)}) + end + local flat_distance = Util.vectors_delta_length(start_position, land_position) + local flat_distance_shadow = Util.vectors_delta_length(start_position_shadow, land_position) + local speed = flat_distance / falling_time + local speed_shadow = flat_distance_shadow / falling_time + + if pod.type == "safe" then + -- track the safe ones for adding items + local entity = target_surface.create_entity{ + name = mod_prefix .. "falling-cargo-pod", + position = start_position, + target = land_position, + speed = speed, + max_rage = flat_distance, + } + entity.orientation = 0 + table.insert(tick_task.safe_pods, {falling_entity=entity, land_position = land_position}) + target_surface.create_entity{ + name = mod_prefix .. "shadow-cargo-pod", + position = start_position_shadow, + target = land_position, + speed = speed_shadow, + max_rage = flat_distance_shadow, + } + else + target_surface.create_entity{ + name = mod_prefix .. "falling-" .. Launchpad.names_cargo_fragment[(i % #Launchpad.names_cargo_fragment) + 1], + position = start_position, + target = land_position, + speed = speed, + max_rage = flat_distance, + } + target_surface.create_entity{ + name = mod_prefix .. "shadow-" .. Launchpad.names_cargo_fragment[(i % #Launchpad.names_cargo_fragment) + 1], + position = start_position_shadow, + target = land_position, + speed = speed_shadow, + max_rage = flat_distance_shadow, + } + end + end + + if not is_landingpad then + for i = 1, Launchpad.rocket_fragments_large do + Launchpad.drop_rocket_fragment(tick_task.launching_to_destination.zone, 4, Launchpad.names_rocket_fragments_large[(i % #Launchpad.names_rocket_fragments_large) + 1], + tick_task.launching_to_destination.position, + start_position_x_offset) + end + for i = 1, Launchpad.rocket_fragments_medium do + Launchpad.drop_rocket_fragment(tick_task.launching_to_destination.zone, 3, Launchpad.names_rocket_fragments_medium[(i % #Launchpad.names_rocket_fragments_medium) + 1], + tick_task.launching_to_destination.position, + start_position_x_offset) + end + for i = 1, Launchpad.rocket_fragments_small do + Launchpad.drop_rocket_fragment(tick_task.launching_to_destination.zone, 2, Launchpad.names_rocket_fragments_small[(i % #Launchpad.names_rocket_fragments_small) + 1], + tick_task.launching_to_destination.position, + start_position_x_offset) + end + for i = 1, Launchpad.rocket_fragments_tiny do + Launchpad.drop_rocket_fragment(tick_task.launching_to_destination.zone, 1, Launchpad.names_rocket_fragments_tiny[(i % #Launchpad.names_rocket_fragments_tiny) + 1], + tick_task.launching_to_destination.position, + start_position_x_offset) + end + end + + -- capsule + tick_task.capsule = target_surface.create_entity{ + name = Capsule.name_space_capsule_vehicle, + position=start_position, + force = tick_task.force_name + } + tick_task.capsule.destructible = false + tick_task.capsule_shadow = target_surface.create_entity{name = Capsule.name_space_capsule_vehicle_shadow, position=start_position_shadow, force = "neutral"} + tick_task.capsule_light = target_surface.create_entity{name = Capsule.name_space_capsule_vehicle_light, position=start_position, + speed = 0, target = tick_task.capsule} + + if tick_task.passengers then + for _, passenger in pairs(tick_task.passengers) do + if passenger and passenger.valid then + -- this disassociates the character + if passenger.player then + LaunchpadGUI.gui_close(passenger.player) + end + tick_task.passengers[_] = teleport_character_to_surface(passenger, target_surface, tick_task.capsule.position) + if tick_task.passengers[_] then + tick_task.passengers[_].destructible = false + end + end + end + end + -- end landing sequence setup + else + -- continuation for landing sqequence + tick_task.land_timer = tick_task.land_timer + 1 + + local time_remaining = math.max(1, Launchpad.time_landing_capsule_touchdown - tick_task.land_timer) + local target_pos = tick_task.launching_to_destination.position + local capsule_target_pos = tick_task.launching_to_destination.attempted_position or target_pos + + --local travel = Util.vector_multiply(Util.vectors_delta(tick_task.capsule.position, target_pos), 1 / time_remaining) + --local travel_shadow = Util.vector_multiply(Util.vectors_delta(tick_task.capsule_shadow.position, target_pos), 1 / time_remaining) + + if not(tick_task.capsule and tick_task.capsule.valid) then + local target_surface = Zone.get_make_surface(tick_task.launching_to_destination.zone) + tick_task.capsule = target_surface.create_entity{ + name = Capsule.name_space_capsule_vehicle, + position={x = capsule_target_pos.x, y = capsule_target_pos.y - Launchpad.landing_start_altitude * time_remaining / Launchpad.time_landing_capsule_touchdown}, + force = tick_task.force_name + } + end + tick_task.capsule.destructible = true + + local travel = Util.vector_multiply(Util.vectors_delta(tick_task.capsule.position, capsule_target_pos), math.min(0.9, 2 / time_remaining)) + local animation_speed = 1/3 + local animation_frames = 24 + local animation_frame = math.max(math.min(math.floor(time_remaining * animation_speed), animation_frames), 1) + + tick_task.capsule.teleport(Util.vectors_add(tick_task.capsule.position, travel)) + tick_task.capsule.orientation = (animation_frame - 1) / animation_frames + + if tick_task.capsule_light and tick_task.capsule_light.valid then + tick_task.capsule_light.teleport(tick_task.capsule.position) + end + + if tick_task.capsule_shadow and tick_task.capsule_shadow.valid then + local travel_shadow = Util.vector_multiply(Util.vectors_delta(tick_task.capsule_shadow.position, capsule_target_pos), math.min(0.9, 2 / time_remaining)) + tick_task.capsule_shadow.teleport(Util.vectors_add(tick_task.capsule_shadow.position, travel_shadow)) + tick_task.capsule_shadow.graphics_variation = animation_frame + end + + if tick_task.passengers then + for _, passenger in pairs(tick_task.passengers) do + if passenger and passenger.valid then + passenger.teleport({x = tick_task.capsule.position.x, y = tick_task.capsule.position.y - 0.2}) + end + end + end + + for _, safe_pod in pairs(tick_task.safe_pods) do + if safe_pod.falling_entity then + if not safe_pod.falling_entity.valid then + safe_pod.falling_entity = nil + if tick_task.launching_to_destination.landing_pad and tick_task.launching_to_destination.landing_pad.valid then + --tick_task.launching_to_destination.landing_pad.container.insert{name = Launchpad.name_cargo_pod, count = 1} -- we have rocket parts instead + --tick_task.launching_to_destination.landing_pad.container.force.item_production_statistics.on_flow(Launchpad.name_cargo_pod, 1) + else + safe_pod.cargo_entity = tick_task.capsule.surface.create_entity{ + name = Launchpad.name_cargo_pod, + position = safe_pod.land_position, + force = tick_task.force_name + } + end + end + + end + end + + if tick_task.land_timer > Launchpad.time_landing_capsule_touchdown then + + if tick_task.launching_to_destination.landing_pad and tick_task.launching_to_destination.landing_pad.valid then + -- going to a landing pad + tick_task.launching_to_destination.landing_pad.container.insert{name = Capsule.name_space_capsule, count = 1} + --tick_task.launching_to_destination.landing_pad.container.force.item_production_statistics.on_flow(Capsule.name_space_capsule, 1) + tick_task.capsule.destroy() + + if tick_task.capsule_light and tick_task.capsule_light.valid then + tick_task.capsule_light.destroy() + end + + if tick_task.capsule_shadow and tick_task.capsule_shadow.valid then + tick_task.capsule_shadow.destroy() + end + + if tick_task.launched_inventory and tick_task.launched_inventory.valid then + Log.trace("Insert to pad launched_inventory") + local inv = tick_task.launching_to_destination.landing_pad.container.get_inventory(defines.inventory.chest) + for i = 1, #tick_task.launched_inventory do + local stack = tick_task.launched_inventory[i] + if stack and stack.valid and stack.valid_for_read and stack.count then + inv.insert(tick_task.launched_inventory[i]) + end + end + tick_task.launched_inventory.clear() + tick_task.launched_inventory.destroy() + tick_task.launched_inventory = nil + elseif tick_task.safe_contents then -- legacy method + Log.trace("Insert to pad safe_contents") + for name, count in pairs(tick_task.safe_contents) do + tick_task.launching_to_destination.landing_pad.container.insert{name=name, count=count} + end + end + + local reusability = Launchpad.get_reusability(game.forces[tick_task.force_name]) + local reusable_parts = math.floor(math.min(Launchpad.rocket_sections_per_rocket, Launchpad.rocket_sections_per_rocket * reusability * ( 0.9 + 0.2 * math.random()))) + if reusable_parts > 0 then + tick_task.launching_to_destination.landing_pad.container.insert{name = Launchpad.name_rocket_section, count = reusable_parts} +-- tick_task.launching_to_destination.landing_pad.container.force.item_production_statistics.on_flow(Launchpad.name_rocket_section, reusable_parts) + end + if reusable_parts < Launchpad.rocket_sections_per_rocket then + tick_task.launching_to_destination.landing_pad.container.force.item_production_statistics.on_flow(Launchpad.name_rocket_section, -(Launchpad.rocket_sections_per_rocket - reusable_parts)) + end + + tick_task.launching_to_destination.landing_pad.inbound_rocket = nil + else + + if tick_task.launched_inventory and tick_task.launched_inventory.valid then + Log.trace("Distribute to pods launched_inventory") + + local spidertrons = {"spidertron-spidertron-rocket-launcher-1", "spidertron"} + for _, spidertron_name in pairs(spidertrons) do + if tick_task.launched_contents[spidertron_name] and tick_task.launched_contents[spidertron_name] > 0 then + local pod = tick_task.safe_pods[#tick_task.safe_pods] + local spider = pod.cargo_entity.surface.create_entity{ + name = spidertron_name, + position = pod.cargo_entity.position, + force = pod.cargo_entity.force, + raise_built = true + } + if spider then + tick_task.launched_contents[spidertron_name] = tick_task.launched_contents[spidertron_name] - 1 + local spider_item = tick_task.launched_inventory.find_item_stack(spidertron_name) + if spider_item.grid then + Util.transfer_equipment_grid(spider_item, spider) + end + local inventory = spider_item.get_inventory(defines.inventory.item_main) or spider_item.get_inventory(defines.inventory.car_trunk) + local reserve_item_stacks = { + "construction-robot", + "logistic-chest-storage", + "roboport", + } + local take_item_stacks = { + "construction-robot", + "logistic-chest-storage", + "roboport", + "substation", + mod_prefix .. "pylon-substation", + "solar-panel", + mod_prefix .. "space-solar-panel-1", + mod_prefix .. "space-solar-panel-2", + mod_prefix .. "space-solar-panel-3", + "accumulator", + "laser-turret", + } + if inventory then + Util.transfer_inventory_filters_direct(spider_item.get_inventory(defines.inventory.item_main), spider.get_inventory(defines.inventory.car_trunk)) + else -- item inv not supported yet? + local spider_inv = spider.get_inventory(defines.inventory.car_trunk) + for i, item in pairs(reserve_item_stacks) do + spider_inv.set_filter(i, item) + end + end + tick_task.launched_inventory.remove({name = spidertron_name, count = 1}) + for _, item in pairs(take_item_stacks) do + if tick_task.launched_contents[item] and tick_task.launched_contents[item] > 0 then + local remove = math.min(tick_task.launched_contents[item], 50) + tick_task.launched_contents[item] = tick_task.launched_contents[item] - remove + tick_task.launched_inventory.remove({name = item, count = remove}) + spider.insert({name = item, count = remove}) + end + end + -- the auto-deconstruction is a problem for the spider, clear nearby deconstruction orders. + tick_task.spider = spider + break + end + end + end + + for i = 1, #tick_task.launched_inventory do + for j = 0, #tick_task.safe_pods do + local pod = tick_task.safe_pods[((i + j) % #tick_task.safe_pods) + 1] + local stack = tick_task.launched_inventory[i] + if pod and pod.cargo_entity and pod.cargo_entity.valid and stack and stack.valid and stack.valid_for_read and stack.count then + local inserted = pod.cargo_entity.insert(tick_task.launched_inventory[i]) + if inserted == stack.count then + tick_task.launched_inventory[i].clear() + else + tick_task.launched_inventory[i].count = stack.count - inserted + end + end + end + end + tick_task.launched_inventory.clear() + tick_task.launched_inventory.destroy() + tick_task.launched_inventory = nil + else -- legacy version + Log.trace("Distribute to pods safe_contents") + local i = 1 + for name, count in pairs(tick_task.safe_contents) do + local remaining = count + for _, pod in pairs(tick_task.safe_pods) do + if pod and pod.cargo_entity and pod.cargo_entity.valid and remaining >= 1 then + remaining = remaining - pod.cargo_entity.insert{name=name, count=remaining} + end + end + end + end + + for _, pod in pairs(tick_task.safe_pods) do + -- HERE + if pod and pod.cargo_entity and pod.cargo_entity.valid and not tick_task.spider then + pod.cargo_entity.order_deconstruction(tick_task.force_name) + end + end + + if tick_task.launching_to_destination.attempted_landing_pad and tick_task.launching_to_destination.attempted_landing_pad.valid then + tick_task.launching_to_destination.attempted_landing_pad.container.insert{name = Capsule.name_space_capsule, count = 1} +-- tick_task.launching_to_destination.attempted_landing_pad.container.force.item_production_statistics.on_flow(Capsule.name_space_capsule, 1) + tick_task.capsule.destroy() + + if tick_task.capsule_light and tick_task.capsule_light.valid then + tick_task.capsule_light.destroy() + end + + if tick_task.capsule_shadow and tick_task.capsule_shadow.valid then + tick_task.capsule_shadow.destroy() + end + end + + end + + if tick_task.passengers then + for _, passenger in pairs(tick_task.passengers) do + if passenger and passenger.valid then + teleport_non_colliding(passenger, capsule_target_pos) + passenger.destructible = true + if passenger.player then + local playerdata = get_make_playerdata(passenger.player) + playerdata.zero_velocity = true + passenger.player.print({"space-exploration.respawn-if-stranded"}) + end + if remote.interfaces["jetpack"] and remote.interfaces["jetpack"]["unblock_jetpack"] then + remote.call("jetpack", "unblock_jetpack", {character=passenger}) -- last otherwise the teleport breacks the chatacter reference + end + end + end + end + + if tick_task.capsule and tick_task.capsule.valid then tick_task.capsule.destructible = false end + tick_task.launched_contents = nil + if tick_task.launched_inventory and tick_task.launched_inventory.valid then + tick_task.launched_inventory.destroy() + end + tick_task.launched_inventory = nil + tick_task.safe_contents = nil + + tick_task.valid = false -- close tick task + end + end + + end + +end + +function Launchpad.on_player_driving_changed_state(event) + local player = game.players[event.player_index] + if player then + if player.vehicle and player.vehicle.name == Launchpad.name_rocket_launch_pad_seat then + + if player.character then + remote.call("jetpack", "stop_jetpack_immediate", {character = player.character}) + end + + local armor_inv = player.get_inventory(defines.inventory.character_armor) + if not(armor_inv and armor_inv[1] and armor_inv[1].valid_for_read and Util.table_contains(name_thruster_suits, armor_inv[1].name)) then + player.print({"space-exploration.launch-suit-warning"}) + end + + local launch_pad_entity = player.surface.find_entities_filtered{ + limit = 1, + area = util.position_to_area(util.vectors_add(player.position, {x = 0, y = -5}), 5), + name = Launchpad.name_rocket_launch_pad + }[1] + if launch_pad_entity then + LaunchpadGUI.gui_open(player, Launchpad.from_entity(launch_pad_entity)) + end + end + end +end +Event.addListener(defines.events.on_player_driving_changed_state, Launchpad.on_player_driving_changed_state) + +--- Creates the composite entity when the laund pad is made +--- Does not handle clone_area in any acceptable manner +--- (it doesn't listen to on_cloned and even if it did it +--- would start duplicated entities) +--- TODO: maybe make it support cloning by get_make the entities +--- instead of making them every time +---@param event any +function Launchpad.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + + if not entity then return end + if entity.name == Launchpad.name_rocket_launch_pad then + local force_name = entity.force.name + + local zone = Zone.from_surface(entity.surface) + + if not zone then + return cancel_entity_creation(entity, event.player_index, "Invalid launch pad location") + end + + local default_name = zone.name + local default_destination_zone = zone + if zone.orbit then + default_destination_zone = zone.orbit + elseif zone.parent and zone.parent.type ~= "star" then + default_destination_zone = zone.parent + end + local struct = { + type = Launchpad.name_rocket_launch_pad, + valid = true, + force_name = force_name, + unit_number = entity.unit_number, + container = entity, + name = default_name, + rocket_sections = 0, + crew_capsules = 0, + launch_trigger = "none", + lua_fuel = 0, + total_fuel = 0, + zone = zone, + destination = { + zone = default_destination_zone + }, + launch_status = -1 + } + + global.rocket_launch_pads[entity.unit_number] = struct + Log.trace("Launchpad: launch_pad added") + + Launchpad.name(struct) -- assigns to zone_assets + + Launchpad.add_section_input(struct) + -- spawn combinator + struct.combinator = entity.surface.create_entity{ + name = Launchpad.name_rocket_launch_pad_combinator, + force = entity.force, + position = {entity.position.x, entity.position.y}} + entity.connect_neighbour({wire = defines.wire_type.red, target_entity = struct.combinator}) + entity.connect_neighbour({wire = defines.wire_type.green, target_entity = struct.combinator}) + struct.combinator.destructible = false + + -- spawn silo + struct.silo = entity.surface.create_entity{ + name = Launchpad.name_rocket_launch_pad_silo, + force = entity.force, + position = {entity.position.x, entity.position.y + 1/32}} -- 1 px down to be in front of container + struct.silo.destructible = false + + + -- spawn storage tank + struct.tank = entity.surface.create_entity{ + name = Launchpad.name_rocket_launch_pad_tank, + force = entity.force, + position = {entity.position.x, entity.position.y + 1}} -- 1 tile down to be in front of silo + struct.tank.fluidbox.set_filter(1, {name = name_fluid_rocket_fuel, force = true}) + entity.connect_neighbour({wire = defines.wire_type.red, target_entity = struct.tank}) + entity.connect_neighbour({wire = defines.wire_type.green, target_entity = struct.tank}) + struct.tank.destructible = false + + struct.seats = {} + -- spawn passenger seats + for i = -2, 2, 1 do + local seat = entity.surface.create_entity{ + name = Launchpad.name_rocket_launch_pad_seat, + force = entity.force, + position = {entity.position.x + i, entity.position.y + 5.9}} + seat.destructible = false + table.insert(struct.seats, seat) + end + + -- set settings + if event.tags then + if event.tags.name then + Launchpad.rename(struct, event.tags.name) + end + struct.launch_trigger = event.tags.launch_trigger + if event.tags.zone_name then + struct.destination.zone = Zone.from_name(event.tags.zone_name) + else + struct.destination.zone = nil + end + if event.tags.landing_pad_name then + struct.destination.landing_pad_name = event.tags.landing_pad_name + end + end + + if event.player_index and game.players[event.player_index] and game.players[event.player_index].connected then + LaunchpadGUI.gui_open(game.players[event.player_index], struct) + end + end +end +Event.addListener(defines.events.on_built_entity, Launchpad.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, Launchpad.on_entity_created) +Event.addListener(defines.events.script_raised_built, Launchpad.on_entity_created) +Event.addListener(defines.events.script_raised_revive, Launchpad.on_entity_created) + +function Launchpad.get_struct_type_table(struct) + local zone_assets = Zone.get_force_assets(struct.force_name, struct.zone.index) + if struct.type == Launchpad.name_rocket_launch_pad then + zone_assets.rocket_launch_pad_names = zone_assets.rocket_launch_pad_names or {} + return zone_assets.rocket_launch_pad_names + end +end + +function Launchpad.remove_struct_from_table(struct) + local type_table = Launchpad.get_struct_type_table(struct) + if not type_table[struct.name] then return end + type_table[struct.name][struct.unit_number] = nil + local count_remaining = 0 + for _, remaining in pairs(type_table[struct.name]) do + count_remaining = count_remaining + 1 + end + if count_remaining == 0 then + type_table[struct.name] = nil + end +end + +function Launchpad.destroy_sub(struct, key) + if struct[key] and struct[key].valid then + struct[key].destroy() + struct[key] = nil + end +end + +function Launchpad.destroy(struct, player_index) + if not struct then + Log.trace("struct_destroy: no struct") + return + end + + struct.valid = false + + local capsules = struct.crew_capsules or 0 + local sections = struct.rocket_sections or 0 + + if player_index then + local player = game.players[player_index] + if player and player.connected then + if capsules > 0 then + local inserted = player.insert{name = Capsule.name_space_capsule, count = capsules} + capsules = capsules - inserted + end + if sections > 0 then + local inserted = player.insert{name = Launchpad.name_rocket_section, count = sections} + sections = sections - inserted + end + end + end + + if struct.container and struct.container.valid then + + local position = struct.container.position + local surface = struct.container.surface + + if capsules > 0 then + surface.spill_item_stack(position, {name = Capsule.name_space_capsule, count = capsules}, true, struct.container.force, false) + end + + if sections > 0 then + surface.spill_item_stack(position, {name = Launchpad.name_rocket_section, count = sections}, true, struct.container.force, false) + end + end + + Launchpad.destroy_sub(struct, 'container') + Launchpad.destroy_sub(struct, 'section_input') + Launchpad.destroy_sub(struct, 'tank') + Launchpad.destroy_sub(struct, 'silo') + Launchpad.destroy_sub(struct, 'combinator') + for _, seat in pairs(struct.seats or {}) do + if seat and seat.valid then seat.destroy() end + end + struct.seats = nil + Launchpad.remove_struct_from_table(struct) + global.rocket_launch_pads[struct.unit_number] = nil + + -- if a player has this gui open then close it + local gui_name = LaunchpadGUI.name_rocket_launch_pad_gui_root + for _, player in pairs(game.connected_players) do + local root = player.gui.relative[gui_name] + if root and root.tags and root.tags.unit_number == struct.unit_number then + root.destroy() + end + end +end + +function Launchpad.name(struct, new_name) + struct.name = (new_name or struct.name) + local type_table = Launchpad.get_struct_type_table(struct) + type_table[struct.name] = type_table[struct.name] or {} + type_table[struct.name][struct.unit_number] = struct +end + +function Launchpad.rename(struct, new_name) + local old_name = struct.name + Launchpad.remove_struct_from_table(struct) + Launchpad.name(struct, new_name) +end + +function Launchpad.on_entity_removed(event) + local entity = event.entity + if entity and entity.valid and entity.name == Launchpad.name_rocket_launch_pad then + Launchpad.destroy(Launchpad.from_entity(entity), event.player_index ) + end +end +Event.addListener(defines.events.on_entity_died, Launchpad.on_entity_removed) +Event.addListener(defines.events.on_robot_mined_entity, Launchpad.on_entity_removed) +Event.addListener(defines.events.on_player_mined_entity, Launchpad.on_entity_removed) +Event.addListener(defines.events.script_raised_destroy, Launchpad.on_entity_removed) + +function Launchpad.on_tick(struct) + -- handle launchpads + for _, struct in pairs(global.rocket_launch_pads) do + if (struct.launch_status and struct.launch_status > 0) or (game.tick + struct.unit_number) % 60 == 0 then + Launchpad.tick(struct) + end + end + + -- update guis + if game.tick % 60 == 0 then + for _, player in pairs(game.connected_players) do + LaunchpadGUI.gui_update(player) + end + end +end +Event.addListener(defines.events.on_tick, Launchpad.on_tick) + +--- Handles the player creating a blueprint by setting tags to store the state of launch pads +---@param event any +function Launchpad.on_player_setup_blueprint(event) + local player_index = event.player_index + if player_index and game.players[player_index] and game.players[player_index].connected then + local player = game.players[player_index] + + -- this setup code and checks is a workaround for the fact that the event doesn't specify the blueprint on the event + -- and the player.blueprint_to_setup isn't actually set in the case of copy/paste or blueprint library or select new contents + local blueprint = nil + if player and player.blueprint_to_setup and player.blueprint_to_setup.valid_for_read then blueprint = player.blueprint_to_setup + elseif player and player.cursor_stack.valid_for_read and player.cursor_stack.is_blueprint then blueprint = player.cursor_stack end + if blueprint and blueprint.is_blueprint_setup() then + + + local mapping = event.mapping.get() + local blueprint_entities = blueprint.get_blueprint_entities() + if blueprint_entities then + for _, blueprint_entity in pairs(blueprint_entities) do + if blueprint_entity.name == Launchpad.name_rocket_launch_pad then + local entity = mapping[blueprint_entity.entity_number] + if entity then + local launch_pad = Launchpad.from_entity(entity) + if launch_pad then + local tags = {} + tags.name = launch_pad.name + tags.launch_trigger = launch_pad.launch_trigger + if launch_pad.destination.zone then + tags.zone_name = launch_pad.destination.zone.name + end + if launch_pad.destination.landing_pad_name then + tags.landing_pad_name = launch_pad.destination.landing_pad_name + end + blueprint.set_blueprint_entity_tags(blueprint_entity.entity_number, tags) + end + end + end + end + end + end + end +end +Event.addListener(defines.events.on_player_setup_blueprint, Launchpad.on_player_setup_blueprint) + + +--- Handles the player copy/pasting settings between launch pads +---@param event any +function Launchpad.on_entity_settings_pasted(event) + local player_index = event.player_index + if player_index and game.players[player_index] and game.players[player_index].connected + and event.source and event.source.valid and event.destination and event.destination.valid then + if not (event.source.name == Launchpad.name_rocket_launch_pad) then return end + if not (event.destination.name == Launchpad.name_rocket_launch_pad) then return end + local player = game.players[player_index] + local launch_pad_from = Launchpad.from_entity(event.source) + local launch_pad_to = Launchpad.from_entity(event.destination) + if launch_pad_from and launch_pad_to then + -- actual settings copy + Launchpad.rename(launch_pad_to, launch_pad_from.name) + launch_pad_to.launch_trigger = launch_pad_from.launch_trigger + launch_pad_to.destination.zone = launch_pad_from.destination.zone + launch_pad_to.destination.landing_pad_name = launch_pad_from.destination.landing_pad_name + end + end +end +Event.addListener(defines.events.on_entity_settings_pasted, Launchpad.on_entity_settings_pasted) + +function Launchpad.on_init(event) + global.rocket_launch_pads = {} +end +Event.addListener("on_init", Launchpad.on_init, true) + +return Launchpad diff --git a/space-exploration_0.5.58/space-exploration/scripts/lifesupport.lua b/space-exploration_0.5.58/space-exploration/scripts/lifesupport.lua new file mode 100644 index 0000000..f540618 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/lifesupport.lua @@ -0,0 +1,412 @@ +local Lifesupport = {} +--[[ +Lifesupport mechanics: +Consume lifesupport canisters for food & air + +Equiment boosts the lifesupport drain efficiency, stacks additivly. +All thruster suits have some base level life support efficiency, 1 module is built-in. + +Non-thruster suits can have modules added but only function on land and efficiency banafits are halved. Only useful on hostile planets. +A spacesuit proper spacesuit is required in space. + +]] + +Lifesupport.name_gui_root = mod_prefix.."lifesupport" +Lifesupport.name_window_close = "close_lifesupport" +Lifesupport.name_sound_used_canister = mod_prefix .. "canister-breath" + +Lifesupport.lifesupport_refil_threshold = 50 +Lifesupport.lifesupport_bar_max = 150 +Lifesupport.lifesupport_per_second = 1 -- at 100% hazard (space) +Lifesupport.tick_interval = 240 +Lifesupport.check_inventory_interval = Lifesupport.tick_interval * 4 + +Lifesupport.min_effective_efficiency = 0.25 -- acts as damage multiplier +Lifesupport.spacesuit_base_efficiency = 1 +Lifesupport.non_spacesuit_base_efficiency = 0 +Lifesupport.non_spacesuit_efficiency_multiplier = 0.5 + +Lifesupport.lifesupport_canisters = { + { + name = mod_prefix .. "lifesupport-canister", + used = mod_prefix .. "used-lifesupport-canister", + lifesupport = 100 + } +} + +Lifesupport.lifesupport_equipment = { + [mod_prefix .. "lifesupport-equipment-1"] = {efficiency = 1}, + [mod_prefix .. "lifesupport-equipment-2"] = {efficiency = 2}, + [mod_prefix .. "lifesupport-equipment-3"] = {efficiency = 4}, + [mod_prefix .. "lifesupport-equipment-4"] = {efficiency = 8}, +} + +--[[ + playerdata.user_opened_armor_gui -> flag that says user has armor gui open and we show life support gui + playerdata.environment_hostile -> flag for hostile environment where air is used up + playerdata.suit_thrust_bonused -> flag for thruster suit giving bonuses to thrusters +]] + +function Lifesupport.get_gui(player) + return player.gui.left[Lifesupport.name_gui_root] +end + +function Lifesupport.check_inventory_reserve_lifesupport(player) + local playerdata = get_make_playerdata(player) + local character = player_get_character(player) + if not character then + playerdata.reserve_lifesupport = 0 + return + end + playerdata.reserve_lifesupport = 0 + local inventory = character.get_main_inventory() + if inventory and inventory.valid then + for _, lifesupport_canister in pairs(Lifesupport.lifesupport_canisters) do + playerdata.reserve_lifesupport = playerdata.reserve_lifesupport + inventory.get_item_count(lifesupport_canister.name) * lifesupport_canister.lifesupport + end + end +end + +function Lifesupport.get_current_hazard(player) + local playerdata = get_make_playerdata(player) + local character = player_get_character(player) + if not character then + playerdata.lifesupport_environment = "unknown" + return 0 + end + local position = Util.position_to_tile(character.position) + local zone = Zone.from_surface(character.surface) + local spaceship = (zone and zone.type == "spaceship") and zone or nil + + local hazard = 0 + if character.vehicle then + hazard = 0 + else + if not zone then + -- vaults? + hazard = 0 + playerdata.lifesupport_environment = "unknown" + elseif spaceship then + if spaceship.known_tiles + and spaceship.known_tiles[position.x] and spaceship.known_tiles[position.x][position.y] + and (spaceship.known_tiles[position.x][position.y] == Spaceship.tile_status.floor_interior + or spaceship.known_tiles[position.x][position.y] == Spaceship.tile_status.floor_console_connected + or spaceship.known_tiles[position.x][position.y] == Spaceship.tile_status.wall_console_connected + or spaceship.known_tiles[position.x][position.y] == Spaceship.tile_status.bulkhead_console_connected) then + hazard = 0 + playerdata.lifesupport_environment = "spaceship-interior" + else + hazard = 1 + playerdata.lifesupport_environment = "space" + end + else + local tile = character.surface.get_tile(Util.position_to_tile(character.position)) + if tile and tile.valid and Util.table_contains(Spaceship.names_spaceship_floors, tile.name) then + hazard = 0 + playerdata.lifesupport_environment = "spaceship-interior" + elseif Zone.is_space(zone) then + hazard = 1 + playerdata.lifesupport_environment = "space" + else + hazard = 0 + if zone.plague_used then + hazard = 1 + if zone.type == "moon" then + playerdata.lifesupport_environment = "plague-moon" + else + playerdata.lifesupport_environment = "plague-planet" + end + else + -- land + -- TODO: Get habitability from zone data. hazard factors: desert, hot, cold, uranium, high aux. + if zone.type == "moon" then + playerdata.lifesupport_environment = "moon" + else + playerdata.lifesupport_environment = "planet" + end + end + end + end + end + return hazard + +end + +function Lifesupport.update_lifesupport_efficiency(player) + local character = player_get_character(player) + if not character then return end + local playerdata = get_make_playerdata(player) + + playerdata.lifesupport_efficiency = 0 + playerdata.has_spacesuit = false + + local armor_inv = character.get_inventory(defines.inventory.character_armor) + if armor_inv and armor_inv[1] and armor_inv[1].valid_for_read then + if util.table_contains(name_thruster_suits, armor_inv[1].name) then + playerdata.lifesupport_efficiency = Lifesupport.spacesuit_base_efficiency + playerdata.has_spacesuit = true + end + + -- get lifesupport equipment modules + local grid_efficiency = 0 + if character.grid then + for name, count in pairs(character.grid.get_contents()) do + if Lifesupport.lifesupport_equipment[name] ~= nil then + grid_efficiency = grid_efficiency + count * (Lifesupport.lifesupport_equipment[name].efficiency or 0) + end + end + end + playerdata.lifesupport_efficiency = playerdata.lifesupport_efficiency + grid_efficiency + end + + if not playerdata.has_spacesuit then + playerdata.lifesupport_efficiency = playerdata.lifesupport_efficiency / 2 + end + + return playerdata.lifesupport_efficiency +end + + +function Lifesupport.on_tick(event) + for _, player in pairs(game.connected_players) do + if game.tick % Lifesupport.tick_interval == 0 then + Lifesupport.consume_lifesupport(player) + end + if Lifesupport.get_gui(player) then + Lifesupport.gui_update(player, playerdata) + end + end +end +Event.addListener(defines.events.on_tick, Lifesupport.on_tick) + + +function Lifesupport.consume_lifesupport(player) + local playerdata = get_make_playerdata(player) + local character = player_get_character(player) + if not character then return end + local hazard = Lifesupport.get_current_hazard(player) + if hazard > 0 then + --Lifesupport.gui_open(player) + Lifesupport.update_lifesupport_efficiency(player) -- saves to playerdata.lifesupport_efficiency + local efficiency = playerdata.lifesupport_efficiency + if efficiency > 0 and not playerdata.has_spacesuit then + local zone = Zone.from_surface(character.surface) + if Zone.is_space(zone) then + efficiency = 0 + end + end + local effective_efficiency = math.max(efficiency, Lifesupport.min_effective_efficiency) + local hazard_use_rate_per_s = Lifesupport.lifesupport_per_second * Lifesupport.get_current_hazard(player) + local effective_use_rate_per_s = hazard_use_rate_per_s / effective_efficiency + local effective_use_per_interval = Lifesupport.tick_interval * effective_use_rate_per_s / 60 + if efficiency > 0 then + -- consume lifesupport + playerdata.lifesupport = (playerdata.lifesupport or 0) - effective_use_per_interval + if playerdata.lifesupport < Lifesupport.lifesupport_refil_threshold then + Lifesupport.consume_canister(player, playerdata, character) + end + if playerdata.lifesupport < 0 then + Lifesupport.damage_character(player, playerdata, character, -playerdata.lifesupport) + playerdata.lifesupport = 0 + end + else + -- lifesupport is not funcitioning. Even if there is a lifesupport buffer it won't do anything (eg: non-space suit in space.) + Lifesupport.damage_character(player, playerdata, character, effective_use_per_interval) + end + elseif playerdata.lifesupport == nil or playerdata.lifesupport < Lifesupport.lifesupport_refil_threshold then + Lifesupport.consume_canister(player, playerdata, character) + end +end + +function Lifesupport.consume_canister(player, playerdata, character) + local inventory = character.get_main_inventory() + if inventory and inventory.valid then + for _, lifesupport_canister in pairs(Lifesupport.lifesupport_canisters) do + local count = inventory.get_item_count(lifesupport_canister.name) + if count > 0 then + inventory.remove({name=lifesupport_canister.name, count=1}) + inventory.insert({name=lifesupport_canister.used, count=1}) + playerdata.lifesupport = (playerdata.lifesupport or 0) + lifesupport_canister.lifesupport + player.play_sound { path = Lifesupport.name_sound_used_canister } + return + end + end + end +end + +function Lifesupport.damage_character(player, playerdata, character, damage) + -- half damage direct to character + if damage > character.health then + player.print({"space-exploration.suffocating-warning"}, {r = 1, g = 0, b = 0, a = 0}) + character.die("neutral") + Lifesupport.gui_close(player) + return + end + + local shield_damage = 0 + if character.grid then + shield_damage = character.grid.shield + end + character.damage(damage + shield_damage, "neutral", "suffocation") + player.print({"space-exploration.suffocating-warning"}, {r = 1, g = 0, b = 0, a = 0}) +end + +function Lifesupport.on_equipment_changed(event) + local player = game.players[event.player_index] + local character = player_get_character(player) + if not character then return end + Lifesupport.update_lifesupport_efficiency(player) +end +Event.addListener(defines.events.on_player_placed_equipment, Lifesupport.on_equipment_changed) +Event.addListener(defines.events.on_player_removed_equipment, Lifesupport.on_equipment_changed) + +function Lifesupport.on_armor_changed(event) + local player = game.players[event.player_index] + local character = player_get_character(player) + if not character then return end + Lifesupport.update_lifesupport_efficiency(player) + local playerdata = get_make_playerdata(player) + if playerdata.lifesupport_efficiency and playerdata.lifesupport_efficiency > 0 then + Lifesupport.gui_open(player, playerdata) + end +end +Event.addListener(defines.events.on_player_armor_inventory_changed, Lifesupport.on_armor_changed) + +function Lifesupport.on_gui_opened(event) + local player = game.players[event.player_index] + if event.gui_type == defines.gui_type.item and event.item and event.item.type == "armor" and event.item.grid then + Lifesupport.update_lifesupport_efficiency(player) + local character = player_get_character(player) + if not character then return end + local playerdata = get_make_playerdata(player) + if playerdata.lifesupport_efficiency and playerdata.lifesupport_efficiency > 0 then + Lifesupport.gui_open(player, playerdata) + end + end +end +Event.addListener(defines.events.on_gui_opened, Lifesupport.on_gui_opened) +--[[ +function Lifesupport.on_gui_closed(event) + local player = game.players[event.player_index] + + if event.gui_type == defines.gui_type.item then + Lifesupport.gui_close(player, playerdata) + end + +end +Event.addListener(defines.events.on_gui_closed, Lifesupport.on_gui_closed) +]]-- + +function Lifesupport.gui_open(player) + if settings.get_player_settings(player)["se-never-show-lifesupport"].value then + return + end + local gui = Lifesupport.get_gui(player) + if not gui then + local root = player.gui.left.add{ + type = "frame", + name = Lifesupport.name_gui_root, + direction = "vertical", + } + + local title_table = root.add{type="table", name="title_table", column_count=2, draw_horizontal_lines=false} + title_table.style.horizontally_stretchable = true + title_table.style.column_alignments[1] = "left" + title_table.style.column_alignments[2] = "right" + + local title_frame = title_table.add{type="frame", name="title_frame", caption = {"space-exploration.lifesupport_title"}, style="informatron_title_frame"} + title_frame.style.right_padding = -5 + + local right_flow = title_table.add{type="flow", name="title_flow_right"} + --local close = right_flow.add{type="button", name=Lifesupport.name_window_close, caption="✖", style="informatron_close_button"} + local close = right_flow.add{type="sprite-button", name=Lifesupport.name_window_close, sprite = "utility/close_white", style="informatron_close_button"} + close.style.width = 28 + close.style.height = 28 + + root.add { type = "label", name = "lifesupport_environment" } + root.add { type = "label", name = "lifesupport_efficiency" } + local bar = root.add { type = "progressbar", name="lifesupport_bar", size = 100, value = 0, style = "space_platform_progressbar_fuel" } + bar.style.color = {r=70/255, g=171/255, b=1} + root.add { type = "label", name = "lifesupport_suit" } + root.add { type = "label", name = "lifesupport_reserves" } + bar.style.horizontally_stretchable = true + end +end + +function Lifesupport.gui_close(player) + local gui = Lifesupport.get_gui(player) + if gui then gui.destroy() end +end + +function Lifesupport.gui_update(player, playerdata) + local gui = Lifesupport.get_gui(player) + if not gui then return end + local character = player_get_character(player) + if not (gui and character) then Lifesupport.gui_close(player) return end + + local playerdata = get_make_playerdata(player) + Lifesupport.check_inventory_reserve_lifesupport(player) + local hazard = Lifesupport.get_current_hazard(player) + if not playerdata.lifesupport_efficiency then + Lifesupport.update_lifesupport_efficiency(player) + end + + if playerdata.has_spacesuit then + gui.lifesupport_efficiency.caption = {"space-exploration.lifesupport_efficiency_spacesuit", math.floor(playerdata.lifesupport_efficiency * 100) .. "%"} + else + gui.lifesupport_efficiency.caption = {"space-exploration.lifesupport_efficiency_no_spacesuit", math.floor(playerdata.lifesupport_efficiency * 100).. "%"} + end + + gui.lifesupport_bar.value = math.max(0, math.min(Lifesupport.lifesupport_bar_max, (playerdata.lifesupport or 0) / Lifesupport.lifesupport_bar_max)) + + + local efficiency = playerdata.lifesupport_efficiency + if efficiency > 0 and not playerdata.has_spacesuit then + local zone = Zone.from_surface(character.surface) + if zone and Zone.is_space(zone) then + efficiency = 0 + end + end + + local effective_efficiency = math.max(efficiency, Lifesupport.min_effective_efficiency) + local is_space_estimation = false + if hazard == 0 then + hazard = 1 + is_space_estimation = true + end + local hazard_use_rate_per_s = Lifesupport.lifesupport_per_second * hazard + local effective_use_rate_per_s = hazard_use_rate_per_s / effective_efficiency + + local lifesupport_suit_s = (playerdata.lifesupport or 0) / effective_use_rate_per_s + local lifesupport_duration = util.seconds_to_clock(lifesupport_suit_s) + + local lifesupport_reserve_s = (playerdata.reserve_lifesupport or 0) / effective_use_rate_per_s + local lifesupport_reserve_duration = util.seconds_to_clock(lifesupport_reserve_s) + + if is_space_estimation then + gui.lifesupport_suit.caption = { "space-exploration.lifesupport_suit_est", lifesupport_duration } + gui.lifesupport_reserves.caption = { "space-exploration.lifesupport_reserves_est", lifesupport_reserve_duration } + else + gui.lifesupport_suit.caption = { "space-exploration.lifesupport_suit", lifesupport_duration } + gui.lifesupport_reserves.caption = { "space-exploration.lifesupport_reserves", lifesupport_reserve_duration } + end + + gui.lifesupport_environment.caption = { "space-exploration.lifesupport_environment_"..playerdata.lifesupport_environment, canisters_per_hour, reserve_minutes } +end + +function Lifesupport.on_gui_click (event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + + root = gui_element_or_parent(element, Lifesupport.name_gui_root) + if root then + if element.name == Lifesupport.name_window_close then + Lifesupport.gui_close(player) + end + end +end +Event.addListener(defines.events.on_gui_click, Lifesupport.on_gui_click) + + +return Lifesupport diff --git a/space-exploration_0.5.58/space-exploration/scripts/linked-container.lua b/space-exploration_0.5.58/space-exploration/scripts/linked-container.lua new file mode 100644 index 0000000..e5e1ad6 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/linked-container.lua @@ -0,0 +1,162 @@ + +local LinkedContainer = {} + +function LinkedContainer.tint_from_int(int) + local hue = (int / 1.61803398875)%1 + local rgb = {} + rgb[1], rgb[2], rgb[3]= util.HSVToRGB(hue*360, 1, 0.5) + return rgb +end + +function LinkedContainer.on_entity_created(event, player_initiated) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + + if entity.type == "linked-container" then + + local link_id = entity.surface.index + 2 + local zone = Zone.from_surface(entity.surface) + + if zone and zone.type == "anomaly" then + link_id = (math.floor(game.tick / 3600) % 600) + 1 + end + + -- since the index of a spaceship surface is not consistent, allowing players + -- to put arcolinks on an in-transit spaceship lets them get arcolinks + -- with a link_id that they can no longer obtain anymore when the spaceship + -- lands and another surface takes that id + -- + -- to prevent this sadness, if the player or their robots try to initiate the placement of + -- an arcolink on an in-transit spaceship, we cancel the placement and display an informative message + -- + -- we must still allow scripts to place arcolinks on in-transit spaceships to allow for spaceship + -- launch/landing to work properly + if zone and zone.type == "spaceship" and player_initiated then + -- we can let the player have placed arcolinks be for the nearest surface if they're in docking range + local spaceship = Spaceship.from_own_surface_index(entity.surface.index) + if spaceship.near and spaceship.near.type == "zone" then + local nearby_zone = Zone.from_zone_index(spaceship.near.index) + local nearby_surface = Zone.get_make_surface(nearby_zone) + link_id = nearby_surface.index + 2 + else + return cancel_entity_creation(entity, event.player_index, {"space-exploration.construction-denied-linked-container-on-transient-surface"}) + end + end + + if not zone then + local vault = Ancient.vault_from_surface(entity.surface) + if vault then + link_id = 1 + end + end + + if event.link_id_override then + link_id = event.link_id_override + end + + local text_id = rendering.draw_text{ + text = link_id, + surface = entity.surface, + target = entity, + target_offset = {0, -0.75}, + color = {r=1,b=1,g=1}, + alignment = "center", + scale = 1, + only_in_alt_mode = true + } + local effect_id = rendering.draw_animation{ + animation = mod_prefix.."map-star-cloud", + surface = entity.surface, + target = entity, + target_offset = {0, -0.35}, + x_scale = 0.07, + y_scale = 0.055, + animation_speed = 1, + tint = LinkedContainer.tint_from_int(link_id) + } + + global.linked_containers = global.linked_containers or {} + global.linked_containers[entity.unit_number] = { + unit_number = entity.unit_number, + container = entity, + link_id = link_id, + text_id = text_id, + effect_id = effect_id + } + entity.link_id = link_id + end + +end + +function LinkedContainer.on_entity_created_player_cause(event) + return LinkedContainer.on_entity_created(event, true) +end +Event.addListener(defines.events.on_robot_built_entity, LinkedContainer.on_entity_created_player_cause) +Event.addListener(defines.events.on_built_entity, LinkedContainer.on_entity_created_player_cause) +function LinkedContainer.on_entity_created_nonplayer_cause(event) + return LinkedContainer.on_entity_created(event, false) +end +Event.addListener(defines.events.script_raised_built, LinkedContainer.on_entity_created_nonplayer_cause) +Event.addListener(defines.events.script_raised_revive, LinkedContainer.on_entity_created_nonplayer_cause) + +function LinkedContainer.on_entity_cloned(event) + if event.destination and event.destination.valid and event.destination.type == "linked-container" then + local link_id_override + if event.source and event.source.valid then + global.linked_containers = global.linked_containers or {} + if global.linked_containers[event.source.unit_number] then + link_id_override = global.linked_containers[event.source.unit_number].link_id + end + end + LinkedContainer.on_entity_created({entity = event.destination, link_id_override = link_id_override}) + end +end +Event.addListener(defines.events.on_entity_cloned, LinkedContainer.on_entity_cloned) + +function LinkedContainer.update() + if not global.linked_containers then return end + for unit_number, linked_container in pairs(global.linked_containers) do + if linked_container.container and linked_container.container.valid then + linked_container.container.link_id = linked_container.link_id + if not (linked_container.text_id and rendering.is_valid(linked_container.text_id)) then + linked_container.text_id = rendering.draw_text{ + text = linked_container.link_id, + surface = entity.surface, + target = entity, + target_offset = {0, -0.5}, + color = {r=1,b=1,g=1}, + alignment = "center", + scale = 1, + only_in_alt_mode = true + } + end + if not (linked_container.effect_id and rendering.is_valid(linked_container.effect_id)) then + linked_container.effect_id = rendering.draw_animation{ + animation = mod_prefix.."map-star-cloud", + surface = entity.surface, + target = entity, + target_offset = {0, -0.35}, + x_scale = 0.07, + y_scale = 0.055, + animation_speed = 1, + tint = LinkedContainer.tint_from_int(linked_container.link_id) + } + end + else + global.linked_containers[linked_container.unit_number] = nil + end + end +end + +function LinkedContainer.on_nth_tick_3600() + LinkedContainer.update() +end +Event.addListener("on_nth_tick_36000", LinkedContainer.on_nth_tick_36000) -- 10 minutes + +return LinkedContainer diff --git a/space-exploration_0.5.58/space-exploration/scripts/location.lua b/space-exploration_0.5.58/space-exploration/scripts/location.lua new file mode 100644 index 0000000..3dd6599 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/location.lua @@ -0,0 +1,148 @@ +Location = {} + +function Location.from_reference(location_reference) + if not location_reference then return nil end + if location_reference.type == "zone" then + return { + type = location_reference.type, + zone = Zone.from_zone_index(location_reference.index), + position = location_reference.position, + name = location_reference.name + } + end + if location_reference.type == "spaceship" then + local position = location_reference.position + local spaceship = Spaceship.from_index(location_reference.index) + if not spaceship then return nil end + local position = location_reference.position + if position and spaceship.console and spaceship.console.valid then + position = Util.vectors_add(location_reference.position, spaceship.console.position) + end + return { + type = location_reference.type, + zone = spaceship, + position = position, + name = location_reference.name + } + end + if location_reference.type == "system" then + return { + type = location_reference.type, + zone = Zone.from_zone_index(location_reference.index), + position = location_reference.position, + name = location_reference.name, + } + end + if location_reference.type == "interstellar" then + return { + type = location_reference.type, + position = location_reference.position, + name = location_reference.name, + } + end +end + +function Location.to_localised_string(location_reference) + if not location_reference then return nil end + local base + if location_reference.type == "interstellar" then + base = {"space-exploration.interstellar-map"} + else + local location = Location.from_reference(location_reference) + if not location then return nil end + if location.type == "system" then + base = { "space-exploration.solar-system", location.zone.name } + else + base = location.zone.name + end + end + if location_reference.name and location_reference.name ~= "" then + return { "space-exploration.remote-view-history-item_named", base, location_reference.name } + end + return base +end + +-- zone, spaceship, or starmap +function Location.new_reference_from_player(player) + if not player then return nil end + local zone = Zone.from_surface(player.surface) + if zone then + return Location.make_reference(zone, player.position) + end + -- maybe starmap + local playerdata = get_make_playerdata(player) + if playerdata.remote_view_active_map then + if playerdata.remote_view_active_map.type == "interstellar" then + return { + type = "interstellar", + position = player.position + } + elseif playerdata.remote_view_active_map.type == "system" then + zone = MapView.get_current_system(player) + return { + type = "system", + index = zone.index, + position = player.position + } + end + end +end + +-- zone or spaceship, +function Location.make_reference(zone, position, name) + if not zone then return nil end + local location_reference = {index = zone.index, position = position, name = name} + if zone.type == "spaceship" then + location_reference.type = "spaceship" + if position and zone.console and zone.console.valid then + location_reference.position = Util.vectors_delta(zone.console.position, position) + end + else + location_reference.type = "zone" + end + return location_reference +end + +function Location.update_reference_position(location_reference, zone, position) + if not location_reference then + location_reference = {} + end + if not zone then return nil end + location_reference.index = zone.index + location_reference.position = position + if zone.type == "spaceship" then + location_reference.type = "spaceship" + if position and zone.console and zone.console.valid then + location_reference.position = Util.vectors_delta(zone.console.position, position) + end + else + location_reference.type = "zone" + end + return location_reference +end + +function Location.update_reference_name(location_reference, name) + if not location_reference then + location_reference = {} + end + location_reference.name = name + return location_reference +end + +function Location.goto_reference(player, location_reference, freeze_history) + local location = Location.from_reference(location_reference) -- expand zone or spaceship connection + if not location then return end + if location_reference.type == "zone" or location_reference.type == "spaceship" then + RemoteView.start(player, location.zone, location.position, location.name, freeze_history) + elseif location_reference.type == "interstellar" then + MapView.start_interstellar_map(player, freeze_history) + if location_reference.position then + player.teleport(location_reference.position) + end + elseif location_reference.type == "system" then + MapView.start_system_map(player, location.zone, freeze_history) + player.teleport(location_reference.position) + end +end + +return Location diff --git a/space-exploration_0.5.58/space-exploration/scripts/log.lua b/space-exploration_0.5.58/space-exploration/scripts/log.lua new file mode 100644 index 0000000..75c672b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/log.lua @@ -0,0 +1,66 @@ +Log = {} + +Log.print_trace = is_debug_mode -- does trace() do game.print()? +Log.log_trace = is_debug_mode -- does trace() do log()? +Log.debug_logs = is_debug_mode -- does debug_log() do log()? +Log.debug_big_logs = is_debug_mode -- the big file oututs (astro) + +function Log.debug_log(message, rel) -- use rel to filter with Log.print_trace_filter[] later + if Log.debug_logs then log(message) end +end + +function Log.trace(message, tags) -- use rel to filter with Log.print_trace_filter[] later + if Log.log_trace then log(message) end + if Log.print_trace then game.print({"", "Debug: ", message}) end +end + +function Log.log_global() + game.write_file("space-exploration.global.lua", serpent.dump(global, {comment=false, sparse=true, indent = "\t", nocode=true, name="global"}), false) +end + +function Log.log_universe() + game.write_file("space-exploration.universe.lua", serpent.dump(global.universe, {comment=false, sparse=true, indent = "\t", nocode=true, name="universe"}), false) +end + +function Log.log_spaceships() + game.write_file("space-exploration.spaceships.lua", serpent.dump(global.spaceships, {comment=false, sparse=true, indent = "\t", nocode=true, name="spaceships"}), false) +end + +function Log.log_universe_simplified() + local string = "" + for s, star in pairs(global.universe.stars) do + string = string .. star.name .. " ("..star.stellar_position.x.." "..star.stellar_position.y..")\n" + for p, planet in pairs(star.children) do + if planet.orbit then + string = string .. star.name .. " > "..planet.name ..": ".. (planet.resources and Util.values_to_string(planet.resources) or "").. + ". Orbit: "..(planet.orbit.resources and Util.values_to_string(planet.orbit.resources) or "") .."\n" + else + string = string .. star.name .. " > "..planet.name ..": ".. (planet.resources and Util.values_to_string(planet.resources) or "") .."\n" + end + if planet.children then + for m, moon in pairs(planet.children) do + string = string .. star.name .. " > "..planet.name .. " > "..moon.name ..": ".. (moon.resources and Util.values_to_string(moon.resources) or "") .. + ". Orbit: "..(moon.orbit.resources and Util.values_to_string(moon.orbit.resources) or "") .."\n" + end + end + end + end + for z, zone in pairs(global.universe.space_zones) do + string = string .. zone.name .. " ("..zone.stellar_position.x.." "..zone.stellar_position.y..") "..(zone.resources and Util.values_to_string(zone.resources) or "").."\n" + end + game.write_file("space-exploration.universe_simplified.lua", string, false) +end + +function Log.log_forces() + game.write_file("space-exploration.forces.lua", serpent.dump(global.forces, {comment=false, sparse=true, indent = "\t", nocode=true, name="forces"}), false) +end + +function Log.log_map_gen() + local map_gens = {} + for surface_name, surface in pairs(game.surfaces) do + map_gens[surface_name] = surface.map_gen_settings + end + game.write_file("space-exploration.map_gen.lua", serpent.dump(map_gens, {comment=false, sparse=true, indent = "\t", nocode=true, name="map_gens"}), false) +end + +return Log diff --git a/space-exploration_0.5.58/space-exploration/scripts/map-view.lua b/space-exploration_0.5.58/space-exploration/scripts/map-view.lua new file mode 100644 index 0000000..3463f26 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/map-view.lua @@ -0,0 +1,1738 @@ +--[[ +Map View. + +Is allows user to take a look at universe maps. Requires RemoteView to work. +Interconnects with Zonelist too. + +Two maps are currently available: + Interstellar map + System map +]]-- + +local InterstellarMap = {} +local SystemMap = {} +local MapObjects = {} + +local MapView = { + InterstellarMap = InterstellarMap, + SystemMap = SystemMap, + MapObjects = MapObjects +} + +MapView.tech_spaceship = mod_prefix .. "spaceship" + +-- constants +MapView.name_surface_prefix = "starmap-" +MapView.name_gui_zone_details_root = mod_prefix.."map-view-zone-details" +MapView.name_gui_zone_title_table = mod_prefix.."map-view-zone-title-table" +MapView.name_details_root = "remote-view-details-root" +MapView.name_gui_zone_prefix = "zone_" +MapView.name_gui_spaceship_prefix = "spaceship_" + +MapView.name_toggles = "map_view_toggles" +MapView.name_button_show_resources = "show_resources" +MapView.name_button_show_stats = "show_stats" +MapView.name_button_show_anchor_info = "show_anchor_info" +MapView.name_button_overhead_interstellar = mod_prefix .. "overhead_interstellar" +MapView.name_setting_overhead_interstellar = mod_prefix .. "show-overhead-button-interstellar-map" + +MapView.name_clickable_interstellar_star = mod_prefix .. "interstellar-map-star" +MapView.name_clickable_interstellar_asteroid_field = mod_prefix .. "interstellar-map-asteroid-field" +MapView.name_clickable_interstellar_spaceship = mod_prefix .. "interstellar-map-spaceship" +MapView.name_clickable_system_star = mod_prefix .. "system-map-star" +MapView.name_clickable_system_planet_prefix = mod_prefix .. "system-map-planet" +MapView.name_clickable_system_moon_prefix = mod_prefix .. "system-map-moon" +MapView.name_clickable_system_asteroid_belt = mod_prefix .. "system-map-asteroid-belt" +MapView.name_clickable_system_spaceship = mod_prefix .. "system-map-spaceship" +MapView.name_clickable_system_interstellar_space = mod_prefix .. "system-map-interstellar-space" +MapView.clickable_steps = 20 -- the number of increments for clickable scale + + +MapView.interstellar_map = "interstellar" -- interstellar space +MapView.system_map = "system" -- planetary system + +InterstellarMap.scale = 1 +InterstellarMap.distance_scale = 0.25 * InterstellarMap.scale + +InterstellarMap.star_scale = InterstellarMap.scale +InterstellarMap.asteroid_scale = 0.25 * InterstellarMap.scale +InterstellarMap.spaceship_scale = 1 * InterstellarMap.scale + +InterstellarMap.infobox_scale = 1 * InterstellarMap.scale + +InterstellarMap.text_scale = 1 * InterstellarMap.scale +InterstellarMap.star_text_scale = 2.5 * InterstellarMap.text_scale +InterstellarMap.asteroid_field_text_scale = 2 * InterstellarMap.text_scale + +InterstellarMap.spaceship_text_scale = 0.5 * InterstellarMap.text_scale +InterstellarMap.spaceship_text_offset = Util.vector_multiply({ x = -0.2, y = -0.2}, InterstellarMap.spaceship_scale) + +-- update coefficients here to adjust solar system map scale and element sizes +-- NOTE: if you change graphics please adjust *_graphics_scale constants in RemoteView.render_solarmap_* functions first +SystemMap.scale = 1 +SystemMap.distance_scale = 12 * SystemMap.scale -- star gravity well scale +SystemMap.star_scale = 16 * SystemMap.scale +SystemMap.planet_scale = 4 * SystemMap.scale +SystemMap.planet_min_multiplier = 0.05 +SystemMap.belt_scale = 1 * SystemMap.scale +SystemMap.spaceship_scale = 0.4 * SystemMap.scale + +-- draw_line(width=) in pixels +-- draw_arc(min_radius,max_radius=) in tiles +-- these thickness constants are in tiles so you need to multiply it by 32 if used in draw_line() +SystemMap.line_thickness_scale = 0.08 * SystemMap.scale +SystemMap.arc_thickness_scale = 0.08 * SystemMap.scale +SystemMap.belt_arc_thickness_scale = 0.05 * SystemMap.scale +SystemMap.planet_offset = { x = 0, y = 0} +SystemMap.belt_offset = { x = 2, y = 0} + +SystemMap.infobox_scale = 1 * SystemMap.scale +SystemMap.infobox_gradient_tint = { r = 128, b = 128, g = 128, a = 255 } + +SystemMap.text_scale = 4 * SystemMap.scale +SystemMap.star_text_scale = 1.2 * SystemMap.text_scale +SystemMap.planet_text_scale = 1 * SystemMap.text_scale +SystemMap.orbit_text_scale = 0.8 * SystemMap.text_scale +SystemMap.belt_text_scale = 1 * SystemMap.text_scale +SystemMap.landed_spaceship_text_scale = 0.5 * SystemMap.text_scale + +SystemMap.spaceship_text_scale = 0.5 * SystemMap.text_scale + +SystemMap.star_text_offset = Util.vector_multiply({ x = 2, y = 0.5}, SystemMap.scale) +SystemMap.spaceship_text_offset = Util.vector_multiply({ x = -0.2, y = -0.2}, SystemMap.spaceship_scale) + + +function MapView.player_is_in_interstellar_map(player) + local playerdata = get_make_playerdata(player) + if playerdata.remote_view_active_map and playerdata.remote_view_active_map.type == "interstellar" then + return true + end + return false +end + +function MapView.get_current_system(player) + local playerdata = get_make_playerdata(player) + if playerdata.remote_view_active_map and playerdata.remote_view_active_map.type == MapView.system_map then + return playerdata.remote_view_active_map.zone + end + return nil +end + +function MapView.gui_get_element_name_from_zone(zone) + if zone.type == "spaceship" then + return MapView.name_gui_spaceship_prefix .. zone.index + else + return MapView.name_gui_zone_prefix .. zone.index + end +end + +function MapView.gui_get_zone_from_element(root) + if root then + local zone_index = util.parse_with_prefix(root.name, MapView.name_gui_zone_prefix) + if zone_index then + return Zone.from_zone_index(tonumber(zone_index)) + end + local spaceship_index = util.parse_with_prefix(root.name, MapView.name_gui_spaceship_prefix) + if spaceship_index then + return Spaceship.from_index(tonumber(spaceship_index)) + end + end +end + + + +function MapView.get_surface_name(player) + return MapView.name_surface_prefix .. player.index +end + +function MapView.get_make_surface(player) + local surface_name = MapView.get_surface_name(player) + + if not game.surfaces[surface_name] then + local mapgen_settings = { + autoplace_controls = { + ["planet-size"] = { frequency = 1/1000, size = 1 } + } + } + mapgen_settings.autoplace_settings={ + ["decorative"]={ + treat_missing_as_default=false, + settings={ + } + }, + ["entity"]={ + treat_missing_as_default=false, + settings={ + } + }, + ["tile"]={ + treat_missing_as_default=false, + settings={ + ["se-space"]={} + } + }, + } + mapgen_settings.property_expression_names = {} + mapgen_settings.property_expression_names["tile:out-of-map:probability"] = math.huge + local surface = game.create_surface(surface_name, mapgen_settings) + surface.daytime = 0 + surface.freeze_daytime = true + surface.show_clouds = false + end + + return game.surfaces[surface_name] +end + +function MapView.start_interstellar_map(player, freeze_history) + if not freeze_history then + RemoteView.add_history(player, Location.new_reference_from_player(player)) + end + MapView.internal_start_map(player, { + type = MapView.interstellar_map + }) + MapView.update_overhead_button(player.index) + if not freeze_history then + RemoteView.add_history(player, Location.new_reference_from_player(player)) + end +end + +function MapView.start_system_map(player, star, freeze_history) + if not freeze_history then + RemoteView.add_history(player, Location.new_reference_from_player(player)) + end + if (not star) or star.type ~= "star" then + -- fallback if star is invalid + MapView.start_interstellar_map(player) + return + end + + MapView.internal_start_map(player, { + type = MapView.system_map, + zone = star + }) + if not freeze_history then + RemoteView.add_history(player, Location.new_reference_from_player(player)) + end +end + +function MapView.internal_start_map(player, map_data) + local playerdata = get_make_playerdata(player) + -- need to preserve it as RemoteView.start() clears it + local previous_current_zone = playerdata.remote_view_current_zone + local previous_active_map = playerdata.remote_view_active_map + + RemoteView.start(player, nil, nil, nil, true) + if player.character or not(playerdata.remote_view_active) then return end -- failed + + local from_zone + if previous_active_map and previous_active_map.zone then + from_zone = previous_active_map.zone + else + from_zone = previous_current_zone or Zone.from_surface(player.surface) + end + + MapView.stop_map(player) + playerdata.remote_view_active_map = map_data + playerdata.map_view_objects = {} + playerdata.map_view_entities = {} + + local map_type = map_data.type + if map_type == MapView.interstellar_map then + InterstellarMap.start(player, from_zone) + InterstellarMap.render(player) + elseif map_type == MapView.system_map then + SystemMap.start(player, map_data.zone, from_zone) + SystemMap.render(player, map_data.zone) + end + + RemoteView.gui_update(player) +end + +function MapView.stop_map (player) + local playerdata = get_make_playerdata(player) + playerdata.remote_view_active_map = nil + + MapView.clear_map(player) + MapView.gui_close(player) +end + +function MapView.clear_map(player) + -- delete the starmap graphics for this player + local playerdata = get_make_playerdata(player) + if playerdata.map_view_objects then + for _, object_id in pairs(playerdata.map_view_objects) do + rendering.destroy(object_id) + end + end + playerdata.map_view_objects = nil + + local surface = game.surfaces[MapView.get_surface_name(player)] + if surface then + for _, entity in pairs(surface.find_entities_filtered{}) do + entity.destroy() + end + end + playerdata.map_view_entities = nil +end + + + +--[[ + + INTERSTELLAR MAP + +]]-- + +function InterstellarMap.start(player, from_zone) + local start_stellar_position = {x = 0, y = 0} + if from_zone then + start_stellar_position = Zone.get_stellar_position(from_zone) + end + local surface = MapView.get_make_surface(player) + player.teleport(InterstellarMap.get_zone_position({stellar_position = start_stellar_position}), surface) + player.zoom = 0.5 +end + +function InterstellarMap.render(player) + local surface = MapView.get_make_surface(player) + local playerdata = get_make_playerdata(player) + local spaceships = InterstellarMap.get_spaceship_index(player) + + for _, star in pairs(global.universe.stars) do + InterstellarMap.render_star(player, surface, star, playerdata, spaceships.bound) + end + for _, zone in pairs(global.universe.space_zones) do + if Zone.is_visible_to_force(zone, player.force.name) then + InterstellarMap.render_asteroid_field(player, surface, zone, playerdata, spaceships.bound) + end + end + + for _, spaceship in pairs(spaceships.flying) do + InterstellarMap.render_spaceship(player, surface, spaceship, playerdata) + end + +end + +function InterstellarMap.get_zone_position(zone) + return Util.vector_multiply(zone.stellar_position, InterstellarMap.distance_scale) +end + +function InterstellarMap.get_spaceship_index(player) + local flying = {} + local bound = {} + for _, spaceship in pairs(global.spaceships) do + if spaceship.force_name == player.force.name then + if spaceship.space_distortion < 0.05 then + if spaceship.near_stellar_object then + bound[spaceship.near_stellar_object.index] = bound[spaceship.near_stellar_object.index] or {} + table.insert(bound[spaceship.near_stellar_object.index], spaceship) + else + table.insert(flying, spaceship) + end + end + end + end + + return {flying = flying, bound = bound} +end + +function InterstellarMap.render_star(player, surface, star, playerdata, spaceships) + local map_object = MapObjects.create(player, surface, + star, MapView.name_clickable_interstellar_star, + InterstellarMap.get_zone_position(star)) + map_object.command = "system" + + local object_id = rendering.draw_sprite{ + sprite = mod_prefix.."map-star", + surface = surface, + target = map_object.entity, + players = {player}, + x_scale = 0.1 * InterstellarMap.star_scale, + y_scale = 0.1 * InterstellarMap.star_scale, + render_layer = "decals",--28, -- just above decals + } + table.insert(playerdata.map_view_objects, object_id) + local object_id = rendering.draw_animation{ + animation = mod_prefix.."map-star-cloud", + surface = surface, + target = map_object.entity, + players = {player}, + x_scale = 0.1 * InterstellarMap.star_scale, + y_scale = 0.1 * InterstellarMap.star_scale, + animation_speed = -1, + tint = {r=255/255, g=100/255, b=5/255} + } + table.insert(playerdata.map_view_objects, object_id) + + MapView.render_zone_caption(player, map_object, star, spaceships) +end + +function InterstellarMap.render_asteroid_field(player, surface, zone, playerdata, spaceships) + local map_object = MapObjects.create(player, surface, + zone, MapView.name_clickable_interstellar_asteroid_field, + InterstellarMap.get_zone_position(zone)) + map_object.command = "details" + + local object_id = rendering.draw_sprite{ + sprite = "virtual-signal.se-asteroid-field", + surface = surface, + target = map_object.entity, + x_scale = 4 * InterstellarMap.asteroid_scale, + y_scale = 4 * InterstellarMap.asteroid_scale, + orientation = -0.375, + players = {player} + } + table.insert(playerdata.map_view_objects, object_id) + + MapView.render_zone_caption(player, map_object, zone, spaceships) +end + +function InterstellarMap.render_spaceship(player, surface, spaceship, playerdata) + local map_object = MapObjects.create(player, surface, + spaceship, MapView.name_clickable_interstellar_spaceship, + InterstellarMap.get_zone_position(spaceship)) + map_object.command = "details" + + local object_id = rendering.draw_sprite{ + sprite = mod_prefix.."map-spaceship", + surface = surface, + target = map_object.entity, + orientation = MapView.get_spaceship_orientation(player, spaceship), + x_scale = 0.0625 * InterstellarMap.spaceship_scale, + y_scale = 0.0625 * InterstellarMap.spaceship_scale, + players = {player}, + } + table.insert(playerdata.map_view_objects, object_id) + map_object.main_objects = {object_id} + + MapView.render_spaceship_caption(player, map_object, spaceship, nil) +end + +--[[ + + SYSTEM MAP + +]]-- + +function SystemMap.start(player, star, from_zone) + local start_solar_position = { x = 0, y = 0 } + if from_zone then + local star_stellar_position = star.stellar_position + local from_zone_stellar_position = Zone.get_stellar_position(from_zone) + if from_zone_stellar_position.x == star_stellar_position.x and from_zone_stellar_position.y == star_stellar_position.y then + start_solar_position = SystemMap.get_zone_position(star, from_zone) + end + end + + local surface = MapView.get_make_surface(player) + player.teleport(start_solar_position, surface) + player.zoom = 0.4 +end + +function SystemMap.render(player, star) + local surface = MapView.get_make_surface(player) + local playerdata = get_make_playerdata(player) + local spaceships = SystemMap.get_spaceship_index(player, star) + + -- horizontal line showing the star gravity well + local object_id = rendering.draw_line{ + color = {r=128, g=128, b=128, a=255}, + width = 32 * SystemMap.line_thickness_scale, + from = SystemMap.get_zone_position(star, { + star_gravity_well = star.star_gravity_well, + planet_gravity_well = Zone.get_planet_gravity_well(star.orbit) + }), + to = SystemMap.get_zone_position(star, { star_gravity_well = 0}), + surface = surface, + players = {player}, + draw_on_ground = true + } + table.insert(playerdata.map_view_objects, object_id) + + SystemMap.render_star(player, surface, star, playerdata, spaceships.bound) + + for _, planet_or_belt in pairs(star.children) do + if Zone.is_visible_to_force(planet_or_belt, player.force.name) then + if planet_or_belt.type == "planet" then + local position_data = SystemMap.get_zone_position_data(star, planet_or_belt) + local solar_distance = position_data.y + * SystemMap.distance_scale + local object_id = rendering.draw_arc{ + color = {r=128, g=128, b=128, a=255}, + max_radius = (solar_distance + 0.5 * SystemMap.arc_thickness_scale), + min_radius = (solar_distance - 0.5 * SystemMap.arc_thickness_scale), + start_angle = 0.5 * Util.pi - 2 * Util.pi * position_data.orientation, + angle = 2 * Util.pi * position_data.orientation, + target = {x=0, y=0}, + surface = surface, + players = {player}, + draw_on_ground = true + } + table.insert(playerdata.map_view_objects, object_id) + + SystemMap.render_planet_or_moon(player, surface, star, planet_or_belt, playerdata, spaceships.bound) + + for _, moon in pairs(planet_or_belt.children) do + SystemMap.render_planet_or_moon(player, surface, star, moon, playerdata, spaceships.bound) + end + + elseif planet_or_belt.type == "asteroid-belt" then + local position_data = SystemMap.get_zone_position_data(star, planet_or_belt) + local solar_distance = position_data.y + * SystemMap.distance_scale + for i = 1, 36 do + local object_id = rendering.draw_arc{ + color = {r=16, g=16, b=16, a=16}, + max_radius = (solar_distance + 2 * SystemMap.belt_arc_thickness_scale), + min_radius = (solar_distance - 2 * SystemMap.belt_arc_thickness_scale), + start_angle = (i - 1) / 36 * 2 * Util.pi, + angle = (0.9) / 36 * 2 * Util.pi, + target = {x=0, y=0}, + surface = surface, + players = {player}, + draw_on_ground = true + } + table.insert(playerdata.map_view_objects, object_id) + local object_id = rendering.draw_arc{ + color = {r=32, g=32, b=32, a=32}, + max_radius = (solar_distance + SystemMap.belt_arc_thickness_scale), + min_radius = (solar_distance - SystemMap.belt_arc_thickness_scale), + start_angle = (i - 1 + 0.01) / 36 * 2 * Util.pi, + angle = (0.9 - 2 * 0.01) / 36 * 2 * Util.pi, + target = {x=0, y=0}, + surface = surface, + players = {player}, + draw_on_ground = true + } + table.insert(playerdata.map_view_objects, object_id) + end + + SystemMap.render_asteroid_belt(player, surface, star, planet_or_belt, playerdata, spaceships.bound) + end + end + end + + for _, spaceship in pairs(spaceships.flying) do + SystemMap.render_spaceship(player, surface, star, spaceship, playerdata) + end + + SystemMap.render_interstellar_space(player, surface, star, playerdata) + +end + +function SystemMap.get_rendered_star_size(star) + local star_size = star.star_gravity_well / 26 -- 26 seems to be around max star_gravity_well + return star_size * SystemMap.star_scale +end + +function SystemMap.get_zone_position_data(star, zone) + -- zone may be just a table { star_gravity_well = ..., planet_gravity_well = ... } + if zone and zone.type == "orbit" then + zone = zone.parent + end + local position_data = { + y = (SystemMap.get_rendered_star_size(star) + SystemMap.star_text_offset.x) + / SystemMap.distance_scale + + star.star_gravity_well - zone.star_gravity_well, + x = 0, + orientation = 0 + } + if zone.planet_gravity_well and zone.planet_gravity_well > 0 then + position_data.x = zone.planet_gravity_well * Zone.travel_cost_planet_gravity / Zone.travel_cost_star_gravity + position_data.orientation = position_data.y and (position_data.x / (2 * Util.pi * position_data.y)) or 0 + end + + return position_data +end + +function SystemMap.get_zone_position(star, zone) + local position_data = SystemMap.get_zone_position_data(star, zone) + + return Util.vector_multiply( + Util.rotate_vector(- position_data.orientation, + {x = 0, y = position_data.y} + ), + SystemMap.distance_scale) +end + +function SystemMap.get_spaceship_index(player, star) + local flying = {} + local bound = {} + for _, spaceship in pairs(global.spaceships) do + if spaceship.force_name == player.force.name then + if spaceship.space_distortion < 0.05 then + if spaceship.near_stellar_object and spaceship.near_stellar_object.index == star.index then + if spaceship.zone_index then + bound[spaceship.zone_index] = bound[spaceship.zone_index] or {} + table.insert(bound[spaceship.zone_index], spaceship) + else + table.insert(flying, spaceship) + end + end + end + end + end + + return {flying = flying, bound = bound} +end + +function SystemMap.render_star(player, surface, star, playerdata, spaceships) + local star_rendered_size = SystemMap.get_rendered_star_size(star) + + local map_object = MapObjects.create(player, surface, + star, MapView.name_clickable_system_star, { x = 0, y = 0}) + map_object.command = "details" + + local star_graphics_scale = 1 / 8 -- update if changing sprite + local object_id = rendering.draw_sprite{ + sprite = mod_prefix.."map-star", -- update star_graphics_scale above if you change it + surface = surface, + target = map_object.entity, + players = {player}, + x_scale = star_graphics_scale * star_rendered_size, + y_scale = star_graphics_scale * star_rendered_size, + render_layer = "decals"-- 28, -- just above decals + } + table.insert(playerdata.map_view_objects, object_id) + local object_id = rendering.draw_animation{ + animation = mod_prefix.."map-star-cloud", + surface = surface, + target = map_object.entity, + players = {player}, + x_scale = star_graphics_scale * star_rendered_size, + y_scale = star_graphics_scale * star_rendered_size, + animation_speed = -1, + tint = {r=255/255, g=100/255, b=5/255} + } + table.insert(playerdata.map_view_objects, object_id) + + MapView.render_zone_caption(player, map_object, star, spaceships) +end + +function SystemMap.render_planet_or_moon(player, surface, star, zone, playerdata, spaceships) + if Zone.is_visible_to_force(zone, player.force.name) then + local zone_size = zone.radius / Universe.planet_max_radius -- 0..1 + local zone_rendered_size = (SystemMap.planet_min_multiplier + (1 - SystemMap.planet_min_multiplier) * zone_size) * SystemMap.planet_scale + local solar_position = SystemMap.get_zone_position(star, zone) + solar_position = Util.vectors_add(solar_position, SystemMap.planet_offset) + + local entity_name_prefix = MapView.name_clickable_system_planet_prefix + if zone.type == "moon" then + entity_name_prefix = MapView.name_clickable_system_moon_prefix + end + local entity_name_suffix = "-"..math.ceil(MapView.clickable_steps * zone.radius / Universe.planet_max_radius) + + local map_object = MapObjects.create(player, surface, + zone, entity_name_prefix .. entity_name_suffix, solar_position) + map_object.command = "details" + + local planet_graphics_scale = 1 / 8 -- update if changing sprite + local base_render_layer = 133 + + local object_id = rendering.draw_sprite{ -- black out the star orbit like to make planets stand out more + sprite = mod_prefix.."map-planet", + surface = surface, + target = map_object.entity, + players = {player}, + x_scale = planet_graphics_scale * zone_rendered_size + 0.01 * SystemMap.planet_scale, + y_scale = planet_graphics_scale * zone_rendered_size + 0.01 * SystemMap.planet_scale, + render_layer = "higher-object-under", -- base_render_layer-1, + tint = {r=0,b=0,g=0,a=1} + } + table.insert(playerdata.map_view_objects, object_id) + + local tint = {r=1, b=1, g=1} + if (not zone.tags) or (Util.table_contains(zone.tags, "aux_very_low") or Util.table_contains(zone.tags, "aux_low")) then + tint = {r=1, b=0.8, g=0.9} + end + if zone.tags and (Util.table_contains(zone.tags, "aux_very_high") or Util.table_contains(zone.tags, "aux_high")) then + tint = {r=1, b=1, g=0.9} + end + local object_id = rendering.draw_sprite{ + sprite = mod_prefix.."map-planet", + surface = surface, + target = map_object.entity, + players = {player}, + x_scale = planet_graphics_scale * zone_rendered_size, + y_scale = planet_graphics_scale * zone_rendered_size, + render_layer = "higher-object-above",--base_render_layer, + tint = tint + } + table.insert(playerdata.map_view_objects, object_id) + + if not (zone.tags and Util.table_contains(zone.tags, "moisture_none")) then + local tint = {r=1, b=1, g=1} + if (not zone.tags) or (Util.table_contains(zone.tags, "aux_very_low") or Util.table_contains(zone.tags, "aux_low")) then + tint = {r=0.5, b=0.5, g=1} + end + if zone.tags and (Util.table_contains(zone.tags, "aux_very_high") or Util.table_contains(zone.tags, "aux_high")) then + tint = {r=1, b=1, g=0.5} + end + local object_id = rendering.draw_sprite{ + sprite = mod_prefix.."map-planet-detail", + surface = surface, + target = map_object.entity, + players = {player}, + x_scale = planet_graphics_scale * zone_rendered_size, + y_scale = planet_graphics_scale * zone_rendered_size, + render_layer = "item-in-inserter-hand", --base_render_layer + 1, + tint = tint + } + table.insert(playerdata.map_view_objects, object_id) + end + + if not (zone.tags and Util.table_contains(zone.tags, "water_none")) then + local object_id = rendering.draw_sprite{ + sprite = mod_prefix.."map-planet-water", + surface = surface, + target = map_object.entity, + players = {player}, + x_scale = planet_graphics_scale * zone_rendered_size, + y_scale = planet_graphics_scale * zone_rendered_size, + render_layer = "wires",--base_render_layer + 2 + } + table.insert(playerdata.map_view_objects, object_id) + end + + local object_id = rendering.draw_sprite{ + sprite = mod_prefix.."map-planet-cloud-ice", + surface = surface, + target = map_object.entity, + players = {player}, + x_scale = planet_graphics_scale * zone_rendered_size, + y_scale = planet_graphics_scale * zone_rendered_size, + render_layer = "wires-above",--base_render_layer + 3 + } + table.insert(playerdata.map_view_objects, object_id) + + local tint = {r = 0, g = 0.5, b = 1} + -- TODO: try to estimate average temperature and do a smooth transition from blue to red based on that. + -- for now just make a few key values specific colors + if zone.tags and Util.table_contains(zone.tags, "temperature_volcanic") then tint = {r = 1, g = 0, b = 0} end + if zone.tags and Util.table_contains(zone.tags, "temperature_very_hot") then tint = {r = 1, g = 0.2, b = 0} end + if zone.tags and Util.table_contains(zone.tags, "temperature_hot") then tint = {r = 1, g = 0.6, b = 0} end + if zone.tags and Util.table_contains(zone.tags, "temperature_frozen") then tint = {r = 0, g = 0.2, b = 1} end + local haze = 0.5 -- darken + if zone.tags and Util.table_contains(zone.tags, "moisture_none") then haze = 0 end + if zone.tags and Util.table_contains(zone.tags, "moisture_low") then haze = 0.1 end + if zone.tags and Util.table_contains(zone.tags, "moisture_med") then haze = 0.3 end + if zone.tags and Util.table_contains(zone.tags, "moisture_high") then haze = 0.5 end + if zone.tags and Util.table_contains(zone.tags, "moisture_max") then haze = 1 end + if haze > 0 then + for k, v in pairs(tint) do tint[k] = v * 0.5 end -- darken + local object_id = rendering.draw_sprite{ + sprite = mod_prefix.."map-planet-haze", + surface = surface, + target = map_object.entity, + players = {player}, + x_scale = planet_graphics_scale * zone_rendered_size, + y_scale = planet_graphics_scale * zone_rendered_size, + render_layer = "entity-info-icon",--base_render_layer + 4, + tint = tint + } + table.insert(playerdata.map_view_objects, object_id) + end + + if haze > 0 then + tint = {r = 1, g = 1, b = 1} + for k, v in pairs(tint) do tint[k] = v * 0.5 end -- darken + local object_id = rendering.draw_sprite{ + sprite = mod_prefix.."map-planet-atmosphere", + surface = surface, + target = map_object.entity, + players = {player}, + x_scale = planet_graphics_scale * zone_rendered_size, + y_scale = planet_graphics_scale * zone_rendered_size, + render_layer = "entity-info-icon-above",--base_render_layer + 5, + tint = tint + } + table.insert(playerdata.map_view_objects, object_id) + end + + MapView.render_zone_caption(player, map_object, zone, spaceships) + end +end + +function SystemMap.render_asteroid_belt(player, surface, star, belt, playerdata, spaceships) + if Zone.is_visible_to_force(belt, player.force.name) then + local solar_position = SystemMap.get_zone_position(star, belt) + solar_position = Util.vectors_add(solar_position, SystemMap.belt_offset) + + local map_object = MapObjects.create(player, surface, + belt, MapView.name_clickable_system_asteroid_belt, solar_position) + map_object.command = "details" + + local belt_graphics_scale = 2 + local object_id = rendering.draw_sprite{ + sprite = "virtual-signal.se-asteroid-belt", + surface = surface, + target = map_object.entity, + x_scale = belt_graphics_scale * SystemMap.belt_scale, + y_scale = belt_graphics_scale * SystemMap.belt_scale, + players = {player} + } + table.insert(playerdata.map_view_objects, object_id) + + MapView.render_zone_caption(player, map_object, belt, spaceships) + end +end + +function SystemMap.render_spaceship(player, surface, star, spaceship, playerdata) + local solar_position = SystemMap.get_zone_position(star, spaceship) + + local map_object = MapObjects.create(player, surface, + spaceship, MapView.name_clickable_system_spaceship, solar_position) + map_object.command = "details" + + local spaceship_graphics_scale = 1 / 4 + local object_id = rendering.draw_sprite{ + sprite = mod_prefix.."map-spaceship", + surface = surface, + target = map_object.entity, + orientation = MapView.get_spaceship_orientation(player, spaceship), + x_scale = spaceship_graphics_scale * SystemMap.spaceship_scale, + y_scale = spaceship_graphics_scale * SystemMap.spaceship_scale, + players = {player} + } + table.insert(playerdata.map_view_objects, object_id) + map_object.main_objects = {object_id} + + MapView.render_spaceship_caption(player, map_object, spaceship, nil) +end + +function SystemMap.render_interstellar_space(player, surface, star, playerdata) + local solar_position = SystemMap.get_zone_position(star, { + star_gravity_well = -0.5 + }) + + local map_object = MapObjects.create(player, surface, + "interstellar-space", MapView.name_clickable_system_interstellar_space, solar_position) + map_object.command = "interstellar" + + + local starmap_graphics_scale = 1 / 8 + table.insert(playerdata.map_view_objects, + rendering.draw_sprite { + sprite = mod_prefix .. "map-starmap", -- update star_graphics_scale above if you change it + surface = surface, + target = map_object.entity, + players = { player }, + x_scale = starmap_graphics_scale * map_object.entity.prototype.selection_box.right_bottom.y, + y_scale = starmap_graphics_scale * map_object.entity.prototype.selection_box.right_bottom.y, + render_layer = "decals",--28, -- just above decals + }) + + local text_size = 3 + table.insert(playerdata.map_view_objects, + rendering.draw_text { + text = { "space-exploration.interstellar-map" }, + surface = surface, + target = map_object.entity, + target_offset = { x = 0, y = map_object.entity.prototype.selection_box.right_bottom.y }, + alignment = "center", + players = { player }, + color = { r = 224, g = 224, b = 224, a = 255 }, + scale = text_size, + scale_with_zoom = false + }) + +end + +-- ZONE MAP POSITIONING -- +function MapView.get_zone_position(playerdata, zone) + local map_type = playerdata and playerdata.remote_view_active_map and playerdata.remote_view_active_map.type or MapView.interstellar_map + + if map_type == MapView.interstellar_map then + return InterstellarMap.get_zone_position(zone) + elseif map_type == MapView.system_map then + return SystemMap.get_zone_position(playerdata.remote_view_active_map.zone, zone) + end +end + +--[[ + + ZONE CAPTIONS + +]]-- + +function MapView.draw_gradient_line(line_props) + line_props = table.deepcopy(line_props) + + local line_vector = util.vectors_delta(line_props.from_offset, line_props.to_offset) + local line_length = util.vectors_delta_length(line_props.from_offset, line_props.to_offset) + + -- gradient constants, gradient is oriented downwards + local gradient_width = 4 + local gradient_height = 512 + + line_props = table.deepcopy(line_props) + + line_props.sprite = mod_prefix .. "gradient-sprite" + line_props.target = line_props.from + line_props.target_offset = util.lerp_vectors(line_props.from_offset, line_props.to_offset, 0.5) + line_props.x_scale = line_props.width / gradient_width + line_props.y_scale = 32 * line_length / gradient_height + line_props.orientation = 0.75 + util.vector_to_orientation(line_vector) + line_props.tint = line_props.color + + return rendering.draw_sprite(line_props) +end + + +function MapView.get_zone_info(player, zone, infobox_flags, spaceship_index, clamp_index) + local playerdata = get_make_playerdata(player) + local force_name = player.force.name + + local zone_info = {} + + if infobox_flags.show_stats then + local info_line = {} + local threat = Zone.get_threat(zone) + + local priority = Zone.get_priority(zone, force_name) + local priority_color = Zonelist.name_color_priority_neutral + if priority > 0 then + priority_color = Zonelist.name_color_priority_positive + elseif priority < 0 then + priority_color = Zonelist.name_color_priority_negative + end + table.insert(info_line, { + sprite = "virtual-signal/se-accolade", + text = priority, + text_color = priority_color + }) + if threat > 0 then + table.insert(info_line, { + sprite = "virtual-signal/se-death", + sprite_tint = {r = 255, g = 32, b = 32}, + text = string.format("%.0f", Zone.get_threat(zone)*100).."%", + text_length = 4 + }) + end + + table.insert(info_line, { + sprite = "item/solar-panel", + text = string.format("%.0f", Zone.get_display_light_percent(zone) * 100).."%", + text_length = 5 + }) + + if Zone.is_solid(zone) and not (zone.tags and Util.table_contains(zone.tags, "water_none")) then + table.insert(info_line, { + sprite = "fluid/water" + }) + end + + if playerdata.visited_zone and playerdata.visited_zone[zone.index] then + table.insert(info_line, { + sprite = "entity/character" + }) + end + if global.forces[force_name].zone_assets and global.forces[force_name].zone_assets[zone.index] and table_size(global.forces[force_name].zone_assets[zone.index].rocket_launch_pad_names) > 0 then + table.insert(info_line, { + sprite = "entity/"..Launchpad.name_rocket_launch_pad + }) + end + if global.forces[force_name].zone_assets and global.forces[force_name].zone_assets[zone.index] and table_size(global.forces[force_name].zone_assets[zone.index].rocket_landing_pad_names) > 0 then + table.insert(info_line, { + sprite = "entity/"..Landingpad.name_rocket_landing_pad + }) + end + if playerdata.track_glyphs and (zone.glyph ~= nil) then + table.insert(info_line, { + sprite = "entity/se-pyramid-a" + }) + end + if zone.interburbulator or zone.ruins then + table.insert(info_line, { + sprite = "virtual-signal/se-ruin" + }) + end + table.insert(zone_info, info_line) + end + + if infobox_flags.show_anchor_info then + --local clamps_line = {} + --local clamps_here = clamps_index and clamps_index[zone.index] or {} + --table.insert(clamps_line, { + -- sprite = "item/se-spaceship-clamp", + -- text = { "space-exploration.remote-view-clamps", #clamps_here}, + -- text_color = #clamps_here > 0 and { r=255, g=255, b=255, a=196 } or { r=96, g=96, b=96, a=96 } + --}) + --table.insert(zone_info, clamps_line) + + local spaceships_line = {} + local spaceships_here = spaceship_index and spaceship_index[zone.index] or {} + local spaceships_text + local spaceships_text_color = { r=0, g=255, b=255, a=196 } + local spaceships_string_key = "space-exploration.remote-view-spaceships-anchored" + if zone.type == "star" and playerdata.remote_view_active_map and playerdata.remote_view_active_map.type == MapView.interstellar_map then + spaceships_string_key = "space-exploration.remote-view-spaceships" + end + if #spaceships_here > 0 then + spaceships_text = spaceships_here[1].name + if #spaceships_here > 1 then + spaceships_text = { spaceships_string_key, #spaceships_here} + end + else + spaceships_text = { spaceships_string_key, 0} + spaceships_text_color = { r=96, g=96, b=96, a=96 } + end + table.insert(spaceships_line, { + sprite = "virtual-signal/se-spaceship", + text = spaceships_text, + text_color = spaceships_text_color + }) + table.insert(zone_info, spaceships_line) + end + + return zone_info +end + +function MapView.render_zone_info(player, map_object, object_ids, cursor, scale, zone, infobox_flags, spaceship_index, clamp_index) + local icon_offset = {x = 0.25 * scale, y = 0.325 * scale} + local icon_size = {x = 0.6 * scale, y = 0} + + for _, info_row in pairs(MapView.get_zone_info(player, zone, infobox_flags, spaceship_index, clamp_index)) do + local line_cursor = table.deepcopy(cursor) + for _, info_item in pairs(info_row) do + table.insert(object_ids, + rendering.draw_sprite({ + surface = map_object.entity.surface, + target = map_object.entity, + players = {player}, + + tint = info_item.sprite_tint, + target_offset = util.vectors_add(line_cursor, icon_offset), + sprite = info_item.sprite, + x_scale = scale / 2, + y_scale = scale / 2, + }) + ) + line_cursor = util.vectors_add(line_cursor, icon_size) + + if info_item.text then + table.insert(object_ids, + rendering.draw_text({ + surface = map_object.entity.surface, + target = map_object.entity, + players = {player}, + + target_offset = line_cursor, + text = info_item.text, + color = info_item.text_color or {r = 255, b = 255, g = 255, a = 255}, + scale_with_zoom = false, + scale = scale, + }) + ) + line_cursor.x = line_cursor.x + (info_item.text_length and (0.3 + 0.16 * info_item.text_length) or 0.5) * scale + end + end + cursor.y = cursor.y + 0.6 * scale + end +end + +function MapView.render_zone_resources(player, map_object, object_ids, cursor, scale, zone, max_resources) + max_resources = max_resources or 7 + local icon_offset_left = {x = -0.25 * scale, y = 0.325 * scale} + local icon_size_left = {x = -0.6 * scale, y = 0} + + local fsrs = {} + local max_fsr = 0 + for resource_name, resource_settings in pairs(global.resources_and_controls.resource_settings) do + if zone.controls[resource_name] then + local fsr = Universe.estimate_resource_fsr(zone.controls[resource_name]) + if fsr > 0 then + max_fsr = math.max(max_fsr, fsr) + table.insert(fsrs, {name=resource_name, fsr=fsr}) + end + end + end + table.sort(fsrs, function(a,b) return a.fsr > b.fsr end) + local mapgen + if zone.surface_index then mapgen = Zone.get_make_surface(zone).map_gen_settings end + + for i = 1, math.min(#fsrs, max_resources), 1 do + local resource_name = fsrs[i].name + local percent = math.pow(fsrs[i].fsr/max_fsr, 1/3) + + local line_cursor = table.deepcopy(cursor) + table.insert(object_ids, + rendering.draw_sprite({ + surface = map_object.entity.surface, + target = map_object.entity, + players = {player}, + + target_offset = util.vectors_add(line_cursor, icon_offset_left), + sprite = "entity/"..resource_name, + x_scale = scale / 2, + y_scale = scale / 2, + }) + ) + line_cursor = util.vectors_add(line_cursor, icon_size_left) + + local percent_text = string.format("%.0f", percent * 100) + local percent_color = percent == 1 and {r = 255, b = 255, g = 255, a = 255} or {r = 128, b = 128, g = 128, a = 255} + table.insert(object_ids, + rendering.draw_text({ + surface = map_object.entity.surface, + target = map_object.entity, + players = {player}, + + target_offset = line_cursor, + text = percent_text, + color = percent_color, + scale_with_zoom = false, + alignment = "right", + scale = scale, + }) + ) + cursor.y = cursor.y + 0.65 * scale + + end +end + +function MapView.render_zone_caption(player, map_object, zone, spaceship_index) + if not Zone.is_visible_to_force(zone, player.force.name) then return end + + for _, object_id in pairs(map_object.text_objects or {}) do + rendering.destroy(object_id) + end + local object_ids = {} + map_object.text_objects = object_ids + + local infobox_flags = table.deepcopy(MapView.get_settings(player)) + + local playerdata = get_make_playerdata(player) + local map_type = playerdata.remote_view_active_map and playerdata.remote_view_active_map.type + + local scale = map_type == MapView.interstellar_map and InterstellarMap.infobox_scale or SystemMap.infobox_scale + local main_cursor = { x = 0, y = map_object.entity.prototype.selection_box.right_bottom.x} + local cursor + + local name_alignment = "center" -- center/left + local name_color = {r = 192, b = 192, g = 192, a = 192} + local name_size = scale + local short = zone.type == "star" or not zone.orbit + + if map_type == MapView.interstellar_map then + if zone.type == "star" then + name_color = {r=255, g=128, b=0, a=255} + name_size = InterstellarMap.star_text_scale + infobox_flags.show_resources = false + infobox_flags.show_stats = false + elseif zone.type == "asteroid-field" then + name_color = {r=255, g=255, b=255, a=160} + name_size = InterstellarMap.asteroid_field_text_scale + end + elseif map_type == MapView.system_map then + if zone.type == "star" then + name_color = {r=255, g=128, b=0, a=255} + name_size = SystemMap.star_text_scale + name_alignment = "left" + main_cursor = util.vectors_add(main_cursor, { x = 3 * scale, y = 2 * scale}) + infobox_flags.show_resources = false + elseif zone.type == "planet" then + name_color = {r=255, g=255, b=255, a=224} + name_size = SystemMap.planet_text_scale + elseif zone.type == "moon" then + name_color = {r=255, g=255, b=255, a=224} + name_size = SystemMap.planet_text_scale + elseif zone.type == "asteroid-belt" then + name_color = {r=255, g=255, b=255, a=128} + name_size = SystemMap.belt_text_scale + name_alignment = "left" + main_cursor = util.vectors_add(main_cursor, { x = 1 * scale, y = 0}) + end + end + + -- NAME AND LINES + if name_alignment == "center" then + table.insert(object_ids, + rendering.draw_text({ + surface = map_object.entity.surface, + target = map_object.entity, + players = {player}, + + target_offset = main_cursor, + text = zone.name, + color = name_color, + scale_with_zoom = false, + alignment = "center", + scale = name_size, + }) + ) + elseif name_alignment == "left" then + table.insert(object_ids, + rendering.draw_text({ + surface = map_object.entity.surface, + target = map_object.entity, + players = {player}, + + target_offset = util.vectors_add(main_cursor, { x=-1.7 * scale, y=0}), + text = zone.name, + color = name_color, + scale_with_zoom = false, + alignment = "left", + scale = name_size, + }) + ) + end + + if not (infobox_flags.show_resources or infobox_flags.show_stats or infobox_flags.show_anchor_info) then + return + end + + main_cursor.y = main_cursor.y + 0.5 * name_size + 0.2 * scale + local horiz_line_cursor = table.deepcopy(main_cursor) + + table.insert(object_ids, + MapView.draw_gradient_line({ + surface = map_object.entity.surface, + from = map_object.entity, + to = map_object.entity, + players = { player }, + + from_offset = main_cursor, + to_offset = util.vectors_add(main_cursor, { x = 2 * scale, y = 0 }), + color = SystemMap.infobox_gradient_tint, + width = 2 * scale, + })) + table.insert(object_ids, + MapView.draw_gradient_line({ + surface = map_object.entity.surface, + from = map_object.entity, + to = map_object.entity, + players = { player }, + + from_offset = main_cursor, + to_offset = util.vectors_add(main_cursor, { x = -2 * scale, y = 0 }), + color = SystemMap.infobox_gradient_tint, + width = 2 * scale, + })) + main_cursor.y = main_cursor.y + 0.1 * scale + + cursor = util.vectors_add(main_cursor, { x=0.3 * scale, y=0.1 * scale}) + + if infobox_flags.show_stats or infobox_flags.show_anchor_info then + local body_info_shown = false + local show_orbit_info = true + -- BODY INFO + if zone.type == "star" then + if map_type == MapView.interstellar_map then + show_orbit_info = false + MapView.render_zone_info(player, map_object, object_ids, cursor, scale, zone, { show_anchor_info = true }, spaceship_index) + end + else + MapView.render_zone_info(player, map_object, object_ids, cursor, scale, zone, infobox_flags, spaceship_index) + body_info_shown = true + end + + if show_orbit_info and zone.orbit then + -- ORBIT HEADER + + if body_info_shown then + cursor.y = cursor.y + 0.25 * scale + + table.insert(object_ids, + MapView.draw_gradient_line({ + surface = map_object.entity.surface, + from = map_object.entity, + to = map_object.entity, + players = { player }, + + from_offset = util.vectors_add(cursor, { x = -0.3 * scale, y = 0 }), + to_offset = util.vectors_add(cursor, { x = 3.5 * scale, y = 0 }), + color = SystemMap.infobox_gradient_tint, + width = 2 * scale, + })) + cursor.y = cursor.y + 0.15 * scale + end + + table.insert(object_ids, + rendering.draw_text({ + surface = map_object.entity.surface, + target = map_object.entity, + players = {player}, + + target_offset = cursor, + text = "Orbit", + color = {r = 128, b = 128, g = 128, a = 255}, + scale_with_zoom = false, + scale = scale, + }) + ) + cursor.y = cursor.y + 0.6 * scale + + -- ORBIT INFO + + MapView.render_zone_info(player, map_object, object_ids, cursor, scale, zone.orbit, infobox_flags, spaceship_index) + + end + + end + + local right_side_y = cursor.y + + + -- RESOURCES + cursor = util.vectors_add(main_cursor, { x=-0.3 * scale, y=0.1 * scale}) + if infobox_flags.show_resources and zone.type ~= "star" then + MapView.render_zone_resources(player, map_object, object_ids, cursor, scale, zone, + short and 4 or 7) + end + + local left_side_y = cursor.y + + -- VERTICAL LINE + local line_height = (math.max(left_side_y, right_side_y) - horiz_line_cursor.y) * 0.95 + table.insert(object_ids, + MapView.draw_gradient_line({ + surface = map_object.entity.surface, + from = map_object.entity, + to = map_object.entity, + players = { player }, + + from_offset = horiz_line_cursor, + to_offset = util.vectors_add(horiz_line_cursor, { x = 0, y = line_height }), + color = SystemMap.infobox_gradient_tint, + width = 2 * scale, + })) +end + +function MapView.render_spaceship_caption(player, map_object, zone, spaceship_index) + local playerdata = get_make_playerdata(player) + local map_type = playerdata.remote_view_active_map and playerdata.remote_view_active_map.type + if not map_type then return end + + local color = {r=0, g=196, b=196, a=255} + local orientation = 0.125 + + local size + local target_offset + if map_type == MapView.interstellar_map then + size = InterstellarMap.spaceship_text_scale + target_offset = InterstellarMap.spaceship_text_offset + elseif map_type == MapView.system_map then + size = SystemMap.spaceship_text_scale + target_offset = SystemMap.spaceship_text_offset + else + return + end + local half_size = map_object.entity.prototype.selection_box.right_bottom.y + target_offset = util.vectors_add(target_offset, { x = -half_size, y = -half_size }) + target_offset = util.vectors_add(target_offset, { x = 0, y = -0.5 * size }) + + table.insert(map_object.text_objects, + rendering.draw_text{ + text = zone.name, + surface = MapView.get_make_surface(player), + target = map_object.entity, + target_offset = target_offset, + players = {player}, + color = color, + orientation = orientation, + alignment = "right", + scale = size, + scale_with_zoom = false, + } + ) +end + +-- SPACESHIP UPDATES -- +function MapView.update_view(player) + local playerdata = get_make_playerdata(player) + if not playerdata.remote_view_active_map then + return + end + if not playerdata.map_view_entities then + return + end + + local map_type = playerdata.remote_view_active_map and playerdata.remote_view_active_map.type + local spaceship_index = {} + if map_type == MapView.interstellar_map then + spaceship_index = InterstellarMap.get_spaceship_index(player) + elseif map_type == MapView.system_map then + spaceship_index = SystemMap.get_spaceship_index(player, playerdata.remote_view_active_map.zone) + end + + local bound_spaceships = spaceship_index.bound or {} + local flying_spaceships = spaceship_index.flying or {} + local flying_by_spaceship_index = {} + for _, spaceship in pairs(flying_spaceships) do + flying_by_spaceship_index[spaceship.index] = spaceship + end + + local seen_flying = {} + for _, map_object in pairs(playerdata.map_view_entities) do + local entity = map_object.entity + if entity and entity.valid and map_object.zone then + if map_object.zone and map_object.zone.type == "spaceship" then + local spaceship = map_object.zone + seen_flying[spaceship.index] = true + if not flying_by_spaceship_index[spaceship.index] then + -- spaceship is no longer flying here + MapObjects.destroy(player, map_object) + else + -- update spaceship position and orientation + entity.teleport(MapView.get_zone_position(playerdata, spaceship)) + MapObjects.set_orientation(map_object, MapView.get_spaceship_orientation(player, spaceship)) + end + else + -- not a spaceship, update zone caption to account for changes in anchored spaceships + MapView.render_zone_caption(player, map_object, map_object.zone, bound_spaceships) + end + end + end + + -- render new spaceships + for _, spaceship in pairs(flying_spaceships) do + if not seen_flying[spaceship.index] then + -- render new spaceship + MapView.render_spaceship(player, spaceship) + end + end + +end + +function MapView.render_spaceship(player, spaceship) + local surface = MapView.get_make_surface(player) + local playerdata = get_make_playerdata(player) + local map_type = playerdata and playerdata.remote_view_active_map and playerdata.remote_view_active_map.type or MapView.interstellar_map + + if map_type == MapView.interstellar_map then + InterstellarMap.render_spaceship(player, surface, spaceship, playerdata) + else + local star = playerdata.remote_view_active_map.zone + SystemMap.render_spaceship(player, surface, star, spaceship, playerdata) + end +end + +function MapView.get_spaceship_orientation(player, spaceship) + local playerdata = get_make_playerdata(player) + local map_type = playerdata and playerdata.remote_view_active_map and playerdata.remote_view_active_map.type or MapView.interstellar_map + local destination_zone = Spaceship.get_destination_zone(spaceship) + + -- no destination set, or standing still near a zone + if not destination_zone or spaceship.near or spaceship.stopped then + return 0.625 -- oriented bottom left + end + + if map_type == MapView.interstellar_map then + local travel_vector = util.vectors_delta(spaceship.stellar_position, Zone.get_stellar_position(destination_zone)) + return 0.25 + util.vector_to_orientation(travel_vector) + elseif map_type == MapView.system_map then + local star = playerdata.remote_view_active_map.zone + local destination_star_gravity_well = Zone.get_star_gravity_well(destination_zone) + if util.vectors_delta_length(spaceship.stellar_position, Zone.get_stellar_position(destination_zone)) > 0 + or Zone.get_space_distortion(destination_zone) > 0 then + -- destination in another system, you need to get out of the current system + destination_star_gravity_well = -1 + end + if spaceship.planet_gravity_well <= 0 and spaceship.star_gravity_well ~= destination_star_gravity_well then + -- travelling through star_gravity_well + if spaceship.star_gravity_well > destination_star_gravity_well then + return 0.5 + else + return 0 + end + else + local direction_offset = 0.75 + if spaceship.star_gravity_well == destination_star_gravity_well + and spaceship.planet_gravity_well < Zone.get_planet_gravity_well(destination_zone) then + direction_offset = 0.25 + end + local solar_position_data = SystemMap.get_zone_position_data(star, spaceship) + return direction_offset - solar_position_data.orientation + end + end + + -- everything should be covered but just in case return the default + return 0.625 +end + + + +-- MAP OBJECTS MANAGEMENT -- +function MapObjects.create(player, surface, context, entity_name, position) + -- context is either a zone, or a non-zone space (e.g. "interstellar-space") + local zone = nil + if type(context) == "table" then + zone = context + context = "zone" + end + + local playerdata = get_make_playerdata(player) + + local entity = surface.create_entity{ + name = entity_name, + position = position, + force = "neutral" + } + entity.destructible = false + + local map_object = { + entity = entity, + context = context, -- "zone" or "interstellar-space" + zone = zone, + objects = {}, + text_objects = {} + } + + playerdata.map_view_entities = playerdata.map_view_entities or {} + playerdata.map_view_entities[entity.unit_number] = map_object + + return playerdata.map_view_entities[entity.unit_number] +end + +function MapObjects.destroy(player, map_object) + if map_object and map_object.entity and map_object.entity.valid then + local entity = map_object.entity + local playerdata = get_make_playerdata(player) + if not playerdata.map_view_entities[entity.unit_number] then + return + end + + playerdata.map_view_entities[entity.unit_number] = nil + entity.destroy() + end +end + +function MapObjects.set_orientation(map_object, orientation) + for _, rendering_object in pairs(map_object.main_objects or {}) do + rendering.set_orientation(rendering_object, orientation) + end +end + + +-- EVENT HANDLERS -- +function MapView.on_map_tick(event) + if (game.tick % 60) == 40 then + for _, player in pairs(game.connected_players) do + local playerdata = get_make_playerdata(player) + if playerdata.remote_view_active_map then + MapView.update_view(player) + end + end + end +end +Event.addListener(defines.events.on_tick, MapView.on_map_tick) + + +function MapView.on_gui_opened (event) + local player = game.players[event.player_index] + if event.entity and event.entity.valid and event.entity.type == "lamp" then + local playerdata = get_make_playerdata(player) + if playerdata.map_view_entities then + local map_object = playerdata.map_view_entities[event.entity.unit_number] + if map_object then + if map_object.command == "system" then + player.opened = nil -- close + if Zone.is_visible_to_force(map_object.zone, player.force.name ) then + MapView.start_system_map(player, map_object.zone) + else + player.print("Insufficient data, launch more satellites to view the system.") + end + elseif map_object.command == "interstellar" then + player.opened = nil -- close + MapView.start_interstellar_map(player) + elseif map_object.command == "details" then + player.opened = nil -- close + MapView.gui_open(player, map_object.zone) + end + + end + end + end +end +Event.addListener(defines.events.on_gui_opened, MapView.on_gui_opened) + +function MapView.get_make_settings(player) + local playerdata = get_make_playerdata(player) + playerdata.starmap_settings = playerdata.starmap_settings or { + show_resources = false, + show_stats = false, + show_anchor_info = false, + } + return playerdata.starmap_settings +end + +function MapView.get_settings(player) + local settings = MapView.get_make_settings(player) + if not player.force.technologies[MapView.tech_spaceship].researched then + settings = table.deepcopy(settings) + settings["show_anchor_info"] = nil + end + return settings +end + +function MapView.toggle_setting(player, setting_name) + local settings = MapView.get_make_settings(player) + settings[setting_name] = not settings[setting_name] + MapView.update_view(player) +end + + +-- ZONE DETAILS GUI -- +function MapView.gui_open(player, zone) + if not zone then return end + if zone.type == "star" then zone = zone.orbit end + + MapView.gui_close(player) + + local gui = player.gui.screen + player.opened = nil + + local main = gui.add{ type = "frame", name = MapView.name_gui_zone_details_root, direction="vertical"} + main.style.padding = 12 + main.style.top_padding = 6 + main.style.bottom_padding = 0 + + player.opened = main + + if not (main and main.valid) then return end -- setting player.opened can cause other scripts to delete UIs + local title_table = main.add{type="table", name=MapView.name_gui_zone_title_table, column_count=2, draw_horizontal_lines=false} + title_table.style.horizontally_stretchable = true + title_table.style.column_alignments[1] = "left" + title_table.style.column_alignments[2] = "right" + title_table.drag_target = main + + -- store zone name here for + local title_frame = title_table.add{type="frame", name=MapView.gui_get_element_name_from_zone(zone), caption=zone.name, style="informatron_title_frame"} + title_frame.ignored_by_interaction = true + + local right_flow = title_table.add{type="flow", direction="horizontal", name="right_flow"} + right_flow.style.vertical_align = "top" + if zone.type ~= "star" and zone.orbit then + local land = right_flow.add{type="sprite-button", name=MapView.name_gui_zone_details_root.."_land", sprite = Zone.get_icon(zone), style="button"} + land.style.width = 40 + land.style.height = 40 + land.style.bottom_margin = -5 + land.enabled = false + local orbit = right_flow.add{type="sprite-button", name=MapView.name_gui_zone_details_root.."_orbit", sprite = Zone.get_icon(zone.orbit), style="button"} + orbit.style.width = 40 + orbit.style.height = 40 + orbit.style.right_margin = 6 + orbit.style.bottom_margin = -5 + end + local close = right_flow.add{type="sprite-button", name=MapView.name_gui_zone_details_root.."_close", sprite = "utility/close_white", style="informatron_close_button"} + close.style.width = 28 + close.style.height = 28 + close.style.top_margin = 3 + + local details_root = main.add{type="frame", name=MapView.name_details_root, direction="vertical"} + details_root.style.horizontally_stretchable = true + details_root.style.top_margin = -2 + details_root.style.left_margin = -16 + details_root.style.right_margin = -16 + details_root.style.bottom_margin = -3 + details_root.drag_target = main + + local zone_identifier = details_root.add{type="flow", direction="vertical", name=MapView.gui_get_element_name_from_zone(zone)} + local zone_gui_zonelist_root = zone_identifier.add{type="flow", direction="vertical", name=Zonelist.name_gui_root} + Zonelist.gui_create_zone_content(player, zone_gui_zonelist_root) + MapView.gui_update(player) + + main.force_auto_center() + +end + +function MapView.gui_update(player) + local root = player.gui.screen[MapView.name_gui_zone_details_root] + if root and root[MapView.name_details_root] then + local details = util.find_first_descendant_by_name(root, Zonelist.name_gui_root) + local zone = MapView.gui_get_zone_from_element(details.parent) + Zonelist.gui_update_zone_content(player, details, zone) + end +end + +function MapView.gui_close(player) + if player.gui.screen[MapView.name_gui_zone_details_root] then + player.gui.screen[MapView.name_gui_zone_details_root].destroy() + end +end + +function MapView.on_gui_click(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + + if event.element.name == MapView.name_button_overhead_interstellar then + if not MapView.player_is_in_interstellar_map(player) then + MapView.start_interstellar_map(player) + else + RemoteView.stop(player) + end + return + end + + local root = gui_element_or_parent(element, MapView.name_gui_zone_details_root) + if root then + if element.name == MapView.name_gui_zone_details_root.."_close" then + MapView.gui_close(player) + elseif element.name == MapView.name_gui_zone_details_root.."_land" then + local title_table = util.find_first_descendant_by_name(root, MapView.name_gui_zone_title_table) + if title_table then + local zone = MapView.gui_get_zone_from_element(title_table.children[1]) + if zone then + util.find_first_descendant_by_name(root, MapView.name_gui_zone_details_root.."_land").enabled = false + util.find_first_descendant_by_name(root, MapView.name_gui_zone_details_root.."_orbit").enabled = true + local details_root = util.find_first_descendant_by_name(root, MapView.name_details_root) + details_root.clear() + local zone_identifier = details_root.add{type="flow", direction="vertical", name=MapView.gui_get_element_name_from_zone(zone)} + local zone_gui_zonelist_root = zone_identifier.add{type="flow", direction="vertical", name=Zonelist.name_gui_root} + Zonelist.gui_create_zone_content(player, zone_gui_zonelist_root) + MapView.gui_update(player) + end + end + elseif element.name == MapView.name_gui_zone_details_root.."_orbit" then + local title_table = util.find_first_descendant_by_name(root, MapView.name_gui_zone_title_table) + if title_table then + local zone = MapView.gui_get_zone_from_element(title_table.children[1]) + if zone and zone.orbit then + util.find_first_descendant_by_name(root, MapView.name_gui_zone_details_root.."_land").enabled = true + util.find_first_descendant_by_name(root, MapView.name_gui_zone_details_root.."_orbit").enabled = false + local details_root = util.find_first_descendant_by_name(root, MapView.name_details_root) + details_root.clear() + local zone_identifier = details_root.add{type="flow", direction="vertical", name=MapView.gui_get_element_name_from_zone(zone.orbit)} + local zone_gui_zonelist_root = zone_identifier.add{type="flow", direction="vertical", name=Zonelist.name_gui_root} + Zonelist.gui_create_zone_content(player, zone_gui_zonelist_root) + MapView.gui_update(player) + end + end + end + end +end +Event.addListener(defines.events.on_gui_click, MapView.on_gui_click) + +function MapView.update_overhead_button(player_index) + local player = game.players[player_index] + local button_flow = mod_gui.get_button_flow(player) + if button_flow then + if settings.get_player_settings(player)[MapView.name_setting_overhead_interstellar].value == true then + if not button_flow[MapView.name_button_overhead_interstellar] then + button_flow.add{type="sprite-button", name=MapView.name_button_overhead_interstellar, sprite="se-map-gui-starmap", tooltip = {"space-exploration.interstellar-map"}} + end + else + if button_flow[MapView.name_button_overhead_interstellar] then + button_flow[MapView.name_button_overhead_interstellar].destroy() + end + end + end +end + +function MapView.on_runtime_mod_setting_changed(event) + for _, player in pairs(game.connected_players) do + MapView.update_overhead_button(player.index) + end +end +Event.addListener(defines.events.on_runtime_mod_setting_changed, MapView.on_runtime_mod_setting_changed) + +function MapView.on_configuration_changed() + for _, player in pairs(game.connected_players) do + MapView.update_overhead_button(player.index) + end +end +Event.addListener("on_configuration_changed", MapView.on_configuration_changed, true) + +return MapView diff --git a/space-exploration_0.5.58/space-exploration/scripts/medpack.lua b/space-exploration_0.5.58/space-exploration/scripts/medpack.lua new file mode 100644 index 0000000..5022c1a --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/medpack.lua @@ -0,0 +1,46 @@ +Medpack = {} + +-- constants +Medpack.trigger_base_name = mod_prefix.."heal-trigger-" +Medpack.search_radius = 8 + +function Medpack.on_trigger_created_entity(event) + if not event.entity and event.entity.valid then return end + if string.starts(event.entity.name, Medpack.trigger_base_name) then + local suffix = util.replace(event.entity.name, Medpack.trigger_base_name, "") + -- number is at the end. + local heal = util.string_to_number(suffix) + if heal and heal > 0 then + local instigator = event.source + if not instigator then return end + + local surface = event.entity.surface + local position = event.entity.position + local forces = ceasefire_forces(instigator.force) + local friends = surface.find_entities_filtered{ + position = position, + radius = Medpack.search_radius, + force = forces, + type = {"character", "unit"} + } + local heal_target = nil + local best_distance = math.huge + for _, friend in pairs(friends) do + -- TODO: when entity.prototype.trigger_target_mask is readable then use the biological mask. + if friend.prototype.flags["breaths-air"] then + local distance = util.vectors_delta_length(position, friend.position) + if distance < best_distance then + best_distance = distance + heal_target = friend + end + end + end + if heal_target then + heal_target.health = heal_target.health + heal + end + end + end +end +Event.addListener(defines.events.on_trigger_created_entity, Medpack.on_trigger_created_entity) + +return Medpack diff --git a/space-exploration_0.5.58/space-exploration/scripts/meteor.lua b/space-exploration_0.5.58/space-exploration/scripts/meteor.lua new file mode 100644 index 0000000..9ad8df7 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/meteor.lua @@ -0,0 +1,859 @@ +local Meteor = {} + +Meteor.name_meteor_defence = mod_prefix.."meteor-defence" +Meteor.name_meteor_defence_container = mod_prefix.."meteor-defence-container" +Meteor.name_meteor_defence_charger = mod_prefix.."meteor-defence-charger" +Meteor.name_meteor_defence_ammo = mod_prefix.."meteor-defence-ammo" +Meteor.name_meteor_defence_beam = mod_prefix.."meteor-defence-beam" +Meteor.name_meteor_defence_beam_offset = {x = -1, y = -5} + +Meteor.name_meteor_point_defence = mod_prefix.."meteor-point-defence" +Meteor.name_meteor_point_defence_container = mod_prefix.."meteor-point-defence-container" +Meteor.name_meteor_point_defence_charger = mod_prefix.."meteor-point-defence-charger" +Meteor.name_meteor_point_defence_charger_overcharged = mod_prefix.."meteor-point-defence-charger-overcharged" +Meteor.name_meteor_point_defence_ammo = mod_prefix.."meteor-point-defence-ammo" +Meteor.name_meteor_point_defence_beam = mod_prefix.."meteor-point-defence-beam" +Meteor.name_meteor_point_defence_mask = mod_prefix.."meteor-point-defence-mask" +Meteor.name_meteor_point_defence_beam_offsets = { + {x = 0.1, y = -3.5}, + {x = 0.4, y = -3.1}, + {x = -0.3, y = -3.4}, + {x = 0.7, y = -3.2}, +} + +Meteor.defence_accuracy = 0.8 +Meteor.defence_full_power = 2000 * 1000000 +Meteor.defence_passive_draw = 5000000 + +Meteor.point_defence_range = 64 +Meteor.point_defence_accuracy = 0.5 +Meteor.point_defence_full_power = 200 * 1000000 +Meteor.point_defence_fire_power = Meteor.point_defence_full_power / 4 +Meteor.point_defence_passive_draw = 500000 +Meteor.point_defence_passive_draw_overcharged = 250000 + +Meteor.meteor_swarm_altitude = 100 +Meteor.meteor_swarm_x_deviation = Meteor.meteor_swarm_altitude + +Meteor.meteor_fall_time = 2 * 60 +Meteor.meteor_chain_delay = 10 + +Meteor.meteor_random_range = 512 +Meteor.meteor_variants = 16 +Meteor.meteor_position_deviation = 10 +Meteor.meteor_chain_distance = 10 + +Meteor.tick_skip = 10 + + + +function Meteor.on_player_selected_or_opened_changed(event) + local player = game.players[event.player_index] + local playerdata = get_make_playerdata(player) + if playerdata.meteor_point_defence_radius then + if not ( + (player.selected and player.selected.name == Meteor.name_meteor_point_defence_container) + or (player.opened and player.opened_gui_type == defines.gui_type.entity and player.opened.name == Meteor.name_meteor_point_defence_container) ) then + if rendering.is_valid(playerdata.meteor_point_defence_radius) then + rendering.destroy(playerdata.meteor_point_defence_radius) + end + playerdata.meteor_point_defence_radius = nil + end + end +end +Event.addListener(defines.events.on_gui_opened, Meteor.on_player_selected_or_opened_changed) +Event.addListener(defines.events.on_selected_entity_changed, Meteor.on_player_selected_or_opened_changed) + +function Meteor.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.name == Meteor.name_meteor_defence_container + or entity.name == Meteor.name_meteor_point_defence_container then + local zone = Zone.from_surface(entity.surface) + if zone and zone.type ~= "spaceship" then + if entity.name == Meteor.name_meteor_defence_container then + entity.active = false + local charger = entity.surface.create_entity{ + name = Meteor.name_meteor_defence_charger, + position = entity.position, + direction = entity.direction, + force = entity.force + } + charger.destructible = false + + if not zone.meteor_defences then + zone.meteor_defences = {} + end + zone.meteor_defences[entity.unit_number] = { + unit_number = entity.unit_number, + container = entity, + charger = charger, + } + + else + entity.active = false + local charger = entity.surface.create_entity{ + name = Meteor.name_meteor_point_defence_charger, + position = entity.position, + direction = entity.direction, + force = entity.force + } + charger.destructible = false + charger.energy = 0 + + if not zone.meteor_point_defences then + zone.meteor_point_defences = {} + end + zone.meteor_point_defences[entity.unit_number] = { + unit_number = entity.unit_number, + container = entity, + charger = charger, + } + + end + -- add to list of zones where meteors can appear + global.meteor_zones = global.meteor_zones or {} + global.meteor_zones[zone.index] = zone + + else + cancel_entity_creation(entity, event.player_index, "Cannot be placed here.") + return + end + elseif entity.type == "electric-pole" or entity.type == "assembling-machine" then + local zone = Zone.from_surface(entity.surface) + if zone and zone.type ~= "spaceship" then + global.meteor_zones = global.meteor_zones or {} + global.meteor_zones[zone.index] = zone + end + end +end +Event.addListener(defines.events.on_built_entity, Meteor.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, Meteor.on_entity_created) +Event.addListener(defines.events.script_raised_built, Meteor.on_entity_created) +Event.addListener(defines.events.script_raised_revive, Meteor.on_entity_created) + +function Meteor.on_removed_entity(event) + if event.entity and event.entity.valid and event.entity.surface then + if event.entity.name == Meteor.name_meteor_defence_charger then + local entity = event.entity + local charger = entity.surface.find_entity(Meteor.name_meteor_defence_container, entity.position) + if charger then charger.destroy() end + elseif event.entity.name == Meteor.name_meteor_defence_container then + local entity = event.entity + local charger = entity.surface.find_entity(Meteor.name_meteor_defence_charger, entity.position) + if charger then charger.destroy() end + elseif event.entity.name == Meteor.name_meteor_point_defence_charger or Meteor.name_meteor_point_defence_charger.."-overcharged" then + local entity = event.entity + local charger = entity.surface.find_entity(Meteor.name_meteor_point_defence_container, entity.position) + if charger then charger.destroy() end + elseif event.entity.name == Meteor.name_meteor_point_defence_container then + local entity = event.entity + local charger = entity.surface.find_entity(Meteor.name_meteor_point_defence_charger, entity.position) + if charger then charger.destroy() else + charger = entity.surface.find_entity(Meteor.name_meteor_point_defence_charger.."-overcharged", entity.position) + if charger then charger.destroy() end + end + end + end +end +Event.addListener(defines.events.on_entity_died, Meteor.on_removed_entity) +Event.addListener(defines.events.on_robot_mined_entity, Meteor.on_removed_entity) +Event.addListener(defines.events.on_player_mined_entity, Meteor.on_removed_entity) +Event.addListener(defines.events.script_raised_destroy, Meteor.on_removed_entity) + +function Meteor.tick_meteor_shower(meteor_shower) + if type(meteor_shower.remaining_meteors) ~= "table" then + meteor_shower.valid = false + return + end + + if meteor_shower.skip and meteor_shower.skip > 0 then + meteor_shower.skip = meteor_shower.skip - Meteor.tick_skip + return + end + + if #meteor_shower.remaining_meteors == 0 then + + -- no meteors left, defences won, vistory message + meteor_shower.valid = false + Meteor.meteor_shower_alert(meteor_shower) + return + + end + + local surface = Zone.get_make_surface(meteor_shower.zone) + if meteor_shower.zone.meteor_defences then + for _, defence in pairs(meteor_shower.zone.meteor_defences) do + local charger = defence.charger + if defence.charger and defence.charger.valid and defence.container and defence.container.valid then + if charger.energy >= Meteor.defence_full_power * 0.99 then + local inv = defence.container.get_inventory(defines.inventory.turret_ammo) + --local contents = inv.get_contents() + --if contents[Meteor.name_meteor_defence_ammo] and contents[Meteor.name_meteor_defence_ammo] > 0 then + if inv.get_item_count(Meteor.name_meteor_defence_ammo) > 0 then + -- this defence is ready to fire + local take = 1 + inv.remove({name=Meteor.name_meteor_defence_ammo, count=take}) + charger.force.item_production_statistics.on_flow(Meteor.name_meteor_defence_ammo, -take) + charger.energy = 0 + meteor_shower.skip = 30 + + meteor_shower.defences_activated = meteor_shower.defences_activated + 1 + if math.random() < Meteor.defence_accuracy then + Meteor.credit_kill(defence.container, mod_prefix .. "static-meteor-01") + meteor_shower.remaining_meteors[math.random(#meteor_shower.remaining_meteors)] = nil + local remaining_meteors = {} + for _, meteor in pairs(meteor_shower.remaining_meteors) do + table.insert(remaining_meteors, meteor) + end + meteor_shower.remaining_meteors = remaining_meteors + end + surface.create_entity{ + name = Meteor.name_meteor_defence_beam, + position = Util.vectors_add(charger.position, Meteor.name_meteor_defence_beam_offset), + target = Util.vectors_add(charger.position, {x = 0, y = -Meteor.meteor_swarm_altitude}) + } + return + end + end + end + end + end + + -- try point defence + if meteor_shower.zone.meteor_point_defences then + for _, defence in pairs(meteor_shower.zone.meteor_point_defences) do + local charger = defence.charger + if defence.charger and defence.charger.valid and defence.container and defence.container.valid then + for remaining_index, meteor in pairs(meteor_shower.remaining_meteors) do + if charger.energy >= Meteor.point_defence_fire_power and Util.vectors_delta_length(meteor.land_position, defence.charger.position) <= Meteor.point_defence_range then + local inv = defence.container.get_inventory(defines.inventory.turret_ammo) + --local contents = inv.get_contents() + --if contents[Meteor.name_meteor_point_defence_ammo] and contents[Meteor.name_meteor_point_defence_ammo] > 0 then + if inv.get_item_count(Meteor.name_meteor_point_defence_ammo) > 0 then + -- this defence is ready to fire + + local take = 1 + inv.remove({name=Meteor.name_meteor_point_defence_ammo, count=take}) + charger.force.item_production_statistics.on_flow(Meteor.name_meteor_point_defence_ammo, -take) + charger.energy = charger.energy - Meteor.point_defence_fire_power + + defence.barrel = (defence.barrel or 0) % 4 + 1 + surface.create_entity{ + name = Meteor.name_meteor_point_defence_beam, + position = Util.vectors_add(charger.position, Meteor.name_meteor_point_defence_beam_offsets[defence.barrel]), + target = Util.vectors_add(charger.position, {x = 0, y = -Meteor.meteor_swarm_altitude}) + } + + meteor_shower.point_defences_activated = meteor_shower.point_defences_activated + 1 + if math.random() < Meteor.point_defence_accuracy then + Meteor.credit_kill(defence.container, mod_prefix .. "static-meteor-01") + + meteor_shower.remaining_meteors[remaining_index] = nil + local remaining_meteors = {} + for _, meteor in pairs(meteor_shower.remaining_meteors) do + table.insert(remaining_meteors, meteor) + end + meteor_shower.remaining_meteors = remaining_meteors + end + + return + end + end + end + end + end + + end + + if meteor_shower.defences_activated or meteor_shower.point_defences_activated > 0 then + -- there were defences, meteors win, show defence status message + Meteor.meteor_shower_alert(meteor_shower) + end + + meteor_shower.valid = false + Meteor.spawn_meteor_shower(meteor_shower) +end + + +function Meteor.defence_vs_projectile(projectile) + -- projectile should have the following properties: + -- projectile.force_name + -- projectile.target_position + local zone = projectile.target_zone + projectile.health = projectile.health or 1 -- some may take multiple hits? + + local surface = Zone.get_make_surface(zone) + local defence_data = {} + + if zone.meteor_defences then + for _, defence in pairs(zone.meteor_defences) do + local charger = defence.charger + if charger and charger.valid and not (projectile.force_name == charger.force.name or charger.force.get_cease_fire(projectile.force_name) or charger.force.get_friend(projectile.force_name)) then + defence_data[charger.force.name] = defence_data[charger.force.name] or {defence_shots = 0, point_defence_shots = 0} + if defence.container and defence.container.valid then + if charger.energy >= Meteor.defence_full_power * 0.99 then + local inv = defence.container.get_inventory(defines.inventory.turret_ammo) + if inv.get_item_count(Meteor.name_meteor_defence_ammo) > 0 then + -- this defence is ready to fire + local take = 1 + inv.remove({name=Meteor.name_meteor_defence_ammo, count=take}) + charger.force.item_production_statistics.on_flow(Meteor.name_meteor_defence_ammo, -take) + charger.energy = 0 + defence_data[charger.force.name].defence_shots = defence_data[charger.force.name].defence_shots + 1 + + surface.create_entity{ + name = Meteor.name_meteor_defence_beam, + position = Util.vectors_add(charger.position, Meteor.name_meteor_defence_beam_offset), + target = Util.vectors_add(charger.position, {x = 0, y = -Meteor.meteor_swarm_altitude}) + } + if math.random() < Meteor.defence_accuracy then + projectile.health = projectile.health - 1 + if projectile.health <= 0 then + --TODO: credit kill of a summy delivery cannon capsule. + return defence_data + end + end + end + end + end + end + end + end + + -- try point defence + if zone.meteor_point_defences then + for _, defence in pairs(zone.meteor_point_defences) do + local charger = defence.charger + if not (projectile.force_name == charger.force.name or charger.force.get_cease_fire(projectile.force_name) or charger.force.get_friend(projectile.force_name)) then + defence_data[charger.force.name] = defence_data[charger.force.name] or {defence_shots = 0, point_defence_shots = 0} + if defence.charger and defence.charger.valid and defence.container and defence.container.valid then + if Util.vectors_delta_length(projectile.target_position, defence.charger.position) <= Meteor.point_defence_range then + local inv = defence.container.get_inventory(defines.inventory.turret_ammo) + while charger.energy >= Meteor.point_defence_fire_power and inv.get_item_count(Meteor.name_meteor_point_defence_ammo) > 0 do + -- this defence is ready to fire + + local take = 1 + inv.remove({name=Meteor.name_meteor_point_defence_ammo, count=take}) + charger.force.item_production_statistics.on_flow(Meteor.name_meteor_point_defence_ammo, -take) + charger.energy = charger.energy - Meteor.point_defence_fire_power + defence_data[charger.force.name].point_defence_shots = defence_data[charger.force.name].point_defence_shots + 1 + + defence.barrel = (defence.barrel or 0) % 4 + 1 + surface.create_entity{ + name = Meteor.name_meteor_point_defence_beam, + position = Util.vectors_add(charger.position, Meteor.name_meteor_point_defence_beam_offsets[defence.barrel]), + target = Util.vectors_add(charger.position, {x = 0, y = -Meteor.meteor_swarm_altitude}) + } + + if math.random() < Meteor.point_defence_accuracy then + projectile.health = projectile.health - 1 + if projectile.health <= 0 then + --TODO: credit kill of a summy delivery cannon capsule. + return defence_data + end + end + end + end + end + end + end + + end + + return defence_data + +end + + +function Meteor.meteor_shower_alert(meteor_shower) + + local meteor_defences = 0 + local meteor_defences_ready = 0 + local meteor_defences_shot_fired = meteor_shower.defences_activated + + local meteor_point_defences = 0 + local meteor_point_defences_ready = 0 + local meteor_point_defence_shots_fired = meteor_shower.point_defences_activated + + if meteor_shower.zone.meteor_defences then + for _, defence in pairs(meteor_shower.zone.meteor_defences) do + meteor_defences = meteor_defences + 1 + local charger = defence.charger + if defence.charger and defence.charger.valid and defence.container and defence.container.valid then + if charger.energy >= Meteor.defence_full_power * 0.99 then + local inv = defence.container.get_inventory(defines.inventory.turret_ammo) + local contents = inv.get_contents() + if contents[Meteor.name_meteor_defence_ammo] and contents[Meteor.name_meteor_defence_ammo] > 0 then + meteor_defences_ready = meteor_defences_ready + 1 + end + end + end + end + end + + -- try point defence + if meteor_shower.zone.meteor_point_defences then + for _, defence in pairs(meteor_shower.zone.meteor_point_defences) do + meteor_point_defences = meteor_point_defences + 1 + local charger = defence.charger + if defence.charger and defence.charger.valid and defence.container and defence.container.valid then + if charger.energy >= Meteor.point_defence_fire_power then + local inv = defence.container.get_inventory(defines.inventory.turret_ammo) + local contents = inv.get_contents() + if contents[Meteor.name_meteor_point_defence_ammo] and contents[Meteor.name_meteor_point_defence_ammo] > 0 then + meteor_point_defences_ready = meteor_point_defences_ready + 1 + end + end + end + end + end + + local surface = Zone.get_make_surface(meteor_shower.zone) + local dummy = surface.create_entity{name = mod_prefix.."dummy-explosion", position = meteor_shower.land_position} + local message = "[img=virtual-signal/se-meteor] " .. (#meteor_shower.meteors - #meteor_shower.remaining_meteors).."/"..#meteor_shower.meteors.." meteors destroyed. " + message = message .. "[gps="..math.floor(meteor_shower.land_position.x)..","..math.floor(meteor_shower.land_position.y)..","..surface.name.."]" + message = message .. "\n [img=item/se-meteor-defence] " .. meteor_defences_shot_fired.." shots fired. ".. meteor_defences_ready.."/"..meteor_defences.." structures remain ready." + message = message .. "\n [img=item/se-meteor-point-defence] " .. meteor_point_defence_shots_fired.." shots fired. ".. meteor_point_defences_ready.."/"..meteor_point_defences.." structures remain ready." + + for _, player in pairs(game.connected_players) do + if player.surface.index == surface.index then + player.add_custom_alert( dummy, {type = "virtual", name = "se-meteor"}, message, true) + if settings.get_player_settings(player)["se-print-meteor-info"].value then + player.print(message) + end + end + end +end + +function Meteor.begin_meteor_shower(zone, position, range, force_meteor_count) + if not zone then return end + local surface = Zone.get_make_surface(zone) + + if not position then position = {x = 0, y = 0} end + if not range then range = Meteor.meteor_random_range end + + local meteor_count = 1 + if force_meteor_count then + meteor_count = force_meteor_count + if force_meteor_count > 100 then + game.print("Meteor shower count capped at 100, use multiple meteor showers to bypass this limit.") + end + else + local continue = true + while continue and meteor_count < 100 do + if math.random() < 0.5 then + meteor_count = meteor_count + 1 + else + continue = false + end + end + end + meteor_count = math.min(meteor_count, 100) + + local x_offset = Meteor.meteor_swarm_x_deviation * 2 * (math.random() - 0.5) + local land_position = { + x = position.x + (math.random() - 0.5) * range * 2, + y = position.y + (math.random() - 0.5) * range * 2 + } + local start_position = { + x = land_position.x + x_offset, + y = land_position.y - Meteor.meteor_swarm_altitude + } + local shadow_start_position = { + x = land_position.x + Meteor.meteor_swarm_altitude + x_offset, + y = land_position.y + } + + local chain_angle = math.random() * 360 + local chain = 0 + local meteors = {} + for chain = 1, meteor_count do + meteor = { + id = chain, + safe = false + } + if chain == 1 then + meteor.land_position = { + x = land_position.x, + y = land_position.y, + } + else + meteor.land_position = { + x = land_position.x + (math.random() - 0.5) * Meteor.meteor_position_deviation, + y = land_position.y + (math.random() - 0.5) * Meteor.meteor_position_deviation, + } + meteor.land_position = util.vectors_add(meteor.land_position, util.rotate_vector(chain_angle, {x = 0, y = Meteor.meteor_chain_distance * ((chain - 1) + 0.7 * math.random()) })) + end + table.insert(meteors, meteor) + end + + local defences = zone.meteor_defences or {} + + global.meteor_showers = global.meteor_showers or {} + local meteor_shower = { + valid = true, + type = "meteor-shower", + zone = zone, + land_position = land_position, + start_position = start_position, + shadow_start_position = shadow_start_position, + meteors = meteors, + remaining_meteors = table.deepcopy(meteors), + defences_activated = 0, + point_defences_activated = 0, + defences = defences, + skip = 60 + } + table.insert(global.meteor_showers, meteor_shower) + + local surface = Zone.get_make_surface(zone) + --surface.request_to_generate_chunks(start_position) + --surface.request_to_generate_chunks(shadow_start_position) + --surface.request_to_generate_chunks(land_position) + + for _, player in pairs(game.connected_players) do + if player.surface.index == surface.index then + player.play_sound{path = "se-meteor-woosh", volume = 3} + end + end + +end + +function Meteor.spawn_meteor_shower(meteor_shower) + local surface = Zone.get_make_surface(meteor_shower.zone) + for _, meteor in pairs(meteor_shower.remaining_meteors) do + surface.create_entity{ + name = mod_prefix.."falling-meteor-"..string.format("%02d", math.random(Meteor.meteor_variants)), + position = meteor_shower.start_position, + target = meteor.land_position, + force = "neutral", + speed = Util.vectors_delta_length(meteor_shower.start_position, meteor.land_position) / (Meteor.meteor_fall_time + Meteor.meteor_chain_delay * meteor.id) + } + surface.create_entity{ + name = mod_prefix.."shadow-meteor-"..string.format("%02d", math.random(Meteor.meteor_variants)), + position = meteor_shower.shadow_start_position, + target = meteor.land_position, + force = "neutral", + speed = Util.vectors_delta_length(meteor_shower.shadow_start_position, meteor.land_position) / (Meteor.meteor_fall_time + Meteor.meteor_chain_delay * meteor.id) + } + end +end + +function Meteor.on_tick_defence (zone, defence) + if defence.container and defence.container.valid and defence.charger and defence.charger.valid then + if defence.charger.is_connected_to_electric_network() and defence.charger.energy < Meteor.defence_full_power * 0.99 then + if not defence.charging_shape_id then + defence.charging_shape_id = rendering.draw_sprite{ + sprite = "utility/recharge_icon", + surface = defence.container.surface, + target = defence.container, + x_scale = 0.5, + y_scale = 0.5, + } + end + if defence.charging_text_id then + rendering.destroy(defence.charging_text_id) + defence.charging_text_id = nil + end + defence.charging_text_id = rendering.draw_text{ + text = string.format("%.2f", 100 * defence.charger.energy / Meteor.defence_full_power) .. "%", + surface = defence.container.surface, + target = defence.container, + target_offset = {x = 0, y = 1}, + color = {r=255,g=255,b=255,a=255}, + alignment = "center", + } + else + if defence.charging_shape_id then + rendering.destroy(defence.charging_shape_id) + defence.charging_shape_id = nil + end + if defence.charging_text_id then + rendering.destroy(defence.charging_text_id) + defence.charging_text_id = nil + end + end + if defence.container.health <= 0 then defence.container.active = true end + else + if defence.container and defence.container.valid then + -- first search for an alternate charger at the same location (cant' do this with a migration :( + local charger = defence.container.surface.find_entity(Meteor.name_meteor_defence_charger, defence.container.position) + if charger and charger.valid then + defence.charger=charger + zone.meteor_defences[defence.unit_number]=defence + Meteor.on_tick_defence (zone, defence) + return + end + --game.print("destroying_container - didn't find a charger") + + defence.container.destroy() end + if defence.charger and defence.charger.valid then + defence.charger.destroy() + + end + if defence.charging_shape_id then + rendering.destroy(defence.charging_shape_id) + defence.charging_shape_id = nil + end + if defence.charging_text_id then + rendering.destroy(defence.charging_text_id) + defence.charging_text_id = nil + end + zone.meteor_defences[defence.unit_number] = nil + end +end + +function Meteor.on_tick_point_defence (zone, defence) + if defence.container and defence.container.valid and defence.charger and defence.charger.valid then + if defence.charger.is_connected_to_electric_network() and defence.charger.energy < Meteor.point_defence_fire_power then + if not defence.charging_shape_id then + defence.charging_shape_id = rendering.draw_sprite{ + sprite = "utility/recharge_icon", + surface = defence.container.surface, + target = defence.container, + x_scale = 0.5, + y_scale = 0.5, + } + end + if defence.charging_text_id then + rendering.destroy(defence.charging_text_id) + defence.charging_text_id = nil + end + defence.charging_text_id = rendering.draw_text{ + text = string.format("%.2f", 100 * defence.charger.energy / (Meteor.point_defence_fire_power)) .. "%", + surface = defence.container.surface, + target = defence.container, + target_offset = {x = 0, y = 1}, + color = {r=255,g=255,b=255,a=255}, + alignment = "center", + } + else + if defence.charging_shape_id then + rendering.destroy(defence.charging_shape_id) + defence.charging_shape_id = nil + end + if defence.charging_text_id then + rendering.destroy(defence.charging_text_id) + defence.charging_text_id = nil + end + end + if defence.container.health <= 0 then defence.container.active = true end + else + if defence.container and defence.container.valid then + -- first search for an alternate charger at the same location (cant' do this with a migration :( + local charger = defence.container.surface.find_entity(Meteor.name_meteor_point_defence_charger, defence.container.position) + if charger and charger.valid then + defence.charger=charger + charger.destructible = false + zone.meteor_point_defences[defence.unit_number]=defence + --game.print("fixed_charger-normal") + Meteor.on_tick_point_defence (zone, defence) + return + end + charger = defence.container.surface.find_entity(Meteor.name_meteor_point_defence_charger.."-overcharged", defence.container.position) + if charger and charger.valid then defence.charger=charger + charger.destructible = false + zone.meteor_point_defences[defence.unit_number]=defence + --game.print("fixed_charger-overcharged") + Meteor.on_tick_point_defence (zone, defence) + return + end + --game.print("destroying_container,beacuse no charger") + + defence.container.destroy() end + if defence.charger and defence.charger.valid then defence.charger.destroy() end + if defence.charging_shape_id then + rendering.destroy(defence.charging_shape_id) + defence.charging_shape_id = nil + end + if defence.charging_text_id then + rendering.destroy(defence.charging_text_id) + defence.charging_text_id = nil + end + zone.meteor_point_defences[defence.unit_number] = nil + end +end + +function Meteor.credit_kill(charger, killed_entity_name) + --Credit the force with the kill + --All of the icons look the same so there's no reason in spltting the stastics up. + --force.kill_count_statistics.on_flow(mod_prefix .. "static-meteor-" .. string.format("%02d", math.random(Meteor.meteor_variants)), 1) + charger.force.kill_count_statistics.on_flow(mod_prefix .. "static-meteor-01", 1) + charger.kills = charger.kills + 1 +end + +function Meteor.on_tick (event) + -- TODO: make meteors appear on zones with power poles, not just where players are. + if game.tick % Meteor.tick_skip == 0 then + + -- process meteor showers like tick tasks + if global.meteor_showers then + for i = #global.meteor_showers, 1, -1 do + if global.meteor_showers[i].valid then + Meteor.tick_meteor_shower(global.meteor_showers[i]) + else + table.remove(global.meteor_showers, i) + end + end + end + + for _, zone in pairs(global.meteor_zones or {}) do + if zone.meteor_defences then + for _, defence in pairs(zone.meteor_defences) do + Meteor.on_tick_defence(zone, defence) + end + end + if zone.meteor_point_defences then + for _, defence in pairs(zone.meteor_point_defences) do + Meteor.on_tick_point_defence(zone, defence) + end + end + end + + end +end +Event.addListener(defines.events.on_tick, Meteor.on_tick) + +function Meteor.on_nth_tick_1800 (event) + if not global.meteor_zones then + global.meteor_zones = {} + local nauvis = Zone.from_name("Nauvis") + global.meteor_zones[nauvis.index] = nauvis + end + + for _, zone in pairs(global.meteor_zones or {}) do + -- trigger meteor showers, should be after to let chunks generate + if game.tick > (zone.next_meteor_shower or 3600) then + local star = Zone.get_star_from_child(zone) + local s_gravity = 0 -- 0 in deep space, 1 at roughly 1/3 out from the star + if star then s_gravity = math.min( 1, (Zone.get_star_gravity_well(zone) / Zone.get_star_gravity_well(star)) * 1.5) end + local m_multiplier = 1 + (1 - s_gravity) * 3 -- outer space can be 4x longer between strikes + zone.next_meteor_shower = game.tick + 60*60 + m_multiplier * math.random() * 60 * 60 * settings.global["se-meteor-interval"].value + + local surface = Zone.get_make_surface(zone) + local position + local entities + entities = surface.find_entities_filtered{type="character"} + if #entities > 0 then + position = entities[math.random(#entities)].position + end + if not position then + entities = surface.find_entities_filtered{type={"car", "spider-vehicle", "locomotive", "cargo-wagon"}} + if #entities > 0 then + position = entities[math.random(#entities)].position + end + end + if not position then + entities = surface.find_entities_filtered{type={"electric-pole"}} + if #entities > 0 then + position = entities[math.random(#entities)].position + end + end + if not position then + position = {x = 0, y = 0} + end + Meteor.begin_meteor_shower(zone, position) + + end + + end + +end +Event.addListener("on_nth_tick_1800", Meteor.on_nth_tick_1800) -- 30s + +function on_runtime_mod_setting_changed() + for _, zone in pairs(global.meteor_zones or {}) do + if (zone.next_meteor_shower or 0) > game.tick + 60 * 60 * settings.global["se-meteor-interval"].value then + local star = Zone.get_star_from_child(zone) + local s_gravity = 0 -- 0 in deep space, 1 at roughly 1/3 out from the star + if star then s_gravity = math.min( 1, (Zone.get_star_gravity_well(zone) / Zone.get_star_gravity_well(star)) * 1.5) end + local m_multiplier = 1 + (1 - s_gravity) * 3 -- outer space can be 4x longer between strikes + zone.next_meteor_shower = game.tick + 30*60 + m_multiplier * math.random() * 60 * 60 * settings.global["se-meteor-interval"].value + end + end +end +Event.addListener(defines.events.on_runtime_mod_setting_changed, on_runtime_mod_setting_changed) + +function Meteor.on_mode_toggle(event) + local player = game.players[event.player_index] + if not player.character then return end + local entity = player.selected + + if entity and entity.valid then + --player.print("on_player_rotates: " .. entity.name .. " : " .. entity.type) + + if entity.name == Meteor.name_meteor_point_defence_container then + local zone = Zone.from_surface(entity.surface) + local defence = zone.meteor_point_defences[entity.unit_number] + local charger = defence.charger + if charger then + + if defence.charging_text_id then + rendering.destroy(defence.charging_text_id) + defence.charging_text_id = nil + end + if defence.charging_shape_id then + rendering.destroy(defence.charging_shape_id) + defence.charging_shape_id = nil + end + local chargerType + + if charger.name == Meteor.name_meteor_point_defence_charger_overcharged then + chargerType = Meteor.name_meteor_point_defence_charger + player.print({"space-exploration.charge-mode-normal"}) + if defence.extra_overlay_id and rendering.is_valid(defence.extra_overlay_id) then + rendering.destroy(defence.extra_overlay_id) + end + defence.extra_overlay_id = nil + else + chargerType = Meteor.name_meteor_point_defence_charger_overcharged + player.print({"space-exploration.charge-mode-fast"}) + if defence.extra_overlay_id and rendering.is_valid(defence.extra_overlay_id) then + rendering.destroy(defence.extra_overlay_id) + end + defence.extra_overlay_id = rendering.draw_sprite{ + sprite = Meteor.name_meteor_point_defence_mask, + surface = defence.container.surface, + target = defence.container, + tint = {r=255,g=128,b=0}, + render_layer = "lower-object-above-shadow" + } + end + + charger.destroy() + + charger = entity.surface.create_entity{ + name = chargerType, + position = entity.position, + direction = entity.direction, + force = entity.force + } + charger.destructible = false + charger.energy = 0 + + + if not zone.meteor_point_defences then + zone.meteor_point_defences = {} + end + zone.meteor_point_defences[entity.unit_number] = { + unit_number = entity.unit_number, + container = entity, + charger = charger, + extra_overlay_id = defence.extra_overlay_id + } + else + player.print("No "..Meteor.name_meteor_point_defence_charger .." found") + end + end + end +end +Event.addListener(mod_prefix .. 'mode-toggle', Meteor.on_mode_toggle) + +return Meteor diff --git a/space-exploration_0.5.58/space-exploration/scripts/migrate.lua b/space-exploration_0.5.58/space-exploration/scripts/migrate.lua new file mode 100644 index 0000000..f88771c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/migrate.lua @@ -0,0 +1,850 @@ +local Migrate = {} + +local dont_lock_techs = { + mod_prefix.."naquium-cube", + mod_prefix.."naquium-tessaract", + mod_prefix.."naquium-processor", + mod_prefix.."space-accumulator-2", + mod_prefix.."wide-beacon-2", + mod_prefix.."antimatter-production", + mod_prefix.."antimatter-reactor", + mod_prefix.."space-solar-panel-3", + mod_prefix.. "space-probe", + mod_prefix.. "dimensional-anchor", + mod_prefix.. "long-range-star-mapping", + mod_prefix.. "factory-spaceship-1", + mod_prefix.. "factory-spaceship-2", + mod_prefix.. "factory-spaceship-3", + mod_prefix.. "factory-spaceship-4", + mod_prefix.. "factory-spaceship-5", + mod_prefix.. "lifesupport-equipment-4", + mod_prefix.. "bioscrubber", + "energy-shield-mk6-equipment" +} +Migrate.dont_lock_techs = {} +for _, tech in pairs(dont_lock_techs) do + Migrate.dont_lock_techs[tech] = tech +end + +function Migrate.migrations() + if not global.version then global.version = 0 end + + if global.version < version then + if global.version < 000138 then Migrate.v0_1_38() end + if global.version < 0001065 then Migrate.v0_1_65() end + if global.version < 0001086 then Migrate.v0_1_86() end + if global.version < 0001089 then Migrate.v0_1_89() end + if global.version < 0001096 then Migrate.v0_1_96() end + if global.version < 0001101 then Migrate.v0_1_101() end + if global.version < 0001126 then Migrate.v0_1_126() end + if global.version < 0001130 then Migrate.v0_1_130() end + if global.version < 0003001 then Migrate.v0_3_1() end + if global.version < 0003011 then Migrate.v0_3_11() end + if global.version < 0003039 then Migrate.v0_3_39() end + if global.version < 0003040 then global.delivery_cannons = {} end + if global.version < 0003054 then Migrate.v0_3_54() end + if global.version < 0003059 then Migrate.v0_3_59() end + if global.version < 0003061 then Migrate.v0_3_61() end + if global.version < 0003069 then Migrate.v0_3_69() end + if global.version < 0003071 then Migrate.v0_3_71() end + if global.version < 0003088 then Migrate.v0_3_88() end + if global.version < 0003099 then Migrate.v0_3_99() end + if global.version < 0003112 then Migrate.v0_3_112() end + if global.version < 0003135 then Migrate.v0_3_135() end + if global.version < 0004002 then Migrate.v0_4_002() end + if global.version < 0004007 then Migrate.v0_4_007() end + if global.version < 0004030 then Migrate.v0_4_030() end + if global.version < 0004039 then Migrate.v0_4_039() end + if global.version < 0004044 then Migrate.v0_4_044() end + if global.version < 0005001 then Migrate.v0_5_001() end + if global.version < 0005039 then Migrate.v0_5_039() end + if global.version < 0005045 then Migrate.v0_5_045() end + if global.version < 0005050 then Migrate.v0_5_050() end + if global.version < 0005053 then Migrate.v0_5_053() end + if global.version < 0005056 then Migrate.v0_5_056() end + end + + if not global.universe_scale then + global.universe_scale = math.sqrt(#global.universe.stars + #global.universe.space_zones) * Universe.stellar_average_separation + Universe.separate_stellar_position() + for _, zone in pairs(global.zone_index) do + if zone.type == "planet" then + Universe.planet_gravity_well_distribute(zone) + end + end + end + + -- general cleaning + for _, zone in pairs(global.zone_index) do + if zone.is_homeworld or zone.name == "Nauvis" then + zone.tags = nil + end + if zone.tags then + if zone.tags.moisture and zone.tags.moisture == "moisture_very_low" then + -- was incorrect in universe.raw, if surface is genrated it is incorrect but don't change the terrain if already settled + zone.tags.moisture = "moisture_low" + Zone.delete_surface(zone) -- remove if unsettled + log("Changed moisture tag from moisture_very_low to moisture_low.") + end + end + Zone.set_solar_and_daytime(zone) + end + + if global.meteor_zones then + for _, zone in pairs(global.meteor_zones) do + if zone.meteor_defences then + for _, defence in pairs(zone.meteor_defences) do + if defence.charger and defence.charger.valid then + defence.charger.power_usage = Meteor.defence_passive_draw/60 + end + end + end + if zone.meteor_point_defences then + for _, defence in pairs(zone.meteor_point_defences) do + if defence.charger and defence.charger.valid then + if defence.charger.name == Meteor.name_meteor_point_defence_charger then + defence.charger.power_usage = Meteor.point_defence_passive_draw/60 + else + defence.charger.power_usage = Meteor.point_defence_passive_draw_overcharged/60 + end + end + end + end + end + end + + for _, player in pairs(game.players) do + if player.character and player.permission_group and player.permission_group.name == RemoteView.name_permission_group then + player.permission_group = nil + end + end + + for _, name in pairs({"se-remote-view", "se-remote-view_satellite"}) do + local group = game.permissions.get_group(name) + if group then group.destroy() end + end + + setup_util_forces() + + Migrate.fill_tech_gaps() + + Ancient.update_unlocks() + + global.version = version +end + +function Migrate.fill_tech_gaps() + local tech_children = {} + for _, technology in pairs(game.technology_prototypes) do + for _, prerequisite in pairs(technology.prerequisites) do + tech_children[prerequisite.name] = tech_children[prerequisite.name] or {} + table.insert(tech_children[prerequisite.name], technology.name) + end + end + + --first pass + for _, force in pairs(game.forces) do + if force.name ~= "enemy" + and force.name ~= "neutral" + and force.name ~= "capture" + and force.name ~= "ignore" + and force.name ~= "friendly" then + if force.technologies[mod_prefix.."deep-space-science-pack-1"].researched then + force.technologies[mod_prefix.."deep-catalogue-1"].researched = true + end + local techs_done = {} + local rocket_science = force.technologies[mod_prefix.."rocket-science-pack"] + Migrate.fill_tech_gaps_rec(tech_children, techs_done, rocket_science, false) + end + end +end + +function Migrate.fill_tech_gaps_rec(tech_children, techs_done, tech, lock) + local change = false + if not(tech.researched or tech.level > 1) then + if not Migrate.dont_lock_techs[tech.name] then + lock = true + end + end + if lock then + if tech.researched then + change = true + end + if not Migrate.dont_lock_techs[tech.name] then + tech.researched = false + end + end + if tech_children[tech.name] and (change or not techs_done[tech.name]) then + for _, child_name in pairs(tech_children[tech.name]) do + Migrate.fill_tech_gaps_rec(tech_children, techs_done, tech.force.technologies[child_name], lock) + end + end + techs_done[tech.name] = true +end + +function Migrate.v0_1_38_zone(zone) + zone.core_miners = nil + local surface = Zone.get_make_surface(zone) + for _, miner in pairs(surface.find_entities_filtered{name = mod_prefix.."core-miner"}) do + Coreminer.on_entity_created({entity = miner}) + end +end + +function Migrate.v0_1_38 () + if global.universe then + + for _, star in pairs(global.universe.stars) do + for _, planet in pairs(star.children) do + if planet.core_miners then + Migrate.v0_1_38_zone(planet) + end + if planet.children then -- could be an asteroid-belt + for _, moon in pairs(planet.children) do + if moon.core_miners then + Migrate.v0_1_38_zone(moon) + end + end + end + end + end + end + +end + +function Migrate.v0_1_65 () + if global.universe then + for _, zone in pairs(global.zone_index) do + if zone.controls and zone.controls["enemy"] then + zone.controls["enemy-base"] = zone.controls["enemy"] + zone.controls["enemy"] = nil + if zone.name ~= "Nauvis" then + local surface = Zone.get_surface(zone) + if surface then + local map_gen_settings = surface.map_gen_settings + map_gen_settings.autoplace_controls["enemy-base"].size = zone.controls["enemy-base"].size + map_gen_settings.autoplace_controls["enemy-base"].frequency = zone.controls["enemy-base"].frequency + surface.map_gen_settings = map_gen_settings + if zone.controls["enemy-base"].size == 0 then + local enemies = surface.find_entities_filtered{force={"enemy"}} + for _, enemy in pairs(enemies) do + enemy.destroy() + end + end + end + end + end + end + end + +end + +function Migrate.v0_1_86() + if global.universe then + for _, zone in pairs(global.zone_index) do + if Zone.is_solid(zone) then + -- nauvis is 25000 + if zone.inflated and not zone.ticks_per_day then + zone.ticks_per_day = 25000 -- nauvis + if zone.name ~= "Nauvis" then + if math.random() < 0.5 then + zone.ticks_per_day = 60*60 + math.random(60*60*59) -- 1 - 60 minutes + else + zone.ticks_per_day = 60*60 + math.random(60*60*19) -- 1 - 20 minutes + end + local surface = Zone.get_surface(zone) + if surface then + surface.ticks_per_day = zone.ticks_per_day + end + end + end + end + end + end +end + +function Migrate.v0_1_89() + --global.rocket_landing_pads = global.rocket_landing_pads or {} + for _, struct in pairs(global.rocket_landing_pads) do + Landingpad.rename(struct, struct.name) + end +end + +function Migrate.v0_1_96() + if global.universe then + for _, zone in pairs(global.zone_index) do + if Zone.is_space(zone) then + local surface = Zone.get_surface(zone) + if surface then + local entities = surface.find_entities_filtered{type="offshore-pump"} + for _, entity in pairs(entities) do + entity.destroy() + end + end + end + end + end +end + +function Migrate.v0_1_101() + if global.meteor_zones then + for _, zone in pairs(global.meteor_zones) do + if zone.meteor_defences then + for _, defence in pairs(zone.meteor_defences) do + if defence.charger and defence.charger.valid then + defence.container = defence.charger.surface.find_entity(Meteor.name_meteor_defence_container, defence.charger.position) + if defence.container then + defence.container.active = false + defence.container.insert({name=Meteor.name_meteor_defence_ammo, count=10}) + end + end + end + end + if zone.meteor_point_defences then + for _, defence in pairs(zone.meteor_point_defences) do + if defence.charger and defence.charger.valid then + defence.container = defence.charger.surface.find_entity(Meteor.name_meteor_point_defence_container, defence.charger.position) + if defence.container then + defence.container.active = false + defence.container.insert({name=Meteor.name_meteor_point_defence_ammo, count=20}) + end + end + end + end + end + end +end + +function Migrate.v0_1_126() + for _, surface in pairs(game.surfaces) do + local zone = Zone.from_surface(surface) + if zone then + if zone.type == "spaceship" then + local map_gen_settings = surface.map_gen_settings + map_gen_settings.autoplace_settings={ + ["decorative"]={ + treat_missing_as_default=false, + settings={ + } + }, + ["entity"]={ + treat_missing_as_default=false, + settings={ + } + }, + ["tile"]={ + treat_missing_as_default=false, + settings={ + ["se-space"]={} + } + } + } + surface.map_gen_settings = map_gen_settings + elseif Zone.is_space(zone) then + local map_gen_settings = surface.map_gen_settings + map_gen_settings.autoplace_settings={ + ["decorative"]={ + treat_missing_as_default=false, + settings={ + ["se-crater3-huge"] ={}, + ["se-crater1-large-rare"] ={}, + ["se-crater1-large"] ={}, + ["se-crater2-medium"] ={}, + ["se-crater4-small"] ={}, + ["se-sand-decal-space"] ={}, + ["se-stone-decal-space"] ={}, + ["se-rock-medium-asteroid"] ={}, + ["se-rock-small-asteroid"] ={}, + ["se-rock-tiny-asteroid"] ={}, + ["se-sand-rock-medium-asteroid"] ={}, + ["se-sand-rock-small-asteroid"] ={} + } + }, + --[[["entity"]={ + treat_missing_as_default=false, + settings={ + ["se-rock-huge-asteroid"] ={}, + ["se-rock-big-asteroid"] ={}, + ["se-sand-rock-big-asteroid"] ={}, + ["se-rock-huge-space"] ={}, + ["se-rock-big-space"] ={}, + } + },]]-- + ["tile"]={ + treat_missing_as_default=false, + settings={ + ["se-asteroid"]={}, + ["se-space"]={} + } + }, + } + surface.map_gen_settings = map_gen_settings + else + local map_gen_settings = surface.map_gen_settings + local penalty = -100000 + map_gen_settings.property_expression_names["decorative:se-crater3-huge:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-crater1-large-rare:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-crater1-large:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-crater2-medium:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-crater4-small:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-sand-decal-space:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-stone-decal-space:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-rock-medium-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-rock-small-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-rock-tiny-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-sand-rock-medium-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-sand-rock-small-asteroid:probability"] = penalty + + map_gen_settings.property_expression_names["entity:se-rock-huge-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["entity:se-rock-big-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["entity:se-sand-rock-big-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["entity:se-rock-huge-space:probability"] = penalty + map_gen_settings.property_expression_names["entity:se-rock-big-space:probability"] = penalty + + map_gen_settings.property_expression_names["tile:se-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["tile:se-space:probability"] = penalty + surface.map_gen_settings = map_gen_settings + end + end + end +end + +function Migrate.v0_1_130() + for _, surface in pairs(game.surfaces) do + local zone = Zone.from_surface(surface) + if zone and zone.type == "orbit" and zone.parent and zone.parent.type == "star" then + surface.daytime = 0 -- that's why we're here + end + end +end + +function Migrate.v0_3_1() + setup_util_forces() + + for _, surface in pairs(game.surfaces) do + surface.solar_power_multiplier = surface.solar_power_multiplier / 2 + end + + for _, zone in pairs(global.zone_index) do + zone.inflated = nil + if zone.name == "Nauvis" then + zone.is_homeworld = true + end + if zone.resources and zone.resources[1] then + zone.primary_resource = zone.resources[1] + zone.resources = nil + end + if zone.surface_index then + Zone.delete_surface(zone) -- only works on valid ones + end + Universe.inflate_climate_controls(zone) + Zone.set_solar_and_daytime(zone) + end + Zone.rebuild_surface_index() + + -- assign glyps and vaults + for force_name, forcedata in pairs(global.forces) do + forcedata.zone_priorities = forcedata.zone_priorities or {} + for _, zone in pairs(global.zone_index) do + if zone.is_homeworld then + forcedata.zone_priorities[zone.index] = forcedata.zone_priorities[zone.index] or 1 + end + end + + local delay = 100 + for zone_index, discovery_data in pairs(forcedata.zones_discovered) do + local zone = Zone.from_zone_index(zone_index) + if zone.type == "planet" then + --delay = delay + 10 + Ancient.assign_zone_next_glyph(zone) + + if zone.glyph then + if not forcedata.first_discovered_vault then + forcedata.first_discovered_vault = zone + end + Ancient.make_vault_exterior(zone) + --local tick_task = new_tick_task("force-message") + --tick_task.force_name = force_name + --tick_task.message = {"space-exploration.discovered-glyph-vault", zone.name} + --tick_task.delay_until = game.tick + delay --5s + end + end + end + end + + local anomaly = global.universe.anomaly + if anomaly.surface_index then + local surface = game.surfaces[anomaly.surface_index] + Ancient.make_gate(Ancient.gate_default_position) + Ruin.build({ruin_name = "galaxy-ship", surface_index = surface.index, position = Ancient.galaxy_ship_default_position}) + + for force_name, forcedata in pairs(global.forces) do + local tick_task = new_tick_task("force-message") + tick_task.force_name = force_name + tick_task.message = {"space-exploration.discovered-anomaly-additional"} + tick_task.delay_until = game.tick + 750 --5s + end + end + + for _, player in pairs(game.connected_players) do + local character = player_get_character(player) + if character then + if character.force.technologies[mod_prefix .. "lifesupport-facility"].researched == true then + character.insert({name = Lifesupport.lifesupport_canisters[1].name, count = 20}) + end + end + end +end + +function Migrate.v0_3_11() + if global.glyph_vaults then + for _, g in pairs(global.glyph_vaults) do + for _, z in pairs(g) do + if z.surface_index and game.surfaces[z.surface_index] then + game.delete_surface(z.surface_index) + z.surface_index = nil + end + end + end + end +end + +function Migrate.v0_3_39() + local homeworlds = {} + for _, zone in pairs(global.zone_index) do + if zone.is_homeworld or zone.name == "Nauvis" then + table.insert(homeworlds, zone) + end + end + for _, homeworld in pairs(homeworlds) do + Universe.make_validate_homesystem(homeworld) + end + global.resources_and_controls_compare_string = nil -- force udpate resources +end + + + +function Migrate.v0_3_54() + + if global.spaceships then + for _, surface in pairs(game.surfaces) do + for _, entity in pairs(surface.find_entities_filtered{name = Spaceship.name_spaceship_console}) do + local new_pos = {x = math.floor(entity.position.x), y = math.floor(entity.position.y)} + local output = surface.find_entity(Spaceship.name_spaceship_console_output, entity.position) + entity.teleport(new_pos) + if output then output.destroy() end + script.raise_event(defines.events.script_raised_built, {entity = entity}) + end + end + end + +end + +function Migrate.v0_3_59() + + for _, star in pairs(global.universe.stars) do + for _, child in pairs(star.children) do + child.parent = star + end + Universe.star_gravity_well_distribute(star) + end + + for _, zone in pairs(global.zone_index) do + Zone.set_solar_and_daytime(zone) + end + +end + +function Migrate.v0_3_61() + + for _, zone in pairs(global.zone_index) do + if Zone.is_solid(zone) and zone.tags then + if not zone.tags.cliff then + zone.tags.cliff = Universe.cliff_tags[math.random(#Universe.cliff_tags)] + if zone.controls then + local cliff_controls = Universe.apply_control_tags({}, {zone.tags.cliff}) + for _, control in pairs(cliff_controls) do + zone.controls[_] = control + end + end + end + end + end + +end + +function Migrate.v0_3_69() + + for _, surface in pairs(game.surfaces) do + -- make sure there are no test items left in the ruin. + for _, entity in pairs(surface.find_entities_filtered{type="infinity-pipe"}) do + entity.destroy() + end + for _, entity in pairs(surface.find_entities_filtered{type="infinity-chest"}) do + entity.destroy() + end + for _, entity in pairs(surface.find_entities_filtered{name="electric-energy-interface"}) do + entity.destroy() + end + end + +end + +function Migrate.v0_3_71() + + for _, zone in pairs(global.zone_index) do + if zone.glyph and zone.vault_pyramid then + if zone.vault_pyramid.valid then + zone.vault_pyramid_position = zone.vault_pyramid.position + end + end + end + +end + +function Migrate.v0_3_88() + if global.gtt then + global.gtt[#global.gtt-3] = #global.gtt - 14 + end +end + +function Migrate.v0_3_99() + if not global.vgo then return end + local r = 0 + for i, j in pairs(global.vgo) do + if i > 40 and (Ancient.gtf(j) == 36 or Ancient.gtf(j) == 37) then + r = r + 1 + end + end + if r > 0 then + global.hcoord_old = global.hcoord + global.gds_old = global.gds + global.vgo_old = global.vgo + global.gco_old = global.gco + + global.hcoord = nil + Ancient.cryptf6() + log("Migrate.v0_3_99") + global.v0_3_99_fix = true + for force_name, force_data in pairs(global.forces) do + if force_data.coordinates_discovered then + force_data.coordinates_discovered_old = force_data.coordinates_discovered + local k = table_size(force_data.coordinates_discovered) + force_data.coordinates_discovered = {} + while k > #force_data.coordinates_discovered do + table.insert(force_data.coordinates_discovered, global.gco[#force_data.coordinates_discovered+1]) + end + end + end + end +end + +function Migrate.v0_3_112() + if global.delivery_cannons then + for _, deliver_cannon in pairs(global.delivery_cannons) do + deliver_cannon.variant = deliver_cannon.variant or "logistic" + end + end +end + +function Migrate.v0_3_135() + for _, player in pairs(game.players) do + local forcedata = global.forces[player.force.name] + forcedata.has_players = true + end + if game.active_mods["Krastorio2"] then + for _, surface in pairs(game.surfaces) do + local zone = Zone.from_surface(surface) + if zone and zone.tags and util.table_contains(zone.tags, "water_none") then + local entities = surface.find_entities_filtered{name = "kr-atmospheric-condenser"} + for _, entity in pairs(entities) do + entity.destroy() + end + end + end + end +end + + +function Migrate.v0_4_002() + if global.spaceships then + local force_max_integrity = {} + for _, spaceship in pairs(global.spaceships) do + if spaceship.integrity_valid and spaceship.integrity_stress and spaceship.integrity_stress > 1000 and spaceship.max_speed and spaceship.max_speed > 10 then + local factory_level = math.ceil(spaceship.integrity_stress/500) - 2 + local force = game.forces[spaceship.force_name] + if force and factory_level > 1 then + force.technologies[mod_prefix.."factory-spaceship-2"].researched = true + if factory_level > 2 then + force.technologies[mod_prefix.."factory-spaceship-3"].researched = true + end + if factory_level > 3 then + force.technologies[mod_prefix.."factory-spaceship-4"].researched = true + end + if factory_level > 4 then + force.technologies[mod_prefix.."factory-spaceship-5"].level = factory_level + end + end + end + end + end +end + +function Migrate.v0_4_007() + if global.spaceships and type(global.spaceships) == "table" then + for _, spaceship in pairs(global.spaceships) do + if spaceship.stellar_position then + local closest_stellar_object = Zone.find_nearest_stellar_object(spaceship.stellar_position) + if closest_stellar_object and util.vectors_delta_length(spaceship.stellar_position, closest_stellar_object.stellar_position) == 0 then + spaceship.near_stellar_object = closest_stellar_object + end + end + end + end +end + +function Migrate.v0_4_030() + Log.debug_log("Migrate.v0_4_030") + local zone_indexes = {} + for _, force in pairs(global.forces) do + if force.zones_discovered then + for index, data in pairs(force.zones_discovered) do + zone_indexes[index] = 1 + Log.debug_log("zone_index "..index) + end + end + end + for index, n in pairs(zone_indexes) do + local zone = Zone.from_zone_index(index) + if zone then + Ruin.zone_assign_unique_ruins(zone) + end + end +end + +function Migrate.v0_4_039() + local function remove_interior_tiles(zone) + if not zone.ruins then + local surface = Zone.get_surface(zone) + if surface then + -- remove space tiles + local tiles = surface.find_tiles_filtered{ name = {"interior-divider"}} + local set_tiles = {} + for _, tile in pairs(tiles) do + table.insert(set_tiles, {name = "nuclear-ground", position = tile.position}) + surface.set_hidden_tile(tile.position, nil) + end + + if #set_tiles > 0 then + surface.set_tiles( + set_tiles, + true, -- corect tiles + true, -- remove_colliding_entities + true, -- remove_colliding_decoratives + true -- raise_event + ) + end + log("Migrate.v0_4_039 remove_interior_tiles: " .. zone.type.." " ..zone.name.." is_land "..#set_tiles.." tiles changed surface_index "..surface.index.." surface_name " .. surface.name) + end + end + end + for _, zone in pairs(global.zone_index) do + remove_interior_tiles(zone) + end +end + +function Migrate.v0_4_044() + if global.spaceships then + for _, spaceship in pairs(global.spaceships) do + spaceship.engines = nil + if spaceship.own_surface_index then + Spaceship.find_own_surface_engines(spaceship) + end + end + end +end + +function Migrate.v0_5_001() + for _, player in pairs(game.connected_players) do + update_overhead_buttons(player) + end +end + +function Migrate.v0_5_039() + for _, force in pairs(game.forces) do + if force.technologies[mod_prefix .. "space-supercomputer-1"].researched then + force.print({"space-exploration.migration-recipe-changed", {"recipe-name."..mod_prefix .. "formatting-1"}}) + end + if force.technologies[mod_prefix .. "space-supercomputer-2"].researched then + force.print({"space-exploration.migration-recipe-changed", {"recipe-name."..mod_prefix .. "formatting-2"}}) + end + end +end + +function Migrate.v0_5_045() + for _, force in pairs(game.forces) do + if force.technologies[mod_prefix .. "spaceship"].researched then + force.print({"space-exploration.migration-recipe-changed", {"recipe-name."..mod_prefix .. "spaceship-floor"}}) + end + end +end + +function Migrate.v0_5_050() + for _, player in pairs(game.players) do + RemoteView.make_history_valid(player) + end +end + +function Migrate.v0_5_053() + -- destroy any open GUIs for zonelist in center since now its in screen + -- and we won't listen for the close event properly in center + for _, player in pairs(game.players) do + if player and player.gui and player.gui.center then + local zonelist_gui = player.gui.center[Zonelist.name_gui_root] + if zonelist_gui then + zonelist_gui.destroy() + end + end + end + -- destroy any open GUIs for delivery cannon since we no longer + -- listen to the close window button in that place + for _, player in pairs(game.players) do + if player.gui.left[DeliveryCannonGUI.name_delivery_cannon_gui_root] then + player.gui.left[DeliveryCannonGUI.name_delivery_cannon_gui_root].destroy() + end + end + -- destroy any open GUIS for landing pads since we no longer + -- listne to the close window button in that place + for _, player in pairs(game.players) do + if player.gui.left[LandingpadGUI.name_rocket_landing_pad_gui_root] then + player.gui.left[LandingpadGUI.name_rocket_landing_pad_gui_root].destroy() + end + end +end + +function Migrate.v0_5_056() + -- destroy any open GUIS for launchpads since we no longer + -- listne to the close window button in that place + for _, player in pairs(game.players) do + if player.gui.left[LaunchpadGUI.name_rocket_launch_pad_gui_root] then + player.gui.left[LaunchpadGUI.name_rocket_launch_pad_gui_root].destroy() + end + end + -- destroy any open GUIS for landing pads since we no longer + -- listne to the close window button in that place + for _, player in pairs(game.players) do + if player.gui.left[EnergyBeamGUI.name_transmitter_gui_root] then + player.gui.left[EnergyBeamGUI.name_transmitter_gui_root].destroy() + end + end + + -- delete the map view surface so it can be regenerated prettier + for _, player in pairs(game.players) do + local surface_name = MapView.get_surface_name(player) + if game.surfaces[surface_name] then + MapView.stop_map(player) + game.delete_surface(surface_name) + end + end +end + +return Migrate diff --git a/space-exploration_0.5.58/space-exploration/scripts/nexus.lua b/space-exploration_0.5.58/space-exploration/scripts/nexus.lua new file mode 100644 index 0000000..51ed103 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/nexus.lua @@ -0,0 +1,206 @@ +local Nexus = {} + +Nexus.name_nexus = mod_prefix.."nexus" +Nexus.name_nexus_charger = mod_prefix.."nexus-charger" +Nexus.power_usage_per_speed = 10000000 +Nexus.power_usage_dimension_drive = 8000000000 +Nexus.name_distortion_drive_recipe = mod_prefix .. "distortion-drive" +Nexus.distortion_drive_speed = 250 + +function Nexus.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.name == Nexus.name_nexus then + -- check is on spaceship floor + if entity.surface.count_tiles_filtered{collision_mask = {global.named_collision_masks.spaceship_collision_layer}} < 7*7 then + cancel_entity_creation(entity, event.player_index, {"space-exploration.construction-denied-spaceship-only"}) + else + global.nexus = global.nexus or {} + global.nexus[entity.unit_number] = { + unit_unber = entity.unit_number, + force_name = entity.force.name, + entity = entity, + charger = nil, + data_progress = 0 + } + entity.active = false + end + end +end +Event.addListener(defines.events.on_built_entity, Nexus.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, Nexus.on_entity_created) +Event.addListener(defines.events.script_raised_built, Nexus.on_entity_created) +Event.addListener(defines.events.script_raised_revive, Nexus.on_entity_created) + +function Nexus.reset_surface(surface) + for _, entity in pairs(surface.find_entities_filtered{name = Nexus.name_nexus_charger}) do + entity.destroy() + end + for _, entity in pairs(surface.find_entities_filtered{name = Nexus.name_nexus}) do + Nexus.on_entity_created({entity = entity}) + end +end + +function Nexus.on_nth_tick_60() + if global.nexus then + for _, nexus in pairs(global.nexus) do + if not nexus.entity.valid then + if nexus.charger and nexus.charger.valid then + nexus.charger.destroy() + end + if nexus.charger2 and nexus.charger2.valid then + nexus.charger2.destroy() + end + global.nexus[nexus.unit_unber] = nil + else + local clear_speed_reached_tick = true + local delete_charger_2 = true + local zone = Zone.from_surface(nexus.entity.surface) + if zone and zone.type == "spaceship" then + local spaceship = zone + if spaceship.speed and spaceship.speed > 10 then + nexus.entity.active = true + if not ( nexus.charger and nexus.charger.valid ) then + nexus.charger = nexus.entity.surface.create_entity{name = Nexus.name_nexus_charger, position = nexus.entity.position, force = nexus.entity.force} + end + local power_draw = 5 * Nexus.power_usage_per_speed / 60 -- min + + local recipe = nexus.entity.get_recipe() + if nexus.entity.status ~= defines.entity_status.working then + nexus.charger.power_usage = power_draw + else + if recipe and recipe.name == Nexus.name_distortion_drive_recipe then + power_draw = math.max(power_draw, math.min(spaceship.speed, Nexus.distortion_drive_speed) / Nexus.distortion_drive_speed * Nexus.power_usage_dimension_drive / 60) + -- Can't exceed 6GW, need 2 chargers + if not ( nexus.charger2 and nexus.charger2.valid ) then + nexus.charger2 = nexus.entity.surface.create_entity{name = Nexus.name_nexus_charger, position = nexus.entity.position, force = nexus.entity.force} + end + delete_charger_2 = false + nexus.charger.power_usage = power_draw / 2 + nexus.charger2.power_usage = power_draw / 2 + else + power_draw = math.max(power_draw, spaceship.speed * Nexus.power_usage_per_speed / 60) + nexus.charger.power_usage = power_draw + end + end + if nexus.charger.energy > 10000000 and nexus.entity.status == defines.entity_status.working and spaceship.star_gravity_well == 0 then -- 10% + nexus.data_progress = nexus.data_progress + math.pow(spaceship.speed, 2) * (spaceship.integrity_stress or 0) / 1000 + if spaceship.speed > Nexus.distortion_drive_speed and spaceship.integrity_stress >= 3000 then + local forcedata = global.forces[nexus.entity.force.name] + if recipe and recipe.name == Nexus.name_distortion_drive_recipe and nexus.entity.force.technologies[mod_prefix.."spaceship-victory"].researched then + local outer_bounds = math.sqrt(#global.universe.stars + #global.universe.space_zones) * 50 + spaceship.stellar_position = { + x = (math.random() - 0.5) * 2 * outer_bounds, + y = (math.random() - 0.5) * 2 * outer_bounds + } + spaceship.space_distortion = 0.1 + -- TODO: update spaceship position on maps + + if not nexus.speed_reached_tick then + nexus.speed_reached_tick = game.tick + end + local text = math.max(0, math.min(60, 61 - math.ceil((game.tick - nexus.speed_reached_tick ) / 60))) + clear_speed_reached_tick = false + if text <= 0 then + text = "Active" + end + if nexus.countdown_id and rendering.is_valid(nexus.countdown_id) then + rendering.set_text(nexus.countdown_id , text) + else + nexus.countdown_id = rendering.draw_text{ + text = text, + surface = nexus.entity.surface, + target = nexus.entity, + target_offset = {0, -1.7}, + color = {r=1,b=1,g=1}, + alignment = "center", + scale = 4 + } + end + if game.tick - nexus.speed_reached_tick > 60*60 and game.tick % 60 == 0 then + if nexus.entity.surface.count_entities_filtered{type = "character"} > 0 then + if not forcedata.spaceship_victory then + nexus.entity.force.print({"space-exploration.victory-message-spaceship"}) + game.set_game_state{ + game_finished=true, + player_won=true, + can_continue=true, + victorious_force=nexus.entity.force + } + forcedata.spaceship_victory = game.tick + end + local characters = nexus.entity.surface.find_entities_filtered{type = "character"} + for _, character in pairs(characters) do + if character.player then + local playerdata = get_make_playerdata(character.player) + if playerdata and not playerdata.spaceship_victory then + playerdata.spaceship_victory = game.tick + nexus.entity.force.print({"space-exploration.victory-message-spaceship-player"}) + end + end + end + else + nexus.entity.force.print(spaceship.name .. " has reached critical speed for nexus activation but no characters are aboard.") + end + end + + end + end + nexus.entity.crafting_progress = math.min(0.9, nexus.data_progress / 100000) + while nexus.data_progress > 100000 do -- once per 10 seconds at 100 speed + nexus.data_progress = nexus.data_progress - 100000 + local input = nexus.entity.get_inventory(defines.inventory.assembling_machine_input) + local output = nexus.entity.get_inventory(defines.inventory.assembling_machine_output) + if input.get_item_count(mod_prefix.."empty-data") > 0 then + if output.can_insert({name = mod_prefix.."interstellar-data", count = 1}) then + nexus.entity.products_finished = nexus.entity.products_finished + 1 + nexus.entity.crafting_progress = 0.001 + output.insert({name = mod_prefix.."interstellar-data", count = 1}) + nexus.entity.force.item_production_statistics.on_flow(mod_prefix.."interstellar-data", 1) + input.remove({name = mod_prefix.."empty-data", count = 1}) + nexus.entity.force.item_production_statistics.on_flow(mod_prefix.."empty-data", -1) + end + end + end + end + + else + nexus.entity.active = false + if not ( nexus.charger and nexus.charger.valid ) then + nexus.charger = nexus.entity.surface.create_entity{name = Nexus.name_nexus_charger, position = nexus.entity.position, force = nexus.entity.force} + end + nexus.charger.power_usage = 1 * Nexus.power_usage_per_speed / 60 + end + else + nexus.entity.active = false + if nexus.charger and nexus.charger.valid then + nexus.charger.destroy() + nexus.charger = nil + end + end + if delete_charger_2 then + if nexus.charger2 and nexus.charger2.valid then + nexus.charger2.destroy() + nexus.charger2 = nil + end + end + if clear_speed_reached_tick then + nexus.speed_reached_tick = nil + if nexus.countdown_id and rendering.is_valid(nexus.countdown_id) then + rendering.destroy(nexus.countdown_id) + nexus.countdown_id = nil + end + end + end + end + end +end +Event.addListener("on_nth_tick_60", Nexus.on_nth_tick_60) -- 1 second + +return Nexus diff --git a/space-exploration_0.5.58/space-exploration/scripts/pin.lua b/space-exploration_0.5.58/space-exploration/scripts/pin.lua new file mode 100644 index 0000000..d9c727f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/pin.lua @@ -0,0 +1,1250 @@ +local Pin = {} +--[[ +Pins +Pins lets the player save locations and quickly jump to them in navigation view. +]]-- + +-- constants +Pin.name_button_add_pin = "remote-view-add-pin" +Pin.tag_pin_button = "se-pin-button" +Pin.name_button_confirm_pin = "remote-view-confirm-pin" +Pin.name_button_cancel_pin = "remote-view-cancel-pin" +Pin.name_button_update_position_pin = "remote-view-update-positioni-pin" +Pin.name_button_pins = "remote-view-open_pins" +Pin.name_dialog_root = "remote-view-dialog-root" +Pin.name_hotkey_dropdown = "selector_content_frame_table_hotkey_dropdown" +Pin.name_setting_expanded_tooltip = mod_prefix.."show-pin-help-tooltip" +Pin.name_all_root = "remote-view-all-root" +Pin.name_button_close = "remote-view-close-pins" +Pin.min_zoom = 0.40 -- pretty close approximation to what vanilla lets you max zoom out +Pin.max_zoom = 3.00 -- pretty close approximation to what vanilla lets you max zoom in + +-- goto pin hotkeys +Pin.name_event_one = mod_prefix.."pin-one" +Pin.name_event_two = mod_prefix.."pin-two" +Pin.name_event_three = mod_prefix.."pin-three" +Pin.name_event_four = mod_prefix.."pin-four" +Pin.name_event_five = mod_prefix.."pin-five" +Pin.name_event_six = mod_prefix.."pin-six" +Pin.name_event_seven = mod_prefix.."pin-seven" +Pin.name_event_eight = mod_prefix.."pin-eight" +Pin.name_event_nine = mod_prefix.."pin-nine" +Pin.name_event_zero = mod_prefix.."pin-zero" + +-- set pin hotkeys +Pin.name_event_set_one = mod_prefix.."pin-set-one" +Pin.name_event_set_two = mod_prefix.."pin-set-two" +Pin.name_event_set_three = mod_prefix.."pin-set-three" +Pin.name_event_set_four = mod_prefix.."pin-set-four" +Pin.name_event_set_five = mod_prefix.."pin-set-five" +Pin.name_event_set_six = mod_prefix.."pin-set-six" +Pin.name_event_set_seven = mod_prefix.."pin-set-seven" +Pin.name_event_set_eight = mod_prefix.."pin-set-eight" +Pin.name_event_set_nine = mod_prefix.."pin-set-nine" +Pin.name_event_set_zero = mod_prefix.."pin-set-zero" + +--[[ +Opens the pin GUI as part of the navigation view GUI. +]]-- +function Pin.gui_open(player) + local root = player.gui.left[RemoteView.name_gui_root] + + local pin_table = root.add { + type = "table", + name = "pin_table", + column_count = 4, + style = "filter_slot_table" + } + pin_table.style.top_margin = 10 + pin_table.style.horizontally_stretchable = true + pin_table.style.column_alignments[1] = "left" + pin_table.style.column_alignments[2] = "right" + + local pin_add_flow = pin_table.add{ + type = "flow", + name = "pin_add_flow" + } + + local pin_list_flow = pin_table.add{ + type = "flow", + name = "pin_list_flow" + } + + local new_pin_button = pin_add_flow.add { + type = "sprite-button", + sprite = ("se-pin-add"), + name = Pin.name_button_add_pin, + style="informatron_close_button", + tooltip = {"space-exploration.remote-view-add-pin"}, + mouse_button_filter = {"left"} + } + new_pin_button.style.width = 32 + new_pin_button.style.height = 32 + + local add_pin_label = pin_add_flow.add { + type = "label", + name = "add_pin_label", + caption = {"space-exploration.remote-view-pin-make"} + } -- left + add_pin_label.style.font_color = { + r = 0.5, + g = 0.5, + b = 0.5 + } + add_pin_label.style.horizontally_stretchable = true + add_pin_label.style.left_margin = 10 + + local list_pins_label = pin_list_flow.add { + type = "label", + name = "list_pins_label", + caption = {"space-exploration.remote-view-pins-list"} + } -- left + list_pins_label.style.font_color = { + r = 0.5, + g = 0.5, + b = 0.5 + } + list_pins_label.style.horizontally_stretchable = true + list_pins_label.style.right_margin = 10 + + local pins = pin_list_flow.add{ + type="sprite-button", + name=Pin.name_button_pins, + sprite = "se-pin-list", + style="informatron_close_button", + tooltip={"space-exploration.open-pins-remote-view"} + } + pins.style.width = 32 + pins.style.height = 32 + + local pin_frame = root.add { + type = "frame", + name = "pin_frame", + style = "se_frame_deep_slots_small" + } + pin_frame.style.horizontally_stretchable = true + pin_frame.style.top_margin = 10 + + local pins_table = pin_frame.add { + type = "table", + name = "pins_table", + column_count = 10, + style = "filter_slot_table" + } +end + +-- Maps the hotkey index to the tooltip string +local tooltip_map = {} +-- 0 is the dropdown menu for no selection (we don't use this) +-- 1 is the dropdown menu for none hotkey (we use this) +tooltip_map[2] = "space-exploration.remote-view-pin-button-tooltip-hotkey-one" +tooltip_map[3] = "space-exploration.remote-view-pin-button-tooltip-hotkey-two" +tooltip_map[4] = "space-exploration.remote-view-pin-button-tooltip-hotkey-three" +tooltip_map[5] = "space-exploration.remote-view-pin-button-tooltip-hotkey-four" +tooltip_map[6] = "space-exploration.remote-view-pin-button-tooltip-hotkey-five" +tooltip_map[7] = "space-exploration.remote-view-pin-button-tooltip-hotkey-six" +tooltip_map[8] = "space-exploration.remote-view-pin-button-tooltip-hotkey-seven" +tooltip_map[9] = "space-exploration.remote-view-pin-button-tooltip-hotkey-eight" +tooltip_map[10] = "space-exploration.remote-view-pin-button-tooltip-hotkey-nine" +tooltip_map[11] = "space-exploration.remote-view-pin-button-tooltip-hotkey-zero" + +--[[ +Determines the appropriate tooltip to use for a certain pin. +Based on if the pin has an associated hotkey, it will use a different tooltip to show the hotkey in the tooltip. +]]-- +function Pin.get_tooltip_for_pin(playerdata, item_name) + for key, value in pairs(playerdata.saved_hotkeys) do + if value == item_name then + return tooltip_map[key] + end + end + return "space-exploration.remote-view-pin-button-tooltip" +end + +--[[ +Makes the data valid. +Deletes quick pins to deleted surfaces/spaceships. +]] +function Pin.make_valid(playerdata) + -- determine invalid pins + for key, value in pairs(playerdata.saved_pins) do + if key ~= "id" then + if not value then + playerdata.saved_pins[key] = nil + else + local location = Location.from_reference(value.location_reference) + if not location or not location.zone then + playerdata.saved_pins[key] = nil + end + end + end + end + -- replace the old pin table with a new pin table that doesn't include the invalid ones + local saved_pins_new = {} + for key, value in pairs(playerdata.saved_pins) do + if value then + saved_pins_new[key] = value + end + end + playerdata.saved_pins = saved_pins_new + -- remove hotkeys for deleted pins + for key, value in pairs(playerdata.saved_hotkeys) do + if not playerdata.saved_pins[value] then + playerdata.saved_hotkeys[key] = nil + end + end +end + +--[[ +If it is valid for the player to add or update the position of pins from their current zone. +]] +function Pin.add_or_update_pin_position_valid(player) + local root = player.gui.left[RemoteView.name_gui_root] + if root then + local currently_viewing_frame = root.currently_viewing_frame + if currently_viewing_frame then + return currently_viewing_frame.visible + end + end + return true +end + +--[[ +Rebuilds the entire quick pin GUI. +Necessary to call in response to changes to the data displayed in the GUI. +]]-- +function Pin.gui_update(player) + local playerdata = Pin.get_make_pin_playerdata(player) + + -- makes the data valid (fix deletes surfaces) + Pin.make_valid(playerdata) + + -- update the window too if it exists + Pin.window_update(player) + + -- clear the data-driven part of the GUI + local root = player.gui.left[RemoteView.name_gui_root] + if not root then + return + end + + local pins_table = root.pin_frame.pins_table + pins_table.clear() + + -- build the data-driven part of the GUI + local add_or_update_pin_position_valid = Pin.add_or_update_pin_position_valid(player) + + for key, value in pairs(playerdata.saved_pins) do + if key ~= "id" then + local sprite_path = Pin.signal_to_sprite_path(value.signal) + local location = Location.from_reference(value.location_reference) + local name = location.name or "" + local tooltip = {"", {Pin.get_tooltip_for_pin(playerdata, key), location.zone.name, name}} + if settings.get_player_settings(player)[Pin.name_setting_expanded_tooltip].value == true then + table.insert(tooltip, {"space-exploration.remote-view-pin-button-tooltip-help-text"}) + if add_or_update_pin_position_valid then + table.insert(tooltip, {"space-exploration.remote-view-pin-button-tooltip-help-text-update-position"}) + end + end + if location.zone == Zone.from_surface(player.surface) then + local pin_button = pins_table.add { + type = "sprite-button", + sprite = sprite_path, + tags = { + action = Pin.tag_pin_button, + item_name = key + }, + style = "se_sprite-button_inset", + tooltip = tooltip + } + end + end + end + + + -- add the new-pin button at the end of the list so it's always last + if add_or_update_pin_position_valid then + root.pin_table.pin_add_flow.add_pin_label.visible = true + root.pin_table.pin_add_flow[Pin.name_button_add_pin].visible = true + else + root.pin_table.pin_add_flow.add_pin_label.visible = false + root.pin_table.pin_add_flow[Pin.name_button_add_pin].visible = false + end + + -- if there are no pins and adding pins is not valid, make the UI for pins invisible + if #pins_table.children > 0 then + --root.pin_table.visible = true + root.pin_frame.visible = true + else + --root.pin_table.visible = false + root.pin_frame.visible = false + end +end + +--[[ +Handles click events anywhere on the UI: + clicks on the add-pin button uses Pin.modal_open + delegates clicks on pin buttons to Pin.on_gui_pin_button_click + delegates clicks on the modal to Pin.on_gui_modal_click +Return value is if the quick pin UI consumed the event. +]]-- +function Pin.on_gui_click(event) + local element = event.element + local player = game.players[event.player_index] + + if element.name == Pin.name_button_pins then + Pin.window_toggle(player) + return + end + if element.tags and element.tags.action == Pin.tag_pin_button then + Pin.on_gui_pin_button_click(player, event) return true + elseif element.name == Pin.name_button_add_pin then + local playerdata = Pin.get_make_pin_playerdata(player) + local id = playerdata.saved_pins.id + local item_name = "pin-button-prefix-" .. id + playerdata.saved_pins.id = playerdata.saved_pins.id + 1 + Pin.modal_open(player, item_name) return true + else + local root = gui_element_or_parent(element, Pin.name_dialog_root) + if root then + Pin.on_gui_modal_click(player, root, element) return true + else + root = gui_element_or_parent(element, Pin.name_all_root) + if root then + Pin.on_gui_window_click(player, root, element) return true + end + end + end + return false +end + +--[[ +Handles click events on the modal. +]] +function Pin.on_gui_modal_click(player, root, element) + if element.name == Pin.name_button_confirm_pin then + local name_textfield = root.selector_content_flow.selector_content_frame.selector_content_frame_flow + .selector_content_frame_table.selector_content_frame_table_name_textfield + local icon_selector = root.selector_content_flow.selector_content_frame.selector_content_frame_flow + .selector_content_frame_table.selector_content_frame_table_icon_selector + local zoom_textfield = root.selector_content_flow.selector_content_frame.selector_content_frame_flow + .selector_content_frame_table.selector_content_frame_table_zoom_flow.selector_content_frame_table_zoom_flow_textfield + local hotkey_dropdown = root.selector_content_flow.selector_content_frame.selector_content_frame_flow + .selector_content_frame_table.selector_content_frame_table_hotkey_dropdown + local text = name_textfield.text + local icon = icon_selector.elem_value + local zoom = zoom_textfield.text + local hotkey = hotkey_dropdown.selected_index + Pin.add_update_pin(player, text, icon, zoom, hotkey, true) + Pin.modal_close(player) + elseif element.name == Pin.name_button_cancel_pin then + Pin.modal_close(player) + elseif element.name == Pin.name_button_update_position_pin then + local add_or_update_pin_position_valid = Pin.add_or_update_pin_position_valid(player) + -- don't allow the player to update the position of a pin when their current position isn't valid + if add_or_update_pin_position_valid then + local playerdata = Pin.get_make_pin_playerdata(player) + local saved_pin = playerdata.saved_pins[playerdata.quick_pin_opened_item_name] + saved_pin.location_reference = Location.update_reference_position(saved_pin.location_reference, Zone.from_surface(player.surface), player.position) + -- since we don't have a method for rebuilding the modal gui, make the changes to it here + local root = player.gui.screen[Pin.name_dialog_root] + if root then + root.selector_content_flow.selector_content_frame.selector_content_frame_flow + .selector_content_frame_table.selector_content_frame_table_location_flow + .selector_content_frame_table_location_flow_label.caption = {"space-exploration.remote-view-pin-location-position", string.format("%.0f", player.position.x), string.format("%.0f", player.position.y)} + end + end + end +end + +--[[ +Handles click events on the window. +]] +function Pin.on_gui_window_click(player, root, element) + if element.name == Pin.name_button_close then + Pin.window_close(player) + end +end + +--[[ +Closes this GUI. +]] +function Pin.gui_close(player) + Pin.modal_close(player) + Pin.window_close(player) +end + +--[[ +Closes the modal. +]]-- +function Pin.modal_close(player) + if player.gui.screen[Pin.name_dialog_root] then + player.gui.screen[Pin.name_dialog_root].destroy() + end +end + +--[[ +Converts a signal to a sprite path. +The signal is chosen from a "choose-elem-button" UI element with "elem_type" set to "signal". +]] +function Pin.signal_to_sprite_path(signal) + if signal then + if signal.type == "item" then + return "item/" .. signal.name + elseif signal.type == "fluid" then + return "fluid/" .. signal.name + elseif signal.type == "virtual" then + return "virtual-signal/" .. signal.name + end + end + return nil +end + +--[[ +Converts a signal to a rich text icon. +The signal is chosen from a "choose-elem-button" UI element with "elem_type" set to "signal". +]]-- +function Pin.signal_to_rich_text(signal) + if signal then + if signal.type == "item" then + return "[img=item."..signal.name.."]" + elseif signal.type == "fluid" then + return "[img=fluid."..signal.name.."]" + elseif signal.type == "virtual" then + return "[img=virtual-signal."..signal.name.."]" + end + end + return "" +end + +--[[ +Makes the rich text icon string for the hotkey dropdown option. +Each hotkey dropdown displays the hotkey itself followed by a rich text icon of the pin it is for. +This function creates that rich text icon based on the index of the dropdown option. +]]-- +function Pin.make_hotkey_string(playerdata, index) + if playerdata.saved_hotkeys[index] then + local saved_pin = playerdata.saved_pins[playerdata.saved_hotkeys[index]] + if saved_pin then + return Pin.signal_to_rich_text(saved_pin.signal) + end + end + return "" +end + +--[[ +Opens a modal for selecting the properties of the pin icon on the bar. +The modal is setup to match the look/feel of the vanilla map tag UI. +]]-- +function Pin.modal_open(player, item_name) + Pin.modal_close(player) -- always start fresh + + local playerdata = Pin.get_make_pin_playerdata(player) + playerdata.quick_pin_opened_item_name = item_name + + local selector_frame = player.gui.screen.add { + type = "frame", + name = Pin.name_dialog_root, + direction = "vertical" + } + selector_frame.style.maximal_height = 1440 + selector_frame.auto_center = true + + local selector_title_flow = selector_frame.add { + type = "flow", + direction = "horizontal" + } + selector_title_flow.drag_target = selector_frame + selector_title_flow.style.vertically_stretchable = "off" + + local selector_title_label = selector_title_flow.add { + type = "label", + caption = {"space-exploration.remote-view-pin-details"}, + style = "frame_title", + ignored_by_interaction = true + } + selector_title_label.style.vertically_stretchable = "on" + selector_title_label.style.horizontally_squashable = "on" + + local selector_title_empty = selector_title_flow.add { + type = "empty-widget", + style = "draggable_space", + ignored_by_interaction = true + } + selector_title_empty.style.horizontally_stretchable = "on" + selector_title_empty.style.left_margin = 4 + selector_title_empty.style.right_margin = 0 + selector_title_empty.style.height = 24 + + local selector_content_flow = selector_frame.add { + type = "flow", + name = "selector_content_flow", + direction = "vertical" + } + + local selector_content_frame = selector_content_flow.add { + type = "frame", + name = "selector_content_frame", + direction = "vertical", + style = "inside_shallow_frame_with_padding" + } + selector_content_frame.style.horizontally_stretchable = "on" + + local selector_content_frame_flow = selector_content_frame.add { + type = "flow", + name = "selector_content_frame_flow", + direction = "horizontal" + } + selector_content_frame_flow.style.horizontally_stretchable = "on" + + local selector_content_frame_table = selector_content_frame_flow.add { + type = "table", + name = "selector_content_frame_table", + column_count = 2, + style = "player_input_table" + } + + local selector_content_frame_table_name_label = selector_content_frame_table.add { + type = "label", + caption = {"space-exploration.remote-view-pin-name"} + } + + local selector_content_frame_table_name_textfield = selector_content_frame_table.add { + type = "textfield", + name = "selector_content_frame_table_name_textfield" + } + selector_content_frame_table_name_textfield.style.maximal_width = 0 + selector_content_frame_table_name_textfield.style.horizontally_stretchable = "on" + selector_content_frame_table_name_textfield.focus() + selector_content_frame_table_name_textfield.select_all() + + local selector_content_frame_table_icon_label = selector_content_frame_table.add { + type = "label", + caption = {"space-exploration.remote-view-pin-icon"} + } + + local selector_content_frame_table_icon_selector = selector_content_frame_table.add { + type = "choose-elem-button", + elem_type = "signal", + name = "selector_content_frame_table_icon_selector" + } + + local selector_content_frame_table_zoom_label = selector_content_frame_table.add { + type = "label", + caption = {"space-exploration.remote-view-pin-zoom"} + } + + local selector_content_frame_table_zoom_flow = selector_content_frame_table.add { + type = "flow", + direction = "horizontal", + name = "selector_content_frame_table_zoom_flow" + } + selector_content_frame_table_zoom_flow.style.vertical_align = "center" + + local selector_content_frame_table_zoom_flow_slider = selector_content_frame_table_zoom_flow.add { + type = "slider", + minimum_value = Pin.min_zoom, + maximum_value = Pin.max_zoom, + discrete_values = false, + name = "selector_content_frame_table_zoom_flow_slider" + } + + local selector_content_frame_table_zoom_flow_textfield = selector_content_frame_table_zoom_flow.add { + type = "textfield", + numeric = true, + allow_decimal = true, + name = "selector_content_frame_table_zoom_flow_textfield" + } + selector_content_frame_table_zoom_flow_textfield.style.width = 40 + + local selector_content_frame_table_hotkey_label = selector_content_frame_table.add { + type = "label", + caption = {"space-exploration.remote-view-pin-hotkey"} + } + + local selector_content_frame_table_hotkey_dropdown = selector_content_frame_table.add { + type = "drop-down", + name = Pin.name_hotkey_dropdown, + items = { + {"space-exploration.remote-view-pin-hotkey-none"}, + {"space-exploration.remote-view-pin-hotkey-one", Pin.make_hotkey_string(playerdata, 2)}, + {"space-exploration.remote-view-pin-hotkey-two", Pin.make_hotkey_string(playerdata, 3)}, + {"space-exploration.remote-view-pin-hotkey-three", Pin.make_hotkey_string(playerdata, 4)}, + {"space-exploration.remote-view-pin-hotkey-four", Pin.make_hotkey_string(playerdata, 5)}, + {"space-exploration.remote-view-pin-hotkey-five", Pin.make_hotkey_string(playerdata, 6)}, + {"space-exploration.remote-view-pin-hotkey-six", Pin.make_hotkey_string(playerdata, 7)}, + {"space-exploration.remote-view-pin-hotkey-seven", Pin.make_hotkey_string(playerdata, 8)}, + {"space-exploration.remote-view-pin-hotkey-eight", Pin.make_hotkey_string(playerdata, 9)}, + {"space-exploration.remote-view-pin-hotkey-nine", Pin.make_hotkey_string(playerdata, 10)}, + {"space-exploration.remote-view-pin-hotkey-zero", Pin.make_hotkey_string(playerdata, 11)} + }, + selected_index = 1 -- start with none selected + } + + -- update location is only valid if the saved_pin we are updating has a valid location + local saved_pin = playerdata.saved_pins[playerdata.quick_pin_opened_item_name] + if saved_pin then + local location = Location.from_reference(saved_pin.location_reference) + if location and location.position and location.zone == Zone.from_surface(player.surface) then + local selector_content_frame_table_location_label = selector_content_frame_table.add { + type = "label", + caption = {"space-exploration.remote-view-pin-location"} + } + + local selector_content_frame_table_location_flow = selector_content_frame_table.add { + type = "flow", + direction = "horizontal", + name = "selector_content_frame_table_location_flow" + } + selector_content_frame_table_location_flow.style.vertical_align = "center" + local selector_content_frame_table_location_flow_button = selector_content_frame_table_location_flow.add { + type = "button", + name = Pin.name_button_update_position_pin, + caption = {"space-exploration.remote-view-pin-location-position-button"}, + tooltip = {"space-exploration.remote-view-pin-location-position-button-tooltip"}, + mouse_button_filter = {"left"} + } + local selector_content_frame_table_location_flow_label = selector_content_frame_table_location_flow.add { + type = "label", + caption = {"space-exploration.remote-view-pin-location-position", string.format("%.0f", location.position.x), string.format("%.0f", location.position.y)}, + name = "selector_content_frame_table_location_flow_label" + } + end + end + + -- Button bar + local button_bar = selector_frame.add { + type = "flow", + direction = "horizontal", + style = "dialog_buttons_horizontal_flow" + } + button_bar.style.horizontal_spacing = 0 + button_bar.drag_target = selector_frame + + -- Cancel/Back button + local button_cancel = button_bar.add { + type = "button", + name = Pin.name_button_cancel_pin, + style = "back_button", + caption = {"gui-tag-edit.cancel"}, + mouse_button_filter = {"left"} + } + button_cancel.style.minimal_width = 0 + button_cancel.style.padding = {1, 12, 0, 12} + + local button_empty = button_bar.add { + type = "empty-widget", + style = "draggable_space", + ignored_by_interaction = true + } + button_empty.style.horizontally_stretchable = "on" + button_empty.style.left_margin = 10 + button_empty.style.right_margin = 10 + button_empty.style.height = 24 + + -- Submit button + local button_submit = button_bar.add { + type = "button", + name = Pin.name_button_confirm_pin, + caption = {"gui-tag-edit.confirm"}, + tooltip = {"gui.confirm-instruction"}, + style = "confirm_button", + mouse_button_filter = {"left"} + } + button_submit.style.minimal_width = 0 + button_submit.style.padding = {1, 8, 0, 12} + + -- if we are opening an existing pin to modify it, pre-populate the modal with the info for that pin + if saved_pin then + local location = Location.from_reference(saved_pin.location_reference) + selector_content_frame_table_name_textfield.text = location.name or "" + selector_content_frame_table_icon_selector.elem_value = saved_pin.signal + selector_content_frame_table_zoom_flow_slider.slider_value = saved_pin.zoom or selector_content_frame_table_zoom_flow_slider.slider_value + selector_content_frame_table_hotkey_dropdown.selected_index = 1 + for key, value in pairs(playerdata.saved_hotkeys) do + if value == playerdata.quick_pin_opened_item_name then + selector_content_frame_table_hotkey_dropdown.selected_index = key + end + end + end + selector_content_frame_table_zoom_flow_textfield.text = string.format("%.2f", selector_content_frame_table_zoom_flow_slider.slider_value) +end + +--[[ +Clamps zoom to reasonable values. Must not be nil +]] +function Pin.clamp_zoom(zoom) + if zoom < Pin.min_zoom then + zoom = Pin.min_zoom + end + if zoom > Pin.max_zoom then + zoom = Pin.max_zoom + end + return zoom +end + +--[[ +Handles text changes to the zoom textfield. +]]-- +function Pin.on_gui_text_changed(event) + if event.element.name == "selector_content_frame_table_zoom_flow_textfield" then + local player = game.players[event.player_index] + local root = player.gui.screen[Pin.name_dialog_root] + local zoom_slider = root.selector_content_flow.selector_content_frame.selector_content_frame_flow + .selector_content_frame_table.selector_content_frame_table_zoom_flow.selector_content_frame_table_zoom_flow_slider + local zoom = tonumber(event.text) + -- empty textbox gives nil + if zoom then + zoom = Pin.clamp_zoom(zoom) + zoom_slider.slider_value = zoom + end + end +end +Event.addListener(defines.events.on_gui_text_changed, Pin.on_gui_text_changed) + +--[[ +Handles value changes to the zoom slider. +]]-- +function Pin.on_gui_value_changed(event) + if event.element.name == "selector_content_frame_table_zoom_flow_slider" then + local player = game.players[event.player_index] + local root = player.gui.screen[Pin.name_dialog_root] + local zoom_textfield = root.selector_content_flow.selector_content_frame.selector_content_frame_flow + .selector_content_frame_table.selector_content_frame_table_zoom_flow.selector_content_frame_table_zoom_flow_textfield + local zoom = event.element.slider_value + zoom_textfield.text = string.format("%.2f", zoom) + end +end +Event.addListener(defines.events.on_gui_value_changed, Pin.on_gui_value_changed) + +-- Maps the input event name to the index that we save that hotkey's pin at. +local hotkey_map = {} +-- 0 is the dropdown menu for no selection (we don't use this) +-- 1 is the dropdown menu for none hotkey (we use this) +hotkey_map[Pin.name_event_one]=2 +hotkey_map[Pin.name_event_two]=3 +hotkey_map[Pin.name_event_three]=4 +hotkey_map[Pin.name_event_four]=5 +hotkey_map[Pin.name_event_five]=6 +hotkey_map[Pin.name_event_six]=7 +hotkey_map[Pin.name_event_seven]=8 +hotkey_map[Pin.name_event_eight]=9 +hotkey_map[Pin.name_event_nine]=10 +hotkey_map[Pin.name_event_zero]=11 +hotkey_map[Pin.name_event_set_one]=2 +hotkey_map[Pin.name_event_set_two]=3 +hotkey_map[Pin.name_event_set_three]=4 +hotkey_map[Pin.name_event_set_four]=5 +hotkey_map[Pin.name_event_set_five]=6 +hotkey_map[Pin.name_event_set_six]=7 +hotkey_map[Pin.name_event_set_seven]=8 +hotkey_map[Pin.name_event_set_eight]=9 +hotkey_map[Pin.name_event_set_nine]=10 +hotkey_map[Pin.name_event_set_zero]=11 + +--[[ +Handles pin hotkey presses. +]]-- +function Pin.on_pin_hotkey_press(event) + local player_index = event.player_index + if player_index and game.players[player_index] and game.players[player_index].connected then + local player = game.players[player_index] + local playerdata = Pin.get_make_pin_playerdata(player) + local index = hotkey_map[event.input_name] + if index then + if playerdata.saved_hotkeys[index] then + Pin.do_pin(player, playerdata.saved_hotkeys[index]) + end + end + end +end +Event.addListener(Pin.name_event_one, Pin.on_pin_hotkey_press) +Event.addListener(Pin.name_event_two, Pin.on_pin_hotkey_press) +Event.addListener(Pin.name_event_three, Pin.on_pin_hotkey_press) +Event.addListener(Pin.name_event_four, Pin.on_pin_hotkey_press) +Event.addListener(Pin.name_event_five, Pin.on_pin_hotkey_press) +Event.addListener(Pin.name_event_six, Pin.on_pin_hotkey_press) +Event.addListener(Pin.name_event_seven, Pin.on_pin_hotkey_press) +Event.addListener(Pin.name_event_eight, Pin.on_pin_hotkey_press) +Event.addListener(Pin.name_event_nine, Pin.on_pin_hotkey_press) +Event.addListener(Pin.name_event_zero, Pin.on_pin_hotkey_press) + +--[[ +Handles set hotkey presses. +]] +function Pin.on_set_hotkey_press(event) + local player_index = event.player_index + if player_index and game.players[player_index] and game.players[player_index].connected then + local player = game.players[player_index] + local playerdata = Pin.get_make_pin_playerdata(player) + local index = hotkey_map[event.input_name] + if index then + local id = playerdata.saved_pins.id + local item_name = "pin-button-prefix-" .. id + playerdata.saved_pins.id = playerdata.saved_pins.id + 1 + playerdata.quick_pin_opened_item_name = item_name + local zone = Zone.from_surface(player.surface) + if zone then + Pin.add_update_pin(player, nil, { + type = "virtual", + name = Zone.get_signal_name(zone) + }, Pin.min_zoom, index, false) + end + end + end +end +Event.addListener(Pin.name_event_set_one, Pin.on_set_hotkey_press) +Event.addListener(Pin.name_event_set_two, Pin.on_set_hotkey_press) +Event.addListener(Pin.name_event_set_three, Pin.on_set_hotkey_press) +Event.addListener(Pin.name_event_set_four, Pin.on_set_hotkey_press) +Event.addListener(Pin.name_event_set_five, Pin.on_set_hotkey_press) +Event.addListener(Pin.name_event_set_six, Pin.on_set_hotkey_press) +Event.addListener(Pin.name_event_set_seven, Pin.on_set_hotkey_press) +Event.addListener(Pin.name_event_set_eight, Pin.on_set_hotkey_press) +Event.addListener(Pin.name_event_set_nine, Pin.on_set_hotkey_press) +Event.addListener(Pin.name_event_set_zero, Pin.on_set_hotkey_press) + +--[[ +Removes any pins that have the given hotkey as long as they are not player-modified. +This allows for the pin-set-hotkeys that create new locations to overwrite each other +and not leave a bunch of permanent pins if used a bunch of times in a row without +the player explicitly indicating that they want to permanently keep the hotkey by +manually opening the modal and changing something in it. +]]-- +function Pin.remove_unmodified_with_hotkey(playerdata, hotkey) + if hotkey then + for key, value in pairs(playerdata.saved_hotkeys) do + if key == hotkey and value and playerdata.saved_pins[value] then + if not playerdata.saved_pins[value].player_modified then + playerdata.saved_pins[value] = nil + end + end + end + end +end + +--[[ +Updates the hotkey associated with a pin. +First clears the hotkey associated with the pin. +Then adds the new hotkey. +]]-- +function Pin.set_hotkey(playerdata, item_name, hotkey) + if hotkey then + for key, value in pairs(playerdata.saved_hotkeys) do + if value == item_name then + playerdata.saved_hotkeys[key] = nil + end + end + -- only save hotkey information for proper hotkeys (not unselected or none) + if hotkey > 1 then + playerdata.saved_hotkeys[hotkey] = item_name + end + end +end + +--[[ +Creates or updates a pin. +Always sets the pin's name and icon. +When creating an entirely new pin, the pin's position is set based on the player's current position in the navigation view. +Forces a GUI rebuild. +]]-- +function Pin.add_update_pin(player, name, signal, zoom, hotkey, player_modified) + local playerdata = Pin.get_make_pin_playerdata(player) + playerdata.saved_pins[playerdata.quick_pin_opened_item_name] = playerdata.saved_pins[playerdata.quick_pin_opened_item_name] or {} + local saved_pin = playerdata.saved_pins[playerdata.quick_pin_opened_item_name] + saved_pin.signal = signal + zoom = tonumber(zoom) or 1 + zoom = Pin.clamp_zoom(zoom) + saved_pin.zoom = tonumber(string.format("%.2f", zoom)) + saved_pin.player_modified = player_modified + + if not saved_pin.location_reference then + saved_pin.location_reference = Location.make_reference(Zone.from_surface(player.surface), player.position, name) + else + saved_pin.location_reference = Location.update_reference_name(saved_pin.location_reference, name) + end + + Pin.remove_unmodified_with_hotkey(playerdata, hotkey) + Pin.set_hotkey(playerdata, playerdata.quick_pin_opened_item_name, hotkey) + Pin.gui_update(player) +end + +--[[ +Performs a pin. +Opens/moves the player's navigation view to the pin's position. +Only attempts to perform the pin if the target is valid. +]]-- +function Pin.do_pin(player, item_name) + if item_name then + local playerdata = Pin.get_make_pin_playerdata(player) + local saved_pin = playerdata.saved_pins[item_name] + if saved_pin then + local location = Location.from_reference(saved_pin.location_reference) + if location then + RemoteView.start(player, location.zone, location.position, location.name) + end + -- if playerdata.surface_positions then + -- playerdata.surface_positions[player.surface.index] = player.position + -- end + player.close_map() + if saved_pin.zoom then + player.zoom = saved_pin.zoom + end + end + end +end + +--[[ +Deletes a pin. +Forces a GUI rebuild. +]]-- +function Pin.delete_pin(player, item_name) + local playerdata = Pin.get_make_pin_playerdata(player) + playerdata.saved_pins[item_name] = nil + Pin.gui_update(player) +end + +--[[ +Handles click events for the pin buttons. +Four distinct events are tracked: + left-click performs a pin + right-click opens the modal for editing the pin + shift-right-click resets the pin position to the current location + ctrl-right-click deletes the pin +]]-- +function Pin.on_gui_pin_button_click(player, event) + local element = event.element + if not element or not element.tags or not element.tags.item_name then + return + end + local item_name = element.tags.item_name + + if event.button == defines.mouse_button_type.left then + Pin.do_pin(player, item_name) + elseif event.button == defines.mouse_button_type.right then + if event.control then + Pin.delete_pin(player, item_name) + elseif event.shift then + local add_or_update_pin_position_valid = Pin.add_or_update_pin_position_valid(player) + -- don't allow the player to update the position of a pin when their current position isn't valid + if add_or_update_pin_position_valid then + local playerdata = Pin.get_make_pin_playerdata(player) + local saved_pin = playerdata.saved_pins[item_name] + saved_pin.location_reference = Location.update_reference_position(saved_pin.location_reference, Zone.from_surface(player.surface), player.position) + end + else + Pin.modal_open(player, item_name) + end + end +end + +--[[ +Closes the window. +]]-- +function Pin.window_close(player) + if player.gui.screen[Pin.name_all_root] then + player.gui.screen[Pin.name_all_root].destroy() + end +end + +--[[ +Toggles the window. +]]-- +function Pin.window_toggle(player) + if player.gui.screen[Pin.name_all_root] then + Pin.window_close(player) + else + Pin.window_open(player) + end +end + +--[[ +Opens the window for viewing all pins. +]]-- +function Pin.window_open(player) + Pin.window_close(player) + + local playerdata = Pin.get_make_pin_playerdata(player) + + local viewer_frame = player.gui.screen.add { + type = "frame", + name = Pin.name_all_root, + direction = "vertical" + } + viewer_frame.style.maximal_height = 1440 + viewer_frame.auto_center = true + + local viewer_title_table = viewer_frame.add { + type = "table", + column_count = 2, + draw_horizontal_lines = false, + } + viewer_title_table.style.horizontally_stretchable = true + viewer_title_table.style.column_alignments[1] = "left" + viewer_title_table.style.column_alignments[2] = "right" + + local viewer_title_flow = viewer_title_table.add { + type = "flow", + direction = "horizontal" + } + viewer_title_flow.drag_target = viewer_frame + viewer_title_flow.style.vertically_stretchable = false + + local viewer_title_label = viewer_title_flow.add { + type = "label", + caption = {"space-exploration.remote-view-pin-viewer-title"}, + style = "frame_title", + ignored_by_interaction = true + } + viewer_title_label.style.vertically_stretchable = true + viewer_title_label.style.horizontally_squashable = true + + local viewer_title_empty = viewer_title_flow.add { + type = "empty-widget", + style = "draggable_space", + ignored_by_interaction = true + } + viewer_title_empty.style.horizontally_stretchable = true + viewer_title_empty.style.left_margin = 4 + viewer_title_empty.style.right_margin = 0 + viewer_title_empty.style.height = 24 + + local viewer_title_close = viewer_title_table.add { + type="sprite-button", + name=Pin.name_button_close, + sprite = "utility/close_white", + style="informatron_close_button", + tooltip={"space-exploration.exit-pins-remote-view"} + } + viewer_title_close.style.width = 28 + viewer_title_close.style.height = 28 + + local viewer_content_flow = viewer_frame.add { + type = "scroll-pane", + name = "viewer_content_flow", + horizontal_scroll_policy = "never" + } + viewer_content_flow.style.height = 420 + viewer_content_flow.style.minimal_width = 400 + viewer_content_flow.style.padding = 0 + + Pin.window_update(player) +end + +--[[ +Makes a row containing some pins for the window. +]] +function Pin.make_window_row(player, playerdata, viewer_content_frame_flow, pins, zone_name) + local pin_row_label = viewer_content_frame_flow.add { + type = "label", + caption = zone_name + } -- left + pin_row_label.style.font_color = { + r = 0.5, + g = 0.5, + b = 0.5 + } + + local pin_row_frame = viewer_content_frame_flow.add { + type = "frame", + style = "se_frame_deep_slots_small" + } + pin_row_frame.style.horizontally_stretchable = true + + local pin_row_table = pin_row_frame.add { + type = "table", + column_count = 10, + style = "filter_slot_table" + } + pin_row_table.style.width = 400 + + local add_or_update_pin_position_valid = Pin.add_or_update_pin_position_valid(player) + + for key, value in pairs(pins) do + local sprite_path = Pin.signal_to_sprite_path(value.signal) + local location = Location.from_reference(value.location_reference) + if location then + local name = location.name or "" + local tooltip = {"", {Pin.get_tooltip_for_pin(playerdata, key), location.zone.name, name}} + if settings.get_player_settings(player)[Pin.name_setting_expanded_tooltip].value == true then + table.insert(tooltip, {"space-exploration.remote-view-pin-button-tooltip-help-text"}) + if add_or_update_pin_position_valid then + table.insert(tooltip, {"space-exploration.remote-view-pin-button-tooltip-help-text-update-position"}) + end + end + local pin_button = pin_row_table.add { + type = "sprite-button", + sprite = sprite_path, + tags = { + action = Pin.tag_pin_button, + item_name = key + }, + style = "se_sprite-button_inset", + tooltip = tooltip + } + end + end +end + +--[[ +Updates the pins window in response to changes to the data. +Rebuilds the entire window UI. +]] +function Pin.window_update(player) + local playerdata = Pin.get_make_pin_playerdata(player) + local force_name = player.force.name + + -- clear the data-driven part of the GUI + local root = player.gui.screen[Pin.name_all_root] + if not root then + return + end + + local viewer_content_flow = root.viewer_content_flow + viewer_content_flow.clear() + + local zone_to_count = {} + local spaceships + + -- count how many pins are in each zone + for key, value in pairs(playerdata.saved_pins) do + if key ~= "id" then + local location = Location.from_reference(value.location_reference) + if location then + local priority = Zone.get_priority(location.zone, force_name) + local zone_name = location.zone.name + -- track spaceship pins separately from normal pins + if location.type == "spaceship" then + if spaceships then + spaceships.pins[key] = value + if priority > spaceships.priority then + spaceships.priority = priority + end + else + local pins = {} + pins[key] = value + spaceships = {pins=pins,priority=priority} + end + -- normal pins here + else + if zone_to_count[zone_name] then + zone_to_count[zone_name].count = zone_to_count[zone_name].count + 1 + zone_to_count[zone_name].pins[key] = value + if priority > zone_to_count[zone_name].priority then + zone_to_count[zone_name].priority = priority + end + else + local pins = {} + pins[key] = value + zone_to_count[zone_name] = {count=1,pins=pins,priority=priority} + end + end + end + end + end + + local roots_to_count = {} + + -- for any zone that has < 2 pins, reassign its pins to either its star's zone (if possible) + for key, value in pairs(zone_to_count) do + local look_for_parent = value.count < 2 + if value.pins then + local zone = Zone.from_name(key) + local priority = value.priority + if look_for_parent and zone then + zone = Zone.find_parent_star(zone) or zone + end + for key2, value2 in pairs(value.pins) do + local zone_name + if zone then + zone_name = zone.name + else + zone_name = key + end + if roots_to_count[zone_name] then + roots_to_count[zone_name].count = roots_to_count[zone_name].count + 1 + roots_to_count[zone_name].pins[key2] = value2 + if priority > roots_to_count[zone_name].priority then + roots_to_count[zone_name].priority = priority + end + else + local pins = {} + pins[key2] = value2 + roots_to_count[zone_name] = {count=1,pins=pins,priority=priority} + end + end + end + end + + local finals_to_count = {} + + -- for any zone that *still* has < 2 pins, reassign its pins to the misc zone + for key, value in pairs(roots_to_count) do + local assign_to_misc = value.count < 2 + if value.pins then + local zone_name = key + local priority = value.priority + if assign_to_misc then + zone_name = {"space-exploration.remote-view-pin-viewer-misc-row"} + end + for key2, value2 in pairs(value.pins) do + if finals_to_count[zone_name] then + finals_to_count[zone_name].count = finals_to_count[zone_name].count + 1 + finals_to_count[zone_name].pins[key2] = value2 + if priority > finals_to_count[zone_name].priority then + finals_to_count[zone_name].priority = priority + end + else + local pins = {} + pins[key2] = value2 + finals_to_count[zone_name] = {count=1,pins=pins,priority=priority} + end + end + end + end + + -- assign all spaceship pins to a special row + if spaceships then + finals_to_count[{"space-exploration.remote-view-pin-viewer-spaceship-row"}] = {pins=spaceships.pins,priority=spaceships.priority} + end + + -- sort the rows by priority + local rows_array = {} + for key, value in pairs(finals_to_count) do + table.insert(rows_array, {key=key,value=value}) + end + table.sort(rows_array, function (a, b) + return a.value.priority > b.value.priority + end) + for index, element in ipairs(rows_array) do + Pin.make_window_row(player, playerdata, viewer_content_flow, element.value.pins, element.key) + end +end + +--[[ +Toggles if the pins window is open/closed. +]] +function Pin.window_toggle(player) + if player.gui.screen[Pin.name_all_root] then + Pin.window_close(player) + else + Pin.window_open(player) + end +end + +--[[ +Get/Make PlayerData relevant to Pin. +Ensures that the returned PlayerData has two tables so accessing them can be done without nil checks: + saved_pins stores a mapping of pin-id to the details about that quick pin + saved_hotkeys stores a mapping of hotkey-id to the pin-id that hotkey links to +]]-- +function Pin.get_make_pin_playerdata(player) + local playerdata = get_make_playerdata(player) + playerdata.saved_pins = playerdata.saved_pins or { + id = 0 + } + playerdata.saved_hotkeys = playerdata.saved_hotkeys or {} + return playerdata +end + +return Pin diff --git a/space-exploration_0.5.58/space-exploration/scripts/profiler.lua b/space-exploration_0.5.58/space-exploration/scripts/profiler.lua new file mode 100644 index 0000000..4ce24ea --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/profiler.lua @@ -0,0 +1,170 @@ +--[[ + +Profiler functions + +LuaProfiler is desync unsafe so you cannot use it in multiplayer. + +Prints summary to log file and to console every 5 seconds. + + +Example 1: +Profiler.start('test1') + ...code... +Profiler.split('test1','chunk1') -- optional + ...code... +Profiler.split('test1','chunk2') -- optional + ...code... +Profiler.stop('test1') + +Example 2: +Profiler.start('test2', table_size(items)) +for _, item in pairs(items) do + ...code... +end +Profiler.stop('test2') + +Example 3: +Profiler.count('counter1') + +]]-- + +local Profiler = { + enabled = false, + print_to_console = true +} + +if is_debug_mode and Profiler.enabled then + local active_profilers = {} + local active_splits = {} + local active_counters = {} + + -- LuaProfiler makes the game slower as more and more profilers are created, + -- thus we create a pool of profilers to mitigate the issue + local profilers_pool = {} + local profilers_used = {} + + local function get_make_profiler() + local profiler + if table_size(profilers_pool) > 0 then + profiler = table.remove(profilers_pool) + profiler.reset() + else + profiler = game.create_profiler(true) + end + table.insert(profilers_used, profiler) + return profiler + end + + local function recycle_profilers() + for _, profiler in pairs(profilers_used) do + table.insert(profilers_pool, profiler) + end + profilers_used = {} + end + + local function dup_profiler(profiler) + local new_profiler = get_make_profiler() + new_profiler.reset() + new_profiler.stop() + new_profiler.add(profiler) + return new_profiler + end + + + function Profiler.start(name, unit_count) + if not active_profilers[name] then + active_profilers[name] = { + profiler = get_make_profiler(), + tick = game.tick, + count = 0 + } + end + if unit_count == nil then unit_count = 1 end + active_profilers[name].count = active_profilers[name].count + unit_count + active_profilers[name].profiler.restart() + end + + function Profiler.stop(name) + if active_profilers[name] then + if active_splits[name] then + Profiler.stop(active_splits[name]) + active_splits[name] = nil + end + active_profilers[name].profiler.stop() + end + end + + function Profiler.split(name, part) + if active_profilers[name] then + if active_splits[name] then + Profiler.stop(active_splits[name]) + active_splits[name] = nil + end + if part then + local split_name = name .. "--" .. part + Profiler.start(split_name) + active_splits[name] = split_name + end + end + end + + + function Profiler.count(name, value) + if not active_counters[name] then + active_counters[name] = { + counter = 0, + tick = game.tick + } + end + if value == nil then value = 1 end + active_counters[name].counter = active_counters[name].counter + value + end + + function Profiler.collect_print() + local results = {} + for name, entry in pairs(active_profilers) do + entry.profiler.stop() + if entry.count == 0 then + entry.profiler.divide(game.tick - entry.tick + 1) + results[name] = { "", "PerTick ", entry.profiler } + else + local per_tick_count = entry.count / (game.tick - entry.tick + 1) + local per_unit_profiler = dup_profiler(entry.profiler) + per_unit_profiler.divide(entry.count) + entry.profiler.divide(game.tick - entry.tick + 1) + results[name] = { "", "PerUnit (", per_tick_count, "/", entry.count, ") ", per_unit_profiler, + " / PerTick ", entry.profiler } + end + end + for name, entry in pairs(active_counters) do + local value = entry.counter / (game.tick - entry.tick + 1) + local key = results[name] and (name .. "-count") or name + results[key] = { "", "Count: ", value } + end + + local log_fn = Profiler.print_to_console and Log.trace or Log.debug_log + -- sort the results + local keys = {} + for k in pairs(results) do table.insert(keys, k) end + table.sort(keys) + -- print + log_fn('---') + for _, name in pairs(keys) do + log_fn({ "", name, ": ", results[name]}) + end + -- cleanup + active_profilers = {} + active_splits = {} + active_counters = {} + recycle_profilers() + end + Event.addListener("on_nth_tick_301", Profiler.collect_print) -- 5 seconds +else + Profiler.start = function() end + Profiler.stop = function() end + Profiler.split = function() end + Profiler.count = function() end + Profiler.collect_print = function() end +end + +return Profiler diff --git a/space-exploration_0.5.58/space-exploration/scripts/remote-interface.lua b/space-exploration_0.5.58/space-exploration/scripts/remote-interface.lua new file mode 100644 index 0000000..fa2398a --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/remote-interface.lua @@ -0,0 +1,468 @@ +--[[ NOTE: The multiplayer support commnads are designed so that multiplayer mods can use them, but individuals can use use commands to to get multiplayer working without relying on mods.]] + +remote.add_interface( + "space-exploration", + { + +--/c remote.call("space-exploration", "lock_player_respawn_location", {player = game.player, position = game.player.position, zone_name = "Nauvis"}) +-- or +--/c remote.call("space-exploration", "lock_player_respawn_location", {player = game.player, position = game.player.position, surface_name = "nauvis"}) + lock_player_respawn_location = function(data) + if data.player and data.player.valid and data.position and data.position.x and data.position.y then + local playerdata = get_make_playerdata(data.player) + if data.zone_name then + local zone = Zone.from_name(data.zone_name) + if not zone then game.print("Invalid zone name: "..data.zone_name) return end + playerdata.lock_respawn = {zone_index = zone.index, position = data.position} + game.print(data.player.name.." respawn location locked") + elseif data.surface_name then + if not game.surfaces[data.surface_name] then game.print("Invalid surface name: "..data.surface_name) end + playerdata.lock_respawn = {surface_name = data.surface_name, position = data.position} + game.print(data.player.name.." respawn location locked") + end + end + end, + +--/c remote.call("space-exploration", "unlock_player_respawn_location", {player = game.player}) + unlock_player_respawn_location = function(data) + if data.player and data.player.valid then + local playerdata = get_make_playerdata(data.player) + playerdata.lock_respawn = nil + end + end, + +--/c remote.call("space-exploration", "get_player_character", {player = game.player}) + get_player_character = function(data) + if data.player and data.player.valid then + if data.player.character then return data.player.character end + local playerdata = get_make_playerdata(data.player) + return playerdata.character + end + end, + +--/c remote.call("space-exploration", "spawn_small_resources", {surface = game.player.surface}) + spawn_small_resources = function(data) + Zone.spawn_small_resources(data.surface) + end, + +--Can multiply resources on nauvis. It should not be used unless you are sure the available resources on nauvis are insufficient to set up a few moon mining bases. +--/c remote.call("space-exploration", "multiply_nauvis_resource", {surface = game.player.surface, resource_name = "iron-ore", multiplier=0.9}) + multiply_nauvis_resource = function(data) + if data.multiplier > 0 and data.multiplier ~= 1 and data.surface then + for _, entity in pairs(data.surface.find_entities_filtered{type = "resource", name=data.resource_name}) do + local amount = math.ceil(entity.amount * data.multiplier) + if amount > 0 then + entity.amount = amount + else + entity.destroy() + end + end + end + end, + +-- Quick setup multiplayer test +--/c remote.call("space-exploration", "setup_multiplayer_test", { force_name = "player-2", players = {game.player}, match_nauvis_seed = false}) + setup_multiplayer_test = function(data) + + -- make the force + local force_name = data.force_name + if not game.forces[force_name] then + game.create_force(force_name) + end + if not game.forces[force_name] then + game.print("Error creating force with name: "..(force_name or "nil")) + return + end + + -- select the planet + local planet + + for _, star in pairs(global.universe.stars) do + if planet == nil then + if star.special_type == "homesystem" then + -- taken + else + for _, child in pairs(star.children) do + if child.type == "planet" and (not child.ruins) and (not child.interburbulator) and (not child.glyph) then + planet = child + game.print("Selected planet: "..child.name.." for homeworld.") + break + end + end + end + end + end + if not planet then + game.print("Error finding a planet") + return + end + + -- change the player forces + for _, player in pairs(data.players) do + player.force = game.forces[force_name] + end + + local match_nauvis_seed = data.match_nauvis_seed == nil and true or data.match_nauvis_seed + -- make the homeworld + Zone.set_zone_as_homeworld({ zone_name = planet.name, match_nauvis_seed = match_nauvis_seed, reset_surface = true}) + + + Zone.spawn_small_resources(Zone.get_surface(planet)) + + -- move the players + local surface = Zone.get_make_surface(planet) + for _, player in pairs(data.players) do + if player.character then + teleport_character_to_surface(player.character, surface, {0,0}) -- prevents overlapping players + else + player.teleport({0,0}, surface) + end + end + + -- assign the force to the homeworld (a homeworld can have multiple forces) + -- also resets discoveries + set_force_homeworld({zone_name = planet.name, force_name = force_name, spawn_position = {x = 0, y = 0}, reset_discoveries = true}) + + -- TODO: trigger AAI crash sequence? + + end, + +-- set the target zone to be a homeworld +--/c remote.call("space-exploration", "set_zone_as_homeworld", {zone_name = "Arendel", match_nauvis_seed = false, reset_surface = true}) + set_zone_as_homeworld = function(data) + return Zone.set_zone_as_homeworld(data) + end, + +-- set a force's homeworld (needed for later functions) and sets their respawn location +--/c remote.call("space-exploration", "set_force_homeworld", {zone_name = "Arendel", force_name = "player-2", spawn_position = {x = 0, y = 0}, reset_discoveries = true}) + set_force_homeworld = function(data) + return set_force_homeworld(data) + end, + +-- reset a force's discovered locations. +--/c remote.call("space-exploration", "set_force_homeworld", { force_name = "player-2"}) + force_reset_discoveries = function(data) + force_reset_discoveries(data.force_name) + end, + +--/c remote.call("space-exploration", "get_zone_index", {}) + get_zone_index = function(data) + local zone_index = {} + for i, zone in pairs(global.zone_index) do + table.insert(zone_index, Zone.export_zone(zone)) + end + return zone_index + end, + +--/c remote.call("space-exploration", "get_zone_from_name", {zone_name = "Nauvis"}) + get_zone_from_name = function(data) return Zone.export_zone(Zone.from_name(data.zone_name)) end, + +--/c remote.call("space-exploration", "get_zone_from_zone_index", {zone_index = 2}) + get_zone_from_zone_index = function(data) return Zone.export_zone(Zone.from_zone_index(data.zone_index)) end, + +--/c remote.call("space-exploration", "get_zone_from_surface_index", {surface_index = game.player.surface.index}) + get_zone_from_surface_index = function(data) return Zone.export_zone(Zone.from_surface_index(data.surface_index)) end, + +--/c remote.call("space-exploration", "get_surface_type", {surface_index = game.player.surface.index}) + get_surface_type = function(data) + local surface = game.surfaces[data.surface_index] + local zone = Zone.from_surface(surface) + if zone then return zone.type end + -- vault? + local vault = Ancient.vault_from_surface(surface) + if vault then return "vault" end + end, + +--/c remote.call("space-exploration", "get_zone_icon", {zone_index = remote.call("space-exploration", "get_zone_from_surface_index", {surface_index = game.player.surface.index}).index}) + get_zone_icon = function(data) return Zone.get_icon(Zone.from_zone_index(data.zone_index)) end, + +--/c remote.call("space-exploration", "get_zone_is_solid", {zone_index = remote.call("space-exploration", "get_zone_from_surface_index", {surface_index = game.player.surface.index}).index}) + get_zone_is_solid = function(data) return Zone.is_solid(Zone.from_zone_index(data.zone_index)) end, + +--/c remote.call("space-exploration", "get_zone_is_space", {zone_index = remote.call("space-exploration", "get_zone_from_surface_index", {surface_index = game.player.surface.index}).index}) + get_zone_is_space = function(data) return Zone.is_space(Zone.from_zone_index(data.zone_index)) end, + +--/c remote.call("space-exploration", "zone_get_surface", {zone_index = remote.call("space-exploration", "get_zone_from_name", {zone_name = "Arendel"}).index}) + zone_get_surface = function(data) return Zone.get_surface(Zone.from_zone_index(data.zone_index)) end, + +--/c remote.call("space-exploration", "zone_get_make_surface", {zone_index = remote.call("space-exploration", "get_zone_from_name", {zone_name = "Arendel"}).index}) + zone_get_make_surface = function(data) return Zone.get_make_surface(Zone.from_zone_index(data.zone_index)) end, + +--/c remote.call("space-exploration", "get_cargo_loss", {force = game.player.force}) + get_cargo_loss = function(data) return Launchpad.get_cargo_loss(data.force) end, + +--/c remote.call("space-exploration", "get_reusability", {force = game.player.force}) + get_reusability = function(data) return Launchpad.get_reusability(data.force) end, + +--/c remote.call("space-exploration", "get_survivability_loss", {force = game.player.force}) +--/c game.print(remote.call("space-exploration", "get_survivability_loss", {force = game.player.force})) + get_survivability_loss = function(data) return Launchpad.get_survivability_loss(data.force) end, + +--/c game.print(remote.call("space-exploration", "get_rockets_launched", {force = game.player.force})) + get_rockets_launched = function(data) return global.forces[data.force.name].cargo_rockets_launched end, + +--/c remote.call("space-exploration", "launch_satellite", {force_name = game.player.force.name, surface=game.player.surface, count=1}) + launch_satellite = function(data) + local rep = data.count or 1 + for i = 1, rep, 1 do + on_satellite_launched(data.force_name, data.surface) + end + end, + +--/c remote.call("space-exploration", "build_satellite", {force_name = game.player.force.name}) + build_satellite = function(data) build_satellite(data.force_name) end, + +--/c remote.call("space-exploration", "build_ruin", {ruin_name = "satellite", surface_index = game.player.surface.index, position = game.player.position}) + build_ruin = function(data) + Ruin.build(data) + end, + +--/c pl = game.player p = pl.position remote.call("space-exploration", "ruin_log_tiles", {capture_name = "temp", surface = pl.surface, registration_point = p, left_top = {p.x - 11, p.y - 11}, right_bottom = {p.x + 11, p.y + 11}}) + ruin_log_tiles = function(data) + Ruin.log_tiles(data) + end, + +--/c pl = game.player p = pl.position remote.call("space-exploration", "ruin_log_entities", {capture_name = "temp", surface = pl.surface, registration_point = p, left_top = {p.x - 11, p.y - 11}, right_bottom = {p.x + 11, p.y + 11}}) + ruin_log_entities = function(data) + Ruin.log_entities(data) + end, + +--/c remote.call("space-exploration", "ruin_replace_in_blueprint", {name="filename", blueprint="...", entities={{name="in-name", new_name="out-name", shift={0,0}}, tiles={["in_name"]="out-name"}}) + ruin_replace_in_blueprint = function(data) + Ruin.replace_in_blueprint(data) + end, + +--/c remote.call("space-exploration", "make_interburbulator", {position = {x=game.player.position.x, y = game.player.position.y - 10}, zone_index = remote.call("space-exploration", "get_zone_from_surface_index", {surface_index = game.player.surface.index}).index}) + make_interburbulator = function(data) + Interburbulator.make_interburbulator(Zone.from_zone_index(data.zone_index), data.position) + end, + +--/c remote.call("space-exploration", "discover_zone", {force_name = game.player.force.name, surface=game.player.surface, zone_name="Arendel"}) + discover_zone = function(data) + if not global.forces[data.force_name].satellites_launched or global.forces[data.force_name].satellites_launched == 0 then + on_satellite_launched(data.force_name, data.surface) + end + Zone.discover(data.force_name, Zone.from_name(data.zone_name)) + end, + +--/c remote.call("space-exploration", "discover_zones_by_type", {force_name = game.player.force.name, types={"star", "planet", "moon"}}) + discover_zones_by_type = function(data) + for _, zone in pairs(global.zone_index) do + if util.table_contains(data.types, zone.type) then + Zone.discover(data.force_name, zone) + end + end + end, + +--/c remote.call("space-exploration", "show_all_zones", {}) + show_all_zones = function(data) + global.debug_view_all_zones = true + end, + +--/c remote.call("space-exploration", "unshow_all_zones", {}) + unshow_all_zones = function(data) + global.debug_view_all_zones = false + end, + +--/c remote.call("space-exploration", "debug_set_global", {debug_view_all_zones = true}) +-- debug_set_global = function(data) for k, v in pairs(data) do global[k] = v end end, + +--/c remote.call("space-exploration", "teleport_to_zone", {zone_name = "Nauvis", player=game.player}) + teleport_to_zone = function(data) + local zone = Zone.from_name(data.zone_name) + if zone and data.player then + local surface = Zone.get_make_surface(zone) + if data.player.character then + teleport_character_to_surface(data.player.character, surface, {0,0}) + else + data.player.teleport({0,0}, surface) + end + end + end, + +-- /c remote.call("space-exploration", "remote_view_is_active", {player=game.player}) + remote_view_is_active = function(data) + if data.player then + return RemoteView.is_active(data.player) + end + end, + +-- /c remote.call("space-exploration", "remote_view_is_unlocked", {player=game.player}) + remote_view_is_unlocked = function(data) + if data.player then + return RemoteView.is_unlocked(data.player) + end + end, + +-- /c remote.call("space-exploration", "remote_view_start", {player=game.player, zone_name = "Nauvis", position={x=100,y=200}, location_name="Point of Interest", freeze_history=true}) + remote_view_start = function(data) + local zone = Zone.from_name(data.zone_name) + if zone and data.player then + RemoteView.start(data.player, zone, data.position, data.location_name, data.freeze_history) + end + end, + +-- /c remote.call("space-exploration", "remote_view_stop", {player=game.player}) + remote_view_stop = function(data) + if data.player then + RemoteView.stop(data.player) + end + end, + +--/c remote.call("space-exploration", "set_player_velocity", {player=game.player, velocity = {x = 0, y = 0}}) + set_player_velocity = function(data) + if data.player and data.velocity and data.velocity.x and data.velocity.y then + local playerdata = get_make_playerdata(player) + if playerdata then + playerdata.velocity = data.velocity + end + end + end, +--/c remote.call("space-exploration", "begin_meteor_shower", {target_entity = game.player, meteors = 10}) +--/c remote.call("space-exploration", "begin_meteor_shower", {target_entity = game.player.selected or game.player}) +--/c remote.call("space-exploration", "begin_meteor_shower", {zone_name = "Nauvis", position = {x=0,y=0}, range = 1, meteors = 100}) +--/c for i = 1, 10 do remote.call("space-exploration", "begin_meteor_shower", {target_entity = game.player, meteors = 100}) end + begin_meteor_shower = function(data) + local entity = data.target_entity + if entity then + local zone = Zone.from_surface(entity.surface) + if zone and zone.type ~= "spaceship" then + Meteor.begin_meteor_shower(zone, entity.position, data.range, data.meteors) + end + elseif data.zone_name then + local zone = Zone.from_name(data.zone_name) + if zone and zone.type ~= "spaceship" then + local position = data.position or {x = 0, y = 0} + Meteor.begin_meteor_shower(zone, position, data.range, data.meteors) + end + end + + end, + +--/c remote.call("space-exploration", "begin_solar_flare", {zone_name = "Nauvis", targeting="basic"}) + begin_solar_flare = function(data) + if data.zone_name then + local zone = Zone.from_name(data.zone_name) + if zone and zone.type ~= "spaceship" then + SolarFlare.begin_flare(zone, data.targeting) -- zone, targeting, power_multiplier, delay, max_age + end + end + + end, + + +--/c remote.call("space-exploration", "fuel_rocket_silos", {}) + fuel_rocket_silos = function() + for _, launch_pad in pairs(global.rocket_launch_pads) do + launch_pad.lua_fuel = (launch_pad.lua_fuel or 0) + 100000000 + end + end, + +--/c remote.call("space-exploration", "get_known_zones", {force_name = game.player.force.name}) + get_known_zones = function(data) + if data.force_name and global.forces[data.force_name] then + -- return a list of known zone indexes. + return global.forces[data.force_name].zones_discovered + end + end, + +--/c remote.call("space-exploration", "show_only_zones", {zone_names = {"Nauvis", "Sandro", "Zomble", "Foenestra", "Kamsta"}}) + show_only_zones = function(data) + for force_name, force_data in pairs(global.forces) do + force_data.zones_discovered = {} + force_data.zones_discovered_count = 0 + force_data.satellites_launched = 1 + for _, zone_name in pairs(data.zone_names) do + local zone = Zone.from_name(zone_name) + if zone then + Zone.discover(force_name, zone, "Command") + else + game.print("Invalid zone name: "..zone_name) + end + end + end + end, + +--/c remote.call("space-exploration", "rebuild_surface_index", {}) + rebuild_surface_index = Zone.rebuild_surface_index, + +--/c remote.call("space-exploration", "rebuild_universe_resource_assignments", {}) + rebuild_universe_resource_assignments = Universe.rebuild_resource_assignments, + + get_on_cargo_rocket_launched_event = function() return Launchpad.on_cargo_rocket_launched_event end, +--/c remote.call("space-exploration", "get_on_player_respawned_event") + get_on_player_respawned_event = function() return Respawn.on_player_respawned_event end, + +--/c remote.call("space-exploration", "planet_swap", {star="Calidus", add_planet="Sandro"}) + robot_attrition_for_surface = function(data) + local surface_index = data.surface_index + local default_rate = data.default_rate + local zone = Zone.from_surface_index(surface_index) + return Zone.get_attrition(zone, default_rate) + end, + +--/c remote.call("space-exploration", "cancel_entity_creation", {entity=game.player.selected, player_index=1, message={"space-exploration.construction-denied"}}) + cancel_entity_creation = function(data) + return cancel_entity_creation(data.entity, data.player_index, data.message) + end, + +--/c remote.call("space-exploration", "log_map_gen", {}) + log_map_gen = Log.log_map_gen, + log_global = Log.log_global, + log_universe_simplified = Log.log_universe_simplified, + log_universe = Log.log_universe, + log_forces = Log.log_forces, + log_spaceships = Log.log_spaceships, + +--/c remote.call("space-exploration", "ancient_make_gate", {}) + ancient_make_gate = function(data) + Ancient.make_gate(Ancient.gate_default_position) + end, + +--/c remote.call("space-exploration", "ancient_gate_phase_2", {}) + ancient_gate_phase_2 = function(data) + Ancient.gate_phase_2(global.gate) + end, + +--/c remote.call("space-exploration", "ancient_gate_phase_3", {}) + ancient_gate_phase_3 = function(data) + Ancient.gate_phase_3(global.gate) + end, + +--/c remote.call("space-exploration", "ancient_f6", {}) + ancient_f6 = function(data) + Ancient.cryptf6() + end, + +-- informatron implementation + informatron_menu = function(data) + return Informatron.menu(data.player_index) + end, + + informatron_page_content = function(data) + return Informatron.page_content(data.page_name, data.player_index, data.element) + end, + + informatron_page_content_update = function(data) + return Informatron.page_content_update(data.page_name, data.player_index, data.element) + end, + +-- jetpack implementation + on_character_swapped = function(event) + if event.new_character and event.old_character then + for _, playerdata in pairs(global.playerdata) do + if playerdata.character == event.old_character then + playerdata.character = event.new_character + end + end + end + end, + + on_entity_activated = function(event) + if mod ~= "space-exploration" then + Beacon.validate_entity(entity, ignore_count) + end + end + + } +) diff --git a/space-exploration_0.5.58/space-exploration/scripts/remote-view.lua b/space-exploration_0.5.58/space-exploration/scripts/remote-view.lua new file mode 100644 index 0000000..a7a6d9b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/remote-view.lua @@ -0,0 +1,1026 @@ +local RemoteView = {} +--[[ +Navigation View. +Remote view is the system that detaches the player from the character. +It displays a small you-are-here window on the top left with a buttons to: + Open the zone list + Open starmap + Open system view + Return to your body + +]]-- + +-- constants +RemoteView.name_gui_root = mod_prefix.."remote-view" +RemoteView.name_shortcut = mod_prefix.."remote-view" +RemoteView.name_event = mod_prefix.."remote-view" +RemoteView.name_pins_event = mod_prefix.."remote-view-pins" +RemoteView.name_event_previous = mod_prefix.."remote-view-previous" +RemoteView.name_event_next = mod_prefix.."remote-view-next" +--RemoteView.name_permissions_group = mod_prefix.."remote-view" +RemoteView.name_button_overhead_satellite = mod_prefix .. "overhead_satellite" +RemoteView.name_setting_overhead_satellite = mod_prefix .. "show-overhead-button-satellite-mode" +RemoteView.name_window_close = "remote-view-close" +RemoteView.name_button_zonelist = "remote-view-open_zonelist" +RemoteView.name_button_starmap = "remote-view-open_starmap" +RemoteView.name_button_system_map = "system_map_button" +RemoteView.name_details_root = "remote-view-details-root" +RemoteView.name_button_history_previous = "remote-view-history-previous" +RemoteView.name_button_history_next = "remote-view-history-next" +RemoteView.name_button_history_delete = "remote-view-history-delete" + +RemoteView.name_permission_group = "satellite" +RemoteView.name_permission_group_suffix = "_satellite" + +RemoteView.action_zone_click = "se-remoteview-zone-click" +RemoteView.max_history = 50 + +RemoteView.satellite_block_actions = { + defines.input_action.begin_mining_terrain, + defines.input_action.change_riding_state, + defines.input_action.change_shooting_state, + defines.input_action.cursor_split, + defines.input_action.destroy_opened_item, + defines.input_action.drop_item, + defines.input_action.fast_entity_split, + defines.input_action.fast_entity_transfer, + defines.input_action.inventory_split, + defines.input_action.inventory_transfer, + defines.input_action.map_editor_action, + defines.input_action.open_equipment, + defines.input_action.place_equipment, + defines.input_action.set_car_weapons_control, + defines.input_action.stack_split, + defines.input_action.stack_transfer, + defines.input_action.start_repair, + defines.input_action.take_equipment, + defines.input_action.toggle_driving, + defines.input_action.toggle_map_editor, +} + + +function RemoteView.get_stack_limit(stack) -- must be lua item stack, not simple stack + local name = stack.name + local type = stack.type + if type == "blueprint" + or type == "blueprint-book" + or type == "deconstruction-item" + or type == "selection-tool" + or type == "upgrade-item" + or type == "copy-paste-tool" + or type == "cut-paste-tool" then + return stack.count + end + if name == "artillery-targeting-remote" -- type == "capsule" for the artillery remote + --or name == "ion-cannon-targeter" -- still bugged + or type == "spidertron-remote" then -- allow all spidertron remotes (not just the vanilla one named spidertron-remote) by using type + return stack.count + end + if name == "red-wire" + or name == "green-wire" + or name == "copper-cable" then + return 2 + end + return 0 +end + +function RemoteView.drop_stack(player, stack, drop_count, drop_to_ground) + if player and player.connected and RemoteView.is_active(player) then + local entity = player.opened_gui_type == defines.gui_type.entity and player.opened or player.selected + if entity then + local inserted = entity.insert({name = stack.name, count = drop_count}) + if inserted < drop_count and drop_to_ground == true then + player.surface.spill_item_stack( + entity.position, + {name = stack.name, count = drop_count - inserted}, + false, -- lootable + player.force, -- deconstruct by force + false) -- allow belts + end + elseif drop_to_ground then + local limit = RemoteView.get_stack_limit(stack) + if limit == 0 then + player.surface.spill_item_stack( + player.position, + {name = stack.name, count = drop_count}, + false, -- lootable + player.force, -- deconstruct by force + false) -- allow belts + end + end + end +end + +function RemoteView.on_player_crafted_item(event) + if not(event.item_stack and event.item_stack.valid_for_read) then return end + local player = game.players[event.player_index] + if player and player.connected and RemoteView.is_active(player) then + local limit = RemoteView.get_stack_limit(event.item_stack) + if limit > 0 then + player.cursor_stack.set_stack(event.item_stack) + if event.item_stack.count > limit then + RemoteView.drop_stack(player, event.item_stack, event.item_stack.count - limit, false) + end + event.item_stack.count = limit + else + player.cursor_ghost = event.item_stack.prototype + event.item_stack.count = 0 + end + end +end +Event.addListener(defines.events.on_player_crafted_item, RemoteView.on_player_crafted_item) + +function RemoteView.on_player_pipette(event) + local player = game.players[event.player_index] + if player and player.connected and RemoteView.is_active(player) then + player.cursor_stack.clear() + player.cursor_ghost = event.item + end +end +Event.addListener(defines.events.on_player_pipette, RemoteView.on_player_pipette) + +function RemoteView.on_player_cursor_stack_changed(event) + local player = game.players[event.player_index] + if player and player.connected and RemoteView.is_active(player) then + local stack = player.cursor_stack + if stack and stack.valid_for_read then + local limit = RemoteView.get_stack_limit(stack) + if limit > 0 then + if stack.count > limit then + if stack.name == "red-wire" + or stack.name == "green-wire" + or stack.name == "copper-cable" then + --wire shortcuts mod messes things up + else + RemoteView.drop_stack(player, stack, stack.count - limit, true) + end + end + stack.count = limit + else + RemoteView.drop_stack(player, stack, stack.count, true) + player.cursor_ghost = stack.prototype + player.cursor_stack.clear() + end + end + end +end +Event.addListener(defines.events.on_player_cursor_stack_changed, RemoteView.on_player_cursor_stack_changed) + +function RemoteView.on_player_main_inventory_changed(event) + local player = game.players[event.player_index] + if player and player.connected and RemoteView.is_active(player) then + local inv = player.get_main_inventory() + for i = 1, #inv do + local stack = inv[i] + if stack and stack.valid_for_read then + local limit = RemoteView.get_stack_limit(stack) + if limit > 0 then + stack.count = limit + else + RemoteView.drop_stack(player, stack, stack.count, true) + stack.count = 0 + end + end + end + end +end +Event.addListener(defines.events.on_player_main_inventory_changed, RemoteView.on_player_main_inventory_changed) + +function RemoteView.apply_permission_group_permissions(group_from, group_to) + for _, action in pairs(defines.input_action) do + group_to.set_allows_action(action, group_from.allows_action(action) ) + end +end + +function RemoteView.player_set_satellite_permissions(player) + local playerdata = get_make_playerdata(player) + local permission_group = nil + if player.permission_group then + if player.permission_group.name == RemoteView.name_permission_group then + return player.permission_group -- already in default satellite group + elseif string.find(player.permission_group.name, RemoteView.name_permission_group_suffix, 1, true) then + return player.permission_group -- already in special satellite group + end + -- make a new group from the existing group + permission_group = game.permissions.get_group(player.permission_group.name..RemoteView.name_permission_group_suffix) + if not permission_group then + permission_group = game.permissions.create_group(player.permission_group.name..RemoteView.name_permission_group_suffix) + end + RemoteView.apply_permission_group_permissions(player.permission_group, permission_group) + end + + -- get the default group + if not permission_group then + permission_group = game.permissions.get_group(RemoteView.name_permission_group) + end + + -- make the default group + if not permission_group then + permission_group = game.permissions.create_group(RemoteView.name_permission_group) + end + + for _, action in pairs(RemoteView.satellite_block_actions) do + permission_group.set_allows_action(action, false) + end + + return permission_group +end + +function RemoteView.gui_close (player, keep_open_window) + Pin.modal_close(player) + if not keep_open_window then + Pin.window_close(player) + end + if player.gui.left[RemoteView.name_gui_root] then + player.gui.left[RemoteView.name_gui_root].destroy() + end +end + +function RemoteView.gui_update (player) -- only call when something changed + local root = player.gui.left[RemoteView.name_gui_root] + if root then + if root.currently_viewing_frame + and root.currently_viewing_frame.currently_viewing_table + and root.currently_viewing_frame.currently_viewing_table.currently_viewing_value then + local zone = Zone.from_surface(player.surface) + + -- current system button + local current_system + if zone then + current_system = Zone.get_star_from_child(zone) + root.system_toggles_table.system_map_button.style = "se_generic_button" + else + current_system = MapView.get_current_system(player) + root.system_toggles_table.system_map_button.style = "se_generic_button_down" + end + root.system_toggles_table.system_map_button.style.padding = 5 + if current_system then + root.system_toggles_table.system_map_button.caption = { + "space-exploration.simple-a-b-space", + "[img=se-map-gui-system]", + { "space-exploration.solar-system", current_system.name } } + else + root.system_toggles_table.system_map_button.caption = { + "space-exploration.simple-a-b-space", + "[img=se-map-gui-starmap]", + { "space-exploration.interstellar-map" } } + end + + -- view details toggles + local starmap_settings = MapView.get_settings(player) + for _, element in pairs(root.system_toggles_table[MapView.name_toggles].children) do + if starmap_settings[element.name] then + element.style = "se_generic_square_button_down" + else + element.style = "se_generic_square_button" + end + element.style.width = 32 + element.style.height = 32 + element.visible = starmap_settings[element.name] ~= nil + end + + if root.system_toggles_table.history_flow then + local playerdata = get_make_playerdata(player) + local history = playerdata.location_history + if history then + + local next_locations = {} + local next_locations_merged = {} + for i = history.current_pointer +1, #history.references do + local locale = Location.to_localised_string(history.references[i]) + if locale then + table.insert(next_locations, locale) + if #next_locations_merged == 0 then + next_locations_merged = {"space-exploration.simple-bold", locale} + else + next_locations_merged = {"space-exploration.simple-a-b-break", next_locations_merged, locale} + end + end + end + + local prev_locations = {} + local prev_locations_merged = {} + for i = history.current_pointer -1, 1, -1 do + local locale = Location.to_localised_string(history.references[i]) + if locale then + table.insert(prev_locations, locale) + if #prev_locations_merged == 0 then + prev_locations_merged = {"space-exploration.simple-bold", locale} + else + prev_locations_merged = {"space-exploration.simple-a-b-break", prev_locations_merged, locale} + end + end + end + + if root.system_toggles_table.history_flow[RemoteView.name_button_history_delete] then + root.system_toggles_table.history_flow[RemoteView.name_button_history_delete].enabled = #next_locations + #prev_locations > 0 + end + + if root.system_toggles_table.history_flow[RemoteView.name_button_history_next] then + if #next_locations > 0 then + root.system_toggles_table.history_flow[RemoteView.name_button_history_next].enabled = true + root.system_toggles_table.history_flow[RemoteView.name_button_history_next].tooltip = { + "space-exploration."..RemoteView.name_button_history_next, next_locations_merged} + else + root.system_toggles_table.history_flow[RemoteView.name_button_history_next].enabled = false + root.system_toggles_table.history_flow[RemoteView.name_button_history_next].tooltip = { + "space-exploration."..RemoteView.name_button_history_next, ""} + end + end + + if root.system_toggles_table.history_flow[RemoteView.name_button_history_previous] then + if #prev_locations > 0 then + root.system_toggles_table.history_flow[RemoteView.name_button_history_previous].enabled = true + root.system_toggles_table.history_flow[RemoteView.name_button_history_previous].tooltip = { + "space-exploration."..RemoteView.name_button_history_previous, prev_locations_merged} + else + root.system_toggles_table.history_flow[RemoteView.name_button_history_previous].enabled = false + root.system_toggles_table.history_flow[RemoteView.name_button_history_previous].tooltip = { + "space-exploration."..RemoteView.name_button_history_previous, ""} + end + end + end + end + + -- currently viewing path and name + local currently_viewing_path = root.currently_viewing_frame.currently_viewing_table.currently_viewing_path + currently_viewing_path.clear() + currently_viewing_path.style.vertical_align = "center" + + local currently_viewing_name + if zone then + + local parent_chain = {} + local parent_zone = zone + local found_star = false + while parent_zone do + table.insert(parent_chain, parent_zone) -- reverse order + found_star = parent_zone.type == "star" + parent_zone = parent_zone.parent + end + local buttons = {} + for i = #parent_chain, 1, -1 do + if zone.type ~= "spaceship" and not found_star then + local space = currently_viewing_path.add{ type="sprite", sprite = "se-map-gui-starmap-small", tooltip = {"space-exploration.interstellar-space"} } + end + parent_zone = parent_chain[i] + local zone_icon = Zone.get_icon(parent_zone) + if parent_zone.type == "orbit" and parent_zone.parent.type == "star" then + break + end + if parent_zone.type == "star" then + parent_zone = parent_zone.orbit + end + if #currently_viewing_path.children > 0 then + local arrow = currently_viewing_path.add{ type="label", caption = "▶" } + arrow.style.font = "default-tiny-bold" + arrow.style.top_margin = 1 + + --currently_viewing_path.add{ type="sprite", sprite = zone_icon, tooltip = parent_zone.name } + table.insert(buttons, currently_viewing_path.add { + type = "sprite-button", + sprite = zone_icon, + tags = { + action = RemoteView.action_zone_click, + zone_index = parent_zone.index + }, + style = "se_generic_square_button", + tooltip = parent_zone.name + }) + else + --currently_viewing_path.add{ type="sprite", sprite = zone_icon, tooltip = parent_zone.name } + table.insert(buttons, currently_viewing_path.add { + type = "sprite-button", + sprite = zone_icon, + tags = { + action = RemoteView.action_zone_click, + zone_index = parent_zone.index + }, + style = "se_generic_square_button", + tooltip = parent_zone.name + }) + end + end + + currently_viewing_path.children[#currently_viewing_path.children].style = "se_generic_square_button_active" + + currently_viewing_name = zone.name + + if zone.orbit and zone.type ~= "star" then + local arrow = currently_viewing_path.add{ type="label", caption = "▶" } + arrow.style.font = "default-tiny-bold" + arrow.style.top_margin = 1 + local zone_icon = Zone.get_icon(zone.orbit) + table.insert(buttons, currently_viewing_path.add { + type = "sprite-button", + sprite = zone_icon, + tags = { + action = RemoteView.action_zone_click, + zone_index = zone.orbit.index + }, + style = "se_generic_square_button", + tooltip = zone.orbit.name + }) + end + -- temp hack + + currently_viewing_path.style.vertical_align = "center" + for _, button in pairs(buttons) do + button.style.top_margin = 2 + button.style.bottom_margin = 2 + button.style.vertical_align = "center" + button.style.width = 36 + button.style.height = 36 + end + + end + + if currently_viewing_name then + root.system_toggles_table[MapView.name_toggles].visible = false + root.currently_viewing_label.visible = true + root.currently_viewing_frame.visible = true + root.currently_viewing_frame.currently_viewing_table.currently_viewing_value.caption = currently_viewing_name + else + root.system_toggles_table[MapView.name_toggles].visible = true + root.currently_viewing_label.visible = false + root.currently_viewing_frame.visible = false + end + + Pin.gui_update(player) + end + end +end + +function RemoteView.gui_open (player) + local gui = player.gui.left + close_own_guis(player) + RemoteView.gui_close(player, true) + Lifesupport.gui_close(player) + + local main = gui.add{ type = "frame", name = RemoteView.name_gui_root, style="space_platform_container", direction="vertical"} + main.style.horizontally_stretchable = true + main.style.padding = 12 + main.style.top_padding = 6 + -- If the width can be expanded and you have 10+ pins, or system names are different, + -- then you have the problem of the window size changing and the back button moves + -- enough for the mouse to be over a different button. + main.style.minimal_width = 432 + + local title_table = main.add{type="table", name="title_table", column_count=2, draw_horizontal_lines=false} + title_table.style.horizontally_stretchable = true + title_table.style.column_alignments[1] = "left" + title_table.style.column_alignments[2] = "right" + + local title_frame = title_table.add{type="frame", name="title_frame", caption={"space-exploration.remote-view-window-title"}, style="informatron_title_frame"} + title_frame.style.right_padding = -5 + + local right_flow = title_table.add{type="flow", name="title_flow_right"} + + local list = right_flow.add{type="sprite-button", name=RemoteView.name_button_zonelist, sprite = "se-map-gui-universe-explorer", style="informatron_close_button", tooltip={"space-exploration.zonelist-window-title"}} + list.style.width = 28 + list.style.height = 28 + list.style.right_margin = 6 + + local starmap = right_flow.add{type="sprite-button", name=RemoteView.name_button_starmap, sprite = "se-map-gui-starmap", style="informatron_close_button", tooltip={"space-exploration.interstellar-map"}} + starmap.style.width = 28 + starmap.style.height = 28 + starmap.style.right_margin = 6 + + --local close = right_flow.add{type="button", name=RemoteView.name_window_close, caption="✖", style="informatron_close_button", tooltip={"space-exploration.exit-remote-view"}} + local close = right_flow.add{type="sprite-button", name=RemoteView.name_window_close, sprite = "utility/close_white", style="informatron_close_button", tooltip={"space-exploration.exit-remote-view"}} + close.style.width = 28 + close.style.height = 28 + + local system_toggles_table = main.add{ type="table", name="system_toggles_table", column_count=3, draw_horizontal_lines=false} + system_toggles_table.style.horizontally_stretchable = true + system_toggles_table.style.column_alignments[1] = "left" + system_toggles_table.style.column_alignments[2] = "right" + system_toggles_table.style.column_alignments[3] = "right" + system_toggles_table.style.top_margin = 5 + + local system_map_button = system_toggles_table.add{ type="button", name=RemoteView.name_button_system_map, style="se_generic_button", caption = ""} + --system_map_button.style.horizontally_stretchable = true + --system_map_button.style.width = 160 + system_map_button.style.left_padding = 4 + system_map_button.style.right_padding = 4 + system_map_button.style.height = 36 + + local toggles_flow = system_toggles_table.add{type="flow", name=MapView.name_toggles} + toggles_flow.style.horizontally_stretchable = true + toggles_flow.style.horizontal_align = "right" + + local show_resources = toggles_flow.add{type="sprite-button", name=MapView.name_button_show_resources, sprite = "entity/stone", style="se_generic_square_button", tooltip={"space-exploration.remote-view-show-hide-resources"}} + show_resources.style.width = 32 + show_resources.style.height = 32 + local show_stats = toggles_flow.add{type="sprite-button", name=MapView.name_button_show_stats, sprite = "entity/"..Landingpad.name_rocket_landing_pad, style="se_generic_square_button", tooltip={"space-exploration.remote-view-show-hide-stats"}} + show_stats.style.width = 32 + show_stats.style.height = 32 + local show_anchor_info = toggles_flow.add{type="sprite-button", name=MapView.name_button_show_anchor_info, sprite = "virtual-signal/se-spaceship", style="se_generic_square_button", tooltip={"space-exploration.remote-view-show-hide-anchor-info"}} + show_anchor_info.style.width = 32 + show_anchor_info.style.height = 32 + show_anchor_info.style.right_margin = 10 + + local history_flow = system_toggles_table.add{type="flow", name="history_flow"} + history_flow.style.horizontally_stretchable = true + history_flow.style.horizontal_align = "right" + + local history_delete = history_flow.add{ + type="sprite-button", + name=RemoteView.name_button_history_delete, + sprite = "utility/trash_white", + style="se_generic_square_button", + tooltip={"space-exploration."..RemoteView.name_button_history_delete} + } + history_delete.style.width = 32 + history_delete.style.height = 32 + history_delete.style.padding = 4 + local history_prev = history_flow.add{ + type="button", + name= RemoteView.name_button_history_previous, + caption = "←", + style="se_generic_square_button", + tooltip={"space-exploration."..RemoteView.name_button_history_previous} + } + history_prev.style.width = 32 + history_prev.style.height = 32 + local history_next = history_flow.add{ + type="button", + name= RemoteView.name_button_history_next, + caption = "→", + style="se_generic_square_button", + tooltip={"space-exploration."..RemoteView.name_button_history_next} + } + history_next.style.width = 32 + history_next.style.height = 32 + + + local currently_viewing_label = main.add{type="label", name="currently_viewing_label", caption={"space-exploration.remote-view-currently-viewing"}} -- left + currently_viewing_label.style.font_color = {r=0.5,g=0.5,b=0.5} + + local currently_viewing_frame = main.add{type="frame", name="currently_viewing_frame", style="informatron_inside_deep_frame"} + currently_viewing_frame.style.horizontally_stretchable = true + --currently_viewing_frame.style.width = 280 + currently_viewing_frame.style.padding = 10 + currently_viewing_frame.style.top_padding = 6 + + local currently_viewing_table = currently_viewing_frame.add{type="table", name="currently_viewing_table", column_count=2, draw_horizontal_lines=false} + currently_viewing_table.style.horizontally_stretchable = true + --currently_viewing_frame.style.width = 280 + currently_viewing_table.style.column_alignments[1] = "left" + currently_viewing_table.style.column_alignments[2] = "right" + + local currently_viewing_path = currently_viewing_table.add{type="flow", name="currently_viewing_path", direction="horizontal"} -- right + --currently_viewing_path.style.horizontally_stretchable = true -- this cuts off the label if both sides go to 50% size + + local currently_viewing_value = currently_viewing_table.add{type="label", name="currently_viewing_value", style = "heading_2_label"} -- right + currently_viewing_value.style.horizontally_stretchable = true + + Pin.gui_open (player) + RemoteView.gui_update (player) +end + +function RemoteView.stop (player) + player.cheat_mode = false + local playerdata = get_make_playerdata(player) + -- exit remote view + if playerdata.remote_view_active then + playerdata.remote_view_active = nil + playerdata.remote_view_activity = nil + + local location_reference = Location.make_reference(Zone.from_surface(player.surface), player.position, nil) + RemoteView.add_history(player, location_reference, true) + + RemoteView.gui_close(player) + MapView.stop_map(player) + + if playerdata.pre_nav_permission_group and playerdata.pre_nav_permission_group.valid and playerdata.pre_nav_permission_group.name ~= RemoteView.name_permission_group then + player.permission_group = playerdata.pre_nav_permission_group + else + player.permission_group = nil + end + playerdata.pre_nav_permission_group = nil + if playerdata.character and playerdata.character.valid then + if playerdata.anchor_scouting_for_spaceship_index then + player.set_controller{type = defines.controllers.ghost} + playerdata.character.color = player.color + else + player.teleport(playerdata.character.position, playerdata.character.surface) + player.set_controller{type = defines.controllers.character, character = playerdata.character} + end + elseif not player.character then + Respawn.die(player) + end + end +end + +function RemoteView.add_history(player, location_reference, force_to_end) + if not location_reference then return end + + local playerdata = get_make_playerdata(player) + if not playerdata.location_history then + playerdata.location_history = {} + playerdata.location_history.references = {location_reference} + playerdata.location_history.current_pointer = 1 + else + + -- if back in history, clear any skipped forward + if not force_to_end then + for i = playerdata.location_history.current_pointer + 1, #playerdata.location_history.references do + playerdata.location_history.references[i] = nil + end + end + + -- don't add duplicate + if #playerdata.location_history.references > 0 then + local last_ref = playerdata.location_history.references[#playerdata.location_history.references] + --Log.trace(serpent.block(last_ref)) + --Log.trace(serpent.block(location_reference)) + if last_ref.type == location_reference.type and last_ref.index == location_reference.index then + -- same zone, maybe have a setting to not have multiple history events on the same zone. + if last_ref.position == nil or last_ref.name == nil then + -- replace the postionless location + playerdata.location_history.references[#playerdata.location_history.references] = location_reference + elseif location_reference.position and Util.vectors_delta_length(last_ref.position, location_reference.position) > 1 then + -- add different position + table.insert(playerdata.location_history.references, location_reference) + end + else -- different zone, always add + table.insert(playerdata.location_history.references, location_reference) + end + else + table.insert(playerdata.location_history.references, location_reference) + end + + -- fit in max history + while #playerdata.location_history.references > RemoteView.max_history do + table.remove(playerdata.location_history.references, 1) + end + + -- update pointer + playerdata.location_history.current_pointer = #playerdata.location_history.references + end +end + +--[[ +Makes the data valid. +Deletes histories to deleted surfaces/spaceships +]] +function RemoteView.make_history_valid(player) + local playerdata = get_make_playerdata(player) + if playerdata.location_history then + local old_history = playerdata.location_history + playerdata.location_history = nil + for _, location_reference in pairs(old_history.references) do + if Location.from_reference(location_reference) then + RemoteView.add_history(player, location_reference, true) + end + end + end +end + +function RemoteView.history_goto_next(player) + local location_reference = RemoteView.history_next(player) + if location_reference then + local playerdata = get_make_playerdata(player) + playerdata.location_history.current_pointer = playerdata.location_history.current_pointer + 1 + Location.goto_reference(player, location_reference, true) + end +end + +function RemoteView.history_next(player) + local playerdata = get_make_playerdata(player) + if not playerdata.location_history then return end + return playerdata.location_history.references[playerdata.location_history.current_pointer + 1] +end + +function RemoteView.history_goto_previous(player) + local location_reference = RemoteView.history_previous(player) + if location_reference then + local playerdata = get_make_playerdata(player) + playerdata.location_history.current_pointer = playerdata.location_history.current_pointer - 1 + Location.goto_reference(player, location_reference, true) + end +end +function RemoteView.history_previous(player) + local playerdata = get_make_playerdata(player) + if not playerdata.location_history then return end + return playerdata.location_history.references[playerdata.location_history.current_pointer - 1] +end + +function RemoteView.history_delete_all(player) + local playerdata = get_make_playerdata(player) + if not playerdata.location_history then return end + local current_history = nil + if playerdata.location_history.current_pointer > 0 and playerdata.location_history.references then + current_history = playerdata.location_history.references[playerdata.location_history.current_pointer] + end + playerdata.location_history.current_pointer = 0 + for key, value in pairs(playerdata.location_history.references) do + playerdata.location_history.references[key] = nil + end + if current_history then + playerdata.location_history.current_pointer = 1 + table.insert(playerdata.location_history.references, current_history) + end +end + +function RemoteView.history_goto_last(player) + local playerdata = get_make_playerdata(player) + if playerdata.location_history.references and playerdata.location_history.references then + local location_reference = playerdata.location_history.references[#playerdata.location_history.references] + if location_reference then + Location.goto_reference(player, location_reference, true) + end + end +end + +function RemoteView.is_unlocked_force(force_name) + if global.debug_view_all_zones or + (global.forces[force_name] + and global.forces[force_name].satellites_launched > 0) then + return true + end + return false +end +function RemoteView.is_unlocked(player) + if global.debug_view_all_zones or + (global.forces[player.force.name] + and global.forces[player.force.name].satellites_launched > 0) then + return true + end + return false +end + +function RemoteView.start (player, zone, position, location_name, freeze_history) + -- dont let the player enter nav view in the editor because it breaks + if player.controller_type == defines.controllers.editor then return game.print({"space-exploration.cannot-open-nav-view-in-editor"}) end + + if RemoteView.is_unlocked(player) then + local playerdata = get_make_playerdata(player) + Spaceship.stop_anchor_scouting(player) + + local character = player.character + -- enter remote view + if not playerdata.remote_view_active then + playerdata.remote_view_active = true + if player.permission_group then + playerdata.pre_nav_permission_group = game.permissions.get_group(player.permission_group.name) + end + --player.set_controller{type = defines.controllers.spectator} + --player.set_controller{type = defines.controllers.ghost} + player.set_controller{type = defines.controllers.god} + player.cheat_mode = true + end + + player.permission_group = RemoteView.player_set_satellite_permissions(player) + + if character then + playerdata.character = character + playerdata.character.color = player.color + -- stop the character from continuing input action (running to doom) + character.walking_state = {walking = false, direction = defines.direction.south} + character.riding_state = {acceleration = defines.riding.acceleration.braking, direction = defines.riding.direction.straight} + character.shooting_state = {state = defines.shooting.not_shooting, position=character.position} + end + + if not zone then + zone = Zone.from_surface(player.surface) + end + if not zone then + local vault = Ancient.vault_from_surface(player.surface) + if vault then + zone = Zone.from_zone_index(vault.zone_index) + end + end + if (not zone) and not playerdata.remote_view_active_map then + zone = Zone.get_default() + end + if zone then + if not freeze_history then + local location_reference = Location.make_reference(zone, position, location_name) + RemoteView.add_history(player, location_reference) + end + playerdata.remote_view_current_zone = zone + playerdata.remote_view_active_map = nil + if zone.type == "spaceship" then + local spaceship = zone + local surface = Spaceship.get_current_surface(zone) + if player.surface ~= surface then + if position then + player.teleport(position, surface) + elseif spaceship.console and spaceship.console.valid then + player.teleport(spaceship.console.position, spaceship.console.surface) + else + if spaceship.known_tiles_average_x and spaceship.known_tiles_average_y then + player.teleport({spaceship.known_tiles_average_x,spaceship.known_tiles_average_y}, surface) + else + player.teleport({0,0}, surface) + end + end + elseif position then + player.teleport(position) + end + else + local surface = Zone.get_make_surface(zone) + if not playerdata.surface_positions or not playerdata.surface_positions[surface.index] then + player.force.chart(surface, util.position_to_area({x = 0, y = 0}, 256)) + elseif not position then + position = playerdata.surface_positions[zone.surface_index] + end + if not position then + position = {x = 0, y = 0} + end + player.teleport(position, surface) + Zone.apply_markers(zone) -- in case the surface exists + end + else + playerdata.remote_view_current_zone = nil + playerdata.remote_view_active_map = nil + end + + -- add zone select gui + RemoteView.gui_open(player) + else + player.print({"space-exploration.remote-view-requires-satellite"}) + end +end + +function RemoteView.is_active (player) + return get_make_playerdata(player).remote_view_active == true +end + +function RemoteView.toggle (player) + if RemoteView.is_active(player) then + RemoteView.stop(player) + else + RemoteView.start(player) + end +end + +function RemoteView.on_gui_click (event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + + if event.element.name == RemoteView.name_button_overhead_satellite then + RemoteView.toggle(player) return + end + + if Pin.on_gui_click(event) then + return + end + + local root = gui_element_or_parent(element, RemoteView.name_gui_root) + if root then -- remote view + if element.name == RemoteView.name_window_close then + RemoteView.stop(player) + elseif element.name == RemoteView.name_button_zonelist then + Zonelist.toggle_main_window(event.player_index) + elseif element.name == RemoteView.name_button_starmap then + if not MapView.player_is_in_interstellar_map(player) then + MapView.start_interstellar_map(player) + else + RemoteView.stop(player) + end + elseif element.name == RemoteView.name_button_system_map then + local zone = Zone.from_surface(player.surface) + if zone then + local parent_star = Zone.get_star_from_child(zone) + if parent_star then + MapView.start_system_map(player, parent_star) + else + MapView.start_interstellar_map(player) + end + elseif MapView.get_current_system(player) then + --RemoteView.start(player, MapView.get_current_system(player)) + RemoteView.history_goto_previous(player) + else + RemoteView.stop(player) + end + elseif element.parent and element.parent.name == MapView.name_toggles then + MapView.toggle_setting(player, element.name) + RemoteView.gui_update(player) + elseif element.tags.action == RemoteView.action_zone_click then + local zone = Zone.from_zone_index(element.tags.zone_index) + if zone then RemoteView.start (player, zone) end + elseif element.name == RemoteView.name_button_history_delete then + RemoteView.history_delete_all(player) + RemoteView.gui_update(player) + elseif element.name == RemoteView.name_button_history_previous then + RemoteView.history_goto_previous(player) + elseif element.name == RemoteView.name_button_history_next then + RemoteView.history_goto_next(player) + end + return + end +end +Event.addListener(defines.events.on_gui_click, RemoteView.on_gui_click) + +function RemoteView.on_lua_shortcut (event) + if event.player_index + and game.players[event.player_index] + and game.players[event.player_index].connected then + + if event.prototype_name == RemoteView.name_shortcut then + RemoteView.toggle(game.players[event.player_index]) + end + + end +end +Event.addListener(defines.events.on_lua_shortcut, RemoteView.on_lua_shortcut) + +function RemoteView.on_remote_view_keypress (event) + if event.player_index + and game.players[event.player_index] + and game.players[event.player_index].connected + then + local player = game.players[event.player_index] + if event.input_name == RemoteView.name_event then + RemoteView.toggle(player) + elseif event.input_name == RemoteView.name_event_next then + RemoteView.history_goto_next(player) + elseif event.input_name == RemoteView.name_event_previous then + RemoteView.history_goto_previous(player) + end + end +end +Event.addListener(RemoteView.name_event, RemoteView.on_remote_view_keypress) +Event.addListener(RemoteView.name_event_next, RemoteView.on_remote_view_keypress) +Event.addListener(RemoteView.name_event_previous, RemoteView.on_remote_view_keypress) + + +function RemoteView.on_remote_view_pins_keypress (event) + if event.player_index + and game.players[event.player_index] + and game.players[event.player_index].connected + then + Pin.window_toggle(game.players[event.player_index]) + end +end +Event.addListener(RemoteView.name_pins_event, RemoteView.on_remote_view_pins_keypress) + +function RemoteView.on_player_clicked_gps_tag (event) + local player = game.players[event.player_index] + if not player then return end + local surface = game.surfaces[event.surface] + if surface then + local zone = Zone.from_surface(surface) + if not zone then + if event.surface ~= player.surface.name then + return player.print("The GPS tag is on a different surface which cannot be viewed via satellite.") + end + else + if not RemoteView.is_unlocked(player) then + if event.surface ~= player.surface.name then + return player.print("The GPS tag is on a different surface, launch a satellite to view the location.") + else + -- default to map shift with no message + end + else + if Zone.is_visible_to_force(zone, player.force.name) then + local playerdata = get_make_playerdata(player) + RemoteView.start(player, zone, event.position) + player.close_map() + player.zoom = 0.3 + else + player.print("Cannot view location via satellite, zone is not discovered.") + end + end + end + else + player.print("GPS tag specifies invalid surface.") + end +end +Event.addListener(defines.events.on_player_clicked_gps_tag, RemoteView.on_player_clicked_gps_tag) + +function RemoteView.update_overhead_button(player_index) + local player = game.players[player_index] + local button_flow = mod_gui.get_button_flow(player) + if button_flow then + if settings.get_player_settings(player)[RemoteView.name_setting_overhead_satellite].value == true then + if not button_flow[RemoteView.name_button_overhead_satellite] then + button_flow.add{type="sprite-button", name=RemoteView.name_button_overhead_satellite, sprite="virtual-signal/"..mod_prefix.."remote-view", tooltip = {"space-exploration.remote-view"}} + end + else + if button_flow[RemoteView.name_button_overhead_satellite] then + button_flow[RemoteView.name_button_overhead_satellite].destroy() + end + end + end +end + +function RemoteView.on_runtime_mod_setting_changed(event) + for _, player in pairs(game.connected_players) do + RemoteView.update_overhead_button(player.index) + end +end +Event.addListener(defines.events.on_runtime_mod_setting_changed, RemoteView.on_runtime_mod_setting_changed) + +function RemoteView.on_configuration_changed() + for _, player in pairs(game.connected_players) do + RemoteView.update_overhead_button(player.index) + end +end +Event.addListener("on_configuration_changed", RemoteView.on_configuration_changed, true) + +return RemoteView diff --git a/space-exploration_0.5.58/space-exploration/scripts/respawn.lua b/space-exploration_0.5.58/space-exploration/scripts/respawn.lua new file mode 100644 index 0000000..976091e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/respawn.lua @@ -0,0 +1,523 @@ +local Respawn = {} + +--custon event +--/c remote.call("space-exploration", "get_on_player_respawned_event") +--script.on_event(remote.call("space-exploration", "get_on_player_respawned_event"), my_event_handler) +Respawn.on_player_respawned_event = script.generate_event_name() + +-- constants +Respawn.name_gui = mod_prefix.."respawn-gui" +Respawn.name_shortcut = mod_prefix.."respawn" +Respawn.name_button_event = mod_prefix.."respawn" +Respawn.keep_percent = 0.9 +Respawn.corpse_inventory_size_buffer = 100 +Respawn.non_colliding_search_radius = 128 + +function Respawn.at(player, surface, position) + position = position or player.force.get_spawn_position(surface) or {0,0} + player.teleport(position, surface) + + local character = surface.create_entity{name = "character", position=position, force=player.force, raise_built=true} + local playerdata = get_make_playerdata(player) + playerdata.death_surface = nil + Respawn.set_data(playerdata, character) + player.set_controller{type = defines.controllers.character, character = character} + teleport_non_colliding_player(player, position) + Respawn.close_gui(player) + RemoteView.stop(player) + --script.raise_event(defines.events.on_player_respawned, {player_index=player.index}) -- crashes in 0.18.27 + script.raise_event(Respawn.on_player_respawned_event, {player_index = player.index}) + on_player_spawned({player_index=player.index}) +end + +function Respawn.at_zone(player, zone, position) + Respawn.at(player, Zone.get_make_surface(zone), position) +end + +function Respawn.at_landing_pad(player, landing_pad) + if not landing_pad.container and landing_pad.container.valid then + Respawn.open_gui (player) + return + end + local position = landing_pad.container.position or {0,0} + local surface = landing_pad.container.surface + Respawn.at(player, surface, position) +end + +function Respawn.at_spaceship(player, spaceship) + local position = {0,0} + local surface = game.surfaces[1] + if spaceship.console and spaceship.console.valid then + position = spaceship.console.position + surface = spaceship.console.surface + elseif spaceship.own_surface_index then + surface = Spaceship.get_own_surface(spaceship) + if spaceship.known_bounds then + position = { + x = (spaceship.known_bounds.left_top.x + spaceship.known_bounds.right_bottom.x) / 2, + y = (spaceship.known_bounds.left_top.y + spaceship.known_bounds.right_bottom.y) / 2 + } + end + end + Respawn.at(player, surface, position) +end + + +function Respawn.get_options(player) + local home_zone + if global.forces[player.force.name] and global.forces[player.force.name].homeworld_index then + home_zone = Zone.from_zone_index(global.forces[player.force.name].homeworld_index) + end + if not home_zone then home_zone = Zone.from_name("Nauvis") end + local options = { + default = home_zone, + rocket_landing_pads = {}, + spaceships = {} + } + local playerdata = get_make_playerdata(player) + local death_zone = nil + if playerdata.death_surface then + local vault = Ancient.vault_from_surface(playerdata.death_surface) + if vault then + death_zone = Zone.from_zone_index(vault.zone_index) + else + death_zone = Zone.from_surface(playerdata.death_surface) + end + end + if not death_zone then death_zone = home_zone end + if global.spaceships then + local spaceship_zones = {} + local spaceship_zone = nil + for _, spaceship in pairs(global.spaceships) do + if spaceship.force_name == player.force.name then + spaceship_zone = Zone.from_surface(Spaceship.get_current_surface(spaceship)) + if spaceship_zone then + table.insert(spaceship_zones, spaceship_zone) + end + end + end + if #spaceship_zones > 0 then + local spaceship_respawn_surface = Zone.get_surface(Zone.get_closest_zone(death_zone, spaceship_zones)) + for _, spaceship in pairs(global.spaceships) do + if spaceship.force_name == player.force.name and Spaceship.get_current_surface(spaceship) == spaceship_respawn_surface then + table.insert(options.spaceships, spaceship) + end + end + end + end + + if global.rocket_landing_pads then + local landing_pad_zones = {} + for zone_index, zone_assets in pairs(global.forces[player.force.name].zone_assets) do + if zone_assets.rocket_landing_pad_names and table_size(zone_assets.rocket_landing_pad_names) > 0 then + table.insert(landing_pad_zones, Zone.from_zone_index(zone_index)) + end + end + + if #landing_pad_zones > 0 then + local respawn_zone = Zone.get_closest_zone(death_zone, landing_pad_zones) + local landing_pad_respawn_surface = Zone.get_surface(Zone.get_closest_zone(death_zone, landing_pad_zones)) + for _, rocket_landing_pad in pairs(global.rocket_landing_pads) do + if rocket_landing_pad.force_name == player.force.name then + if rocket_landing_pad.container and rocket_landing_pad.container.valid then + if rocket_landing_pad.container.surface == landing_pad_respawn_surface then + table.insert(options.rocket_landing_pads, rocket_landing_pad) + end + else + Landingpad.destroy(rocket_landing_pad) + end + end + end + end + end + return options +end + + + +function Respawn.on_gui_click(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + root = gui_element_or_parent(element, Respawn.name_gui) + if not root then return end + + local options = Respawn.get_options(player) + if element.name == "spaceship" and #options.spaceships > 0 then + Respawn.at_spaceship(player, options.spaceships[math.random(#options.spaceships)]) + elseif element.name == "rocket-landing-pad" and #options.rocket_landing_pads > 0 then + Respawn.at_landing_pad(player, options.rocket_landing_pads[math.random(#options.rocket_landing_pads)]) + else + Respawn.at_zone(player, options.default) + end +end +Event.addListener(defines.events.on_gui_click, Respawn.on_gui_click) + +function Respawn.close_gui (player) + if player.character and player.gui.center[Respawn.name_gui] then + player.gui.center[Respawn.name_gui].destroy() + end +end + +function Respawn.open_gui (player) + local gui = player.gui.center + gui.clear() + local options = Respawn.get_options(player) + local root = gui.add{ type = "frame", name = Respawn.name_gui, direction="vertical", caption={"space-exploration.respawn-options-title"}} + flow = root.add{ type="flow", name="respawn_options", direction="vertical"} + --flow.add{ type = "sprite-button", sprite = "virtual-signal/"..mod_prefix.."planet", name = "planet"} + flow.add{ type = "button", caption = {"space-exploration.respawn-button-homeworld"}, name = "planet"} + if #options.rocket_landing_pads > 0 then + --flow.add{ type = "sprite-button", sprite = "item/"..mod_prefix.."rocket-landing-pad", name = "rocket-landing-pad"} + flow.add{ type = "button", caption = {"space-exploration.respawn-button-landing-pad"}, name = "rocket-landing-pad"} + end + if #options.spaceships > 0 then + --flow.add{ type = "sprite-button", sprite = "virtual-signal/"..mod_prefix.."spaceship", name = "spaceship"} + flow.add{ type = "button", caption = {"space-exploration.respawn-button-spaceship"}, name = "spaceship"} + end +end + +function Respawn.set_data(playerdata, character) + + if playerdata.personal_logistic_slots then + for i, slot in pairs(playerdata.personal_logistic_slots) do + if slot and slot.name and game.item_prototypes[slot.name] then + if slot.min then + if slot.max then + slot.min = math.min(slot.min, slot.max) + end + slot.min = math.max(0, slot.min) + end + if slot.max then + if slot.min then + slot.max = math.max(slot.min, slot.max) + end + slot.max = math.max(0, slot.max) + end + character.set_personal_logistic_slot(i, slot) + end + end + end + + if playerdata.character_personal_logistic_requests_enabled ~= nil then + character.character_personal_logistic_requests_enabled = playerdata.character_personal_logistic_requests_enabled + end + + if playerdata.inventory_type_filters then + for inventory_type, inventory_filters in pairs(playerdata.inventory_type_filters) do + local inventory = character.get_inventory(inventory_type) + if inventory then + for slot, string in pairs(inventory_filters) do + if string and slot <= #inventory and game.item_prototypes[string] then + inventory.set_filter(slot, string) + end + end + end + end + end + +end + +function Respawn.record_data(playerdata, character) + playerdata.inventory_type_filters = {} + playerdata.personal_logistic_slots = {} + playerdata.character_personal_logistic_requests_enabled = nil + + if not character and character.valid then return end + + local limit = 100 + local i = 1 + while i < limit do + playerdata.personal_logistic_slots[i] = character.get_personal_logistic_slot(i) + if playerdata.personal_logistic_slots[i] and playerdata.personal_logistic_slots[i].name then + limit = i + 100 + end + i = i + 1 + end + + playerdata.character_personal_logistic_requests_enabled= character.character_personal_logistic_requests_enabled + + local inventories = {defines.inventory.character_main, defines.inventory.character_guns, defines.inventory.character_ammo} + for _, inventory_type in pairs(inventories) do + local inventory = character.get_inventory(inventory_type) + if inventory then + playerdata.inventory_type_filters[inventory_type] = playerdata.inventory_type_filters[inventory_type] or {} + for i = 1, #inventory do + playerdata.inventory_type_filters[inventory_type][i] = inventory.get_filter(i) + end + end + end +end + +function Respawn.tick_task_bind_corpse (tick_task) + tick_task.valid = false + local corpse = tick_task.corpse_surface.find_entity("character-corpse", tick_task.corpse_position) + if corpse and corpse.valid then + corpse.character_corpse_player_index = tick_task.player_index + end +end + +function Respawn.mark_corpse (player, character) + player.force.add_chart_tag(character.surface, { + icon = {type = "virtual", name = mod_prefix .. "character-corpse"}, + position = character.position, + text = player.name + }) + local tick_task = new_tick_task("bind-corpse") + tick_task.corpse_position = character.position + tick_task.corpse_surface = character.surface + tick_task.player_index = player.index + +end + +function Respawn.respawn (player) + + close_own_guis(player) + player.play_sound{path = "se-game-lost", volume = 1} + + local playerdata = get_make_playerdata(player) + if player.character then + Respawn.mark_corpse(player, player.character) + Respawn.record_data(playerdata, player.character) + end + playerdata.character = nil + player.set_controller{type = defines.controllers.spectator} + + if playerdata.lock_respawn then + if playerdata.lock_respawn.surface_name and game.surfaces[playerdata.lock_respawn.surface_name] then + Respawn.at(player, game.surfaces[playerdata.lock_respawn.surface_name], playerdata.lock_respawn.position) + end + if playerdata.lock_respawn.zone_index then + local zone = Zone.from_zone_index(playerdata.lock_respawn.zone_index) + Respawn.at(player, Zone.get_make_surface(zone), playerdata.lock_respawn.position) + end + return + end + + local options = Respawn.get_options(player) + --if #options.rocket_landing_pads > 0 or #options.spaceships > 0 then + Respawn.open_gui (player) + --else + -- Respawn.at_zone(player, options.default) + --end +end + +function Respawn.die (player) + + RemoteView.stop(player) + Spaceship.stop_anchor_scouting(player) + + if player.character then + player.character.die() + else -- skip ahead + local playerdata = get_make_playerdata(player) + if playerdata.character and playerdata.character.valid then + Respawn.record_data(playerdata, character) + playerdata.character.die() + game.print({"space-exploration.player-died", player.name or ("Player " .. player.index)}) + end + Respawn.respawn(player) + end + + if player and player.connected then + player.print({"space-exploration.please-consider-patreon"}) + end +end + +function Respawn.on_pre_player_died (event) + local player = game.players[event.player_index] + if player then + RemoteView.stop(player) + Spaceship.stop_anchor_scouting(player) + local playerdata = get_make_playerdata(player) + playerdata.death_surface = player.character.surface + Respawn.respawn(player) + if player and player.connected then + player.print({"space-exploration.please-consider-patreon"}) + end + --[[ + local surface = player.character.surface + player.character.health = player.character.prototype.max_health + local main_inv = player.get_main_inventory() + local corpse = surface.create_entity{ + name = player.character.prototype.character_corpse.name, + position = player.position, + force = player.force, + player_index = player.index, + inventory_size = #main_inv + Respawn.corpse_inventory_size_buffer + } + --corpse.expires = false -- errors + corpse.character_corpse_player_index = player.index + corpse.character_corpse_tick_of_death = game.tick + for _, inv_type in pairs({ + defines.inventory.character_main, + defines.inventory.character_guns, + defines.inventory.character_ammo, + defines.inventory.character_armor, + defines.inventory.character_trash, + }) do + local inv = player.get_inventory(inv_type) + if inv then + local contents = inv.get_contents() + for item_type, item_count in pairs(contents) do + if inv_type == defines.inventory.character_armor then -- never lose this + corpse.insert({name=item_type, count=item_count}) + elseif item_count > 1 then + corpse.insert({name=item_type, count=math.ceil(item_count * Respawn.keep_percent) }) + elseif math.random() < Respawn.keep_percent then + corpse.insert({name=item_type, count=item_count}) + end + end + inv.clear() + end + end + game.print({"space-exploration.player-died", player.name or ("Player " .. player.index)}) + local nauvis = game.surfaces[1] + player.teleport(nauvis.find_non_colliding_position(player.character.name, {x=0,y=0}, Respawn.non_colliding_search_radius, 1), nauvis) + ]]-- + end +end +Event.addListener(defines.events.on_pre_player_died, Respawn.on_pre_player_died) + + +function Respawn.on_entity_died (event) + -- Called when an entity dies. + -- entity :: LuaEntity + -- cause :: LuaEntity (optional): The entity that did the killing if available. + -- loot :: LuaInventory: The loot generated by this entity if any. + -- force :: LuaForce (optional): The force that did the killing if any. + if not (event.entity and event.entity.valid) then return end + if event.entity.type == "character" then + local character = event.entity + if not character.player then + for player_index, playerdata in pairs(global.playerdata) do + if playerdata.character == character then + local player = game.players[player_index] + if player and player.connected then + -- player's character died + RemoteView.stop(player) + Spaceship.stop_anchor_scouting(player) + + Respawn.record_data(playerdata, character) + game.print({"space-exploration.player-died", player.name or ("Player " .. player.index)}) + Respawn.respawn(player) -- adds marker + end + return + end + end + end + end +end +Event.addListener(defines.events.on_entity_died, Respawn.on_entity_died) + +function Respawn.on_corpse_removed (corpse) + + for _, force in pairs(game.forces) do + local tags = force.find_chart_tags(corpse.surface, Util.position_to_area( corpse.position, 1)) + for _, tag in pairs(tags) do + if tag.icon and tag.icon.name == mod_prefix .. "character-corpse" then + -- TODO: check that corpse matches the marker. + -- will need to have the corpse know the player first. + tag.destroy() + end + end + end + +end + +function Respawn.on_character_corpse_expired (event) + -- event.corpse LuaEntity + -- Note: this is not called if the corpse is mined. See defines.events.on_pre_player_mined_item to detect that. + -- remove corpse marker + if not(event.corpse and event.corpse.valid) then return end + Respawn.on_corpse_removed (event.corpse) + +end +Event.addListener(defines.events.on_character_corpse_expired, Respawn.on_character_corpse_expired) + +function Respawn.on_pre_player_mined_item (event) + -- event.entity + -- event.player_index + -- remove corpse marker + if not(event.entity and event.entity.valid) then return end + if event.entity.name == "character-corpse" then + Respawn.on_corpse_removed (event.entity) + end +end +Event.addListener(defines.events.on_pre_player_mined_item, Respawn.on_pre_player_mined_item) + +function Respawn.on_lua_shortcut (event) + if event.player_index + and game.players[event.player_index] + and game.players[event.player_index].connected then + if event.prototype_name == Respawn.name_shortcut then + --Respawn.die(game.players[event.player_index]) + Respawn.confirm.open_gui(game.players[event.player_index]) + end + end +end +Event.addListener(defines.events.on_lua_shortcut, Respawn.on_lua_shortcut) + +function Respawn.on_respawn_keypress (event) + if event.player_index + and game.players[event.player_index] + and game.players[event.player_index].connected + then + --Respawn.die(game.players[event.player_index]) + Respawn.confirm.open_gui(game.players[event.player_index]) + end +end +Event.addListener(Respawn.name_button_event, Respawn.on_respawn_keypress) + +Respawn.confirm = {} +Respawn.confirm.name_gui = mod_prefix.."respawn-gui-confirm" +Respawn.confirm.buttons_container = 'confirm_button_container' +Respawn.confirm.button_yes = 'yes' +Respawn.confirm.button_no = 'no' + +function Respawn.confirm.open_gui(player) + local center = player.gui.center + if (center[Respawn.confirm.name_gui]) then return end + if (center[Respawn.name_gui]) then return end + local popup = center.add {type = "frame", name = Respawn.confirm.name_gui, direction = "vertical", caption = {'space-exploration.respawn-confirm-title'}} + + local buttons_container = popup.add {type = "flow", name = Respawn.confirm.buttons_container, direction = "horizontal"} + + + buttons_container.add { + type = "button", + name = Respawn.confirm.button_no, + style="back_button", + caption = {'space-exploration.respawn-confirm-no'} + } + + local yes = buttons_container.add { + type = "button", + name = Respawn.confirm.button_yes, + style="red_confirm_button", + caption = {'space-exploration.respawn-confirm-yes'} + } + yes.style.left_margin = 10 +end + +function Respawn.confirm.close_gui(player) + if player.gui.center[Respawn.confirm.name_gui] then + player.gui.center[Respawn.confirm.name_gui].destroy() + end +end + +function Respawn.confirm.on_gui_click(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + root = gui_element_or_parent(element, Respawn.confirm.name_gui) + if not root then return end + if element.name == Respawn.confirm.button_yes then + Respawn.die(game.players[event.player_index]) + end + Respawn.confirm.close_gui(game.players[event.player_index]) +end +Event.addListener(defines.events.on_gui_click, Respawn.confirm.on_gui_click) + + +return Respawn diff --git a/space-exploration_0.5.58/space-exploration/scripts/ruin.lua b/space-exploration_0.5.58/space-exploration/scripts/ruin.lua new file mode 100644 index 0000000..b8d3cb8 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/ruin.lua @@ -0,0 +1,476 @@ +local Ruin = {} + +--[[ +Add more ruins below, eg: +Ruin.ruins["my-ruin"] = require("ruins/my-ruin.lua") +test with +/c remote.call("space-exploration", "build_ruin", {ruin_name = "my-ruin", surface_index = game.player.surface.index, position = game.player.position}) + +Ruin forces: +"enemy" = turrets are hostile to player, cannot be mined, cannot be opened +"neutral" = can be mined +"capture" = can be captured by nearby player (not implemented yet, defaults to neutral) + + +When making a ruin it is useful to use the editor, then make a blurprint, then export the string. +In order to blueprint entities they must be your force: +/c for _, e in pairs(game.player.surface.find_entities()) do e.force=game.player.force end +]]-- + +Ruin.ruins = {} + +Ruin.ruins["satellite"] = require("ruins/satellite.lua") +Ruin.ruins["galaxy-ship"] = require("ruins/galaxy-ship.lua") +Ruin.ruins["interburbulator-platform"] = require("ruins/interburbulator-platform.lua") +Ruin.ruins["arty40"] = require("ruins/arty40.lua") +Ruin.ruins["persepolis"] = require("ruins/persepolis.lua") +Ruin.track_loot_items = {"se-arcosphere", "productivity-module-9", "speed-module-9", "effectivity-module-9"} + +function Ruin.build(data) + if not (data.ruin_name and data.surface_index and data.position) then return end + + local ruin_name = data.ruin_name + local ruin = Ruin.ruins[data.ruin_name] + if not ruin then return end + + setup_util_forces() + local force = "ignore" + if ruin.force_name then + force = ruin.force_name + end + if data.force_name_override then + force = data.force_name_override + end + + local ruin_position = data.position + ruin_position.x = math.floor((ruin_position.x+1)/2)*2-1 + ruin_position.y = math.floor((ruin_position.y+1)/2)*2-1 + local ruin_position_center_offset = Util.vectors_delta(ruin.center, ruin_position) + + local surface = game.surfaces[data.surface_index] + + surface.request_to_generate_chunks(ruin_position, 2) + surface.force_generate_chunk_requests() -- must be generated to place + + if ruin.prebuild then + ruin.prebuild(surface, ruin_position, ruin) + end + + + if ruin.clear_entity_areas then + for _, clear_area in pairs(ruin.clear_entity_areas) do + local area = Util.area_add_position(clear_area, ruin_position_center_offset) + local entities = surface.find_entities(area) + for _, entity in pairs(entities) do + if entity.valid and entity.type ~= "character" then entity.destroy() end + end + end + end + if ruin.clear_decorative_areas then + for _, clear_area in pairs(ruin.clear_decorative_areas) do + local area = Util.area_add_position(clear_area, ruin_position_center_offset) + surface.destroy_decoratives{area = area} + end + end + + local under_tiles = ruin.under_tiles or {} + if ruin.default_under_tile then + under_tiles[ruin.default_under_tile] = under_tiles[ruin.default_under_tile] or {} + end + if ruin.tiles then + local tiles = {} + for tile_name, positions in pairs(ruin.tiles) do + local tile_type = game.tile_prototypes[tile_name] + local m = tile_type.mineable_properties.minable and ruin.default_under_tile + for _, position in pairs(positions) do + if m then table.insert(under_tiles[ruin.default_under_tile], position) end + table.insert(tiles, {name = tile_name, + position = { + x = ruin_position.x + position[1] - ruin.center.x, + y = ruin_position.y + position[2] - ruin.center.y}}) + end + end + surface.set_tiles(tiles, true) + end + + for tile_name, positions in pairs(under_tiles) do + for _, position in pairs(positions) do + surface.set_hidden_tile({ + x = ruin_position.x + position[1] - ruin.center.x, + y = ruin_position.y + position[2] - ruin.center.y}, tile_name) + end + end + + for _, bp in pairs(ruin.blueprint_strings or {}) do + local container = game.surfaces[1].create_entity{name = "iron-chest", position = {0,0}} + container.insert{name="blueprint", count = 1} + local inv = container.get_inventory(defines.inventory.chest) + local blueprint = inv[1] + blueprint.import_stack(bp.string) + + local entities = blueprint.build_blueprint{ + surface = surface, + force = bp.force_override or force, + position = {ruin_position.x + (bp.xadj or 0), ruin_position.y + (bp.yadj or 0)}, + force_build = true, + direction=defines.direction.north, + skip_fog_of_war=false + } + + for _, entity in pairs(entities) do + if entity.valid then + entity.revive({raise_revive = true}) + end + end + + container.destroy() + end + + for entity_name, set in pairs(ruin.entities or {}) do + for _, entity_data in pairs(set) do + if type(entity_data.x) == "number" or type(entity_data[1]) then + local entity_relative_position = { + x = 0 + (entity_data.x or entity_data[1]), + y = 0 + (entity_data.y or entity_data[2]) + } + local entity_position = { + x = ruin_position.x + entity_relative_position.x - ruin.center.x, + y = ruin_position.y + entity_relative_position.y - ruin.center.y + } + local force_name = entity_data.force_name or force + if data.force_name_override then + force_name = data.force_name_override + end + local entity = surface.create_entity{ + name = entity_name, + force = force_name, + position = entity_position, + direction = entity_data.direction, + raise_built = true + } + if entity_data.graphics_variation then + entity.graphics_variation = entity_data.graphics_variation + end + if entity_data.orientation then + entity.orientation = entity_data.orientation + end + if entity_data.destructible ~= nil then + entity.destructible = entity_data.destructible + end + if entity_data.stacks then + for _, stack in pairs(entity_data.stacks) do + entity.insert{name = stack.name, count = stack.count} + end + end + end + end + end + + --game.print("starting specific chests") + -- put a few specific items in chests based on the insert_list table + -- list of items to put in chests + -- max, min define the range for number of items + -- odds will only have it appear 1 in odds times + -- max, min, and odds all default to 1 + for _, ins in pairs(ruin.insert_list or {}) do + local p = {x = ruin_position.x + ins.x + .5, y = ruin_position.y + ins.y + .5} + -- find_entities_filtered used because it could be any kind of chest + local chest = surface.find_entities_filtered({ + position = p, + radius = .5, + name = { + "steel-chest", + "logistic-chest-buffer", + "logistic-chest-active-provider", + "logistic-chest-buffer", + "logistic-chest-passive-provider", + "logistic-chest-requester", + "logistic-chest-storage", + mod_prefix.."cargo-rocket-cargo-pod" + }})[1] + + if chest == nil then + Log.trace(data.ruin_name..": cannot find specific chest at offset "..ins.x..", "..ins.y.." final position "..p.x..", "..p.y, "ruin") + if is_debug_mode then + rendering.draw_rectangle{ + color = {r = 1, g = 0, b = 0, a = 0.5}, + filled = false, + left_top = {x = ruin_position.x + ins.x, y = ruin_position.y + ins.y}, + right_bottom = {x = 1 + ruin_position.x + ins.x, y = 1 + ruin_position.y + ins.y}, + surface = surface, + } + end + else + --game.print(chest.name .. " found at " .. chest.position.x .. ", " .. chest.position.y) + for _, item in pairs(ins.items) do + --game.print("attempting to insert up to " .. item.count .. " of " .. item.name) + if item.odds == nil or math.random(1, item.odds) == 1 then + chest.insert({name = item.name, count = math.random(item.min or 1, item.max or 1)}) + end + end + end + end + + for wire_type, set in pairs(ruin.wires or {}) do + for _, wire_data in pairs(set) do + local from = surface.find_entity(wire_data.from.name, + { + x = ruin_position.x + (wire_data.from.position.x or wire_data.from.position[1]) - ruin.center.x, + y = ruin_position.y + (wire_data.from.position.y or wire_data.from.position[2]) - ruin.center.y + } + ) + local to = surface.find_entity(wire_data.to.name, + { + x = ruin_position.x + (wire_data.to.position.x or wire_data.to.position[1]) - ruin.center.x, + y = ruin_position.y + (wire_data.to.position.y or wire_data.to.position[2]) - ruin.center.y + } + ) + if from and to then + from.connect_neighbour({ -- https://lua-api.factorio.com/latest/LuaEntity.html#LuaEntity.connect_neighbour + wire = wire_type, + target_entity = to, + source_circuit_id = wire_data.source_circuit_id, + target_circuit_id = wire_data.target_circuit_id + }) + else + game.print("can't find wire targets") + end + end + end + + if ruin.postbuild then + ruin.postbuild(surface, ruin_position, ruin) + end + + -- make sure there are no test items left in the ruin. + for _, entity in pairs(surface.find_entities_filtered{type="infinity-pipe"}) do + entity.destroy() + end + for _, entity in pairs(surface.find_entities_filtered{type="infinity-chest"}) do + entity.destroy() + end + for _, entity in pairs(surface.find_entities_filtered{name="electric-energy-interface"}) do + entity.destroy() + end + +end + + +function Ruin.zone_assign_unique_ruins(zone) + local ruin_name + + if Zone.is_solid(zone) and (not zone.is_homeworld) and (not zone.glyph) and (not zone.interburbulator) and (not zone.ruins) and zone.tags then + global.ruins = global.ruins or {} + local star = Zone.get_star_from_child(zone) + + ruin_name = "persepolis" + if (not global.ruins[ruin_name]) and math.random() < 0.5 and zone.radius > 2000 and star.special_type ~= "homesystem" and (not Util.table_contains(zone.tags, "water_none")) + and (Util.table_contains(zone.tags, "temperature_bland") or Util.table_contains(zone.tags, "temperature_temperate") or Util.table_contains(zone.tags, "temperature_midrange") or Util.table_contains(zone.tags, "temperature_warm")) + and (Util.table_contains(zone.tags, "moisture_none") or Util.table_contains(zone.tags, "moisture_low") or Util.table_contains(zone.tags, "moisture_med")) + and (Util.table_contains(zone.tags, "aux_very_low") or Util.table_contains(zone.tags, "aux_low") or Util.table_contains(zone.tags, "aux_med")) then + local ruin_location = {name = ruin_name, position = {x=0,y=0}, zone_index = zone.index} + global.ruins[ruin_name] = ruin_location + zone.ruins = { [ruin_name] = ruin_location } + end + + ruin_name = "arty40" + if (not global.ruins[ruin_name]) and math.random() < 0.5 and zone.radius > 2000 and star.special_type ~= "homesystem" and (not Util.table_contains(zone.tags, "water_none")) + and (Util.table_contains(zone.tags, "temperature_bland") or Util.table_contains(zone.tags, "temperature_temperate") or Util.table_contains(zone.tags, "temperature_cool")) then + local ruin_location = {name = ruin_name, position = {x=0,y=0}, zone_index = zone.index} + global.ruins[ruin_name] = ruin_location + zone.ruins = { [ruin_name] = ruin_location } + end + end + +end + +function Ruin.zone_build_ruins(zone, surface) + local ruin_name + + ruin_name = "persepolis" + if zone.ruins and zone.ruins[ruin_name] then + Ruin.build( {ruin_name = ruin_name, surface_index = surface.index, position = zone.ruins[ruin_name].position } ) + end + + ruin_name = "arty40" + if zone.ruins and zone.ruins[ruin_name] then + Ruin.build( {ruin_name = ruin_name, surface_index = surface.index, position = zone.ruins[ruin_name].position } ) + end + +end + +function Ruin.log_tiles(data) + -- log tiles in a format that can be put bakc into ruins + local surface = data.surface + local registration_point = Util.position_to_tile(data.registration_point) + local area = {left_top = Util.position_to_tile(data.left_top), right_bottom = Util.position_to_tile(data.right_bottom)} + local capture_name = data.capture_name or "temp" + local file_name = "space-exploration.ruin_log_tiles."..capture_name..".lua" + local tiles = {} + local under_tiles = {} + for x = area.left_top.x, area.right_bottom.x-1 do + for y = area.left_top.y, area.right_bottom.y-1 do + local tile = surface.get_tile(x,y) + if not tiles[tile.name] then + tiles[tile.name] = {} + end + table.insert(tiles[tile.name], {x-registration_point.x,y-registration_point.y}) + local hidden_name = surface.get_hidden_tile({x,y}) + if hidden_name then + if not under_tiles[hidden_name] then + under_tiles[hidden_name] = {} + end + table.insert(under_tiles[hidden_name], {x-registration_point.x,y-registration_point.y}) + end + end + end + local string = "local "..capture_name.." = {\n name = \""..capture_name.."\",\n tiles = {" + for tilename, positions in pairs(tiles) do + string = string.."\n [\""..tilename.."\"] = {" + for _, position in pairs(positions) do + string = string.."{"..position[1]..","..position[2].."}, " + end + string = string.."}," + end + string = string .. "\n },\n under_tiles = {" + for tilename, positions in pairs(under_tiles) do + string = string.."\n [\""..tilename.."\"] = {" + for _, position in pairs(positions) do + string = string.."{"..position[1]..","..position[2].."}, " + end + string = string.."}," + end + string = string .. "\n }\n}" + game.write_file(file_name, string, false) + rendering.draw_rectangle{ + surface = surface, + left_top = area.left_top, + right_bottom = area.right_bottom, + color = {r=0,b=1,g=0,a=0.5}, + width = 5, + time_to_live = 60*5 + } + rendering.draw_rectangle{ + surface = surface, + left_top = area.left_top, + right_bottom = area.right_bottom, + color = {r=0,b=0.5,g=0,a=0.25}, + width = 5, + filled = true, + time_to_live = 60*5 + } + game.print("Tiles of area X:"..area.left_top.x.." to "..area.right_bottom.x.." Y: "..area.left_top.y.."to "..area.right_bottom.y.." captured to: "..file_name) +end + +function Ruin.log_entities(data) + -- log tiles in a format that can be put bakc into ruins + local surface = data.surface + local registration_point = Util.position_to_tile(data.registration_point) + local area = {left_top = Util.position_to_tile(data.left_top), right_bottom = Util.position_to_tile(data.right_bottom)} + local capture_name = data.capture_name or "temp" + local file_name = "space-exploration.ruin_log_entities."..capture_name..".lua" + local entities = surface.find_entities(area) + local entities_data = {} + for _, entity in pairs(entities) do + entities_data[entity.name] = entities_data[entity.name] or {} + local entity_data = { x = entity.position.x-registration_point.x, y = entity.position.y-registration_point.y} + if entity.type == "tree" or entity.type == "simple-entity" then + entity_data.graphics_variation = entity.graphics_variation + end + table.insert(entities_data[entity.name], entity_data) + end + local string = "local "..capture_name.." = {\n name = \""..capture_name.."\",\n entities = {" + for entity_name, entity_list in pairs(entities_data) do + string = string.."\n [\""..entity_name.."\"] = {" + for _, entity_data in pairs(entity_list) do + string = string.."{" + local first = true + for k, v in pairs(entity_data) do + if first then first = false else string = string .. ", " end + string = string..k.."="..v + end + string = string.."}, " + end + string = string.."}," + end + string = string .. "\n }\n}" + game.write_file(file_name, string, false) + rendering.draw_rectangle{ + surface = surface, + left_top = area.left_top, + right_bottom = area.right_bottom, + color = {r=1,b=0,g=1,a=0.5}, + width = 5, + time_to_live = 60*5 + } + rendering.draw_rectangle{ + surface = surface, + left_top = area.left_top, + right_bottom = area.right_bottom, + color = {r=0.5,b=0,g=0.5,a=0.25}, + width = 5, + filled = true, + time_to_live = 60*5 + } + game.print("Entities of area X:"..area.left_top.x.." to "..area.right_bottom.x.." Y: "..area.left_top.y.."to "..area.right_bottom.y.." captured to: "..file_name) +end + +-- Ruin.replace_in_blueprint({name="filename", blueprint="...", entities={["in_name"]="out-name"}, tiles={["in_name"]="out-name"}}) +function Ruin.replace_in_blueprint(data) + local file_name = "space-exploration.replace_in_blueprint."..data.name..".lua" + local blueprint_string = data.blueprint + + local container = game.surfaces[1].create_entity{name = "iron-chest", position = {0,0}} + container.insert{name="blueprint", count = 1} + local inv = container.get_inventory(defines.inventory.chest) + local blueprint = inv[1] + blueprint.import_stack(blueprint_string) + + local entities = blueprint.get_blueprint_entities() + for _, entity in pairs(entities or {}) do + for _, change in pairs(data.entities or {}) do + if entity.name == change.name then + if change.new_name then + entity.name = change.new_name + end + if change.shift then + entity.position.x = entity.position.x + change.shift[1] or change.shift.x + entity.position.y = entity.position.y + change.shift[2] or change.shift.y + end + end + end + end + blueprint.set_blueprint_entities(entities) + + local tiles = blueprint.get_blueprint_tiles() + for _, tile in pairs(tiles or {}) do + for k, v in pairs(data.tiles or {}) do + if tile.name == k then tile.name = v end + end + end + blueprint.set_blueprint_tiles(tiles) + + local out_string = blueprint.export_stack() + + container.destroy() + + game.write_file(file_name, out_string, false) +end + + +function Ruin.on_nth_tick_3600() + if not global.ruins then return end + for ruin_name, ruin_location in pairs(global.ruins) do + local ruin = Ruin.ruins[ruin_location.name] + if ruin and ruin.on_nth_tick_3600 then + local zone = Zone.from_zone_index(ruin_location.zone_index) + local surface = Zone.get_surface(zone) + if surface then + ruin.on_nth_tick_3600(ruin, ruin_location, surface) + end + end + end +end +Event.addListener("on_nth_tick_3600", Ruin.on_nth_tick_3600) -- 1 minute + +return Ruin diff --git a/space-exploration_0.5.58/space-exploration/scripts/ruins/arty40.lua b/space-exploration_0.5.58/space-exploration/scripts/ruins/arty40.lua new file mode 100644 index 0000000..7d39b7c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/ruins/arty40.lua @@ -0,0 +1,130 @@ +local arty40 = { + name = "arty40", + center = {x = 0, y = 0}, + force_name = "conquest", + entities = { -- not blueprintable + ["car"] = { + {x = 6, y = 5, orientation = 0.225} + }, + ["tank"] = { + {x = 19, y = 0, orientation = 0.75}, + {x = 19, y = 2, orientation = 0.75}, + }, + }, + clear_entity_areas = { + {{-29,-22},{32,22}}, + }, + clear_decorative_areas = { + {{-29,-22},{32,22}}, + }, + prebuild = function(surface, ruin_position, ruin) + if not game.forces["conquest"].technologies["energy-weapons-damage-5"].researched then + game.forces["conquest"].research_all_technologies() + end + end, + postbuild = function(surface, ruin_position, ruin) + local ruin_position_center_offset = Util.vectors_delta(ruin.center, ruin_position) + local area = Util.area_add_position({{-29,-22},{32,22}}, ruin_position_center_offset) + local entities = surface.find_entities_filtered{name="logistic-chest-storage", area = area} + local arcospheres_to_add = 8 + local zone = Zone.from_surface(surface) + if zone and zone.looted_items and zone.looted_items["se-arcosphere"] then + arcospheres_to_add = arcospheres_to_add - zone.looted_items["se-arcosphere"] + end + if arcospheres_to_add > 0 then + for i = 1, arcospheres_to_add do + entities[math.random(1, #entities)].insert({name="se-arcosphere", count=1}) + end + end + local entities = surface.find_entities(area) + for _, entity in pairs(entities) do + if entity.name == "logistic-chest-storage" then + local r = math.random(1,10) + if r == 1 then + entity.insert({name="coal", count=10000}) + elseif r == 2 then + entity.insert({name="iron-ore", count=10000}) + elseif r == 3 then + entity.insert({name="copper-ore", count=10000}) + elseif r == 4 then + entity.insert({name="stone", count=10000}) + elseif r == 5 then + entity.insert({name="wood", count=10000}) + elseif r == 6 then + entity.insert({name="processed-fuel", count=10000}) + elseif r == 7 then + entity.insert({name="iron-plate", count=10000}) + elseif r == 8 then + entity.insert({name="copper-plate", count=10000}) + elseif r == 9 then + entity.insert({name="stone-brick", count=10000}) + elseif r == 10 then + entity.insert({name="plastic-bar", count=10000}) + end + end + if entity.type == "accumulator" then + entity.energy = 1000000000 + end + if entity.name == "roboport" then + entity.backer_name = "ARTY40" + entity.insert({name="repair-pack", count=100}) + entity.insert({name="logistic-robot", count=100}) + entity.insert({name="construction-robot", count=100}) + end + if entity.type == "burner-generator" then + entity.insert({name="processed-fuel", count=10000}) + end + if entity.name == "artillery-turret" then + entity.insert({name="artillery-shell", count=10}) + end + if entity.type == "car" then + entity.insert({name="processed-fuel", count=50}) + end + end + local petrol_tank = surface.find_entity("storage-tank", Util.vectors_add(ruin_position_center_offset, {x = 11, y = 1})) + petrol_tank.fluidbox[1] = {name = "petroleum-gas", amount = 15000} + end, + on_nth_tick_3600 = function(ruin, ruin_location, surface) + local ruin_position_center_offset = Util.vectors_delta(ruin.center, ruin_location.position) + local petrol_tank = surface.find_entity("storage-tank", Util.vectors_add(ruin_position_center_offset, {x = 11, y = 1})) + if petrol_tank and petrol_tank.valid and petrol_tank.force.name == "conquest" then petrol_tank.fluidbox[1] = {name = "petroleum-gas", amount = 5000} end + local buffers = surface.find_entities_filtered{name="logistic-chest-buffer", force="conquest"} + for _, buffer in pairs(buffers) do + local request = buffer.get_request_slot(1) + local inv = buffer.get_inventory(defines.inventory.chest) + if inv.is_empty() then + buffer.insert(request) + end + end + local burners = surface.find_entities_filtered{name="burner-turbine-generator", force="conquest"} + for _, burner in pairs(burners) do burner.insert({name = "processed-fuel", count = 500}) end + local accumulators = surface.find_entities_filtered{type="accumulator", force="conquest"} + for _, accumulator in pairs(accumulators) do accumulator.energy = 1000000000 end + end, + tiles = { + ["water-shallow"] = {{-42,3}, {-42,4}, {-42,5}, {-42,6}, {-41,3}, {-41,4}, {-41,5}, {-41,6}, {-41,7}, {-40,4}, {-40,5}, {-40,6}, {-40,8}, {-40,9}, {-39,1}, {-39,2}, {-39,3}, {-39,4}, {-39,5}, {-39,6}, {-39,7}, {-39,8}, {-39,9}, {-39,10}, {-38,-3}, {-38,-2}, {-38,-1}, {-38,0}, {-38,1}, {-38,7}, {-38,8}, {-38,9}, {-38,10}, {-37,-3}, {-37,-2}, {-37,-1}, {-37,0}, {-37,1}, {-37,8}, {-37,9}, {-37,10}, {-37,11}, {-37,12}, {-37,13}, {-36,-5}, {-36,-4}, {-36,-3}, {-36,-2}, {-36,12}, {-36,13}, {-36,14}, {-35,-5}, {-35,-4}, {-35,-3}, {-35,12}, {-35,13}, {-35,14}, {-35,15}, {-34,-6}, {-34,-5}, {-34,-4}, {-34,13}, {-34,14}, {-34,15}, {-34,16}, {-33,-7}, {-33,-6}, {-33,-5}, {-33,-4}, {-33,15}, {-33,16}, {-32,-7}, {-32,-6}, {-32,-5}, {-32,16}, {-32,18}, {-31,-7}, {-31,-6}, {-31,17}, {-31,18}, {-31,19}, {-30,-9}, {-30,-8}, {-30,-7}, {-30,-6}, {-30,17}, {-30,18}, {-30,19}, {-29,18}, {-29,19}, {-29,20}, {-28,-10}, {-28,18}, {-28,19}, {-28,20}, {-27,-11}, {-27,-10}, {-27,19}, {-27,20}, {-26,-11}, {-26,20}, {-26,22}, {-25,-13}, {-25,-12}, {-25,19}, {-25,20}, {-25,22}, {-24,-14}, {-24,-13}, {-24,20}, {-24,21}, {-24,22}, {-23,-16}, {-23,-15}, {-23,-14}, {-23,21}, {-23,22}, {-22,-17}, {-22,-16}, {-22,-15}, {-22,22}, {-22,23}, {-22,24}, {-21,-18}, {-21,-17}, {-21,22}, {-21,23}, {-21,24}, {-20,-19}, {-20,-18}, {-20,22}, {-20,23}, {-19,-21}, {-19,-20}, {-19,-19}, {-19,21}, {-19,22}, {-19,23}, {-18,-21}, {-18,-20}, {-18,21}, {-18,22}, {-17,-22}, {-17,-21}, {-17,-20}, {-17,-19}, {-17,21}, {-16,-23}, {-16,-21}, {-16,-20}, {-15,-23}, {-15,-22}, {-15,-21}, {-15,21}, {-14,-23}, {-14,-22}, {-14,-21}, {-14,21}, {-13,-22}, {-13,-21}, {-13,21}, {-12,-24}, {-12,-23}, {-12,-22}, {-12,21}, {-11,-23}, {-11,-22}, {-11,-21}, {-10,-23}, {-10,-22}, {-9,-23}, {-9,-22}, {-8,-23}, {-8,-22}, {-8,24}, {-7,-24}, {-7,-23}, {-7,-22}, {-7,23}, {-7,24}, {-7,25}, {-6,-22}, {-6,-21}, {-6,23}, {-6,24}, {-6,25}, {-5,-21}, {-5,25}, {-5,26}, {-5,27}, {-4,-22}, {-4,-21}, {-4,26}, {-4,27}, {-3,-21}, {-3,-20}, {-3,26}, {-3,27}, {-3,28}, {-2,-20}, {-2,27}, {-2,28}, {-1,-20}, {-1,-19}, {-1,28}, {-1,29}, {0,-18}, {0,-17}, {0,-16}, {0,28}, {0,29}, {1,-18}, {1,-17}, {1,-16}, {1,-15}, {1,28}, {2,-16}, {2,-15}, {2,-14}, {2,-13}, {3,-14}, {3,-13}, {3,-12}, {3,28}, {4,-14}, {4,-13}, {4,-12}, {4,-11}, {4,28}, {5,-12}, {5,-11}, {5,25}, {5,26}, {5,27}, {6,-14}, {6,-12}, {6,-11}, {6,25}, {6,26}, {7,-23}, {7,-22}, {7,-21}, {7,-12}, {7,-11}, {7,-10}, {7,25}, {7,26}, {7,27}, {8,-23}, {8,-22}, {8,-21}, {8,-11}, {8,-10}, {8,-9}, {8,25}, {8,26}, {8,27}, {9,-25}, {9,-24}, {9,-21}, {9,-19}, {9,-18}, {9,-11}, {9,-10}, {9,-9}, {9,26}, {9,27}, {10,-26}, {10,-25}, {10,-24}, {10,-18}, {10,-17}, {10,-8}, {10,27}, {11,-27}, {11,-26}, {11,-25}, {11,-22}, {11,-21}, {11,-20}, {11,-17}, {11,-8}, {11,-7}, {11,28}, {12,-28}, {12,-27}, {12,-26}, {12,-20}, {12,-19}, {12,-16}, {12,28}, {13,-28}, {13,-27}, {13,-16}, {13,28}, {13,29}, {14,-29}, {14,-28}, {14,-27}, {14,-15}, {14,29}, {14,30}, {15,-30}, {15,-29}, {15,-15}, {15,29}, {15,30}, {16,-31}, {16,-30}, {16,28}, {16,30}, {17,-31}, {17,-30}, {17,27}, {17,28}, {17,29}, {17,30}, {18,-30}, {18,27}, {18,28}, {18,29}, {19,-30}, {19,26}, {19,27}, {19,28}, {19,29}, {20,-30}, {20,27}, {20,28}, {21,-30}, {21,-29}, {21,26}, {21,27}, {21,28}, {22,-30}, {22,-29}, {22,27}, {23,27}, {24,-28}, {24,25}, {24,26}, {25,-28}, {25,24}, {25,25}, {26,-29}, {26,-28}, {26,-27}, {27,-29}, {27,-28}, {27,-27}, {28,-27}, {28,-26}, {29,-26}, {29,-25}, {30,-26}, {31,-26}, {31,-25}, {31,-24}, {31,-23}, {31,20}, {31,21}, {31,22}, {31,23}, {32,-25}, {32,-24}, {32,-23}, {32,-22}, {32,19}, {32,20}, {32,21}, {32,22}, {33,-24}, {33,-23}, {33,-22}, {33,-21}, {33,16}, {33,17}, {33,18}, {33,19}, {33,20}, {33,21}, {33,22}, {34,-23}, {34,-22}, {34,-20}, {34,-19}, {34,14}, {34,15}, {34,16}, {34,17}, {34,18}, {34,19}, {34,20}, {34,21}, {35,-22}, {35,-20}, {35,13}, {35,14}, {35,15}, {35,16}, {35,17}, {35,18}, {35,19}, {36,-20}, {36,-19}, {36,7}, {36,8}, {36,10}, {36,11}, {36,12}, {36,13}, {36,14}, {36,15}, {36,16}, {36,18}, {37,-20}, {37,-19}, {37,-18}, {37,-17}, {37,6}, {37,7}, {37,8}, {37,9}, {37,10}, {37,11}, {37,12}, {37,13}, {37,14}, {38,-19}, {38,-16}, {38,-15}, {38,-14}, {38,-13}, {38,-12}, {38,-11}, {38,-10}, {38,-9}, {38,5}, {38,6}, {38,7}, {38,8}, {38,9}, {38,10}, {38,11}, {38,12}, {38,13}, {39,-18}, {39,-17}, {39,-12}, {39,-11}, {39,-10}, {39,-9}, {39,4}, {39,5}, {39,6}, {39,7}, {39,8}, {39,9}, {39,10}, {39,11}, {40,-17}, {40,-16}, {40,-15}, {40,-14}, {40,-13}, {40,-12}, {40,-11}, {40,-10}, {40,-9}, {40,-4}, {40,-3}, {40,-2}, {40,-1}, {40,0}, {40,4}, {40,5}, {40,6}, {40,7}, {40,8}, {40,9}, {41,-13}, {41,-12}, {41,-11}, {41,-10}, {41,-8}, {41,-7}, {41,-6}, {41,-5}, {41,-4}, {41,-2}, {41,-1}, {41,0}, {41,1}, {41,2}, {41,3}, {41,4}, {41,5}, {41,6}, {42,-6}, {42,-5}, {42,-4}, {42,-3}, {42,-2}, {42,-1}, {42,0}, {42,1}, {42,2}, {42,3}, {42,4}, {42,5}, {43,-4}, {43,-3}, {43,-2}, {43,-1}, {43,0}, {43,1}, {43,2}, {43,4}, }, + ["mineral-beige-dirt-4"] = {{-42,11}, {-42,12}, {-41,2}, {-41,9}, {-41,10}, {-41,11}, {-41,12}, {-41,13}, {-41,14}, {-40,0}, {-40,1}, {-40,2}, {-40,3}, {-40,10}, {-40,11}, {-40,12}, {-40,13}, {-40,14}, {-39,-2}, {-39,-1}, {-39,0}, {-39,11}, {-39,12}, {-39,13}, {-37,-5}, {-37,-4}, {-35,16}, {-35,17}, {-35,18}, {-34,17}, {-34,18}, {-34,19}, {-33,17}, {-33,18}, {-33,19}, {-33,20}, {-32,17}, {-32,19}, {-32,20}, {-32,21}, {-31,20}, {-30,20}, {-19,24}, {-18,23}, {-18,24}, {-17,22}, {-17,23}, {-9,26}, {-8,26}, {-7,26}, {-6,-24}, {-6,-23}, {-6,26}, {-6,27}, {-6,28}, {-5,-23}, {-5,28}, {-5,29}, {-5,30}, {-4,-26}, {-4,-23}, {-4,28}, {-4,29}, {-4,30}, {-3,-26}, {-3,-25}, {-3,-22}, {-3,29}, {-2,-28}, {-2,-27}, {-2,-26}, {-1,-27}, {-1,-26}, {0,-27}, {0,-26}, {0,-25}, {0,-20}, {1,-28}, {1,-27}, {1,-25}, {1,-19}, {2,-27}, {2,-23}, {2,-22}, {2,-18}, {2,-17}, {3,-27}, {3,-24}, {3,-17}, {3,-16}, {3,-15}, {4,-16}, {4,-15}, {5,-15}, {5,-14}, {5,-13}, {6,-28}, {6,-27}, {6,-26}, {6,-25}, {6,-24}, {6,-23}, {6,-22}, {6,-21}, {6,-20}, {6,-19}, {6,-13}, {7,-26}, {7,-25}, {7,-24}, {7,-19}, {7,-18}, {7,-13}, {8,-26}, {8,-25}, {8,-19}, {8,-18}, {8,-17}, {8,-12}, {9,-26}, {9,-17}, {9,-12}, {10,-16}, {10,-11}, {10,-10}, {11,-31}, {11,-30}, {11,-16}, {11,-10}, {11,-9}, {12,-31}, {12,-30}, {12,-29}, {12,-15}, {12,-10}, {12,-9}, {12,-8}, {12,-7}, {12,-6}, {13,-31}, {13,-30}, {13,-29}, {13,-15}, {13,-14}, {13,-6}, {14,-32}, {14,-31}, {14,-30}, {14,-14}, {14,-13}, {15,-31}, {15,-13}, {15,-12}, {15,31}, {15,32}, {16,-13}, {16,-12}, {16,-11}, {16,-10}, {16,-9}, {16,-8}, {16,31}, {16,32}, {17,-10}, {17,-9}, {17,-8}, {17,-7}, {17,-6}, {17,31}, {17,32}, {18,-8}, {18,-7}, {18,31}, {18,32}, {19,31}, {20,29}, {20,30}, {20,31}, {21,29}, {21,30}, {21,31}, {27,-30}, {28,-30}, {28,-29}, {28,-28}, {29,-30}, {29,-29}, {29,-28}, {29,-27}, {30,-29}, {30,-28}, {30,-27}, {35,-24}, {35,-23}, {36,-23}, {36,-22}, {36,-21}, {36,17}, {36,19}, {36,20}, {37,-21}, {37,15}, {37,16}, {37,17}, {37,18}, {37,19}, {38,14}, {38,15}, {38,16}, {38,17}, {38,18}, {39,12}, {39,13}, {39,14}, {39,15}, {39,16}, {40,10}, {40,13}, {40,14}, {41,-9}, {41,7}, {41,8}, {41,9}, {41,10}, {41,11}, {41,12}, {42,-9}, {42,-8}, {42,-7}, {42,6}, {42,7}, {42,8}, {43,-8}, {43,-7}, {43,-6}, {43,-5}, {44,-8}, {44,-7}, {44,-6}, {44,-5}, {44,-4}, {44,-3}, {44,-2}, {44,-1}, {45,-5}, {45,-4}, {45,-3}, }, + ["water"] = {{-38,2}, {-38,3}, {-38,4}, {-38,5}, {-38,6}, {-37,2}, {-37,3}, {-37,4}, {-37,5}, {-37,6}, {-37,7}, {-36,-1}, {-36,0}, {-36,1}, {-36,2}, {-36,3}, {-36,4}, {-36,5}, {-36,6}, {-36,7}, {-36,8}, {-36,9}, {-36,10}, {-36,11}, {-35,-2}, {-35,-1}, {-35,0}, {-35,3}, {-35,4}, {-35,5}, {-35,6}, {-35,11}, {-34,-3}, {-34,-2}, {-34,-1}, {-33,-3}, {-33,-2}, {-33,13}, {-33,14}, {-32,-4}, {-32,-3}, {-32,-2}, {-32,-1}, {-32,14}, {-31,-5}, {-31,-4}, {-31,-3}, {-31,-2}, {-30,-5}, {-30,-4}, {-30,16}, {-29,-7}, {-29,-6}, {-29,-5}, {-29,-4}, {-29,15}, {-29,16}, {-29,17}, {-28,-9}, {-28,-8}, {-28,-7}, {-28,-6}, {-28,-5}, {-28,16}, {-28,17}, {-27,-9}, {-27,-8}, {-27,-7}, {-27,17}, {-27,18}, {-26,-10}, {-26,-9}, {-26,-8}, {-26,-7}, {-26,17}, {-26,18}, {-26,19}, {-25,-10}, {-25,-9}, {-25,-8}, {-25,17}, {-25,18}, {-24,-11}, {-24,-10}, {-24,-9}, {-24,17}, {-24,18}, {-24,19}, {-23,-13}, {-23,-12}, {-23,-11}, {-23,-10}, {-23,17}, {-23,18}, {-23,19}, {-23,20}, {-22,-14}, {-22,-13}, {-22,-12}, {-22,-11}, {-22,-10}, {-22,-9}, {-22,18}, {-22,19}, {-22,20}, {-22,21}, {-21,-16}, {-21,-15}, {-21,-14}, {-21,-13}, {-21,-12}, {-21,-11}, {-21,-10}, {-21,-9}, {-21,19}, {-21,20}, {-21,21}, {-20,-17}, {-20,-16}, {-20,-15}, {-20,-14}, {-20,-11}, {-20,-10}, {-20,-9}, {-20,18}, {-20,19}, {-20,20}, {-20,21}, {-19,-18}, {-19,-17}, {-19,-16}, {-19,-10}, {-19,19}, {-19,20}, {-18,-19}, {-18,-18}, {-18,-17}, {-18,20}, {-17,-18}, {-17,-17}, {-17,19}, {-17,20}, {-16,-22}, {-16,-19}, {-16,-18}, {-16,18}, {-16,19}, {-16,20}, {-15,-20}, {-15,-19}, {-15,18}, {-15,19}, {-15,20}, {-14,-20}, {-14,18}, {-14,19}, {-14,20}, {-13,18}, {-13,19}, {-13,20}, {-12,-21}, {-12,-20}, {-12,18}, {-12,19}, {-12,20}, {-11,-20}, {-11,19}, {-11,20}, {-11,21}, {-11,22}, {-10,-21}, {-10,-20}, {-10,19}, {-10,20}, {-10,21}, {-10,22}, {-10,23}, {-9,-21}, {-9,-20}, {-9,20}, {-9,21}, {-9,22}, {-9,23}, {-8,-21}, {-8,-20}, {-8,-19}, {-8,21}, {-8,22}, {-8,23}, {-7,-21}, {-7,-20}, {-7,-19}, {-7,21}, {-7,22}, {-6,-20}, {-6,-19}, {-6,21}, {-6,22}, {-5,-22}, {-5,-20}, {-5,-19}, {-5,-18}, {-5,22}, {-5,23}, {-5,24}, {-4,-20}, {-4,-19}, {-4,-18}, {-4,21}, {-4,22}, {-4,23}, {-4,24}, {-4,25}, {-3,-19}, {-3,-18}, {-3,-17}, {-3,20}, {-3,21}, {-3,22}, {-3,23}, {-3,24}, {-3,25}, {-2,-19}, {-2,-18}, {-2,-17}, {-2,-16}, {-2,-15}, {-2,21}, {-2,22}, {-2,23}, {-2,24}, {-2,25}, {-2,26}, {-1,-18}, {-1,-17}, {-1,-16}, {-1,-15}, {-1,-14}, {-1,22}, {-1,23}, {-1,24}, {-1,25}, {-1,26}, {-1,27}, {0,-15}, {0,-14}, {0,-13}, {0,22}, {0,23}, {0,24}, {0,25}, {0,26}, {0,27}, {1,-14}, {1,-13}, {1,23}, {1,24}, {1,25}, {1,26}, {1,27}, {1,29}, {1,30}, {2,-12}, {2,23}, {2,24}, {2,25}, {2,26}, {2,27}, {2,28}, {2,29}, {3,-11}, {3,22}, {3,23}, {3,24}, {3,25}, {3,26}, {3,27}, {4,21}, {4,22}, {4,23}, {4,24}, {4,25}, {4,26}, {5,-10}, {5,22}, {5,23}, {5,24}, {6,-10}, {6,23}, {6,24}, {7,-20}, {7,23}, {7,24}, {8,-20}, {8,24}, {9,-23}, {9,-22}, {9,-20}, {9,24}, {9,25}, {10,-23}, {10,-22}, {10,-21}, {10,-20}, {10,-19}, {10,25}, {10,26}, {11,-24}, {11,-23}, {11,-19}, {11,-18}, {11,26}, {11,27}, {12,-25}, {12,-24}, {12,-23}, {12,-22}, {12,-21}, {12,-18}, {12,-17}, {12,26}, {12,27}, {12,29}, {13,-26}, {13,-25}, {13,-24}, {13,-23}, {13,-22}, {13,-21}, {13,27}, {14,-26}, {14,-25}, {14,-24}, {14,-23}, {14,-22}, {14,27}, {14,28}, {15,-28}, {15,-27}, {15,-26}, {15,-25}, {15,-24}, {15,-23}, {15,27}, {15,28}, {16,-29}, {16,-28}, {16,-27}, {16,-26}, {16,-25}, {16,-24}, {16,-23}, {16,-22}, {16,26}, {16,27}, {16,29}, {17,-29}, {17,-28}, {17,-27}, {17,-26}, {17,-25}, {17,-24}, {17,-23}, {17,26}, {18,-29}, {18,-28}, {18,-27}, {18,-26}, {18,-25}, {18,-24}, {18,25}, {18,26}, {18,30}, {19,-29}, {19,-28}, {19,-27}, {19,-26}, {19,-25}, {19,-24}, {19,25}, {19,30}, {20,-29}, {20,-28}, {20,-27}, {20,-26}, {20,-25}, {20,-24}, {20,25}, {20,26}, {21,-28}, {21,-27}, {21,-26}, {21,-25}, {21,-24}, {21,22}, {21,23}, {21,24}, {21,25}, {22,-28}, {22,-27}, {22,-26}, {22,-25}, {22,-24}, {22,17}, {22,18}, {22,19}, {22,20}, {22,21}, {22,22}, {22,23}, {22,24}, {22,25}, {22,26}, {23,-29}, {23,-28}, {23,-27}, {23,-26}, {23,-25}, {23,-24}, {23,15}, {23,16}, {23,17}, {23,18}, {23,19}, {23,20}, {23,21}, {23,22}, {23,23}, {23,24}, {23,25}, {23,26}, {24,-29}, {24,-27}, {24,-26}, {24,-25}, {24,-24}, {24,14}, {24,15}, {24,16}, {24,17}, {24,18}, {24,19}, {24,20}, {24,21}, {24,22}, {24,23}, {24,24}, {25,-27}, {25,-26}, {25,-25}, {25,12}, {25,13}, {25,14}, {25,15}, {25,16}, {25,17}, {25,18}, {25,19}, {25,20}, {25,21}, {25,22}, {25,23}, {26,-26}, {26,-25}, {26,-24}, {26,11}, {26,12}, {26,13}, {26,14}, {26,15}, {26,16}, {26,17}, {26,18}, {26,19}, {26,20}, {26,21}, {26,22}, {26,23}, {26,24}, {27,-26}, {27,-25}, {27,-24}, {27,11}, {27,12}, {27,13}, {27,14}, {27,15}, {27,16}, {27,17}, {27,18}, {27,19}, {27,20}, {27,21}, {27,22}, {27,23}, {27,24}, {27,25}, {28,-25}, {28,-24}, {28,-23}, {28,11}, {28,12}, {28,13}, {28,14}, {28,15}, {28,16}, {28,17}, {28,18}, {28,19}, {28,20}, {28,21}, {28,22}, {28,23}, {28,24}, {29,-24}, {29,-23}, {29,-22}, {29,11}, {29,12}, {29,13}, {29,14}, {29,15}, {29,16}, {29,17}, {29,18}, {29,19}, {29,20}, {29,21}, {29,22}, {29,23}, {30,-25}, {30,-24}, {30,-23}, {30,-22}, {30,-21}, {30,12}, {30,13}, {30,14}, {30,15}, {30,16}, {30,17}, {30,18}, {30,19}, {30,20}, {30,21}, {30,22}, {31,-22}, {31,-21}, {31,-20}, {31,-19}, {31,-18}, {31,-15}, {31,-14}, {31,-13}, {31,9}, {31,10}, {31,11}, {31,12}, {31,13}, {31,14}, {31,15}, {31,16}, {31,17}, {31,18}, {31,19}, {32,-21}, {32,-20}, {32,-19}, {32,-18}, {32,-17}, {32,-16}, {32,-15}, {32,-14}, {32,-13}, {32,-12}, {32,-11}, {32,-8}, {32,-7}, {32,-6}, {32,-5}, {32,-4}, {32,-3}, {32,7}, {32,8}, {32,9}, {32,10}, {32,11}, {32,12}, {32,13}, {32,14}, {32,15}, {32,16}, {32,17}, {32,18}, {33,-20}, {33,-19}, {33,-18}, {33,-17}, {33,-16}, {33,-15}, {33,-14}, {33,-13}, {33,-12}, {33,-11}, {33,-10}, {33,-9}, {33,-8}, {33,-7}, {33,-6}, {33,-5}, {33,-4}, {33,-3}, {33,-2}, {33,-1}, {33,0}, {33,1}, {33,2}, {33,3}, {33,4}, {33,5}, {33,6}, {33,7}, {33,8}, {33,9}, {33,10}, {33,11}, {33,12}, {33,13}, {33,14}, {33,15}, {34,-21}, {34,-18}, {34,-17}, {34,-16}, {34,-15}, {34,-14}, {34,-13}, {34,-12}, {34,-11}, {34,-10}, {34,-9}, {34,-8}, {34,-7}, {34,-6}, {34,-5}, {34,-4}, {34,-3}, {34,-2}, {34,-1}, {34,0}, {34,1}, {34,2}, {34,3}, {34,4}, {34,5}, {34,6}, {34,7}, {34,8}, {34,9}, {34,10}, {34,11}, {34,12}, {34,13}, {35,-21}, {35,-19}, {35,-18}, {35,-17}, {35,-16}, {35,-15}, {35,-14}, {35,-13}, {35,-12}, {35,-11}, {35,-10}, {35,-9}, {35,-8}, {35,-7}, {35,-6}, {35,-5}, {35,-4}, {35,-3}, {35,-2}, {35,-1}, {35,0}, {35,1}, {35,2}, {35,3}, {35,4}, {35,5}, {35,6}, {35,7}, {35,8}, {35,9}, {35,10}, {35,11}, {35,12}, {36,-18}, {36,-17}, {36,-16}, {36,-15}, {36,-14}, {36,-13}, {36,-12}, {36,-11}, {36,-10}, {36,-9}, {36,-8}, {36,-7}, {36,-6}, {36,-5}, {36,-4}, {36,-3}, {36,-2}, {36,-1}, {36,0}, {36,1}, {36,2}, {36,3}, {36,4}, {36,5}, {36,6}, {36,9}, {37,-16}, {37,-15}, {37,-14}, {37,-13}, {37,-12}, {37,-11}, {37,-10}, {37,-9}, {37,-8}, {37,-7}, {37,-6}, {37,-5}, {37,-4}, {37,-3}, {37,-2}, {37,-1}, {37,0}, {37,1}, {37,2}, {37,3}, {37,4}, {37,5}, {38,-18}, {38,-17}, {38,-8}, {38,-7}, {38,-6}, {38,-5}, {38,-4}, {38,-3}, {38,-2}, {38,-1}, {38,0}, {38,1}, {38,2}, {38,3}, {38,4}, {39,-16}, {39,-15}, {39,-14}, {39,-13}, {39,-8}, {39,-7}, {39,-6}, {39,-5}, {39,-4}, {39,-3}, {39,-2}, {39,-1}, {39,0}, {39,1}, {39,2}, {39,3}, {40,-8}, {40,-7}, {40,-6}, {40,-5}, {40,1}, {40,2}, {40,3}, {41,-3}, }, + ["deepwater"] = {{-35,1}, {-35,2}, {-35,7}, {-35,8}, {-35,9}, {-35,10}, {-34,0}, {-34,1}, {-34,2}, {-34,3}, {-34,4}, {-34,5}, {-34,6}, {-34,7}, {-34,8}, {-34,9}, {-34,10}, {-34,11}, {-34,12}, {-33,-1}, {-33,0}, {-33,1}, {-33,2}, {-33,3}, {-33,4}, {-33,5}, {-33,6}, {-33,7}, {-33,8}, {-33,9}, {-33,10}, {-33,11}, {-33,12}, {-32,0}, {-32,1}, {-32,2}, {-32,3}, {-32,4}, {-32,5}, {-32,6}, {-32,7}, {-32,8}, {-32,9}, {-32,10}, {-32,11}, {-32,12}, {-32,13}, {-32,15}, {-31,-1}, {-31,0}, {-31,1}, {-31,2}, {-31,3}, {-31,4}, {-31,5}, {-31,6}, {-31,7}, {-31,8}, {-31,9}, {-31,10}, {-31,11}, {-31,12}, {-31,13}, {-31,14}, {-31,15}, {-31,16}, {-30,-3}, {-30,-2}, {-30,-1}, {-30,0}, {-30,1}, {-30,2}, {-30,3}, {-30,4}, {-30,5}, {-30,6}, {-30,7}, {-30,8}, {-30,9}, {-30,10}, {-30,11}, {-30,12}, {-30,13}, {-30,14}, {-30,15}, {-29,-3}, {-29,-2}, {-29,-1}, {-29,0}, {-29,1}, {-29,2}, {-29,3}, {-29,4}, {-29,10}, {-29,11}, {-29,12}, {-29,13}, {-29,14}, {-28,-4}, {-28,-3}, {-28,-2}, {-28,-1}, {-28,0}, {-28,1}, {-28,2}, {-28,12}, {-28,13}, {-28,14}, {-28,15}, {-27,-6}, {-27,-5}, {-27,-4}, {-27,-3}, {-27,-2}, {-27,-1}, {-27,0}, {-27,14}, {-27,15}, {-27,16}, {-26,-6}, {-26,-5}, {-26,-4}, {-26,-3}, {-26,-2}, {-26,-1}, {-26,0}, {-26,14}, {-26,15}, {-26,16}, {-25,-7}, {-25,-6}, {-25,-5}, {-25,-4}, {-25,-3}, {-25,-2}, {-25,-1}, {-25,15}, {-25,16}, {-24,-8}, {-24,-7}, {-24,-6}, {-24,-5}, {-24,-4}, {-24,-3}, {-24,-2}, {-24,-1}, {-24,15}, {-24,16}, {-23,-9}, {-23,-8}, {-23,-7}, {-23,-6}, {-23,-5}, {-23,-4}, {-23,-3}, {-23,-2}, {-23,16}, {-22,-8}, {-22,-7}, {-22,-6}, {-22,-5}, {-22,-4}, {-22,-3}, {-22,-2}, {-22,16}, {-22,17}, {-21,-8}, {-21,-7}, {-21,-6}, {-21,-5}, {-21,-4}, {-21,-3}, {-21,-2}, {-21,16}, {-21,17}, {-21,18}, {-20,-13}, {-20,-12}, {-20,-8}, {-20,-7}, {-20,-6}, {-20,-5}, {-20,-4}, {-20,-3}, {-20,-2}, {-20,16}, {-20,17}, {-19,-15}, {-19,-14}, {-19,-13}, {-19,-12}, {-19,-11}, {-19,-9}, {-19,-8}, {-19,-7}, {-19,-6}, {-19,-5}, {-19,-4}, {-19,-3}, {-19,16}, {-19,17}, {-19,18}, {-18,-16}, {-18,-15}, {-18,-14}, {-18,-13}, {-18,-12}, {-18,-11}, {-18,-10}, {-18,-9}, {-18,-8}, {-18,-7}, {-18,-6}, {-18,-5}, {-18,-4}, {-18,-3}, {-18,15}, {-18,16}, {-18,17}, {-18,18}, {-18,19}, {-17,-16}, {-17,-15}, {-17,-14}, {-17,-13}, {-17,-12}, {-17,-11}, {-17,-10}, {-17,-9}, {-17,-8}, {-17,-7}, {-17,-6}, {-17,-5}, {-17,-4}, {-17,-3}, {-17,15}, {-17,16}, {-17,17}, {-17,18}, {-16,-17}, {-16,-16}, {-16,-15}, {-16,-14}, {-16,-13}, {-16,-12}, {-16,-11}, {-16,-10}, {-16,-9}, {-16,-8}, {-16,-7}, {-16,-6}, {-16,-5}, {-16,-4}, {-16,14}, {-16,15}, {-16,16}, {-16,17}, {-15,-18}, {-15,-17}, {-15,-16}, {-15,-15}, {-15,-14}, {-15,-13}, {-15,-12}, {-15,-11}, {-15,-10}, {-15,-9}, {-15,-8}, {-15,-7}, {-15,-6}, {-15,-5}, {-15,14}, {-15,15}, {-15,16}, {-15,17}, {-14,-19}, {-14,-18}, {-14,-17}, {-14,-16}, {-14,-15}, {-14,-14}, {-14,-13}, {-14,-12}, {-14,-11}, {-14,-10}, {-14,-9}, {-14,-8}, {-14,-7}, {-14,-6}, {-14,14}, {-14,15}, {-14,16}, {-14,17}, {-13,-20}, {-13,-19}, {-13,-18}, {-13,-17}, {-13,-16}, {-13,-15}, {-13,-14}, {-13,-10}, {-13,-9}, {-13,-8}, {-13,-7}, {-13,14}, {-13,15}, {-13,16}, {-13,17}, {-12,-19}, {-12,-18}, {-12,-17}, {-12,-16}, {-12,14}, {-12,15}, {-12,16}, {-12,17}, {-11,-19}, {-11,-18}, {-11,-17}, {-11,-16}, {-11,14}, {-11,15}, {-11,16}, {-11,17}, {-11,18}, {-10,-19}, {-10,-18}, {-10,-17}, {-10,14}, {-10,15}, {-10,16}, {-10,17}, {-10,18}, {-9,-19}, {-9,-18}, {-9,-17}, {-9,14}, {-9,15}, {-9,16}, {-9,17}, {-9,18}, {-9,19}, {-8,-18}, {-8,-17}, {-8,15}, {-8,16}, {-8,17}, {-8,18}, {-8,19}, {-8,20}, {-7,-18}, {-7,-17}, {-7,-16}, {-7,18}, {-7,19}, {-7,20}, {-6,-18}, {-6,-17}, {-6,-16}, {-6,18}, {-6,19}, {-6,20}, {-5,-17}, {-5,-16}, {-5,-15}, {-5,-14}, {-5,18}, {-5,19}, {-5,20}, {-5,21}, {-4,-17}, {-4,-16}, {-4,-15}, {-4,-14}, {-4,-13}, {-4,-12}, {-4,-11}, {-4,18}, {-4,19}, {-4,20}, {-3,-16}, {-3,-15}, {-3,-14}, {-3,-13}, {-3,-12}, {-3,-11}, {-3,18}, {-3,19}, {-2,-14}, {-2,-13}, {-2,-12}, {-2,-11}, {-2,-10}, {-2,-9}, {-2,18}, {-2,19}, {-2,20}, {-1,-13}, {-1,-12}, {-1,-11}, {-1,-10}, {-1,-9}, {-1,-8}, {-1,18}, {-1,19}, {-1,20}, {-1,21}, {0,-12}, {0,-11}, {0,-10}, {0,-9}, {0,-8}, {0,18}, {0,19}, {0,20}, {0,21}, {1,-12}, {1,-11}, {1,-10}, {1,-9}, {1,-8}, {1,18}, {1,19}, {1,20}, {1,21}, {1,22}, {2,-11}, {2,-10}, {2,-9}, {2,-8}, {2,18}, {2,19}, {2,20}, {2,21}, {2,22}, {3,-10}, {3,-9}, {3,-8}, {3,16}, {3,17}, {3,18}, {3,19}, {3,20}, {3,21}, {4,-10}, {4,-9}, {4,-8}, {4,16}, {4,17}, {4,18}, {4,19}, {4,20}, {5,-9}, {5,-8}, {5,16}, {5,17}, {5,18}, {5,19}, {5,20}, {5,21}, {6,-9}, {6,16}, {6,17}, {6,18}, {6,19}, {6,20}, {6,21}, {6,22}, {7,-9}, {7,16}, {7,17}, {7,18}, {7,19}, {7,20}, {7,21}, {7,22}, {8,16}, {8,17}, {8,18}, {8,19}, {8,20}, {8,21}, {8,22}, {8,23}, {9,-8}, {9,16}, {9,17}, {9,18}, {9,19}, {9,20}, {9,21}, {9,22}, {9,23}, {10,16}, {10,17}, {10,18}, {10,19}, {10,20}, {10,21}, {10,22}, {10,23}, {10,24}, {11,16}, {11,19}, {11,20}, {11,21}, {11,22}, {11,23}, {11,24}, {11,25}, {12,21}, {12,22}, {12,23}, {12,24}, {12,25}, {13,-20}, {13,-19}, {13,-18}, {13,-17}, {13,21}, {13,22}, {13,23}, {13,24}, {13,25}, {13,26}, {14,-21}, {14,-20}, {14,-19}, {14,-18}, {14,-17}, {14,-16}, {14,22}, {14,23}, {14,24}, {14,25}, {14,26}, {15,-22}, {15,-21}, {15,-20}, {15,-19}, {15,-18}, {15,-17}, {15,-16}, {15,22}, {15,23}, {15,24}, {15,25}, {15,26}, {16,-21}, {16,-20}, {16,-19}, {16,-18}, {16,-17}, {16,21}, {16,22}, {16,23}, {16,24}, {16,25}, {17,-22}, {17,-21}, {17,-20}, {17,-19}, {17,21}, {17,22}, {17,23}, {17,24}, {17,25}, {18,-23}, {18,-22}, {18,-21}, {18,-20}, {18,13}, {18,14}, {18,15}, {18,16}, {18,19}, {18,20}, {18,21}, {18,22}, {18,23}, {18,24}, {19,-23}, {19,-22}, {19,-21}, {19,12}, {19,13}, {19,14}, {19,15}, {19,16}, {19,17}, {19,18}, {19,19}, {19,20}, {19,21}, {19,22}, {19,23}, {19,24}, {20,-23}, {20,-22}, {20,-21}, {20,11}, {20,12}, {20,13}, {20,14}, {20,15}, {20,16}, {20,17}, {20,18}, {20,19}, {20,20}, {20,21}, {20,22}, {20,23}, {20,24}, {21,-23}, {21,-22}, {21,10}, {21,11}, {21,12}, {21,13}, {21,14}, {21,15}, {21,16}, {21,17}, {21,18}, {21,19}, {21,20}, {21,21}, {22,-23}, {22,-22}, {22,9}, {22,10}, {22,11}, {22,12}, {22,13}, {22,14}, {22,15}, {22,16}, {23,-23}, {23,-22}, {23,8}, {23,9}, {23,10}, {23,11}, {23,12}, {23,13}, {23,14}, {24,-23}, {24,-22}, {24,-21}, {24,7}, {24,8}, {24,9}, {24,10}, {24,11}, {24,12}, {24,13}, {25,-24}, {25,-23}, {25,-22}, {25,-21}, {25,-9}, {25,-8}, {25,-7}, {25,-6}, {25,-5}, {25,-4}, {25,-3}, {25,-2}, {25,-1}, {25,0}, {25,7}, {25,8}, {25,9}, {25,10}, {25,11}, {26,-23}, {26,-22}, {26,-21}, {26,-20}, {26,-10}, {26,-9}, {26,-8}, {26,-7}, {26,-6}, {26,-5}, {26,-4}, {26,-3}, {26,-2}, {26,-1}, {26,8}, {26,9}, {26,10}, {27,-23}, {27,-22}, {27,-21}, {27,-20}, {27,-19}, {27,-11}, {27,-10}, {27,-9}, {27,-8}, {27,-7}, {27,-6}, {27,-5}, {27,-4}, {27,-3}, {27,-2}, {27,-1}, {27,8}, {27,9}, {27,10}, {28,-22}, {28,-21}, {28,-20}, {28,-19}, {28,-18}, {28,-17}, {28,-13}, {28,-12}, {28,-11}, {28,-10}, {28,-9}, {28,-8}, {28,-7}, {28,-6}, {28,-5}, {28,-4}, {28,-3}, {28,-2}, {28,-1}, {28,0}, {28,7}, {28,8}, {28,9}, {28,10}, {29,-21}, {29,-20}, {29,-19}, {29,-18}, {29,-17}, {29,-16}, {29,-15}, {29,-14}, {29,-13}, {29,-12}, {29,-11}, {29,-10}, {29,-9}, {29,-8}, {29,-7}, {29,-6}, {29,-5}, {29,-4}, {29,-3}, {29,-2}, {29,-1}, {29,0}, {29,7}, {29,8}, {29,9}, {29,10}, {30,-20}, {30,-19}, {30,-18}, {30,-17}, {30,-16}, {30,-15}, {30,-14}, {30,-13}, {30,-12}, {30,-11}, {30,-10}, {30,-9}, {30,-8}, {30,-7}, {30,-6}, {30,-5}, {30,-4}, {30,-3}, {30,-2}, {30,-1}, {30,0}, {30,1}, {30,2}, {30,5}, {30,6}, {30,7}, {30,8}, {30,9}, {30,10}, {30,11}, {31,-17}, {31,-16}, {31,-12}, {31,-11}, {31,-10}, {31,-9}, {31,-8}, {31,-7}, {31,-6}, {31,-5}, {31,-4}, {31,-3}, {31,-2}, {31,-1}, {31,0}, {31,1}, {31,2}, {31,3}, {31,4}, {31,5}, {31,6}, {31,7}, {31,8}, {32,-10}, {32,-9}, {32,-2}, {32,-1}, {32,0}, {32,1}, {32,2}, {32,3}, {32,4}, {32,5}, {32,6}, + {-3,-10}, {-3,-9}, {-3,-8}, {-2,-8}, + }, + ["refined-concrete"] = {{-29,5}, {-29,6}, {-29,7}, {-29,8}, {-29,9}, {-28,3}, {-28,4}, {-28,5}, {-28,6}, {-28,7}, {-28,8}, {-28,9}, {-28,10}, {-28,11}, {-27,1}, {-27,2}, {-27,3}, {-27,4}, {-27,5}, {-27,6}, {-27,7}, {-27,8}, {-27,9}, {-27,10}, {-27,11}, {-27,12}, {-27,13}, {-26,1}, {-26,2}, {-26,3}, {-26,4}, {-26,5}, {-26,6}, {-26,7}, {-26,8}, {-26,9}, {-26,10}, {-26,11}, {-26,12}, {-26,13}, {-25,0}, {-25,1}, {-25,2}, {-25,3}, {-25,4}, {-25,5}, {-25,6}, {-25,7}, {-25,8}, {-25,9}, {-25,10}, {-25,11}, {-25,12}, {-25,13}, {-25,14}, {-24,0}, {-24,1}, {-24,2}, {-24,3}, {-24,4}, {-24,5}, {-24,6}, {-24,7}, {-24,8}, {-24,9}, {-24,10}, {-24,11}, {-24,12}, {-24,13}, {-24,14}, {-23,-1}, {-23,0}, {-23,1}, {-23,2}, {-23,3}, {-23,4}, {-23,5}, {-23,6}, {-23,7}, {-23,8}, {-23,9}, {-23,10}, {-23,11}, {-23,12}, {-23,13}, {-23,14}, {-23,15}, {-22,-1}, {-22,0}, {-22,1}, {-22,2}, {-22,3}, {-22,4}, {-22,5}, {-22,6}, {-22,7}, {-22,8}, {-22,9}, {-22,10}, {-22,11}, {-22,12}, {-22,13}, {-22,14}, {-22,15}, {-21,-1}, {-21,0}, {-21,1}, {-21,2}, {-21,3}, {-21,4}, {-21,5}, {-21,6}, {-21,7}, {-21,8}, {-21,9}, {-21,10}, {-21,11}, {-21,12}, {-21,13}, {-21,14}, {-21,15}, {-20,-1}, {-20,0}, {-20,1}, {-20,2}, {-20,3}, {-20,4}, {-20,5}, {-20,6}, {-20,7}, {-20,8}, {-20,9}, {-20,10}, {-20,11}, {-20,12}, {-20,13}, {-20,14}, {-20,15}, {-19,-1}, {-19,0}, {-19,1}, {-19,2}, {-19,3}, {-19,4}, {-19,5}, {-19,6}, {-19,7}, {-19,8}, {-19,9}, {-19,10}, {-19,11}, {-19,12}, {-19,13}, {-19,14}, {-18,0}, {-18,1}, {-18,2}, {-18,3}, {-18,4}, {-18,5}, {-18,6}, {-18,7}, {-18,8}, {-18,9}, {-18,10}, {-18,11}, {-18,12}, {-18,13}, {-18,14}, {-17,0}, {-17,1}, {-17,2}, {-17,3}, {-17,4}, {-17,5}, {-17,6}, {-17,7}, {-17,8}, {-17,9}, {-17,10}, {-17,11}, {-17,12}, {-17,13}, {-17,14}, {-16,1}, {-16,2}, {-16,3}, {-16,4}, {-16,5}, {-16,6}, {-16,7}, {-16,8}, {-16,9}, {-16,10}, {-16,11}, {-16,12}, {-16,13}, {-15,12}, {-15,13}, {-13,-13}, {-13,-12}, {-13,-11}, {-12,-15}, {-12,-14}, {-12,-13}, {-12,-12}, {-12,-11}, {-12,-10}, {-12,-9}, {-11,-15}, {-11,-14}, {-11,-13}, {-11,-12}, {-11,-11}, {-11,-10}, {-11,-9}, {-10,-16}, {-10,-15}, {-10,-14}, {-10,-13}, {-10,-12}, {-10,-11}, {-10,-10}, {-10,-9}, {-9,-16}, {-9,-15}, {-9,-14}, {-9,-13}, {-9,-12}, {-9,-11}, {-9,-10}, {-9,-9}, {-9,-8}, {-8,-16}, {-8,-15}, {-8,-14}, {-8,-13}, {-8,-12}, {-8,-11}, {-8,-10}, {-8,-9}, {-7,-15}, {-7,-14}, {-7,-13}, {-7,-12}, {-7,-11}, {-7,-10}, {-7,-9}, {-7,13}, {-7,14}, {-7,15}, {-7,16}, {-7,17}, {-6,-15}, {-6,-14}, {-6,-13}, {-6,-12}, {-6,-11}, {-6,-10}, {-6,-9}, {-6,12}, {-6,13}, {-6,14}, {-6,15}, {-6,16}, {-6,17}, {-5,-13}, {-5,-12}, {-5,-11}, {-5,12}, {-5,13}, {-5,14}, {-5,15}, {-5,16}, {-5,17}, {-4,12}, {-4,13}, {-4,14}, {-4,15}, {-4,16}, {-4,17}, {-3,12}, {-3,13}, {-3,14}, {-3,15}, {-3,16}, {-3,17}, {-2,12}, {-2,13}, {-2,14}, {-2,15}, {-2,16}, {-2,17}, {-1,12}, {-1,13}, {-1,14}, {-1,15}, {-1,16}, {-1,17}, {0,12}, {0,13}, {0,14}, {0,15}, {0,16}, {0,17}, {1,12}, {1,13}, {1,14}, {1,15}, {1,16}, {1,17}, {2,12}, {2,13}, {2,14}, {2,15}, {2,16}, {2,17}, {4,-7}, {4,-6}, {4,-5}, {4,-4}, {4,-3}, {4,-2}, {4,-1}, {5,-7}, {5,-6}, {5,-5}, {5,-4}, {5,-3}, {5,-2}, {5,-1}, {6,-8}, {6,-7}, {6,-6}, {6,-5}, {6,-4}, {6,-3}, {6,-2}, {6,-1}, {6,0}, {7,-8}, {7,-7}, {7,-6}, {7,-5}, {7,-4}, {7,-3}, {7,-2}, {7,-1}, {7,0}, {8,-8}, {8,-7}, {8,-6}, {8,-5}, {8,-4}, {8,-3}, {8,-2}, {8,-1}, {8,0}, {9,-7}, {9,-6}, {9,-5}, {9,-4}, {9,-3}, {9,-2}, {9,-1}, {10,-7}, {10,-6}, {10,-5}, {10,-4}, {10,-3}, {10,-2}, {10,-1}, {11,-5}, {11,-4}, {11,-3}, {11,17}, {11,18}, {12,15}, {12,16}, {12,17}, {12,18}, {12,19}, {12,20}, {13,15}, {13,16}, {13,17}, {13,18}, {13,19}, {13,20}, {14,15}, {14,16}, {14,17}, {14,18}, {14,19}, {14,20}, {14,21}, {15,15}, {15,16}, {15,17}, {15,18}, {15,19}, {15,20}, {15,21}, {16,-16}, {16,-15}, {16,-14}, {16,15}, {16,16}, {16,17}, {16,18}, {16,19}, {16,20}, {17,-18}, {17,-17}, {17,-16}, {17,-15}, {17,-14}, {17,-13}, {17,-12}, {17,15}, {17,16}, {17,17}, {17,18}, {17,19}, {17,20}, {18,-19}, {18,-18}, {18,-17}, {18,-16}, {18,-15}, {18,-14}, {18,-13}, {18,-12}, {18,-11}, {18,17}, {18,18}, {19,-20}, {19,-19}, {19,-18}, {19,-17}, {19,-16}, {19,-15}, {19,-14}, {19,-13}, {19,-12}, {19,-11}, {19,-10}, {20,-20}, {20,-19}, {20,-18}, {20,-17}, {20,-16}, {20,-15}, {20,-14}, {20,-13}, {20,-12}, {20,-11}, {20,-10}, {21,-21}, {21,-20}, {21,-19}, {21,-18}, {21,-17}, {21,-16}, {21,-15}, {21,-14}, {21,-13}, {21,-12}, {21,-11}, {21,-10}, {22,-21}, {22,-20}, {22,-19}, {22,-18}, {22,-17}, {22,-16}, {22,-15}, {22,-14}, {22,-13}, {22,-12}, {22,-11}, {22,-10}, {23,-21}, {23,-20}, {23,-19}, {23,-18}, {23,-17}, {23,-16}, {23,-15}, {23,-14}, {23,-13}, {23,-12}, {23,-11}, {23,-10}, {24,-20}, {24,-19}, {24,-18}, {24,-17}, {24,-16}, {24,-15}, {24,-14}, {24,-13}, {24,-12}, {24,-11}, {24,-10}, {24,1}, {24,2}, {24,3}, {24,4}, {24,5}, {24,6}, {25,-20}, {25,-19}, {25,-18}, {25,-17}, {25,-16}, {25,-15}, {25,-14}, {25,-13}, {25,-12}, {25,-11}, {25,-10}, {25,1}, {25,2}, {25,3}, {25,4}, {25,5}, {25,6}, {26,-19}, {26,-18}, {26,-17}, {26,-16}, {26,-15}, {26,-14}, {26,-13}, {26,-12}, {26,-11}, {26,0}, {26,1}, {26,2}, {26,3}, {26,4}, {26,5}, {26,6}, {26,7}, {27,-18}, {27,-17}, {27,-16}, {27,-15}, {27,-14}, {27,-13}, {27,-12}, {27,0}, {27,1}, {27,2}, {27,3}, {27,4}, {27,5}, {27,6}, {27,7}, {28,-16}, {28,-15}, {28,-14}, {28,1}, {28,2}, {28,3}, {28,4}, {28,5}, {28,6}, {29,1}, {29,2}, {29,3}, {29,4}, {29,5}, {29,6}, {30,3}, {30,4}, }, + ["vegetation-green-grass-1"] = {{-19,-2}, {-18,-2}, {-8,14}, {-2,-21}, {0,-19}, {1,-26}, {8,-24}, {10,-9}, {11,-6}, {15,-14}, {17,-11}, {18,-10}, {18,-9}, {18,-6}, }, + ["concrete"] = {{-18,-1}, {-17,-2}, {-17,-1}, {-16,-3}, {-16,-2}, {-16,-1}, {-16,0}, {-15,-4}, {-15,-3}, {-15,-1}, {-15,0}, {-15,1}, {-15,2}, {-15,3}, {-15,4}, {-15,5}, {-15,6}, {-15,7}, {-15,8}, {-15,9}, {-15,10}, {-15,11}, {-14,-5}, {-14,-4}, {-14,-3}, {-14,-2}, {-14,-1}, {-14,12}, {-14,13}, {-13,-6}, {-13,-5}, {-13,-4}, {-13,-3}, {-13,-2}, {-13,2}, {-13,12}, {-13,13}, {-12,-8}, {-12,-7}, {-12,-6}, {-12,-5}, {-12,-4}, {-12,-3}, {-12,12}, {-12,13}, {-11,-8}, {-11,-7}, {-11,-6}, {-11,-5}, {-11,-4}, {-11,12}, {-11,13}, {-10,-8}, {-10,-7}, {-10,-6}, {-10,-5}, {-10,12}, {-10,13}, {-9,12}, {-9,13}, {-8,-8}, {-8,-7}, {-8,-6}, {-8,-5}, {-8,12}, {-8,13}, {-7,-7}, {-7,-6}, {-7,-5}, {-6,-7}, {-6,-6}, {-5,-7}, {-5,-6}, {-4,-7}, {-4,-6}, {-3,-7}, {-3,-6}, {-2,-7}, {-2,-6}, {-2,-2}, {-2,-1}, {-2,0}, {-2,1}, {-2,2}, {-2,3}, {-2,7}, {-2,8}, {-2,9}, {-2,10}, {-2,11}, {-1,-7}, {-1,-6}, {-1,-2}, {-1,-1}, {-1,0}, {-1,1}, {-1,2}, {-1,3}, {-1,7}, {-1,8}, {-1,9}, {-1,10}, {-1,11}, {0,-7}, {0,-6}, {0,-2}, {0,-1}, {1,-7}, {1,-6}, {1,-2}, {1,-1}, {2,-7}, {2,-6}, {2,-2}, {2,-1}, {3,-7}, {3,-6}, {3,-2}, {3,-1}, {3,14}, {4,14}, {5,14}, {6,14}, {7,14}, {8,14}, {9,14}, {10,14}, {11,-2}, {11,14}, {12,-4}, {12,-3}, {12,-2}, {12,12}, {12,13}, {12,14}, {13,-4}, {13,-3}, {13,-2}, {13,12}, {13,13}, {13,14}, {16,12}, {16,13}, {16,14}, {17,-4}, {17,-3}, {17,-2}, {17,11}, {17,12}, {17,13}, {17,14}, {18,-4}, {18,-3}, {18,-2}, {18,10}, {18,11}, {18,12}, {19,-9}, {19,-8}, {19,-7}, {19,-6}, {19,-5}, {19,-4}, {19,-3}, {19,-2}, {19,9}, {19,10}, {19,11}, {20,-9}, {20,-8}, {20,-7}, {20,-6}, {20,-5}, {20,-4}, {20,-3}, {20,-2}, {20,8}, {20,9}, {20,10}, {21,7}, {21,8}, {21,9}, {22,6}, {22,7}, {22,8}, {23,-9}, {23,-8}, {23,-7}, {23,-6}, {23,-5}, {23,-4}, {23,-3}, {23,-2}, {23,-1}, {23,0}, {23,1}, {23,2}, {23,5}, {23,6}, {23,7}, {24,-9}, {24,-8}, {24,-7}, {24,-6}, {24,-5}, {24,-4}, {24,-3}, {24,-2}, {24,-1}, {24,0}, }, + ["black-refined-concrete"] = {{-15,-2}, {-14,0}, {-14,1}, {-14,2}, {-14,3}, {-14,4}, {-14,5}, {-14,6}, {-14,7}, {-14,8}, {-14,9}, {-14,10}, {-14,11}, {-13,-1}, {-13,0}, {-13,1}, {-13,3}, {-13,4}, {-13,5}, {-13,6}, {-13,7}, {-13,8}, {-13,9}, {-13,10}, {-13,11}, {-12,-2}, {-12,-1}, {-12,0}, {-12,1}, {-12,2}, {-12,3}, {-12,4}, {-12,5}, {-12,6}, {-12,7}, {-12,8}, {-12,9}, {-12,10}, {-12,11}, {-11,-3}, {-11,-2}, {-11,-1}, {-11,0}, {-11,1}, {-11,2}, {-11,3}, {-11,4}, {-11,5}, {-11,6}, {-11,7}, {-11,8}, {-11,9}, {-11,10}, {-11,11}, {-10,-4}, {-10,-3}, {-10,-2}, {-10,-1}, {-10,0}, {-10,1}, {-10,2}, {-10,3}, {-10,4}, {-10,5}, {-10,6}, {-10,7}, {-10,8}, {-10,9}, {-10,10}, {-10,11}, {-9,-7}, {-9,-6}, {-9,-5}, {-9,-4}, {-9,-3}, {-9,-2}, {-9,-1}, {-9,0}, {-9,1}, {-9,2}, {-9,3}, {-9,4}, {-9,5}, {-9,6}, {-9,7}, {-9,8}, {-9,9}, {-9,10}, {-9,11}, {-8,-4}, {-8,-3}, {-8,-2}, {-8,-1}, {-8,0}, {-8,1}, {-8,2}, {-8,3}, {-8,4}, {-8,5}, {-8,6}, {-8,7}, {-8,8}, {-8,9}, {-8,10}, {-8,11}, {-7,-8}, {-7,-4}, {-7,-3}, {-7,-2}, {-7,-1}, {-7,0}, {-7,1}, {-7,2}, {-7,3}, {-7,4}, {-7,5}, {-7,6}, {-7,7}, {-7,8}, {-7,9}, {-7,10}, {-7,11}, {-7,12}, {-6,-5}, {-6,-4}, {-6,-3}, {-6,-2}, {-6,-1}, {-6,0}, {-6,1}, {-6,2}, {-6,3}, {-6,4}, {-6,5}, {-6,6}, {-6,7}, {-6,8}, {-6,9}, {-6,10}, {-6,11}, {-5,-5}, {-5,-4}, {-5,-3}, {-5,-2}, {-5,-1}, {-5,0}, {-5,1}, {-5,2}, {-5,3}, {-5,4}, {-5,5}, {-5,6}, {-5,7}, {-5,8}, {-5,9}, {-5,10}, {-5,11}, {-4,-5}, {-4,-4}, {-4,-3}, {-4,-2}, {-4,-1}, {-4,0}, {-4,1}, {-4,2}, {-4,3}, {-4,4}, {-4,5}, {-4,6}, {-4,7}, {-4,8}, {-4,9}, {-4,10}, {-4,11}, {-3,-5}, {-3,-4}, {-3,-3}, {-3,-2}, {-3,-1}, {-3,0}, {-3,1}, {-3,2}, {-3,3}, {-3,4}, {-3,5}, {-3,6}, {-3,7}, {-3,8}, {-3,9}, {-3,10}, {-3,11}, {-2,-5}, {-2,-4}, {-2,-3}, {-1,-5}, {-1,-4}, {-1,-3}, {0,-5}, {0,-4}, {0,-3}, {1,-5}, {1,-4}, {1,-3}, {2,-5}, {2,-4}, {2,-3}, {3,-5}, {3,-4}, {3,-3}, }, + ["mineral-dustyrose-dirt-3"] = {{-7,-27}, {-6,-26}, {-6,-25}, {-5,-26}, {-5,-25}, {-5,-24}, {-4,-25}, {-4,-24}, {-3,-24}, {-3,-23}, {-2,-25}, {-2,-24}, {-2,-23}, {-2,-22}, {-1,-25}, {-1,-24}, {-1,-23}, {-1,-22}, {-1,-21}, {-1,4}, {-1,5}, {-1,6}, {0,-24}, {0,-23}, {0,-22}, {0,-21}, {0,4}, {0,5}, {0,6}, {1,-24}, {1,-23}, {1,-22}, {1,-21}, {1,-20}, {1,4}, {1,5}, {1,6}, {2,-26}, {2,-25}, {2,-24}, {2,-21}, {2,-20}, {2,-19}, {2,4}, {2,5}, {2,6}, {3,-26}, {3,-25}, {3,-23}, {3,-22}, {3,-21}, {3,-20}, {3,-19}, {3,-18}, {3,4}, {3,5}, {4,-27}, {4,-26}, {4,-25}, {4,-24}, {4,-23}, {4,-22}, {4,-21}, {4,-20}, {4,-19}, {4,-18}, {4,-17}, {4,4}, {4,5}, {4,6}, {5,-28}, {5,-27}, {5,-26}, {5,-25}, {5,-24}, {5,-23}, {5,-22}, {5,-21}, {5,-20}, {5,-19}, {5,-18}, {5,-17}, {5,-16}, {5,4}, {5,5}, {5,6}, {6,-18}, {6,-17}, {6,-16}, {6,-15}, {6,4}, {6,5}, {6,6}, {7,-17}, {7,-16}, {7,-15}, {7,-14}, {7,4}, {7,5}, {7,6}, {8,-16}, {8,-15}, {8,-14}, {8,-13}, {8,5}, {8,6}, {9,-16}, {9,-15}, {9,-14}, {9,-13}, {9,5}, {9,6}, {10,-15}, {10,-14}, {10,-13}, {10,-12}, {10,5}, {10,6}, {11,-15}, {11,-14}, {11,-13}, {11,-12}, {11,-11}, {11,5}, {11,6}, {12,-14}, {12,-13}, {12,-12}, {12,-11}, {12,4}, {12,5}, {12,6}, {13,-13}, {13,-12}, {13,-11}, {13,-10}, {13,-9}, {13,-8}, {13,-7}, {13,4}, {13,5}, {13,6}, {14,-12}, {14,-11}, {14,-10}, {14,-9}, {14,-8}, {14,-7}, {14,-6}, {14,-4}, {14,-3}, {14,-2}, {14,-1}, {14,0}, {14,1}, {14,2}, {14,3}, {14,4}, {14,5}, {14,6}, {15,-11}, {15,-10}, {15,-9}, {15,-8}, {15,-7}, {15,-6}, {15,-5}, {15,-4}, {15,-3}, {15,-2}, {15,-1}, {15,0}, {15,1}, {15,2}, {15,3}, {15,4}, {15,5}, {15,6}, {16,-7}, {16,-6}, {16,-5}, {16,-4}, {16,-3}, {16,-2}, {16,-1}, {16,0}, {16,1}, {16,2}, {16,3}, {16,4}, {16,5}, }, + ["landfill"] = {{-6,-8}, {-5,-10}, {-5,-9}, {-5,-8}, {-4,-10}, {-4,-9}, {-4,-8}, }, + ["mineral-dustyrose-dirt-2"] = {{-2,4}, {-2,5}, {-2,6}, {3,6}, {8,4}, {9,4}, {10,4}, {11,4},{12,-5},{13,3}, {14,-5},}, + ["stone-path"] = {{0,0}, {0,1}, {0,2}, {0,3}, {0,7}, {0,8}, {0,9}, {0,10}, {0,11}, {1,0}, {1,1}, {1,2}, {1,3}, {1,7}, {1,8}, {1,9}, {1,10}, {1,11}, {2,0}, {2,1}, {2,2}, {2,3}, {2,7}, {2,8}, {2,9}, {2,10}, {2,11}, {3,0}, {3,1}, {3,2}, {3,3}, {3,7}, {3,8}, {3,9}, {3,10}, {3,11}, {3,12}, {3,13}, {3,15}, {4,0}, {4,1}, {4,2}, {4,3}, {4,7}, {4,8}, {4,9}, {4,10}, {4,11}, {4,12}, {4,13}, {4,15}, {5,0}, {5,1}, {5,2}, {5,3}, {5,7}, {5,8}, {5,9}, {5,10}, {5,11}, {5,12}, {5,13}, {5,15}, {6,1}, {6,2}, {6,3}, {6,7}, {6,8}, {6,9}, {6,10}, {6,11}, {6,12}, {6,13}, {6,15}, {7,1}, {7,2}, {7,3}, {7,7}, {7,8}, {7,9}, {7,10}, {7,11}, {7,12}, {7,13}, {7,15}, {8,1}, {8,2}, {8,3}, {8,7}, {8,8}, {8,9}, {8,10}, {8,11}, {8,12}, {8,13}, {8,15}, {9,0}, {9,1}, {9,2}, {9,3}, {9,7}, {9,8}, {9,9}, {9,10}, {9,11}, {9,12}, {9,13}, {9,15}, {10,0}, {10,1}, {10,2}, {10,3}, {10,7}, {10,8}, {10,9}, {10,10}, {10,11}, {10,12}, {10,13}, {10,15}, {11,-1}, {11,0}, {11,1}, {11,2}, {11,3}, {11,7}, {11,8}, {11,9}, {11,10}, {11,11}, {11,12}, {11,13}, {11,15}, {12,-1}, {12,0}, {12,1}, {12,2}, {12,3}, {12,7}, {12,8}, {12,9}, {12,10}, {12,11}, {13,-5}, {13,-1}, {13,0}, {13,1}, {13,2}, {13,7}, {13,8}, {13,9}, {13,10}, {13,11}, {14,7}, {14,8}, {14,9}, {14,10}, {14,11}, {14,12}, {14,13}, {14,14}, {15,7}, {15,8}, {15,9}, {15,10}, {15,11}, {15,12}, {15,13}, {15,14}, {16,6}, {16,7}, {16,8}, {16,9}, {16,10}, {16,11}, {17,-5}, {17,-1}, {17,0}, {17,1}, {17,2}, {17,3}, {17,4}, {17,5}, {17,6}, {17,7}, {17,8}, {17,9}, {17,10}, {18,-5}, {18,-1}, {18,0}, {18,1}, {18,2}, {18,3}, {18,4}, {18,5}, {18,6}, {18,7}, {18,8}, {18,9}, {19,-1}, {19,0}, {19,1}, {19,2}, {19,3}, {19,4}, {19,5}, {19,6}, {19,7}, {19,8}, {20,-1}, {20,0}, {20,1}, {20,2}, {20,3}, {20,4}, {20,5}, {20,6}, {20,7}, {21,-9}, {21,-8}, {21,-7}, {21,-6}, {21,-5}, {21,-4}, {21,-3}, {21,-2}, {21,-1}, {21,0}, {21,1}, {21,2}, {21,3}, {21,4}, {21,5}, {21,6}, {22,-9}, {22,-8}, {22,-7}, {22,-6}, {22,-5}, {22,-4}, {22,-3}, {22,-2}, {22,-1}, {22,0}, {22,1}, {22,2}, {22,3}, {22,4}, {22,5}, {23,3}, {23,4}, }, + }, + under_tiles = { + ["mineral-beige-dirt-4"] = {{-30,5}, {-30,6}, {-30,7}, {-30,8}, {-30,9}, {-29,5}, {-29,6}, {-29,7}, {-29,8}, {-29,9}, {-28,3}, {-28,4}, {-28,5}, {-28,6}, {-28,7}, {-28,8}, {-28,9}, {-28,10}, {-28,11}, {-27,1}, {-27,2}, {-27,3}, {-27,4}, {-27,5}, {-27,6}, {-27,7}, {-27,8}, {-27,9}, {-27,10}, {-27,11}, {-27,12}, {-27,13}, {-26,1}, {-26,2}, {-26,3}, {-26,4}, {-26,5}, {-26,6}, {-26,7}, {-26,8}, {-26,9}, {-26,10}, {-26,11}, {-26,12}, {-26,13}, {-25,0}, {-25,1}, {-25,2}, {-25,3}, {-25,4}, {-25,5}, {-25,6}, {-25,7}, {-25,8}, {-25,9}, {-25,10}, {-25,11}, {-25,12}, {-25,13}, {-25,14}, {-24,0}, {-24,1}, {-24,2}, {-24,3}, {-24,4}, {-24,5}, {-24,6}, {-24,7}, {-24,8}, {-24,9}, {-24,10}, {-24,11}, {-24,12}, {-24,13}, {-24,14}, {-23,-1}, {-23,0}, {-23,1}, {-23,2}, {-23,3}, {-23,4}, {-23,5}, {-23,6}, {-23,7}, {-23,8}, {-23,9}, {-23,10}, {-23,11}, {-23,12}, {-23,13}, {-23,14}, {-23,15}, {-22,-1}, {-22,0}, {-22,1}, {-22,2}, {-22,3}, {-22,4}, {-22,5}, {-22,6}, {-22,7}, {-22,8}, {-22,9}, {-22,10}, {-22,11}, {-22,12}, {-22,13}, {-22,14}, {-22,15}, {-21,-1}, {-21,0}, {-21,1}, {-21,2}, {-21,3}, {-21,4}, {-21,5}, {-21,6}, {-21,7}, {-21,8}, {-21,9}, {-21,10}, {-21,11}, {-21,12}, {-21,13}, {-21,14}, {-21,15}, {-20,-1}, {-20,0}, {-20,1}, {-20,2}, {-20,3}, {-20,4}, {-20,5}, {-20,6}, {-20,7}, {-20,8}, {-20,9}, {-20,10}, {-20,11}, {-20,12}, {-20,13}, {-20,14}, {-20,15}, {-19,-1}, {-19,0}, {-19,1}, {-19,2}, {-19,3}, {-19,4}, {-19,5}, {-19,6}, {-19,7}, {-19,8}, {-19,9}, {-19,10}, {-19,11}, {-19,12}, {-19,13}, {-19,14}, {-18,2}, {-18,3}, {-18,4}, {-18,5}, {-18,6}, {-18,7}, {-18,8}, {-18,9}, {-18,10}, {-18,11}, {-18,12}, {-18,13}, {-18,14}, {-17,9}, {-17,10}, {-17,11}, {-17,12}, {-17,13}, {-17,14}, {-16,11}, {-16,12}, {-16,13}, {-15,12}, {-15,13}, {-14,0}, {-13,-13}, {-13,-11}, {-13,-1}, {-13,0}, {-13,1}, {-12,-15}, {-12,-9}, {-12,-8}, {-12,-2}, {-12,-1}, {-12,0}, {-12,1}, {-12,2}, {-12,3}, {-12,4}, {-12,5}, {-12,6}, {-12,7}, {-12,8}, {-12,9}, {-12,10}, {-11,-3}, {-11,-2}, {-11,-1}, {-11,0}, {-11,1}, {-11,2}, {-11,3}, {-11,4}, {-11,5}, {-11,6}, {-11,7}, {-11,8}, {-11,9}, {-11,10}, {-11,14}, {-10,-16}, {-10,-3}, {-10,-2}, {-10,-1}, {-10,0}, {-10,1}, {-10,2}, {-10,3}, {-10,4}, {-10,5}, {-10,6}, {-10,7}, {-10,8}, {-10,9}, {-10,10}, {-10,14}, {-9,-7}, {-9,-6}, {-9,-5}, {-9,-4}, {-9,-3}, {-9,-2}, {-9,-1}, {-9,0}, {-9,1}, {-9,2}, {-9,3}, {-9,4}, {-9,5}, {-9,6}, {-9,7}, {-9,8}, {-9,9}, {-9,10}, {-9,14}, {-8,-16}, {-8,-3}, {-8,-2}, {-8,-1}, {-8,0}, {-8,1}, {-8,2}, {-8,3}, {-8,4}, {-8,5}, {-8,6}, {-8,7}, {-8,8}, {-8,9}, {-8,10}, {-7,-3}, {-7,-2}, {-7,-1}, {-7,0}, {-7,1}, {-7,2}, {-7,3}, {-7,4}, {-7,5}, {-7,6}, {-7,7}, {-7,8}, {-7,9}, {-7,10}, {-7,12}, {-7,13}, {-7,14}, {-7,15}, {-7,16}, {-7,17}, {-6,-15}, {-6,-8}, {-6,-3}, {-6,-2}, {-6,-1}, {-6,0}, {-6,1}, {-6,2}, {-6,3}, {-6,4}, {-6,5}, {-6,6}, {-6,7}, {-6,8}, {-6,9}, {-6,10}, {-6,15}, {-6,16}, {-6,17}, {-5,-15}, {-5,-14}, {-5,-13}, {-5,-11}, {-5,-3}, {-5,-2}, {-5,-1}, {-5,0}, {-5,1}, {-5,2}, {-5,3}, {-5,4}, {-5,5}, {-5,6}, {-5,7}, {-5,8}, {-5,9}, {-5,10}, {-5,15}, {-5,16}, {-5,17}, {-4,-15}, {-4,-14}, {-4,-13}, {-4,-12}, {-4,-11}, {-4,-10}, {-4,-9}, {-4,-3}, {-4,-2}, {-4,-1}, {-4,0}, {-4,1}, {-4,2}, {-4,3}, {-4,4}, {-4,5}, {-4,6}, {-4,7}, {-4,8}, {-4,9}, {-4,14}, {-4,15}, {-4,16}, {-4,17}, {-3,-15}, {-3,-14}, {-3,-13}, {-3,-12}, {-3,-11}, {-3,-10}, {-3,-9}, {-3,-3}, {-3,13}, {-3,14}, {-3,15}, {-3,16}, {-3,17}, {-2,-14}, {-2,-13}, {-2,-12}, {-2,-11}, {-2,-10}, {-2,-9}, {-2,-8}, {-2,13}, {-2,14}, {-2,15}, {-2,16}, {-2,17}, {-1,-14}, {-1,-13}, {-1,-12}, {-1,-11}, {-1,-10}, {-1,-9}, {-1,-8}, {-1,4}, {-1,5}, {-1,6}, {-1,7}, {-1,8}, {-1,9}, {-1,10}, {-1,11}, {-1,12}, {-1,13}, {-1,14}, {-1,15}, {-1,16}, {-1,17}, {0,-13}, {0,-12}, {0,-11}, {0,-10}, {0,-9}, {0,-8}, {0,4}, {0,5}, {0,6}, {0,7}, {0,8}, {0,9}, {0,10}, {0,11}, {0,12}, {0,13}, {0,14}, {0,15}, {0,16}, {0,17}, {1,-12}, {1,-11}, {1,-10}, {1,-9}, {1,-8}, {1,-3}, {1,2}, {1,4}, {1,5}, {1,6}, {1,7}, {1,8}, {1,9}, {1,10}, {1,11}, {1,12}, {1,13}, {1,14}, {1,15}, {1,16}, {1,17}, {2,-10}, {2,-9}, {2,-8}, {2,1}, {2,2}, {2,3}, {2,4}, {2,5}, {2,6}, {2,7}, {2,8}, {2,9}, {2,10}, {2,11}, {2,12}, {2,13}, {2,14}, {2,15}, {2,16}, {2,17}, {3,-8}, {3,0}, {3,1}, {3,2}, {3,3}, {3,4}, {3,5}, {3,6}, {3,7}, {3,8}, {3,9}, {3,10}, {3,11}, {3,12}, {3,13}, {3,14}, {3,15}, {3,16}, {4,-7}, {4,-1}, {4,0}, {4,1}, {4,2}, {4,3}, {4,4}, {4,5}, {4,6}, {4,7}, {4,8}, {4,9}, {4,10}, {4,11}, {4,12}, {4,13}, {4,14}, {4,15}, {4,16}, {5,-3}, {5,-2}, {5,-1}, {5,0}, {5,1}, {5,2}, {5,3}, {5,4}, {5,5}, {5,6}, {5,7}, {5,8}, {5,9}, {5,10}, {5,11}, {5,12}, {5,13}, {5,14}, {5,15}, {5,16}, {6,-8}, {6,-7}, {6,-6}, {6,-5}, {6,-4}, {6,-3}, {6,-2}, {6,-1}, {6,0}, {6,1}, {6,2}, {6,3}, {6,4}, {6,5}, {6,6}, {6,7}, {6,8}, {6,9}, {6,10}, {6,11}, {6,12}, {6,13}, {6,14}, {6,15}, {6,16}, {7,-8}, {7,-7}, {7,-6}, {7,-5}, {7,-4}, {7,-3}, {7,-2}, {7,-1}, {7,0}, {7,1}, {7,2}, {7,3}, {7,4}, {7,5}, {7,6}, {7,7}, {7,8}, {7,9}, {7,10}, {7,11}, {7,12}, {7,13}, {7,14}, {7,15}, {7,16}, {8,-8}, {8,-7}, {8,-6}, {8,-5}, {8,-4}, {8,-3}, {8,-2}, {8,-1}, {8,0}, {8,1}, {8,2}, {8,3}, {8,4}, {8,5}, {8,6}, {8,7}, {8,8}, {8,9}, {8,10}, {8,11}, {8,12}, {8,13}, {8,14}, {8,15}, {8,16}, {9,-7}, {9,-6}, {9,-5}, {9,-4}, {9,-3}, {9,-2}, {9,-1}, {9,0}, {9,1}, {9,2}, {9,3}, {9,4}, {9,5}, {9,6}, {9,7}, {9,8}, {9,9}, {9,10}, {9,11}, {9,12}, {9,13}, {9,14}, {9,15}, {9,16}, {10,-7}, {10,-6}, {10,-5}, {10,-4}, {10,-3}, {10,-2}, {10,-1}, {10,0}, {10,1}, {10,2}, {10,3}, {10,4}, {10,5}, {10,6}, {10,7}, {10,8}, {10,9}, {10,10}, {10,11}, {10,12}, {10,13}, {10,14}, {10,15}, {10,16}, {11,-5}, {11,-4}, {11,-3}, {11,-2}, {11,-1}, {11,0}, {11,1}, {11,2}, {11,3}, {11,4}, {11,5}, {11,6}, {11,7}, {11,8}, {11,9}, {11,10}, {11,11}, {11,12}, {11,13}, {11,14}, {11,15}, {11,16}, {11,17}, {11,18}, {12,-1}, {12,0}, {12,1}, {12,2}, {12,3}, {12,4}, {12,5}, {12,6}, {12,7}, {12,8}, {12,9}, {12,10}, {12,11}, {12,12}, {12,13}, {12,14}, {12,15}, {12,16}, {12,17}, {12,18}, {12,19}, {12,20}, {13,-1}, {13,0}, {13,1}, {13,2}, {13,3}, {13,4}, {13,5}, {13,6}, {13,7}, {13,8}, {13,9}, {13,10}, {13,11}, {13,12}, {13,13}, {13,14}, {13,15}, {13,16}, {13,17}, {13,18}, {13,19}, {13,20}, {14,-1}, {14,0}, {14,1}, {14,2}, {14,3}, {14,4}, {14,5}, {14,6}, {14,7}, {14,8}, {14,9}, {14,10}, {14,11}, {14,12}, {14,13}, {14,14}, {14,15}, {14,16}, {14,17}, {14,18}, {14,19}, {14,20}, {14,21}, {15,-1}, {15,0}, {15,1}, {15,2}, {15,3}, {15,4}, {15,5}, {15,6}, {15,7}, {15,8}, {15,9}, {15,10}, {15,11}, {15,12}, {15,13}, {15,14}, {15,15}, {15,16}, {15,17}, {15,18}, {15,19}, {15,20}, {15,21}, {16,-16}, {16,-15}, {16,-14}, {16,-1}, {16,0}, {16,1}, {16,2}, {16,3}, {16,4}, {16,5}, {16,6}, {16,7}, {16,8}, {16,9}, {16,10}, {16,11}, {16,12}, {16,13}, {16,14}, {16,15}, {16,16}, {16,17}, {16,18}, {16,19}, {16,20}, {17,-18}, {17,-17}, {17,-16}, {17,-15}, {17,-14}, {17,-13}, {17,-12}, {17,-1}, {17,0}, {17,1}, {17,2}, {17,3}, {17,4}, {17,5}, {17,6}, {17,7}, {17,8}, {17,9}, {17,10}, {17,11}, {17,12}, {17,13}, {17,14}, {17,15}, {17,16}, {17,17}, {17,18}, {17,19}, {17,20}, {18,-19}, {18,-18}, {18,-17}, {18,-16}, {18,-15}, {18,-14}, {18,-13}, {18,-12}, {18,-11}, {18,-1}, {18,0}, {18,1}, {18,2}, {18,3}, {18,4}, {18,5}, {18,6}, {18,7}, {18,8}, {18,9}, {18,10}, {18,11}, {18,12}, {18,17}, {18,18}, {19,-20}, {19,-19}, {19,-18}, {19,-17}, {19,-16}, {19,-15}, {19,-14}, {19,-13}, {19,-12}, {19,-11}, {19,-10}, {19,-9}, {19,-8}, {19,-7}, {19,-6}, {19,-1}, {19,0}, {19,1}, {19,2}, {19,3}, {19,4}, {19,5}, {19,6}, {19,7}, {19,8}, {19,9}, {19,10}, {19,11}, {20,-20}, {20,-19}, {20,-18}, {20,-17}, {20,-16}, {20,-15}, {20,-14}, {20,-13}, {20,-12}, {20,-11}, {20,-10}, {20,-9}, {20,-8}, {20,-7}, {20,-6}, {20,-5}, {20,-4}, {20,-3}, {20,-2}, {20,-1}, {20,0}, {20,1}, {20,2}, {20,3}, {20,4}, {20,5}, {20,6}, {20,7}, {20,8}, {20,9}, {20,10}, {21,-21}, {21,-20}, {21,-19}, {21,-18}, {21,-17}, {21,-16}, {21,-15}, {21,-14}, {21,-13}, {21,-12}, {21,-11}, {21,-10}, {21,-9}, {21,-8}, {21,-7}, {21,-6}, {21,-5}, {21,-4}, {21,-3}, {21,-2}, {21,-1}, {21,0}, {21,1}, {21,2}, {21,3}, {21,4}, {21,5}, {21,6}, {21,7}, {21,8}, {21,9}, {22,-21}, {22,-20}, {22,-19}, {22,-18}, {22,-17}, {22,-16}, {22,-15}, {22,-14}, {22,-13}, {22,-12}, {22,-11}, {22,-10}, {22,-9}, {22,-8}, {22,-7}, {22,-6}, {22,-5}, {22,-4}, {22,-3}, {22,-2}, {22,-1}, {22,0}, {22,1}, {22,2}, {22,3}, {22,4}, {22,5}, {22,6}, {22,7}, {22,8}, {22,9}, {23,-21}, {23,-20}, {23,-19}, {23,-18}, {23,-17}, {23,-16}, {23,-15}, {23,-14}, {23,-13}, {23,-12}, {23,-11}, {23,-10}, {23,-9}, {23,-8}, {23,-7}, {23,-6}, {23,-5}, {23,-4}, {23,-3}, {23,-2}, {23,-1}, {23,0}, {23,1}, {23,2}, {23,3}, {23,4}, {23,5}, {23,6}, {23,7}, {23,8}, {24,-20}, {24,-19}, {24,-18}, {24,-17}, {24,-16}, {24,-15}, {24,-14}, {24,-13}, {24,-12}, {24,-11}, {24,-10}, {24,-9}, {24,-8}, {24,-7}, {24,-6}, {24,-5}, {24,-4}, {24,-3}, {24,-2}, {24,-1}, {24,0}, {24,1}, {24,2}, {24,3}, {24,4}, {24,5}, {24,6}, {24,7}, {24,8}, {25,-20}, {25,-19}, {25,-18}, {25,-17}, {25,-16}, {25,-15}, {25,-14}, {25,-13}, {25,-12}, {25,-11}, {25,-10}, {25,0}, {25,1}, {25,2}, {25,3}, {25,4}, {25,5}, {25,6}, {25,7}, {26,-19}, {26,-18}, {26,-17}, {26,-16}, {26,-15}, {26,-14}, {26,-13}, {26,-12}, {26,-11}, {26,0}, {26,1}, {26,2}, {26,3}, {26,4}, {26,5}, {26,6}, {26,7}, {27,-18}, {27,-17}, {27,-16}, {27,-15}, {27,-14}, {27,-13}, {27,-12}, {27,0}, {27,1}, {27,2}, {27,3}, {27,4}, {27,5}, {27,6}, {27,7}, {28,-16}, {28,-15}, {28,-14}, {28,1}, {28,2}, {28,3}, {28,4}, {28,5}, {28,6}, {29,1}, {29,2}, {29,3}, {29,4}, {29,5}, {29,6}, {30,3}, {30,4}, {-18,-1}, {-18,0}, {-18,1}, {-17,-2}, {-17,-1}, {-17,0}, {-17,1}, {-17,2}, {-17,3}, {-17,4}, {-17,5}, {-17,6}, {-17,7}, {-17,8}, {-16,-3}, {-16,-2}, {-16,-1}, {-16,0}, {-16,1}, {-16,2}, {-16,3}, {-16,4}, {-16,5}, {-16,6}, {-16,7}, {-16,8}, {-16,9}, {-16,10}, {-15,-4}, {-15,-3}, {-15,-1}, {-15,0}, {-15,1}, {-15,2}, {-15,3}, {-15,4}, {-15,5}, {-15,6}, {-15,7}, {-15,8}, {-15,9}, {-15,10}, {-15,11}, {-14,-5}, {-14,-4}, {-14,-3}, {-14,-2}, {-14,-1}, {-14,1}, {-14,2}, {-14,3}, {-14,4}, {-14,5}, {-14,6}, {-14,7}, {-14,8}, {-14,9}, {-14,10}, {-14,11}, {-14,12}, {-13,-6}, {-13,-5}, {-13,-4}, {-13,-3}, {-13,-2}, {-13,2}, {-13,3}, {-13,4}, {-13,5}, {-13,6}, {-13,7}, {-13,8}, {-13,9}, {-13,10}, {-13,11}, {-13,12}, {-12,-7}, {-12,-6}, {-12,-5}, {-12,-4}, {-12,-3}, {-12,11}, {-12,12}, {-11,-8}, {-11,-7}, {-11,-6}, {-11,-5}, {-11,-4}, {-11,11}, {-11,12}, {-10,-8}, {-10,-7}, {-10,-6}, {-10,-5}, {-10,-4}, {-10,11}, {-10,12}, {-9,11}, {-9,12}, {-8,-8}, {-8,-7}, {-8,-6}, {-8,-5}, {-8,-4}, {-8,11}, {-8,12}, {-7,-8}, {-7,-7}, {-7,-6}, {-7,-5}, {-7,-4}, {-7,11}, {-6,-9}, {-6,-7}, {-6,-6}, {-6,-5}, {-6,-4}, {-6,11}, {-6,12}, {-6,13}, {-6,14}, {-5,-10}, {-5,-9}, {-5,-8}, {-5,-7}, {-5,-6}, {-5,-5}, {-5,-4}, {-5,11}, {-5,12}, {-5,13}, {-5,14}, {-4,-8}, {-4,-7}, {-4,-6}, {-4,-5}, {-4,-4}, {-4,11}, {-4,12}, {-4,13}, {-3,-8}, {-3,-7}, {-3,-6}, {-3,-5}, {-3,-4}, {-3,-2}, {-3,-1}, {-3,0}, {-3,1}, {-3,2}, {-3,3}, {-3,4}, {-3,5}, {-3,6}, {-3,7}, {-3,8}, {-3,9}, {-3,10}, {-3,11}, {-3,12}, {-2,-7}, {-2,-6}, {-2,-5}, {-2,-4}, {-2,-3}, {-2,-2}, {-2,-1}, {-2,0}, {-2,1}, {-2,2}, {-2,3}, {-2,4}, {-2,5}, {-2,6}, {-2,7}, {-2,8}, {-2,9}, {-2,10}, {-2,11}, {-2,12}, {-1,-7}, {-1,-6}, {-1,-5}, {-1,-4}, {-1,-3}, {-1,-2}, {-1,-1}, {-1,0}, {-1,1}, {-1,2}, {0,-7}, {0,-6}, {0,-5}, {0,-4}, {0,-3}, {0,-2}, {0,-1}, {0,0}, {0,1}, {0,2}, {1,-7}, {1,-6}, {1,-5}, {1,-4}, {1,-2}, {1,-1}, {1,0}, {1,1}, {2,-7}, {2,-6}, {2,-5}, {2,-4}, {2,-3}, {2,-2}, {2,-1}, {2,0}, {3,-7}, {3,-6}, {3,-5}, {3,-4}, {3,-3}, {3,-2}, {3,-1}, {4,-6}, {4,-5}, {4,-4}, {4,-3}, {4,-2}, {5,-7}, {5,-6}, {5,-5}, {5,-4}, {-14,13}, {-9,13}, {-8,13}, {-13,-12}, {-12,-14}, {-12,-13}, {-12,-12}, {-12,-11}, {-12,-10}, {-11,-15}, {-11,-14}, {-11,-13}, {-11,-12}, {-11,-11}, {-11,-10}, {-11,-9}, {-10,-15}, {-10,-14}, {-10,-13}, {-10,-12}, {-10,-11}, {-10,-10}, {-10,-9}, {-9,-16}, {-9,-15}, {-9,-14}, {-9,-13}, {-9,-12}, {-9,-11}, {-9,-10}, {-9,-9}, {-9,-8}, {-8,-15}, {-8,-14}, {-8,-13}, {-8,-12}, {-8,-11}, {-8,-10}, {-8,-9}, {-7,-15}, {-7,-14}, {-7,-13}, {-7,-12}, {-7,-11}, {-7,-10}, {-7,-9}, {-6,-14}, {-6,-13}, {-6,-12}, {-6,-11}, {-6,-10}, {-5,-12}, {-13,13}, {-12,13}, {-11,13}, {-10,13},{-1,3}, {0,3}, {1,3},{12,-4}, {12,-3}, {12,-2}, {13,-5}, {13,-4}, {13,-3}, {13,-2}, {14,-2}, {15,-2}, {16,-2}, {17,-5}, {17,-4}, {17,-3}, {17,-2}, {18,-5}, {18,-4}, {18,-3}, {18,-2}, {19,-5}, {19,-4}, {19,-3}, {19,-2},}, + }, + blueprint_strings = { + { xadj = 1, yadj = 0, force_override = "conquest", + string = "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" + } + } +} + +return arty40 diff --git a/space-exploration_0.5.58/space-exploration/scripts/ruins/galaxy-ship.lua b/space-exploration_0.5.58/space-exploration/scripts/ruins/galaxy-ship.lua new file mode 100644 index 0000000..7a7b6e2 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/ruins/galaxy-ship.lua @@ -0,0 +1,124 @@ +-- Note: Default entity force will be 'capture', if a player character get near and there are no enemies the player will capture the entity. +local galaxy_ship = { + center = {x = 11, y = 5}, + force_name = "ignore", + insert_list = { + -- list of items to put in chests + -- max, min define the range for number of items + -- odds will only have it appear 1 in odds times + -- max, min, and odds all default to 1 + {x=14, y=2, items={{name = "empty-barrel", max = 100}}}, + {x=16, y=-11, items={{name = "empty-barrel", max = 100}}}, + {x=16, y=2, items={{name = mod_prefix.."contaminated-space-water-barrel", max = 50}}}, + {x=14, y=-11, items={{name = mod_prefix.."chemical-gel-barrel", max = 20}}}, + {x=25, y=-43, items={{name = "uranium-rounds-magazine", max = 50}, + {name = mod_prefix.."thruster-suit"}, + {name = "processed-fuel", max = 200}, + {name = "explosive-uranium-cannon-shell", max = 20}, + {name = mod_prefix.."contaminated-scrap", max = 100}, + }}, + {x=7, y=-27, items={{name = "pistol"}, + {name = "submachine-gun"}, + {name = "uranium-rounds-magazine", max = 50}, + }}, + {x=-1, y=-21, items={{name = "pistol"}, + {name = "submachine-gun"}, + {name = "uranium-rounds-magazine", max = 50}, + }}, + {x=0, y=-21, items={{name = "pistol"}, + {name = "submachine-gun"}, + {name = "uranium-rounds-magazine", max = 50}, + }}, + {x=1, y=-21, items={{name = mod_prefix.."thruster-suit"}}}, + {x=16, y=-21, items={{name = "uranium-rounds-magazine", max = 50}, + {name = mod_prefix.."thruster-suit"}, + {name = "processed-fuel", max = 200}, + {name = mod_prefix.."contaminated-scrap", max = 50}, + }}, + {x=7, y=-27, items={{name = mod_prefix.."thruster-suit"}, + {name = mod_prefix.."naquium-processor", min = 8, max = 8} + }}, + {x=-9.5, y=1.5, items={{name = mod_prefix.."thruster-suit"}}}, + {x=8.5, y=1.5, items={{name = mod_prefix.."thruster-suit"}}}, + {x=-2, y=-13, items={{name = "nuclear-fuel", odds = 3}, + {name = "uranium-ore", max = 50}, + {name = mod_prefix.."contaminated-scrap", max = 50}, + }}, + {x=2, y=-13, items={{name = "nuclear-fuel", odds = 3}, + {name = "uranium-ore", max = 50}, + {name = mod_prefix.."contaminated-scrap", max = 50}, + }}, + {x=6, y=-13, items={{name = "nuclear-fuel", odds = 3}, + {name = "uranium-ore", max = 50}, + {name = mod_prefix.."contaminated-scrap", max = 50}, + }}, + {x=6, y=25, items={{name = "nuclear-fuel", odds = 3}, + {name = "uranium-ore", max = 50}, + {name = mod_prefix.."contaminated-scrap", max = 50}, + }}, + }, + prebuild = function(surface, ruin_position, ruin) + end, + postbuild = function(surface, ruin_position, ruin) + -- fill all chests with scrap, an an occasional emergency space suit + local chests = surface.find_entities_filtered({position = ruin_position, radius = 100, name = { + "logistic-chest-active-provider", + "logistic-chest-buffer", + "logistic-chest-passive-provider", + "logistic-chest-requester", + "logistic-chest-storage", + mod_prefix.."cargo-rocket-cargo-pod", + "cargo-wagon"}}) + for _, chest in pairs(chests) do + chest.insert({name = mod_prefix.."scrap", count = math.random(1,100)}) + if math.random(1,3) == 1 then + chest.insert({name = mod_prefix.."contaminated-scrap", count = math.random(1,50)}) + end + if math.random(1,50) == 1 then + chest.insert({name = mod_prefix.."thruster-suit", count = 1}) + end + end + + --game.print("starting armory chests") + -- fill all armory buffer chests with walls and floors (for bots to fix any damage) + -- fill storage chests with ammo, or broken ammo (uranium ore or contaminated scrap) + + chests = surface.find_entities_filtered({ + position = {x = ruin_position.x, y = ruin_position.y - 40}, + radius = 7, + name = {"logistic-chest-buffer", "logistic-chest-storage"} + }) + for _, chest in pairs(chests) do + --game.print(chest.name .. " found at " .. chest.position.x .. ", " .. chest.position.y) + if chest.name == "logistic-chest-storage" then + local r = math.random(1,16) + -- mostly scrap, some ore and some survived bullets + if r <= 6 then + chest.insert({name = mod_prefix.."contaminated-scrap", count = math.random(1, 100)}) + elseif r <= 12 then + chest.insert({name = "uranium-ore", count = math.random(1, 50)}) + elseif r <= 16 then + chest.insert({name = "uranium-rounds-magazine", count = math.random(1, 50)}) + end + elseif chest.name == "logistic-chest-buffer" then + chest.insert({name = mod_prefix.."spaceship-wall", count = math.random(1, 50)}) + chest.insert({name = mod_prefix.."spaceship-floor", count = math.random(1, 50)}) + end + end + --game.print("done all types of chests") + end, + blueprint_strings = { + { -- tiles + xadj = 0, yadj = -2, + string = + "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" + }, + { -- entities + xadj = 0, yadj = -2, + string = + "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" + }, + } +} + +return galaxy_ship diff --git a/space-exploration_0.5.58/space-exploration/scripts/ruins/interburbulator-platform.lua b/space-exploration_0.5.58/space-exploration/scripts/ruins/interburbulator-platform.lua new file mode 100644 index 0000000..9394d22 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/ruins/interburbulator-platform.lua @@ -0,0 +1,88 @@ +local interburbulator_platform = { + name = "interburbulator-platform", + center = {x = 0, y = 0}, + force_name = "ignore", + entities = { -- not blueprintable + ["se-burbulator"] = { + {x = 0, y = -17, orientation = 1, destructible = false} + }, + ["se-interburbulator-projector"] = { + {x = -9.25, y = -9.25, direction = defines.direction.east, destructible = false}, + {x = 9.25, y = -9.25, direction = defines.direction.south, destructible = false}, + {x = 9.25, y = 9.25, direction = defines.direction.west, destructible = false}, + {x = -9.25, y = 9.25, direction = defines.direction.north, destructible = false} + }, + ["se-interburbulator-interface"] = { + --{x = -9, y = -8.25, direction = defines.direction.east}, + --{x = 9, y = -8.25, direction = defines.direction.south}, + {x = 0, y = 10.25, direction = defines.direction.west, destructible = false}, + --{x = -9, y = 10.25, direction = defines.direction.north} + }, + ["se-interburbulator-control"] = { + {x = 0, y = 9.5, direction = defines.direction.west, destructible = false}, + } + }, + clear_entity_areas = { + {{-20,-13},{20,13}}, + {{-13,-20},{13,20}}, + {{-18,-18},{18,18}}, + }, + clear_decorative_areas = { + {{-20,-13},{20,13}}, + {{-13,-20},{13,20}}, + {{-18,-18},{18,18}}, + }, + postbuild = function(surface, ruin_position, ruin) + local ruin_position_center_offset = Util.vectors_delta(ruin.center, ruin_position) + local entities = surface.find_entities_filtered{area = Util.area_add_position({{-21, -21},{21,21}}, ruin_position_center_offset)} + for _, entity in pairs(entities) do + if entity.force.name == "ignore" then + entity.destructible = false + end + if entity.type == "gate" or entity.type == "wall" or entity.name == "se-interburbulator-control" then + entity.force = "friendly" + end + end + local burbulator = surface.find_entity("se-burbulator", Util.vectors_add(ruin_position_center_offset, {x = 0, y = -17})) + burbulator.autopilot_destination = Util.vectors_add(ruin_position_center_offset, {x = 0, y = -11}) + end, + tiles = { + ["volcanic-orange-heat-1"] = {{-19,-9}, {-19,-8}, {-19,-7}, {-19,-6}, {-19,-5}, {-19,-4}, {-19,3}, {-19,4}, {-19,5}, {-19,6}, {-19,7}, {-18,-10}, {-18,-9}, {-18,-8}, {-18,-7}, {-18,-6}, {-18,-5}, {-18,-4}, {-18,3}, {-18,4}, {-18,5}, {-18,6}, {-18,7}, {-18,8}, {-17,-11}, {-17,-10}, {-17,-9}, {-17,-8}, {-17,-7}, {-17,-6}, {-17,-4}, {-17,3}, {-17,5}, {-17,6}, {-17,8}, {-17,9}, {-16,-12}, {-16,-11}, {-16,-10}, {-16,-9}, {-16,-8}, {-16,-7}, {-16,-6}, {-16,-4}, {-16,3}, {-16,5}, {-16,6}, {-16,7}, {-16,8}, {-16,9}, {-16,10}, {-15,-13}, {-15,-11}, {-15,-10}, {-15,-6}, {-15,-4}, {-15,3}, {-15,5}, {-15,7}, {-15,8}, {-15,9}, {-15,10}, {-15,11}, {-14,-14}, {-14,-10}, {-14,-9}, {-14,-8}, {-14,-7}, {-14,-6}, {-14,5}, {-14,7}, {-14,8}, {-14,9}, {-14,11}, {-14,12}, {-13,-15}, {-13,-14}, {-13,-13}, {-13,-12}, {-13,-10}, {-13,-8}, {-13,-6}, {-13,5}, {-13,7}, {-13,11}, {-13,12}, {-13,13}, {-12,-16}, {-12,-15}, {-12,-14}, {-12,-13}, {-12,-12}, {-12,11}, {-12,12}, {-12,13}, {-12,14}, {-11,-17}, {-11,-16}, {-11,-13}, {-11,-12}, {-11,12}, {-11,15}, {-10,-18}, {-10,-17}, {-10,-16}, {-10,-14}, {-10,-13}, {-10,12}, {-10,14}, {-10,15}, {-10,16}, {-9,-19}, {-9,-18}, {-9,-15}, {-9,-14}, {-9,13}, {-9,14}, {-9,15}, {-9,16}, {-9,17}, {-8,-19}, {-8,-18}, {-8,-17}, {-8,-14}, {-8,-13}, {-8,12}, {-8,13}, {-8,16}, {-8,17}, {-8,18}, {-7,-19}, {-7,-18}, {-7,-17}, {-7,-16}, {-7,-14}, {-7,13}, {-7,15}, {-7,16}, {-7,17}, {-7,18}, {-6,-19}, {-6,-18}, {-6,-17}, {-6,-16}, {-6,-15}, {-6,-14}, {-6,-13}, {-6,12}, {-6,13}, {-6,14}, {-6,15}, {-6,16}, {-6,17}, {-6,18}, {-5,-19}, {-5,-18}, {-5,-15}, {-5,14}, {-5,17}, {-5,18}, {-4,-19}, {-4,-18}, {-4,-17}, {-4,14}, {-4,15}, {-4,16}, {-4,17}, {-4,18}, {3,-19}, {3,-18}, {3,-15}, {3,14}, {3,15}, {3,16}, {3,17}, {3,18}, {4,-19}, {4,-18}, {4,-17}, {4,14}, {4,16}, {4,17}, {4,18}, {5,-19}, {5,-18}, {5,-17}, {5,-16}, {5,-15}, {5,-14}, {5,-13}, {5,12}, {5,13}, {5,15}, {5,16}, {5,17}, {5,18}, {6,-19}, {6,-18}, {6,-17}, {6,-16}, {6,-15}, {6,13}, {6,15}, {6,16}, {6,17}, {6,18}, {7,-19}, {7,-18}, {7,-17}, {7,-14}, {7,-13}, {7,12}, {7,13}, {7,16}, {7,17}, {7,18}, {8,-18}, {8,-17}, {8,-16}, {8,-15}, {8,-14}, {8,13}, {8,14}, {8,15}, {8,16}, {8,17}, {9,-17}, {9,-16}, {9,-15}, {9,-14}, {9,-13}, {9,12}, {9,13}, {9,14}, {9,15}, {9,16}, {10,-16}, {10,-15}, {10,-13}, {10,-12}, {10,11}, {10,12}, {10,15}, {11,-15}, {11,-14}, {11,-13}, {11,-12}, {11,-11}, {11,11}, {11,12}, {11,13}, {11,14}, {12,-14}, {12,-13}, {12,-12}, {12,-11}, {12,-8}, {12,-6}, {12,5}, {12,7}, {12,9}, {12,10}, {12,11}, {12,12}, {12,13}, {13,-13}, {13,-12}, {13,-9}, {13,-8}, {13,-7}, {13,-6}, {13,-5}, {13,4}, {13,5}, {13,7}, {13,8}, {13,11}, {13,12}, {14,-12}, {14,-10}, {14,-9}, {14,-6}, {14,-4}, {14,3}, {14,5}, {14,8}, {14,9}, {14,10}, {14,11}, {15,-11}, {15,-10}, {15,-9}, {15,-7}, {15,-6}, {15,-4}, {15,3}, {15,5}, {15,6}, {15,8}, {15,9}, {15,10}, {16,-10}, {16,-9}, {16,-8}, {16,-7}, {16,-6}, {16,-5}, {16,-4}, {16,3}, {16,4}, {16,5}, {16,6}, {16,7}, {16,8}, {16,9}, {17,-9}, {17,-8}, {17,-7}, {17,-6}, {17,-5}, {17,-4}, {17,3}, {17,4}, {17,5}, {17,6}, {17,7}, {17,8}, {18,-8}, {18,-7}, {18,-6}, {18,-5}, {18,-4}, {18,3}, {18,4}, {18,5}, {18,6}, {18,7}, }, + ["stone-path"] = {{-19,-3}, {-19,2}, {-18,-3}, {-18,2}, {-17,-3}, {-17,2}, {-16,-3}, {-16,2}, {-15,-3}, {-15,2}, {-14,-3}, {-14,2}, {-13,-4}, {-13,3}, {-12,-9}, {-12,-8}, {-12,-7}, {-12,-6}, {-12,-5}, {-12,4}, {-12,5}, {-12,6}, {-12,7}, {-12,8}, {-11,-10}, {-11,9}, {-10,-11}, {-10,10}, {-9,-12}, {-9,11}, {-8,-12}, {-8,11}, {-7,-12}, {-7,11}, {-6,-12}, {-6,11}, {-5,-12}, {-5,11}, {-4,-13}, {-4,12}, {-3,-19}, {-3,-18}, {-3,-17}, {-3,-16}, {-3,-15}, {-3,-14}, {-3,13}, {-3,14}, {-3,15}, {-3,16}, {-3,17}, {-3,18}, {-2,-15}, {-2,14}, {-1,-15}, {-1,14}, {0,-15}, {0,14}, {1,-15}, {1,14}, {2,-19}, {2,-18}, {2,-17}, {2,-16}, {2,-15}, {2,-14}, {2,13}, {2,14}, {2,15}, {2,16}, {2,17}, {2,18}, {3,-13}, {3,12}, {4,-12}, {4,11}, {5,-12}, {5,11}, {6,-12}, {6,11}, {7,-12}, {7,11}, {8,-12}, {8,11}, {9,-11}, {9,10}, {10,-10}, {10,9}, {11,-9}, {11,-8}, {11,-7}, {11,-6}, {11,-5}, {11,4}, {11,5}, {11,6}, {11,7}, {11,8}, {12,-4}, {12,3}, {13,-3}, {13,2}, {14,-3}, {14,2}, {15,-3}, {15,2}, {16,-3}, {16,2}, {17,-3}, {17,2}, {18,-3}, {18,2}, }, + ["refined-concrete"] = {{-19,-2}, {-19,-1}, {-19,0}, {-19,1}, {-18,-2}, {-18,-1}, {-18,0}, {-18,1}, {-17,-2}, {-17,-1}, {-17,0}, {-17,1}, {-16,-2}, {-16,-1}, {-16,0}, {-16,1}, {-15,-2}, {-15,-1}, {-15,0}, {-15,1}, {-14,-2}, {-14,-1}, {-14,0}, {-14,1}, {-13,-2}, {-13,-1}, {-13,0}, {-13,1}, {-12,-2}, {-12,-1}, {-12,0}, {-12,1}, {-11,-2}, {-11,-1}, {-11,0}, {-11,1}, {-10,-2}, {-10,-1}, {-10,0}, {-10,1}, {-3,-13}, {-3,-12}, {-3,-11}, {-3,10}, {-3,11}, {-3,12}, {-2,-19}, {-2,-18}, {-2,-17}, {-2,-16}, {-2,-14}, {-2,-13}, {-2,-12}, {-2,-11}, {-2,-10}, {-2,9}, {-2,10}, {-2,11}, {-2,12}, {-2,13}, {-2,15}, {-2,16}, {-2,17}, {-2,18}, {-1,-19}, {-1,-18}, {-1,-17}, {-1,-16}, {-1,-14}, {-1,-13}, {-1,-12}, {-1,-11}, {-1,-10}, {-1,9}, {-1,10}, {-1,11}, {-1,12}, {-1,13}, {-1,15}, {-1,16}, {-1,17}, {-1,18}, {0,-19}, {0,-18}, {0,-17}, {0,-16}, {0,-14}, {0,-13}, {0,-12}, {0,-11}, {0,-10}, {0,9}, {0,10}, {0,11}, {0,12}, {0,13}, {0,15}, {0,16}, {0,17}, {0,18}, {1,-19}, {1,-18}, {1,-17}, {1,-16}, {1,-14}, {1,-13}, {1,-12}, {1,-11}, {1,-10}, {1,9}, {1,10}, {1,11}, {1,12}, {1,13}, {1,15}, {1,16}, {1,17}, {1,18}, {2,-13}, {2,-12}, {2,-11}, {2,10}, {2,11}, {2,12}, {9,-2}, {9,-1}, {9,0}, {9,1}, {10,-2}, {10,-1}, {10,0}, {10,1}, {11,-2}, {11,-1}, {11,0}, {11,1}, {12,-2}, {12,-1}, {12,0}, {12,1}, {13,-2}, {13,-1}, {13,0}, {13,1}, {14,-2}, {14,-1}, {14,0}, {14,1}, {15,-2}, {15,-1}, {15,0}, {15,1}, {16,-2}, {16,-1}, {16,0}, {16,1}, {17,-2}, {17,-1}, {17,0}, {17,1}, {18,-2}, {18,-1}, {18,0}, {18,1}, }, + ["volcanic-orange-heat-2"] = {{-17,-5}, {-17,4}, {-17,7}, {-16,-5}, {-16,4}, {-15,-12}, {-15,-9}, {-15,-8}, {-15,-7}, {-15,-5}, {-15,4}, {-15,6}, {-14,-13}, {-14,-12}, {-14,-11}, {-14,6}, {-14,10}, {-13,-11}, {-13,9}, {-13,10}, {-11,-15}, {-11,-14}, {-11,13}, {-11,14}, {-10,-15}, {-10,13}, {-9,-17}, {-9,-16}, {-8,-15}, {-8,14}, {-8,15}, {-7,-15}, {-7,14}, {-5,-17}, {-5,-16}, {-5,15}, {-5,16}, {-4,-16}, {-4,-15}, {3,-17}, {3,-16}, {4,-16}, {4,-15}, {4,15}, {5,14}, {6,-14}, {6,14}, {7,-16}, {7,-15}, {7,14}, {7,15}, {10,-14}, {10,13}, {10,14}, {12,-10}, {13,-11}, {13,-10}, {13,6}, {13,9}, {13,10}, {14,-11}, {14,-8}, {14,-7}, {14,-5}, {14,4}, {14,6}, {14,7}, {15,-8}, {15,-5}, {15,4}, }, + ["volcanic-orange-heat-3"] = {{-14,-5}, {-14,4}, {-13,-9}, {-13,8}, {-12,-11}, {-12,-10}, {-12,9}, {-12,10}, {-11,-11}, {-11,10}, {-11,11}, {-10,-12}, {-10,11}, {-9,-13}, {-9,12}, {-8,-16}, {-7,12}, {-5,-14}, {-5,13}, {4,-14}, {4,13}, {8,-13}, {8,12}, {9,-12}, {9,11}, {10,-11}, {10,10}, {11,-10}, {11,9}, {11,10}, {12,-9}, {12,8}, {15,7}, }, + ["volcanic-orange-heat-4"] = {{-14,-4}, {-14,3}, {-13,-7}, {-13,-5}, {-13,-3}, {-13,2}, {-13,4}, {-13,6}, {-12,-4}, {-12,-3}, {-12,2}, {-11,-4}, {-11,-3}, {-11,2}, {-11,3}, {-10,-4}, {-10,-3}, {-10,2}, {-10,3}, {-7,-13}, {-5,-13}, {-5,12}, {-4,-14}, {-4,-12}, {-4,-11}, {-4,-10}, {-4,9}, {-4,10}, {-4,13}, {-3,-10}, {-3,9}, {2,-10}, {2,9}, {3,-14}, {3,-12}, {3,-11}, {3,-10}, {3,9}, {3,10}, {3,13}, {4,-13}, {4,12}, {6,-13}, {6,12}, {9,-4}, {9,-3}, {9,2}, {9,3}, {10,-4}, {10,-3}, {10,2}, {10,3}, {11,-4}, {11,-3}, {11,2}, {11,3}, {12,-7}, {12,-5}, {12,-3}, {12,2}, {12,4}, {12,6}, {13,-4}, {13,3}, {-12,3}, {-4,11}, {3,11}, }, + ["refined-hazard-concrete-left"] = {{-11,-9}, {-11,-8}, {-11,-7}, {-11,-6}, {-11,-5}, {-10,-10}, {-10,-9}, {-10,-8}, {-10,-7}, {-10,-6}, {-10,-5}, {-9,-11}, {-9,-10}, {-8,-11}, {-8,-10}, {-7,-11}, {-7,-10}, {-6,-11}, {-6,-10}, {-5,-11}, {-5,-10}, {4,9}, {4,10}, {5,9}, {5,10}, {6,9}, {6,10}, {7,9}, {7,10}, {8,9}, {8,10}, {9,4}, {9,5}, {9,6}, {9,7}, {9,8}, {9,9}, {10,4}, {10,5}, {10,6}, {10,7}, {10,8}, }, + ["refined-hazard-concrete-right"] = {{-11,4}, {-11,5}, {-11,6}, {-11,7}, {-11,8}, {-10,4}, {-10,5}, {-10,6}, {-10,7}, {-10,8}, {-10,9}, {-9,9}, {-9,10}, {-8,9}, {-8,10}, {-7,9}, {-7,10}, {-6,9}, {-6,10}, {-5,9}, {-5,10}, {4,-11}, {4,-10}, {5,-11}, {5,-10}, {6,-11}, {6,-10}, {7,-11}, {7,-10}, {8,-11}, {8,-10}, {9,-10}, {9,-9}, {9,-8}, {9,-7}, {9,-6}, {9,-5}, {10,-9}, {10,-8}, {10,-7}, {10,-6}, {10,-5}, }, + ["tutorial-grid"] = {{-9,-9}, {-9,-8}, {-9,-7}, {-9,-6}, {-9,-5}, {-9,-4}, {-9,-3}, {-9,-2}, {-9,-1}, {-9,0}, {-9,1}, {-9,2}, {-9,3}, {-9,4}, {-9,5}, {-9,6}, {-9,7}, {-9,8}, {-8,-9}, {-8,8}, {-7,-9}, {-7,8}, {-6,-9}, {-6,8}, {-5,-9}, {-5,8}, {-4,-9}, {-4,8}, {-3,-9}, {-3,8}, {-2,-9}, {-2,8}, {-1,-9}, {-1,8}, {0,-9}, {0,8}, {1,-9}, {1,8}, {2,-9}, {2,8}, {3,-9}, {3,8}, {4,-9}, {4,8}, {5,-9}, {5,8}, {6,-9}, {6,8}, {7,-9}, {7,8}, {8,-9}, {8,-8}, {8,-7}, {8,-6}, {8,-5}, {8,-4}, {8,-3}, {8,-2}, {8,-1}, {8,0}, {8,1}, {8,2}, {8,3}, {8,4}, {8,5}, {8,6}, {8,7}, {8,8}, }, + --["lab-dark-1"] + ["out-of-map"] + = {{-8,-8}, {-8,-7}, {-8,-6}, {-8,-5}, {-8,-4}, {-8,-3}, {-8,-2}, {-8,-1}, {-8,0}, {-8,1}, {-8,2}, {-8,3}, {-8,4}, {-8,5}, {-8,6}, {-8,7}, {-7,-8}, {-7,-7}, {-7,-6}, {-7,-5}, {-7,-4}, {-7,-3}, {-7,-2}, {-7,-1}, {-7,0}, {-7,1}, {-7,2}, {-7,3}, {-7,4}, {-7,5}, {-7,6}, {-7,7}, {-6,-8}, {-6,-7}, {-6,-6}, {-6,-5}, {-6,-4}, {-6,-3}, {-6,-2}, {-6,-1}, {-6,0}, {-6,1}, {-6,2}, {-6,3}, {-6,4}, {-6,5}, {-6,6}, {-6,7}, {-5,-8}, {-5,-7}, {-5,-6}, {-5,-5}, {-5,-4}, {-5,-3}, {-5,-2}, {-5,-1}, {-5,0}, {-5,1}, {-5,2}, {-5,3}, {-5,4}, {-5,5}, {-5,6}, {-5,7}, {-4,-8}, {-4,-7}, {-4,-6}, {-4,-5}, {-4,-4}, {-4,-3}, {-4,-2}, {-4,-1}, {-4,0}, {-4,1}, {-4,2}, {-4,3}, {-4,4}, {-4,5}, {-4,6}, {-4,7}, {-3,-8}, {-3,-7}, {-3,-6}, {-3,-5}, {-3,-4}, {-3,-3}, {-3,-2}, {-3,-1}, {-3,0}, {-3,1}, {-3,2}, {-3,3}, {-3,4}, {-3,5}, {-3,6}, {-3,7}, {-2,-8}, {-2,-7}, {-2,-6}, {-2,-5}, {-2,-4}, {-2,-3}, {-2,-2}, {-2,-1}, {-2,0}, {-2,1}, {-2,2}, {-2,3}, {-2,4}, {-2,5}, {-2,6}, {-2,7}, {-1,-8}, {-1,-7}, {-1,-6}, {-1,-5}, {-1,-4}, {-1,-3}, {-1,-2}, {-1,-1}, {-1,0}, {-1,1}, {-1,2}, {-1,3}, {-1,4}, {-1,5}, {-1,6}, {-1,7}, {0,-8}, {0,-7}, {0,-6}, {0,-5}, {0,-4}, {0,-3}, {0,-2}, {0,-1}, {0,0}, {0,1}, {0,2}, {0,3}, {0,4}, {0,5}, {0,6}, {0,7}, {1,-8}, {1,-7}, {1,-6}, {1,-5}, {1,-4}, {1,-3}, {1,-2}, {1,-1}, {1,0}, {1,1}, {1,2}, {1,3}, {1,4}, {1,5}, {1,6}, {1,7}, {2,-8}, {2,-7}, {2,-6}, {2,-5}, {2,-4}, {2,-3}, {2,-2}, {2,-1}, {2,0}, {2,1}, {2,2}, {2,3}, {2,4}, {2,5}, {2,6}, {2,7}, {3,-8}, {3,-7}, {3,-6}, {3,-5}, {3,-4}, {3,-3}, {3,-2}, {3,-1}, {3,0}, {3,1}, {3,2}, {3,3}, {3,4}, {3,5}, {3,6}, {3,7}, {4,-8}, {4,-7}, {4,-6}, {4,-5}, {4,-4}, {4,-3}, {4,-2}, {4,-1}, {4,0}, {4,1}, {4,2}, {4,3}, {4,4}, {4,5}, {4,6}, {4,7}, {5,-8}, {5,-7}, {5,-6}, {5,-5}, {5,-4}, {5,-3}, {5,-2}, {5,-1}, {5,0}, {5,1}, {5,2}, {5,3}, {5,4}, {5,5}, {5,6}, {5,7}, {6,-8}, {6,-7}, {6,-6}, {6,-5}, {6,-4}, {6,-3}, {6,-2}, {6,-1}, {6,0}, {6,1}, {6,2}, {6,3}, {6,4}, {6,5}, {6,6}, {6,7}, {7,-8}, {7,-7}, {7,-6}, {7,-5}, {7,-4}, {7,-3}, {7,-2}, {7,-1}, {7,0}, {7,1}, {7,2}, {7,3}, {7,4}, {7,5}, {7,6}, {7,7}, }, + -- it is better without extra tiles for the walls, but this is needed over water, maybe in the future filter these by water tiles + ["mineral-grey-dirt-2"] = {{-21,-4}, {-21,-3}, {-21,-2}, {-21,-1}, {-21,0}, {-21,1}, {-21,2}, {-21,3}, {-20,-10}, {-20,-9}, {-20,-8}, {-20,-7}, {-20,-6}, {-20,-5}, {-20,-4}, {-20,-3}, {-20,-2}, {-20,-1}, {-20,0}, {-20,1}, {-20,2}, {-20,3}, {-20,4}, {-20,5}, {-20,6}, {-20,7}, {-20,8}, {-19,-11}, {-19,-10}, {-19,8}, {-19,9}, {-18,-12}, {-18,-11}, {-18,9}, {-18,10}, {-17,-13}, {-17,-12}, {-17,10}, {-17,11}, {-16,-14}, {-16,-13}, {-16,11}, {-16,12}, {-15,-15}, {-15,-14}, {-15,12}, {-15,13}, {-14,-16}, {-14,-15}, {-14,13}, {-14,14}, {-13,-17}, {-13,-16}, {-13,14}, {-13,15}, {-12,-18}, {-12,-17}, {-12,15}, {-12,16}, {-11,-19}, {-11,-18}, {-11,16}, {-11,17}, {-10,-20}, {-10,-19}, {-10,17}, {-10,18}, {-9,-20}, {-9,18}, {-9,19}, {-8,-20}, {-8,19}, {-7,-20}, {-7,19}, {-6,-20}, {-6,19}, {-5,-20}, {-5,19}, {-4,-21}, {-4,-20}, {-4,19}, {-4,20}, {-3,-21}, {-3,-20}, {-3,19}, {-3,20}, {-2,-21}, {-2,-20}, {-2,19}, {-2,20}, {-1,-21}, {-1,-20}, {-1,19}, {-1,20}, {0,-21}, {0,-20}, {0,19}, {0,20}, {1,-21}, {1,-20}, {1,19}, {1,20}, {2,-21}, {2,-20}, {2,19}, {2,20}, {3,-21}, {3,-20}, {3,19}, {3,20}, {4,-20}, {4,19}, {5,-20}, {5,19}, {6,-20}, {6,19}, {7,-20}, {7,19}, {8,-20}, {8,-19}, {8,18}, {8,19}, {9,-19}, {9,-18}, {9,17}, {9,18}, {10,-18}, {10,-17}, {10,16}, {10,17}, {11,-17}, {11,-16}, {11,15}, {11,16}, {12,-16}, {12,-15}, {12,14}, {12,15}, {13,-15}, {13,-14}, {13,13}, {13,14}, {14,-14}, {14,-13}, {14,12}, {14,13}, {15,-13}, {15,-12}, {15,11}, {15,12}, {16,-12}, {16,-11}, {16,10}, {16,11}, {17,-11}, {17,-10}, {17,9}, {17,10}, {18,-10}, {18,-9}, {18,8}, {18,9}, {19,-9}, {19,-8}, {19,-7}, {19,-6}, {19,-5}, {19,-4}, {19,-3}, {19,-2}, {19,-1}, {19,0}, {19,1}, {19,2}, {19,3}, {19,4}, {19,5}, {19,6}, {19,7}, {19,8}, {20,-4}, {20,-3}, {20,-2}, {20,-1}, {20,0}, {20,1}, {20,2}, {20,3}, }, + + }, + under_tiles = { + ["volcanic-orange-heat-1"] = { + -- copy all tile positions from above +{-19,-3}, {-19,2}, {-18,-3}, {-18,2}, {-17,-3}, {-17,2}, {-16,-3}, {-16,2}, {-15,-3}, {-15,2}, {-14,-3}, {-14,2}, {-13,-4}, {-13,3}, {-12,-9}, {-12,-8}, {-12,-7}, {-12,-6}, {-12,-5}, {-12,4}, {-12,5}, {-12,6}, {-12,7}, {-12,8}, {-11,-10}, {-11,9}, {-10,-11}, {-10,10}, {-9,-12}, {-9,11}, {-8,-12}, {-8,11}, {-7,-12}, {-7,11}, {-6,-12}, {-6,11}, {-5,-12}, {-5,11}, {-4,-13}, {-4,12}, {-3,-19}, {-3,-18}, {-3,-17}, {-3,-16}, {-3,-15}, {-3,-14}, {-3,13}, {-3,14}, {-3,15}, {-3,16}, {-3,17}, {-3,18}, {-2,-15}, {-2,14}, {-1,-15}, {-1,14}, {0,-15}, {0,14}, {1,-15}, {1,14}, {2,-19}, {2,-18}, {2,-17}, {2,-16}, {2,-15}, {2,-14}, {2,13}, {2,14}, {2,15}, {2,16}, {2,17}, {2,18}, {3,-13}, {3,12}, {4,-12}, {4,11}, {5,-12}, {5,11}, {6,-12}, {6,11}, {7,-12}, {7,11}, {8,-12}, {8,11}, {9,-11}, {9,10}, {10,-10}, {10,9}, {11,-9}, {11,-8}, {11,-7}, {11,-6}, {11,-5}, {11,4}, {11,5}, {11,6}, {11,7}, {11,8}, {12,-4}, {12,3}, {13,-3}, {13,2}, {14,-3}, {14,2}, {15,-3}, {15,2}, {16,-3}, {16,2}, {17,-3}, {17,2}, {18,-3}, {18,2}, + +{-19,-2}, {-19,-1}, {-19,0}, {-19,1}, {-18,-2}, {-18,-1}, {-18,0}, {-18,1}, {-17,-2}, {-17,-1}, {-17,0}, {-17,1}, {-16,-2}, {-16,-1}, {-16,0}, {-16,1}, {-15,-2}, {-15,-1}, {-15,0}, {-15,1}, {-14,-2}, {-14,-1}, {-14,0}, {-14,1}, {-13,-2}, {-13,-1}, {-13,0}, {-13,1}, {-12,-2}, {-12,-1}, {-12,0}, {-12,1}, {-11,-2}, {-11,-1}, {-11,0}, {-11,1}, {-10,-2}, {-10,-1}, {-10,0}, {-10,1}, {-3,-13}, {-3,-12}, {-3,-11}, {-3,10}, {-3,11}, {-3,12}, {-2,-19}, {-2,-18}, {-2,-17}, {-2,-16}, {-2,-14}, {-2,-13}, {-2,-12}, {-2,-11}, {-2,-10}, {-2,9}, {-2,10}, {-2,11}, {-2,12}, {-2,13}, {-2,15}, {-2,16}, {-2,17}, {-2,18}, {-1,-19}, {-1,-18}, {-1,-17}, {-1,-16}, {-1,-14}, {-1,-13}, {-1,-12}, {-1,-11}, {-1,-10}, {-1,9}, {-1,10}, {-1,11}, {-1,12}, {-1,13}, {-1,15}, {-1,16}, {-1,17}, {-1,18}, {0,-19}, {0,-18}, {0,-17}, {0,-16}, {0,-14}, {0,-13}, {0,-12}, {0,-11}, {0,-10}, {0,9}, {0,10}, {0,11}, {0,12}, {0,13}, {0,15}, {0,16}, {0,17}, {0,18}, {1,-19}, {1,-18}, {1,-17}, {1,-16}, {1,-14}, {1,-13}, {1,-12}, {1,-11}, {1,-10}, {1,9}, {1,10}, {1,11}, {1,12}, {1,13}, {1,15}, {1,16}, {1,17}, {1,18}, {2,-13}, {2,-12}, {2,-11}, {2,10}, {2,11}, {2,12}, {9,-2}, {9,-1}, {9,0}, {9,1}, {10,-2}, {10,-1}, {10,0}, {10,1}, {11,-2}, {11,-1}, {11,0}, {11,1}, {12,-2}, {12,-1}, {12,0}, {12,1}, {13,-2}, {13,-1}, {13,0}, {13,1}, {14,-2}, {14,-1}, {14,0}, {14,1}, {15,-2}, {15,-1}, {15,0}, {15,1}, {16,-2}, {16,-1}, {16,0}, {16,1}, {17,-2}, {17,-1}, {17,0}, {17,1}, {18,-2}, {18,-1}, {18,0}, {18,1}, +{-11,-9}, {-11,-8}, {-11,-7}, {-11,-6}, {-11,-5}, {-10,-10}, {-10,-9}, {-10,-8}, {-10,-7}, {-10,-6}, {-10,-5}, {-9,-11}, {-9,-10}, {-8,-11}, {-8,-10}, {-7,-11}, {-7,-10}, {-6,-11}, {-6,-10}, {-5,-11}, {-5,-10}, {4,9}, {4,10}, {5,9}, {5,10}, {6,9}, {6,10}, {7,9}, {7,10}, {8,9}, {8,10}, {9,4}, {9,5}, {9,6}, {9,7}, {9,8}, {9,9}, {10,4}, {10,5}, {10,6}, {10,7}, {10,8}, + +{-11,4}, {-11,5}, {-11,6}, {-11,7}, {-11,8}, {-10,4}, {-10,5}, {-10,6}, {-10,7}, {-10,8}, {-10,9}, {-9,9}, {-9,10}, {-8,9}, {-8,10}, {-7,9}, {-7,10}, {-6,9}, {-6,10}, {-5,9}, {-5,10}, {4,-11}, {4,-10}, {5,-11}, {5,-10}, {6,-11}, {6,-10}, {7,-11}, {7,-10}, {8,-11}, {8,-10}, {9,-10}, {9,-9}, {9,-8}, {9,-7}, {9,-6}, {9,-5}, {10,-9}, {10,-8}, {10,-7}, {10,-6}, {10,-5}, + +{-9,-9}, {-9,-8}, {-9,-7}, {-9,-6}, {-9,-5}, {-9,-4}, {-9,-3}, {-9,-2}, {-9,-1}, {-9,0}, {-9,1}, {-9,2}, {-9,3}, {-9,4}, {-9,5}, {-9,6}, {-9,7}, {-9,8}, {-8,-9}, {-8,8}, {-7,-9}, {-7,8}, {-6,-9}, {-6,8}, {-5,-9}, {-5,8}, {-4,-9}, {-4,8}, {-3,-9}, {-3,8}, {-2,-9}, {-2,8}, {-1,-9}, {-1,8}, {0,-9}, {0,8}, {1,-9}, {1,8}, {2,-9}, {2,8}, {3,-9}, {3,8}, {4,-9}, {4,8}, {5,-9}, {5,8}, {6,-9}, {6,8}, {7,-9}, {7,8}, {8,-9}, {8,-8}, {8,-7}, {8,-6}, {8,-5}, {8,-4}, {8,-3}, {8,-2}, {8,-1}, {8,0}, {8,1}, {8,2}, {8,3}, {8,4}, {8,5}, {8,6}, {8,7}, {8,8}, + +{-8,-8}, {-8,-7}, {-8,-6}, {-8,-5}, {-8,-4}, {-8,-3}, {-8,-2}, {-8,-1}, {-8,0}, {-8,1}, {-8,2}, {-8,3}, {-8,4}, {-8,5}, {-8,6}, {-8,7}, {-7,-8}, {-7,-7}, {-7,-6}, {-7,-5}, {-7,-4}, {-7,-3}, {-7,-2}, {-7,-1}, {-7,0}, {-7,1}, {-7,2}, {-7,3}, {-7,4}, {-7,5}, {-7,6}, {-7,7}, {-6,-8}, {-6,-7}, {-6,-6}, {-6,-5}, {-6,-4}, {-6,-3}, {-6,-2}, {-6,-1}, {-6,0}, {-6,1}, {-6,2}, {-6,3}, {-6,4}, {-6,5}, {-6,6}, {-6,7}, {-5,-8}, {-5,-7}, {-5,-6}, {-5,-5}, {-5,-4}, {-5,-3}, {-5,-2}, {-5,-1}, {-5,0}, {-5,1}, {-5,2}, {-5,3}, {-5,4}, {-5,5}, {-5,6}, {-5,7}, {-4,-8}, {-4,-7}, {-4,-6}, {-4,-5}, {-4,-4}, {-4,-3}, {-4,-2}, {-4,-1}, {-4,0}, {-4,1}, {-4,2}, {-4,3}, {-4,4}, {-4,5}, {-4,6}, {-4,7}, {-3,-8}, {-3,-7}, {-3,-6}, {-3,-5}, {-3,-4}, {-3,-3}, {-3,-2}, {-3,-1}, {-3,0}, {-3,1}, {-3,2}, {-3,3}, {-3,4}, {-3,5}, {-3,6}, {-3,7}, {-2,-8}, {-2,-7}, {-2,-6}, {-2,-5}, {-2,-4}, {-2,-3}, {-2,-2}, {-2,-1}, {-2,0}, {-2,1}, {-2,2}, {-2,3}, {-2,4}, {-2,5}, {-2,6}, {-2,7}, {-1,-8}, {-1,-7}, {-1,-6}, {-1,-5}, {-1,-4}, {-1,-3}, {-1,-2}, {-1,-1}, {-1,0}, {-1,1}, {-1,2}, {-1,3}, {-1,4}, {-1,5}, {-1,6}, {-1,7}, {0,-8}, {0,-7}, {0,-6}, {0,-5}, {0,-4}, {0,-3}, {0,-2}, {0,-1}, {0,0}, {0,1}, {0,2}, {0,3}, {0,4}, {0,5}, {0,6}, {0,7}, {1,-8}, {1,-7}, {1,-6}, {1,-5}, {1,-4}, {1,-3}, {1,-2}, {1,-1}, {1,0}, {1,1}, {1,2}, {1,3}, {1,4}, {1,5}, {1,6}, {1,7}, {2,-8}, {2,-7}, {2,-6}, {2,-5}, {2,-4}, {2,-3}, {2,-2}, {2,-1}, {2,0}, {2,1}, {2,2}, {2,3}, {2,4}, {2,5}, {2,6}, {2,7}, {3,-8}, {3,-7}, {3,-6}, {3,-5}, {3,-4}, {3,-3}, {3,-2}, {3,-1}, {3,0}, {3,1}, {3,2}, {3,3}, {3,4}, {3,5}, {3,6}, {3,7}, {4,-8}, {4,-7}, {4,-6}, {4,-5}, {4,-4}, {4,-3}, {4,-2}, {4,-1}, {4,0}, {4,1}, {4,2}, {4,3}, {4,4}, {4,5}, {4,6}, {4,7}, {5,-8}, {5,-7}, {5,-6}, {5,-5}, {5,-4}, {5,-3}, {5,-2}, {5,-1}, {5,0}, {5,1}, {5,2}, {5,3}, {5,4}, {5,5}, {5,6}, {5,7}, {6,-8}, {6,-7}, {6,-6}, {6,-5}, {6,-4}, {6,-3}, {6,-2}, {6,-1}, {6,0}, {6,1}, {6,2}, {6,3}, {6,4}, {6,5}, {6,6}, {6,7}, {7,-8}, {7,-7}, {7,-6}, {7,-5}, {7,-4}, {7,-3}, {7,-2}, {7,-1}, {7,0}, {7,1}, {7,2}, {7,3}, {7,4}, {7,5}, {7,6}, {7,7}, + } + }, + blueprint_strings = { + { -- walls, heat piptes, gates + string = "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" + } + } +} + +return interburbulator_platform diff --git a/space-exploration_0.5.58/space-exploration/scripts/ruins/persepolis.lua b/space-exploration_0.5.58/space-exploration/scripts/ruins/persepolis.lua new file mode 100644 index 0000000..b8c751c --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/ruins/persepolis.lua @@ -0,0 +1,150 @@ +local persepolis = { + name = "persepolis", + center = {x = 0, y = 0}, + force_name = "ignore", + clear_entity_areas = { + {{-97, -128}, {93, 156}}, + }, + clear_decorative_areas = { + {{-97, -128}, {93, 156}}, + }, + --runtime_area = {left_top = {x = -97, y = -128}, right_bottom = { x = 93, y = 156}}, + --runtime_tick_3600 = function(surface, ruin_data) + --end, + prebuild = function(surface, ruin_position, ruin) + local ruin_position_center_offset = Util.vectors_delta(ruin.center, ruin_position) + surface.request_to_generate_chunks(ruin_position_center_offset, 5) + surface.force_generate_chunk_requests() + end, + postbuild = function(surface, ruin_position, ruin) + local ruin_position_center_offset = Util.vectors_delta(ruin.center, ruin_position) + local area = Util.area_add_position({{-96, -128}, {93, 156}}, ruin_position_center_offset) + local entities = surface.find_entities_filtered{name="iron-wood-chest", area = area} + local arcospheres_to_add = 10 + local zone = Zone.from_surface(surface) + if zone and zone.looted_items and zone.looted_items["se-arcosphere"] then + arcospheres_to_add = arcospheres_to_add - zone.looted_items["se-arcosphere"] + end + if arcospheres_to_add > 0 then + for i = 1, arcospheres_to_add do + local entity = entities[math.random(1, #entities)] + entity.insert({name="se-arcosphere", count=1}) + end + end + local entities = surface.find_entities(area) + local iron + for _, entity in pairs(entities) do + if entity.type == "container" then + local r = math.random(1,9) + if r == 1 then + entity.insert({name="coal", count=10000}) + elseif r == 2 then + entity.insert({name="iron-ore", count=10000}) + elseif r == 3 then + entity.insert({name="copper-ore", count=10000}) + elseif r == 4 then + entity.insert({name="stone", count=10000}) + elseif r == 5 then + entity.insert({name="wood", count=10000}) + elseif r == 6 then + entity.insert({name="iron-plate", count=10000}) + elseif r == 7 then + entity.insert({name="copper-plate", count=10000}) + elseif r == 8 then + entity.insert({name="stone-brick", count=10000}) + elseif r == 9 then + entity.insert({name="raw-fish", count=10000}) + end + entity.force = "capture" + end + if entity.type == "lab" then + entity.insert({name="coal", count=10000}) + entity.insert({name="automation-science-pack", count=10000}) + entity.force = "capture" + entity.backer_name = "Persepolis II" + end + if entity.name == "stone-furnace" then + entity.force = "capture" + iron = not iron + entity.insert({name="coal", count=10000}) + if iron then + entity.insert({name="iron-ore", count=10000}) + else + entity.insert({name="copper-ore", count=10000}) + end + end + if entity.type == "wall" then + if math.random() < 0.03 then + entity.die() + else + entity.destructible = false + end + end + end + local chunks = {} + for x = math.floor(area[1][1]/32), math.ceil(area[2][1]/32) do + for y = math.floor(area[1][2]/32), math.ceil(area[2][2]/32) do + table.insert(chunks, {x=x,y=y}) + end + end + local decorative_names = {} + for decorative_name, prototype in pairs(game.decorative_prototypes) do + if prototype.autoplace_specification and not(string.find(decorative_name, "dune", 1, true) + or string.find(decorative_name, "blue", 1, true) + or string.find(decorative_name, "purple", 1, true) + or string.find(decorative_name, "violet", 1, true) + or string.find(decorative_name, "mauve", 1, true)) then + table.insert(decorative_names, decorative_name) + end + end + surface.regenerate_decorative(decorative_names, chunks) + end, + entities = { -- not blueprintable + ["stone-rubble"] = {{x=-78.55078125, y=-126.2109375, graphics_variation=5}, {x=-80.52734375, y=-124.234375, graphics_variation=7}, {x=-54.41015625, y=-122.5390625, graphics_variation=7}, {x=-52.71875, y=-122.4375, graphics_variation=5}, {x=-85.37109375, y=-119.3125, graphics_variation=8}, {x=-21.5078125, y=-117.39453125, graphics_variation=5}, {x=3.4375, y=-109.1796875, graphics_variation=3}, {x=62.95703125, y=-109.55859375, graphics_variation=1}, {x=-84.421875, y=-107.96875, graphics_variation=6}, {x=-5.41796875, y=-107.56640625, graphics_variation=8}, {x=73.62890625, y=-101.328125, graphics_variation=1}, {x=77.53515625, y=-100.56640625, graphics_variation=2}, {x=84.35546875, y=-102.43359375, graphics_variation=6}, {x=75.53515625, y=-100.48828125, graphics_variation=7}, {x=79.36328125, y=-99.5, graphics_variation=6}, {x=56.51953125, y=-96.70703125, graphics_variation=4}, {x=73.6484375, y=-97.48046875, graphics_variation=4}, {x=79.6875, y=-96.62109375, graphics_variation=5}, {x=60.60546875, y=-95.66015625, graphics_variation=7}, {x=64.61328125, y=-94.7109375, graphics_variation=3}, {x=56.515625, y=-92.63671875, graphics_variation=8}, {x=68.48828125, y=-93.48046875, graphics_variation=6}, {x=73.57421875, y=-92.7578125, graphics_variation=3}, {x=13.61328125, y=-91.375, graphics_variation=8}, {x=23.546875, y=-90.86328125, graphics_variation=2}, {x=55.48828125, y=-90.6171875, graphics_variation=7}, {x=60.44140625, y=-91.55078125, graphics_variation=5}, {x=77.171875, y=-90.625, graphics_variation=2}, {x=-84.4140625, y=-90.46484375, graphics_variation=5}, {x=54.5546875, y=-88.5625, graphics_variation=8}, {x=59.390625, y=-89.3828125, graphics_variation=2}, {x=50.72265625, y=-88.5, graphics_variation=6}, {x=57.734375, y=-88.44921875, graphics_variation=7}, {x=61.75390625, y=-87.62890625, graphics_variation=8}, {x=63.54296875, y=-88.44921875, graphics_variation=4}, {x=65.546875, y=-86.859375, graphics_variation=3}, {x=48.6640625, y=-85.5078125, graphics_variation=1}, {x=55.58203125, y=-85.34375, graphics_variation=2}, {x=58.34375, y=-86.3515625, graphics_variation=3}, {x=62.66796875, y=-85.4375, graphics_variation=1}, {x=69.23828125, y=-84.92578125, graphics_variation=5}, {x=73.75390625, y=-85.484375, graphics_variation=5}, {x=76.421875, y=-84.7421875, graphics_variation=8}, {x=60.421875, y=-84.5234375, graphics_variation=3}, {x=-80.16015625, y=-80.42578125, graphics_variation=6}, {x=31.55078125, y=-80.453125, graphics_variation=6}, {x=38.34765625, y=-78.5078125, graphics_variation=8}, {x=-61.5078125, y=-76.4296875, graphics_variation=6}, {x=50.921875, y=-75.3828125, graphics_variation=2}, {x=81.99609375, y=-73.53125, graphics_variation=8}, {x=-57.15625, y=-70.703125, graphics_variation=4}, {x=69.0234375, y=-71.53125, graphics_variation=8}, {x=70.375, y=-72.2109375, graphics_variation=6}, {x=-78.60546875, y=-70.3203125, graphics_variation=5}, {x=-76.35546875, y=-70.34375, graphics_variation=7}, {x=-74.51953125, y=-70.45703125, graphics_variation=8}, {x=-48.5390625, y=-70.38671875, graphics_variation=5}, {x=-78.48828125, y=-67.46484375, graphics_variation=2}, {x=-76.375, y=-67.27734375, graphics_variation=7}, {x=-74.2890625, y=-67.53125, graphics_variation=8}, {x=64.2734375, y=-66.55859375, graphics_variation=1}, {x=-68.515625, y=-65.08984375, graphics_variation=8}, {x=62.578125, y=-66.53515625, graphics_variation=4}, {x=77.5546875, y=-64.5859375, graphics_variation=8}, {x=79.7265625, y=-64.93359375, graphics_variation=7}, {x=84.55859375, y=-64.96875, graphics_variation=3}, {x=-53.6953125, y=-62.859375, graphics_variation=1}, {x=-45.515625, y=-63.55078125, graphics_variation=3}, {x=-41.5234375, y=-63.6640625, graphics_variation=6}, {x=-39.43359375, y=-63.5, graphics_variation=6}, {x=-37.484375, y=-63.453125, graphics_variation=5}, {x=-31.46875, y=-63.5, graphics_variation=8}, {x=-26.2578125, y=-63.7578125, graphics_variation=4}, {x=-21.91796875, y=-63.33984375, graphics_variation=5}, {x=-12.90625, y=-63.546875, graphics_variation=6}, {x=-7.3828125, y=-63.5703125, graphics_variation=2}, {x=5.18359375, y=-63.40625, graphics_variation=6}, {x=61.828125, y=-63.5625, graphics_variation=7}, {x=61.62109375, y=-62.609375, graphics_variation=6}, {x=64.9609375, y=-63.5859375, graphics_variation=3}, {x=75.46484375, y=-63.484375, graphics_variation=2}, {x=78.640625, y=-64.484375, graphics_variation=4}, {x=84.625, y=-64, graphics_variation=5}, {x=-55.234375, y=-61.55078125, graphics_variation=5}, {x=-53.90234375, y=-61.70703125, graphics_variation=7}, {x=-0.4296875, y=-62.47265625, graphics_variation=5}, {x=17.4609375, y=-59.16796875, graphics_variation=8}, {x=46.71875, y=-60.3828125, graphics_variation=3}, {x=48.58984375, y=-59.4375, graphics_variation=8}, {x=47.5703125, y=-59.46484375, graphics_variation=5}, {x=49.62109375, y=-59.5078125, graphics_variation=5}, {x=64.265625, y=-60.171875, graphics_variation=5}, {x=67.5859375, y=-59.12890625, graphics_variation=4}, {x=75.56640625, y=-60.49609375, graphics_variation=3}, {x=-78.921875, y=-58.5, graphics_variation=4}, {x=-77.875, y=-58.16015625, graphics_variation=6}, {x=-68.26171875, y=-58.5234375, graphics_variation=3}, {x=-65.26953125, y=-58.26953125, graphics_variation=6}, {x=-56.5390625, y=-58.22265625, graphics_variation=6}, {x=-21.63671875, y=-58.37109375, graphics_variation=5}, {x=14.7578125, y=-57.1953125, graphics_variation=3}, {x=51.6796875, y=-58.32421875, graphics_variation=3}, {x=20.640625, y=-55.78515625, graphics_variation=1}, {x=40.84375, y=-55.39453125, graphics_variation=1}, {x=55.2890625, y=-56.0703125, graphics_variation=1}, {x=12.62109375, y=-53.328125, graphics_variation=8}, {x=50.47265625, y=-52.5625, graphics_variation=8}, {x=55.51953125, y=-54.3515625, graphics_variation=8}, {x=-82.34765625, y=-49.328125, graphics_variation=7}, {x=32.60546875, y=-50.01171875, graphics_variation=1}, {x=64.4765625, y=-47.2421875, graphics_variation=1}, {x=61.55078125, y=-44.6328125, graphics_variation=2}, {x=62.5, y=-45.55859375, graphics_variation=5}, {x=62.22265625, y=-46.53515625, graphics_variation=4}, {x=71.51953125, y=-45.39453125, graphics_variation=2}, {x=71.50390625, y=-46.4296875, graphics_variation=3}, {x=14.75, y=-44.3359375, graphics_variation=8}, {x=17.453125, y=-42.8359375, graphics_variation=2}, {x=58.734375, y=-44.0625, graphics_variation=8}, {x=61.24609375, y=-43.6796875, graphics_variation=1}, {x=62.45703125, y=-43.35546875, graphics_variation=3}, {x=62.546875, y=-44.4453125, graphics_variation=5}, {x=71.5390625, y=-43.41015625, graphics_variation=1}, {x=58.734375, y=-40.8125, graphics_variation=7}, {x=62.19921875, y=-42.23828125, graphics_variation=6}, {x=69.6328125, y=-40.7578125, graphics_variation=2}, {x=71.46875, y=-42.32421875, graphics_variation=8}, {x=72.40234375, y=-42.48046875, graphics_variation=2}, {x=73.48828125, y=-42.55078125, graphics_variation=7}, {x=74.5390625, y=-42.46484375, graphics_variation=3}, {x=12.4140625, y=-38.578125, graphics_variation=5}, {x=14.70703125, y=-39.1328125, graphics_variation=3}, {x=17.3046875, y=-38.5546875, graphics_variation=7}, {x=61.64453125, y=-39.2734375, graphics_variation=4}, {x=58.5625, y=-37.29296875, graphics_variation=5}, {x=12.265625, y=-35.40625, graphics_variation=1}, {x=14.6796875, y=-33.4765625, graphics_variation=1}, {x=76.5234375, y=-33.171875, graphics_variation=5}, {x=87.05078125, y=-32.265625, graphics_variation=2}, {x=9.07421875, y=-29.0390625, graphics_variation=6}, {x=79.8359375, y=-30.484375, graphics_variation=8}, {x=-82.36328125, y=-26.67578125, graphics_variation=6}, {x=-71.2734375, y=-25.92578125, graphics_variation=2}, {x=-37.58984375, y=-25.8984375, graphics_variation=6}, {x=12.265625, y=-25.48828125, graphics_variation=8}, {x=63.6640625, y=-24.79296875, graphics_variation=3}, {x=69.5, y=-25.921875, graphics_variation=4}, {x=76.60546875, y=-26.1484375, graphics_variation=4}, {x=76.4921875, y=-24.93359375, graphics_variation=1}, {x=84.50390625, y=-20.69140625, graphics_variation=1}, {x=-84.56640625, y=-18.8984375, graphics_variation=2}, {x=-80.3359375, y=-19.31640625, graphics_variation=3}, {x=-37.25390625, y=-19.2109375, graphics_variation=8}, {x=-27.35546875, y=-19.3125, graphics_variation=5}, {x=81.609375, y=-19.17578125, graphics_variation=5}, {x=12.265625, y=-16.76171875, graphics_variation=5}, {x=66.7734375, y=-17.71484375, graphics_variation=6}, {x=76.50390625, y=-17.3828125, graphics_variation=2}, {x=-84.52734375, y=-15.375, graphics_variation=1}, {x=-64.390625, y=-16.39453125, graphics_variation=1}, {x=-87.3984375, y=-14.28515625, graphics_variation=6}, {x=-74.44140625, y=-13.5703125, graphics_variation=5}, {x=-34.23828125, y=-13.7109375, graphics_variation=6}, {x=-24.41015625, y=-13.5703125, graphics_variation=6}, {x=12.54296875, y=-13.72265625, graphics_variation=3}, {x=61.34375, y=-14.546875, graphics_variation=4}, {x=62.2734375, y=-13.7578125, graphics_variation=2}, {x=63.62109375, y=-13.98828125, graphics_variation=3}, {x=64.78125, y=-14.265625, graphics_variation=7}, {x=70.5703125, y=-12.96875, graphics_variation=8}, {x=74.0078125, y=-14.22265625, graphics_variation=2}, {x=-86.9140625, y=-10.5625, graphics_variation=2}, {x=-82.19140625, y=-10.7109375, graphics_variation=4}, {x=-54.33984375, y=-10.55859375, graphics_variation=5}, {x=61.30078125, y=-11.71484375, graphics_variation=8}, {x=62.2734375, y=-12.50390625, graphics_variation=4}, {x=-22.03515625, y=-10.46875, graphics_variation=7}, {x=74.359375, y=-9.1953125, graphics_variation=4}, {x=84.390625, y=-4.890625, graphics_variation=8}, {x=-71.54296875, y=-4.359375, graphics_variation=7}, {x=12.56640625, y=-2.62109375, graphics_variation=5}, {x=84.27734375, y=-3.8984375, graphics_variation=7}, {x=-33.50390625, y=-2.07421875, graphics_variation=4}, {x=-75.27734375, y=1.296875, graphics_variation=8}, {x=-45.56640625, y=-0.04296875, graphics_variation=3}, {x=-37.4140625, y=0.06640625, graphics_variation=4}, {x=14.609375, y=6.1328125, graphics_variation=1}, {x=62.546875, y=7.4140625, graphics_variation=4}, {x=12.3984375, y=7.96875, graphics_variation=5}, {x=67.7109375, y=8.24609375, graphics_variation=6}, {x=67.29296875, y=11.1796875, graphics_variation=4}, {x=67.5234375, y=9.80859375, graphics_variation=3}, {x=87.6171875, y=9.546875, graphics_variation=8}, {x=12.33203125, y=12.140625, graphics_variation=6}, {x=65.3125, y=11.8671875, graphics_variation=1}, {x=65.46484375, y=13.42578125, graphics_variation=1}, {x=67.67578125, y=12.32421875, graphics_variation=7}, {x=84.95703125, y=11.48828125, graphics_variation=8}, {x=12.47265625, y=13.953125, graphics_variation=6}, {x=67.25390625, y=13.921875, graphics_variation=3}, {x=81.58984375, y=13.921875, graphics_variation=1}, {x=-71.546875, y=16.32421875, graphics_variation=1}, {x=-37.46875, y=16.9765625, graphics_variation=5}, {x=81.53125, y=16.2734375, graphics_variation=7}, {x=65.38671875, y=18.32421875, graphics_variation=3}, {x=-71.48828125, y=21.21875, graphics_variation=4}, {x=-33.65625, y=19.5234375, graphics_variation=2}, {x=-86.68359375, y=23.68359375, graphics_variation=7}, {x=-22.0625, y=23.66015625, graphics_variation=8}, {x=-52.546875, y=27.42578125, graphics_variation=7}, {x=-48.3515625, y=26.46875, graphics_variation=5}, {x=-43.18359375, y=27.4453125, graphics_variation=3}, {x=-41.0703125, y=27.28125, graphics_variation=8}, {x=70.609375, y=26.7421875, graphics_variation=7}, {x=-49.953125, y=29.39453125, graphics_variation=4}, {x=81.109375, y=29.43359375, graphics_variation=6}, {x=81.3359375, y=28.2421875, graphics_variation=2}, {x=12.44140625, y=30.13671875, graphics_variation=3}, {x=67.25, y=31.43359375, graphics_variation=1}, {x=-87.3125, y=31.97265625, graphics_variation=6}, {x=-75.58203125, y=32.90625, graphics_variation=4}, {x=-72.34375, y=31.625, graphics_variation=2}, {x=-36.44921875, y=31.671875, graphics_variation=7}, {x=12.59375, y=32.0078125, graphics_variation=3}, {x=67.5234375, y=32.57421875, graphics_variation=6}, {x=81.5625, y=31.640625, graphics_variation=3}, {x=84.4765625, y=33.16796875, graphics_variation=5}, {x=81.64453125, y=33.5078125, graphics_variation=1}, {x=65.48828125, y=35.47265625, graphics_variation=1}, {x=65.73046875, y=36.74609375, graphics_variation=3}, {x=84.421875, y=35.48828125, graphics_variation=4}, {x=-68.03515625, y=38.48046875, graphics_variation=4}, {x=65.8359375, y=37.8515625, graphics_variation=7}, {x=-84.45703125, y=39.68359375, graphics_variation=5}, {x=12.64453125, y=39.81640625, graphics_variation=6}, {x=65.59375, y=39.75, graphics_variation=4}, {x=-65.46484375, y=42.51953125, graphics_variation=4}, {x=9.65625, y=43.4296875, graphics_variation=7}, {x=87.6484375, y=42.90234375, graphics_variation=5}, {x=0.78515625, y=44.73046875, graphics_variation=3}, {x=9.296875, y=45.35546875, graphics_variation=3}, {x=8.32421875, y=44.37890625, graphics_variation=8}, {x=-86.43359375, y=46.56640625, graphics_variation=1}, {x=6.3046875, y=45.90625, graphics_variation=7}, {x=9.7578125, y=46.66015625, graphics_variation=8}, {x=40.2890625, y=47.28515625, graphics_variation=6}, {x=-79.4375, y=48.37890625, graphics_variation=7}, {x=-13.63671875, y=48.421875, graphics_variation=1}, {x=2.61328125, y=48.90625, graphics_variation=6}, {x=20.4765625, y=47.53515625, graphics_variation=6}, {x=23.04296875, y=47.63671875, graphics_variation=4}, {x=24.52734375, y=47.48046875, graphics_variation=4}, {x=36.61328125, y=47.6015625, graphics_variation=2}, {x=39.0234375, y=49.4375, graphics_variation=6}, {x=38.2890625, y=48.2578125, graphics_variation=6}, {x=39.62109375, y=48.20703125, graphics_variation=7}, {x=84.3828125, y=48.921875, graphics_variation=2}, {x=-86.41015625, y=49.5390625, graphics_variation=3}, {x=-27.3984375, y=50.640625, graphics_variation=3}, {x=-18.34765625, y=51.44140625, graphics_variation=8}, {x=33.74609375, y=49.671875, graphics_variation=5}, {x=43.26953125, y=49.6015625, graphics_variation=7}, {x=42.16796875, y=49.73828125, graphics_variation=3}, {x=-69.32421875, y=51.671875, graphics_variation=1}, {x=-27.3984375, y=52.49609375, graphics_variation=1}, {x=18.9140625, y=52.30078125, graphics_variation=4}, {x=27.3984375, y=52.48046875, graphics_variation=6}, {x=41.6484375, y=52.671875, graphics_variation=4}, {x=47.859375, y=52.984375, graphics_variation=3}, {x=49.5859375, y=52.87890625, graphics_variation=1}, {x=53, y=52.6015625, graphics_variation=5}, {x=68.140625, y=52.328125, graphics_variation=1}, {x=69.625, y=52.4296875, graphics_variation=5}, {x=71.73046875, y=52.2578125, graphics_variation=8}, {x=80.875, y=52.71484375, graphics_variation=3}, {x=-77.4609375, y=54.57421875, graphics_variation=7}, {x=-18.52734375, y=54.078125, graphics_variation=8}, {x=16.9921875, y=54.53125, graphics_variation=3}, {x=-28.45703125, y=56.6328125, graphics_variation=1}, {x=9.68359375, y=56.46875, graphics_variation=3}, {x=29.7421875, y=55.625, graphics_variation=7}, {x=-72.5390625, y=58.59375, graphics_variation=1}, {x=13.734375, y=58.62109375, graphics_variation=6}, {x=44.203125, y=59.38671875, graphics_variation=6}, {x=63.8359375, y=59.33203125, graphics_variation=2}, {x=-86.25, y=60.37890625, graphics_variation=4}, {x=75.46875, y=59.81640625, graphics_variation=8}, {x=84.52734375, y=59.578125, graphics_variation=6}, {x=-82.46484375, y=61.58203125, graphics_variation=6}, {x=-77.39453125, y=62.79296875, graphics_variation=7}, {x=-63.359375, y=62.546875, graphics_variation=7}, {x=79.76171875, y=61.48046875, graphics_variation=6}, {x=-82.39453125, y=63.578125, graphics_variation=5}, {x=-28.36328125, y=64.41015625, graphics_variation=7}, {x=26.0859375, y=64.37109375, graphics_variation=6}, {x=27.3046875, y=65.01953125, graphics_variation=1}, {x=33.65234375, y=64.125, graphics_variation=6}, {x=-82.44140625, y=66.52734375, graphics_variation=4}, {x=27.50390625, y=67.28515625, graphics_variation=6}, {x=33.609375, y=66.81640625, graphics_variation=6}, {x=33.56640625, y=65.5546875, graphics_variation=5}, {x=80.1875, y=65.53515625, graphics_variation=6}, {x=82.421875, y=65.87109375, graphics_variation=1}, {x=82.9609375, y=66.7734375, graphics_variation=1}, {x=-67.640625, y=68.42578125, graphics_variation=5}, {x=-30.578125, y=68.71484375, graphics_variation=7}, {x=-30.37109375, y=67.71875, graphics_variation=6}, {x=-16.76171875, y=69.28515625, graphics_variation=8}, {x=7.68359375, y=68.27734375, graphics_variation=8}, {x=16.0390625, y=68.53125, graphics_variation=7}, {x=18.359375, y=68.5859375, graphics_variation=4}, {x=53.2109375, y=67.69140625, graphics_variation=2}, {x=80.65234375, y=68.2734375, graphics_variation=5}, {x=87.6953125, y=69.09765625, graphics_variation=8}, {x=-30.48828125, y=70.203125, graphics_variation=1}, {x=-23.00390625, y=70.6171875, graphics_variation=8}, {x=-21.8671875, y=70.17578125, graphics_variation=3}, {x=15.64453125, y=69.55078125, graphics_variation=1}, {x=19.3515625, y=70.73828125, graphics_variation=8}, {x=25.51953125, y=69.97265625, graphics_variation=5}, {x=82.44921875, y=69.7734375, graphics_variation=1}, {x=87.6328125, y=70.16015625, graphics_variation=2}, {x=-83.28515625, y=73.28125, graphics_variation=2}, {x=36.30859375, y=73.125, graphics_variation=1}, {x=87.8515625, y=72.41015625, graphics_variation=7}, {x=-80.3359375, y=74.046875, graphics_variation=4}, {x=-83.40234375, y=75.48828125, graphics_variation=4}, {x=40.24609375, y=76.41015625, graphics_variation=6}, {x=45.36328125, y=76.4921875, graphics_variation=4}, {x=44.17578125, y=76.37890625, graphics_variation=7}, {x=54.57421875, y=76.4609375, graphics_variation=1}, {x=58.7265625, y=76.28125, graphics_variation=1}, {x=65.41796875, y=76.58203125, graphics_variation=4}, {x=67.1171875, y=76.41015625, graphics_variation=8}, {x=77.0234375, y=76.6640625, graphics_variation=7}, {x=-34.390625, y=78.46484375, graphics_variation=1}, {x=-27.6484375, y=78.796875, graphics_variation=7}, {x=-34.49609375, y=79.6953125, graphics_variation=1}, {x=-22.46875, y=80.640625, graphics_variation=8}, {x=84.7109375, y=81.30859375, graphics_variation=3}, {x=76.7265625, y=81.91015625, graphics_variation=6}, {x=78.796875, y=82.9765625, graphics_variation=8}, {x=84.5390625, y=83.0625, graphics_variation=1}, {x=-22.390625, y=83.6171875, graphics_variation=6}, {x=36.38671875, y=85.3515625, graphics_variation=1}, {x=43.6875, y=85.2578125, graphics_variation=5}, {x=-57.328125, y=87.40234375, graphics_variation=5}, {x=27.35546875, y=86.9453125, graphics_variation=4}, {x=44.29296875, y=86.74609375, graphics_variation=7}, {x=60.4375, y=85.6640625, graphics_variation=6}, {x=75.96484375, y=87.4296875, graphics_variation=7}, {x=84.47265625, y=87.140625, graphics_variation=2}, {x=-55.4140625, y=87.546875, graphics_variation=4}, {x=5.53125, y=89.28515625, graphics_variation=4}, {x=5.78125, y=87.62890625, graphics_variation=5}, {x=62.69921875, y=88.71875, graphics_variation=3}, {x=78.59765625, y=88.84375, graphics_variation=6}, {x=87.52734375, y=88.0390625, graphics_variation=3}, {x=-57.3515625, y=89.62890625, graphics_variation=7}, {x=-55.4140625, y=89.546875, graphics_variation=5}, {x=36.6484375, y=89.74609375, graphics_variation=6}, {x=45.5, y=89.671875, graphics_variation=7}, {x=82.84375, y=89.484375, graphics_variation=6}, {x=83.09765625, y=90.6171875, graphics_variation=7}, {x=84.1171875, y=90.67578125, graphics_variation=4}, {x=84.23046875, y=89.76953125, graphics_variation=1}, {x=-33.33203125, y=91.44921875, graphics_variation=3}, {x=4.0625, y=92.59765625, graphics_variation=2}, {x=33.6953125, y=92.89453125, graphics_variation=6}, {x=64.3125, y=92.7421875, graphics_variation=3}, {x=83.2109375, y=91.9765625, graphics_variation=5}, {x=-81.3359375, y=94.60546875, graphics_variation=4}, {x=33.2734375, y=93.984375, graphics_variation=6}, {x=33.57421875, y=95.34765625, graphics_variation=3}, {x=82.671875, y=93.90234375, graphics_variation=4}, {x=7.5078125, y=95.84765625, graphics_variation=6}, {x=48.703125, y=95.66015625, graphics_variation=8}, {x=60.578125, y=96.9140625, graphics_variation=3}, {x=-12.3046875, y=97.48046875, graphics_variation=6}, {x=5.625, y=98.31640625, graphics_variation=3}, {x=33.359375, y=97.6015625, graphics_variation=5}, {x=33.609375, y=98.73828125, graphics_variation=1}, {x=46.1484375, y=99.328125, graphics_variation=1}, {x=60.46484375, y=98.2421875, graphics_variation=4}, {x=-58.3125, y=99.63671875, graphics_variation=4}, {x=-42.5625, y=100.453125, graphics_variation=4}, {x=25.2890625, y=99.72265625, graphics_variation=8}, {x=52.32421875, y=100.3046875, graphics_variation=5}, {x=-50.5625, y=103.16796875, graphics_variation=8}, {x=68.5859375, y=102.9296875, graphics_variation=6}, {x=84.73828125, y=101.5703125, graphics_variation=1}, {x=16.6015625, y=104.87890625, graphics_variation=6}, {x=87.3359375, y=103.93359375, graphics_variation=2}, {x=87.48828125, y=105.3828125, graphics_variation=7}, {x=-84.6171875, y=106.5390625, graphics_variation=8}, {x=-73.33203125, y=106.61328125, graphics_variation=1}, {x=-68.48828125, y=105.45703125, graphics_variation=5}, {x=-44.671875, y=107.37109375, graphics_variation=6}, {x=-30.41796875, y=105.87890625, graphics_variation=6}, {x=5.3515625, y=106.34765625, graphics_variation=6}, {x=21.5078125, y=107.25390625, graphics_variation=3}, {x=36.43359375, y=107.390625, graphics_variation=2}, {x=37.875, y=106.796875, graphics_variation=8}, {x=50.0234375, y=106.25390625, graphics_variation=4}, {x=56.80078125, y=106.578125, graphics_variation=3}, {x=57.97265625, y=106.546875, graphics_variation=8}, {x=74.4375, y=106.55078125, graphics_variation=1}, {x=78.484375, y=106.58203125, graphics_variation=3}, {x=5.2578125, y=107.59765625, graphics_variation=3}, {x=16.0078125, y=107.56640625, graphics_variation=6}, {x=29.3203125, y=108.25, graphics_variation=2}, {x=36.88671875, y=108.63671875, graphics_variation=2}, {x=68.53125, y=108.4765625, graphics_variation=8}, {x=87.6015625, y=109.078125, graphics_variation=2}, {x=5.4765625, y=110.03515625, graphics_variation=6}, {x=29.2890625, y=110.91015625, graphics_variation=2}, {x=33.30859375, y=110.171875, graphics_variation=1}, {x=33.48046875, y=111.078125, graphics_variation=4}, {x=84.23046875, y=110.55859375, graphics_variation=4}, {x=87.6015625, y=110.18359375, graphics_variation=2}, {x=-62.41015625, y=113.34765625, graphics_variation=5}, {x=5.2890625, y=113.19140625, graphics_variation=4}, {x=5.2890625, y=112.09765625, graphics_variation=1}, {x=29.3203125, y=112.91796875, graphics_variation=7}, {x=29.515625, y=111.81640625, graphics_variation=4}, {x=33.734375, y=112.01171875, graphics_variation=7}, {x=-61.5625, y=114.46484375, graphics_variation=5}, {x=-61.3515625, y=113.50390625, graphics_variation=3}, {x=-62.5390625, y=114.265625, graphics_variation=8}, {x=17.703125, y=115.3671875, graphics_variation=2}, {x=36.3203125, y=113.87109375, graphics_variation=8}, {x=72.54296875, y=114.3515625, graphics_variation=1}, {x=82.65625, y=114.3125, graphics_variation=6}, {x=-80.47265625, y=115.4765625, graphics_variation=6}, {x=-72.125, y=115.66796875, graphics_variation=4}, {x=-55.75, y=117.24609375, graphics_variation=6}, {x=-50.01953125, y=115.46875, graphics_variation=6}, {x=-38.68359375, y=115.60546875, graphics_variation=6}, {x=-33.21875, y=115.625, graphics_variation=1}, {x=7.015625, y=116.78515625, graphics_variation=7}, {x=54.6640625, y=115.9296875, graphics_variation=1}, {x=59.734375, y=116.30859375, graphics_variation=7}, {x=74.58203125, y=115.9921875, graphics_variation=8}, {x=-80.453125, y=117.51953125, graphics_variation=2}, {x=7.10546875, y=119.03515625, graphics_variation=8}, {x=7.7578125, y=118.12890625, graphics_variation=6}, {x=29.3515625, y=118.18359375, graphics_variation=7}, {x=38.171875, y=119.26953125, graphics_variation=3}, {x=91.0703125, y=119.34765625, graphics_variation=3}, {x=-79.0234375, y=120.375, graphics_variation=1}, {x=3.4453125, y=120.81640625, graphics_variation=6}, {x=5.34375, y=121.078125, graphics_variation=1}, {x=7.19921875, y=120.73046875, graphics_variation=1}, {x=6.109375, y=120.08203125, graphics_variation=6}, {x=15.5625, y=119.94921875, graphics_variation=7}, {x=25.3828125, y=119.58984375, graphics_variation=3}, {x=27.7578125, y=120.68359375, graphics_variation=2}, {x=52.50390625, y=121.3125, graphics_variation=3}, {x=56.625, y=120.890625, graphics_variation=5}, {x=84.58203125, y=120.51171875, graphics_variation=1}, {x=83.67578125, y=120.3984375, graphics_variation=4}, {x=5.25, y=122.0078125, graphics_variation=8}, {x=36.515625, y=121.734375, graphics_variation=6}, {x=36.57421875, y=122.83203125, graphics_variation=8}, {x=84.49609375, y=121.55859375, graphics_variation=1}, {x=91.640625, y=121.75, graphics_variation=1}, {x=5.3828125, y=124.06640625, graphics_variation=5}, {x=44.78125, y=124.640625, graphics_variation=4}, {x=-65.41015625, y=127.4375, graphics_variation=1}, {x=-40.48046875, y=127.203125, graphics_variation=7}, {x=-39.30078125, y=126.3828125, graphics_variation=5}, {x=-38.09765625, y=127.0234375, graphics_variation=6}, {x=49.11328125, y=126.140625, graphics_variation=4}, {x=76.6953125, y=127.2578125, graphics_variation=3}, {x=-68.640625, y=129.20703125, graphics_variation=8}, {x=-62.3671875, y=128.62890625, graphics_variation=8}, {x=-39.5078125, y=127.6640625, graphics_variation=4}, {x=-36.2265625, y=127.6875, graphics_variation=4}, {x=-26.92578125, y=130.34765625, graphics_variation=3}, {x=0.609375, y=130.05859375, graphics_variation=7}, {x=2.890625, y=130.93359375, graphics_variation=1}, {x=5.953125, y=130.83984375, graphics_variation=5}, {x=29.7734375, y=129.8828125, graphics_variation=1}, {x=33.55859375, y=130.98046875, graphics_variation=1}, {x=-27.2265625, y=132.85546875, graphics_variation=4}, {x=-26.6015625, y=131.7734375, graphics_variation=5}, {x=33.4921875, y=133.015625, graphics_variation=5}, {x=33.6953125, y=131.91015625, graphics_variation=2}, {x=36.26171875, y=132.99609375, graphics_variation=4}, {x=52.5546875, y=131.5546875, graphics_variation=2}, {x=-53.234375, y=135.24609375, graphics_variation=8}, {x=-46.265625, y=135.24609375, graphics_variation=6}, {x=-44.453125, y=135.37109375, graphics_variation=6}, {x=-27.296875, y=133.78125, graphics_variation=5}, {x=-7.02734375, y=135.3203125, graphics_variation=5}, {x=33.62890625, y=134.32421875, graphics_variation=5}, {x=60.6015625, y=133.6015625, graphics_variation=4}, {x=72.40234375, y=133.625, graphics_variation=7}, {x=-45.359375, y=136.02734375, graphics_variation=8}, {x=-39.140625, y=137.33984375, graphics_variation=1}, {x=-29.890625, y=136.18359375, graphics_variation=3}, {x=-21.33984375, y=136.84765625, graphics_variation=4}, {x=-18.75390625, y=137.3125, graphics_variation=8}, {x=-19.296875, y=135.50390625, graphics_variation=7}, {x=-17.4921875, y=136.59765625, graphics_variation=8}, {x=-12.671875, y=136.52734375, graphics_variation=2}, {x=0.88671875, y=135.53125, graphics_variation=4}, {x=-0.54296875, y=135.63671875, graphics_variation=5}, {x=10.640625, y=137.40234375, graphics_variation=2}, {x=11.203125, y=135.77734375, graphics_variation=1}, {x=12.109375, y=135.80859375, graphics_variation=5}, {x=13.265625, y=135.90234375, graphics_variation=8}, {x=17.703125, y=136.08984375, graphics_variation=4}, {x=21.953125, y=136.80859375, graphics_variation=8}, {x=62.5234375, y=136.39453125, graphics_variation=3}, {x=63.4921875, y=136.26953125, graphics_variation=4}, {x=70.48828125, y=137.1328125, graphics_variation=8}, {x=87.3359375, y=135.61328125, graphics_variation=5}, {x=87.48828125, y=137.0625, graphics_variation=1}, {x=-41.171875, y=137.68359375, graphics_variation=8}, {x=-22.28515625, y=137.54296875, graphics_variation=1}, {x=-17.23828125, y=137.66796875, graphics_variation=7}, {x=20.765625, y=137.68359375, graphics_variation=3}, {x=53.66015625, y=137.5, graphics_variation=5}, {x=70.7734375, y=138.6875, graphics_variation=2}, {x=-54.125, y=141.12109375, graphics_variation=5}, {x=-41.796875, y=141.1875, graphics_variation=7}, {x=7.578125, y=140.44921875, graphics_variation=3}, {x=19.56640625, y=140.7421875, graphics_variation=8}, {x=44.5546875, y=140.80078125, graphics_variation=2}, {x=60.7109375, y=140.45703125, graphics_variation=1}, {x=63.0546875, y=140.67578125, graphics_variation=7}, {x=70.26171875, y=140.69921875, graphics_variation=6}, {x=80.69921875, y=140.77734375, graphics_variation=2}, {x=59.3359375, y=142.17578125, graphics_variation=4}, {x=76.6875, y=142.21484375, graphics_variation=3}, {x=-21.3671875, y=146.40234375, graphics_variation=2}, {x=73.72265625, y=145.5859375, graphics_variation=2}, {x=-16.421875, y=148.28125, graphics_variation=6}, {x=-7.7265625, y=148.55859375, graphics_variation=1}, {x=53.078125, y=151.1484375, graphics_variation=1}, {x=62.5625, y=150.84375, graphics_variation=3}, {x=63.58984375, y=151.30078125, graphics_variation=8}, {x=80.4921875, y=151.30078125, graphics_variation=6}, {x=91.578125, y=150.73046875, graphics_variation=8}, {x=64.9609375, y=151.64453125, graphics_variation=4}, {x=76.60546875, y=151.68359375, graphics_variation=1}, {x=82.28125, y=151.68359375, graphics_variation=8}, {x=91.12109375, y=151.64453125, graphics_variation=6}, }, + ["dead-tree-desert"] = {{x=-76.61328125, y=-126.16796875, graphics_variation=1}, {x=-86.5390625, y=-117.3125, graphics_variation=4}, {x=-27.921875, y=-117.9765625, graphics_variation=3}, {x=3.83984375, y=-106.90234375, graphics_variation=4}, {x=-53.47265625, y=-104.88671875, graphics_variation=1}, {x=-72.03515625, y=-102.9765625, graphics_variation=5}, {x=-28.3046875, y=-100.75390625, graphics_variation=7}, {x=-58.13671875, y=-99.09765625, graphics_variation=1}, {x=50.5078125, y=-100.01171875, graphics_variation=4}, {x=6.8671875, y=-97.7265625, graphics_variation=2}, {x=14.1640625, y=-96.85546875, graphics_variation=7}, {x=28.1953125, y=-95.0078125, graphics_variation=6}, {x=50.5390625, y=-91.07421875, graphics_variation=4}, {x=39.80859375, y=-88.546875, graphics_variation=5}, {x=5.38671875, y=-84.68359375, graphics_variation=6}, {x=-4.63671875, y=-82.94140625, graphics_variation=7}, {x=0.2578125, y=-83.8125, graphics_variation=3}, {x=9.87109375, y=-84.0703125, graphics_variation=8}, {x=-24.828125, y=-82.04296875, graphics_variation=8}, {x=-19.39453125, y=-81.6328125, graphics_variation=3}, {x=-14.8828125, y=-81.8125, graphics_variation=4}, {x=-10.55859375, y=-82.2734375, graphics_variation=10}, {x=-78.8125, y=-80.19921875, graphics_variation=7}, {x=-29.87890625, y=-78.9921875, graphics_variation=9}, {x=0.15625, y=-79.4296875, graphics_variation=1}, {x=5.0546875, y=-79.9921875, graphics_variation=5}, {x=-34.87890625, y=-77.5078125, graphics_variation=9}, {x=-10.1484375, y=-77.63671875, graphics_variation=3}, {x=-5.046875, y=-77.96875, graphics_variation=8}, {x=-30.0078125, y=-74.66015625, graphics_variation=4}, {x=5.2578125, y=-75.91796875, graphics_variation=8}, {x=47.265625, y=-76.24609375, graphics_variation=10}, {x=-35.16015625, y=-74.09765625, graphics_variation=1}, {x=17.87890625, y=-72.84765625, graphics_variation=8}, {x=79.125, y=-73.92578125, graphics_variation=1}, {x=84.05078125, y=-72.0859375, graphics_variation=7}, {x=84.0234375, y=-69.87890625, graphics_variation=1}, {x=-79.8046875, y=-57.1015625, graphics_variation=5}, {x=-34.421875, y=-52.30078125, graphics_variation=1}, {x=-71.98828125, y=-46.74609375, graphics_variation=3}, {x=-24.38671875, y=-41.4921875, graphics_variation=4}, {x=-73.3359375, y=-39.21875, graphics_variation=8}, {x=-76.53125, y=-36.98828125, graphics_variation=4}, {x=-74.63671875, y=-37.7890625, graphics_variation=3}, {x=-72.74609375, y=-34.21484375, graphics_variation=2}, {x=-8.51171875, y=-33.2734375, graphics_variation=2}, {x=84.41796875, y=-33.0078125, graphics_variation=2}, {x=-13.04296875, y=-30.52734375, graphics_variation=9}, {x=24.0625, y=-30.12890625, graphics_variation=4}, {x=28.51171875, y=-28.61328125, graphics_variation=4}, {x=-10.18359375, y=-25.03515625, graphics_variation=6}, {x=23.75, y=-21.1953125, graphics_variation=3}, {x=28.4765625, y=-20.43359375, graphics_variation=3}, {x=45.9140625, y=-22.171875, graphics_variation=3}, {x=26.71875, y=-16.36328125, graphics_variation=5}, {x=3.5390625, y=-13.609375, graphics_variation=7}, {x=-13.43359375, y=-6.46484375, graphics_variation=3}, {x=0.921875, y=-7.25390625, graphics_variation=3}, {x=-2.21875, y=-3.76953125, graphics_variation=6}, {x=-95.44921875, y=0.56640625, graphics_variation=9}, {x=-0.60546875, y=0.4140625, graphics_variation=8}, {x=-1.91015625, y=23.8671875, graphics_variation=3}, {x=91.125, y=53.2109375, graphics_variation=9}, {x=-57.51953125, y=141.3828125, graphics_variation=2}, {x=-45.99609375, y=141.0703125, graphics_variation=9}, {x=-50.9296875, y=141.69140625, graphics_variation=7}, {x=-59.12109375, y=146.171875, graphics_variation=8}, {x=-53.32421875, y=146.06640625, graphics_variation=1}, {x=-46.1484375, y=146.1015625, graphics_variation=10}, {x=-39.73046875, y=146.4453125, graphics_variation=7}, {x=-33.0390625, y=146.34375, graphics_variation=9}, {x=41.4453125, y=145.7734375, graphics_variation=6}, {x=48.68359375, y=146.078125, graphics_variation=3}, {x=57.140625, y=145.88671875, graphics_variation=5}, {x=67.03125, y=145.7734375, graphics_variation=9}, {x=75.4140625, y=145.7734375, graphics_variation=2}, {x=81.96484375, y=146, graphics_variation=4}, {x=-21.09765625, y=149.60546875, graphics_variation=9}, }, + ["rock-huge-beige"] = {{x=-77.51171875, y=-118.7109375, graphics_variation=15}, {x=59.4296875, y=-103.984375, graphics_variation=2}, {x=-87.66796875, y=-98.6796875, graphics_variation=4}, {x=-6.17578125, y=-95.66015625, graphics_variation=11}, {x=33.68359375, y=-95.23046875, graphics_variation=14}, {x=26.71484375, y=-92.83203125, graphics_variation=8}, {x=-73.34375, y=-86.3828125, graphics_variation=8}, {x=0.4765625, y=-87.76171875, graphics_variation=13}, {x=-38.60546875, y=-80.0390625, graphics_variation=9}, {x=-83.43359375, y=-79.10546875, graphics_variation=3}, {x=86.55078125, y=-76.5625, graphics_variation=6}, {x=21.44921875, y=-72.47265625, graphics_variation=12}, {x=74.68359375, y=-67.26953125, graphics_variation=9}, {x=-83.3046875, y=-59.4921875, graphics_variation=11}, {x=-16.5859375, y=-52.234375, graphics_variation=12}, {x=-73.1796875, y=-43.5078125, graphics_variation=9}, {x=-28.1953125, y=-42.0703125, graphics_variation=14}, {x=88.41796875, y=-35.23046875, graphics_variation=1}, {x=-46.33203125, y=-31.4296875, graphics_variation=2}, {x=25.953125, y=-27.8515625, graphics_variation=3}, {x=6.0703125, y=8.16796875, graphics_variation=2}, {x=3.484375, y=17.44921875, graphics_variation=11}, {x=3.50390625, y=28.52734375, graphics_variation=16}, {x=-94.38671875, y=44.1640625, graphics_variation=12}, {x=-84.4765625, y=80.89453125, graphics_variation=8}, {x=-69.9921875, y=85.5859375, graphics_variation=4}, {x=-84.32421875, y=87.6953125, graphics_variation=4}, {x=-61.0625, y=141.02734375, graphics_variation=10}, {x=18.68359375, y=143.18359375, graphics_variation=5}, {x=-66.6875, y=149.89453125, graphics_variation=7}, {x=86.765625, y=150.56640625, graphics_variation=13}, }, + ["sand-decal-tan-ruin"] = {{x=-76.79296875, y=-116.49609375, graphics_variation=17}, {x=3.34375, y=-103.74609375, graphics_variation=14}, {x=-81.7890625, y=-102.1640625, graphics_variation=8}, {x=66.296875, y=-101.51953125, graphics_variation=18}, {x=70.09375, y=-100.79296875, graphics_variation=24}, {x=-5.64453125, y=-97.44140625, graphics_variation=9}, {x=78.58984375, y=-97.8359375, graphics_variation=21}, {x=-1.46875, y=-87.1640625, graphics_variation=26}, {x=3.65234375, y=-87.67578125, graphics_variation=23}, {x=67.8203125, y=-87.25, graphics_variation=23}, {x=-72.16796875, y=-77.79296875, graphics_variation=18}, {x=37.703125, y=-74.49609375, graphics_variation=21}, {x=47.6875, y=-74.95703125, graphics_variation=22}, {x=19.3671875, y=-72.73828125, graphics_variation=2}, {x=-78.3125, y=-57.578125, graphics_variation=2}, {x=-65.1796875, y=-57.83984375, graphics_variation=23}, {x=66.484375, y=-57.9296875, graphics_variation=13}, {x=79.390625, y=-56.86328125, graphics_variation=20}, {x=74.97265625, y=-53.171875, graphics_variation=17}, {x=-14.0078125, y=-51.9765625, graphics_variation=8}, {x=-68.265625, y=-47.08203125, graphics_variation=29}, {x=29.5, y=-41.22265625, graphics_variation=23}, {x=33.73046875, y=-41.46875, graphics_variation=11}, {x=46.78515625, y=-41.41796875, graphics_variation=16}, {x=64.859375, y=-41.08203125, graphics_variation=29}, {x=-26.67578125, y=-40.33203125, graphics_variation=22}, {x=-76.80078125, y=-34.328125, graphics_variation=26}, {x=-44.9453125, y=-29.94140625, graphics_variation=24}, {x=-81.03125, y=-21.14453125, graphics_variation=2}, {x=-31.1953125, y=-20.80859375, graphics_variation=16}, {x=-33.47265625, y=-5.75390625, graphics_variation=23}, {x=-89.53515625, y=17.40234375, graphics_variation=30}, {x=-75.921875, y=23.42578125, graphics_variation=12}, {x=1.89453125, y=56.75, graphics_variation=18}, {x=43.38671875, y=60.5, graphics_variation=28}, {x=52.5546875, y=59.16796875, graphics_variation=11}, {x=55.33203125, y=60.92578125, graphics_variation=3}, {x=65.30078125, y=60.21875, graphics_variation=26}, {x=73.43359375, y=60.74609375, graphics_variation=11}, {x=9.44921875, y=63.5859375, graphics_variation=12}, {x=37.83203125, y=64.62890625, graphics_variation=10}, {x=-91.71875, y=71.5390625, graphics_variation=18}, {x=36.6328125, y=72.6796875, graphics_variation=26}, {x=7.7734375, y=73.26171875, graphics_variation=10}, {x=26.84765625, y=76.9609375, graphics_variation=11}, {x=-91.53125, y=77.95703125, graphics_variation=11}, {x=-83.40234375, y=78.046875, graphics_variation=30}, {x=5.24609375, y=81.41015625, graphics_variation=26}, {x=65.95703125, y=87.95703125, graphics_variation=24}, {x=26.3125, y=91.29296875, graphics_variation=24}, {x=26.5078125, y=99.3515625, graphics_variation=30}, {x=65.890625, y=101.0625, graphics_variation=6}, {x=79.5546875, y=101.8984375, graphics_variation=8}, {x=-90.55859375, y=106.26953125, graphics_variation=13}, {x=53.5703125, y=110.44140625, graphics_variation=9}, {x=26.70703125, y=114.828125, graphics_variation=21}, {x=-82.1640625, y=116.13671875, graphics_variation=7}, {x=83.88671875, y=115.421875, graphics_variation=22}, {x=-30.41796875, y=121.52734375, graphics_variation=10}, {x=-0.83203125, y=121.30859375, graphics_variation=11}, {x=26.734375, y=122.55078125, graphics_variation=13}, {x=83.3203125, y=122.796875, graphics_variation=15}, {x=-0.86328125, y=130.734375, graphics_variation=19}, {x=26.46484375, y=130.515625, graphics_variation=27}, {x=83.24609375, y=131.1953125, graphics_variation=30}, {x=-17.28515625, y=133.38671875, graphics_variation=18}, {x=65.70703125, y=137.3359375, graphics_variation=10}, {x=82.3359375, y=137.94921875, graphics_variation=12}, {x=-55.14453125, y=140.49609375, graphics_variation=23}, {x=-41.5, y=140.0546875, graphics_variation=7}, {x=49.84765625, y=141.80859375, graphics_variation=22}, {x=53.08984375, y=141.81640625, graphics_variation=8}, {x=67.50390625, y=141.609375, graphics_variation=3}, {x=83.76171875, y=141.13671875, graphics_variation=13}, {x=6.01953125, y=143.5625, graphics_variation=27}, {x=61.98046875, y=145.6796875, graphics_variation=8}, {x=63.62109375, y=145.421875, graphics_variation=5}, {x=-15.8203125, y=148.359375, graphics_variation=7}, {x=89.36328125, y=151.03515625, graphics_variation=13}, }, + ["dry-tree"] = {{x=-73.359375, y=-114.515625, graphics_variation=7}, {x=-67.890625, y=-113.9921875, graphics_variation=6}, {x=-59.7734375, y=-112.6875, graphics_variation=8}, {x=-52.8828125, y=-112.45703125, graphics_variation=6}, {x=-76.91015625, y=-111.44921875, graphics_variation=5}, {x=-71.1484375, y=-111.171875, graphics_variation=4}, {x=-66.23046875, y=-110.921875, graphics_variation=6}, {x=-45.1015625, y=-110.26953125, graphics_variation=5}, {x=-64.2109375, y=-108.50390625, graphics_variation=2}, {x=-56.03125, y=-108.54296875, graphics_variation=6}, {x=-50.71875, y=-109.0703125, graphics_variation=1}, {x=-33.328125, y=-108.5234375, graphics_variation=2}, {x=-27.29296875, y=-108.48046875, graphics_variation=9}, {x=-74.11328125, y=-106.7578125, graphics_variation=5}, {x=-68.8984375, y=-107.703125, graphics_variation=1}, {x=-38.94140625, y=-107.93359375, graphics_variation=7}, {x=-21.3203125, y=-108.1875, graphics_variation=6}, {x=-15.74609375, y=-107.28125, graphics_variation=4}, {x=-77.796875, y=-104.359375, graphics_variation=2}, {x=-66.3125, y=-104.40234375, graphics_variation=1}, {x=-62.25390625, y=-105.47265625, graphics_variation=6}, {x=-48.59375, y=-104.84375, graphics_variation=7}, {x=-42.95703125, y=-106, graphics_variation=7}, {x=-35.9765625, y=-104.67578125, graphics_variation=2}, {x=-31.22265625, y=-105.07421875, graphics_variation=2}, {x=-25.56640625, y=-105.22265625, graphics_variation=5}, {x=-45.859375, y=-102.296875, graphics_variation=5}, {x=-18.54296875, y=-103.265625, graphics_variation=4}, {x=-13.01171875, y=-102.55078125, graphics_variation=2}, {x=-64.08203125, y=-101.2890625, graphics_variation=9}, {x=-60.15234375, y=-101.4765625, graphics_variation=8}, {x=-52.0546875, y=-101.60546875, graphics_variation=4}, {x=-40.9375, y=-101.8984375, graphics_variation=1}, {x=-34.1875, y=-101.79296875, graphics_variation=9}, {x=-23.9296875, y=-101.58203125, graphics_variation=8}, {x=-11.60546875, y=-100.53125, graphics_variation=6}, {x=-79.6875, y=-100.02734375, graphics_variation=6}, {x=-74.68359375, y=-98.9765625, graphics_variation=2}, {x=-70.09765625, y=-99.125, graphics_variation=4}, {x=-39.046875, y=-98.953125, graphics_variation=4}, {x=-16.71484375, y=-99.48046875, graphics_variation=4}, {x=-62.37890625, y=-97, graphics_variation=9}, {x=-49.4453125, y=-97.484375, graphics_variation=6}, {x=-26.26171875, y=-96.89453125, graphics_variation=9}, {x=-9.69140625, y=-96.4921875, graphics_variation=6}, {x=-77.015625, y=-95.33984375, graphics_variation=5}, {x=-72.390625, y=-94.94140625, graphics_variation=3}, {x=-66.7109375, y=-94.30859375, graphics_variation=8}, {x=-48.2265625, y=-94.5390625, graphics_variation=5}, {x=-37.11328125, y=-95.80078125, graphics_variation=9}, {x=-31.49609375, y=-95.73828125, graphics_variation=8}, {x=-14.71875, y=-95.31640625, graphics_variation=7}, {x=-60.61328125, y=-93.40234375, graphics_variation=1}, {x=-29.984375, y=-92.33203125, graphics_variation=4}, {x=-24.8515625, y=-93.296875, graphics_variation=9}, {x=-19.08984375, y=-93.9921875, graphics_variation=5}, {x=-74.2421875, y=-90.87890625, graphics_variation=1}, {x=-45.7890625, y=-90.2890625, graphics_variation=1}, {x=-39.046875, y=-90.41796875, graphics_variation=2}, {x=-34.41796875, y=-91.40625, graphics_variation=2}, {x=-68.7734375, y=-89.703125, graphics_variation=9}, {x=-63.34765625, y=-89.890625, graphics_variation=5}, {x=-57.33203125, y=-89.34375, graphics_variation=5}, {x=-51.55078125, y=-89.40625, graphics_variation=3}, }, + ["rock-big-beige"] = {{x=-48.3984375, y=-114.3046875, graphics_variation=2}, {x=-4, y=-109.9765625, graphics_variation=15}, {x=-82.58203125, y=-103.1796875, graphics_variation=5}, {x=10.5234375, y=-103.25390625, graphics_variation=6}, {x=33.1640625, y=-103.04296875, graphics_variation=5}, {x=7.7578125, y=-101.3671875, graphics_variation=2}, {x=56.52734375, y=-102.05078125, graphics_variation=3}, {x=58.87890625, y=-101.21875, graphics_variation=12}, {x=-53.83203125, y=-98.9921875, graphics_variation=1}, {x=1.89453125, y=-99.984375, graphics_variation=8}, {x=-7.4453125, y=-97.921875, graphics_variation=3}, {x=25.1875, y=-95.0078125, graphics_variation=10}, {x=-53.2578125, y=-86.8203125, graphics_variation=11}, {x=-51.203125, y=-86, graphics_variation=19}, {x=13.3515625, y=-84.3125, graphics_variation=6}, {x=73.62890625, y=-81.1640625, graphics_variation=5}, {x=38.8828125, y=-76.03125, graphics_variation=5}, {x=41.2578125, y=-75.9375, graphics_variation=2}, {x=44.2890625, y=-75.1875, graphics_variation=2}, {x=38.1953125, y=-73.59375, graphics_variation=20}, {x=59.015625, y=-72.7109375, graphics_variation=10}, {x=80.953125, y=-71.7734375, graphics_variation=12}, {x=-74.2265625, y=-61.88671875, graphics_variation=15}, {x=78.26171875, y=-50.2109375, graphics_variation=16}, {x=-70.48828125, y=-42.82421875, graphics_variation=8}, {x=-70.23828125, y=-40.29296875, graphics_variation=2}, {x=52.6171875, y=-40.4375, graphics_variation=7}, {x=-88.11328125, y=-39.16796875, graphics_variation=2}, {x=-9.828125, y=-28.64453125, graphics_variation=7}, {x=7.5, y=-23.8046875, graphics_variation=6}, {x=27.5234375, y=-14.5, graphics_variation=14}, {x=52.10546875, y=-15.8359375, graphics_variation=15}, {x=3.53515625, y=-12.05078125, graphics_variation=5}, {x=-11.46875, y=9.76953125, graphics_variation=12}, {x=3.0546875, y=9.578125, graphics_variation=3}, {x=-89.20703125, y=16.45703125, graphics_variation=17}, {x=-20.95703125, y=27.21875, graphics_variation=12}, {x=-2.42578125, y=28.55859375, graphics_variation=17}, {x=-85.8515625, y=64.25, graphics_variation=8}, {x=-84.0234375, y=68.9296875, graphics_variation=14}, {x=-90.75390625, y=75.28515625, graphics_variation=13}, {x=-72.109375, y=78.75, graphics_variation=12}, {x=-11.796875, y=101.796875, graphics_variation=6}, {x=-87.12109375, y=116.73828125, graphics_variation=4}, {x=61.8046875, y=122.93359375, graphics_variation=13}, {x=10.82421875, y=146.3125, graphics_variation=6}, {x=91.13671875, y=147.31640625, graphics_variation=15}, {x=39.41796875, y=151.03515625, graphics_variation=18}, }, + ["sand-decal-white-ruin"] = {{x=3.19140625, y=-109.27734375, graphics_variation=3}, {x=-5.453125, y=-107.1328125, graphics_variation=13}, {x=57.109375, y=-96.5625, graphics_variation=7}, {x=62.65625, y=-94.84765625, graphics_variation=4}, {x=65.7578125, y=-93.16015625, graphics_variation=10}, {x=73.796875, y=-92.7734375, graphics_variation=5}, {x=23.87890625, y=-91, graphics_variation=24}, {x=75.1171875, y=-90.15625, graphics_variation=30}, {x=69.69140625, y=-71.9140625, graphics_variation=26}, {x=-79.32421875, y=-68.2890625, graphics_variation=1}, {x=-79.32421875, y=-68.2890625, graphics_variation=1}, {x=-47.73828125, y=-68.83203125, graphics_variation=23}, {x=63.1015625, y=-66.90625, graphics_variation=22}, {x=-40.85546875, y=-63.08203125, graphics_variation=3}, {x=-22.71484375, y=-63.10546875, graphics_variation=23}, {x=-11.32421875, y=-63.2421875, graphics_variation=21}, {x=4.92578125, y=-63.328125, graphics_variation=3}, {x=77.0234375, y=-63.23046875, graphics_variation=5}, {x=84.45703125, y=-63.29296875, graphics_variation=21}, {x=30.35546875, y=-60.1484375, graphics_variation=23}, {x=46.1171875, y=-59.31640625, graphics_variation=20}, {x=74.48828125, y=-59.62109375, graphics_variation=22}, {x=69.87109375, y=-57.96484375, graphics_variation=9}, {x=14.79296875, y=-56.81640625, graphics_variation=28}, {x=29.0859375, y=-55.78125, graphics_variation=8}, {x=39.65625, y=-55.83203125, graphics_variation=13}, {x=46.44921875, y=-55.98046875, graphics_variation=26}, {x=69.71875, y=-53.8046875, graphics_variation=17}, {x=32.34375, y=-49.19921875, graphics_variation=20}, {x=45.07421875, y=-47.140625, graphics_variation=20}, {x=71.27734375, y=-46.7890625, graphics_variation=23}, {x=71.61328125, y=-42.34375, graphics_variation=20}, {x=12.59375, y=-37.5234375, graphics_variation=13}, {x=60.5, y=-33.921875, graphics_variation=26}, {x=63.44140625, y=-32.96484375, graphics_variation=11}, {x=12.13671875, y=-26.375, graphics_variation=22}, {x=63.80859375, y=-25.9375, graphics_variation=11}, {x=68.37890625, y=-25.7734375, graphics_variation=15}, {x=75.76953125, y=-25.12890625, graphics_variation=22}, {x=-49.83984375, y=-21.62109375, graphics_variation=29}, {x=-38.8046875, y=-21.47265625, graphics_variation=4}, {x=-63.99609375, y=-20.6796875, graphics_variation=28}, {x=67.45703125, y=-18.640625, graphics_variation=1}, {x=-70.15625, y=-15.0625, graphics_variation=23}, {x=-38.05078125, y=-15.453125, graphics_variation=8}, {x=12.50390625, y=-15.49609375, graphics_variation=29}, {x=-59.13671875, y=-14.859375, graphics_variation=8}, {x=61.29296875, y=-14.25, graphics_variation=24}, {x=-80.02734375, y=-9.3046875, graphics_variation=1}, {x=-70.53125, y=-9.05078125, graphics_variation=3}, {x=-55.12109375, y=-10.37109375, graphics_variation=2}, {x=-39.65625, y=-9.62109375, graphics_variation=19}, {x=-26.23828125, y=-9.33984375, graphics_variation=18}, {x=26.39453125, y=-4.60546875, graphics_variation=18}, {x=-66.16796875, y=-2.734375, graphics_variation=23}, {x=-32.05859375, y=-1.29296875, graphics_variation=10}, {x=12.8359375, y=-1.21875, graphics_variation=12}, {x=41.921875, y=-1.65625, graphics_variation=1}, {x=-46.79296875, y=0.9296875, graphics_variation=7}, {x=-44.81640625, y=-0.29296875, graphics_variation=10}, {x=77.375, y=0.125, graphics_variation=20}, {x=14.78515625, y=3.70703125, graphics_variation=16}, {x=52.08203125, y=3.9609375, graphics_variation=28}, {x=-84.51171875, y=5.65625, graphics_variation=11}, {x=17.04296875, y=5.08203125, graphics_variation=26}, {x=28.62890625, y=8.3515625, graphics_variation=18}, {x=55.51171875, y=7.5625, graphics_variation=2}, {x=72.78515625, y=7.87109375, graphics_variation=28}, {x=-56.9296875, y=12.953125, graphics_variation=1}, {x=-26.42578125, y=11.71484375, graphics_variation=17}, {x=58.4296875, y=11.8203125, graphics_variation=5}, {x=-71.75, y=17.015625, graphics_variation=14}, {x=22.2265625, y=17.9921875, graphics_variation=25}, {x=46.10546875, y=18.85546875, graphics_variation=26}, {x=-39.99609375, y=20.80078125, graphics_variation=3}, {x=-31.65234375, y=20.95703125, graphics_variation=12}, {x=14.11328125, y=19.51171875, graphics_variation=19}, {x=-37.09765625, y=22.5859375, graphics_variation=6}, {x=-85.41796875, y=23.9921875, graphics_variation=29}, {x=-70.9375, y=23.94921875, graphics_variation=10}, {x=-54.53515625, y=23.67578125, graphics_variation=12}, {x=-44.4921875, y=23.9453125, graphics_variation=27}, {x=-39.9453125, y=23.57421875, graphics_variation=6}, {x=50.79296875, y=26.46484375, graphics_variation=18}, {x=14.421875, y=28.34765625, graphics_variation=1}, {x=71.76953125, y=27.9296875, graphics_variation=19}, {x=41.21875, y=33.65625, graphics_variation=29}, {x=-3.98828125, y=35.7578125, graphics_variation=3}, {x=17.40625, y=36.828125, graphics_variation=24}, {x=-72.2734375, y=38.12890625, graphics_variation=12}, {x=-42.0703125, y=38.46875, graphics_variation=16}, {x=-12.6796875, y=37.26171875, graphics_variation=20}, {x=-26.61328125, y=40.921875, graphics_variation=2}, {x=-3.91015625, y=40.50390625, graphics_variation=6}, {x=28.13671875, y=39.24609375, graphics_variation=11}, {x=-50.546875, y=41.91796875, graphics_variation=10}, {x=0.5390625, y=43.30859375, graphics_variation=28}, {x=9.015625, y=44.69921875, graphics_variation=12}, {x=18.4140625, y=43.66796875, graphics_variation=30}, {x=55.43359375, y=43.2578125, graphics_variation=4}, {x=77.98046875, y=44.80859375, graphics_variation=4}, {x=-86.62890625, y=46.27734375, graphics_variation=28}, {x=2.25, y=48.83984375, graphics_variation=27}, {x=-6.70703125, y=49.2265625, graphics_variation=21}, {x=-82.9375, y=54.9765625, graphics_variation=24}, {x=8.28515625, y=56.08203125, graphics_variation=28}, {x=-72.8828125, y=58.29296875, graphics_variation=25}, {x=-2.38671875, y=59.51953125, graphics_variation=3}, {x=9.8125, y=62.3203125, graphics_variation=12}, {x=-80.046875, y=65.203125, graphics_variation=29}, {x=-13.3359375, y=65.97265625, graphics_variation=7}, {x=-67.76171875, y=68.33984375, graphics_variation=2}, {x=2.41015625, y=67.2734375, graphics_variation=7}, {x=-58.08984375, y=69.25, graphics_variation=22}, {x=-30.140625, y=71.05859375, graphics_variation=21}, {x=14.7734375, y=72.1796875, graphics_variation=27}, {x=-83.46875, y=74.33203125, graphics_variation=24}, {x=-80.35546875, y=74.890625, graphics_variation=26}, {x=-0.578125, y=74.32421875, graphics_variation=28}, {x=6.12109375, y=73.45703125, graphics_variation=15}, {x=22.2265625, y=73.93359375, graphics_variation=24}, {x=-58.9375, y=80.42578125, graphics_variation=5}, {x=-54.33203125, y=81.75, graphics_variation=30}, {x=5.30859375, y=88.64453125, graphics_variation=10}, {x=19.15625, y=90.5859375, graphics_variation=22}, {x=-63.390625, y=94.69140625, graphics_variation=1}, {x=-81.35546875, y=95.046875, graphics_variation=21}, {x=14.91796875, y=95.26953125, graphics_variation=28}, {x=9.7578125, y=98.71484375, graphics_variation=6}, {x=20.72265625, y=100.5859375, graphics_variation=26}, {x=-72.30859375, y=101.96484375, graphics_variation=3}, {x=-73.15234375, y=106.28515625, graphics_variation=3}, {x=5.4609375, y=108.83203125, graphics_variation=20}, {x=-81.75, y=110.65625, graphics_variation=29}, {x=-62.98046875, y=113.828125, graphics_variation=20}, {x=-79.3203125, y=116.6796875, graphics_variation=20}, {x=22.25390625, y=115.45703125, graphics_variation=21}, {x=7.01953125, y=119.7109375, graphics_variation=24}, {x=-73.46484375, y=122.4375, graphics_variation=18}, {x=-68.8671875, y=122.79296875, graphics_variation=18}, {x=-55.08984375, y=122.875, graphics_variation=9}, {x=-45.875, y=122.39453125, graphics_variation=12}, {x=-35.1796875, y=122.77734375, graphics_variation=9}, {x=-21.57421875, y=122.5078125, graphics_variation=23}, {x=-15.94140625, y=122.9140625, graphics_variation=3}, {x=-38.5234375, y=126.640625, graphics_variation=29}, {x=23.5390625, y=128.5234375, graphics_variation=17}, {x=-20.26953125, y=130.3359375, graphics_variation=28}, {x=-57.68359375, y=131.515625, graphics_variation=23}, {x=-33.84375, y=131.10546875, graphics_variation=19}, {x=-3.140625, y=131.39453125, graphics_variation=26}, {x=9.41015625, y=131.58203125, graphics_variation=21}, {x=-6.9921875, y=133.10546875, graphics_variation=6}, {x=-45.09375, y=135.6328125, graphics_variation=5}, {x=13.04296875, y=135.12109375, graphics_variation=27}, {x=20.7734375, y=136.7421875, graphics_variation=29}, {x=-19.65625, y=137.8046875, graphics_variation=12}, {x=-18.94140625, y=143.85546875, graphics_variation=6}, {x=-6.84375, y=144.21875, graphics_variation=10}, {x=-14.140625, y=146.78125, graphics_variation=8}, }, + ["dead-dry-hairy-tree"] = {{x=1.546875, y=-102.47265625, graphics_variation=1}, }, + ["sand-decal-black-ruin"] = {{x=67.73046875, y=-102.39453125, graphics_variation=20}, {x=71.27734375, y=-100.0859375, graphics_variation=28}, {x=55.34765625, y=-88.1640625, graphics_variation=2}, {x=60.7734375, y=-88.70703125, graphics_variation=29}, {x=67.8203125, y=-84.3359375, graphics_variation=20}, {x=-67.6171875, y=-75.4765625, graphics_variation=23}, {x=-60.1875, y=-76.94921875, graphics_variation=27}, {x=-53.3671875, y=-76.59375, graphics_variation=23}, {x=-65.90234375, y=-70.72265625, graphics_variation=27}, {x=-58.66796875, y=-70.7578125, graphics_variation=22}, {x=-67.9375, y=-63.44140625, graphics_variation=1}, {x=-5.65234375, y=-63.5546875, graphics_variation=21}, {x=1.8828125, y=-63.80078125, graphics_variation=8}, {x=-68.09375, y=-61.953125, graphics_variation=12}, {x=-54.1015625, y=-62.640625, graphics_variation=7}, {x=-37.046875, y=-61.08984375, graphics_variation=2}, {x=-33.19921875, y=-62.73828125, graphics_variation=22}, {x=-27.58203125, y=-62.34375, graphics_variation=10}, {x=13.09375, y=-61.7734375, graphics_variation=23}, {x=62.99609375, y=-62.02734375, graphics_variation=24}, {x=66.9453125, y=-62.12890625, graphics_variation=24}, {x=-60.89453125, y=-60.6328125, graphics_variation=15}, {x=64.73828125, y=-58.42578125, graphics_variation=22}, {x=76.55859375, y=-54.3046875, graphics_variation=17}, {x=51.81640625, y=-50.93359375, graphics_variation=13}, {x=64.890625, y=-45.8984375, graphics_variation=1}, {x=66.50390625, y=-37.9609375, graphics_variation=18}, {x=71.8046875, y=-36.8125, graphics_variation=19}, {x=80.4296875, y=-30.1015625, graphics_variation=15}, {x=-82.5859375, y=-22.19921875, graphics_variation=10}, {x=-79.17578125, y=-22.12109375, graphics_variation=22}, {x=-75.5078125, y=-21.0078125, graphics_variation=7}, {x=-33.77734375, y=-21.4453125, graphics_variation=2}, {x=-30.625, y=-19.625, graphics_variation=4}, {x=80.046875, y=-20.68359375, graphics_variation=7}, {x=-80.2421875, y=-17.83203125, graphics_variation=21}, {x=-76.41015625, y=-14.72265625, graphics_variation=21}, {x=-29.8203125, y=-14.84375, graphics_variation=22}, {x=65.26953125, y=-13.0625, graphics_variation=22}, {x=80.375, y=-13.70703125, graphics_variation=27}, {x=62.90234375, y=-11.5, graphics_variation=23}, {x=63.3203125, y=-12.34765625, graphics_variation=18}, {x=14.12890625, y=-10.109375, graphics_variation=13}, {x=72.140625, y=-9.59765625, graphics_variation=2}, {x=67.2734375, y=-3.90625, graphics_variation=10}, {x=73.0234375, y=-4.94921875, graphics_variation=14}, {x=79.109375, y=-3.73828125, graphics_variation=22}, {x=58.81640625, y=-2.203125, graphics_variation=22}, {x=62.04296875, y=-2.0859375, graphics_variation=3}, {x=17.68359375, y=4.4609375, graphics_variation=13}, {x=62.015625, y=9.78125, graphics_variation=29}, {x=66.984375, y=12.88671875, graphics_variation=14}, {x=12.74609375, y=13.3046875, graphics_variation=5}, {x=78.875, y=13.48828125, graphics_variation=24}, {x=80.3046875, y=16.64453125, graphics_variation=23}, {x=62.5703125, y=20.640625, graphics_variation=3}, {x=-82.93359375, y=27.8515625, graphics_variation=3}, {x=-69.1796875, y=27.48046875, graphics_variation=11}, {x=-32.35546875, y=27.83203125, graphics_variation=21}, {x=61.859375, y=27.0859375, graphics_variation=23}, {x=-76.9453125, y=30.59765625, graphics_variation=1}, {x=-57.50390625, y=29.05859375, graphics_variation=2}, {x=-46.84765625, y=30.50390625, graphics_variation=25}, {x=-70.78125, y=31.71875, graphics_variation=21}, {x=-64.453125, y=31.7109375, graphics_variation=6}, {x=-54.63671875, y=32.43359375, graphics_variation=11}, {x=-37.05859375, y=31.07421875, graphics_variation=4}, {x=-29.2421875, y=31.1015625, graphics_variation=29}, {x=66.5859375, y=32.22265625, graphics_variation=24}, {x=-60.44140625, y=34.09375, graphics_variation=11}, {x=62.48828125, y=33.375, graphics_variation=28}, {x=-79.26953125, y=35.578125, graphics_variation=3}, {x=66.2890625, y=38.00390625, graphics_variation=1}, {x=-66.16796875, y=43.96484375, graphics_variation=9}, {x=-79.5859375, y=46.5390625, graphics_variation=12}, {x=-75.75, y=46.95703125, graphics_variation=23}, {x=-68.4609375, y=47.515625, graphics_variation=20}, {x=-18.453125, y=47.734375, graphics_variation=3}, {x=22.38671875, y=48.49609375, graphics_variation=1}, {x=37.64453125, y=48.671875, graphics_variation=28}, {x=50.53125, y=48.73046875, graphics_variation=28}, {x=66.5078125, y=48.390625, graphics_variation=17}, {x=75.37890625, y=47.125, graphics_variation=15}, {x=-76.328125, y=51.65234375, graphics_variation=26}, {x=-27.8515625, y=51.31640625, graphics_variation=24}, {x=20.07421875, y=53.80859375, graphics_variation=21}, {x=-77.8671875, y=55.61328125, graphics_variation=6}, {x=-63.4765625, y=55.07421875, graphics_variation=11}, {x=24.37109375, y=56.59375, graphics_variation=26}, {x=-80.421875, y=57.6484375, graphics_variation=5}, {x=-76.4765625, y=58.515625, graphics_variation=13}, {x=43.87109375, y=60.515625, graphics_variation=27}, {x=52.265625, y=60.453125, graphics_variation=30}, {x=63.0703125, y=60.46484375, graphics_variation=27}, {x=79.3359375, y=60.03515625, graphics_variation=21}, {x=83.57421875, y=60.8125, graphics_variation=10}, {x=37.9609375, y=61.73046875, graphics_variation=29}, {x=-25.33203125, y=65.66796875, graphics_variation=15}, {x=25.48046875, y=65.45703125, graphics_variation=29}, {x=-77.2890625, y=68.76953125, graphics_variation=30}, {x=82.0234375, y=67.046875, graphics_variation=22}, {x=-16.6171875, y=70.75390625, graphics_variation=3}, {x=-0.65234375, y=69.87109375, graphics_variation=3}, {x=5.81640625, y=69.65234375, graphics_variation=2}, {x=16.50390625, y=69.64453125, graphics_variation=2}, {x=22.3359375, y=69.82421875, graphics_variation=5}, {x=26.17578125, y=69.96484375, graphics_variation=15}, {x=82.83203125, y=70.890625, graphics_variation=7}, {x=37.859375, y=73.74609375, graphics_variation=23}, {x=71.265625, y=76.0234375, graphics_variation=17}, {x=37.84765625, y=77.79296875, graphics_variation=26}, {x=40.5546875, y=77.9921875, graphics_variation=15}, {x=45.93359375, y=77.3046875, graphics_variation=11}, {x=56.5078125, y=77.23828125, graphics_variation=2}, {x=62.22265625, y=77.2265625, graphics_variation=26}, {x=66.05078125, y=77.86328125, graphics_variation=15}, {x=76.3046875, y=77.359375, graphics_variation=11}, {x=84.1484375, y=80.03515625, graphics_variation=26}, {x=27.81640625, y=81.46875, graphics_variation=11}, {x=37.98828125, y=83.375, graphics_variation=8}, {x=79.0859375, y=83.00390625, graphics_variation=5}, {x=60.70703125, y=86.14453125, graphics_variation=18}, {x=61.33984375, y=85.95703125, graphics_variation=8}, {x=83.05078125, y=86.7265625, graphics_variation=5}, {x=-56.9140625, y=88.03125, graphics_variation=20}, {x=25.41796875, y=88.2578125, graphics_variation=7}, {x=61.97265625, y=88.7734375, graphics_variation=6}, {x=78.8203125, y=87.93359375, graphics_variation=3}, {x=5.63671875, y=90.609375, graphics_variation=11}, {x=82.21484375, y=90.00390625, graphics_variation=15}, {x=37.9375, y=91.8515625, graphics_variation=11}, {x=61.1953125, y=92.94140625, graphics_variation=30}, {x=84.0703125, y=91.62109375, graphics_variation=7}, {x=2.51953125, y=93.9609375, graphics_variation=12}, {x=23.125, y=94.61328125, graphics_variation=11}, {x=-54.765625, y=96.265625, graphics_variation=13}, {x=-31.6953125, y=96.26171875, graphics_variation=17}, {x=61.37890625, y=96.171875, graphics_variation=18}, {x=2.8515625, y=98.10546875, graphics_variation=20}, {x=37.3125, y=98.51171875, graphics_variation=28}, {x=-84.17578125, y=100.66796875, graphics_variation=24}, {x=-62.0234375, y=100.67578125, graphics_variation=14}, {x=25.80078125, y=100.67578125, graphics_variation=13}, {x=61.4296875, y=99.89453125, graphics_variation=26}, {x=84.0390625, y=100.7421875, graphics_variation=26}, {x=83.86328125, y=101.5234375, graphics_variation=8}, {x=-66.65625, y=104.05859375, graphics_variation=22}, {x=-33.39453125, y=103.5859375, graphics_variation=4}, {x=2.2421875, y=104.9375, graphics_variation=28}, {x=62.93359375, y=103.140625, graphics_variation=18}, {x=73.68359375, y=106.671875, graphics_variation=23}, {x=77.484375, y=106.125, graphics_variation=23}, {x=15.86328125, y=107.83203125, graphics_variation=25}, {x=20.5390625, y=107.1953125, graphics_variation=17}, {x=38.00390625, y=107.8671875, graphics_variation=10}, {x=49.71484375, y=107.56640625, graphics_variation=20}, {x=57.23046875, y=107.3515625, graphics_variation=3}, {x=-1.26953125, y=109.0390625, graphics_variation=23}, {x=-62.015625, y=111.40234375, graphics_variation=25}, {x=-54.73046875, y=112.28515625, graphics_variation=9}, {x=3.6640625, y=112.35546875, graphics_variation=25}, {x=83.1484375, y=111.32421875, graphics_variation=26}, {x=37.53515625, y=113.67578125, graphics_variation=22}, {x=72.6953125, y=113.40234375, graphics_variation=10}, {x=-55.56640625, y=116.3671875, graphics_variation=6}, {x=-51.41796875, y=116.57421875, graphics_variation=27}, {x=-38.21875, y=116.98046875, graphics_variation=25}, {x=54.8515625, y=116.01171875, graphics_variation=13}, {x=60.58984375, y=116.1640625, graphics_variation=26}, {x=64.0625, y=116.9375, graphics_variation=10}, {x=52.84375, y=119.62890625, graphics_variation=27}, {x=-29.7421875, y=121.47265625, graphics_variation=8}, {x=3.33984375, y=121.48828125, graphics_variation=17}, {x=37.015625, y=122.34765625, graphics_variation=18}, {x=83.08203125, y=121.33984375, graphics_variation=26}, {x=40.26953125, y=124.3984375, graphics_variation=15}, {x=43.77734375, y=124.1953125, graphics_variation=19}, {x=-8.203125, y=126.69921875, graphics_variation=5}, {x=5.23828125, y=125.59375, graphics_variation=29}, {x=-61.46875, y=128.1796875, graphics_variation=15}, {x=-27.640625, y=127.9296875, graphics_variation=21}, {x=15.50390625, y=127.71484375, graphics_variation=9}, {x=-0.38671875, y=129.93359375, graphics_variation=11}, {x=82.5859375, y=129.23046875, graphics_variation=24}, {x=2.09375, y=132.2734375, graphics_variation=18}, {x=53.64453125, y=131.5625, graphics_variation=27}, {x=61.60546875, y=134.734375, graphics_variation=3}, {x=71.04296875, y=134.07421875, graphics_variation=3}, {x=-53.61328125, y=136.01953125, graphics_variation=10}, {x=-47.0390625, y=136.53125, graphics_variation=19}, {x=-28.51953125, y=135.23046875, graphics_variation=1}, {x=-7.9609375, y=136.37890625, graphics_variation=7}, {x=-0.7421875, y=136.59765625, graphics_variation=26}, {x=7.42578125, y=135.71484375, graphics_variation=28}, {x=16.921875, y=136.8359375, graphics_variation=23}, {x=37.3203125, y=135.25, graphics_variation=30}, {x=61.13671875, y=136.63671875, graphics_variation=11}, {x=-12.53125, y=137.328125, graphics_variation=1}, {x=11.44140625, y=137.109375, graphics_variation=27}, {x=53.56640625, y=138.71875, graphics_variation=6}, {x=71.7421875, y=137.9921875, graphics_variation=18}, {x=39.0859375, y=140.7734375, graphics_variation=26}, {x=-2.99609375, y=142.3515625, graphics_variation=3}, {x=46.7109375, y=141.9765625, graphics_variation=1}, {x=61.5625, y=141.1796875, graphics_variation=28}, {x=75.36328125, y=142.60546875, graphics_variation=10}, {x=80.5546875, y=141.375, graphics_variation=27}, {x=-16.43359375, y=144.15625, graphics_variation=1}, }, + ["tree-grassland-h"] = {{x=-43.6171875, y=-98.61328125, graphics_variation=12}, {x=-32.80078125, y=-98.37109375, graphics_variation=4}, {x=-22.0703125, y=-98.40625, graphics_variation=7}, {x=-54.8984375, y=-93.5078125, graphics_variation=8}, {x=-40.6875, y=-94.6796875, graphics_variation=8}, {x=9.8359375, y=-79.28515625, graphics_variation=6}, {x=-25.03515625, y=-77.58203125, graphics_variation=2}, {x=-19.734375, y=-77.5, graphics_variation=9}, {x=-15.484375, y=-78.00390625, graphics_variation=6}, {x=-25.0546875, y=-73.83984375, graphics_variation=3}, {x=-19.921875, y=-74.57421875, graphics_variation=12}, {x=-15.19140625, y=-74.15625, graphics_variation=12}, {x=-5.24609375, y=-74.40625, graphics_variation=4}, {x=-0.11328125, y=-74.4921875, graphics_variation=2}, {x=10.06640625, y=-74.23828125, graphics_variation=6}, {x=25.7265625, y=-25.6796875, graphics_variation=4}, {x=26.48828125, y=-22.87890625, graphics_variation=4}, {x=8.98828125, y=-17.12109375, graphics_variation=9}, {x=8.76953125, y=-4.27734375, graphics_variation=2}, {x=8.14453125, y=-0.08984375, graphics_variation=7}, {x=9.61328125, y=2.28515625, graphics_variation=10}, {x=8.11328125, y=13.12890625, graphics_variation=7}, {x=6.76953125, y=17.81640625, graphics_variation=5}, {x=8.14453125, y=23.03515625, graphics_variation=6}, {x=8.14453125, y=30.37890625, graphics_variation=4}, {x=-19.63671875, y=32.09765625, graphics_variation=4}, {x=4.89453125, y=31.94140625, graphics_variation=12}, {x=1.14453125, y=34.62890625, graphics_variation=7}, {x=-59.56640625, y=48.734375, graphics_variation=1}, {x=-31.4921875, y=48.609375, graphics_variation=8}, {x=-59.38671875, y=51.11328125, graphics_variation=2}, {x=-80.91015625, y=60.6875, graphics_variation=5}, {x=-68.53125, y=74.13671875, graphics_variation=12}, {x=-66.30078125, y=76.4140625, graphics_variation=5}, {x=-23.4609375, y=76.84765625, graphics_variation=4}, {x=-74.51953125, y=77.0859375, graphics_variation=5}, {x=-56.84375, y=77.44921875, graphics_variation=1}, {x=-9.1015625, y=77.8203125, graphics_variation=8}, {x=-65.0234375, y=80.3828125, graphics_variation=3}, {x=-77.6328125, y=81.3828125, graphics_variation=10}, {x=-83.55859375, y=85.33203125, graphics_variation=11}, {x=-11.2265625, y=86.375, graphics_variation=1}, {x=-77.91015625, y=87.41796875, graphics_variation=2}, {x=-13.71484375, y=88.68359375, graphics_variation=10}, {x=-67.18359375, y=91.01953125, graphics_variation=11}, {x=-67.90234375, y=89.27734375, graphics_variation=1}, {x=-11.38671875, y=89.8046875, graphics_variation=2}, {x=-27.359375, y=94.82421875, graphics_variation=9}, {x=-5.56640625, y=99.6484375, graphics_variation=6}, {x=-85.89453125, y=104.3359375, graphics_variation=10}, {x=-17.11328125, y=107.859375, graphics_variation=10}, {x=-11.8046875, y=110.5, graphics_variation=1}, {x=-25.1015625, y=113.51953125, graphics_variation=12}, {x=-8.73046875, y=113.88671875, graphics_variation=6}, {x=65.56640625, y=124.50390625, graphics_variation=3}, {x=67.69921875, y=129.6640625, graphics_variation=12}, {x=60.59375, y=131.77734375, graphics_variation=7}, {x=67.39453125, y=131.58984375, graphics_variation=1}, {x=67.5078125, y=131.58984375, graphics_variation=10}, {x=70.8046875, y=131.51171875, graphics_variation=6}, {x=13.00390625, y=144.64453125, graphics_variation=8}, }, + ["puberty-decal-ruin"] = {{x=10.9296875, y=-98.2109375, graphics_variation=13}, {x=10.9296875, y=-98.2109375, graphics_variation=13}, {x=16.984375, y=-96.0859375, graphics_variation=25}, {x=17.01171875, y=-96.0859375, graphics_variation=21}, {x=23.96484375, y=-94.92578125, graphics_variation=11}, {x=23.96484375, y=-94.92578125, graphics_variation=11}, {x=29.29296875, y=-75.13671875, graphics_variation=2}, {x=29.29296875, y=-75.13671875, graphics_variation=2}, {x=-74.4765625, y=-74.63671875, graphics_variation=14}, {x=-74.4765625, y=-74.63671875, graphics_variation=14}, {x=-77.0859375, y=-62.60546875, graphics_variation=20}, {x=-77.0859375, y=-62.60546875, graphics_variation=20}, {x=-68.62890625, y=-42.62890625, graphics_variation=1}, {x=-22.296875, y=-41.73828125, graphics_variation=20}, {x=-69.2265625, y=-36.10546875, graphics_variation=11}, {x=-43.1875, y=-31.5, graphics_variation=21}, {x=-11.0859375, y=-31.75390625, graphics_variation=8}, {x=-12.2578125, y=-29.09375, graphics_variation=7}, {x=28.0390625, y=-26.46875, graphics_variation=3}, {x=28.0390625, y=-26.46875, graphics_variation=3}, {x=26.21875, y=-19.7421875, graphics_variation=22}, {x=26.21875, y=-19.7421875, graphics_variation=22}, {x=26.21875, y=-19.7421875, graphics_variation=22}, {x=7.46875, y=-10.7734375, graphics_variation=1}, {x=3.2578125, y=13.59375, graphics_variation=30}, {x=3.5078125, y=24.21875, graphics_variation=21}, {x=3.5078125, y=24.21875, graphics_variation=21}, }, + ["workshop-ruin"] = {{x=76.5, y=-97.5, graphics_variation=1}, {x=69.5, y=-87.5, graphics_variation=1}, {x=-19.5, y=-62.5, graphics_variation=1}, {x=8.5, y=-62.5, graphics_variation=1}, {x=66.5, y=-55.5, graphics_variation=1}, {x=73.5, y=-55.5, graphics_variation=1}, {x=78.5, y=-54.5, graphics_variation=1}, {x=13.5, y=-47.5, graphics_variation=1}, {x=66.5, y=-41.5, graphics_variation=1}, {x=80.5, y=-32.5, graphics_variation=1}, {x=13.5, y=-31.5, graphics_variation=1}, {x=80.5, y=-27.5, graphics_variation=1}, {x=80.5, y=-23.5, graphics_variation=1}, {x=13.5, y=-8.5, graphics_variation=1}, {x=77.5, y=-8.5, graphics_variation=1}, {x=13.5, y=21.5, graphics_variation=1}, {x=13.5, y=26.5, graphics_variation=1}, {x=-37.5, y=28.5, graphics_variation=1}, {x=-32.5, y=34.5, graphics_variation=1}, {x=71.5, y=34.5, graphics_variation=1}, {x=77.5, y=34.5, graphics_variation=1}, {x=68.5, y=48.5, graphics_variation=1}, {x=72.5, y=48.5, graphics_variation=1}, {x=80.5, y=48.5, graphics_variation=1}, {x=-22.5, y=51.5, graphics_variation=1}, {x=1.5, y=58.5, graphics_variation=1}, {x=41.5, y=60.5, graphics_variation=1}, {x=46.5, y=60.5, graphics_variation=1}, {x=50.5, y=60.5, graphics_variation=1}, {x=57.5, y=60.5, graphics_variation=1}, {x=61.5, y=60.5, graphics_variation=1}, {x=67.5, y=60.5, graphics_variation=1}, {x=71.5, y=60.5, graphics_variation=1}, {x=9.5, y=64.5, graphics_variation=1}, {x=37.5, y=66.5, graphics_variation=1}, {x=37.5, y=70.5, graphics_variation=1}, {x=6.5, y=75.5, graphics_variation=1}, {x=6.5, y=79.5, graphics_variation=1}, {x=26.5, y=78.5, graphics_variation=1}, {x=65.5, y=88.5, graphics_variation=1}, {x=26.5, y=93.5, graphics_variation=1}, {x=26.5, y=97.5, graphics_variation=1}, {x=37.5, y=102.5, graphics_variation=1}, {x=65.5, y=102.5, graphics_variation=1}, {x=79.5, y=102.5, graphics_variation=1}, {x=26.5, y=112.5, graphics_variation=1}, {x=53.5, y=112.5, graphics_variation=1}, {x=2.5, y=114.5, graphics_variation=1}, {x=83.5, y=117.5, graphics_variation=1}, {x=-30.5, y=123.5, graphics_variation=1}, {x=-0.5, y=123.5, graphics_variation=1}, {x=26.5, y=124.5, graphics_variation=1}, {x=83.5, y=124.5, graphics_variation=1}, {x=-0.5, y=132.5, graphics_variation=1}, {x=26.5, y=132.5, graphics_variation=1}, {x=83.5, y=133.5, graphics_variation=1}, {x=67.5, y=137.5, graphics_variation=1}, {x=83.5, y=137.5, graphics_variation=1}, {x=49.5, y=141.5, graphics_variation=1}, {x=53.5, y=141.5, graphics_variation=1}, {x=67.5, y=141.5, graphics_variation=1}, {x=83.5, y=141.5, graphics_variation=1}, {x=6.5, y=145.5, graphics_variation=1}, }, + ["wood-half-chest-right"] = {{x=79.26953125, y=-97.87890625, graphics_variation=1}, {x=66.47265625, y=-89.8515625, graphics_variation=1}, {x=56.4296875, y=-86.4296875, graphics_variation=1}, {x=-30.5234375, y=-61.625, graphics_variation=1}, {x=-1.828125, y=-61.4453125, graphics_variation=1}, {x=14.53125, y=-55.24609375, graphics_variation=1}, {x=74.1015625, y=-51.8125, graphics_variation=1}, {x=67.43359375, y=-49.60546875, graphics_variation=1}, {x=14.40625, y=-37.25390625, graphics_variation=1}, {x=14.26953125, y=-34.74609375, graphics_variation=1}, {x=14.5, y=-16.98046875, graphics_variation=1}, {x=75.37109375, y=-9.6328125, graphics_variation=1}, {x=14.46484375, y=9.11328125, graphics_variation=1}, {x=62.2890625, y=8.421875, graphics_variation=1}, {x=81.2890625, y=19.078125, graphics_variation=1}, {x=-39.5546875, y=29.3515625, graphics_variation=1}, {x=-75.6015625, y=36.375, graphics_variation=1}, {x=67.2578125, y=43.140625, graphics_variation=1}, {x=7.3359375, y=69.44140625, graphics_variation=1}, {x=80.4453125, y=77.65234375, graphics_variation=1}, {x=7.45703125, y=81.25, graphics_variation=1}, {x=7.45703125, y=81.25, graphics_variation=1}, {x=72.3515625, y=137.87890625, graphics_variation=1}, }, + ["tree-wetland-i"] = {{x=6.8984375, y=-96.2265625, graphics_variation=2}, {x=18.0078125, y=-81.125, graphics_variation=7}, {x=21.87109375, y=-81.4375, graphics_variation=5}, {x=27.66796875, y=-79.78125, graphics_variation=2}, {x=17.87109375, y=-78.67578125, graphics_variation=2}, {x=-40.71875, y=-73.85546875, graphics_variation=1}, {x=7.8984375, y=-57.89453125, graphics_variation=7}, {x=9.25390625, y=-56.109375, graphics_variation=7}, {x=7.25, y=-3.1328125, graphics_variation=1}, {x=9.21484375, y=15.53125, graphics_variation=1}, {x=7.55859375, y=24.7109375, graphics_variation=3}, {x=-16.38671875, y=30.95703125, graphics_variation=5}, {x=9.87109375, y=32.54296875, graphics_variation=2}, {x=-20.8359375, y=34.88671875, graphics_variation=1}, {x=-18.8359375, y=35.578125, graphics_variation=8}, {x=5.3515625, y=35.12890625, graphics_variation=7}, {x=9.04296875, y=35.71484375, graphics_variation=3}, {x=-83.07421875, y=45.24609375, graphics_variation=6}, {x=-60.4375, y=45.03515625, graphics_variation=6}, {x=-60.375, y=48.03515625, graphics_variation=3}, {x=-57.59375, y=47.84765625, graphics_variation=3}, {x=-32.33984375, y=47.7421875, graphics_variation=8}, {x=-30.49609375, y=47.79296875, graphics_variation=1}, {x=-60.5, y=49.22265625, graphics_variation=4}, {x=-58.5625, y=50.75390625, graphics_variation=3}, {x=-30.49609375, y=49.89453125, graphics_variation=1}, {x=-60.375, y=51.84765625, graphics_variation=5}, {x=30.98046875, y=52.85546875, graphics_variation=1}, {x=29.875, y=54.35546875, graphics_variation=7}, {x=-77.46875, y=73.8125, graphics_variation=5}, {x=-56.73828125, y=73.9140625, graphics_variation=3}, {x=-34.97265625, y=73.53125, graphics_variation=8}, {x=-33.12890625, y=73.8359375, graphics_variation=2}, {x=-64.91015625, y=75.23046875, graphics_variation=7}, {x=-58.12109375, y=75.76171875, graphics_variation=5}, {x=-34.21484375, y=75.6015625, graphics_variation=1}, {x=-32.28125, y=75.24609375, graphics_variation=1}, {x=-22.97265625, y=76.22265625, graphics_variation=7}, {x=-18.82421875, y=75.90625, graphics_variation=5}, {x=-5.81640625, y=76.4921875, graphics_variation=3}, {x=-57.6796875, y=77.640625, graphics_variation=8}, {x=-24.44921875, y=77.328125, graphics_variation=4}, {x=-16.9296875, y=77.39453125, graphics_variation=8}, {x=-4.0234375, y=79.35546875, graphics_variation=3}, {x=-0.17578125, y=79.58203125, graphics_variation=3}, {x=-18.375, y=84.83984375, graphics_variation=7}, {x=-65.9296875, y=86.12109375, graphics_variation=8}, {x=-65.9296875, y=86.1875, graphics_variation=4}, {x=-23.20703125, y=87.98828125, graphics_variation=7}, {x=-18.72265625, y=88.015625, graphics_variation=7}, {x=-0.96875, y=87.2890625, graphics_variation=4}, {x=1.9765625, y=88.1953125, graphics_variation=8}, {x=1.9765625, y=88.30859375, graphics_variation=8}, {x=-77.26171875, y=90.4609375, graphics_variation=2}, {x=-65.48828125, y=90.3671875, graphics_variation=2}, {x=-29.078125, y=90.0390625, graphics_variation=1}, {x=-29.19140625, y=89.5859375, graphics_variation=7}, {x=-24.34765625, y=90.74609375, graphics_variation=6}, {x=-84.49609375, y=92.5078125, graphics_variation=3}, {x=-70.38671875, y=91.1796875, graphics_variation=6}, {x=-27.71875, y=91.73828125, graphics_variation=7}, {x=-16.4453125, y=91.47265625, graphics_variation=5}, {x=-23.171875, y=96.78515625, graphics_variation=7}, {x=-17.515625, y=95.12890625, graphics_variation=7}, {x=-4.30859375, y=96.06640625, graphics_variation=8}, {x=-4.30859375, y=96.29296875, graphics_variation=2}, {x=-4.36328125, y=96.515625, graphics_variation=3}, {x=-4.30859375, y=95.21484375, graphics_variation=3}, {x=-4.30859375, y=95.5546875, graphics_variation=3}, {x=-4.30859375, y=95.83984375, graphics_variation=2}, {x=-27.65234375, y=98.38671875, graphics_variation=1}, {x=-4.81640625, y=97.53515625, graphics_variation=6}, {x=-6.7421875, y=99.51953125, graphics_variation=5}, {x=-27.19921875, y=102.06640625, graphics_variation=5}, {x=-25.6171875, y=102.40625, graphics_variation=2}, {x=-26.69140625, y=102.9140625, graphics_variation=8}, {x=-4.9296875, y=102.6875, graphics_variation=1}, {x=-18.7578125, y=104.4453125, graphics_variation=2}, {x=-27.59765625, y=106.25390625, graphics_variation=1}, {x=-4.53515625, y=106.6484375, graphics_variation=8}, {x=-4.4765625, y=106.8203125, graphics_variation=8}, {x=-19.34375, y=107.48046875, graphics_variation=1}, {x=-22.69140625, y=113.48046875, graphics_variation=6}, {x=-26.2421875, y=115.62109375, graphics_variation=7}, {x=-16.71875, y=116.1015625, graphics_variation=5}, {x=-15.09765625, y=117.5859375, graphics_variation=1}, {x=-14.99609375, y=117.4140625, graphics_variation=5}, {x=-65.34765625, y=120.89453125, graphics_variation=5}, {x=62.14453125, y=126.84375, graphics_variation=3}, {x=70.35546875, y=127.37890625, graphics_variation=6}, {x=62.6796875, y=132.046875, graphics_variation=2}, {x=65.8203125, y=131.64453125, graphics_variation=8}, {x=-52.4140625, y=140.93359375, graphics_variation=1}, {x=-43.6484375, y=140.5859375, graphics_variation=3}, {x=9.75, y=140.87890625, graphics_variation=2}, {x=11.2890625, y=140.5703125, graphics_variation=8}, {x=-48.515625, y=141.2421875, graphics_variation=2}, {x=-48.58203125, y=141.2421875, graphics_variation=1}, {x=16.6171875, y=141.98046875, graphics_variation=2}, {x=24, y=141.26171875, graphics_variation=5}, {x=10.515625, y=143.875, graphics_variation=1}, }, + ["tree-desert-f"] = {{x=19.2734375, y=-81.484375, graphics_variation=4}, {x=22.51171875, y=-78.58984375, graphics_variation=3}, {x=29.1015625, y=-78.4375, graphics_variation=6}, {x=25.328125, y=-76.68359375, graphics_variation=6}, {x=33.78515625, y=-76.609375, graphics_variation=4}, {x=18.28125, y=-74.7421875, graphics_variation=5}, {x=-10.0546875, y=-30.91015625, graphics_variation=4}, {x=-58.5234375, y=46.71875, graphics_variation=6}, {x=-57.72265625, y=73.953125, graphics_variation=2}, {x=-14.05859375, y=77.20703125, graphics_variation=6}, {x=-14.6796875, y=79.484375, graphics_variation=7}, {x=-14.74609375, y=79.484375, graphics_variation=5}, {x=-4.63671875, y=87.45703125, graphics_variation=5}, {x=-6.19140625, y=89.11328125, graphics_variation=2}, {x=-4.984375, y=91.390625, graphics_variation=7}, {x=-16.203125, y=98.8359375, graphics_variation=5}, {x=-17.89453125, y=100.07421875, graphics_variation=6}, {x=-23.828125, y=106.35546875, graphics_variation=2}, {x=-26.3828125, y=108.4609375, graphics_variation=7}, {x=-10.71484375, y=108.1484375, graphics_variation=6}, {x=-9.95703125, y=110.390625, graphics_variation=1}, {x=-10.02734375, y=110.359375, graphics_variation=1}, {x=-8.05859375, y=109.76953125, graphics_variation=5}, {x=-14.6171875, y=112.15234375, graphics_variation=7}, {x=-9.6484375, y=112.39453125, graphics_variation=5}, {x=-9.71484375, y=112.4296875, graphics_variation=7}, {x=-9.78515625, y=112.49609375, graphics_variation=4}, {x=-6.75, y=111.7734375, graphics_variation=2}, {x=-13.0390625, y=149.72265625, graphics_variation=6}, {x=-4.9140625, y=149.5234375, graphics_variation=6}, {x=2.7265625, y=149.3828125, graphics_variation=3}, }, + ["vase"] = {{x=26.99609375, y=-66.0390625, graphics_variation=1}, {x=29.98046875, y=-65.99609375, graphics_variation=1}, {x=33.05078125, y=-65.99609375, graphics_variation=1}, {x=42.875, y=-66.0390625, graphics_variation=1}, {x=46.02734375, y=-65.99609375, graphics_variation=1}, {x=49.03515625, y=-65.953125, graphics_variation=1}, {x=27.05859375, y=-41.6796875, graphics_variation=1}, {x=30.00390625, y=-41.73046875, graphics_variation=1}, {x=33.00390625, y=-41.70703125, graphics_variation=1}, {x=43.10546875, y=-41.70703125, graphics_variation=1}, {x=46.02734375, y=-41.65625, graphics_variation=1}, {x=49.10546875, y=-41.78125, graphics_variation=1}, {x=-18.41015625, y=43.4765625, graphics_variation=1}, {x=-16.44140625, y=43.51171875, graphics_variation=1}, {x=52.03515625, y=47.2734375, graphics_variation=1}, {x=54.01953125, y=47.3125, graphics_variation=1}, {x=56.07421875, y=47.29296875, graphics_variation=1}, {x=13.078125, y=52.375, graphics_variation=1}, {x=15.453125, y=56.578125, graphics_variation=1}, {x=21.625, y=56.53125, graphics_variation=1}, {x=-24.953125, y=58.37109375, graphics_variation=1}, {x=-21.92578125, y=58.4140625, graphics_variation=1}, {x=27.81640625, y=57.6953125, graphics_variation=1}, {x=27.81640625, y=59.671875, graphics_variation=1}, {x=15.40625, y=62.390625, graphics_variation=1}, {x=21.609375, y=62.453125, graphics_variation=1}, {x=27.87890625, y=61.6484375, graphics_variation=1}, {x=-57.96875, y=85.203125, graphics_variation=1}, {x=-54.890625, y=85.203125, graphics_variation=1}, {x=36.22265625, y=91.40625, graphics_variation=1}, {x=36.16796875, y=93.5390625, graphics_variation=1}, {x=13.5078125, y=105.984375, graphics_variation=1}, {x=15.5703125, y=105.984375, graphics_variation=1}, {x=17.50390625, y=106.06640625, graphics_variation=1}, {x=19.5234375, y=106.0234375, graphics_variation=1}, {x=70.15234375, y=107.4609375, graphics_variation=1}, {x=84.828125, y=107.55078125, graphics_variation=1}, {x=13.8671875, y=117.64453125, graphics_variation=1}, {x=23.625, y=117.5390625, graphics_variation=1}, {x=-30.484375, y=120.59765625, graphics_variation=1}, {x=-9.45703125, y=120.61328125, graphics_variation=1}, {x=13.7421875, y=125.5859375, graphics_variation=1}, {x=23.60546875, y=125.69140625, graphics_variation=1}, {x=-53.5078125, y=129.6015625, graphics_variation=1}, {x=-45.515625, y=129.70703125, graphics_variation=1}, {x=-37.421875, y=129.8125, graphics_variation=1}, {x=-29.55078125, y=129.55859375, graphics_variation=1}, {x=-9.3828125, y=129.58203125, graphics_variation=1}, {x=2.5078125, y=129.70703125, graphics_variation=1}, {x=-17.4765625, y=132.50390625, graphics_variation=1}, {x=13.67578125, y=133.703125, graphics_variation=1}, {x=23.79296875, y=133.6171875, graphics_variation=1}, }, + ["iron-wood-chest-remnants"] = {{x=-32.5, y=-63.5, graphics_variation=1}, {x=-36.5, y=-61.5, graphics_variation=1}, {x=-36.5, y=-62.5, graphics_variation=1}, {x=64.5, y=-42.5, graphics_variation=1}, {x=80.5, y=-17.5, graphics_variation=1}, {x=-80.5, y=-16.5, graphics_variation=1}, {x=-77.5, y=-16.5, graphics_variation=1}, {x=-31.5, y=-16.5, graphics_variation=1}, {x=-28.5, y=-16.5, graphics_variation=1}, {x=65.5, y=-4.5, graphics_variation=1}, {x=67.5, y=-4.5, graphics_variation=1}, {x=80.5, y=8.5, graphics_variation=1}, {x=80.5, y=10.5, graphics_variation=1}, {x=12.5, y=19.5, graphics_variation=1}, {x=80.5, y=21.5, graphics_variation=1}, {x=-84.5, y=29.5, graphics_variation=1}, {x=-24.5, y=29.5, graphics_variation=1}, {x=12.5, y=34.5, graphics_variation=1}, {x=80.5, y=38.5, graphics_variation=1}, {x=62.5, y=47.5, graphics_variation=1}, {x=62.5, y=49.5, graphics_variation=1}, {x=23.5, y=54.5, graphics_variation=1}, {x=-77.5, y=59.5, graphics_variation=1}, {x=-63.5, y=59.5, graphics_variation=1}, {x=-76.5, y=66.5, graphics_variation=1}, {x=-64.5, y=66.5, graphics_variation=1}, {x=36.5, y=76.5, graphics_variation=1}, {x=50.5, y=76.5, graphics_variation=1}, {x=72.5, y=76.5, graphics_variation=1}, {x=36.5, y=77.5, graphics_variation=1}, {x=50.5, y=78.5, graphics_variation=1}, {x=72.5, y=78.5, graphics_variation=1}, {x=74.5, y=78.5, graphics_variation=1}, {x=74.5, y=77.5, graphics_variation=1}, {x=10.5, y=86.5, graphics_variation=1}, {x=-30.5, y=94.5, graphics_variation=1}, {x=2.5, y=101.5, graphics_variation=1}, {x=1.5, y=101.5, graphics_variation=1}, {x=9.5, y=105.5, graphics_variation=1}, {x=10.5, y=105.5, graphics_variation=1}, {x=2.5, y=110.5, graphics_variation=1}, {x=3.5, y=110.5, graphics_variation=1}, {x=19.5, y=117.5, graphics_variation=1}, {x=-51.5, y=120.5, graphics_variation=1}, {x=-40.5, y=120.5, graphics_variation=1}, {x=2.5, y=124.5, graphics_variation=1}, {x=19.5, y=125.5, graphics_variation=1}, {x=19.5, y=133.5, graphics_variation=1}, }, + ["wood-half-chest-left"] = {{x=-28.65625, y=-62.71484375, graphics_variation=1}, {x=-42.58984375, y=-61.73828125, graphics_variation=1}, {x=61.30078125, y=-56.6484375, graphics_variation=1}, {x=64.41015625, y=-44.7578125, graphics_variation=1}, {x=-84.4375, y=-23.24609375, graphics_variation=1}, {x=-31.55859375, y=-23.33984375, graphics_variation=1}, {x=-31.60546875, y=-21.83203125, graphics_variation=1}, {x=-31.48828125, y=-19.99609375, graphics_variation=1}, {x=70.39453125, y=-2.9921875, graphics_variation=1}, {x=-70.66796875, y=27.59375, graphics_variation=1}, {x=5.43359375, y=62.4765625, graphics_variation=1}, {x=25.31640625, y=101.5078125, graphics_variation=1}, {x=25.69140625, y=117.2265625, graphics_variation=1}, {x=68.48828125, y=116.60546875, graphics_variation=1}, {x=-18.609375, y=133.44921875, graphics_variation=1}, {x=5.375, y=135.5390625, graphics_variation=1}, {x=5.34765625, y=137.3046875, graphics_variation=1}, {x=70.30078125, y=136.1015625, graphics_variation=1}, {x=36.33984375, y=137.69921875, graphics_variation=1}, {x=70.3671875, y=142.1875, graphics_variation=1}, }, + ["furnace-ruin"] = {{x=74, y=-59, graphics_variation=1}, {x=62, y=-55, graphics_variation=1}, {x=82, y=-56, graphics_variation=1}, {x=65, y=-52, graphics_variation=1}, {x=74, y=-49, graphics_variation=1}, {x=74, y=-37, graphics_variation=1}, {x=-75, y=-23, graphics_variation=1}, {x=-34, y=-23, graphics_variation=1}, {x=-75, y=-19, graphics_variation=1}, {x=-34, y=-19, graphics_variation=1}, {x=18, y=-4, graphics_variation=1}, {x=58, y=-4, graphics_variation=1}, {x=62, y=-4, graphics_variation=1}, {x=81, y=0, graphics_variation=1}, {x=81, y=3, graphics_variation=1}, {x=62, y=22, graphics_variation=1}, {x=81, y=24, graphics_variation=1}, {x=-84, y=27, graphics_variation=1}, {x=-78, y=27, graphics_variation=1}, {x=-31, y=27, graphics_variation=1}, {x=-25, y=27, graphics_variation=1}, {x=62, y=26, graphics_variation=1}, {x=-72, y=28, graphics_variation=1}, {x=-57, y=32, graphics_variation=1}, {x=71, y=32, graphics_variation=1}, {x=-72, y=35, graphics_variation=1}, {x=-69, y=35, graphics_variation=1}, {x=-66, y=35, graphics_variation=1}, {x=-63, y=35, graphics_variation=1}, {x=-57, y=35, graphics_variation=1}, {x=-46, y=35, graphics_variation=1}, {x=-43, y=35, graphics_variation=1}, {x=-40, y=35, graphics_variation=1}, {x=-37, y=35, graphics_variation=1}, {x=81, y=41, graphics_variation=1}, {x=-28, y=43, graphics_variation=1}, {x=-74, y=48, graphics_variation=1}, {x=65, y=49, graphics_variation=1}, {x=-64, y=52, graphics_variation=1}, {x=37, y=60, graphics_variation=1}, {x=2, y=70, graphics_variation=1}, {x=13, y=70, graphics_variation=1}, {x=2, y=73, graphics_variation=1}, {x=2, y=76, graphics_variation=1}, {x=23, y=87, graphics_variation=1}, {x=-1, y=93, graphics_variation=1}, {x=23, y=93, graphics_variation=1}, {x=-54, y=95, graphics_variation=1}, {x=-85, y=99, graphics_variation=1}, {x=-66, y=99, graphics_variation=1}, {x=-62, y=99, graphics_variation=1}, {x=-54, y=101, graphics_variation=1}, {x=-35, y=101, graphics_variation=1}, {x=10, y=100, graphics_variation=1}, {x=23, y=100, graphics_variation=1}, {x=-54, y=111, graphics_variation=1}, {x=-35, y=111, graphics_variation=1}, {x=66, y=117, graphics_variation=1}, {x=-18, y=121, graphics_variation=1}, {x=-51, y=124, graphics_variation=1}, {x=-40, y=124, graphics_variation=1}, {x=-18, y=124, graphics_variation=1}, {x=83, y=128, graphics_variation=1}, {x=-18, y=130, graphics_variation=1}, }, + ["sand-decal-ruin"] = {{x=-62.3359375, y=-40.17578125, graphics_variation=12}, {x=-12.6640625, y=-34.4921875, graphics_variation=15}, {x=-62.7890625, y=-31.546875, graphics_variation=7}, {x=4.2109375, y=-18.08203125, graphics_variation=13}, {x=3.703125, y=0.0078125, graphics_variation=11}, }, + ["wooden-barrel"] = {{x=69.6953125, y=-37.54296875, graphics_variation=1}, {x=79.3828125, y=-17.359375, graphics_variation=1}, {x=12.640625, y=3.5859375, graphics_variation=1}, {x=81.8515625, y=28.921875, graphics_variation=1}, {x=14.8515625, y=39.12109375, graphics_variation=1}, {x=14.7890625, y=40.63671875, graphics_variation=1}, {x=14.8671875, y=42.08984375, graphics_variation=1}, {x=12.2109375, y=47.21484375, graphics_variation=1}, {x=43.30078125, y=59.48046875, graphics_variation=1}, {x=48.3359375, y=76.7578125, graphics_variation=1}, {x=47.359375, y=76.64453125, graphics_variation=1}, {x=80.59765625, y=76.8203125, graphics_variation=1}, {x=48.58984375, y=77.56640625, graphics_variation=1}, {x=48.58984375, y=78.5703125, graphics_variation=1}, {x=36.33984375, y=106.6171875, graphics_variation=1}, {x=84.7890625, y=111.578125, graphics_variation=1}, }, + }, + default_under_tile = "mineral-tan-dirt-3", -- put under all minable tiles + tiles = { + ["mineral-tan-dirt-3"] = {{-96,-30}, {-96,-29}, {-96,-28}, {-96,-27}, {-96,-5}, {-96,-4}, {-96,-3}, {-96,-2}, {-96,-1}, {-96,0}, {-96,1}, {-96,2}, {-96,3}, {-95,-30}, {-93,68}, {-93,69}, {-93,70}, {-93,71}, {-93,72}, {-93,73}, {-93,74}, {-93,75}, {-93,76}, {-93,77}, {-92,68}, {-92,69}, {-92,70}, {-92,71}, {-92,72}, {-92,73}, {-92,74}, {-92,75}, {-92,76}, {-92,77}, {-91,71}, {-91,72}, {-91,73}, {-91,74}, {-91,75}, {-91,76}, {-90,-42}, {-90,-41}, {-90,-40}, {-90,-39}, {-90,-38}, {-89,-42}, {-89,-41}, {-89,-40}, {-89,-39}, {-89,-38}, {-88,-42}, {-88,-41}, {-88,-40}, {-85,83}, {-85,84}, {-85,85}, {-85,86}, {-85,87}, {-84,69}, {-84,70}, {-84,71}, {-84,72}, {-84,73}, {-84,74}, {-84,75}, {-84,76}, {-84,77}, {-84,78}, {-84,79}, {-84,80}, {-84,81}, {-84,82}, {-84,83}, {-84,84}, {-84,85}, {-84,86}, {-84,87}, {-83,-104}, {-83,-103}, {-83,-102}, {-83,-101}, {-83,-82}, {-83,-81}, {-83,-80}, {-83,-60}, {-83,-59}, {-83,-58}, {-82,-106}, {-82,-105}, {-82,-104}, {-82,-103}, {-82,-102}, {-82,-101}, {-82,-100}, {-82,-99}, {-82,-81}, {-82,-80}, {-82,-79}, {-82,-59}, {-82,-58}, {-82,-57}, {-82,-35}, {-82,-34}, {-82,-33}, {-82,-32}, {-81,-108}, {-81,-107}, {-81,-106}, {-81,-105}, {-81,-104}, {-81,-101}, {-81,-100}, {-81,-99}, {-81,-98}, {-81,-97}, {-81,-81}, {-81,-80}, {-81,-79}, {-81,-60}, {-81,-59}, {-81,-58}, {-81,-57}, {-81,-35}, {-81,-34}, {-81,-33}, {-81,-32}, {-80,-118}, {-80,-117}, {-80,-116}, {-80,-115}, {-80,-114}, {-80,-113}, {-80,-112}, {-80,-111}, {-80,-108}, {-80,-107}, {-80,-106}, {-80,-105}, {-80,-104}, {-80,-103}, {-80,-98}, {-80,-97}, {-80,-96}, {-80,-81}, {-80,-80}, {-80,-79}, {-80,-60}, {-80,-59}, {-80,-58}, {-80,-57}, {-80,-37}, {-80,-36}, {-80,-35}, {-80,-34}, {-79,-119}, {-79,-118}, {-79,-117}, {-79,-116}, {-79,-115}, {-79,-114}, {-79,-113}, {-79,-112}, {-79,-111}, {-79,-110}, {-79,-109}, {-79,-108}, {-79,-107}, {-79,-105}, {-79,-104}, {-79,-103}, {-79,-102}, {-79,-101}, {-79,-100}, {-79,-97}, {-79,-96}, {-79,-95}, {-79,-94}, {-79,-93}, {-79,-80}, {-79,-79}, {-79,-78}, {-79,-60}, {-79,-59}, {-79,-58}, {-79,-40}, {-79,-39}, {-79,-37}, {-79,-36}, {-79,-35}, {-78,-120}, {-78,-119}, {-78,-118}, {-78,-117}, {-78,-116}, {-78,-115}, {-78,-111}, {-78,-110}, {-78,-109}, {-78,-108}, {-78,-107}, {-78,-106}, {-78,-105}, {-78,-103}, {-78,-102}, {-78,-101}, {-78,-100}, {-78,-99}, {-78,-98}, {-78,-96}, {-78,-95}, {-78,-94}, {-78,-93}, {-78,-92}, {-78,-91}, {-78,-80}, {-78,-79}, {-78,-78}, {-78,-77}, {-78,-61}, {-78,-60}, {-78,-59}, {-78,-58}, {-78,-40}, {-78,-39}, {-78,-38}, {-78,-37}, {-78,-36}, {-78,76}, {-78,77}, {-78,79}, {-78,80}, {-78,81}, {-78,82}, {-77,-120}, {-77,-119}, {-77,-118}, {-77,-117}, {-77,-116}, {-77,-115}, {-77,-114}, {-77,-108}, {-77,-107}, {-77,-106}, {-77,-105}, {-77,-104}, {-77,-101}, {-77,-100}, {-77,-99}, {-77,-98}, {-77,-97}, {-77,-96}, {-77,-94}, {-77,-93}, {-77,-92}, {-77,-91}, {-77,-90}, {-77,-89}, {-77,-80}, {-77,-79}, {-77,-78}, {-77,-77}, {-77,-61}, {-77,-60}, {-77,-59}, {-77,-58}, {-77,-47}, {-77,-45}, {-77,-43}, {-77,-42}, {-77,-41}, {-77,-40}, {-77,-39}, {-77,-38}, {-77,-37}, {-77,-36}, {-77,-35}, {-77,74}, {-77,75}, {-77,76}, {-77,77}, {-77,78}, {-77,79}, {-77,80}, {-77,81}, {-77,82}, {-77,83}, {-77,84}, {-77,85}, {-77,86}, {-77,89}, {-77,90}, {-76,-120}, {-76,-119}, {-76,-118}, {-76,-117}, {-76,-116}, {-76,-115}, {-76,-114}, {-76,-113}, {-76,-112}, {-76,-107}, {-76,-106}, {-76,-105}, {-76,-104}, {-76,-99}, {-76,-98}, {-76,-97}, {-76,-96}, {-76,-95}, {-76,-94}, {-76,-91}, {-76,-90}, {-76,-89}, {-76,-88}, {-76,-87}, {-76,-80}, {-76,-79}, {-76,-78}, {-76,-77}, {-76,-76}, {-76,-62}, {-76,-61}, {-76,-60}, {-76,-59}, {-76,-50}, {-76,-49}, {-76,-48}, {-76,-47}, {-76,-46}, {-76,-45}, {-76,-44}, {-76,-43}, {-76,-42}, {-76,-41}, {-76,-40}, {-76,-39}, {-76,-38}, {-76,-37}, {-76,-36}, {-76,-35}, {-76,-34}, {-76,-33}, {-76,74}, {-76,75}, {-76,76}, {-76,77}, {-76,78}, {-76,79}, {-76,80}, {-76,81}, {-76,82}, {-76,83}, {-76,84}, {-76,85}, {-76,86}, {-76,89}, {-76,90}, {-76,91}, {-75,-120}, {-75,-119}, {-75,-118}, {-75,-117}, {-75,-115}, {-75,-114}, {-75,-113}, {-75,-112}, {-75,-111}, {-75,-110}, {-75,-109}, {-75,-105}, {-75,-104}, {-75,-103}, {-75,-102}, {-75,-97}, {-75,-96}, {-75,-95}, {-75,-94}, {-75,-93}, {-75,-92}, {-75,-90}, {-75,-89}, {-75,-88}, {-75,-87}, {-75,-86}, {-75,-80}, {-75,-79}, {-75,-78}, {-75,-77}, {-75,-76}, {-75,-63}, {-75,-62}, {-75,-61}, {-75,-60}, {-75,-59}, {-75,-51}, {-75,-50}, {-75,-49}, {-75,-48}, {-75,-47}, {-75,-46}, {-75,-45}, {-75,-44}, {-75,-43}, {-75,-42}, {-75,-41}, {-75,-40}, {-75,-39}, {-75,-38}, {-75,-37}, {-75,-36}, {-75,-35}, {-75,-34}, {-75,-33}, {-75,74}, {-75,75}, {-75,77}, {-75,78}, {-75,79}, {-75,80}, {-75,81}, {-75,82}, {-75,83}, {-75,84}, {-75,85}, {-75,86}, {-75,87}, {-75,88}, {-75,89}, {-75,90}, {-75,91}, {-74,-120}, {-74,-119}, {-74,-118}, {-74,-117}, {-74,-112}, {-74,-111}, {-74,-110}, {-74,-109}, {-74,-108}, {-74,-107}, {-74,-104}, {-74,-103}, {-74,-102}, {-74,-101}, {-74,-96}, {-74,-95}, {-74,-94}, {-74,-93}, {-74,-92}, {-74,-91}, {-74,-90}, {-74,-89}, {-74,-88}, {-74,-87}, {-74,-86}, {-74,-80}, {-74,-79}, {-74,-78}, {-74,-77}, {-74,-76}, {-74,-75}, {-74,-74}, {-74,-73}, {-74,-63}, {-74,-62}, {-74,-61}, {-74,-60}, {-74,-59}, {-74,-51}, {-74,-50}, {-74,-49}, {-74,-48}, {-74,-47}, {-74,-46}, {-74,-45}, {-74,-44}, {-74,-43}, {-74,-42}, {-74,-41}, {-74,-40}, {-74,-39}, {-74,-38}, {-74,-37}, {-74,-36}, {-74,-35}, {-74,-34}, {-74,-33}, {-74,73}, {-74,74}, {-74,75}, {-74,76}, {-74,77}, {-74,78}, {-74,79}, {-74,80}, {-74,82}, {-74,83}, {-74,84}, {-74,85}, {-74,86}, {-74,89}, {-74,90}, {-74,91}, {-73,-119}, {-73,-118}, {-73,-117}, {-73,-110}, {-73,-109}, {-73,-108}, {-73,-107}, {-73,-106}, {-73,-103}, {-73,-102}, {-73,-101}, {-73,-100}, {-73,-99}, {-73,-98}, {-73,-97}, {-73,-96}, {-73,-94}, {-73,-93}, {-73,-92}, {-73,-91}, {-73,-90}, {-73,-89}, {-73,-88}, {-73,-87}, {-73,-86}, {-73,-79}, {-73,-78}, {-73,-77}, {-73,-76}, {-73,-75}, {-73,-74}, {-73,-73}, {-73,-72}, {-73,-66}, {-73,-65}, {-73,-64}, {-73,-63}, {-73,-62}, {-73,-61}, {-73,-60}, {-73,-59}, {-73,-51}, {-73,-50}, {-73,-49}, {-73,-48}, {-73,-47}, {-73,-46}, {-73,-45}, {-73,-44}, {-73,-43}, {-73,-42}, {-73,-41}, {-73,-40}, {-73,-39}, {-73,-38}, {-73,-37}, {-73,-36}, {-73,-35}, {-73,-34}, {-73,-33}, {-73,73}, {-73,74}, {-73,75}, {-73,76}, {-73,77}, {-73,78}, {-73,79}, {-73,84}, {-73,85}, {-73,86}, {-73,87}, {-73,88}, {-73,89}, {-73,90}, {-72,-119}, {-72,-118}, {-72,-117}, {-72,-116}, {-72,-115}, {-72,-114}, {-72,-109}, {-72,-108}, {-72,-107}, {-72,-106}, {-72,-105}, {-72,-104}, {-72,-101}, {-72,-100}, {-72,-99}, {-72,-98}, {-72,-97}, {-72,-96}, {-72,-95}, {-72,-94}, {-72,-92}, {-72,-91}, {-72,-90}, {-72,-89}, {-72,-88}, {-72,-87}, {-72,-77}, {-72,-75}, {-72,-74}, {-72,-65}, {-72,-62}, {-72,-51}, {-72,-50}, {-72,-49}, {-72,-48}, {-72,-47}, {-72,-46}, {-72,-45}, {-72,-44}, {-72,-43}, {-72,-42}, {-72,-41}, {-72,-40}, {-72,-39}, {-72,-38}, {-72,-37}, {-72,-36}, {-72,-35}, {-72,-34}, {-72,-33}, {-72,-32}, {-72,73}, {-72,74}, {-72,75}, {-72,76}, {-72,77}, {-72,78}, {-72,79}, {-72,84}, {-72,85}, {-72,86}, {-72,87}, {-72,88}, {-72,89}, {-72,90}, {-71,-119}, {-71,-118}, {-71,-117}, {-71,-116}, {-71,-115}, {-71,-114}, {-71,-113}, {-71,-112}, {-71,-107}, {-71,-106}, {-71,-105}, {-71,-104}, {-71,-103}, {-71,-102}, {-71,-99}, {-71,-98}, {-71,-97}, {-71,-96}, {-71,-95}, {-71,-94}, {-71,-93}, {-71,-90}, {-71,-89}, {-71,-88}, {-71,-87}, {-71,-50}, {-71,-49}, {-71,-48}, {-71,-47}, {-71,-46}, {-71,-45}, {-71,-44}, {-71,-43}, {-71,-42}, {-71,-41}, {-71,-40}, {-71,-39}, {-71,-38}, {-71,-37}, {-71,-36}, {-71,-35}, {-71,-34}, {-71,-33}, {-71,-32}, {-71,-31}, {-71,73}, {-71,74}, {-71,75}, {-71,76}, {-71,77}, {-71,78}, {-71,81}, {-71,83}, {-71,84}, {-71,85}, {-71,86}, {-71,87}, {-71,88}, {-71,89}, {-71,90}, {-70,-119}, {-70,-118}, {-70,-117}, {-70,-116}, {-70,-115}, {-70,-114}, {-70,-113}, {-70,-112}, {-70,-111}, {-70,-106}, {-70,-105}, {-70,-104}, {-70,-103}, {-70,-102}, {-70,-101}, {-70,-100}, {-70,-97}, {-70,-96}, {-70,-95}, {-70,-94}, {-70,-93}, {-70,-92}, {-70,-90}, {-70,-89}, {-70,-88}, {-70,-87}, {-70,-50}, {-70,-49}, {-70,-48}, {-70,-47}, {-70,-46}, {-70,-45}, {-70,-44}, {-70,-43}, {-70,-42}, {-70,-41}, {-70,-40}, {-70,-39}, {-70,-38}, {-70,-37}, {-70,-36}, {-70,-35}, {-70,-34}, {-70,-32}, {-70,-31}, {-70,73}, {-70,74}, {-70,75}, {-70,76}, {-70,77}, {-70,78}, {-70,79}, {-70,80}, {-70,81}, {-70,82}, {-70,83}, {-70,84}, {-70,85}, {-70,86}, {-70,87}, {-70,88}, {-70,89}, {-70,90}, {-69,-118}, {-69,-117}, {-69,-114}, {-69,-113}, {-69,-112}, {-69,-111}, {-69,-110}, {-69,-105}, {-69,-104}, {-69,-103}, {-69,-102}, {-69,-101}, {-69,-100}, {-69,-99}, {-69,-95}, {-69,-94}, {-69,-93}, {-69,-92}, {-69,-88}, {-69,-87}, {-69,-80}, {-69,-59}, {-69,-50}, {-69,-49}, {-69,-48}, {-69,-47}, {-69,-46}, {-69,-45}, {-69,-44}, {-69,-43}, {-69,-42}, {-69,-41}, {-69,-40}, {-69,-39}, {-69,-38}, {-69,-37}, {-69,-36}, {-69,-35}, {-69,-34}, {-69,-33}, {-69,74}, {-69,75}, {-69,76}, {-69,77}, {-69,78}, {-69,79}, {-69,80}, {-69,81}, {-69,82}, {-69,83}, {-69,84}, {-69,86}, {-69,87}, {-68,-118}, {-68,-117}, {-68,-112}, {-68,-111}, {-68,-110}, {-68,-109}, {-68,-108}, {-68,-103}, {-68,-102}, {-68,-101}, {-68,-100}, {-68,-99}, {-68,-94}, {-68,-93}, {-68,-92}, {-68,-91}, {-68,-90}, {-68,-88}, {-68,-87}, {-68,-50}, {-68,-49}, {-68,-48}, {-68,-47}, {-68,-46}, {-68,-45}, {-68,-44}, {-68,-43}, {-68,-42}, {-68,-41}, {-68,-40}, {-68,-39}, {-68,-38}, {-68,-37}, {-68,-36}, {-68,-35}, {-68,-34}, {-68,-33}, {-68,-32}, {-68,-31}, {-68,74}, {-68,75}, {-68,76}, {-68,77}, {-68,78}, {-68,79}, {-68,80}, {-68,81}, {-68,82}, {-68,83}, {-68,84}, {-68,85}, {-68,86}, {-67,-118}, {-67,-117}, {-67,-116}, {-67,-115}, {-67,-111}, {-67,-110}, {-67,-109}, {-67,-108}, {-67,-107}, {-67,-106}, {-67,-102}, {-67,-101}, {-67,-100}, {-67,-99}, {-67,-98}, {-67,-97}, {-67,-93}, {-67,-92}, {-67,-91}, {-67,-90}, {-67,-89}, {-67,-88}, {-67,-87}, {-67,-50}, {-67,-49}, {-67,-48}, {-67,-47}, {-67,-46}, {-67,-45}, {-67,-44}, {-67,-43}, {-67,-42}, {-67,-41}, {-67,-40}, {-67,-39}, {-67,-38}, {-67,-37}, {-67,-36}, {-67,-35}, {-67,-34}, {-67,-33}, {-67,-32}, {-67,-31}, {-67,77}, {-67,78}, {-67,79}, {-67,81}, {-67,82}, {-67,83}, {-67,84}, {-66,-118}, {-66,-117}, {-66,-116}, {-66,-115}, {-66,-109}, {-66,-108}, {-66,-107}, {-66,-106}, {-66,-105}, {-66,-101}, {-66,-100}, {-66,-99}, {-66,-98}, {-66,-97}, {-66,-96}, {-66,-95}, {-66,-91}, {-66,-90}, {-66,-89}, {-66,-88}, {-66,-87}, {-66,-80}, {-66,-59}, {-66,-49}, {-66,-48}, {-66,-47}, {-66,-46}, {-66,-45}, {-66,-44}, {-66,-43}, {-66,-42}, {-66,-41}, {-66,-40}, {-66,-39}, {-66,-38}, {-66,-37}, {-66,-36}, {-66,-35}, {-66,-34}, {-66,-33}, {-66,-32}, {-66,-31}, {-66,78}, {-66,79}, {-66,80}, {-65,-117}, {-65,-116}, {-65,-115}, {-65,-114}, {-65,-113}, {-65,-112}, {-65,-107}, {-65,-106}, {-65,-105}, {-65,-104}, {-65,-100}, {-65,-99}, {-65,-98}, {-65,-97}, {-65,-96}, {-65,-95}, {-65,-94}, {-65,-89}, {-65,-88}, {-65,-87}, {-65,-48}, {-65,-47}, {-65,-46}, {-65,-45}, {-65,-44}, {-65,-43}, {-65,-42}, {-65,-41}, {-65,-40}, {-65,-39}, {-65,-38}, {-65,-37}, {-65,-36}, {-65,-35}, {-65,-34}, {-65,-33}, {-65,-32}, {-64,-118}, {-64,-117}, {-64,-116}, {-64,-115}, {-64,-114}, {-64,-113}, {-64,-112}, {-64,-111}, {-64,-106}, {-64,-105}, {-64,-104}, {-64,-103}, {-64,-102}, {-64,-98}, {-64,-97}, {-64,-96}, {-64,-95}, {-64,-94}, {-64,-93}, {-64,-92}, {-64,-89}, {-64,-88}, {-64,-87}, {-64,-44}, {-64,-43}, {-64,-42}, {-64,-41}, {-64,-40}, {-64,-39}, {-64,-38}, {-64,-37}, {-64,-36}, {-64,-35}, {-64,-34}, {-64,-33}, {-64,-32}, {-64,-31}, {-63,-118}, {-63,-117}, {-63,-116}, {-63,-115}, {-63,-114}, {-63,-113}, {-63,-112}, {-63,-111}, {-63,-110}, {-63,-109}, {-63,-104}, {-63,-103}, {-63,-102}, {-63,-101}, {-63,-95}, {-63,-94}, {-63,-93}, {-63,-92}, {-63,-91}, {-63,-90}, {-63,-89}, {-63,-88}, {-63,-87}, {-63,-80}, {-63,-32}, {-63,-31}, {-63,-30}, {-62,-118}, {-62,-117}, {-62,-116}, {-62,-115}, {-62,-114}, {-62,-113}, {-62,-112}, {-62,-111}, {-62,-110}, {-62,-109}, {-62,-108}, {-62,-102}, {-62,-101}, {-62,-100}, {-62,-99}, {-62,-93}, {-62,-92}, {-62,-91}, {-62,-90}, {-62,-89}, {-62,-88}, {-62,-87}, {-62,-31}, {-62,-30}, {-62,140}, {-61,-118}, {-61,-117}, {-61,-116}, {-61,-115}, {-61,-112}, {-61,-111}, {-61,-110}, {-61,-109}, {-61,-108}, {-61,-107}, {-61,-101}, {-61,-100}, {-61,-99}, {-61,-98}, {-61,-92}, {-61,-91}, {-61,-90}, {-61,-89}, {-61,-88}, {-61,-87}, {-61,140}, {-61,146}, {-60,-116}, {-60,-115}, {-60,-111}, {-60,-110}, {-60,-109}, {-60,-108}, {-60,-107}, {-60,-106}, {-60,-105}, {-60,-100}, {-60,-99}, {-60,-98}, {-60,-97}, {-60,-96}, {-60,-90}, {-60,-89}, {-60,-88}, {-60,-87}, {-60,-80}, {-60,140}, {-60,145}, {-60,146}, {-59,-116}, {-59,-115}, {-59,-114}, {-59,-113}, {-59,-110}, {-59,-109}, {-59,-108}, {-59,-107}, {-59,-106}, {-59,-105}, {-59,-104}, {-59,-103}, {-59,-98}, {-59,-97}, {-59,-96}, {-59,-95}, {-59,-94}, {-59,-89}, {-59,-88}, {-59,-87}, {-59,140}, {-59,145}, {-59,146}, {-58,-116}, {-58,-115}, {-58,-114}, {-58,-113}, {-58,-112}, {-58,-108}, {-58,-107}, {-58,-106}, {-58,-105}, {-58,-104}, {-58,-103}, {-58,-102}, {-58,-96}, {-58,-95}, {-58,-94}, {-58,-93}, {-58,-92}, {-58,-88}, {-58,-87}, {-58,140}, {-58,141}, {-58,145}, {-57,-116}, {-57,-115}, {-57,-114}, {-57,-113}, {-57,-112}, {-57,-111}, {-57,-110}, {-57,-106}, {-57,-105}, {-57,-104}, {-57,-103}, {-57,-102}, {-57,-101}, {-57,-94}, {-57,-93}, {-57,-92}, {-57,-91}, {-57,-88}, {-57,-87}, {-57,-80}, {-57,-59}, {-57,140}, {-57,141}, {-56,-116}, {-56,-115}, {-56,-114}, {-56,-113}, {-56,-112}, {-56,-111}, {-56,-110}, {-56,-109}, {-56,-104}, {-56,-103}, {-56,-102}, {-56,-101}, {-56,-100}, {-56,-99}, {-56,-98}, {-56,-93}, {-56,-92}, {-56,-91}, {-56,-90}, {-56,-89}, {-56,-88}, {-56,-87}, {-56,140}, {-56,141}, {-56,146}, {-55,-116}, {-55,-115}, {-55,-113}, {-55,-112}, {-55,-111}, {-55,-110}, {-55,-109}, {-55,-108}, {-55,-102}, {-55,-101}, {-55,-100}, {-55,-99}, {-55,-98}, {-55,-91}, {-55,-90}, {-55,-89}, {-55,-88}, {-55,-87}, {-55,140}, {-55,141}, {-55,145}, {-55,146}, {-54,-116}, {-54,-115}, {-54,-111}, {-54,-110}, {-54,-109}, {-54,-108}, {-54,-107}, {-54,-101}, {-54,-100}, {-54,-99}, {-54,-98}, {-54,-97}, {-54,-90}, {-54,-89}, {-54,-88}, {-54,-80}, {-54,-59}, {-54,140}, {-54,141}, {-54,145}, {-54,146}, {-54,147}, {-53,-116}, {-53,-115}, {-53,-110}, {-53,-109}, {-53,-108}, {-53,-107}, {-53,-106}, {-53,-100}, {-53,-99}, {-53,-98}, {-53,-97}, {-53,-96}, {-53,-95}, {-53,-94}, {-53,-89}, {-53,-88}, {-53,140}, {-53,141}, {-53,145}, {-53,146}, {-53,147}, {-52,-116}, {-52,-115}, {-52,-114}, {-52,-113}, {-52,-108}, {-52,-107}, {-52,-106}, {-52,-105}, {-52,-104}, {-52,-99}, {-52,-98}, {-52,-97}, {-52,-96}, {-52,-95}, {-52,-94}, {-52,-93}, {-52,-89}, {-52,-88}, {-52,-87}, {-52,140}, {-52,141}, {-52,146}, {-51,-116}, {-51,-115}, {-51,-114}, {-51,-113}, {-51,-107}, {-51,-106}, {-51,-105}, {-51,-104}, {-51,-103}, {-51,-102}, {-51,-97}, {-51,-96}, {-51,-95}, {-51,-94}, {-51,-93}, {-51,-92}, {-51,-91}, {-51,-89}, {-51,-88}, {-51,-87}, {-51,-78}, {-51,-77}, {-51,-74}, {-51,-65}, {-51,-62}, {-51,140}, {-51,141}, {-50,-115}, {-50,-114}, {-50,-113}, {-50,-112}, {-50,-111}, {-50,-110}, {-50,-106}, {-50,-105}, {-50,-104}, {-50,-103}, {-50,-102}, {-50,-94}, {-50,-93}, {-50,-92}, {-50,-91}, {-50,-90}, {-50,-89}, {-50,-88}, {-50,-87}, {-50,-34}, {-50,-33}, {-50,140}, {-50,141}, {-49,-115}, {-49,-114}, {-49,-113}, {-49,-112}, {-49,-111}, {-49,-110}, {-49,-109}, {-49,-104}, {-49,-103}, {-49,-102}, {-49,-101}, {-49,-100}, {-49,-92}, {-49,-91}, {-49,-90}, {-49,-89}, {-49,-88}, {-49,-87}, {-49,-34}, {-49,-33}, {-49,-32}, {-49,140}, {-49,141}, {-49,146}, {-48,-115}, {-48,-114}, {-48,-113}, {-48,-112}, {-48,-111}, {-48,-110}, {-48,-109}, {-48,-108}, {-48,-107}, {-48,-102}, {-48,-101}, {-48,-100}, {-48,-99}, {-48,-98}, {-48,-90}, {-48,-89}, {-48,-88}, {-48,-87}, {-48,-34}, {-48,-33}, {-48,-32}, {-48,-31}, {-48,-30}, {-48,140}, {-48,141}, {-48,145}, {-48,146}, {-47,-115}, {-47,-114}, {-47,-113}, {-47,-112}, {-47,-111}, {-47,-110}, {-47,-109}, {-47,-108}, {-47,-107}, {-47,-106}, {-47,-105}, {-47,-101}, {-47,-100}, {-47,-99}, {-47,-98}, {-47,-97}, {-47,-96}, {-47,-90}, {-47,-89}, {-47,-88}, {-47,-33}, {-47,-32}, {-47,-31}, {-47,-30}, {-47,140}, {-47,141}, {-47,145}, {-47,146}, {-46,-114}, {-46,-113}, {-46,-110}, {-46,-109}, {-46,-108}, {-46,-107}, {-46,-106}, {-46,-105}, {-46,-104}, {-46,-99}, {-46,-98}, {-46,-97}, {-46,-96}, {-46,-95}, {-46,-94}, {-46,-89}, {-46,-88}, {-46,-33}, {-46,-32}, {-46,-31}, {-46,-30}, {-46,140}, {-46,141}, {-46,145}, {-46,146}, {-45,-114}, {-45,-113}, {-45,-112}, {-45,-108}, {-45,-107}, {-45,-106}, {-45,-105}, {-45,-104}, {-45,-103}, {-45,-102}, {-45,-98}, {-45,-97}, {-45,-96}, {-45,-95}, {-45,-94}, {-45,-93}, {-45,-92}, {-45,-91}, {-45,-89}, {-45,-88}, {-45,-59}, {-45,-33}, {-45,-32}, {-45,140}, {-45,141}, {-45,146}, {-44,-113}, {-44,-112}, {-44,-111}, {-44,-110}, {-44,-106}, {-44,-105}, {-44,-104}, {-44,-103}, {-44,-102}, {-44,-101}, {-44,-96}, {-44,-95}, {-44,-94}, {-44,-93}, {-44,-92}, {-44,-91}, {-44,-89}, {-44,-88}, {-44,-59}, {-44,-33}, {-44,-32}, {-44,-31}, {-44,140}, {-44,141}, {-43,-113}, {-43,-112}, {-43,-111}, {-43,-110}, {-43,-109}, {-43,-108}, {-43,-104}, {-43,-103}, {-43,-102}, {-43,-101}, {-43,-100}, {-43,-95}, {-43,-94}, {-43,-93}, {-43,-92}, {-43,-91}, {-43,-90}, {-43,-89}, {-43,-88}, {-43,-76}, {-43,-75}, {-43,-74}, {-43,-32}, {-43,-31}, {-43,140}, {-43,141}, {-42,-113}, {-42,-112}, {-42,-111}, {-42,-110}, {-42,-109}, {-42,-108}, {-42,-107}, {-42,-102}, {-42,-101}, {-42,-100}, {-42,-99}, {-42,-98}, {-42,-93}, {-42,-92}, {-42,-91}, {-42,-90}, {-42,-89}, {-42,-88}, {-42,-76}, {-42,-75}, {-42,-74}, {-42,-73}, {-42,-32}, {-42,-31}, {-42,140}, {-42,141}, {-42,146}, {-41,-113}, {-41,-112}, {-41,-111}, {-41,-109}, {-41,-108}, {-41,-107}, {-41,-106}, {-41,-105}, {-41,-100}, {-41,-99}, {-41,-98}, {-41,-97}, {-41,-92}, {-41,-91}, {-41,-90}, {-41,-89}, {-41,-81}, {-41,-80}, {-41,-76}, {-41,-75}, {-41,-74}, {-41,-73}, {-41,-72}, {-41,140}, {-41,145}, {-41,146}, {-41,147}, {-40,-113}, {-40,-112}, {-40,-111}, {-40,-107}, {-40,-106}, {-40,-105}, {-40,-104}, {-40,-99}, {-40,-98}, {-40,-97}, {-40,-96}, {-40,-95}, {-40,-90}, {-40,-89}, {-40,-81}, {-40,-80}, {-40,-79}, {-40,140}, {-40,145}, {-40,146}, {-40,147}, {-39,-113}, {-39,-112}, {-39,-111}, {-39,-110}, {-39,-106}, {-39,-105}, {-39,-104}, {-39,-103}, {-39,-98}, {-39,-97}, {-39,-96}, {-39,-95}, {-39,-94}, {-39,-93}, {-39,-92}, {-39,-91}, {-39,-90}, {-39,-89}, {-39,140}, {-39,145}, {-39,146}, {-39,147}, {-38,-113}, {-38,-112}, {-38,-111}, {-38,-110}, {-38,-109}, {-38,-104}, {-38,-103}, {-38,-102}, {-38,-101}, {-38,-95}, {-38,-94}, {-38,-93}, {-38,-92}, {-38,-91}, {-38,-90}, {-38,-89}, {-38,-82}, {-38,-79}, {-38,-78}, {-38,-77}, {-38,-76}, {-38,140}, {-38,145}, {-38,146}, {-37,-113}, {-37,-112}, {-37,-111}, {-37,-110}, {-37,-109}, {-37,-108}, {-37,-107}, {-37,-103}, {-37,-102}, {-37,-101}, {-37,-100}, {-37,-94}, {-37,-93}, {-37,-92}, {-37,-91}, {-37,-90}, {-37,-89}, {-37,-82}, {-37,-81}, {-37,-80}, {-37,-79}, {-37,-78}, {-37,-77}, {-37,-76}, {-37,-53}, {-37,-52}, {-37,140}, {-36,-112}, {-36,-111}, {-36,-110}, {-36,-109}, {-36,-108}, {-36,-107}, {-36,-106}, {-36,-101}, {-36,-100}, {-36,-99}, {-36,-98}, {-36,-91}, {-36,-90}, {-36,-89}, {-36,-82}, {-36,-81}, {-36,-80}, {-36,-79}, {-36,-78}, {-36,-53}, {-36,-52}, {-36,140}, {-35,-112}, {-35,-111}, {-35,-108}, {-35,-107}, {-35,-106}, {-35,-105}, {-35,-104}, {-35,-99}, {-35,-98}, {-35,-97}, {-35,-96}, {-35,-91}, {-35,-90}, {-35,-89}, {-35,-82}, {-35,-81}, {-35,-80}, {-35,-53}, {-35,-52}, {-35,140}, {-35,146}, {-35,147}, {-34,-112}, {-34,-111}, {-34,-107}, {-34,-106}, {-34,-105}, {-34,-104}, {-34,-103}, {-34,-102}, {-34,-98}, {-34,-97}, {-34,-96}, {-34,-95}, {-34,-94}, {-34,-91}, {-34,-90}, {-34,-89}, {-34,-80}, {-34,-79}, {-34,-78}, {-34,-77}, {-34,-76}, {-34,-75}, {-34,-74}, {-34,140}, {-34,145}, {-34,146}, {-34,147}, {-33,-112}, {-33,-111}, {-33,-106}, {-33,-105}, {-33,-104}, {-33,-103}, {-33,-102}, {-33,-101}, {-33,-96}, {-33,-95}, {-33,-94}, {-33,-93}, {-33,-92}, {-33,-91}, {-33,-90}, {-33,-89}, {-33,-80}, {-33,-79}, {-33,-78}, {-33,-77}, {-33,-76}, {-33,-75}, {-33,-74}, {-33,145}, {-33,146}, {-33,147}, {-32,-112}, {-32,-111}, {-32,-110}, {-32,-104}, {-32,-103}, {-32,-102}, {-32,-101}, {-32,-100}, {-32,-99}, {-32,-95}, {-32,-94}, {-32,-93}, {-32,-92}, {-32,-91}, {-32,-90}, {-32,-83}, {-32,-82}, {-32,-81}, {-32,-80}, {-32,-79}, {-32,-78}, {-32,-77}, {-32,-74}, {-32,-44}, {-32,-43}, {-32,146}, {-32,147}, {-31,-111}, {-31,-110}, {-31,-109}, {-31,-108}, {-31,-102}, {-31,-101}, {-31,-100}, {-31,-99}, {-31,-98}, {-31,-93}, {-31,-92}, {-31,-91}, {-31,-90}, {-31,-83}, {-31,-82}, {-31,-81}, {-31,-74}, {-31,-44}, {-31,-43}, {-30,-111}, {-30,-110}, {-30,-109}, {-30,-108}, {-30,-107}, {-30,-106}, {-30,-105}, {-30,-100}, {-30,-99}, {-30,-98}, {-30,-97}, {-30,-96}, {-30,-91}, {-30,-90}, {-30,-83}, {-30,-82}, {-30,-81}, {-30,-74}, {-30,-44}, {-30,-43}, {-29,-111}, {-29,-110}, {-29,-109}, {-29,-108}, {-29,-107}, {-29,-106}, {-29,-105}, {-29,-104}, {-29,-103}, {-29,-99}, {-29,-98}, {-29,-97}, {-29,-96}, {-29,-95}, {-29,-94}, {-29,-92}, {-29,-91}, {-29,-90}, {-29,-84}, {-29,-83}, {-29,-82}, {-29,-81}, {-29,-80}, {-29,-79}, {-29,-78}, {-29,-77}, {-29,-74}, {-29,-44}, {-29,-43}, {-28,-111}, {-28,-110}, {-28,-107}, {-28,-106}, {-28,-105}, {-28,-104}, {-28,-103}, {-28,-102}, {-28,-97}, {-28,-96}, {-28,-95}, {-28,-94}, {-28,-93}, {-28,-92}, {-28,-91}, {-28,-82}, {-28,-81}, {-28,-80}, {-28,-79}, {-28,-78}, {-28,-77}, {-28,-76}, {-28,-75}, {-28,-74}, {-28,-44}, {-28,-43}, {-28,-42}, {-28,-41}, {-28,-40}, {-28,-39}, {-27,-111}, {-27,-110}, {-27,-105}, {-27,-104}, {-27,-103}, {-27,-102}, {-27,-101}, {-27,-100}, {-27,-95}, {-27,-94}, {-27,-93}, {-27,-92}, {-27,-91}, {-27,-83}, {-27,-82}, {-27,-81}, {-27,-80}, {-27,-79}, {-27,-78}, {-27,-77}, {-27,-76}, {-27,-75}, {-27,-74}, {-27,-44}, {-27,-43}, {-27,-42}, {-27,-41}, {-27,-40}, {-27,-39}, {-26,-111}, {-26,-110}, {-26,-109}, {-26,-108}, {-26,-103}, {-26,-102}, {-26,-101}, {-26,-100}, {-26,-99}, {-26,-98}, {-26,-92}, {-26,-91}, {-26,-84}, {-26,-83}, {-26,-82}, {-26,-81}, {-26,-44}, {-26,-43}, {-26,-42}, {-26,-41}, {-26,-40}, {-25,-112}, {-25,-111}, {-25,-110}, {-25,-109}, {-25,-108}, {-25,-107}, {-25,-106}, {-25,-101}, {-25,-100}, {-25,-99}, {-25,-98}, {-25,-97}, {-25,-92}, {-25,-91}, {-25,-84}, {-25,-83}, {-25,-82}, {-25,-44}, {-25,-43}, {-25,-42}, {-25,-41}, {-25,-40}, {-24,-112}, {-24,-111}, {-24,-110}, {-24,-109}, {-24,-108}, {-24,-107}, {-24,-106}, {-24,-105}, {-24,-104}, {-24,-99}, {-24,-98}, {-24,-97}, {-24,-96}, {-24,-95}, {-24,-94}, {-24,-92}, {-24,-91}, {-24,-83}, {-24,-82}, {-24,-81}, {-24,-80}, {-24,-79}, {-24,-78}, {-24,-77}, {-24,-76}, {-24,-75}, {-24,-74}, {-24,-44}, {-24,-43}, {-24,-42}, {-24,-41}, {-24,-40}, {-23,-112}, {-23,-111}, {-23,-110}, {-23,-108}, {-23,-107}, {-23,-106}, {-23,-105}, {-23,-104}, {-23,-103}, {-23,-102}, {-23,-97}, {-23,-96}, {-23,-95}, {-23,-94}, {-23,-93}, {-23,-92}, {-23,-91}, {-23,-82}, {-23,-81}, {-23,-80}, {-23,-79}, {-23,-78}, {-23,-77}, {-23,-76}, {-23,-75}, {-23,-74}, {-23,-53}, {-23,-52}, {-23,-44}, {-23,-43}, {-23,-42}, {-23,-41}, {-23,-40}, {-23,148}, {-22,-112}, {-22,-111}, {-22,-110}, {-22,-106}, {-22,-105}, {-22,-104}, {-22,-103}, {-22,-102}, {-22,-101}, {-22,-100}, {-22,-96}, {-22,-95}, {-22,-94}, {-22,-93}, {-22,-92}, {-22,-91}, {-22,-84}, {-22,-83}, {-22,-82}, {-22,-81}, {-22,-79}, {-22,-78}, {-22,-77}, {-22,-76}, {-22,-75}, {-22,-74}, {-22,-53}, {-22,-52}, {-22,-51}, {-22,-44}, {-22,-43}, {-22,-42}, {-22,-41}, {-22,-20}, {-22,-19}, {-22,-18}, {-22,-17}, {-22,-16}, {-22,-15}, {-22,-14}, {-22,-13}, {-22,-12}, {-22,-11}, {-22,26}, {-22,27}, {-22,28}, {-22,29}, {-22,30}, {-22,31}, {-22,32}, {-22,148}, {-22,149}, {-21,-111}, {-21,-110}, {-21,-109}, {-21,-104}, {-21,-103}, {-21,-102}, {-21,-101}, {-21,-100}, {-21,-99}, {-21,-98}, {-21,-95}, {-21,-94}, {-21,-93}, {-21,-92}, {-21,-91}, {-21,-85}, {-21,-84}, {-21,-83}, {-21,-53}, {-21,-52}, {-21,-51}, {-21,-44}, {-21,-43}, {-21,-42}, {-21,-17}, {-21,-16}, {-21,-15}, {-21,-14}, {-21,-13}, {-21,-12}, {-21,-11}, {-21,27}, {-21,28}, {-21,29}, {-21,30}, {-21,31}, {-21,32}, {-21,33}, {-21,148}, {-21,149}, {-20,-111}, {-20,-110}, {-20,-109}, {-20,-108}, {-20,-107}, {-20,-102}, {-20,-101}, {-20,-100}, {-20,-99}, {-20,-98}, {-20,-97}, {-20,-96}, {-20,-93}, {-20,-92}, {-20,-85}, {-20,-84}, {-20,-83}, {-20,-52}, {-20,-51}, {-20,-44}, {-20,-43}, {-20,-42}, {-20,27}, {-20,28}, {-20,29}, {-20,30}, {-20,31}, {-20,32}, {-20,33}, {-20,148}, {-20,149}, {-19,-110}, {-19,-109}, {-19,-108}, {-19,-107}, {-19,-106}, {-19,-101}, {-19,-100}, {-19,-99}, {-19,-98}, {-19,-97}, {-19,-96}, {-19,-95}, {-19,-94}, {-19,-93}, {-19,-92}, {-19,-85}, {-19,-84}, {-19,-83}, {-19,-82}, {-19,-81}, {-19,-80}, {-19,-79}, {-19,-78}, {-19,-77}, {-19,-76}, {-19,-75}, {-19,-74}, {-19,-54}, {-19,-53}, {-19,-52}, {-19,-51}, {-19,27}, {-19,28}, {-19,29}, {-19,30}, {-19,31}, {-19,32}, {-19,33}, {-19,148}, {-19,149}, {-18,-110}, {-18,-109}, {-18,-108}, {-18,-107}, {-18,-106}, {-18,-105}, {-18,-100}, {-18,-99}, {-18,-98}, {-18,-97}, {-18,-96}, {-18,-95}, {-18,-94}, {-18,-93}, {-18,-92}, {-18,-83}, {-18,-82}, {-18,-81}, {-18,-80}, {-18,-79}, {-18,-78}, {-18,-77}, {-18,-76}, {-18,-75}, {-18,-74}, {-18,-54}, {-18,-53}, {-18,-52}, {-18,-51}, {-18,28}, {-18,29}, {-18,30}, {-18,31}, {-18,32}, {-18,33}, {-18,34}, {-18,92}, {-18,94}, {-18,100}, {-18,101}, {-18,148}, {-18,149}, {-17,-111}, {-17,-110}, {-17,-109}, {-17,-107}, {-17,-106}, {-17,-105}, {-17,-104}, {-17,-103}, {-17,-99}, {-17,-98}, {-17,-97}, {-17,-96}, {-17,-95}, {-17,-94}, {-17,-93}, {-17,-85}, {-17,-84}, {-17,-83}, {-17,-82}, {-17,-81}, {-17,-80}, {-17,-79}, {-17,-78}, {-17,-77}, {-17,-76}, {-17,-75}, {-17,-74}, {-17,-54}, {-17,-53}, {-17,-52}, {-17,-51}, {-17,28}, {-17,29}, {-17,30}, {-17,31}, {-17,32}, {-17,33}, {-17,34}, {-17,89}, {-17,91}, {-17,92}, {-17,93}, {-17,94}, {-17,95}, {-17,96}, {-17,97}, {-17,99}, {-17,100}, {-17,101}, {-17,148}, {-17,149}, {-16,-111}, {-16,-110}, {-16,-109}, {-16,-108}, {-16,-105}, {-16,-104}, {-16,-103}, {-16,-102}, {-16,-101}, {-16,-95}, {-16,-94}, {-16,-93}, {-16,-85}, {-16,-84}, {-16,-83}, {-16,-53}, {-16,-52}, {-16,-51}, {-16,-33}, {-16,-32}, {-16,-31}, {-16,29}, {-16,30}, {-16,87}, {-16,88}, {-16,90}, {-16,91}, {-16,92}, {-16,93}, {-16,94}, {-16,95}, {-16,96}, {-16,98}, {-16,101}, {-16,102}, {-16,103}, {-16,104}, {-16,105}, {-16,111}, {-16,148}, {-16,149}, {-15,-111}, {-15,-110}, {-15,-109}, {-15,-108}, {-15,-107}, {-15,-105}, {-15,-104}, {-15,-103}, {-15,-102}, {-15,-101}, {-15,-100}, {-15,-94}, {-15,-93}, {-15,-85}, {-15,-84}, {-15,-83}, {-15,-53}, {-15,-52}, {-15,-51}, {-15,-33}, {-15,-32}, {-15,-31}, {-15,-30}, {-15,-29}, {-15,-28}, {-15,-27}, {-15,29}, {-15,30}, {-15,85}, {-15,86}, {-15,87}, {-15,88}, {-15,89}, {-15,90}, {-15,91}, {-15,92}, {-15,93}, {-15,94}, {-15,95}, {-15,96}, {-15,97}, {-15,98}, {-15,99}, {-15,100}, {-15,101}, {-15,102}, {-15,103}, {-15,104}, {-15,105}, {-15,106}, {-15,111}, {-15,112}, {-15,148}, {-15,149}, {-14,-109}, {-14,-108}, {-14,-107}, {-14,-106}, {-14,-102}, {-14,-101}, {-14,-100}, {-14,-99}, {-14,-98}, {-14,-94}, {-14,-93}, {-14,-85}, {-14,-84}, {-14,-83}, {-14,-82}, {-14,-81}, {-14,-80}, {-14,-79}, {-14,-78}, {-14,-77}, {-14,-76}, {-14,-75}, {-14,-74}, {-14,-52}, {-14,-51}, {-14,-34}, {-14,-33}, {-14,-32}, {-14,-31}, {-14,-30}, {-14,-29}, {-14,-28}, {-14,-27}, {-14,-26}, {-14,30}, {-14,85}, {-14,88}, {-14,89}, {-14,90}, {-14,91}, {-14,94}, {-14,95}, {-14,96}, {-14,97}, {-14,98}, {-14,99}, {-14,100}, {-14,101}, {-14,102}, {-14,103}, {-14,105}, {-14,106}, {-14,110}, {-14,111}, {-14,112}, {-14,113}, {-14,148}, {-14,149}, {-14,150}, {-13,-108}, {-13,-107}, {-13,-106}, {-13,-105}, {-13,-100}, {-13,-99}, {-13,-98}, {-13,-97}, {-13,-96}, {-13,-94}, {-13,-93}, {-13,-83}, {-13,-82}, {-13,-81}, {-13,-80}, {-13,-79}, {-13,-78}, {-13,-77}, {-13,-76}, {-13,-75}, {-13,-74}, {-13,-52}, {-13,-51}, {-13,-35}, {-13,-34}, {-13,-33}, {-13,-32}, {-13,-31}, {-13,-30}, {-13,-29}, {-13,-28}, {-13,-27}, {-13,-26}, {-13,-25}, {-13,88}, {-13,89}, {-13,90}, {-13,95}, {-13,96}, {-13,98}, {-13,99}, {-13,100}, {-13,101}, {-13,102}, {-13,103}, {-13,104}, {-13,105}, {-13,106}, {-13,112}, {-13,113}, {-13,114}, {-13,115}, {-13,148}, {-13,149}, {-13,150}, {-12,-106}, {-12,-105}, {-12,-104}, {-12,-98}, {-12,-97}, {-12,-96}, {-12,-95}, {-12,-94}, {-12,-93}, {-12,-86}, {-12,-83}, {-12,-82}, {-12,-81}, {-12,-80}, {-12,-79}, {-12,-78}, {-12,-77}, {-12,-76}, {-12,-75}, {-12,-74}, {-12,-52}, {-12,-51}, {-12,-35}, {-12,-34}, {-12,-33}, {-12,-32}, {-12,-31}, {-12,-30}, {-12,-29}, {-12,-28}, {-12,-26}, {-12,-25}, {-12,-24}, {-12,-23}, {-12,-22}, {-12,-21}, {-12,89}, {-12,90}, {-12,91}, {-12,95}, {-12,96}, {-12,97}, {-12,98}, {-12,99}, {-12,100}, {-12,101}, {-12,102}, {-12,103}, {-12,104}, {-12,105}, {-12,107}, {-12,113}, {-12,114}, {-12,115}, {-12,148}, {-12,149}, {-12,150}, {-11,-106}, {-11,-105}, {-11,-104}, {-11,-103}, {-11,-102}, {-11,-97}, {-11,-96}, {-11,-95}, {-11,-94}, {-11,-93}, {-11,-86}, {-11,-85}, {-11,-84}, {-11,-35}, {-11,-34}, {-11,-33}, {-11,-32}, {-11,-31}, {-11,-30}, {-11,-29}, {-11,-28}, {-11,-26}, {-11,-25}, {-11,-24}, {-11,-23}, {-11,-22}, {-11,-21}, {-11,87}, {-11,88}, {-11,89}, {-11,90}, {-11,91}, {-11,95}, {-11,96}, {-11,97}, {-11,98}, {-11,99}, {-11,100}, {-11,101}, {-11,102}, {-11,104}, {-11,105}, {-11,106}, {-11,107}, {-11,108}, {-11,114}, {-11,115}, {-11,116}, {-11,149}, {-11,150}, {-10,-104}, {-10,-103}, {-10,-102}, {-10,-101}, {-10,-96}, {-10,-95}, {-10,-94}, {-10,-93}, {-10,-86}, {-10,-85}, {-10,-84}, {-10,-35}, {-10,-34}, {-10,-33}, {-10,-32}, {-10,-31}, {-10,-30}, {-10,-29}, {-10,-28}, {-10,-27}, {-10,-26}, {-10,-25}, {-10,-24}, {-10,-23}, {-10,-22}, {-10,86}, {-10,87}, {-10,88}, {-10,89}, {-10,90}, {-10,91}, {-10,92}, {-10,93}, {-10,97}, {-10,98}, {-10,99}, {-10,100}, {-10,101}, {-10,102}, {-10,103}, {-10,104}, {-10,105}, {-10,106}, {-10,107}, {-10,108}, {-10,114}, {-10,116}, {-10,149}, {-10,150}, {-9,-102}, {-9,-101}, {-9,-100}, {-9,-99}, {-9,-98}, {-9,-97}, {-9,-96}, {-9,-95}, {-9,-94}, {-9,-93}, {-9,-86}, {-9,-85}, {-9,-84}, {-9,-83}, {-9,-82}, {-9,-81}, {-9,-80}, {-9,-79}, {-9,-78}, {-9,-77}, {-9,-76}, {-9,-75}, {-9,-74}, {-9,-37}, {-9,-36}, {-9,-35}, {-9,-34}, {-9,-33}, {-9,-32}, {-9,-31}, {-9,-30}, {-9,-29}, {-9,-28}, {-9,-27}, {-9,-26}, {-9,-25}, {-9,-24}, {-9,-23}, {-9,-22}, {-9,89}, {-9,90}, {-9,91}, {-9,92}, {-9,93}, {-9,94}, {-9,95}, {-9,96}, {-9,97}, {-9,98}, {-9,99}, {-9,100}, {-9,101}, {-9,102}, {-9,103}, {-9,104}, {-9,105}, {-9,106}, {-9,107}, {-9,108}, {-9,109}, {-9,114}, {-9,148}, {-9,149}, {-9,150}, {-8,-101}, {-8,-100}, {-8,-99}, {-8,-98}, {-8,-97}, {-8,-96}, {-8,-95}, {-8,-84}, {-8,-83}, {-8,-82}, {-8,-81}, {-8,-80}, {-8,-79}, {-8,-78}, {-8,-77}, {-8,-76}, {-8,-75}, {-8,-74}, {-8,-37}, {-8,-36}, {-8,-35}, {-8,-34}, {-8,-33}, {-8,-32}, {-8,-31}, {-8,-30}, {-8,-29}, {-8,-28}, {-8,87}, {-8,88}, {-8,90}, {-8,91}, {-8,92}, {-8,93}, {-8,94}, {-8,95}, {-8,96}, {-8,97}, {-8,98}, {-8,103}, {-8,104}, {-8,106}, {-8,107}, {-8,108}, {-8,148}, {-8,149}, {-8,150}, {-7,-98}, {-7,-97}, {-7,-96}, {-7,-95}, {-7,-86}, {-7,-85}, {-7,-84}, {-7,-83}, {-7,-82}, {-7,-81}, {-7,-80}, {-7,-79}, {-7,-78}, {-7,-77}, {-7,-76}, {-7,-75}, {-7,-74}, {-7,-37}, {-7,-36}, {-7,-35}, {-7,-34}, {-7,-33}, {-7,-32}, {-7,-31}, {-7,-30}, {-7,-29}, {-7,86}, {-7,87}, {-7,89}, {-7,90}, {-7,91}, {-7,92}, {-7,93}, {-7,94}, {-7,95}, {-7,96}, {-7,108}, {-7,148}, {-7,149}, {-7,150}, {-6,-97}, {-6,-96}, {-6,-95}, {-6,-87}, {-6,-86}, {-6,-85}, {-6,-37}, {-6,-36}, {-6,-35}, {-6,-34}, {-6,-33}, {-6,87}, {-6,88}, {-6,89}, {-6,90}, {-6,148}, {-6,149}, {-6,150}, {-5,-111}, {-5,-110}, {-5,-109}, {-5,-87}, {-5,-86}, {-5,-85}, {-5,-37}, {-5,-36}, {-5,-35}, {-5,87}, {-5,90}, {-5,148}, {-5,149}, {-4,-111}, {-4,-110}, {-4,-109}, {-4,-108}, {-4,-107}, {-4,-85}, {-4,-84}, {-4,-83}, {-4,-82}, {-4,-81}, {-4,-80}, {-4,-79}, {-4,-78}, {-4,-77}, {-4,-76}, {-4,-75}, {-4,-74}, {-4,28}, {-4,30}, {-4,86}, {-4,88}, {-4,89}, {-4,148}, {-4,149}, {-3,-110}, {-3,-109}, {-3,-108}, {-3,-107}, {-3,-85}, {-3,-84}, {-3,-83}, {-3,-82}, {-3,-81}, {-3,-80}, {-3,-79}, {-3,-78}, {-3,-77}, {-3,-76}, {-3,-75}, {-3,-74}, {-3,28}, {-3,30}, {-3,84}, {-3,85}, {-3,87}, {-3,148}, {-3,149}, {-2,-110}, {-2,-109}, {-2,-108}, {-2,-107}, {-2,-106}, {-2,-105}, {-2,-104}, {-2,-87}, {-2,-86}, {-2,-85}, {-2,-84}, {-2,-83}, {-2,-82}, {-2,-81}, {-2,-80}, {-2,-79}, {-2,-78}, {-2,-77}, {-2,-76}, {-2,25}, {-2,26}, {-2,27}, {-2,28}, {-2,29}, {-2,30}, {-2,84}, {-2,85}, {-2,86}, {-2,148}, {-2,149}, {-1,-109}, {-1,-108}, {-1,-107}, {-1,-106}, {-1,-105}, {-1,-104}, {-1,-103}, {-1,-87}, {-1,-86}, {-1,-85}, {-1,-1}, {-1,0}, {-1,1}, {-1,23}, {-1,24}, {-1,25}, {-1,27}, {-1,28}, {-1,29}, {-1,30}, {-1,148}, {0,-109}, {0,-108}, {0,-107}, {0,-106}, {0,-105}, {0,-104}, {0,-103}, {0,-102}, {0,-101}, {0,-87}, {0,-86}, {0,-85}, {0,-74}, {0,-1}, {0,0}, {0,1}, {0,20}, {0,21}, {0,22}, {0,23}, {0,24}, {0,25}, {0,26}, {0,27}, {0,28}, {0,29}, {0,30}, {0,31}, {0,32}, {0,33}, {0,34}, {0,148}, {1,-109}, {1,-108}, {1,-107}, {1,-106}, {1,-103}, {1,-102}, {1,-101}, {1,-100}, {1,-99}, {1,-85}, {1,-84}, {1,-83}, {1,-82}, {1,-81}, {1,-80}, {1,-79}, {1,-78}, {1,-77}, {1,-76}, {1,-75}, {1,-74}, {1,-1}, {1,0}, {1,1}, {1,18}, {1,19}, {1,20}, {1,21}, {1,22}, {1,23}, {1,24}, {1,25}, {1,26}, {1,27}, {1,28}, {1,29}, {1,30}, {1,31}, {1,32}, {1,33}, {1,34}, {1,148}, {2,-109}, {2,-108}, {2,-107}, {2,-106}, {2,-105}, {2,-103}, {2,-102}, {2,-101}, {2,-100}, {2,-99}, {2,-98}, {2,-85}, {2,-84}, {2,-83}, {2,-82}, {2,-81}, {2,-80}, {2,-79}, {2,-78}, {2,-77}, {2,-76}, {2,-75}, {2,-74}, {2,8}, {2,9}, {2,10}, {2,11}, {2,12}, {2,13}, {2,14}, {2,15}, {2,16}, {2,17}, {2,18}, {2,19}, {2,20}, {2,21}, {2,22}, {2,23}, {2,24}, {2,25}, {2,26}, {2,27}, {2,28}, {2,29}, {2,30}, {2,31}, {2,32}, {2,33}, {2,34}, {2,148}, {3,-109}, {3,-108}, {3,-107}, {3,-106}, {3,-105}, {3,-104}, {3,-101}, {3,-100}, {3,-99}, {3,-98}, {3,-87}, {3,-86}, {3,-83}, {3,-82}, {3,-81}, {3,-80}, {3,-79}, {3,-78}, {3,-77}, {3,-76}, {3,-75}, {3,-74}, {3,-17}, {3,-16}, {3,-15}, {3,-14}, {3,-13}, {3,-12}, {3,-11}, {3,-10}, {3,-9}, {3,-8}, {3,-7}, {3,1}, {3,2}, {3,7}, {3,8}, {3,9}, {3,10}, {3,11}, {3,12}, {3,13}, {3,14}, {3,15}, {3,16}, {3,17}, {3,18}, {3,19}, {3,20}, {3,21}, {3,22}, {3,23}, {3,24}, {3,25}, {3,26}, {3,27}, {3,28}, {3,29}, {3,30}, {3,31}, {3,32}, {3,33}, {3,34}, {4,-109}, {4,-108}, {4,-107}, {4,-106}, {4,-105}, {4,-98}, {4,-97}, {4,-87}, {4,-86}, {4,-18}, {4,-17}, {4,-16}, {4,-15}, {4,-14}, {4,-13}, {4,-12}, {4,-11}, {4,-10}, {4,-9}, {4,-8}, {4,-7}, {4,-6}, {4,-5}, {4,-4}, {4,-3}, {4,-2}, {4,-1}, {4,0}, {4,1}, {4,2}, {4,6}, {4,7}, {4,8}, {4,9}, {4,10}, {4,11}, {4,12}, {4,13}, {4,14}, {4,15}, {4,16}, {4,17}, {4,18}, {4,19}, {4,20}, {4,21}, {4,22}, {4,23}, {4,24}, {4,25}, {4,26}, {4,27}, {4,28}, {4,29}, {4,30}, {4,31}, {4,32}, {4,33}, {5,-109}, {5,-108}, {5,-107}, {5,-106}, {5,-105}, {5,-104}, {5,-103}, {5,-102}, {5,-101}, {5,-100}, {5,-97}, {5,-96}, {5,-87}, {5,-86}, {5,-20}, {5,-19}, {5,-18}, {5,-17}, {5,-16}, {5,-15}, {5,-14}, {5,-13}, {5,-12}, {5,-11}, {5,-10}, {5,-9}, {5,-8}, {5,-7}, {5,-6}, {5,-5}, {5,-4}, {5,-3}, {5,-2}, {5,-1}, {5,0}, {5,1}, {5,2}, {5,3}, {5,4}, {5,5}, {5,6}, {5,7}, {5,8}, {5,9}, {5,10}, {5,11}, {5,12}, {5,13}, {5,14}, {5,15}, {5,16}, {5,17}, {5,18}, {5,19}, {5,20}, {5,21}, {5,22}, {5,23}, {5,24}, {5,25}, {5,26}, {5,27}, {5,28}, {5,29}, {5,30}, {5,31}, {5,32}, {6,-109}, {6,-108}, {6,-107}, {6,-106}, {6,-105}, {6,-104}, {6,-103}, {6,-102}, {6,-101}, {6,-100}, {6,-99}, {6,-98}, {6,-96}, {6,-85}, {6,-84}, {6,-83}, {6,-82}, {6,-81}, {6,-80}, {6,-79}, {6,-78}, {6,-77}, {6,-76}, {6,-75}, {6,-74}, {6,-23}, {6,-22}, {6,-21}, {6,-20}, {6,-19}, {6,-18}, {6,-17}, {6,-16}, {6,-15}, {6,-14}, {6,-13}, {6,-12}, {6,-11}, {6,-10}, {6,-9}, {6,-8}, {6,-7}, {6,-6}, {6,-5}, {6,-4}, {6,-3}, {6,-2}, {6,-1}, {6,0}, {6,1}, {6,2}, {6,3}, {6,4}, {6,5}, {6,6}, {6,7}, {6,8}, {6,9}, {6,10}, {6,11}, {6,12}, {6,13}, {6,14}, {6,15}, {6,16}, {6,17}, {6,18}, {6,19}, {6,20}, {6,21}, {6,22}, {6,23}, {6,24}, {6,25}, {6,26}, {6,27}, {6,28}, {6,29}, {6,30}, {7,-109}, {7,-108}, {7,-107}, {7,-106}, {7,-105}, {7,-104}, {7,-103}, {7,-102}, {7,-101}, {7,-100}, {7,-99}, {7,-95}, {7,-85}, {7,-84}, {7,-83}, {7,-82}, {7,-81}, {7,-80}, {7,-79}, {7,-78}, {7,-77}, {7,-76}, {7,-75}, {7,-74}, {7,-26}, {7,-25}, {7,-24}, {7,-23}, {7,-22}, {7,-21}, {7,-20}, {7,-19}, {7,-18}, {7,-17}, {7,-16}, {7,-15}, {7,-14}, {7,-13}, {7,-12}, {7,-11}, {7,-10}, {7,-9}, {7,-8}, {7,-7}, {7,-6}, {7,-5}, {7,-4}, {7,-3}, {7,-2}, {7,-1}, {7,0}, {7,1}, {7,2}, {7,3}, {7,4}, {7,5}, {7,6}, {7,7}, {7,8}, {7,9}, {7,10}, {7,11}, {7,12}, {7,13}, {7,14}, {7,15}, {7,16}, {7,17}, {7,18}, {7,19}, {7,20}, {7,21}, {7,22}, {7,23}, {7,24}, {7,25}, {7,26}, {7,27}, {7,28}, {7,29}, {8,-101}, {8,-100}, {8,-99}, {8,-98}, {8,-95}, {8,-94}, {8,-87}, {8,-86}, {8,-85}, {8,-84}, {8,-83}, {8,-82}, {8,-81}, {8,-80}, {8,-79}, {8,-78}, {8,-77}, {8,-76}, {8,-75}, {8,-74}, {8,-30}, {8,-29}, {8,-28}, {8,-27}, {8,-26}, {8,-25}, {8,-24}, {8,-23}, {8,-22}, {8,-21}, {8,-20}, {8,-19}, {8,-17}, {8,-16}, {8,-15}, {8,-14}, {8,-13}, {8,-12}, {8,-11}, {8,-10}, {8,-9}, {8,-8}, {8,-7}, {8,-6}, {8,-5}, {8,-4}, {8,-3}, {8,-2}, {8,-1}, {8,0}, {8,1}, {8,2}, {8,3}, {8,4}, {8,5}, {8,6}, {8,7}, {8,8}, {8,9}, {8,10}, {8,11}, {8,12}, {8,13}, {8,14}, {8,15}, {8,16}, {8,17}, {8,18}, {8,19}, {8,20}, {8,21}, {8,22}, {8,25}, {8,26}, {8,27}, {8,28}, {9,-100}, {9,-99}, {9,-98}, {9,-97}, {9,-94}, {9,-87}, {9,-86}, {9,-85}, {9,-35}, {9,-34}, {9,-33}, {9,-32}, {9,-31}, {9,-30}, {9,-29}, {9,-28}, {9,-27}, {9,-26}, {9,-25}, {9,-24}, {9,-23}, {9,-22}, {9,-21}, {9,-20}, {9,-15}, {9,-14}, {9,-13}, {9,-12}, {9,-11}, {9,-10}, {9,-9}, {9,-8}, {9,-7}, {9,-6}, {9,-5}, {9,-4}, {9,-3}, {9,-2}, {9,-1}, {9,0}, {9,1}, {9,2}, {9,3}, {9,4}, {9,5}, {9,6}, {9,7}, {9,8}, {9,9}, {9,10}, {9,11}, {9,19}, {9,20}, {9,21}, {9,28}, {9,143}, {9,144}, {9,145}, {9,146}, {9,147}, {10,-99}, {10,-98}, {10,-97}, {10,-96}, {10,-94}, {10,-87}, {10,-86}, {10,-85}, {10,142}, {10,143}, {10,144}, {10,145}, {10,146}, {11,-99}, {11,-98}, {11,-97}, {11,-96}, {11,-87}, {11,-86}, {11,-85}, {11,-84}, {11,-83}, {11,-82}, {11,-81}, {11,-80}, {11,-79}, {11,-78}, {11,-77}, {11,141}, {11,142}, {11,143}, {11,144}, {11,145}, {11,146}, {12,-99}, {12,-98}, {12,-97}, {12,-96}, {12,-84}, {12,-83}, {12,-82}, {12,-81}, {12,-80}, {12,-79}, {12,-78}, {12,141}, {12,142}, {12,143}, {12,144}, {13,-99}, {13,-98}, {13,-97}, {13,-96}, {13,-95}, {13,-94}, {13,-84}, {13,-83}, {13,-82}, {13,-81}, {13,-80}, {13,-79}, {13,141}, {13,142}, {13,143}, {13,144}, {14,-99}, {14,-98}, {14,-97}, {14,-96}, {14,-95}, {14,-94}, {14,-86}, {14,-85}, {14,-84}, {14,-83}, {14,-82}, {14,-81}, {14,-80}, {14,140}, {14,141}, {14,142}, {14,143}, {14,144}, {15,-97}, {15,-96}, {15,-95}, {15,-94}, {15,-93}, {15,140}, {15,141}, {15,142}, {15,143}, {16,-97}, {16,-96}, {16,-95}, {16,-94}, {16,-93}, {16,140}, {16,141}, {16,142}, {17,-97}, {17,-96}, {17,-95}, {17,-94}, {17,-93}, {17,-92}, {17,-79}, {17,-78}, {17,-77}, {17,-76}, {17,-75}, {17,-74}, {17,-73}, {17,-72}, {17,-11}, {17,-10}, {17,-9}, {17,-8}, {17,140}, {17,141}, {17,142}, {18,-95}, {18,-94}, {18,-93}, {18,-92}, {18,-80}, {18,-79}, {18,-78}, {18,-77}, {18,-76}, {18,-75}, {18,-74}, {18,-73}, {18,-13}, {18,-10}, {18,-9}, {18,-8}, {18,141}, {18,142}, {19,-95}, {19,-94}, {19,-93}, {19,-92}, {19,-81}, {19,-80}, {19,-79}, {19,-78}, {19,-77}, {19,-76}, {19,-75}, {19,-74}, {19,-73}, {19,-9}, {19,140}, {19,141}, {19,142}, {20,-95}, {20,-94}, {20,-93}, {20,-92}, {20,-83}, {20,-82}, {20,-81}, {20,-80}, {20,-79}, {20,-78}, {20,-77}, {20,-76}, {20,-75}, {20,-74}, {20,-73}, {20,140}, {20,141}, {20,142}, {21,-95}, {21,-94}, {21,-93}, {21,-92}, {21,-83}, {21,-82}, {21,-81}, {21,-80}, {21,-79}, {21,-78}, {21,-77}, {21,-76}, {21,-75}, {21,-74}, {21,140}, {21,141}, {21,142}, {22,-83}, {22,-82}, {22,-81}, {22,-80}, {22,-79}, {22,-78}, {22,-77}, {22,-76}, {22,-75}, {22,-74}, {22,-42}, {22,-41}, {22,-30}, {22,-29}, {22,-28}, {22,-27}, {22,-26}, {22,-22}, {22,-21}, {22,-20}, {22,140}, {22,141}, {22,142}, {23,-82}, {23,-81}, {23,-80}, {23,-79}, {23,-78}, {23,-77}, {23,-76}, {23,-75}, {23,-74}, {23,-67}, {23,-42}, {23,-41}, {23,-32}, {23,-31}, {23,-30}, {23,-29}, {23,-28}, {23,-27}, {23,-26}, {23,-25}, {23,-24}, {23,-23}, {23,-22}, {23,-21}, {23,-20}, {23,140}, {23,141}, {23,142}, {24,-97}, {24,-96}, {24,-82}, {24,-81}, {24,-80}, {24,-79}, {24,-78}, {24,-77}, {24,-76}, {24,-75}, {24,-67}, {24,-42}, {24,-41}, {24,-40}, {24,-32}, {24,-31}, {24,-30}, {24,-29}, {24,-28}, {24,-27}, {24,-26}, {24,-25}, {24,-24}, {24,-23}, {24,-22}, {24,-21}, {24,-20}, {24,-19}, {24,-18}, {24,-17}, {24,140}, {24,141}, {24,142}, {25,-97}, {25,-96}, {25,-95}, {25,-94}, {25,-93}, {25,-82}, {25,-81}, {25,-80}, {25,-79}, {25,-78}, {25,-77}, {25,-76}, {25,-75}, {25,-68}, {25,-41}, {25,-40}, {25,-32}, {25,-31}, {25,-30}, {25,-29}, {25,-28}, {25,-27}, {25,-26}, {25,-25}, {25,-22}, {25,-21}, {25,-20}, {25,-19}, {25,-18}, {25,-17}, {25,-16}, {25,-15}, {25,-12}, {25,140}, {25,141}, {26,-97}, {26,-96}, {26,-95}, {26,-94}, {26,-93}, {26,-81}, {26,-80}, {26,-79}, {26,-78}, {26,-77}, {26,-76}, {26,-75}, {26,-68}, {26,-67}, {26,-41}, {26,-40}, {26,-39}, {26,-32}, {26,-31}, {26,-30}, {26,-29}, {26,-28}, {26,-26}, {26,-25}, {26,-22}, {26,-21}, {26,-20}, {26,-19}, {26,-18}, {26,-17}, {26,-16}, {26,-12}, {26,140}, {27,-97}, {27,-96}, {27,-95}, {27,-94}, {27,-81}, {27,-80}, {27,-79}, {27,-78}, {27,-77}, {27,-76}, {27,-75}, {27,-74}, {27,-68}, {27,-67}, {27,-41}, {27,-40}, {27,-39}, {27,-32}, {27,-31}, {27,-30}, {27,-29}, {27,-28}, {27,-27}, {27,-26}, {27,-25}, {27,-24}, {27,-23}, {27,-22}, {27,-21}, {27,-20}, {27,-19}, {27,-18}, {27,-17}, {27,-16}, {28,-97}, {28,-96}, {28,-95}, {28,-94}, {28,-81}, {28,-80}, {28,-79}, {28,-78}, {28,-77}, {28,-76}, {28,-75}, {28,-74}, {28,-68}, {28,-41}, {28,-40}, {28,-39}, {28,-32}, {28,-31}, {28,-30}, {28,-29}, {28,-28}, {28,-27}, {28,-26}, {28,-25}, {28,-24}, {28,-23}, {28,-22}, {28,-21}, {28,-20}, {28,-19}, {28,-18}, {28,-17}, {28,-13}, {29,-97}, {29,-96}, {29,-95}, {29,-94}, {29,-81}, {29,-80}, {29,-79}, {29,-78}, {29,-77}, {29,-76}, {29,-75}, {29,-74}, {29,-68}, {29,-67}, {29,-41}, {29,-40}, {29,-39}, {29,-31}, {29,-30}, {29,-29}, {29,-28}, {29,-27}, {29,-26}, {29,-25}, {29,-24}, {29,-23}, {29,-21}, {29,-20}, {29,-19}, {29,-18}, {29,78}, {29,79}, {29,80}, {29,81}, {30,-97}, {30,-96}, {30,-95}, {30,-94}, {30,-81}, {30,-80}, {30,-79}, {30,-78}, {30,-77}, {30,-76}, {30,-75}, {30,-74}, {30,-68}, {30,-67}, {30,-41}, {30,-40}, {30,-39}, {30,-30}, {30,-29}, {30,-28}, {30,-27}, {30,-26}, {30,-25}, {30,-24}, {31,-97}, {31,-96}, {31,-95}, {31,-94}, {31,-80}, {31,-79}, {31,-78}, {31,-77}, {31,-76}, {31,-75}, {31,-74}, {31,-41}, {31,-40}, {31,-39}, {31,-26}, {31,-25}, {32,-97}, {32,-96}, {32,-95}, {32,-94}, {32,-80}, {32,-79}, {32,-78}, {32,-77}, {32,-76}, {32,-75}, {32,-74}, {32,-67}, {32,-41}, {32,-40}, {32,-39}, {33,-97}, {33,-96}, {33,-95}, {33,-94}, {33,-80}, {33,-79}, {33,-78}, {33,-77}, {33,-76}, {33,-75}, {33,-67}, {33,-41}, {33,-40}, {33,62}, {33,63}, {33,64}, {33,65}, {33,66}, {33,67}, {33,68}, {33,69}, {33,70}, {33,71}, {34,-80}, {34,-79}, {34,-78}, {34,-77}, {34,-76}, {34,-75}, {34,-41}, {35,-80}, {35,-79}, {35,-78}, {35,-77}, {35,-76}, {35,-75}, {36,-79}, {36,-78}, {36,-77}, {36,-76}, {36,-75}, {37,-79}, {37,-78}, {37,-77}, {37,-76}, {37,-75}, {38,-79}, {38,-78}, {38,-77}, {38,-76}, {38,-75}, {39,-90}, {39,-89}, {39,-88}, {39,-79}, {39,-78}, {39,-77}, {39,-76}, {39,-10}, {40,-90}, {40,-89}, {40,-88}, {40,-78}, {40,-77}, {40,-76}, {40,-41}, {40,-40}, {41,-78}, {41,-77}, {41,-76}, {41,-41}, {41,-40}, {42,-78}, {42,-77}, {42,-76}, {42,-67}, {42,-41}, {42,-40}, {42,-39}, {43,-78}, {43,-77}, {43,-76}, {43,-75}, {43,-67}, {43,-41}, {43,-40}, {43,-39}, {43,-38}, {44,-77}, {44,-76}, {44,-75}, {44,-41}, {44,-40}, {44,-39}, {44,-38}, {45,-102}, {45,-101}, {45,-77}, {45,-76}, {45,-75}, {45,-68}, {45,-67}, {45,-41}, {45,-40}, {45,-39}, {45,-38}, {46,-102}, {46,-101}, {46,-77}, {46,-76}, {46,-75}, {46,-68}, {46,-67}, {46,-41}, {46,-40}, {46,-39}, {46,-38}, {47,-102}, {47,-101}, {47,-100}, {47,-77}, {47,-76}, {47,-75}, {47,-68}, {47,-41}, {47,-40}, {47,-39}, {47,-38}, {48,-102}, {48,-101}, {48,-100}, {48,-76}, {48,-75}, {48,-68}, {48,-67}, {48,-41}, {48,-40}, {48,-39}, {48,-38}, {49,-102}, {49,-101}, {49,-100}, {49,-90}, {49,-89}, {49,-88}, {49,-76}, {49,-75}, {49,-68}, {49,-67}, {49,-41}, {49,-40}, {49,-39}, {50,-102}, {50,-101}, {50,-100}, {50,-92}, {50,-91}, {50,-90}, {50,-89}, {50,-76}, {50,-75}, {50,-74}, {50,-68}, {50,-41}, {50,-40}, {50,-39}, {51,-102}, {51,-101}, {51,-100}, {51,-99}, {51,-93}, {51,-92}, {51,-91}, {51,-76}, {51,-75}, {51,-74}, {51,-68}, {51,-67}, {51,-42}, {51,-41}, {51,-40}, {52,-101}, {52,-100}, {52,-99}, {52,-98}, {52,-93}, {52,-92}, {52,-75}, {52,-74}, {52,-68}, {52,-67}, {52,-42}, {52,-41}, {52,-40}, {53,-75}, {53,-74}, {53,-67}, {53,-42}, {53,-41}, {54,-75}, {54,-74}, {55,-75}, {55,-74}, {56,-74}, {57,-74}, {58,-74}, {58,-73}, {59,-74}, {59,-73}, {59,122}, {59,123}, {59,124}, {59,131}, {60,-73}, {60,121}, {60,122}, {60,123}, {60,124}, {60,125}, {60,126}, {60,129}, {60,130}, {61,-73}, {61,120}, {61,121}, {61,122}, {61,123}, {61,124}, {61,125}, {61,126}, {61,127}, {61,128}, {61,129}, {61,130}, {62,-73}, {62,56}, {62,120}, {62,121}, {62,122}, {62,123}, {62,126}, {62,127}, {62,128}, {62,129}, {62,130}, {63,56}, {63,121}, {63,122}, {63,123}, {63,127}, {63,129}, {63,130}, {63,145}, {63,146}, {64,56}, {64,120}, {64,121}, {64,122}, {64,123}, {64,128}, {64,129}, {64,130}, {64,131}, {64,145}, {64,146}, {64,147}, {65,56}, {65,120}, {65,121}, {65,122}, {65,123}, {65,124}, {65,127}, {65,128}, {65,129}, {65,130}, {65,131}, {65,145}, {65,146}, {65,147}, {66,56}, {66,120}, {66,121}, {66,122}, {66,123}, {66,126}, {66,127}, {66,128}, {66,129}, {66,130}, {66,131}, {66,145}, {66,146}, {67,56}, {67,120}, {67,121}, {67,122}, {67,123}, {67,125}, {67,126}, {67,127}, {67,128}, {67,129}, {67,130}, {67,145}, {67,146}, {68,56}, {68,121}, {68,122}, {68,125}, {68,126}, {68,127}, {68,128}, {68,129}, {68,145}, {68,146}, {69,120}, {69,121}, {69,122}, {69,123}, {69,124}, {69,125}, {69,126}, {69,127}, {69,128}, {69,145}, {69,146}, {70,120}, {70,121}, {70,122}, {70,123}, {70,124}, {70,125}, {70,126}, {70,127}, {70,145}, {71,-77}, {71,120}, {71,121}, {71,122}, {71,123}, {71,124}, {71,125}, {71,126}, {71,127}, {71,145}, {72,-77}, {72,-76}, {72,52}, {72,121}, {72,122}, {72,123}, {72,124}, {72,125}, {72,145}, {73,-77}, {73,-76}, {73,-75}, {73,-68}, {73,-67}, {73,52}, {73,145}, {73,146}, {74,-76}, {74,-75}, {74,-68}, {74,-67}, {74,52}, {74,145}, {74,146}, {75,-76}, {75,-75}, {75,-67}, {75,145}, {75,146}, {76,-76}, {76,-75}, {76,145}, {76,146}, {77,-75}, {77,145}, {77,146}, {78,-75}, {78,-74}, {78,145}, {79,-75}, {79,-74}, {79,-73}, {79,145}, {80,-74}, {80,-73}, {80,-72}, {80,145}, {81,-74}, {81,-73}, {81,-72}, {81,-37}, {81,145}, {81,146}, {82,-74}, {82,-73}, {82,-72}, {82,-71}, {82,-37}, {82,145}, {82,146}, {83,-73}, {83,-72}, {83,-71}, {83,-70}, {83,145}, {84,-73}, {84,-72}, {84,-71}, {84,-70}, {84,-69}, {84,-68}, {84,-34}, {84,-33}, {84,-32}, {85,-35}, {85,-34}, {85,-33}, {85,-32}, {86,-34}, {86,-33}, {86,-32}, {87,-34}, {87,-33}, {87,-32}, {88,-34}, {88,-33}, {88,-32}, {90,51}, {90,52}, {90,53}, {91,51}, {91,52}, {91,53}, {92,51}, {92,52}, {92,53}, }, + ["mineral-tan-dirt-5"] = {{-96,-26}, {-96,-25}, {-96,-24}, {-96,-23}, {-96,-22}, {-96,-21}, {-96,-20}, {-96,-19}, {-96,-18}, {-96,-17}, {-96,-16}, {-96,-15}, {-96,-14}, {-96,-13}, {-96,-12}, {-96,-11}, {-96,-10}, {-96,-9}, {-96,-8}, {-96,-7}, {-96,-6}, {-96,4}, {-96,5}, {-96,6}, {-96,7}, {-96,8}, {-96,9}, {-96,10}, {-96,11}, {-96,12}, {-96,13}, {-96,14}, {-96,15}, {-96,16}, {-96,17}, {-96,18}, {-96,19}, {-96,20}, {-96,21}, {-96,22}, {-96,23}, {-96,24}, {-96,25}, {-96,26}, {-96,27}, {-96,28}, {-96,29}, {-96,30}, {-96,31}, {-96,32}, {-96,37}, {-96,38}, {-96,39}, {-96,40}, {-96,41}, {-96,42}, {-95,-29}, {-95,-28}, {-95,-27}, {-95,-26}, {-95,-25}, {-95,-21}, {-95,-20}, {-95,-17}, {-95,-16}, {-95,-15}, {-95,-14}, {-95,-13}, {-95,-12}, {-95,-11}, {-95,-8}, {-95,-7}, {-95,-6}, {-95,-5}, {-95,-4}, {-95,-3}, {-95,-2}, {-95,-1}, {-95,0}, {-95,1}, {-95,2}, {-95,3}, {-95,4}, {-95,5}, {-95,6}, {-95,7}, {-95,8}, {-95,18}, {-95,19}, {-95,20}, {-95,39}, {-95,40}, {-95,41}, {-95,42}, {-94,-30}, {-94,-29}, {-94,-5}, {-94,-4}, {-94,-3}, {-94,-2}, {-94,-1}, {-94,0}, {-94,1}, {-94,2}, {-94,3}, {-94,4}, {-94,5}, {-94,35}, {-94,36}, {-94,37}, {-94,42}, {-93,-30}, {-93,-29}, {-93,-28}, {-93,23}, {-93,24}, {-93,25}, {-93,26}, {-93,27}, {-93,28}, {-93,29}, {-93,30}, {-93,43}, {-93,44}, {-93,45}, {-93,46}, {-93,47}, {-93,48}, {-93,49}, {-93,50}, {-93,51}, {-93,52}, {-93,53}, {-93,54}, {-93,55}, {-93,56}, {-93,57}, {-93,58}, {-93,59}, {-93,60}, {-93,61}, {-93,62}, {-93,63}, {-93,64}, {-93,65}, {-93,66}, {-93,67}, {-93,78}, {-93,79}, {-93,80}, {-93,81}, {-93,82}, {-93,83}, {-93,84}, {-93,85}, {-93,86}, {-93,87}, {-93,88}, {-93,89}, {-93,90}, {-93,91}, {-93,92}, {-93,93}, {-93,94}, {-93,95}, {-93,96}, {-93,97}, {-93,98}, {-93,99}, {-93,100}, {-93,101}, {-93,102}, {-93,103}, {-93,104}, {-93,105}, {-93,106}, {-93,107}, {-93,108}, {-92,-30}, {-92,-10}, {-92,-9}, {-92,-8}, {-92,13}, {-92,14}, {-92,15}, {-92,16}, {-92,17}, {-92,18}, {-92,19}, {-92,24}, {-92,25}, {-92,26}, {-92,27}, {-92,28}, {-92,29}, {-92,30}, {-92,44}, {-92,45}, {-92,46}, {-92,47}, {-92,48}, {-92,49}, {-92,50}, {-92,51}, {-92,52}, {-92,53}, {-92,54}, {-92,55}, {-92,56}, {-92,57}, {-92,58}, {-92,59}, {-92,60}, {-92,61}, {-92,62}, {-92,63}, {-92,64}, {-92,65}, {-92,66}, {-92,67}, {-92,78}, {-92,79}, {-92,80}, {-92,81}, {-92,82}, {-92,83}, {-92,84}, {-92,85}, {-92,86}, {-92,87}, {-92,88}, {-92,89}, {-92,90}, {-92,91}, {-92,92}, {-92,93}, {-92,94}, {-92,95}, {-92,96}, {-92,97}, {-92,98}, {-92,99}, {-92,100}, {-92,101}, {-92,102}, {-92,103}, {-92,104}, {-92,105}, {-92,106}, {-92,107}, {-92,108}, {-91,-30}, {-91,-10}, {-91,-9}, {-91,-8}, {-91,-7}, {-91,-6}, {-91,-5}, {-91,-4}, {-91,-3}, {-91,-2}, {-91,12}, {-91,13}, {-91,14}, {-91,15}, {-91,16}, {-91,17}, {-91,18}, {-91,19}, {-91,20}, {-91,25}, {-91,26}, {-91,27}, {-91,28}, {-91,29}, {-91,30}, {-91,44}, {-91,45}, {-91,46}, {-91,47}, {-91,48}, {-91,49}, {-91,62}, {-91,63}, {-91,64}, {-91,65}, {-91,66}, {-91,67}, {-91,68}, {-91,69}, {-91,70}, {-91,77}, {-91,78}, {-91,79}, {-91,80}, {-91,81}, {-91,82}, {-91,83}, {-91,84}, {-91,85}, {-91,86}, {-91,87}, {-91,88}, {-91,89}, {-91,90}, {-91,91}, {-91,92}, {-91,93}, {-91,94}, {-91,105}, {-91,106}, {-91,107}, {-91,108}, {-90,-109}, {-90,-108}, {-90,-107}, {-90,-106}, {-90,-105}, {-90,-104}, {-90,-103}, {-90,-102}, {-90,-101}, {-90,-100}, {-90,-99}, {-90,-98}, {-90,-97}, {-90,-37}, {-90,-36}, {-90,-35}, {-90,-34}, {-90,-33}, {-90,-32}, {-90,-31}, {-90,-30}, {-90,-11}, {-90,-10}, {-90,-9}, {-90,-8}, {-90,-7}, {-90,-6}, {-90,-5}, {-90,-4}, {-90,-3}, {-90,-2}, {-90,-1}, {-90,0}, {-90,1}, {-90,10}, {-90,11}, {-90,12}, {-90,13}, {-90,14}, {-90,15}, {-90,16}, {-90,17}, {-90,18}, {-90,19}, {-90,20}, {-90,21}, {-90,29}, {-90,30}, {-90,36}, {-90,37}, {-90,38}, {-90,39}, {-90,64}, {-90,65}, {-90,66}, {-90,67}, {-90,68}, {-90,69}, {-90,70}, {-90,71}, {-90,72}, {-90,73}, {-90,74}, {-90,75}, {-90,76}, {-90,77}, {-90,78}, {-90,79}, {-90,80}, {-90,81}, {-90,82}, {-90,83}, {-90,84}, {-90,85}, {-90,86}, {-90,106}, {-90,107}, {-90,108}, {-89,-119}, {-89,-118}, {-89,-117}, {-89,-109}, {-89,-108}, {-89,-107}, {-89,-106}, {-89,-105}, {-89,-104}, {-89,-103}, {-89,-102}, {-89,-101}, {-89,-100}, {-89,-99}, {-89,-98}, {-89,-97}, {-89,-37}, {-89,-36}, {-89,-35}, {-89,-34}, {-89,-33}, {-89,-32}, {-89,-31}, {-89,-30}, {-89,-29}, {-89,-10}, {-89,-9}, {-89,-8}, {-89,-7}, {-89,-6}, {-89,-5}, {-89,-4}, {-89,-3}, {-89,-2}, {-89,-1}, {-89,0}, {-89,1}, {-89,2}, {-89,3}, {-89,9}, {-89,10}, {-89,11}, {-89,12}, {-89,13}, {-89,14}, {-89,15}, {-89,16}, {-89,17}, {-89,18}, {-89,19}, {-89,20}, {-89,21}, {-89,22}, {-89,42}, {-89,50}, {-89,53}, {-89,54}, {-89,55}, {-89,56}, {-89,57}, {-89,68}, {-89,69}, {-89,70}, {-89,71}, {-89,72}, {-89,73}, {-89,74}, {-89,75}, {-89,76}, {-89,77}, {-89,97}, {-89,98}, {-89,99}, {-89,100}, {-89,101}, {-89,102}, {-89,107}, {-89,108}, {-89,109}, {-89,110}, {-89,111}, {-89,112}, {-89,113}, {-89,114}, {-89,115}, {-89,116}, {-89,117}, {-89,118}, {-88,-120}, {-88,-119}, {-88,-118}, {-88,-117}, {-88,-116}, {-88,-109}, {-88,-108}, {-88,-107}, {-88,-106}, {-88,-105}, {-88,-100}, {-88,-99}, {-88,-98}, {-88,-97}, {-88,-39}, {-88,-38}, {-88,-37}, {-88,-36}, {-88,-35}, {-88,-34}, {-88,-33}, {-88,-32}, {-88,-31}, {-88,-30}, {-88,23}, {-88,50}, {-88,60}, {-88,62}, {-88,63}, {-88,81}, {-88,82}, {-88,83}, {-88,84}, {-88,85}, {-88,86}, {-88,87}, {-88,88}, {-88,89}, {-88,90}, {-88,91}, {-88,92}, {-88,93}, {-88,94}, {-88,95}, {-88,104}, {-88,109}, {-88,110}, {-88,111}, {-88,112}, {-88,113}, {-88,114}, {-88,115}, {-88,116}, {-88,117}, {-88,118}, {-87,-121}, {-87,-120}, {-87,-119}, {-87,-118}, {-87,-117}, {-87,-116}, {-87,-115}, {-87,-109}, {-87,-108}, {-87,-107}, {-87,-99}, {-87,-98}, {-87,-97}, {-87,-96}, {-87,-95}, {-87,-94}, {-87,-93}, {-87,-92}, {-87,-91}, {-87,-90}, {-87,-89}, {-87,-42}, {-87,-41}, {-87,-40}, {-87,-39}, {-87,-38}, {-87,-37}, {-87,-36}, {-87,-35}, {-87,-34}, {-87,-33}, {-87,-32}, {-87,60}, {-87,62}, {-87,63}, {-87,64}, {-87,65}, {-87,66}, {-87,77}, {-87,78}, {-87,79}, {-87,80}, {-87,81}, {-87,82}, {-87,83}, {-87,84}, {-87,85}, {-87,86}, {-87,87}, {-87,88}, {-87,89}, {-87,90}, {-87,91}, {-87,92}, {-87,93}, {-87,94}, {-87,95}, {-87,104}, {-87,105}, {-87,106}, {-87,114}, {-87,115}, {-87,116}, {-87,117}, {-87,118}, {-86,-122}, {-86,-121}, {-86,-120}, {-86,-119}, {-86,-118}, {-86,-117}, {-86,-116}, {-86,-115}, {-86,-114}, {-86,-113}, {-86,-112}, {-86,-111}, {-86,-110}, {-86,-109}, {-86,-103}, {-86,-97}, {-86,-96}, {-86,-95}, {-86,-94}, {-86,-93}, {-86,-92}, {-86,-91}, {-86,-90}, {-86,-89}, {-86,-88}, {-86,-52}, {-86,-51}, {-86,-50}, {-86,-49}, {-86,-48}, {-86,-47}, {-86,-46}, {-86,-45}, {-86,-44}, {-86,-43}, {-86,-42}, {-86,-41}, {-86,-40}, {-86,-39}, {-86,-38}, {-86,-37}, {-86,-36}, {-86,-35}, {-86,-27}, {-86,43}, {-86,44}, {-86,45}, {-86,46}, {-86,62}, {-86,63}, {-86,64}, {-86,65}, {-86,66}, {-86,69}, {-86,70}, {-86,71}, {-86,72}, {-86,73}, {-86,74}, {-86,75}, {-86,76}, {-86,77}, {-86,78}, {-86,79}, {-86,80}, {-86,81}, {-86,82}, {-86,83}, {-86,84}, {-86,85}, {-86,86}, {-86,87}, {-86,88}, {-86,89}, {-86,90}, {-86,91}, {-86,92}, {-86,104}, {-86,105}, {-86,106}, {-86,107}, {-86,116}, {-86,117}, {-86,118}, {-85,-123}, {-85,-122}, {-85,-121}, {-85,-120}, {-85,-119}, {-85,-118}, {-85,-117}, {-85,-116}, {-85,-115}, {-85,-114}, {-85,-113}, {-85,-112}, {-85,-111}, {-85,-110}, {-85,-104}, {-85,-103}, {-85,-102}, {-85,-95}, {-85,-94}, {-85,-93}, {-85,-92}, {-85,-91}, {-85,-90}, {-85,-89}, {-85,-88}, {-85,-52}, {-85,-51}, {-85,-50}, {-85,-49}, {-85,-48}, {-85,-47}, {-85,-46}, {-85,-45}, {-85,-44}, {-85,-43}, {-85,-42}, {-85,-41}, {-85,-40}, {-85,-39}, {-85,-27}, {-85,42}, {-85,43}, {-85,44}, {-85,45}, {-85,46}, {-85,63}, {-85,64}, {-85,65}, {-85,67}, {-85,68}, {-85,69}, {-85,70}, {-85,71}, {-85,72}, {-85,73}, {-85,74}, {-85,75}, {-85,76}, {-85,77}, {-85,78}, {-85,79}, {-85,80}, {-85,81}, {-85,82}, {-85,88}, {-85,89}, {-85,90}, {-85,91}, {-85,92}, {-85,105}, {-85,106}, {-85,107}, {-85,108}, {-85,109}, {-85,110}, {-85,111}, {-85,112}, {-85,113}, {-85,117}, {-85,118}, {-84,-124}, {-84,-123}, {-84,-122}, {-84,-106}, {-84,-105}, {-84,-104}, {-84,-103}, {-84,-102}, {-84,-101}, {-84,-100}, {-84,-93}, {-84,-92}, {-84,-91}, {-84,-90}, {-84,-89}, {-84,-88}, {-84,-52}, {-84,-51}, {-84,-50}, {-84,-49}, {-84,-48}, {-84,-47}, {-84,-46}, {-84,-44}, {-84,-43}, {-84,-42}, {-84,-34}, {-84,-33}, {-84,-32}, {-84,-31}, {-84,-30}, {-84,-27}, {-84,41}, {-84,42}, {-84,43}, {-84,44}, {-84,45}, {-84,67}, {-84,68}, {-84,88}, {-84,89}, {-84,90}, {-84,91}, {-84,117}, {-84,118}, {-83,-125}, {-83,-124}, {-83,-123}, {-83,-107}, {-83,-106}, {-83,-105}, {-83,-100}, {-83,-99}, {-83,-98}, {-83,-90}, {-83,-89}, {-83,-88}, {-83,-87}, {-83,-86}, {-83,-85}, {-83,-84}, {-83,-83}, {-83,-79}, {-83,-78}, {-83,-77}, {-83,-76}, {-83,-75}, {-83,-71}, {-83,-70}, {-83,-69}, {-83,-68}, {-83,-67}, {-83,-66}, {-83,-63}, {-83,-62}, {-83,-61}, {-83,-57}, {-83,-56}, {-83,-55}, {-83,-54}, {-83,-53}, {-83,-52}, {-83,-51}, {-83,-50}, {-83,-49}, {-83,-48}, {-83,-46}, {-83,-45}, {-83,-44}, {-83,-37}, {-83,-36}, {-83,-35}, {-83,-34}, {-83,-33}, {-83,-32}, {-83,-31}, {-83,-30}, {-83,-27}, {-83,41}, {-83,42}, {-83,43}, {-83,44}, {-83,45}, {-83,117}, {-83,118}, {-82,-126}, {-82,-125}, {-82,-124}, {-82,-119}, {-82,-118}, {-82,-117}, {-82,-116}, {-82,-115}, {-82,-114}, {-82,-113}, {-82,-112}, {-82,-111}, {-82,-110}, {-82,-109}, {-82,-108}, {-82,-107}, {-82,-98}, {-82,-97}, {-82,-96}, {-82,-95}, {-82,-89}, {-82,-88}, {-82,-87}, {-82,-86}, {-82,-85}, {-82,-84}, {-82,-83}, {-82,-82}, {-82,-78}, {-82,-77}, {-82,-76}, {-82,-75}, {-82,-74}, {-82,-73}, {-82,-72}, {-82,-66}, {-82,-65}, {-82,-64}, {-82,-63}, {-82,-62}, {-82,-61}, {-82,-60}, {-82,-56}, {-82,-55}, {-82,-54}, {-82,-53}, {-82,-52}, {-82,-51}, {-82,-50}, {-82,-49}, {-82,-48}, {-82,-47}, {-82,-46}, {-82,-41}, {-82,-40}, {-82,-39}, {-82,-38}, {-82,-37}, {-82,-36}, {-82,-31}, {-82,-30}, {-82,-27}, {-82,118}, {-81,-127}, {-81,-126}, {-81,-125}, {-81,-120}, {-81,-119}, {-81,-118}, {-81,-117}, {-81,-116}, {-81,-115}, {-81,-114}, {-81,-113}, {-81,-112}, {-81,-111}, {-81,-110}, {-81,-109}, {-81,-96}, {-81,-95}, {-81,-94}, {-81,-93}, {-81,-86}, {-81,-85}, {-81,-84}, {-81,-83}, {-81,-82}, {-81,-78}, {-81,-77}, {-81,-76}, {-81,-75}, {-81,-74}, {-81,-73}, {-81,-72}, {-81,-67}, {-81,-66}, {-81,-65}, {-81,-64}, {-81,-63}, {-81,-62}, {-81,-61}, {-81,-56}, {-81,-55}, {-81,-54}, {-81,-53}, {-81,-52}, {-81,-51}, {-81,-50}, {-81,-49}, {-81,-45}, {-81,-44}, {-81,-43}, {-81,-42}, {-81,-41}, {-81,-40}, {-81,-39}, {-81,-38}, {-81,-37}, {-81,-36}, {-81,-31}, {-81,-30}, {-81,-27}, {-81,118}, {-81,119}, {-81,120}, {-81,121}, {-80,-128}, {-80,-127}, {-80,-126}, {-80,-125}, {-80,-121}, {-80,-120}, {-80,-119}, {-80,-110}, {-80,-109}, {-80,-95}, {-80,-94}, {-80,-93}, {-80,-92}, {-80,-91}, {-80,-83}, {-80,-82}, {-80,-78}, {-80,-77}, {-80,-76}, {-80,-75}, {-80,-74}, {-80,-73}, {-80,-72}, {-80,-67}, {-80,-66}, {-80,-65}, {-80,-64}, {-80,-63}, {-80,-62}, {-80,-61}, {-80,-56}, {-80,-55}, {-80,-54}, {-80,-52}, {-80,-51}, {-80,-47}, {-80,-46}, {-80,-45}, {-80,-44}, {-80,-43}, {-80,-42}, {-80,-41}, {-80,-40}, {-80,-39}, {-80,-38}, {-80,-33}, {-80,-32}, {-80,-31}, {-80,-30}, {-80,-27}, {-80,119}, {-80,120}, {-80,121}, {-80,122}, {-80,123}, {-79,-128}, {-79,-127}, {-79,-126}, {-79,-125}, {-79,-122}, {-79,-121}, {-79,-120}, {-79,-92}, {-79,-91}, {-79,-90}, {-79,-89}, {-79,-81}, {-79,-77}, {-79,-76}, {-79,-75}, {-79,-74}, {-79,-73}, {-79,-72}, {-79,-71}, {-79,-67}, {-79,-66}, {-79,-65}, {-79,-64}, {-79,-63}, {-79,-62}, {-79,-61}, {-79,-57}, {-79,-56}, {-79,-54}, {-79,-53}, {-79,-52}, {-79,-49}, {-79,-48}, {-79,-47}, {-79,-46}, {-79,-45}, {-79,-44}, {-79,-43}, {-79,-42}, {-79,-41}, {-79,-38}, {-79,-34}, {-79,-33}, {-79,-32}, {-79,-31}, {-79,-30}, {-79,-29}, {-79,-27}, {-79,119}, {-79,120}, {-79,121}, {-79,122}, {-79,123}, {-79,124}, {-79,125}, {-78,-128}, {-78,-127}, {-78,-126}, {-78,-125}, {-78,-122}, {-78,-121}, {-78,-90}, {-78,-89}, {-78,-88}, {-78,-87}, {-78,-86}, {-78,-81}, {-78,-76}, {-78,-75}, {-78,-74}, {-78,-73}, {-78,-72}, {-78,-71}, {-78,-67}, {-78,-66}, {-78,-65}, {-78,-64}, {-78,-63}, {-78,-62}, {-78,-57}, {-78,-56}, {-78,-55}, {-78,-51}, {-78,-50}, {-78,-49}, {-78,-48}, {-78,-47}, {-78,-46}, {-78,-45}, {-78,-44}, {-78,-43}, {-78,-42}, {-78,-41}, {-78,-35}, {-78,-34}, {-78,-33}, {-78,-32}, {-78,-31}, {-78,-30}, {-78,-29}, {-78,-27}, {-78,124}, {-78,125}, {-78,126}, {-78,127}, {-77,-128}, {-77,-127}, {-77,-126}, {-77,-125}, {-77,-122}, {-77,-121}, {-77,-88}, {-77,-87}, {-77,-86}, {-77,-85}, {-77,-84}, {-77,-81}, {-77,-76}, {-77,-75}, {-77,-74}, {-77,-73}, {-77,-72}, {-77,-71}, {-77,-68}, {-77,-67}, {-77,-66}, {-77,-65}, {-77,-64}, {-77,-63}, {-77,-62}, {-77,-57}, {-77,-56}, {-77,-53}, {-77,-52}, {-77,-51}, {-77,-50}, {-77,-49}, {-77,-48}, {-77,-46}, {-77,-44}, {-77,-34}, {-77,-33}, {-77,-32}, {-77,-31}, {-77,-30}, {-77,-29}, {-77,-27}, {-77,125}, {-77,126}, {-77,127}, {-76,-128}, {-76,-127}, {-76,-126}, {-76,-125}, {-76,-122}, {-76,-121}, {-76,-86}, {-76,-85}, {-76,-84}, {-76,-81}, {-76,-75}, {-76,-74}, {-76,-73}, {-76,-72}, {-76,-71}, {-76,-68}, {-76,-67}, {-76,-66}, {-76,-65}, {-76,-64}, {-76,-63}, {-76,-58}, {-76,-57}, {-76,-56}, {-76,-54}, {-76,-53}, {-76,-52}, {-76,-51}, {-76,-32}, {-76,-31}, {-76,-30}, {-76,-29}, {-76,-27}, {-76,126}, {-76,127}, {-75,-128}, {-75,-127}, {-75,-126}, {-75,-125}, {-75,-122}, {-75,-121}, {-75,-85}, {-75,-84}, {-75,-81}, {-75,-75}, {-75,-74}, {-75,-73}, {-75,-72}, {-75,-71}, {-75,-68}, {-75,-67}, {-75,-66}, {-75,-65}, {-75,-64}, {-75,-58}, {-75,-57}, {-75,-54}, {-75,-53}, {-75,-52}, {-75,-32}, {-75,-31}, {-75,-30}, {-75,-29}, {-75,-27}, {-75,119}, {-75,126}, {-75,127}, {-74,-127}, {-74,-126}, {-74,-125}, {-74,-122}, {-74,-121}, {-74,-85}, {-74,-84}, {-74,-81}, {-74,-72}, {-74,-71}, {-74,-68}, {-74,-67}, {-74,-66}, {-74,-65}, {-74,-64}, {-74,-58}, {-74,-57}, {-74,-54}, {-74,-53}, {-74,-52}, {-74,-32}, {-74,-31}, {-74,-30}, {-74,-29}, {-74,127}, {-74,128}, {-74,129}, {-74,130}, {-74,131}, {-73,-127}, {-73,-126}, {-73,-125}, {-73,-121}, {-73,-120}, {-73,-85}, {-73,-84}, {-73,-81}, {-73,-80}, {-73,-67}, {-73,-58}, {-73,-57}, {-73,-54}, {-73,-53}, {-73,-52}, {-73,-32}, {-73,-31}, {-73,-30}, {-73,-29}, {-73,130}, {-73,131}, {-73,132}, {-73,133}, {-73,134}, {-73,135}, {-72,-127}, {-72,-126}, {-72,-125}, {-72,-121}, {-72,-120}, {-72,-86}, {-72,-85}, {-72,-84}, {-72,-81}, {-72,-58}, {-72,-57}, {-72,-54}, {-72,-53}, {-72,-52}, {-72,-31}, {-72,-30}, {-72,-29}, {-72,-28}, {-72,133}, {-72,134}, {-72,135}, {-72,136}, {-72,137}, {-72,138}, {-72,139}, {-71,-127}, {-71,-126}, {-71,-125}, {-71,-124}, {-71,-121}, {-71,-120}, {-71,-86}, {-71,-85}, {-71,-84}, {-71,-81}, {-71,-58}, {-71,-57}, {-71,-54}, {-71,-53}, {-71,-52}, {-71,-51}, {-71,-30}, {-71,-29}, {-71,-28}, {-71,137}, {-71,138}, {-71,139}, {-71,140}, {-71,141}, {-71,142}, {-71,143}, {-70,-127}, {-70,-126}, {-70,-125}, {-70,-124}, {-70,-121}, {-70,-120}, {-70,-86}, {-70,-85}, {-70,-81}, {-70,-58}, {-70,-57}, {-70,-54}, {-70,-53}, {-70,-52}, {-70,-51}, {-70,-33}, {-70,-30}, {-70,-29}, {-70,-28}, {-70,127}, {-70,128}, {-70,140}, {-70,141}, {-70,142}, {-70,143}, {-70,144}, {-70,145}, {-70,146}, {-70,147}, {-69,-127}, {-69,-126}, {-69,-125}, {-69,-124}, {-69,-120}, {-69,-119}, {-69,-86}, {-69,-85}, {-69,-81}, {-69,-58}, {-69,-57}, {-69,-54}, {-69,-53}, {-69,-52}, {-69,-51}, {-69,-32}, {-69,-31}, {-69,-30}, {-69,-29}, {-69,-28}, {-69,132}, {-69,133}, {-69,134}, {-69,135}, {-69,142}, {-69,143}, {-69,144}, {-69,145}, {-69,146}, {-69,147}, {-69,148}, {-69,149}, {-69,150}, {-69,151}, {-69,152}, {-68,-126}, {-68,-125}, {-68,-124}, {-68,-120}, {-68,-119}, {-68,-86}, {-68,-85}, {-68,-82}, {-68,-81}, {-68,-58}, {-68,-57}, {-68,-54}, {-68,-53}, {-68,-52}, {-68,-51}, {-68,-30}, {-68,-29}, {-68,-28}, {-68,133}, {-68,134}, {-68,137}, {-68,138}, {-68,139}, {-68,144}, {-68,145}, {-68,146}, {-68,147}, {-68,148}, {-68,149}, {-68,150}, {-68,151}, {-68,152}, {-67,-126}, {-67,-125}, {-67,-124}, {-67,-123}, {-67,-120}, {-67,-119}, {-67,-86}, {-67,-85}, {-67,-82}, {-67,-81}, {-67,-58}, {-67,-57}, {-67,-54}, {-67,-53}, {-67,-52}, {-67,-51}, {-67,-30}, {-67,-29}, {-67,-28}, {-67,125}, {-67,126}, {-67,137}, {-67,138}, {-67,139}, {-67,140}, {-67,146}, {-67,147}, {-67,148}, {-67,149}, {-67,150}, {-67,151}, {-67,152}, {-66,-126}, {-66,-125}, {-66,-124}, {-66,-123}, {-66,-120}, {-66,-119}, {-66,-86}, {-66,-85}, {-66,-82}, {-66,-81}, {-66,-58}, {-66,-57}, {-66,-54}, {-66,-53}, {-66,-52}, {-66,-51}, {-66,-50}, {-66,-30}, {-66,-29}, {-66,-28}, {-66,121}, {-66,123}, {-66,124}, {-66,125}, {-66,126}, {-66,127}, {-66,128}, {-66,129}, {-66,130}, {-66,131}, {-66,137}, {-66,138}, {-66,139}, {-66,140}, {-66,141}, {-66,147}, {-66,148}, {-66,149}, {-66,150}, {-66,151}, {-66,152}, {-65,-126}, {-65,-125}, {-65,-124}, {-65,-123}, {-65,-120}, {-65,-119}, {-65,-118}, {-65,-86}, {-65,-85}, {-65,-82}, {-65,-81}, {-65,-58}, {-65,-57}, {-65,-54}, {-65,-53}, {-65,-52}, {-65,-51}, {-65,-50}, {-65,-49}, {-65,-31}, {-65,-30}, {-65,-29}, {-65,-28}, {-65,140}, {-65,141}, {-65,142}, {-65,148}, {-65,149}, {-65,150}, {-65,151}, {-65,152}, {-64,-126}, {-64,-125}, {-64,-124}, {-64,-123}, {-64,-119}, {-64,-86}, {-64,-85}, {-64,-82}, {-64,-81}, {-64,-58}, {-64,-57}, {-64,-54}, {-64,-53}, {-64,-52}, {-64,-51}, {-64,-50}, {-64,-49}, {-64,-48}, {-64,-47}, {-64,-46}, {-64,-45}, {-64,-30}, {-64,-29}, {-64,-28}, {-64,140}, {-64,141}, {-64,142}, {-64,143}, {-64,145}, {-64,149}, {-64,150}, {-64,151}, {-64,152}, {-63,-126}, {-63,-125}, {-63,-124}, {-63,-123}, {-63,-122}, {-63,-119}, {-63,-86}, {-63,-85}, {-63,-81}, {-63,-54}, {-63,-53}, {-63,-52}, {-63,-51}, {-63,-50}, {-63,-49}, {-63,-48}, {-63,-47}, {-63,-46}, {-63,-45}, {-63,-44}, {-63,-43}, {-63,-42}, {-63,-41}, {-63,-40}, {-63,-39}, {-63,-38}, {-63,-37}, {-63,-36}, {-63,-35}, {-63,-34}, {-63,-33}, {-63,-29}, {-63,-28}, {-63,140}, {-63,141}, {-63,142}, {-63,143}, {-63,145}, {-63,146}, {-63,149}, {-63,150}, {-63,151}, {-63,152}, {-62,-125}, {-62,-124}, {-62,-123}, {-62,-122}, {-62,-119}, {-62,-86}, {-62,-85}, {-62,-81}, {-62,-50}, {-62,-49}, {-62,-48}, {-62,-47}, {-62,-46}, {-62,-45}, {-62,-44}, {-62,-43}, {-62,-42}, {-62,-41}, {-62,-40}, {-62,-39}, {-62,-38}, {-62,-37}, {-62,-36}, {-62,-35}, {-62,-34}, {-62,-33}, {-62,-32}, {-62,-29}, {-62,-28}, {-62,141}, {-62,142}, {-62,143}, {-62,146}, {-62,147}, {-62,150}, {-62,151}, {-62,152}, {-61,-125}, {-61,-124}, {-61,-123}, {-61,-122}, {-61,-119}, {-61,-86}, {-61,-85}, {-61,-84}, {-61,-81}, {-61,-47}, {-61,-46}, {-61,-45}, {-61,-44}, {-61,-43}, {-61,-42}, {-61,-41}, {-61,-40}, {-61,-39}, {-61,-38}, {-61,-37}, {-61,-36}, {-61,-35}, {-61,-34}, {-61,-33}, {-61,-32}, {-61,-31}, {-61,-30}, {-61,-29}, {-61,-28}, {-61,141}, {-61,142}, {-61,143}, {-61,145}, {-61,147}, {-61,150}, {-61,151}, {-61,152}, {-60,-125}, {-60,-124}, {-60,-123}, {-60,-122}, {-60,-119}, {-60,-118}, {-60,-117}, {-60,-86}, {-60,-85}, {-60,-84}, {-60,-81}, {-60,-45}, {-60,-44}, {-60,-43}, {-60,-42}, {-60,-41}, {-60,-40}, {-60,-39}, {-60,-38}, {-60,-37}, {-60,-36}, {-60,-35}, {-60,-34}, {-60,-33}, {-60,-32}, {-60,-31}, {-60,-30}, {-60,-29}, {-60,-28}, {-60,141}, {-60,142}, {-60,143}, {-60,147}, {-60,150}, {-60,151}, {-60,152}, {-59,-125}, {-59,-124}, {-59,-123}, {-59,-122}, {-59,-119}, {-59,-118}, {-59,-117}, {-59,-86}, {-59,-85}, {-59,-84}, {-59,-81}, {-59,-58}, {-59,-54}, {-59,-39}, {-59,-38}, {-59,-37}, {-59,-36}, {-59,-35}, {-59,-34}, {-59,-33}, {-59,-32}, {-59,-31}, {-59,-30}, {-59,-29}, {-59,141}, {-59,142}, {-59,143}, {-59,147}, {-59,150}, {-59,151}, {-59,152}, {-58,-125}, {-58,-124}, {-58,-123}, {-58,-122}, {-58,-118}, {-58,-117}, {-58,-86}, {-58,-85}, {-58,-84}, {-58,-81}, {-58,-58}, {-58,-57}, {-58,-54}, {-58,-53}, {-58,-34}, {-58,-33}, {-58,-32}, {-58,-31}, {-58,-30}, {-58,142}, {-58,143}, {-58,146}, {-58,147}, {-58,150}, {-58,151}, {-58,152}, {-57,-125}, {-57,-124}, {-57,-123}, {-57,-122}, {-57,-121}, {-57,-118}, {-57,-117}, {-57,-86}, {-57,-85}, {-57,-84}, {-57,-81}, {-57,-58}, {-57,-57}, {-57,-54}, {-57,-53}, {-57,-52}, {-57,142}, {-57,143}, {-57,145}, {-57,146}, {-57,147}, {-57,150}, {-57,151}, {-57,152}, {-56,-124}, {-56,-123}, {-56,-122}, {-56,-121}, {-56,-118}, {-56,-117}, {-56,-86}, {-56,-85}, {-56,-84}, {-56,-81}, {-56,-58}, {-56,-57}, {-56,-54}, {-56,-53}, {-56,-52}, {-56,-51}, {-56,-46}, {-56,-45}, {-56,-43}, {-56,142}, {-56,143}, {-56,147}, {-56,150}, {-56,151}, {-56,152}, {-55,-124}, {-55,-123}, {-55,-122}, {-55,-121}, {-55,-118}, {-55,-117}, {-55,-86}, {-55,-85}, {-55,-84}, {-55,-81}, {-55,-58}, {-55,-57}, {-55,-54}, {-55,-53}, {-55,-52}, {-55,-51}, {-55,142}, {-55,143}, {-55,147}, {-55,150}, {-55,151}, {-55,152}, {-54,-124}, {-54,-123}, {-54,-122}, {-54,-121}, {-54,-118}, {-54,-117}, {-54,-87}, {-54,-86}, {-54,-85}, {-54,-84}, {-54,-81}, {-54,-58}, {-54,-54}, {-54,-53}, {-54,-52}, {-54,-51}, {-54,-50}, {-54,142}, {-54,143}, {-54,150}, {-54,151}, {-54,152}, {-53,-124}, {-53,-123}, {-53,-122}, {-53,-121}, {-53,-118}, {-53,-117}, {-53,-87}, {-53,-86}, {-53,-85}, {-53,-84}, {-53,-81}, {-53,-58}, {-53,-54}, {-53,-53}, {-53,-52}, {-53,-37}, {-53,-36}, {-53,-35}, {-53,-34}, {-53,-33}, {-53,-32}, {-53,-31}, {-53,-30}, {-53,142}, {-53,143}, {-53,150}, {-53,151}, {-53,152}, {-52,-124}, {-52,-123}, {-52,-122}, {-52,-121}, {-52,-118}, {-52,-117}, {-52,-86}, {-52,-85}, {-52,-84}, {-52,-81}, {-52,-58}, {-52,-55}, {-52,-54}, {-52,-42}, {-52,-39}, {-52,-38}, {-52,-37}, {-52,-36}, {-52,-35}, {-52,-34}, {-52,-33}, {-52,-32}, {-52,-31}, {-52,-30}, {-52,-29}, {-52,-28}, {-52,142}, {-52,143}, {-52,145}, {-52,147}, {-52,150}, {-52,151}, {-52,152}, {-51,-124}, {-51,-123}, {-51,-122}, {-51,-121}, {-51,-118}, {-51,-117}, {-51,-86}, {-51,-85}, {-51,-58}, {-51,-44}, {-51,-43}, {-51,-42}, {-51,-41}, {-51,-39}, {-51,-38}, {-51,-37}, {-51,-36}, {-51,-35}, {-51,-34}, {-51,-33}, {-51,-32}, {-51,-31}, {-51,-30}, {-51,-29}, {-51,-28}, {-51,142}, {-51,143}, {-51,145}, {-51,146}, {-51,147}, {-51,150}, {-51,151}, {-51,152}, {-50,-123}, {-50,-122}, {-50,-121}, {-50,-118}, {-50,-117}, {-50,-116}, {-50,-86}, {-50,-85}, {-50,-79}, {-50,-78}, {-50,-77}, {-50,-76}, {-50,-75}, {-50,-74}, {-50,-73}, {-50,-72}, {-50,-52}, {-50,-51}, {-50,-50}, {-50,-43}, {-50,-42}, {-50,-41}, {-50,-39}, {-50,-38}, {-50,-37}, {-50,-36}, {-50,-35}, {-50,-32}, {-50,-31}, {-50,-30}, {-50,-29}, {-50,-28}, {-50,142}, {-50,143}, {-50,145}, {-50,146}, {-50,147}, {-50,150}, {-50,151}, {-50,152}, {-49,-123}, {-49,-122}, {-49,-121}, {-49,-117}, {-49,-116}, {-49,-86}, {-49,-85}, {-49,-77}, {-49,-76}, {-49,-75}, {-49,-74}, {-49,-73}, {-49,-72}, {-49,-71}, {-49,-52}, {-49,-51}, {-49,-50}, {-49,-43}, {-49,-42}, {-49,-41}, {-49,-40}, {-49,-38}, {-49,-37}, {-49,-36}, {-49,-35}, {-49,-31}, {-49,-30}, {-49,-29}, {-49,-28}, {-49,142}, {-49,143}, {-49,145}, {-49,147}, {-49,150}, {-49,151}, {-49,152}, {-48,-123}, {-48,-122}, {-48,-121}, {-48,-120}, {-48,-117}, {-48,-116}, {-48,-86}, {-48,-85}, {-48,-84}, {-48,-64}, {-48,-63}, {-48,-62}, {-48,-59}, {-48,-52}, {-48,-51}, {-48,-50}, {-48,-43}, {-48,-42}, {-48,-41}, {-48,-40}, {-48,-38}, {-48,-37}, {-48,-36}, {-48,-35}, {-48,-29}, {-48,-28}, {-48,142}, {-48,143}, {-48,147}, {-48,150}, {-48,151}, {-48,152}, {-47,-123}, {-47,-122}, {-47,-121}, {-47,-120}, {-47,-117}, {-47,-116}, {-47,-87}, {-47,-86}, {-47,-85}, {-47,-84}, {-47,-67}, {-47,-59}, {-47,-55}, {-47,-51}, {-47,-42}, {-47,-41}, {-47,-40}, {-47,-38}, {-47,-37}, {-47,-36}, {-47,-35}, {-47,-34}, {-47,-29}, {-47,-28}, {-47,142}, {-47,143}, {-47,147}, {-47,150}, {-47,151}, {-47,152}, {-46,-123}, {-46,-122}, {-46,-121}, {-46,-120}, {-46,-117}, {-46,-116}, {-46,-115}, {-46,-87}, {-46,-86}, {-46,-85}, {-46,-67}, {-46,-59}, {-46,-58}, {-46,-55}, {-46,-54}, {-46,-46}, {-46,-42}, {-46,-41}, {-46,-40}, {-46,-39}, {-46,-37}, {-46,-36}, {-46,-35}, {-46,-34}, {-46,-29}, {-46,-28}, {-46,142}, {-46,143}, {-46,147}, {-46,150}, {-46,151}, {-46,152}, {-45,-123}, {-45,-122}, {-45,-121}, {-45,-120}, {-45,-116}, {-45,-115}, {-45,-87}, {-45,-86}, {-45,-85}, {-45,-81}, {-45,-80}, {-45,-79}, {-45,-78}, {-45,-77}, {-45,-76}, {-45,-75}, {-45,-74}, {-45,-73}, {-45,-72}, {-45,-67}, {-45,-58}, {-45,-55}, {-45,-54}, {-45,-53}, {-45,-46}, {-45,-42}, {-45,-41}, {-45,-40}, {-45,-39}, {-45,-37}, {-45,-36}, {-45,-35}, {-45,-34}, {-45,-31}, {-45,-30}, {-45,-29}, {-45,-28}, {-45,142}, {-45,143}, {-45,145}, {-45,147}, {-45,150}, {-45,151}, {-45,152}, {-44,-122}, {-44,-121}, {-44,-120}, {-44,-116}, {-44,-115}, {-44,-114}, {-44,-87}, {-44,-86}, {-44,-85}, {-44,-82}, {-44,-81}, {-44,-80}, {-44,-79}, {-44,-78}, {-44,-77}, {-44,-76}, {-44,-75}, {-44,-74}, {-44,-73}, {-44,-72}, {-44,-71}, {-44,-67}, {-44,-58}, {-44,-55}, {-44,-54}, {-44,-53}, {-44,-47}, {-44,-46}, {-44,-45}, {-44,-41}, {-44,-40}, {-44,-39}, {-44,-36}, {-44,-35}, {-44,-34}, {-44,-30}, {-44,-29}, {-44,-28}, {-44,142}, {-44,143}, {-44,145}, {-44,146}, {-44,147}, {-44,150}, {-44,151}, {-44,152}, {-43,-122}, {-43,-121}, {-43,-120}, {-43,-119}, {-43,-116}, {-43,-115}, {-43,-114}, {-43,-87}, {-43,-86}, {-43,-85}, {-43,-82}, {-43,-73}, {-43,-72}, {-43,-71}, {-43,-70}, {-43,-67}, {-43,-59}, {-43,-58}, {-43,-55}, {-43,-54}, {-43,-53}, {-43,-52}, {-43,-47}, {-43,-46}, {-43,-45}, {-43,-41}, {-43,-40}, {-43,-39}, {-43,-38}, {-43,-36}, {-43,-35}, {-43,-34}, {-43,-33}, {-43,-30}, {-43,-29}, {-43,-28}, {-43,142}, {-43,143}, {-43,145}, {-43,146}, {-43,147}, {-43,150}, {-43,151}, {-43,152}, {-42,-122}, {-42,-121}, {-42,-120}, {-42,-119}, {-42,-116}, {-42,-115}, {-42,-114}, {-42,-87}, {-42,-86}, {-42,-82}, {-42,-72}, {-42,-71}, {-42,-70}, {-42,-67}, {-42,-59}, {-42,-55}, {-42,-54}, {-42,-53}, {-42,-52}, {-42,-47}, {-42,-46}, {-42,-45}, {-42,-44}, {-42,-41}, {-42,-40}, {-42,-39}, {-42,-38}, {-42,-36}, {-42,-35}, {-42,-34}, {-42,-33}, {-42,-30}, {-42,-29}, {-42,-28}, {-42,142}, {-42,143}, {-42,145}, {-42,147}, {-42,150}, {-42,151}, {-42,152}, {-41,-122}, {-41,-121}, {-41,-120}, {-41,-119}, {-41,-115}, {-41,-114}, {-41,-88}, {-41,-87}, {-41,-86}, {-41,-83}, {-41,-82}, {-41,-71}, {-41,-70}, {-41,-67}, {-41,-55}, {-41,-54}, {-41,-53}, {-41,-52}, {-41,-51}, {-41,-46}, {-41,-45}, {-41,-44}, {-41,-40}, {-41,-39}, {-41,-38}, {-41,-37}, {-41,-35}, {-41,-34}, {-41,-33}, {-41,-32}, {-41,-31}, {-41,-30}, {-41,-29}, {-41,-28}, {-41,141}, {-41,142}, {-41,143}, {-41,150}, {-41,151}, {-41,152}, {-40,-122}, {-40,-121}, {-40,-120}, {-40,-119}, {-40,-115}, {-40,-114}, {-40,-88}, {-40,-87}, {-40,-86}, {-40,-83}, {-40,-82}, {-40,-71}, {-40,-70}, {-40,-67}, {-40,-55}, {-40,-54}, {-40,-53}, {-40,-52}, {-40,-51}, {-40,-46}, {-40,-45}, {-40,-44}, {-40,-40}, {-40,-39}, {-40,-38}, {-40,-37}, {-40,-35}, {-40,-34}, {-40,-33}, {-40,-32}, {-40,-31}, {-40,-30}, {-40,-29}, {-40,-28}, {-40,141}, {-40,142}, {-40,143}, {-40,150}, {-40,151}, {-40,152}, {-39,-122}, {-39,-121}, {-39,-120}, {-39,-119}, {-39,-118}, {-39,-115}, {-39,-114}, {-39,-88}, {-39,-87}, {-39,-86}, {-39,-83}, {-39,-82}, {-39,-81}, {-39,-80}, {-39,-79}, {-39,-71}, {-39,-70}, {-39,-67}, {-39,-55}, {-39,-54}, {-39,-53}, {-39,-52}, {-39,-51}, {-39,-46}, {-39,-45}, {-39,-44}, {-39,-43}, {-39,-39}, {-39,-38}, {-39,-37}, {-39,-36}, {-39,-34}, {-39,-33}, {-39,-32}, {-39,-31}, {-39,-30}, {-39,-29}, {-39,-28}, {-39,141}, {-39,142}, {-39,150}, {-39,151}, {-39,152}, {-38,-121}, {-38,-120}, {-38,-119}, {-38,-118}, {-38,-115}, {-38,-114}, {-38,-88}, {-38,-87}, {-38,-86}, {-38,-83}, {-38,-81}, {-38,-80}, {-38,-71}, {-38,-70}, {-38,-67}, {-38,-59}, {-38,-58}, {-38,-55}, {-38,-54}, {-38,-53}, {-38,-52}, {-38,-51}, {-38,-50}, {-38,-46}, {-38,-45}, {-38,-44}, {-38,-43}, {-38,-39}, {-38,-38}, {-38,-37}, {-38,-36}, {-38,-34}, {-38,-33}, {-38,-32}, {-38,-31}, {-38,-30}, {-38,-29}, {-38,-28}, {-38,141}, {-38,142}, {-38,147}, {-38,150}, {-38,151}, {-38,152}, {-37,-121}, {-37,-120}, {-37,-119}, {-37,-118}, {-37,-115}, {-37,-114}, {-37,-88}, {-37,-87}, {-37,-83}, {-37,-71}, {-37,-70}, {-37,-67}, {-37,-59}, {-37,-58}, {-37,-55}, {-37,-54}, {-37,-51}, {-37,-46}, {-37,-45}, {-37,-44}, {-37,-43}, {-37,-38}, {-37,-37}, {-37,-36}, {-37,-34}, {-37,-33}, {-37,-32}, {-37,-31}, {-37,-30}, {-37,141}, {-37,142}, {-37,145}, {-37,146}, {-37,150}, {-37,151}, {-37,152}, {-36,-121}, {-36,-120}, {-36,-119}, {-36,-118}, {-36,-114}, {-36,-113}, {-36,-88}, {-36,-87}, {-36,-84}, {-36,-83}, {-36,-71}, {-36,-70}, {-36,-67}, {-36,-59}, {-36,-58}, {-36,-55}, {-36,-54}, {-36,-51}, {-36,-46}, {-36,-45}, {-36,-44}, {-36,-43}, {-36,-38}, {-36,-37}, {-36,-36}, {-36,-33}, {-36,-32}, {-36,-31}, {-36,141}, {-36,142}, {-36,145}, {-36,146}, {-36,149}, {-36,150}, {-36,151}, {-36,152}, {-35,-121}, {-35,-120}, {-35,-119}, {-35,-118}, {-35,-117}, {-35,-114}, {-35,-113}, {-35,-88}, {-35,-87}, {-35,-84}, {-35,-83}, {-35,-71}, {-35,-70}, {-35,-67}, {-35,-59}, {-35,-58}, {-35,-55}, {-35,-54}, {-35,-51}, {-35,-46}, {-35,-45}, {-35,-44}, {-35,-43}, {-35,-37}, {-35,-36}, {-35,-35}, {-35,-33}, {-35,-32}, {-35,141}, {-35,142}, {-35,145}, {-35,149}, {-35,150}, {-35,151}, {-35,152}, {-34,-121}, {-34,-120}, {-34,-119}, {-34,-118}, {-34,-117}, {-34,-114}, {-34,-113}, {-34,-88}, {-34,-87}, {-34,-84}, {-34,-83}, {-34,-82}, {-34,-81}, {-34,-71}, {-34,-70}, {-34,-67}, {-34,-55}, {-34,-54}, {-34,-53}, {-34,-52}, {-34,-51}, {-34,-46}, {-34,-45}, {-34,-44}, {-34,-43}, {-34,-42}, {-34,-37}, {-34,-36}, {-34,-35}, {-34,-33}, {-34,-32}, {-34,-28}, {-34,-27}, {-34,141}, {-34,142}, {-34,150}, {-34,151}, {-34,152}, {-33,-121}, {-33,-120}, {-33,-119}, {-33,-118}, {-33,-117}, {-33,-114}, {-33,-113}, {-33,-88}, {-33,-87}, {-33,-84}, {-33,-83}, {-33,-82}, {-33,-81}, {-33,-71}, {-33,-70}, {-33,-67}, {-33,-55}, {-33,-54}, {-33,-53}, {-33,-52}, {-33,-50}, {-33,-46}, {-33,-45}, {-33,-44}, {-33,-43}, {-33,-42}, {-33,-36}, {-33,-35}, {-33,-28}, {-33,-27}, {-33,140}, {-33,141}, {-33,142}, {-33,150}, {-33,151}, {-33,152}, {-32,-120}, {-32,-119}, {-32,-118}, {-32,-117}, {-32,-114}, {-32,-113}, {-32,-89}, {-32,-88}, {-32,-87}, {-32,-84}, {-32,-71}, {-32,-70}, {-32,-67}, {-32,-59}, {-32,-55}, {-32,-54}, {-32,-53}, {-32,-52}, {-32,-51}, {-32,-49}, {-32,-46}, {-32,-45}, {-32,-42}, {-32,-41}, {-32,-35}, {-32,-34}, {-32,-29}, {-32,-28}, {-32,-27}, {-32,140}, {-32,141}, {-32,142}, {-32,145}, {-32,148}, {-32,150}, {-32,151}, {-32,152}, {-31,-120}, {-31,-119}, {-31,-118}, {-31,-117}, {-31,-114}, {-31,-113}, {-31,-112}, {-31,-89}, {-31,-88}, {-31,-84}, {-31,-71}, {-31,-70}, {-31,-67}, {-31,-59}, {-31,-58}, {-31,-55}, {-31,-54}, {-31,-53}, {-31,-52}, {-31,-51}, {-31,-46}, {-31,-45}, {-31,-42}, {-31,-41}, {-31,-35}, {-31,-34}, {-31,-29}, {-31,-28}, {-31,-27}, {-31,140}, {-31,141}, {-31,142}, {-31,147}, {-31,148}, {-31,151}, {-31,152}, {-31,153}, {-31,154}, {-31,155}, {-30,-120}, {-30,-119}, {-30,-118}, {-30,-117}, {-30,-113}, {-30,-112}, {-30,-89}, {-30,-88}, {-30,-85}, {-30,-84}, {-30,-71}, {-30,-70}, {-30,-67}, {-30,-59}, {-30,-58}, {-30,-55}, {-30,-54}, {-30,-53}, {-30,-52}, {-30,-51}, {-30,-46}, {-30,-45}, {-30,-42}, {-30,-41}, {-30,-40}, {-30,-39}, {-30,-34}, {-30,-29}, {-30,-28}, {-30,-27}, {-30,140}, {-30,141}, {-30,142}, {-30,151}, {-30,152}, {-30,153}, {-30,154}, {-30,155}, {-29,-120}, {-29,-119}, {-29,-118}, {-29,-117}, {-29,-116}, {-29,-113}, {-29,-112}, {-29,-89}, {-29,-88}, {-29,-85}, {-29,-71}, {-29,-70}, {-29,-67}, {-29,-59}, {-29,-58}, {-29,-55}, {-29,-54}, {-29,-53}, {-29,-52}, {-29,-51}, {-29,-46}, {-29,-45}, {-29,-42}, {-29,-41}, {-29,-40}, {-29,-39}, {-29,-38}, {-29,-29}, {-29,-28}, {-29,-27}, {-29,140}, {-29,141}, {-29,152}, {-29,153}, {-29,154}, {-29,155}, {-28,-120}, {-28,-119}, {-28,-118}, {-28,-117}, {-28,-116}, {-28,-113}, {-28,-112}, {-28,-90}, {-28,-89}, {-28,-88}, {-28,-85}, {-28,-84}, {-28,-83}, {-28,-71}, {-28,-70}, {-28,-67}, {-28,-58}, {-28,-55}, {-28,-54}, {-28,-53}, {-28,-52}, {-28,-51}, {-28,-50}, {-28,-46}, {-28,-45}, {-28,-38}, {-28,-37}, {-28,-29}, {-28,-28}, {-28,-27}, {-28,140}, {-28,141}, {-28,147}, {-28,152}, {-28,153}, {-28,154}, {-28,155}, {-27,-120}, {-27,-119}, {-27,-118}, {-27,-117}, {-27,-116}, {-27,-113}, {-27,-112}, {-27,-90}, {-27,-89}, {-27,-85}, {-27,-84}, {-27,-71}, {-27,-70}, {-27,-67}, {-27,-55}, {-27,-54}, {-27,-53}, {-27,-52}, {-27,-51}, {-27,-50}, {-27,-46}, {-27,-45}, {-27,-38}, {-27,-37}, {-27,-36}, {-27,-29}, {-27,-28}, {-27,-27}, {-27,148}, {-27,149}, {-27,152}, {-27,153}, {-27,154}, {-27,155}, {-26,-119}, {-26,-118}, {-26,-117}, {-26,-116}, {-26,-113}, {-26,-112}, {-26,-90}, {-26,-89}, {-26,-86}, {-26,-85}, {-26,-71}, {-26,-70}, {-26,-67}, {-26,-54}, {-26,-53}, {-26,-52}, {-26,-51}, {-26,-50}, {-26,-46}, {-26,-45}, {-26,-39}, {-26,-38}, {-26,-37}, {-26,-28}, {-26,-27}, {-26,148}, {-26,149}, {-26,150}, {-26,153}, {-26,154}, {-26,155}, {-25,-119}, {-25,-118}, {-25,-117}, {-25,-116}, {-25,-113}, {-25,-90}, {-25,-89}, {-25,-86}, {-25,-85}, {-25,-71}, {-25,-70}, {-25,-67}, {-25,-59}, {-25,-58}, {-25,-54}, {-25,-53}, {-25,-52}, {-25,-51}, {-25,-46}, {-25,-45}, {-25,-39}, {-25,-38}, {-25,-37}, {-25,-28}, {-25,-27}, {-25,148}, {-25,149}, {-25,150}, {-25,153}, {-25,154}, {-25,155}, {-24,-119}, {-24,-118}, {-24,-117}, {-24,-116}, {-24,-113}, {-24,-90}, {-24,-89}, {-24,-86}, {-24,-85}, {-24,-84}, {-24,-71}, {-24,-70}, {-24,-67}, {-24,-59}, {-24,-58}, {-24,-55}, {-24,-54}, {-24,-53}, {-24,-52}, {-24,-51}, {-24,-46}, {-24,-45}, {-24,-39}, {-24,-38}, {-24,-27}, {-24,148}, {-24,149}, {-24,150}, {-24,154}, {-24,155}, {-23,-119}, {-23,-118}, {-23,-117}, {-23,-116}, {-23,-113}, {-23,-90}, {-23,-86}, {-23,-85}, {-23,-84}, {-23,-83}, {-23,-71}, {-23,-67}, {-23,-59}, {-23,-58}, {-23,-55}, {-23,-54}, {-23,-51}, {-23,-46}, {-23,-45}, {-23,-39}, {-23,-33}, {-23,149}, {-23,150}, {-23,151}, {-23,154}, {-23,155}, {-22,-119}, {-22,-118}, {-22,-117}, {-22,-116}, {-22,-113}, {-22,-90}, {-22,-86}, {-22,-85}, {-22,-71}, {-22,-67}, {-22,-59}, {-22,-58}, {-22,-55}, {-22,-54}, {-22,-46}, {-22,-45}, {-22,-40}, {-22,-39}, {-22,-34}, {-22,-33}, {-22,-32}, {-22,-25}, {-22,-24}, {-22,-23}, {-22,-22}, {-22,-21}, {-22,24}, {-22,25}, {-22,150}, {-22,151}, {-22,154}, {-22,155}, {-21,-119}, {-21,-118}, {-21,-117}, {-21,-116}, {-21,-113}, {-21,-112}, {-21,-90}, {-21,-87}, {-21,-86}, {-21,-71}, {-21,-67}, {-21,-59}, {-21,-58}, {-21,-55}, {-21,-54}, {-21,-50}, {-21,-46}, {-21,-45}, {-21,-41}, {-21,-40}, {-21,-34}, {-21,-33}, {-21,-32}, {-21,-31}, {-21,-24}, {-21,-23}, {-21,-22}, {-21,-21}, {-21,-20}, {-21,-19}, {-21,-18}, {-21,-10}, {-21,-9}, {-21,-8}, {-21,-7}, {-21,-6}, {-21,-5}, {-21,-4}, {-21,-3}, {-21,-2}, {-21,-1}, {-21,0}, {-21,1}, {-21,2}, {-21,3}, {-21,4}, {-21,11}, {-21,12}, {-21,13}, {-21,14}, {-21,15}, {-21,18}, {-21,19}, {-21,20}, {-21,21}, {-21,25}, {-21,26}, {-21,150}, {-21,151}, {-21,154}, {-21,155}, {-20,-118}, {-20,-117}, {-20,-116}, {-20,-113}, {-20,-112}, {-20,-91}, {-20,-90}, {-20,-87}, {-20,-86}, {-20,-71}, {-20,-67}, {-20,-59}, {-20,-58}, {-20,-55}, {-20,-54}, {-20,-53}, {-20,-50}, {-20,-45}, {-20,-41}, {-20,-40}, {-20,-35}, {-20,-34}, {-20,-33}, {-20,-32}, {-20,-31}, {-20,-30}, {-20,-20}, {-20,-19}, {-20,-18}, {-20,-17}, {-20,-16}, {-20,-15}, {-20,-14}, {-20,-13}, {-20,-12}, {-20,-11}, {-20,-10}, {-20,-9}, {-20,-8}, {-20,-7}, {-20,-6}, {-20,-5}, {-20,-4}, {-20,-3}, {-20,-2}, {-20,-1}, {-20,0}, {-20,1}, {-20,2}, {-20,3}, {-20,4}, {-20,5}, {-20,18}, {-20,19}, {-20,20}, {-20,21}, {-20,22}, {-20,25}, {-20,26}, {-20,150}, {-20,151}, {-20,154}, {-20,155}, {-19,-118}, {-19,-117}, {-19,-116}, {-19,-113}, {-19,-112}, {-19,-111}, {-19,-91}, {-19,-90}, {-19,-87}, {-19,-86}, {-19,-71}, {-19,-67}, {-19,-59}, {-19,-58}, {-19,-55}, {-19,-50}, {-19,-49}, {-19,-45}, {-19,-44}, {-19,-43}, {-19,-42}, {-19,-41}, {-19,-40}, {-19,-35}, {-19,-34}, {-19,-33}, {-19,-32}, {-19,-31}, {-19,-30}, {-19,-29}, {-19,-3}, {-19,-2}, {-19,-1}, {-19,0}, {-19,1}, {-19,2}, {-19,3}, {-19,4}, {-19,5}, {-19,6}, {-19,7}, {-19,17}, {-19,18}, {-19,19}, {-19,20}, {-19,21}, {-19,22}, {-19,25}, {-19,26}, {-19,150}, {-19,151}, {-19,154}, {-19,155}, {-18,-118}, {-18,-117}, {-18,-116}, {-18,-112}, {-18,-111}, {-18,-91}, {-18,-87}, {-18,-86}, {-18,-85}, {-18,-84}, {-18,-71}, {-18,-67}, {-18,-59}, {-18,-58}, {-18,-55}, {-18,-50}, {-18,-49}, {-18,-46}, {-18,-45}, {-18,-44}, {-18,-43}, {-18,-42}, {-18,-41}, {-18,-36}, {-18,-35}, {-18,-34}, {-18,-33}, {-18,-32}, {-18,-31}, {-18,-30}, {-18,-29}, {-18,-28}, {-18,3}, {-18,4}, {-18,5}, {-18,6}, {-18,7}, {-18,8}, {-18,16}, {-18,17}, {-18,18}, {-18,19}, {-18,20}, {-18,21}, {-18,22}, {-18,25}, {-18,26}, {-18,27}, {-18,150}, {-18,151}, {-18,154}, {-18,155}, {-17,-118}, {-17,-117}, {-17,-116}, {-17,-112}, {-17,-92}, {-17,-91}, {-17,-87}, {-17,-86}, {-17,-71}, {-17,-68}, {-17,-67}, {-17,-59}, {-17,-58}, {-17,-55}, {-17,-50}, {-17,-49}, {-17,-46}, {-17,-45}, {-17,-44}, {-17,-43}, {-17,-42}, {-17,-41}, {-17,-36}, {-17,-35}, {-17,-34}, {-17,-33}, {-17,-32}, {-17,-31}, {-17,-30}, {-17,-29}, {-17,-28}, {-17,-27}, {-17,-26}, {-17,-21}, {-17,-20}, {-17,-19}, {-17,-18}, {-17,-17}, {-17,-16}, {-17,-11}, {-17,-10}, {-17,-9}, {-17,-8}, {-17,-7}, {-17,16}, {-17,17}, {-17,18}, {-17,19}, {-17,20}, {-17,21}, {-17,22}, {-17,25}, {-17,26}, {-17,27}, {-17,150}, {-17,151}, {-17,154}, {-17,155}, {-16,-118}, {-16,-117}, {-16,-116}, {-16,-112}, {-16,-92}, {-16,-91}, {-16,-88}, {-16,-87}, {-16,-86}, {-16,-71}, {-16,-68}, {-16,-67}, {-16,-59}, {-16,-58}, {-16,-55}, {-16,-54}, {-16,-50}, {-16,-49}, {-16,-46}, {-16,-45}, {-16,-44}, {-16,-43}, {-16,-42}, {-16,-36}, {-16,-35}, {-16,-34}, {-16,-30}, {-16,-29}, {-16,-28}, {-16,-27}, {-16,-26}, {-16,-25}, {-16,-19}, {-16,-18}, {-16,-17}, {-16,-16}, {-16,-15}, {-16,-14}, {-16,-13}, {-16,-12}, {-16,-9}, {-16,-8}, {-16,-7}, {-16,-6}, {-16,-5}, {-16,-4}, {-16,-3}, {-16,-2}, {-16,-1}, {-16,0}, {-16,1}, {-16,17}, {-16,18}, {-16,19}, {-16,20}, {-16,21}, {-16,22}, {-16,25}, {-16,26}, {-16,27}, {-16,28}, {-16,150}, {-16,151}, {-16,154}, {-16,155}, {-15,-118}, {-15,-117}, {-15,-116}, {-15,-112}, {-15,-92}, {-15,-91}, {-15,-88}, {-15,-87}, {-15,-86}, {-15,-71}, {-15,-68}, {-15,-67}, {-15,-59}, {-15,-58}, {-15,-55}, {-15,-54}, {-15,-50}, {-15,-49}, {-15,-46}, {-15,-45}, {-15,-44}, {-15,-43}, {-15,-42}, {-15,-37}, {-15,-36}, {-15,-35}, {-15,-34}, {-15,-26}, {-15,-25}, {-15,-24}, {-15,-17}, {-15,-16}, {-15,-14}, {-15,-13}, {-15,-12}, {-15,-11}, {-15,-10}, {-15,-9}, {-15,-8}, {-15,-7}, {-15,-6}, {-15,-5}, {-15,-4}, {-15,-3}, {-15,-2}, {-15,-1}, {-15,0}, {-15,1}, {-15,2}, {-15,20}, {-15,21}, {-15,22}, {-15,26}, {-15,27}, {-15,28}, {-15,150}, {-15,151}, {-15,154}, {-15,155}, {-14,-117}, {-14,-116}, {-14,-111}, {-14,-110}, {-14,-92}, {-14,-91}, {-14,-88}, {-14,-87}, {-14,-86}, {-14,-71}, {-14,-68}, {-14,-67}, {-14,-59}, {-14,-58}, {-14,-55}, {-14,-54}, {-14,-53}, {-14,-50}, {-14,-49}, {-14,-46}, {-14,-45}, {-14,-44}, {-14,-43}, {-14,-42}, {-14,-38}, {-14,-37}, {-14,-36}, {-14,-35}, {-14,-25}, {-14,-24}, {-14,-23}, {-14,-22}, {-14,-14}, {-14,-13}, {-14,-12}, {-14,-11}, {-14,-10}, {-14,-9}, {-14,-8}, {-14,-7}, {-14,-6}, {-14,-5}, {-14,-4}, {-14,-3}, {-14,-2}, {-14,-1}, {-14,0}, {-14,7}, {-14,8}, {-14,9}, {-14,11}, {-14,12}, {-14,22}, {-14,26}, {-14,27}, {-14,28}, {-14,29}, {-14,151}, {-14,154}, {-14,155}, {-13,-117}, {-13,-116}, {-13,-115}, {-13,-111}, {-13,-110}, {-13,-109}, {-13,-92}, {-13,-91}, {-13,-88}, {-13,-87}, {-13,-86}, {-13,-85}, {-13,-84}, {-13,-71}, {-13,-68}, {-13,-67}, {-13,-59}, {-13,-58}, {-13,-54}, {-13,-53}, {-13,-50}, {-13,-49}, {-13,-46}, {-13,-45}, {-13,-44}, {-13,-43}, {-13,-38}, {-13,-37}, {-13,-36}, {-13,-24}, {-13,-23}, {-13,-22}, {-13,-14}, {-13,-13}, {-13,-12}, {-13,-11}, {-13,-10}, {-13,-9}, {-13,-8}, {-13,-7}, {-13,-6}, {-13,-5}, {-13,-4}, {-13,-3}, {-13,-2}, {-13,-1}, {-13,5}, {-13,6}, {-13,7}, {-13,8}, {-13,9}, {-13,10}, {-13,11}, {-13,12}, {-13,13}, {-13,14}, {-13,27}, {-13,28}, {-13,29}, {-13,30}, {-13,151}, {-13,154}, {-13,155}, {-12,-117}, {-12,-116}, {-12,-115}, {-12,-110}, {-12,-109}, {-12,-108}, {-12,-107}, {-12,-92}, {-12,-91}, {-12,-88}, {-12,-87}, {-12,-85}, {-12,-84}, {-12,-71}, {-12,-68}, {-12,-67}, {-12,-59}, {-12,-58}, {-12,-54}, {-12,-53}, {-12,-50}, {-12,-49}, {-12,-46}, {-12,-45}, {-12,-44}, {-12,-43}, {-12,-39}, {-12,-38}, {-12,-37}, {-12,-36}, {-12,-27}, {-12,-20}, {-12,-19}, {-12,-11}, {-12,-10}, {-12,-9}, {-12,-8}, {-12,-7}, {-12,-6}, {-12,-5}, {-12,-4}, {-12,4}, {-12,5}, {-12,6}, {-12,7}, {-12,8}, {-12,9}, {-12,10}, {-12,11}, {-12,12}, {-12,13}, {-12,14}, {-12,15}, {-12,28}, {-12,29}, {-12,30}, {-12,151}, {-12,154}, {-12,155}, {-11,-117}, {-11,-116}, {-11,-115}, {-11,-109}, {-11,-108}, {-11,-107}, {-11,-92}, {-11,-91}, {-11,-88}, {-11,-87}, {-11,-71}, {-11,-68}, {-11,-67}, {-11,-59}, {-11,-58}, {-11,-54}, {-11,-53}, {-11,-52}, {-11,-51}, {-11,-50}, {-11,-46}, {-11,-45}, {-11,-44}, {-11,-39}, {-11,-38}, {-11,-37}, {-11,-36}, {-11,-27}, {-11,-20}, {-11,-19}, {-11,-18}, {-11,-17}, {-11,-8}, {-11,-7}, {-11,-6}, {-11,3}, {-11,4}, {-11,5}, {-11,6}, {-11,7}, {-11,8}, {-11,9}, {-11,10}, {-11,11}, {-11,12}, {-11,13}, {-11,14}, {-11,15}, {-11,16}, {-11,17}, {-11,151}, {-11,154}, {-11,155}, {-10,-117}, {-10,-116}, {-10,-115}, {-10,-108}, {-10,-107}, {-10,-106}, {-10,-105}, {-10,-92}, {-10,-88}, {-10,-87}, {-10,-71}, {-10,-68}, {-10,-67}, {-10,-59}, {-10,-58}, {-10,-54}, {-10,-53}, {-10,-52}, {-10,-51}, {-10,-50}, {-10,-46}, {-10,-45}, {-10,-44}, {-10,-39}, {-10,-38}, {-10,-37}, {-10,-36}, {-10,-21}, {-10,-20}, {-10,-19}, {-10,-18}, {-10,-17}, {-10,-16}, {-10,-15}, {-10,-14}, {-10,1}, {-10,2}, {-10,3}, {-10,4}, {-10,5}, {-10,6}, {-10,7}, {-10,8}, {-10,14}, {-10,15}, {-10,16}, {-10,17}, {-10,18}, {-10,19}, {-10,151}, {-10,154}, {-10,155}, {-9,-117}, {-9,-116}, {-9,-115}, {-9,-112}, {-9,-107}, {-9,-106}, {-9,-105}, {-9,-104}, {-9,-103}, {-9,-88}, {-9,-87}, {-9,-71}, {-9,-68}, {-9,-67}, {-9,-59}, {-9,-58}, {-9,-54}, {-9,-53}, {-9,-52}, {-9,-51}, {-9,-50}, {-9,-47}, {-9,-46}, {-9,-45}, {-9,-44}, {-9,-40}, {-9,-39}, {-9,-38}, {-9,-21}, {-9,-20}, {-9,-19}, {-9,-18}, {-9,-17}, {-9,-13}, {-9,-12}, {-9,151}, {-9,154}, {-9,155}, {-8,-116}, {-8,-115}, {-8,-112}, {-8,-111}, {-8,-105}, {-8,-104}, {-8,-103}, {-8,-102}, {-8,-94}, {-8,-93}, {-8,-89}, {-8,-88}, {-8,-87}, {-8,-86}, {-8,-85}, {-8,-71}, {-8,-68}, {-8,-67}, {-8,-59}, {-8,-58}, {-8,-54}, {-8,-53}, {-8,-52}, {-8,-51}, {-8,-50}, {-8,-47}, {-8,-46}, {-8,-45}, {-8,-41}, {-8,-40}, {-8,-39}, {-8,-38}, {-8,-27}, {-8,-26}, {-8,-25}, {-8,-24}, {-8,-23}, {-8,-22}, {-8,-21}, {-8,-20}, {-8,-17}, {-8,-16}, {-8,-15}, {-8,-13}, {-8,-12}, {-8,151}, {-8,154}, {-8,155}, {-7,-116}, {-7,-115}, {-7,-112}, {-7,-111}, {-7,-110}, {-7,-109}, {-7,-104}, {-7,-103}, {-7,-102}, {-7,-101}, {-7,-100}, {-7,-99}, {-7,-94}, {-7,-93}, {-7,-89}, {-7,-88}, {-7,-87}, {-7,-71}, {-7,-68}, {-7,-67}, {-7,-59}, {-7,-58}, {-7,-53}, {-7,-52}, {-7,-51}, {-7,-50}, {-7,-46}, {-7,-45}, {-7,-41}, {-7,-40}, {-7,-39}, {-7,-38}, {-7,-28}, {-7,-27}, {-7,-26}, {-7,-25}, {-7,-24}, {-7,-23}, {-7,-21}, {-7,151}, {-7,154}, {-7,155}, {-6,-116}, {-6,-115}, {-6,-112}, {-6,-111}, {-6,-110}, {-6,-109}, {-6,-108}, {-6,-102}, {-6,-101}, {-6,-100}, {-6,-99}, {-6,-98}, {-6,-94}, {-6,-89}, {-6,-88}, {-6,-71}, {-6,-68}, {-6,-67}, {-6,-59}, {-6,-58}, {-6,-53}, {-6,-52}, {-6,-51}, {-6,-50}, {-6,-46}, {-6,-42}, {-6,-41}, {-6,-40}, {-6,-39}, {-6,-38}, {-6,-32}, {-6,-31}, {-6,-30}, {-6,-29}, {-6,-28}, {-6,-27}, {-6,-26}, {-6,-25}, {-6,-3}, {-6,-2}, {-6,-1}, {-6,23}, {-6,24}, {-6,25}, {-6,26}, {-6,151}, {-6,154}, {-6,155}, {-5,-116}, {-5,-115}, {-5,-112}, {-5,-108}, {-5,-107}, {-5,-106}, {-5,-100}, {-5,-99}, {-5,-98}, {-5,-97}, {-5,-96}, {-5,-95}, {-5,-94}, {-5,-89}, {-5,-88}, {-5,-71}, {-5,-68}, {-5,-67}, {-5,-59}, {-5,-58}, {-5,-53}, {-5,-52}, {-5,-46}, {-5,-42}, {-5,-41}, {-5,-40}, {-5,-39}, {-5,-38}, {-5,-34}, {-5,-33}, {-5,-32}, {-5,-31}, {-5,-30}, {-5,-29}, {-5,-28}, {-5,-7}, {-5,-6}, {-5,-5}, {-5,-4}, {-5,-3}, {-5,-2}, {-5,-1}, {-5,0}, {-5,1}, {-5,2}, {-5,3}, {-5,5}, {-5,6}, {-5,7}, {-5,9}, {-5,20}, {-5,22}, {-5,23}, {-5,24}, {-5,25}, {-5,26}, {-5,27}, {-5,28}, {-5,29}, {-5,30}, {-5,150}, {-5,151}, {-5,154}, {-5,155}, {-4,-116}, {-4,-115}, {-4,-112}, {-4,-106}, {-4,-105}, {-4,-99}, {-4,-98}, {-4,-97}, {-4,-96}, {-4,-95}, {-4,-94}, {-4,-89}, {-4,-88}, {-4,-87}, {-4,-86}, {-4,-71}, {-4,-68}, {-4,-67}, {-4,-59}, {-4,-53}, {-4,-52}, {-4,-43}, {-4,-42}, {-4,-41}, {-4,-40}, {-4,-39}, {-4,-38}, {-4,-37}, {-4,-36}, {-4,-35}, {-4,-34}, {-4,-33}, {-4,-32}, {-4,-10}, {-4,-9}, {-4,-8}, {-4,-7}, {-4,-6}, {-4,-5}, {-4,-4}, {-4,-3}, {-4,-2}, {-4,-1}, {-4,0}, {-4,1}, {-4,2}, {-4,3}, {-4,9}, {-4,10}, {-4,11}, {-4,12}, {-4,13}, {-4,14}, {-4,15}, {-4,16}, {-4,17}, {-4,18}, {-4,19}, {-4,20}, {-4,21}, {-4,22}, {-4,23}, {-4,24}, {-4,25}, {-4,26}, {-4,27}, {-4,29}, {-4,150}, {-4,154}, {-4,155}, {-3,-116}, {-3,-115}, {-3,-112}, {-3,-111}, {-3,-106}, {-3,-105}, {-3,-104}, {-3,-103}, {-3,-97}, {-3,-96}, {-3,-95}, {-3,-94}, {-3,-93}, {-3,-89}, {-3,-88}, {-3,-87}, {-3,-86}, {-3,-71}, {-3,-68}, {-3,-67}, {-3,-59}, {-3,-53}, {-3,-52}, {-3,-43}, {-3,-42}, {-3,-41}, {-3,-40}, {-3,-39}, {-3,-38}, {-3,-37}, {-3,-15}, {-3,-14}, {-3,-13}, {-3,-12}, {-3,-11}, {-3,-10}, {-3,-9}, {-3,-8}, {-3,-7}, {-3,-6}, {-3,-5}, {-3,-4}, {-3,-3}, {-3,-2}, {-3,-1}, {-3,0}, {-3,1}, {-3,2}, {-3,3}, {-3,4}, {-3,5}, {-3,6}, {-3,7}, {-3,8}, {-3,9}, {-3,10}, {-3,11}, {-3,12}, {-3,13}, {-3,14}, {-3,15}, {-3,16}, {-3,17}, {-3,18}, {-3,19}, {-3,20}, {-3,21}, {-3,22}, {-3,23}, {-3,24}, {-3,25}, {-3,26}, {-3,27}, {-3,29}, {-3,150}, {-3,154}, {-3,155}, {-2,-115}, {-2,-112}, {-2,-111}, {-2,-103}, {-2,-102}, {-2,-95}, {-2,-94}, {-2,-93}, {-2,-89}, {-2,-88}, {-2,-71}, {-2,-68}, {-2,-67}, {-2,-59}, {-2,-56}, {-2,-52}, {-2,-44}, {-2,-43}, {-2,-42}, {-2,-41}, {-2,-40}, {-2,-39}, {-2,-36}, {-2,-16}, {-2,-15}, {-2,-14}, {-2,-13}, {-2,-12}, {-2,-11}, {-2,-10}, {-2,-9}, {-2,-8}, {-2,-7}, {-2,-6}, {-2,-5}, {-2,-4}, {-2,-3}, {-2,-2}, {-2,-1}, {-2,0}, {-2,1}, {-2,2}, {-2,3}, {-2,4}, {-2,5}, {-2,6}, {-2,7}, {-2,8}, {-2,9}, {-2,10}, {-2,11}, {-2,12}, {-2,13}, {-2,14}, {-2,15}, {-2,16}, {-2,17}, {-2,18}, {-2,19}, {-2,20}, {-2,21}, {-2,22}, {-2,23}, {-2,24}, {-2,150}, {-2,153}, {-2,154}, {-2,155}, {-1,-115}, {-1,-112}, {-1,-111}, {-1,-110}, {-1,-102}, {-1,-101}, {-1,-100}, {-1,-94}, {-1,-93}, {-1,-89}, {-1,-88}, {-1,-71}, {-1,-68}, {-1,-67}, {-1,-59}, {-1,-56}, {-1,-52}, {-1,-44}, {-1,-43}, {-1,-42}, {-1,-41}, {-1,-40}, {-1,-39}, {-1,-19}, {-1,-18}, {-1,-17}, {-1,-16}, {-1,-15}, {-1,-14}, {-1,-13}, {-1,-12}, {-1,-11}, {-1,-10}, {-1,-9}, {-1,-8}, {-1,-7}, {-1,-6}, {-1,-5}, {-1,-4}, {-1,-3}, {-1,-2}, {-1,2}, {-1,3}, {-1,4}, {-1,5}, {-1,6}, {-1,7}, {-1,8}, {-1,9}, {-1,10}, {-1,11}, {-1,12}, {-1,13}, {-1,14}, {-1,15}, {-1,16}, {-1,17}, {-1,18}, {-1,19}, {-1,20}, {-1,21}, {-1,22}, {-1,26}, {-1,149}, {-1,150}, {-1,153}, {-1,154}, {-1,155}, {0,-115}, {0,-111}, {0,-110}, {0,-100}, {0,-99}, {0,-98}, {0,-89}, {0,-88}, {0,-71}, {0,-68}, {0,-67}, {0,-59}, {0,-56}, {0,-52}, {0,-45}, {0,-44}, {0,-43}, {0,-42}, {0,-22}, {0,-21}, {0,-20}, {0,-19}, {0,-18}, {0,-17}, {0,-16}, {0,-15}, {0,-14}, {0,-13}, {0,-12}, {0,-11}, {0,-10}, {0,-9}, {0,-8}, {0,-7}, {0,-6}, {0,-5}, {0,-4}, {0,-3}, {0,-2}, {0,2}, {0,3}, {0,4}, {0,5}, {0,6}, {0,7}, {0,8}, {0,9}, {0,10}, {0,11}, {0,12}, {0,13}, {0,14}, {0,15}, {0,16}, {0,17}, {0,18}, {0,19}, {0,149}, {0,150}, {0,153}, {0,154}, {0,155}, {1,-115}, {1,-111}, {1,-110}, {1,-98}, {1,-97}, {1,-89}, {1,-88}, {1,-87}, {1,-86}, {1,-71}, {1,-68}, {1,-67}, {1,-59}, {1,-56}, {1,-55}, {1,-23}, {1,-22}, {1,-21}, {1,-20}, {1,-19}, {1,-18}, {1,-17}, {1,-16}, {1,-15}, {1,-14}, {1,-13}, {1,-12}, {1,-11}, {1,-10}, {1,-9}, {1,-8}, {1,-7}, {1,-6}, {1,-5}, {1,-4}, {1,-3}, {1,-2}, {1,2}, {1,3}, {1,4}, {1,5}, {1,6}, {1,7}, {1,8}, {1,9}, {1,10}, {1,11}, {1,12}, {1,13}, {1,14}, {1,15}, {1,16}, {1,17}, {1,149}, {1,150}, {1,153}, {1,154}, {1,155}, {2,-115}, {2,-114}, {2,-111}, {2,-110}, {2,-97}, {2,-96}, {2,-95}, {2,-89}, {2,-88}, {2,-87}, {2,-86}, {2,-71}, {2,-67}, {2,-59}, {2,-56}, {2,-26}, {2,-25}, {2,-24}, {2,-23}, {2,-22}, {2,-21}, {2,-20}, {2,-19}, {2,-18}, {2,-17}, {2,-16}, {2,-15}, {2,-14}, {2,-13}, {2,-12}, {2,-11}, {2,-10}, {2,-9}, {2,-8}, {2,-7}, {2,-6}, {2,-5}, {2,-4}, {2,-3}, {2,-2}, {2,-1}, {2,0}, {2,1}, {2,2}, {2,3}, {2,4}, {2,5}, {2,6}, {2,7}, {2,149}, {2,153}, {2,154}, {2,155}, {3,-115}, {3,-114}, {3,-111}, {3,-110}, {3,-97}, {3,-96}, {3,-95}, {3,-94}, {3,-90}, {3,-89}, {3,-88}, {3,-71}, {3,-67}, {3,-55}, {3,-27}, {3,-26}, {3,-25}, {3,-24}, {3,-23}, {3,-22}, {3,-21}, {3,-20}, {3,-19}, {3,-18}, {3,-6}, {3,-5}, {3,-4}, {3,-3}, {3,-2}, {3,-1}, {3,0}, {3,3}, {3,4}, {3,5}, {3,6}, {3,148}, {3,149}, {3,153}, {3,154}, {3,155}, {4,-114}, {4,-111}, {4,-110}, {4,-96}, {4,-95}, {4,-94}, {4,-93}, {4,-90}, {4,-89}, {4,-88}, {4,-71}, {4,-67}, {4,-44}, {4,-40}, {4,-39}, {4,-38}, {4,-37}, {4,-32}, {4,-30}, {4,-29}, {4,-28}, {4,-27}, {4,-26}, {4,-25}, {4,-24}, {4,-23}, {4,-22}, {4,-21}, {4,-20}, {4,-19}, {4,3}, {4,4}, {4,5}, {4,148}, {4,149}, {4,152}, {4,153}, {4,154}, {4,155}, {5,-114}, {5,-111}, {5,-110}, {5,-95}, {5,-94}, {5,-93}, {5,-89}, {5,-88}, {5,-71}, {5,-67}, {5,-42}, {5,-41}, {5,-40}, {5,-39}, {5,-33}, {5,-31}, {5,-30}, {5,-29}, {5,-28}, {5,-27}, {5,-26}, {5,-25}, {5,-24}, {5,-23}, {5,-22}, {5,-21}, {5,148}, {5,152}, {5,153}, {5,154}, {5,155}, {6,-114}, {6,-110}, {6,-95}, {6,-94}, {6,-93}, {6,-89}, {6,-88}, {6,-87}, {6,-86}, {6,-71}, {6,-67}, {6,-45}, {6,-42}, {6,-41}, {6,-40}, {6,-36}, {6,-34}, {6,-33}, {6,-32}, {6,-31}, {6,-30}, {6,-29}, {6,-28}, {6,-27}, {6,-26}, {6,-25}, {6,-24}, {6,148}, {6,152}, {6,153}, {6,154}, {6,155}, {7,-114}, {7,-94}, {7,-93}, {7,-89}, {7,-88}, {7,-87}, {7,-86}, {7,-71}, {7,-70}, {7,-67}, {7,-47}, {7,-46}, {7,-45}, {7,-41}, {7,-36}, {7,-35}, {7,-34}, {7,-33}, {7,-32}, {7,-31}, {7,-30}, {7,-29}, {7,-28}, {7,-27}, {7,148}, {7,152}, {7,153}, {7,154}, {7,155}, {8,-114}, {8,-113}, {8,-105}, {8,-104}, {8,-103}, {8,-102}, {8,-93}, {8,-89}, {8,-88}, {8,-71}, {8,-70}, {8,-67}, {8,-48}, {8,-47}, {8,-46}, {8,-45}, {8,-44}, {8,-38}, {8,-37}, {8,-36}, {8,-35}, {8,-34}, {8,-33}, {8,-32}, {8,-31}, {8,148}, {8,151}, {8,152}, {8,153}, {8,154}, {8,155}, {9,-114}, {9,-113}, {9,-112}, {9,-104}, {9,-103}, {9,-102}, {9,-101}, {9,-93}, {9,-89}, {9,-88}, {9,-71}, {9,-70}, {9,-67}, {9,-49}, {9,-48}, {9,-47}, {9,-46}, {9,-45}, {9,-44}, {9,-40}, {9,-39}, {9,-38}, {9,-37}, {9,-36}, {9,148}, {9,151}, {9,152}, {10,-114}, {10,-113}, {10,-112}, {10,-111}, {10,-110}, {10,-109}, {10,-108}, {10,-103}, {10,-102}, {10,-101}, {10,-100}, {10,-93}, {10,-92}, {10,-88}, {10,-71}, {10,-70}, {10,-67}, {10,147}, {10,148}, {10,151}, {10,152}, {11,-108}, {11,-107}, {11,-103}, {11,-102}, {11,-101}, {11,-100}, {11,-94}, {11,-93}, {11,-92}, {11,-91}, {11,-88}, {11,-71}, {11,-70}, {11,-67}, {11,147}, {11,148}, {11,151}, {11,152}, {12,-108}, {12,-107}, {12,-106}, {12,-102}, {12,-101}, {12,-100}, {12,-93}, {12,-92}, {12,-91}, {12,-88}, {12,-87}, {12,-86}, {12,-85}, {12,-71}, {12,-70}, {12,-67}, {12,145}, {12,146}, {12,147}, {12,151}, {12,152}, {13,-108}, {13,-107}, {13,-106}, {13,-102}, {13,-101}, {13,-100}, {13,-93}, {13,-92}, {13,-91}, {13,-88}, {13,-87}, {13,-86}, {13,-85}, {13,-71}, {13,-70}, {13,-67}, {13,145}, {13,146}, {13,147}, {13,151}, {13,152}, {14,-108}, {14,-107}, {14,-106}, {14,-105}, {14,-102}, {14,-101}, {14,-100}, {14,-93}, {14,-92}, {14,-91}, {14,-88}, {14,-87}, {14,-71}, {14,-70}, {14,-67}, {14,145}, {14,146}, {14,147}, {14,151}, {14,152}, {15,-108}, {15,-107}, {15,-106}, {15,-105}, {15,-102}, {15,-101}, {15,-100}, {15,-99}, {15,-98}, {15,-92}, {15,-91}, {15,-88}, {15,-71}, {15,-67}, {15,144}, {15,145}, {15,146}, {15,147}, {15,151}, {15,152}, {16,-108}, {16,-107}, {16,-106}, {16,-105}, {16,-102}, {16,-101}, {16,-100}, {16,-99}, {16,-98}, {16,-92}, {16,-91}, {16,-88}, {16,-71}, {16,143}, {16,144}, {16,145}, {16,146}, {16,147}, {16,151}, {16,152}, {17,-107}, {17,-106}, {17,-105}, {17,-101}, {17,-100}, {17,-99}, {17,-98}, {17,-91}, {17,-87}, {17,-85}, {17,-71}, {17,-65}, {17,-64}, {17,-63}, {17,-62}, {17,-61}, {17,-60}, {17,-59}, {17,-58}, {17,-57}, {17,-56}, {17,-55}, {17,-54}, {17,-53}, {17,-13}, {17,-12}, {17,143}, {17,144}, {17,145}, {17,146}, {17,151}, {17,152}, {18,-107}, {18,-106}, {18,-105}, {18,-101}, {18,-100}, {18,-99}, {18,-98}, {18,-97}, {18,-96}, {18,-91}, {18,-87}, {18,-85}, {18,-72}, {18,-71}, {18,-68}, {18,-12}, {18,-11}, {18,143}, {18,144}, {18,145}, {18,146}, {18,151}, {18,152}, {19,-107}, {19,-106}, {19,-105}, {19,-104}, {19,-101}, {19,-100}, {19,-99}, {19,-98}, {19,-97}, {19,-96}, {19,-91}, {19,-90}, {19,-87}, {19,-85}, {19,-72}, {19,-71}, {19,-11}, {19,-10}, {19,143}, {19,144}, {19,145}, {19,146}, {19,150}, {19,151}, {19,152}, {20,-107}, {20,-106}, {20,-105}, {20,-104}, {20,-101}, {20,-100}, {20,-99}, {20,-98}, {20,-97}, {20,-96}, {20,-91}, {20,-90}, {20,-87}, {20,-72}, {20,-71}, {20,-65}, {20,-64}, {20,-63}, {20,-62}, {20,-61}, {20,-60}, {20,-59}, {20,-58}, {20,-57}, {20,-56}, {20,-55}, {20,-54}, {20,-53}, {20,-52}, {20,-51}, {20,-50}, {20,-49}, {20,-48}, {20,-47}, {20,-46}, {20,-45}, {20,-44}, {20,-43}, {20,-24}, {20,-23}, {20,-22}, {20,-21}, {20,-20}, {20,-19}, {20,-10}, {20,-9}, {20,143}, {20,144}, {20,145}, {20,146}, {20,150}, {20,151}, {20,152}, {21,-107}, {21,-106}, {21,-105}, {21,-104}, {21,-101}, {21,-100}, {21,-99}, {21,-98}, {21,-97}, {21,-96}, {21,-91}, {21,-90}, {21,-73}, {21,-72}, {21,-71}, {21,-67}, {21,-42}, {21,-37}, {21,-36}, {21,-35}, {21,-34}, {21,-33}, {21,-32}, {21,-31}, {21,-30}, {21,-29}, {21,-28}, {21,-27}, {21,-26}, {21,-25}, {21,-24}, {21,-23}, {21,-22}, {21,-21}, {21,-20}, {21,-19}, {21,-18}, {21,-17}, {21,-16}, {21,-15}, {21,143}, {21,144}, {21,145}, {21,150}, {21,151}, {21,152}, {22,-107}, {22,-106}, {22,-105}, {22,-104}, {22,-101}, {22,-100}, {22,-99}, {22,-98}, {22,-97}, {22,-96}, {22,-95}, {22,-94}, {22,-93}, {22,-92}, {22,-91}, {22,-90}, {22,-86}, {22,-73}, {22,-72}, {22,-71}, {22,-68}, {22,-67}, {22,-37}, {22,-36}, {22,-35}, {22,-34}, {22,-33}, {22,-32}, {22,-31}, {22,-25}, {22,-24}, {22,-23}, {22,-19}, {22,-18}, {22,-17}, {22,-16}, {22,-15}, {22,-14}, {22,-13}, {22,143}, {22,144}, {22,145}, {22,150}, {22,151}, {22,152}, {23,-106}, {23,-105}, {23,-104}, {23,-100}, {23,-99}, {23,-98}, {23,-97}, {23,-96}, {23,-95}, {23,-94}, {23,-93}, {23,-92}, {23,-91}, {23,-90}, {23,-86}, {23,-73}, {23,-72}, {23,-71}, {23,-68}, {23,-37}, {23,-36}, {23,-35}, {23,-34}, {23,-33}, {23,-19}, {23,-18}, {23,-17}, {23,-16}, {23,-15}, {23,-14}, {23,-13}, {23,-12}, {23,143}, {23,144}, {23,150}, {23,151}, {23,152}, {24,-106}, {24,-105}, {24,-104}, {24,-103}, {24,-100}, {24,-99}, {24,-98}, {24,-95}, {24,-94}, {24,-93}, {24,-92}, {24,-91}, {24,-90}, {24,-86}, {24,-74}, {24,-73}, {24,-72}, {24,-68}, {24,-36}, {24,-35}, {24,-34}, {24,-33}, {24,-16}, {24,-15}, {24,-14}, {24,-13}, {24,-12}, {24,-11}, {24,143}, {24,144}, {24,150}, {24,151}, {24,152}, {25,-106}, {25,-105}, {25,-104}, {25,-103}, {25,-100}, {25,-99}, {25,-98}, {25,-92}, {25,-91}, {25,-90}, {25,-86}, {25,-74}, {25,-73}, {25,-72}, {25,-69}, {25,-36}, {25,-35}, {25,-34}, {25,-33}, {25,-14}, {25,-13}, {25,-11}, {25,-10}, {25,142}, {25,143}, {25,149}, {25,150}, {25,151}, {25,152}, {26,-106}, {26,-105}, {26,-104}, {26,-103}, {26,-100}, {26,-99}, {26,-98}, {26,-92}, {26,-91}, {26,-86}, {26,-85}, {26,-74}, {26,-73}, {26,-72}, {26,-69}, {26,-35}, {26,-34}, {26,-33}, {26,-15}, {26,-14}, {26,-13}, {26,-11}, {26,-10}, {26,-9}, {26,-8}, {26,141}, {26,142}, {26,143}, {26,149}, {26,150}, {26,151}, {26,152}, {27,-106}, {27,-105}, {27,-104}, {27,-103}, {27,-100}, {27,-99}, {27,-98}, {27,-93}, {27,-92}, {27,-91}, {27,-85}, {27,-73}, {27,-72}, {27,-69}, {27,-35}, {27,-34}, {27,-33}, {27,-15}, {27,-14}, {27,-13}, {27,-12}, {27,-11}, {27,-10}, {27,-9}, {27,-8}, {27,140}, {27,141}, {27,142}, {27,147}, {27,149}, {27,150}, {27,151}, {27,152}, {28,-106}, {28,-105}, {28,-104}, {28,-103}, {28,-100}, {28,-99}, {28,-98}, {28,-93}, {28,-92}, {28,-91}, {28,-85}, {28,-73}, {28,-72}, {28,-69}, {28,-38}, {28,-35}, {28,-34}, {28,-33}, {28,-16}, {28,-15}, {28,-14}, {28,-12}, {28,-11}, {28,-10}, {28,-9}, {28,-8}, {28,140}, {28,141}, {28,146}, {28,147}, {28,149}, {28,150}, {28,151}, {28,152}, {29,-105}, {29,-104}, {29,-103}, {29,-100}, {29,-99}, {29,-98}, {29,-93}, {29,-92}, {29,-91}, {29,-85}, {29,-73}, {29,-72}, {29,-69}, {29,-38}, {29,-34}, {29,-33}, {29,-32}, {29,-22}, {29,-17}, {29,-16}, {29,-15}, {29,-14}, {29,-13}, {29,-12}, {29,-11}, {29,-10}, {29,-9}, {29,-8}, {29,54}, {29,55}, {29,56}, {29,57}, {29,58}, {29,59}, {29,60}, {29,61}, {29,62}, {29,63}, {29,64}, {29,65}, {29,66}, {29,72}, {29,73}, {29,74}, {29,75}, {29,76}, {29,77}, {29,82}, {29,83}, {29,84}, {29,85}, {29,86}, {29,87}, {29,88}, {29,89}, {29,90}, {29,91}, {29,92}, {29,93}, {29,94}, {29,95}, {29,96}, {29,97}, {29,98}, {29,99}, {29,100}, {29,101}, {29,102}, {29,103}, {29,104}, {29,105}, {29,106}, {29,107}, {29,108}, {29,109}, {29,110}, {29,111}, {29,112}, {29,113}, {29,114}, {29,115}, {29,116}, {29,117}, {29,118}, {29,119}, {29,120}, {29,121}, {29,122}, {29,123}, {29,124}, {29,125}, {29,126}, {29,127}, {29,128}, {29,129}, {29,130}, {29,131}, {29,132}, {29,133}, {29,134}, {29,135}, {29,136}, {29,137}, {29,138}, {29,139}, {29,140}, {29,145}, {29,146}, {29,147}, {29,149}, {29,150}, {29,151}, {29,152}, {30,-105}, {30,-104}, {30,-103}, {30,-99}, {30,-98}, {30,-93}, {30,-92}, {30,-91}, {30,-85}, {30,-84}, {30,-73}, {30,-72}, {30,-69}, {30,-38}, {30,-34}, {30,-33}, {30,-32}, {30,-31}, {30,-23}, {30,-22}, {30,-21}, {30,-20}, {30,-19}, {30,-18}, {30,-17}, {30,-16}, {30,-15}, {30,-14}, {30,-13}, {30,-12}, {30,-11}, {30,-10}, {30,53}, {30,54}, {30,55}, {30,56}, {30,57}, {30,75}, {30,76}, {30,77}, {30,78}, {30,79}, {30,80}, {30,81}, {30,82}, {30,83}, {30,84}, {30,85}, {30,86}, {30,87}, {30,88}, {30,102}, {30,103}, {30,104}, {30,105}, {30,106}, {30,107}, {30,108}, {30,109}, {30,110}, {30,111}, {30,112}, {30,113}, {30,114}, {30,115}, {30,116}, {30,117}, {30,118}, {30,119}, {30,120}, {30,121}, {30,122}, {30,123}, {30,124}, {30,125}, {30,126}, {30,144}, {30,145}, {30,146}, {30,147}, {30,149}, {30,150}, {30,151}, {30,152}, {31,-105}, {31,-104}, {31,-103}, {31,-99}, {31,-98}, {31,-93}, {31,-92}, {31,-85}, {31,-84}, {31,-73}, {31,-72}, {31,-69}, {31,-68}, {31,-38}, {31,-37}, {31,-33}, {31,-32}, {31,-31}, {31,-30}, {31,-29}, {31,-28}, {31,-27}, {31,-24}, {31,-23}, {31,-22}, {31,-21}, {31,-20}, {31,-19}, {31,-18}, {31,-17}, {31,-16}, {31,-15}, {31,-14}, {31,-13}, {31,53}, {31,54}, {31,55}, {31,145}, {31,146}, {31,149}, {31,150}, {31,151}, {31,152}, {32,-105}, {32,-104}, {32,-103}, {32,-102}, {32,-99}, {32,-98}, {32,-93}, {32,-92}, {32,-85}, {32,-84}, {32,-73}, {32,-72}, {32,-69}, {32,-68}, {32,-38}, {32,-37}, {32,-33}, {32,-32}, {32,-31}, {32,-30}, {32,-29}, {32,-28}, {32,-27}, {32,-26}, {32,-25}, {32,-24}, {32,-23}, {32,-22}, {32,-21}, {32,-20}, {32,-19}, {32,-18}, {32,-17}, {32,-16}, {32,-15}, {32,52}, {32,53}, {32,60}, {32,61}, {32,62}, {32,63}, {32,64}, {32,65}, {32,66}, {32,67}, {32,68}, {32,69}, {32,70}, {32,71}, {32,72}, {32,73}, {32,91}, {32,92}, {32,93}, {32,94}, {32,95}, {32,96}, {32,97}, {32,98}, {32,99}, {32,129}, {32,130}, {32,131}, {32,132}, {32,133}, {32,134}, {32,135}, {32,150}, {32,151}, {32,152}, {33,-105}, {33,-104}, {33,-103}, {33,-102}, {33,-99}, {33,-98}, {33,-93}, {33,-92}, {33,-89}, {33,-88}, {33,-85}, {33,-84}, {33,-83}, {33,-74}, {33,-73}, {33,-72}, {33,-68}, {33,-39}, {33,-38}, {33,-37}, {33,-36}, {33,-33}, {33,-32}, {33,-31}, {33,-30}, {33,-29}, {33,-28}, {33,-27}, {33,-26}, {33,-25}, {33,-24}, {33,-23}, {33,-22}, {33,-21}, {33,-20}, {33,-17}, {33,-10}, {33,-9}, {33,52}, {33,58}, {33,59}, {33,60}, {33,61}, {33,72}, {33,73}, {33,74}, {33,75}, {33,76}, {33,77}, {33,78}, {33,79}, {33,80}, {33,81}, {33,82}, {33,83}, {33,84}, {33,85}, {33,86}, {33,87}, {33,88}, {33,89}, {33,90}, {33,91}, {33,92}, {33,93}, {33,94}, {33,95}, {33,96}, {33,97}, {33,98}, {33,99}, {33,100}, {33,101}, {33,102}, {33,103}, {33,104}, {33,105}, {33,106}, {33,107}, {33,108}, {33,109}, {33,110}, {33,111}, {33,112}, {33,113}, {33,114}, {33,115}, {33,116}, {33,117}, {33,118}, {33,119}, {33,120}, {33,121}, {33,122}, {33,123}, {33,124}, {33,125}, {33,126}, {33,127}, {33,128}, {33,129}, {33,130}, {33,131}, {33,132}, {33,133}, {33,134}, {33,135}, {33,136}, {33,137}, {33,138}, {33,139}, {33,140}, {33,141}, {33,142}, {33,143}, {33,150}, {33,151}, {33,152}, {34,-105}, {34,-104}, {34,-103}, {34,-102}, {34,-99}, {34,-98}, {34,-97}, {34,-96}, {34,-95}, {34,-94}, {34,-93}, {34,-89}, {34,-88}, {34,-84}, {34,-83}, {34,-74}, {34,-73}, {34,-72}, {34,-71}, {34,-68}, {34,-40}, {34,-39}, {34,-38}, {34,-37}, {34,-36}, {34,-33}, {34,-32}, {34,-31}, {34,-30}, {34,-29}, {34,-28}, {34,-27}, {34,-26}, {34,-25}, {34,-24}, {34,-23}, {34,-22}, {34,-11}, {34,-10}, {34,-9}, {34,-8}, {34,52}, {34,56}, {34,150}, {34,151}, {34,152}, {35,-104}, {35,-103}, {35,-102}, {35,-98}, {35,-97}, {35,-96}, {35,-95}, {35,-94}, {35,-93}, {35,-89}, {35,-88}, {35,-84}, {35,-83}, {35,-74}, {35,-73}, {35,-72}, {35,-68}, {35,-40}, {35,-39}, {35,-38}, {35,-37}, {35,-36}, {35,-32}, {35,-31}, {35,-30}, {35,-29}, {35,-28}, {35,-27}, {35,-26}, {35,-13}, {35,-12}, {35,-11}, {35,-10}, {35,-9}, {35,-8}, {35,52}, {35,55}, {35,56}, {35,145}, {35,149}, {35,150}, {35,151}, {35,152}, {36,-104}, {36,-103}, {36,-102}, {36,-98}, {36,-97}, {36,-96}, {36,-95}, {36,-94}, {36,-90}, {36,-89}, {36,-88}, {36,-87}, {36,-84}, {36,-83}, {36,-74}, {36,-73}, {36,-72}, {36,-13}, {36,-12}, {36,-11}, {36,-10}, {36,-9}, {36,-8}, {36,52}, {36,55}, {36,56}, {36,145}, {36,149}, {36,150}, {36,151}, {36,152}, {37,-104}, {37,-103}, {37,-102}, {37,-101}, {37,-98}, {37,-97}, {37,-96}, {37,-95}, {37,-94}, {37,-90}, {37,-89}, {37,-88}, {37,-87}, {37,-84}, {37,-83}, {37,-74}, {37,-73}, {37,-72}, {37,-71}, {37,-16}, {37,-15}, {37,-14}, {37,-13}, {37,-12}, {37,-11}, {37,-10}, {37,-9}, {37,-8}, {37,52}, {37,55}, {37,56}, {37,145}, {37,146}, {37,149}, {37,150}, {37,151}, {37,152}, {38,-104}, {38,-103}, {38,-102}, {38,-101}, {38,-98}, {38,-97}, {38,-96}, {38,-95}, {38,-94}, {38,-91}, {38,-90}, {38,-89}, {38,-88}, {38,-87}, {38,-84}, {38,-83}, {38,-82}, {38,-74}, {38,-73}, {38,-72}, {38,-71}, {38,-18}, {38,-17}, {38,-16}, {38,-15}, {38,-14}, {38,-13}, {38,-12}, {38,-11}, {38,-10}, {38,-9}, {38,52}, {38,55}, {38,56}, {38,145}, {38,146}, {38,149}, {38,150}, {38,151}, {38,152}, {39,-104}, {39,-103}, {39,-102}, {39,-101}, {39,-98}, {39,-97}, {39,-96}, {39,-95}, {39,-91}, {39,-87}, {39,-83}, {39,-82}, {39,-75}, {39,-74}, {39,-73}, {39,-72}, {39,-17}, {39,-16}, {39,-15}, {39,-14}, {39,-13}, {39,-12}, {39,-11}, {39,-9}, {39,-8}, {39,52}, {39,55}, {39,56}, {39,145}, {39,146}, {39,149}, {39,150}, {39,151}, {39,152}, {40,-104}, {40,-103}, {40,-102}, {40,-101}, {40,-97}, {40,-96}, {40,-95}, {40,-91}, {40,-87}, {40,-86}, {40,-83}, {40,-82}, {40,-75}, {40,-74}, {40,-73}, {40,-72}, {40,-69}, {40,-68}, {40,-39}, {40,-38}, {40,-37}, {40,-36}, {40,-35}, {40,-34}, {40,-31}, {40,-30}, {40,-17}, {40,-16}, {40,-15}, {40,-14}, {40,-13}, {40,-12}, {40,-11}, {40,-10}, {40,-9}, {40,-8}, {40,52}, {40,55}, {40,56}, {40,145}, {40,146}, {40,149}, {40,150}, {40,151}, {40,152}, {41,-103}, {41,-102}, {41,-101}, {41,-97}, {41,-96}, {41,-95}, {41,-92}, {41,-91}, {41,-90}, {41,-89}, {41,-88}, {41,-87}, {41,-86}, {41,-83}, {41,-82}, {41,-81}, {41,-75}, {41,-74}, {41,-73}, {41,-72}, {41,-69}, {41,-68}, {41,-39}, {41,-38}, {41,-37}, {41,-36}, {41,-35}, {41,-34}, {41,-31}, {41,-27}, {41,-26}, {41,-15}, {41,-14}, {41,-13}, {41,-12}, {41,-11}, {41,-10}, {41,-9}, {41,-8}, {41,52}, {41,55}, {41,56}, {41,145}, {41,146}, {41,149}, {41,150}, {41,151}, {41,152}, {42,-103}, {42,-102}, {42,-101}, {42,-100}, {42,-97}, {42,-96}, {42,-95}, {42,-92}, {42,-91}, {42,-90}, {42,-89}, {42,-88}, {42,-87}, {42,-86}, {42,-83}, {42,-82}, {42,-81}, {42,-75}, {42,-74}, {42,-73}, {42,-72}, {42,-69}, {42,-68}, {42,-38}, {42,-37}, {42,-36}, {42,-35}, {42,-34}, {42,-27}, {42,-22}, {42,-21}, {42,-20}, {42,-12}, {42,-11}, {42,-10}, {42,-9}, {42,52}, {42,55}, {42,56}, {42,145}, {42,146}, {42,149}, {42,150}, {42,151}, {42,152}, {43,-103}, {43,-102}, {43,-101}, {43,-100}, {43,-97}, {43,-96}, {43,-95}, {43,-92}, {43,-91}, {43,-89}, {43,-88}, {43,-87}, {43,-86}, {43,-82}, {43,-81}, {43,-74}, {43,-73}, {43,-72}, {43,-69}, {43,-68}, {43,-37}, {43,-36}, {43,-35}, {43,-34}, {43,-24}, {43,-23}, {43,-22}, {43,-21}, {43,-20}, {43,-9}, {43,52}, {43,55}, {43,56}, {43,145}, {43,146}, {43,149}, {43,150}, {43,151}, {43,152}, {44,-103}, {44,-102}, {44,-101}, {44,-100}, {44,-97}, {44,-96}, {44,-92}, {44,-91}, {44,-90}, {44,-82}, {44,-81}, {44,-74}, {44,-73}, {44,-72}, {44,-69}, {44,-68}, {44,-37}, {44,-36}, {44,-35}, {44,-34}, {44,-29}, {44,-25}, {44,-24}, {44,-23}, {44,-22}, {44,-21}, {44,-20}, {44,-19}, {44,-18}, {44,-17}, {44,52}, {44,55}, {44,56}, {44,145}, {44,146}, {44,149}, {44,150}, {44,151}, {44,152}, {45,-103}, {45,-100}, {45,-96}, {45,-92}, {45,-91}, {45,-82}, {45,-81}, {45,-74}, {45,-73}, {45,-72}, {45,-69}, {45,-37}, {45,-36}, {45,-35}, {45,-30}, {45,-26}, {45,-25}, {45,-24}, {45,-23}, {45,-22}, {45,-21}, {45,-20}, {45,-19}, {45,-18}, {45,-17}, {45,-16}, {45,-15}, {45,52}, {45,55}, {45,56}, {45,145}, {45,146}, {45,149}, {45,150}, {45,151}, {45,152}, {46,-103}, {46,-100}, {46,-81}, {46,-80}, {46,-74}, {46,-73}, {46,-72}, {46,-69}, {46,-37}, {46,-36}, {46,-35}, {46,-34}, {46,-27}, {46,-26}, {46,-25}, {46,-24}, {46,-23}, {46,-22}, {46,-21}, {46,-20}, {46,-19}, {46,-18}, {46,-17}, {46,-16}, {46,-15}, {46,52}, {46,55}, {46,56}, {46,145}, {46,146}, {46,149}, {46,150}, {46,151}, {46,152}, {47,-99}, {47,-89}, {47,-88}, {47,-87}, {47,-86}, {47,-81}, {47,-80}, {47,-74}, {47,-73}, {47,-72}, {47,-69}, {47,-37}, {47,-36}, {47,-35}, {47,-34}, {47,-27}, {47,-26}, {47,-25}, {47,-24}, {47,-23}, {47,-22}, {47,-21}, {47,-20}, {47,-19}, {47,-9}, {47,-8}, {47,52}, {47,55}, {47,56}, {47,145}, {47,146}, {47,150}, {47,151}, {47,152}, {48,-99}, {48,-90}, {48,-89}, {48,-88}, {48,-87}, {48,-86}, {48,-85}, {48,-81}, {48,-80}, {48,-74}, {48,-73}, {48,-72}, {48,-69}, {48,-37}, {48,-36}, {48,-35}, {48,-29}, {48,-28}, {48,-27}, {48,-26}, {48,-25}, {48,-24}, {48,-23}, {48,-22}, {48,-21}, {48,-13}, {48,-12}, {48,-11}, {48,-10}, {48,-9}, {48,-8}, {48,52}, {48,55}, {48,56}, {48,145}, {48,146}, {48,150}, {48,151}, {48,152}, {49,-99}, {49,-98}, {49,-92}, {49,-91}, {49,-85}, {49,-84}, {49,-80}, {49,-74}, {49,-73}, {49,-72}, {49,-69}, {49,-38}, {49,-37}, {49,-36}, {49,-35}, {49,-30}, {49,-29}, {49,-28}, {49,-27}, {49,-26}, {49,-25}, {49,-24}, {49,-17}, {49,-16}, {49,-15}, {49,-14}, {49,-13}, {49,-12}, {49,-11}, {49,-10}, {49,-9}, {49,-8}, {49,52}, {49,55}, {49,56}, {49,145}, {49,146}, {49,150}, {49,151}, {49,152}, {50,-99}, {50,-98}, {50,-94}, {50,-93}, {50,-84}, {50,-80}, {50,-79}, {50,-73}, {50,-72}, {50,-69}, {50,-38}, {50,-37}, {50,-36}, {50,-29}, {50,-28}, {50,-27}, {50,-26}, {50,-19}, {50,-18}, {50,-17}, {50,-16}, {50,-15}, {50,-14}, {50,-13}, {50,-12}, {50,-11}, {50,-10}, {50,-9}, {50,52}, {50,55}, {50,56}, {50,145}, {50,146}, {50,150}, {50,151}, {50,152}, {51,-98}, {51,-94}, {51,-84}, {51,-83}, {51,-80}, {51,-79}, {51,-73}, {51,-72}, {51,-69}, {51,-39}, {51,-38}, {51,-37}, {51,-36}, {51,-29}, {51,-22}, {51,-21}, {51,-20}, {51,-19}, {51,-18}, {51,-17}, {51,-16}, {51,-15}, {51,-14}, {51,-13}, {51,-12}, {51,-11}, {51,52}, {51,55}, {51,56}, {51,145}, {51,146}, {51,150}, {51,151}, {51,152}, {52,-102}, {52,-94}, {52,-83}, {52,-79}, {52,-73}, {52,-72}, {52,-69}, {52,-39}, {52,-38}, {52,-32}, {52,-24}, {52,-23}, {52,-22}, {52,-21}, {52,-20}, {52,-19}, {52,-18}, {52,-17}, {52,-16}, {52,-15}, {52,-14}, {52,-13}, {52,-12}, {52,52}, {52,55}, {52,56}, {52,145}, {52,146}, {52,150}, {52,151}, {52,152}, {53,-83}, {53,-79}, {53,-78}, {53,-73}, {53,-72}, {53,-69}, {53,-68}, {53,-40}, {53,-34}, {53,-33}, {53,-32}, {53,-27}, {53,-26}, {53,-25}, {53,-24}, {53,-23}, {53,-22}, {53,-21}, {53,-20}, {53,-19}, {53,-18}, {53,-17}, {53,-16}, {53,-15}, {53,-14}, {53,-13}, {53,52}, {53,55}, {53,56}, {53,145}, {53,146}, {53,150}, {53,151}, {53,152}, {54,-83}, {54,-79}, {54,-78}, {54,-73}, {54,-72}, {54,-67}, {54,-42}, {54,-41}, {54,-40}, {54,-35}, {54,-34}, {54,-28}, {54,-27}, {54,-26}, {54,-25}, {54,-24}, {54,-23}, {54,-22}, {54,-21}, {54,-20}, {54,-19}, {54,-18}, {54,-17}, {54,-16}, {54,-15}, {54,-14}, {54,52}, {54,56}, {54,145}, {54,146}, {54,150}, {54,151}, {54,152}, {55,-82}, {55,-79}, {55,-78}, {55,-73}, {55,-72}, {55,-71}, {55,-65}, {55,-64}, {55,-63}, {55,-62}, {55,-61}, {55,-60}, {55,-59}, {55,-58}, {55,-57}, {55,-56}, {55,-55}, {55,-54}, {55,-53}, {55,-52}, {55,-51}, {55,-50}, {55,-49}, {55,-48}, {55,-47}, {55,-46}, {55,-45}, {55,-44}, {55,-43}, {55,-28}, {55,-27}, {55,-26}, {55,-25}, {55,-24}, {55,-23}, {55,-22}, {55,-21}, {55,-20}, {55,-19}, {55,-18}, {55,-17}, {55,-16}, {55,52}, {55,56}, {55,145}, {55,146}, {55,150}, {55,151}, {55,152}, {56,-82}, {56,-79}, {56,-78}, {56,-73}, {56,-72}, {56,-71}, {56,-28}, {56,-27}, {56,-26}, {56,-25}, {56,-24}, {56,-23}, {56,-22}, {56,-21}, {56,-20}, {56,52}, {56,53}, {56,56}, {56,145}, {56,146}, {56,150}, {56,151}, {56,152}, {57,-82}, {57,-78}, {57,-73}, {57,-72}, {57,-71}, {57,-28}, {57,-27}, {57,-26}, {57,-25}, {57,-24}, {57,-23}, {57,-22}, {57,-21}, {57,-17}, {57,-16}, {57,-15}, {57,-14}, {57,-13}, {57,-12}, {57,-11}, {57,-8}, {57,52}, {57,53}, {57,56}, {57,145}, {57,146}, {57,149}, {57,150}, {57,151}, {57,152}, {58,-81}, {58,-78}, {58,-77}, {58,-72}, {58,-71}, {58,-66}, {58,-65}, {58,-64}, {58,-63}, {58,-62}, {58,-54}, {58,-53}, {58,-52}, {58,-51}, {58,-50}, {58,-49}, {58,-48}, {58,-47}, {58,-46}, {58,-45}, {58,-44}, {58,-43}, {58,-42}, {58,-41}, {58,-40}, {58,-39}, {58,-17}, {58,-16}, {58,-15}, {58,-14}, {58,-13}, {58,-12}, {58,-11}, {58,-8}, {58,52}, {58,53}, {58,56}, {58,145}, {58,146}, {58,149}, {58,150}, {58,151}, {58,152}, {59,-81}, {59,-77}, {59,-72}, {59,-71}, {59,-68}, {59,-67}, {59,52}, {59,56}, {59,145}, {59,146}, {59,150}, {59,151}, {59,152}, {60,-81}, {60,-77}, {60,-72}, {60,-71}, {60,-68}, {60,-67}, {60,52}, {60,56}, {60,145}, {60,146}, {60,147}, {60,150}, {60,151}, {60,152}, {61,-77}, {61,-72}, {61,-71}, {61,-70}, {61,-68}, {61,-67}, {61,52}, {61,55}, {61,56}, {61,145}, {61,146}, {61,147}, {61,150}, {61,151}, {61,152}, {62,-80}, {62,-76}, {62,-72}, {62,-71}, {62,-70}, {62,-68}, {62,-67}, {62,52}, {62,55}, {62,145}, {62,146}, {62,147}, {62,150}, {62,151}, {62,152}, {63,-80}, {63,-76}, {63,-72}, {63,-71}, {63,-70}, {63,-68}, {63,-67}, {63,52}, {63,55}, {63,147}, {63,150}, {63,151}, {63,152}, {64,-80}, {64,-79}, {64,-76}, {64,-72}, {64,-71}, {64,-68}, {64,-67}, {64,52}, {64,55}, {64,150}, {64,151}, {64,152}, {65,-79}, {65,-76}, {65,-72}, {65,-71}, {65,-68}, {65,-67}, {65,52}, {65,55}, {65,150}, {65,151}, {65,152}, {66,-76}, {66,-75}, {66,-72}, {66,-71}, {66,-68}, {66,-67}, {66,52}, {66,55}, {66,147}, {66,150}, {66,151}, {66,152}, {67,-75}, {67,-72}, {67,-71}, {67,-68}, {67,-67}, {67,52}, {67,55}, {67,147}, {67,150}, {67,151}, {67,152}, {68,-74}, {68,-73}, {68,-72}, {68,-71}, {68,-68}, {68,-67}, {68,52}, {68,55}, {68,147}, {68,150}, {68,151}, {68,152}, {69,-78}, {69,-73}, {69,-72}, {69,52}, {69,55}, {69,56}, {69,147}, {69,150}, {69,151}, {69,152}, {70,-78}, {70,-77}, {70,52}, {70,56}, {70,146}, {70,147}, {70,150}, {70,151}, {70,152}, {71,-76}, {71,52}, {71,53}, {71,56}, {71,146}, {71,147}, {71,150}, {71,151}, {71,152}, {72,-72}, {72,-71}, {72,-70}, {72,-69}, {72,-68}, {72,-67}, {72,53}, {72,56}, {72,146}, {72,147}, {72,150}, {72,151}, {72,152}, {73,-71}, {73,-70}, {73,-69}, {73,53}, {73,56}, {73,147}, {73,150}, {73,151}, {73,152}, {74,-74}, {74,-71}, {74,-70}, {74,-69}, {74,53}, {74,56}, {74,147}, {74,150}, {74,151}, {74,152}, {75,-79}, {75,-74}, {75,-70}, {75,-69}, {75,-68}, {75,52}, {75,53}, {75,56}, {75,147}, {75,150}, {75,151}, {75,152}, {76,-106}, {76,-74}, {76,-70}, {76,-69}, {76,-68}, {76,-67}, {76,52}, {76,53}, {76,56}, {76,147}, {76,150}, {76,151}, {76,152}, {77,-74}, {77,-73}, {77,-68}, {77,-67}, {77,-66}, {77,-39}, {77,52}, {77,53}, {77,147}, {77,150}, {77,151}, {77,152}, {78,-73}, {78,-72}, {78,-67}, {78,-66}, {78,-39}, {78,-38}, {78,52}, {78,53}, {78,146}, {78,147}, {78,150}, {78,151}, {78,152}, {79,-72}, {79,-38}, {79,52}, {79,53}, {79,146}, {79,147}, {79,150}, {79,151}, {79,152}, {80,-71}, {80,-38}, {80,-37}, {80,52}, {80,56}, {80,146}, {80,147}, {80,150}, {80,151}, {80,152}, {81,-71}, {81,-70}, {81,-69}, {81,52}, {81,56}, {81,147}, {81,150}, {81,151}, {81,152}, {82,-70}, {82,-69}, {82,52}, {82,55}, {82,56}, {82,147}, {82,150}, {82,151}, {82,152}, {83,-69}, {83,-68}, {83,-67}, {83,52}, {83,55}, {83,56}, {83,146}, {83,147}, {83,150}, {83,151}, {83,152}, {84,-67}, {84,-28}, {84,-27}, {84,-26}, {84,-25}, {84,-24}, {84,-23}, {84,-22}, {84,-21}, {84,-20}, {84,-19}, {84,-18}, {84,-17}, {84,-10}, {84,-9}, {84,-8}, {84,-7}, {84,-6}, {84,-5}, {84,-4}, {84,-3}, {84,-2}, {84,-1}, {84,0}, {84,1}, {84,2}, {84,3}, {84,8}, {84,9}, {84,10}, {84,11}, {84,12}, {84,13}, {84,14}, {84,15}, {84,16}, {84,17}, {84,18}, {84,19}, {84,20}, {84,21}, {84,22}, {84,23}, {84,24}, {84,25}, {84,26}, {84,27}, {84,28}, {84,29}, {84,30}, {84,31}, {84,32}, {84,33}, {84,34}, {84,35}, {84,36}, {84,37}, {84,38}, {84,39}, {84,40}, {84,41}, {84,42}, {84,43}, {84,44}, {84,45}, {84,46}, {84,47}, {84,48}, {84,49}, {84,50}, {84,51}, {84,52}, {84,55}, {84,56}, {84,145}, {84,146}, {84,147}, {84,150}, {84,151}, {84,152}, {85,-31}, {85,-26}, {85,-25}, {85,-24}, {85,-23}, {85,-22}, {85,-21}, {85,-20}, {85,-19}, {85,-9}, {85,-8}, {85,-7}, {85,-6}, {85,-5}, {85,-4}, {85,-3}, {85,-2}, {85,-1}, {85,30}, {85,31}, {85,32}, {85,33}, {85,34}, {85,35}, {85,36}, {85,37}, {85,38}, {85,39}, {85,40}, {85,41}, {85,56}, {85,145}, {85,146}, {85,147}, {85,150}, {85,151}, {85,152}, {86,-35}, {86,-31}, {86,-30}, {86,-13}, {86,56}, {86,145}, {86,146}, {86,147}, {86,150}, {86,151}, {86,152}, {87,-31}, {87,-30}, {87,-29}, {87,-28}, {87,-15}, {87,-14}, {87,-13}, {87,-12}, {87,2}, {87,3}, {87,4}, {87,5}, {87,6}, {87,7}, {87,8}, {87,9}, {87,10}, {87,11}, {87,12}, {87,13}, {87,14}, {87,15}, {87,16}, {87,17}, {87,18}, {87,19}, {87,20}, {87,21}, {87,22}, {87,23}, {87,24}, {87,25}, {87,26}, {87,27}, {87,44}, {87,45}, {87,46}, {87,47}, {87,48}, {87,49}, {87,50}, {87,51}, {87,52}, {87,57}, {87,58}, {87,59}, {87,60}, {87,61}, {87,62}, {87,63}, {87,64}, {87,65}, {87,66}, {87,67}, {87,68}, {87,69}, {87,70}, {87,71}, {87,72}, {87,73}, {87,74}, {87,75}, {87,76}, {87,77}, {87,78}, {87,79}, {87,80}, {87,81}, {87,82}, {87,83}, {87,84}, {87,85}, {87,86}, {87,87}, {87,88}, {87,89}, {87,90}, {87,91}, {87,92}, {87,97}, {87,98}, {87,99}, {87,100}, {87,101}, {87,102}, {87,103}, {87,104}, {87,105}, {87,106}, {87,107}, {87,108}, {87,109}, {87,110}, {87,111}, {87,112}, {87,113}, {87,114}, {87,115}, {87,116}, {87,117}, {87,118}, {87,119}, {87,120}, {87,121}, {87,122}, {87,123}, {87,124}, {87,125}, {87,126}, {87,127}, {87,128}, {87,129}, {87,130}, {87,131}, {87,132}, {87,133}, {87,134}, {87,135}, {87,136}, {87,137}, {87,138}, {87,139}, {87,140}, {87,141}, {87,142}, {87,143}, {87,144}, {87,145}, {87,146}, {87,150}, {87,151}, {87,152}, {88,-31}, {88,-30}, {88,-29}, {88,-28}, {88,-27}, {88,-26}, {88,-25}, {88,-24}, {88,-23}, {88,-22}, {88,-21}, {88,-20}, {88,-19}, {88,-18}, {88,-17}, {88,-16}, {88,-15}, {88,-14}, {88,-13}, {88,-12}, {88,-11}, {88,-10}, {88,-9}, {88,-8}, {88,-7}, {88,-6}, {88,-5}, {88,-4}, {88,-3}, {88,-2}, {88,-1}, {88,0}, {88,1}, {88,2}, {88,3}, {88,4}, {88,5}, {88,6}, {88,7}, {88,8}, {88,9}, {88,10}, {88,11}, {88,12}, {88,13}, {88,14}, {88,15}, {88,16}, {88,17}, {88,18}, {88,19}, {88,20}, {88,21}, {88,22}, {88,23}, {88,24}, {88,25}, {88,26}, {88,27}, {88,28}, {88,29}, {88,30}, {88,31}, {88,32}, {88,33}, {88,34}, {88,35}, {88,36}, {88,37}, {88,38}, {88,39}, {88,40}, {88,41}, {88,42}, {88,43}, {88,44}, {88,45}, {88,46}, {88,47}, {88,48}, {88,49}, {88,50}, {88,51}, {88,52}, {88,53}, {88,59}, {88,60}, {88,61}, {88,62}, {88,67}, {88,68}, {88,69}, {88,70}, {88,71}, {88,72}, {88,73}, {88,74}, {88,80}, {88,81}, {88,82}, {88,83}, {88,84}, {88,85}, {88,86}, {88,87}, {88,88}, {88,89}, {88,90}, {88,100}, {88,101}, {88,102}, {88,103}, {88,104}, {88,105}, {88,106}, {88,107}, {88,108}, {88,109}, {88,110}, {88,111}, {88,112}, {88,127}, {88,128}, {88,129}, {88,130}, {88,131}, {88,132}, {88,133}, {88,134}, {88,135}, {88,136}, {88,137}, {88,138}, {88,139}, {88,140}, {88,141}, {88,142}, {88,150}, {88,151}, {88,152}, {89,51}, {89,52}, {89,53}, {89,54}, {89,152}, {90,54}, {90,55}, {90,56}, {90,64}, {90,77}, {90,95}, {90,114}, {90,115}, {90,116}, {90,117}, {90,118}, {90,119}, {90,120}, {90,121}, {90,122}, {90,123}, {90,124}, {90,146}, {90,147}, {90,152}, {91,54}, {91,55}, {91,56}, {91,57}, {91,58}, {91,59}, {91,60}, {91,61}, {91,62}, {91,63}, {91,64}, {91,65}, {91,66}, {91,67}, {91,68}, {91,69}, {91,70}, {91,71}, {91,72}, {91,73}, {91,74}, {91,75}, {91,76}, {91,77}, {91,78}, {91,79}, {91,80}, {91,81}, {91,82}, {91,83}, {91,84}, {91,85}, {91,86}, {91,87}, {91,88}, {91,89}, {91,90}, {91,91}, {91,92}, {91,93}, {91,94}, {91,95}, {91,96}, {91,97}, {91,98}, {91,99}, {91,100}, {91,101}, {91,102}, {91,103}, {91,104}, {91,105}, {91,106}, {91,107}, {91,108}, {91,109}, {91,110}, {91,111}, {91,112}, {91,113}, {91,114}, {91,115}, {91,116}, {91,117}, {91,118}, {91,119}, {91,120}, {91,121}, {91,122}, {91,123}, {91,124}, {91,125}, {91,126}, {91,127}, {91,128}, {91,129}, {91,130}, {91,131}, {91,132}, {91,133}, {91,134}, {91,135}, {91,136}, {91,137}, {91,138}, {91,139}, {91,140}, {91,141}, {91,142}, {91,143}, {91,144}, {91,145}, {91,146}, {91,147}, {91,152}, {92,54}, {92,55}, {92,56}, {92,57}, {92,58}, {92,59}, {92,60}, {92,61}, {92,62}, {92,63}, {92,64}, {92,65}, {92,66}, {92,67}, {92,68}, {92,69}, {92,70}, {92,71}, {92,72}, {92,73}, {92,74}, {92,75}, {92,76}, {92,77}, {92,78}, {92,79}, {92,80}, {92,81}, {92,82}, {92,83}, {92,84}, {92,85}, {92,86}, {92,87}, {92,88}, {92,89}, {92,90}, {92,91}, {92,92}, {92,93}, {92,94}, {92,95}, {92,96}, {92,97}, {92,98}, {92,99}, {92,100}, {92,101}, {92,102}, {92,103}, {92,104}, {92,105}, {92,106}, {92,107}, {92,108}, {92,109}, {92,110}, {92,111}, {92,112}, {92,113}, {92,114}, {92,115}, {92,116}, {92,117}, {92,118}, {92,119}, {92,120}, {92,121}, {92,122}, {92,123}, {92,124}, {92,125}, {92,126}, {92,127}, {92,128}, {92,129}, {92,130}, {92,131}, {92,132}, {92,133}, {92,134}, {92,135}, {92,136}, {92,137}, {92,138}, {92,139}, {92,140}, {92,141}, {92,142}, {92,143}, {92,144}, {92,145}, {92,146}, {92,147}, {92,148}, {92,149}, {92,150}, {92,151}, {92,152}, }, + ["mineral-beige-dirt-6"] = {{-96,33}, {-96,34}, {-96,35}, {-96,36}, {-95,-24}, {-95,-23}, {-95,-22}, {-95,-19}, {-95,-18}, {-95,-10}, {-95,-9}, {-95,9}, {-95,10}, {-95,11}, {-95,12}, {-95,13}, {-95,14}, {-95,15}, {-95,16}, {-95,17}, {-95,21}, {-95,22}, {-95,23}, {-95,24}, {-95,25}, {-95,26}, {-95,27}, {-95,28}, {-95,29}, {-95,30}, {-95,31}, {-95,32}, {-95,33}, {-95,34}, {-95,35}, {-95,36}, {-95,37}, {-95,38}, {-94,-28}, {-94,-27}, {-94,-26}, {-94,-25}, {-94,-24}, {-94,-23}, {-94,-22}, {-94,-21}, {-94,-20}, {-94,-19}, {-94,-18}, {-94,-17}, {-94,-16}, {-94,-15}, {-94,-14}, {-94,-13}, {-94,-12}, {-94,-11}, {-94,-10}, {-94,-9}, {-94,-8}, {-94,-7}, {-94,-6}, {-94,6}, {-94,7}, {-94,8}, {-94,9}, {-94,10}, {-94,11}, {-94,12}, {-94,13}, {-94,14}, {-94,15}, {-94,16}, {-94,17}, {-94,18}, {-94,19}, {-94,20}, {-94,21}, {-94,22}, {-94,23}, {-94,24}, {-94,25}, {-94,26}, {-94,27}, {-94,28}, {-94,29}, {-94,30}, {-94,31}, {-94,32}, {-94,33}, {-94,34}, {-94,38}, {-94,39}, {-94,40}, {-94,41}, {-93,-27}, {-93,-26}, {-93,-25}, {-93,-24}, {-93,-12}, {-93,-11}, {-93,-10}, {-93,-9}, {-93,-8}, {-93,-7}, {-93,-6}, {-93,-5}, {-93,-4}, {-93,-3}, {-93,-2}, {-93,-1}, {-93,0}, {-93,1}, {-93,2}, {-93,3}, {-93,4}, {-93,5}, {-93,6}, {-93,7}, {-93,8}, {-93,9}, {-93,10}, {-93,11}, {-93,12}, {-93,13}, {-93,14}, {-93,15}, {-93,16}, {-93,17}, {-93,18}, {-93,19}, {-93,20}, {-93,21}, {-93,22}, {-93,40}, {-93,41}, {-93,42}, {-92,-29}, {-92,-28}, {-92,-13}, {-92,-12}, {-92,-11}, {-92,-7}, {-92,-6}, {-92,-5}, {-92,-4}, {-92,-3}, {-92,-2}, {-92,-1}, {-92,0}, {-92,1}, {-92,2}, {-92,3}, {-92,4}, {-92,5}, {-92,6}, {-92,8}, {-92,9}, {-92,10}, {-92,11}, {-92,12}, {-92,20}, {-92,21}, {-92,22}, {-92,23}, {-92,40}, {-92,41}, {-92,42}, {-92,43}, {-91,-29}, {-91,-28}, {-91,-14}, {-91,-13}, {-91,-12}, {-91,-11}, {-91,-1}, {-91,0}, {-91,1}, {-91,2}, {-91,3}, {-91,4}, {-91,5}, {-91,7}, {-91,8}, {-91,9}, {-91,10}, {-91,11}, {-91,21}, {-91,22}, {-91,23}, {-91,24}, {-91,40}, {-91,41}, {-91,42}, {-91,43}, {-91,50}, {-91,51}, {-91,52}, {-91,53}, {-91,54}, {-91,55}, {-91,56}, {-91,57}, {-91,58}, {-91,59}, {-91,60}, {-91,61}, {-91,95}, {-91,96}, {-91,97}, {-91,98}, {-91,99}, {-91,100}, {-91,101}, {-91,102}, {-91,103}, {-91,104}, {-90,-29}, {-90,-28}, {-90,-16}, {-90,-15}, {-90,-14}, {-90,-13}, {-90,-12}, {-90,2}, {-90,3}, {-90,4}, {-90,5}, {-90,6}, {-90,7}, {-90,8}, {-90,9}, {-90,22}, {-90,23}, {-90,24}, {-90,25}, {-90,26}, {-90,27}, {-90,28}, {-90,31}, {-90,32}, {-90,33}, {-90,34}, {-90,35}, {-90,40}, {-90,41}, {-90,42}, {-90,43}, {-90,44}, {-90,45}, {-90,46}, {-90,47}, {-90,48}, {-90,49}, {-90,50}, {-90,51}, {-90,52}, {-90,53}, {-90,54}, {-90,55}, {-90,56}, {-90,57}, {-90,58}, {-90,59}, {-90,60}, {-90,61}, {-90,62}, {-90,63}, {-90,87}, {-90,88}, {-90,89}, {-90,90}, {-90,91}, {-90,92}, {-90,93}, {-90,94}, {-90,95}, {-90,96}, {-90,97}, {-90,98}, {-90,99}, {-90,100}, {-90,101}, {-90,102}, {-90,103}, {-90,104}, {-90,105}, {-89,-28}, {-89,-27}, {-89,-26}, {-89,-25}, {-89,-24}, {-89,-23}, {-89,-22}, {-89,-21}, {-89,-20}, {-89,-19}, {-89,-18}, {-89,-17}, {-89,-16}, {-89,-15}, {-89,-14}, {-89,-13}, {-89,-12}, {-89,-11}, {-89,4}, {-89,5}, {-89,6}, {-89,7}, {-89,8}, {-89,23}, {-89,24}, {-89,25}, {-89,26}, {-89,27}, {-89,28}, {-89,29}, {-89,30}, {-89,31}, {-89,32}, {-89,33}, {-89,34}, {-89,35}, {-89,36}, {-89,37}, {-89,38}, {-89,39}, {-89,40}, {-89,41}, {-89,43}, {-89,44}, {-89,45}, {-89,46}, {-89,47}, {-89,48}, {-89,49}, {-89,60}, {-89,61}, {-89,62}, {-89,63}, {-89,64}, {-89,65}, {-89,66}, {-89,67}, {-89,78}, {-89,79}, {-89,80}, {-89,81}, {-89,82}, {-89,83}, {-89,84}, {-89,85}, {-89,86}, {-89,87}, {-89,88}, {-89,89}, {-89,90}, {-89,91}, {-89,92}, {-89,93}, {-89,94}, {-89,95}, {-89,96}, {-89,103}, {-89,104}, {-89,105}, {-89,106}, {-88,-104}, {-88,-103}, {-88,-102}, {-88,-101}, {-88,-29}, {-88,-28}, {-88,-27}, {-88,-26}, {-88,-25}, {-88,-24}, {-88,-23}, {-88,-22}, {-88,-21}, {-88,-20}, {-88,-19}, {-88,-18}, {-88,-17}, {-88,-16}, {-88,-15}, {-88,-14}, {-88,-13}, {-88,-12}, {-88,-11}, {-88,24}, {-88,25}, {-88,26}, {-88,27}, {-88,28}, {-88,29}, {-88,30}, {-88,31}, {-88,32}, {-88,35}, {-88,36}, {-88,37}, {-88,38}, {-88,39}, {-88,40}, {-88,41}, {-88,42}, {-88,43}, {-88,44}, {-88,45}, {-88,46}, {-88,47}, {-88,48}, {-88,49}, {-88,61}, {-88,64}, {-88,65}, {-88,66}, {-88,67}, {-88,68}, {-88,69}, {-88,70}, {-88,71}, {-88,72}, {-88,73}, {-88,74}, {-88,75}, {-88,76}, {-88,77}, {-88,78}, {-88,79}, {-88,80}, {-88,105}, {-88,106}, {-88,107}, {-88,108}, {-87,-106}, {-87,-105}, {-87,-104}, {-87,-103}, {-87,-102}, {-87,-101}, {-87,-100}, {-87,-31}, {-87,-30}, {-87,-29}, {-87,-28}, {-87,-27}, {-87,40}, {-87,41}, {-87,42}, {-87,43}, {-87,44}, {-87,45}, {-87,46}, {-87,47}, {-87,48}, {-87,49}, {-87,50}, {-87,61}, {-87,67}, {-87,68}, {-87,69}, {-87,70}, {-87,71}, {-87,72}, {-87,73}, {-87,74}, {-87,75}, {-87,76}, {-87,107}, {-87,108}, {-87,109}, {-87,110}, {-87,111}, {-87,112}, {-87,113}, {-86,-108}, {-86,-107}, {-86,-106}, {-86,-105}, {-86,-104}, {-86,-102}, {-86,-101}, {-86,-100}, {-86,-99}, {-86,-98}, {-86,-34}, {-86,-33}, {-86,-32}, {-86,-31}, {-86,-30}, {-86,-29}, {-86,-28}, {-86,39}, {-86,40}, {-86,41}, {-86,42}, {-86,47}, {-86,48}, {-86,49}, {-86,50}, {-86,60}, {-86,61}, {-86,67}, {-86,68}, {-86,108}, {-86,109}, {-86,110}, {-86,111}, {-86,112}, {-86,113}, {-86,114}, {-86,115}, {-85,-109}, {-85,-108}, {-85,-107}, {-85,-106}, {-85,-105}, {-85,-101}, {-85,-100}, {-85,-99}, {-85,-98}, {-85,-97}, {-85,-96}, {-85,-38}, {-85,-37}, {-85,-36}, {-85,-35}, {-85,-34}, {-85,-33}, {-85,-32}, {-85,-31}, {-85,-30}, {-85,-29}, {-85,-28}, {-85,39}, {-85,40}, {-85,41}, {-85,47}, {-85,48}, {-85,49}, {-85,50}, {-85,60}, {-85,61}, {-85,62}, {-85,66}, {-85,114}, {-85,115}, {-85,116}, {-84,-121}, {-84,-120}, {-84,-119}, {-84,-118}, {-84,-117}, {-84,-116}, {-84,-115}, {-84,-114}, {-84,-113}, {-84,-112}, {-84,-111}, {-84,-110}, {-84,-109}, {-84,-108}, {-84,-107}, {-84,-99}, {-84,-98}, {-84,-97}, {-84,-96}, {-84,-95}, {-84,-94}, {-84,-45}, {-84,-41}, {-84,-40}, {-84,-39}, {-84,-38}, {-84,-37}, {-84,-36}, {-84,-35}, {-84,-29}, {-84,-28}, {-84,39}, {-84,40}, {-84,48}, {-84,60}, {-84,61}, {-84,62}, {-84,63}, {-84,64}, {-84,65}, {-84,66}, {-84,115}, {-84,116}, {-83,-122}, {-83,-121}, {-83,-120}, {-83,-119}, {-83,-118}, {-83,-117}, {-83,-116}, {-83,-115}, {-83,-114}, {-83,-113}, {-83,-112}, {-83,-111}, {-83,-110}, {-83,-109}, {-83,-108}, {-83,-97}, {-83,-96}, {-83,-95}, {-83,-94}, {-83,-93}, {-83,-92}, {-83,-91}, {-83,-47}, {-83,-43}, {-83,-42}, {-83,-41}, {-83,-40}, {-83,-39}, {-83,-38}, {-83,-29}, {-83,-28}, {-83,39}, {-83,40}, {-83,61}, {-83,62}, {-83,63}, {-83,64}, {-83,65}, {-83,66}, {-83,115}, {-83,116}, {-82,-123}, {-82,-122}, {-82,-121}, {-82,-120}, {-82,-94}, {-82,-93}, {-82,-92}, {-82,-91}, {-82,-90}, {-82,-71}, {-82,-70}, {-82,-69}, {-82,-68}, {-82,-67}, {-82,-45}, {-82,-44}, {-82,-43}, {-82,-42}, {-82,-29}, {-82,-28}, {-82,39}, {-82,40}, {-82,63}, {-82,64}, {-82,65}, {-82,115}, {-82,116}, {-82,117}, {-81,-124}, {-81,-123}, {-81,-122}, {-81,-121}, {-81,-92}, {-81,-91}, {-81,-90}, {-81,-89}, {-81,-88}, {-81,-87}, {-81,-71}, {-81,-70}, {-81,-69}, {-81,-68}, {-81,-48}, {-81,-47}, {-81,-46}, {-81,-29}, {-81,-28}, {-81,39}, {-81,40}, {-81,64}, {-81,65}, {-81,66}, {-80,-124}, {-80,-123}, {-80,-122}, {-80,-90}, {-80,-89}, {-80,-88}, {-80,-87}, {-80,-86}, {-80,-85}, {-80,-84}, {-80,-71}, {-80,-70}, {-80,-69}, {-80,-68}, {-80,-53}, {-80,-50}, {-80,-49}, {-80,-48}, {-80,-29}, {-80,-28}, {-80,39}, {-80,40}, {-80,118}, {-79,-124}, {-79,-123}, {-79,-88}, {-79,-87}, {-79,-86}, {-79,-85}, {-79,-84}, {-79,-83}, {-79,-82}, {-79,-70}, {-79,-69}, {-79,-68}, {-79,-55}, {-79,-51}, {-79,-50}, {-79,-28}, {-79,118}, {-78,-124}, {-78,-123}, {-78,-85}, {-78,-84}, {-78,-83}, {-78,-82}, {-78,-70}, {-78,-69}, {-78,-68}, {-78,-54}, {-78,-53}, {-78,-52}, {-78,-28}, {-78,118}, {-78,119}, {-78,120}, {-78,121}, {-78,122}, {-78,123}, {-77,-124}, {-77,-123}, {-77,-83}, {-77,-82}, {-77,-70}, {-77,-69}, {-77,-55}, {-77,-54}, {-77,-28}, {-77,119}, {-77,120}, {-77,121}, {-77,122}, {-77,123}, {-77,124}, {-76,-124}, {-76,-123}, {-76,-83}, {-76,-82}, {-76,-70}, {-76,-69}, {-76,-55}, {-76,-28}, {-76,119}, {-76,125}, {-75,-124}, {-75,-123}, {-75,-83}, {-75,-82}, {-75,-70}, {-75,-69}, {-75,-56}, {-75,-55}, {-75,-28}, {-75,125}, {-74,-124}, {-74,-123}, {-74,-83}, {-74,-82}, {-74,-70}, {-74,-69}, {-74,-56}, {-74,-55}, {-74,-28}, {-74,-27}, {-74,125}, {-74,126}, {-73,-124}, {-73,-123}, {-73,-122}, {-73,-83}, {-73,-82}, {-73,-70}, {-73,-69}, {-73,-56}, {-73,-55}, {-73,-28}, {-73,-27}, {-73,125}, {-73,126}, {-73,127}, {-73,128}, {-73,129}, {-72,-124}, {-72,-123}, {-72,-122}, {-72,-83}, {-72,-82}, {-72,-70}, {-72,-69}, {-72,-56}, {-72,-55}, {-72,125}, {-72,126}, {-72,127}, {-72,128}, {-72,129}, {-72,130}, {-72,131}, {-72,132}, {-71,-123}, {-71,-122}, {-71,-83}, {-71,-82}, {-71,-56}, {-71,-55}, {-71,125}, {-71,126}, {-71,127}, {-71,128}, {-71,129}, {-71,130}, {-71,131}, {-71,132}, {-71,133}, {-71,134}, {-71,135}, {-71,136}, {-70,-123}, {-70,-122}, {-70,-84}, {-70,-83}, {-70,-82}, {-70,-56}, {-70,-55}, {-70,125}, {-70,126}, {-70,129}, {-70,130}, {-70,131}, {-70,132}, {-70,133}, {-70,134}, {-70,135}, {-70,136}, {-70,137}, {-70,138}, {-70,139}, {-69,-123}, {-69,-122}, {-69,-121}, {-69,-84}, {-69,-83}, {-69,-82}, {-69,-56}, {-69,-55}, {-69,125}, {-69,126}, {-69,127}, {-69,128}, {-69,130}, {-69,131}, {-69,136}, {-69,137}, {-69,138}, {-69,139}, {-69,140}, {-69,141}, {-68,-123}, {-68,-122}, {-68,-121}, {-68,-84}, {-68,-83}, {-68,-56}, {-68,-55}, {-68,125}, {-68,126}, {-68,127}, {-68,128}, {-68,129}, {-68,130}, {-68,131}, {-68,132}, {-68,135}, {-68,136}, {-68,140}, {-68,141}, {-68,142}, {-68,143}, {-67,-122}, {-67,-121}, {-67,-84}, {-67,-83}, {-67,-56}, {-67,-55}, {-67,127}, {-67,128}, {-67,129}, {-67,130}, {-67,131}, {-67,132}, {-67,133}, {-67,134}, {-67,135}, {-67,141}, {-67,142}, {-67,143}, {-67,144}, {-67,145}, {-66,-122}, {-66,-121}, {-66,-84}, {-66,-83}, {-66,-56}, {-66,-55}, {-66,132}, {-66,133}, {-66,134}, {-66,135}, {-66,136}, {-66,142}, {-66,143}, {-66,144}, {-66,145}, {-66,146}, {-65,-122}, {-65,-121}, {-65,-84}, {-65,-83}, {-65,-56}, {-65,-55}, {-65,143}, {-65,144}, {-65,145}, {-65,146}, {-65,147}, {-64,-122}, {-64,-121}, {-64,-120}, {-64,-84}, {-64,-83}, {-64,-56}, {-64,-55}, {-64,144}, {-64,146}, {-64,147}, {-64,148}, {-63,-121}, {-63,-120}, {-63,-84}, {-63,-83}, {-63,-82}, {-63,-57}, {-63,-56}, {-63,-55}, {-63,144}, {-63,147}, {-63,148}, {-62,-121}, {-62,-120}, {-62,-84}, {-62,-83}, {-62,-82}, {-62,-59}, {-62,-58}, {-62,-57}, {-62,-56}, {-62,-55}, {-62,-54}, {-62,-53}, {-62,-52}, {-62,-51}, {-62,144}, {-62,145}, {-62,148}, {-62,149}, {-61,-121}, {-61,-120}, {-61,-83}, {-61,-82}, {-61,-59}, {-61,-58}, {-61,-57}, {-61,-56}, {-61,-55}, {-61,-54}, {-61,-53}, {-61,-52}, {-61,-51}, {-61,-50}, {-61,-49}, {-61,-48}, {-61,144}, {-61,148}, {-61,149}, {-60,-121}, {-60,-120}, {-60,-83}, {-60,-82}, {-60,-57}, {-60,-56}, {-60,-55}, {-60,-54}, {-60,-53}, {-60,-52}, {-60,-51}, {-60,-50}, {-60,-49}, {-60,-48}, {-60,-47}, {-60,-46}, {-60,144}, {-60,148}, {-60,149}, {-59,-121}, {-59,-120}, {-59,-83}, {-59,-82}, {-59,-57}, {-59,-56}, {-59,-55}, {-59,-53}, {-59,-52}, {-59,-51}, {-59,-50}, {-59,-49}, {-59,-48}, {-59,-47}, {-59,-46}, {-59,-45}, {-59,-44}, {-59,-43}, {-59,-42}, {-59,-41}, {-59,-40}, {-59,-28}, {-59,144}, {-59,148}, {-59,149}, {-58,-121}, {-58,-120}, {-58,-119}, {-58,-83}, {-58,-82}, {-58,-56}, {-58,-55}, {-58,-52}, {-58,-51}, {-58,-50}, {-58,-49}, {-58,-48}, {-58,-47}, {-58,-46}, {-58,-45}, {-58,-44}, {-58,-43}, {-58,-42}, {-58,-41}, {-58,-40}, {-58,-39}, {-58,-38}, {-58,-37}, {-58,-36}, {-58,-35}, {-58,-29}, {-58,-28}, {-58,144}, {-58,148}, {-58,149}, {-57,-120}, {-57,-119}, {-57,-83}, {-57,-82}, {-57,-56}, {-57,-55}, {-57,-51}, {-57,-50}, {-57,-49}, {-57,-48}, {-57,-47}, {-57,-46}, {-57,-45}, {-57,-44}, {-57,-43}, {-57,-42}, {-57,-41}, {-57,-40}, {-57,-39}, {-57,-38}, {-57,-37}, {-57,-36}, {-57,-35}, {-57,-34}, {-57,-33}, {-57,-32}, {-57,-31}, {-57,-30}, {-57,-29}, {-57,-28}, {-57,144}, {-57,148}, {-57,149}, {-56,-120}, {-56,-119}, {-56,-83}, {-56,-82}, {-56,-56}, {-56,-55}, {-56,-50}, {-56,-49}, {-56,-48}, {-56,-47}, {-56,-44}, {-56,-42}, {-56,-41}, {-56,-40}, {-56,-39}, {-56,-38}, {-56,-37}, {-56,-36}, {-56,-35}, {-56,-34}, {-56,-33}, {-56,-32}, {-56,-31}, {-56,-30}, {-56,-29}, {-56,-28}, {-56,144}, {-56,145}, {-56,148}, {-56,149}, {-55,-120}, {-55,-119}, {-55,-83}, {-55,-82}, {-55,-56}, {-55,-55}, {-55,-50}, {-55,-49}, {-55,-48}, {-55,-47}, {-55,-46}, {-55,-45}, {-55,-44}, {-55,-43}, {-55,-42}, {-55,-41}, {-55,-40}, {-55,-39}, {-55,-38}, {-55,-37}, {-55,-36}, {-55,-35}, {-55,-34}, {-55,-33}, {-55,-32}, {-55,-31}, {-55,-30}, {-55,-29}, {-55,-28}, {-55,144}, {-55,148}, {-55,149}, {-54,-120}, {-54,-119}, {-54,-83}, {-54,-82}, {-54,-57}, {-54,-56}, {-54,-55}, {-54,-49}, {-54,-48}, {-54,-47}, {-54,-46}, {-54,-45}, {-54,-44}, {-54,-43}, {-54,-42}, {-54,-41}, {-54,-40}, {-54,-39}, {-54,-38}, {-54,-37}, {-54,-36}, {-54,-35}, {-54,-34}, {-54,-33}, {-54,-32}, {-54,-31}, {-54,-30}, {-54,-29}, {-54,-28}, {-54,144}, {-54,148}, {-54,149}, {-53,-120}, {-53,-119}, {-53,-83}, {-53,-82}, {-53,-57}, {-53,-56}, {-53,-55}, {-53,-51}, {-53,-50}, {-53,-49}, {-53,-48}, {-53,-47}, {-53,-46}, {-53,-45}, {-53,-44}, {-53,-43}, {-53,-42}, {-53,-41}, {-53,-40}, {-53,-39}, {-53,-38}, {-53,-29}, {-53,-28}, {-53,144}, {-53,148}, {-53,149}, {-52,-120}, {-52,-119}, {-52,-83}, {-52,-82}, {-52,-57}, {-52,-56}, {-52,-53}, {-52,-52}, {-52,-51}, {-52,-50}, {-52,-49}, {-52,-48}, {-52,-47}, {-52,-46}, {-52,-45}, {-52,-44}, {-52,-43}, {-52,-41}, {-52,-40}, {-52,144}, {-52,148}, {-52,149}, {-51,-120}, {-51,-119}, {-51,-84}, {-51,-83}, {-51,-82}, {-51,-81}, {-51,-70}, {-51,-69}, {-51,-57}, {-51,-56}, {-51,-55}, {-51,-54}, {-51,-53}, {-51,-52}, {-51,-51}, {-51,-50}, {-51,-49}, {-51,-48}, {-51,-47}, {-51,-46}, {-51,-45}, {-51,-40}, {-51,144}, {-51,148}, {-51,149}, {-50,-120}, {-50,-119}, {-50,-84}, {-50,-83}, {-50,-82}, {-50,-81}, {-50,-80}, {-50,-70}, {-50,-69}, {-50,-67}, {-50,-66}, {-50,-65}, {-50,-64}, {-50,-63}, {-50,-62}, {-50,-61}, {-50,-60}, {-50,-59}, {-50,-58}, {-50,-57}, {-50,-56}, {-50,-55}, {-50,-54}, {-50,-53}, {-50,-49}, {-50,-48}, {-50,-47}, {-50,-46}, {-50,-45}, {-50,-44}, {-50,-40}, {-50,144}, {-50,148}, {-50,149}, {-49,-120}, {-49,-119}, {-49,-118}, {-49,-84}, {-49,-83}, {-49,-82}, {-49,-81}, {-49,-80}, {-49,-79}, {-49,-78}, {-49,-70}, {-49,-69}, {-49,-68}, {-49,-67}, {-49,-66}, {-49,-65}, {-49,-64}, {-49,-63}, {-49,-62}, {-49,-61}, {-49,-60}, {-49,-59}, {-49,-58}, {-49,-57}, {-49,-56}, {-49,-55}, {-49,-54}, {-49,-53}, {-49,-49}, {-49,-48}, {-49,-47}, {-49,-46}, {-49,-45}, {-49,-44}, {-49,-39}, {-49,144}, {-49,148}, {-49,149}, {-48,-119}, {-48,-118}, {-48,-83}, {-48,-82}, {-48,-81}, {-48,-80}, {-48,-79}, {-48,-78}, {-48,-77}, {-48,-76}, {-48,-75}, {-48,-74}, {-48,-73}, {-48,-72}, {-48,-71}, {-48,-70}, {-48,-69}, {-48,-68}, {-48,-67}, {-48,-58}, {-48,-57}, {-48,-56}, {-48,-55}, {-48,-54}, {-48,-53}, {-48,-49}, {-48,-48}, {-48,-47}, {-48,-46}, {-48,-45}, {-48,-44}, {-48,-39}, {-48,144}, {-48,148}, {-48,149}, {-47,-119}, {-47,-118}, {-47,-83}, {-47,-82}, {-47,-81}, {-47,-80}, {-47,-79}, {-47,-78}, {-47,-77}, {-47,-76}, {-47,-75}, {-47,-74}, {-47,-73}, {-47,-72}, {-47,-71}, {-47,-70}, {-47,-69}, {-47,-68}, {-47,-58}, {-47,-57}, {-47,-56}, {-47,-54}, {-47,-53}, {-47,-52}, {-47,-50}, {-47,-49}, {-47,-48}, {-47,-47}, {-47,-46}, {-47,-45}, {-47,-44}, {-47,-43}, {-47,-39}, {-47,144}, {-47,148}, {-47,149}, {-46,-119}, {-46,-118}, {-46,-84}, {-46,-83}, {-46,-82}, {-46,-81}, {-46,-80}, {-46,-79}, {-46,-78}, {-46,-77}, {-46,-76}, {-46,-75}, {-46,-74}, {-46,-73}, {-46,-72}, {-46,-71}, {-46,-70}, {-46,-69}, {-46,-68}, {-46,-57}, {-46,-56}, {-46,-53}, {-46,-52}, {-46,-51}, {-46,-50}, {-46,-49}, {-46,-48}, {-46,-47}, {-46,-45}, {-46,-44}, {-46,-43}, {-46,-38}, {-46,144}, {-46,148}, {-46,149}, {-45,-119}, {-45,-118}, {-45,-117}, {-45,-84}, {-45,-83}, {-45,-82}, {-45,-71}, {-45,-70}, {-45,-69}, {-45,-68}, {-45,-57}, {-45,-56}, {-45,-52}, {-45,-51}, {-45,-50}, {-45,-49}, {-45,-48}, {-45,-47}, {-45,-45}, {-45,-44}, {-45,-43}, {-45,-38}, {-45,144}, {-45,148}, {-45,149}, {-44,-119}, {-44,-118}, {-44,-117}, {-44,-84}, {-44,-83}, {-44,-70}, {-44,-69}, {-44,-68}, {-44,-57}, {-44,-56}, {-44,-52}, {-44,-51}, {-44,-50}, {-44,-49}, {-44,-48}, {-44,-44}, {-44,-43}, {-44,-42}, {-44,-38}, {-44,-37}, {-44,144}, {-44,148}, {-44,149}, {-43,-118}, {-43,-117}, {-43,-84}, {-43,-83}, {-43,-69}, {-43,-68}, {-43,-57}, {-43,-56}, {-43,-51}, {-43,-50}, {-43,-49}, {-43,-48}, {-43,-44}, {-43,-43}, {-43,-42}, {-43,-37}, {-43,144}, {-43,148}, {-43,149}, {-42,-118}, {-42,-117}, {-42,-85}, {-42,-84}, {-42,-83}, {-42,-69}, {-42,-68}, {-42,-58}, {-42,-57}, {-42,-56}, {-42,-51}, {-42,-50}, {-42,-49}, {-42,-48}, {-42,-43}, {-42,-42}, {-42,-37}, {-42,144}, {-42,148}, {-42,149}, {-41,-118}, {-41,-117}, {-41,-116}, {-41,-85}, {-41,-84}, {-41,-69}, {-41,-68}, {-41,-59}, {-41,-58}, {-41,-57}, {-41,-56}, {-41,-50}, {-41,-49}, {-41,-48}, {-41,-47}, {-41,-43}, {-41,-42}, {-41,-41}, {-41,-36}, {-41,144}, {-41,148}, {-41,149}, {-40,-118}, {-40,-117}, {-40,-116}, {-40,-85}, {-40,-84}, {-40,-69}, {-40,-68}, {-40,-60}, {-40,-59}, {-40,-58}, {-40,-57}, {-40,-56}, {-40,-50}, {-40,-49}, {-40,-48}, {-40,-47}, {-40,-43}, {-40,-42}, {-40,-41}, {-40,-36}, {-40,144}, {-40,148}, {-40,149}, {-39,-117}, {-39,-116}, {-39,-85}, {-39,-84}, {-39,-69}, {-39,-68}, {-39,-59}, {-39,-58}, {-39,-57}, {-39,-56}, {-39,-50}, {-39,-49}, {-39,-48}, {-39,-47}, {-39,-42}, {-39,-41}, {-39,-40}, {-39,-35}, {-39,143}, {-39,144}, {-39,148}, {-39,149}, {-38,-117}, {-38,-116}, {-38,-85}, {-38,-84}, {-38,-69}, {-38,-68}, {-38,-57}, {-38,-56}, {-38,-49}, {-38,-48}, {-38,-47}, {-38,-42}, {-38,-41}, {-38,-40}, {-38,-35}, {-38,143}, {-38,144}, {-38,148}, {-38,149}, {-37,-117}, {-37,-116}, {-37,-86}, {-37,-85}, {-37,-84}, {-37,-69}, {-37,-68}, {-37,-57}, {-37,-56}, {-37,-50}, {-37,-49}, {-37,-48}, {-37,-47}, {-37,-42}, {-37,-41}, {-37,-40}, {-37,-39}, {-37,-35}, {-37,-29}, {-37,-28}, {-37,-27}, {-37,143}, {-37,144}, {-37,147}, {-37,148}, {-37,149}, {-36,-117}, {-36,-116}, {-36,-115}, {-36,-86}, {-36,-85}, {-36,-69}, {-36,-68}, {-36,-57}, {-36,-56}, {-36,-50}, {-36,-49}, {-36,-48}, {-36,-47}, {-36,-42}, {-36,-41}, {-36,-40}, {-36,-39}, {-36,-35}, {-36,-34}, {-36,-30}, {-36,-29}, {-36,-28}, {-36,-27}, {-36,143}, {-36,144}, {-36,147}, {-36,148}, {-35,-116}, {-35,-115}, {-35,-86}, {-35,-85}, {-35,-69}, {-35,-68}, {-35,-57}, {-35,-56}, {-35,-50}, {-35,-49}, {-35,-48}, {-35,-47}, {-35,-42}, {-35,-41}, {-35,-40}, {-35,-39}, {-35,-38}, {-35,-34}, {-35,-31}, {-35,-30}, {-35,-29}, {-35,-28}, {-35,-27}, {-35,143}, {-35,144}, {-35,148}, {-34,-116}, {-34,-115}, {-34,-86}, {-34,-85}, {-34,-69}, {-34,-68}, {-34,-59}, {-34,-58}, {-34,-57}, {-34,-56}, {-34,-50}, {-34,-49}, {-34,-48}, {-34,-47}, {-34,-41}, {-34,-40}, {-34,-39}, {-34,-38}, {-34,-34}, {-34,-31}, {-34,-30}, {-34,-29}, {-34,143}, {-34,144}, {-34,148}, {-34,149}, {-33,-116}, {-33,-115}, {-33,-86}, {-33,-85}, {-33,-69}, {-33,-68}, {-33,-60}, {-33,-59}, {-33,-58}, {-33,-57}, {-33,-56}, {-33,-51}, {-33,-49}, {-33,-48}, {-33,-47}, {-33,-41}, {-33,-40}, {-33,-39}, {-33,-38}, {-33,-37}, {-33,-34}, {-33,-33}, {-33,-32}, {-33,-31}, {-33,-30}, {-33,-29}, {-33,143}, {-33,144}, {-33,148}, {-33,149}, {-32,-116}, {-32,-115}, {-32,-86}, {-32,-85}, {-32,-69}, {-32,-68}, {-32,-58}, {-32,-57}, {-32,-56}, {-32,-50}, {-32,-48}, {-32,-47}, {-32,-40}, {-32,-39}, {-32,-38}, {-32,-37}, {-32,-36}, {-32,-33}, {-32,-32}, {-32,-31}, {-32,-30}, {-32,143}, {-32,144}, {-32,149}, {-31,-116}, {-31,-115}, {-31,-87}, {-31,-86}, {-31,-85}, {-31,-69}, {-31,-68}, {-31,-57}, {-31,-56}, {-31,-50}, {-31,-49}, {-31,-48}, {-31,-47}, {-31,-40}, {-31,-39}, {-31,-38}, {-31,-37}, {-31,-36}, {-31,-33}, {-31,-32}, {-31,-31}, {-31,-30}, {-31,143}, {-31,144}, {-31,145}, {-31,146}, {-31,149}, {-31,150}, {-30,-116}, {-30,-115}, {-30,-114}, {-30,-87}, {-30,-86}, {-30,-69}, {-30,-68}, {-30,-57}, {-30,-56}, {-30,-50}, {-30,-49}, {-30,-48}, {-30,-47}, {-30,-38}, {-30,-37}, {-30,-36}, {-30,-35}, {-30,-33}, {-30,-32}, {-30,-31}, {-30,-30}, {-30,143}, {-30,144}, {-30,145}, {-30,146}, {-30,147}, {-30,148}, {-30,149}, {-30,150}, {-29,-115}, {-29,-114}, {-29,-87}, {-29,-86}, {-29,-69}, {-29,-68}, {-29,-57}, {-29,-56}, {-29,-50}, {-29,-49}, {-29,-48}, {-29,-47}, {-29,-37}, {-29,-36}, {-29,-35}, {-29,-34}, {-29,-33}, {-29,-32}, {-29,-31}, {-29,-30}, {-29,142}, {-29,143}, {-29,144}, {-29,145}, {-29,146}, {-29,147}, {-29,148}, {-29,149}, {-29,150}, {-29,151}, {-28,-115}, {-28,-114}, {-28,-87}, {-28,-86}, {-28,-69}, {-28,-68}, {-28,-59}, {-28,-57}, {-28,-56}, {-28,-49}, {-28,-48}, {-28,-47}, {-28,-36}, {-28,-35}, {-28,-34}, {-28,-33}, {-28,-32}, {-28,-31}, {-28,-30}, {-28,142}, {-28,143}, {-28,144}, {-28,145}, {-28,146}, {-28,148}, {-28,149}, {-28,150}, {-28,151}, {-27,-115}, {-27,-114}, {-27,-88}, {-27,-87}, {-27,-86}, {-27,-69}, {-27,-68}, {-27,-60}, {-27,-59}, {-27,-58}, {-27,-57}, {-27,-56}, {-27,-49}, {-27,-48}, {-27,-47}, {-27,-35}, {-27,-34}, {-27,-33}, {-27,-32}, {-27,-31}, {-27,-30}, {-27,150}, {-27,151}, {-26,-115}, {-26,-114}, {-26,-88}, {-26,-87}, {-26,-69}, {-26,-68}, {-26,-59}, {-26,-58}, {-26,-57}, {-26,-56}, {-26,-55}, {-26,-49}, {-26,-48}, {-26,-47}, {-26,-36}, {-26,-35}, {-26,-34}, {-26,-33}, {-26,-32}, {-26,-31}, {-26,-30}, {-26,-29}, {-26,151}, {-26,152}, {-25,-115}, {-25,-114}, {-25,-88}, {-25,-87}, {-25,-69}, {-25,-68}, {-25,-57}, {-25,-56}, {-25,-55}, {-25,-50}, {-25,-49}, {-25,-48}, {-25,-47}, {-25,-36}, {-25,-35}, {-25,-34}, {-25,-33}, {-25,-32}, {-25,-31}, {-25,-30}, {-25,-29}, {-25,151}, {-25,152}, {-24,-115}, {-24,-114}, {-24,-88}, {-24,-87}, {-24,-69}, {-24,-68}, {-24,-57}, {-24,-56}, {-24,-50}, {-24,-49}, {-24,-48}, {-24,-47}, {-24,-37}, {-24,-36}, {-24,-35}, {-24,-34}, {-24,-33}, {-24,-32}, {-24,-31}, {-24,-30}, {-24,-29}, {-24,-28}, {-24,151}, {-24,152}, {-24,153}, {-23,-115}, {-23,-114}, {-23,-89}, {-23,-88}, {-23,-87}, {-23,-70}, {-23,-69}, {-23,-68}, {-23,-57}, {-23,-56}, {-23,-50}, {-23,-49}, {-23,-48}, {-23,-47}, {-23,-38}, {-23,-37}, {-23,-36}, {-23,-35}, {-23,-34}, {-23,-32}, {-23,-31}, {-23,-30}, {-23,-29}, {-23,-28}, {-23,-27}, {-23,152}, {-23,153}, {-22,-115}, {-22,-114}, {-22,-89}, {-22,-88}, {-22,-87}, {-22,-70}, {-22,-69}, {-22,-68}, {-22,-57}, {-22,-56}, {-22,-50}, {-22,-49}, {-22,-48}, {-22,-47}, {-22,-38}, {-22,-37}, {-22,-36}, {-22,-35}, {-22,-31}, {-22,-30}, {-22,-29}, {-22,-28}, {-22,-27}, {-22,-26}, {-22,152}, {-22,153}, {-21,-115}, {-21,-114}, {-21,-89}, {-21,-88}, {-21,-70}, {-21,-69}, {-21,-68}, {-21,-57}, {-21,-56}, {-21,-49}, {-21,-48}, {-21,-47}, {-21,-39}, {-21,-38}, {-21,-37}, {-21,-36}, {-21,-35}, {-21,-30}, {-21,-29}, {-21,-28}, {-21,-27}, {-21,-26}, {-21,-25}, {-21,5}, {-21,6}, {-21,7}, {-21,8}, {-21,9}, {-21,10}, {-21,16}, {-21,17}, {-21,22}, {-21,23}, {-21,24}, {-21,152}, {-21,153}, {-20,-115}, {-20,-114}, {-20,-89}, {-20,-88}, {-20,-70}, {-20,-69}, {-20,-68}, {-20,-57}, {-20,-56}, {-20,-49}, {-20,-48}, {-20,-47}, {-20,-46}, {-20,-39}, {-20,-38}, {-20,-37}, {-20,-36}, {-20,-29}, {-20,-28}, {-20,-27}, {-20,-26}, {-20,-25}, {-20,-24}, {-20,-23}, {-20,-22}, {-20,-21}, {-20,6}, {-20,7}, {-20,8}, {-20,9}, {-20,10}, {-20,11}, {-20,12}, {-20,13}, {-20,14}, {-20,15}, {-20,16}, {-20,17}, {-20,23}, {-20,24}, {-20,152}, {-20,153}, {-19,-115}, {-19,-114}, {-19,-89}, {-19,-88}, {-19,-70}, {-19,-69}, {-19,-68}, {-19,-57}, {-19,-56}, {-19,-48}, {-19,-47}, {-19,-46}, {-19,-39}, {-19,-38}, {-19,-37}, {-19,-36}, {-19,-28}, {-19,-27}, {-19,-26}, {-19,-25}, {-19,-24}, {-19,-23}, {-19,-22}, {-19,-21}, {-19,-20}, {-19,-19}, {-19,-18}, {-19,-17}, {-19,-16}, {-19,-15}, {-19,-14}, {-19,-13}, {-19,-12}, {-19,-11}, {-19,-10}, {-19,-9}, {-19,-8}, {-19,-7}, {-19,-6}, {-19,-5}, {-19,-4}, {-19,8}, {-19,9}, {-19,10}, {-19,11}, {-19,12}, {-19,13}, {-19,14}, {-19,15}, {-19,16}, {-19,23}, {-19,24}, {-19,152}, {-19,153}, {-18,-115}, {-18,-114}, {-18,-113}, {-18,-90}, {-18,-89}, {-18,-88}, {-18,-70}, {-18,-69}, {-18,-68}, {-18,-57}, {-18,-56}, {-18,-48}, {-18,-47}, {-18,-40}, {-18,-39}, {-18,-38}, {-18,-37}, {-18,-27}, {-18,-26}, {-18,-25}, {-18,-24}, {-18,-23}, {-18,-22}, {-18,-21}, {-18,-20}, {-18,-19}, {-18,-18}, {-18,-17}, {-18,-16}, {-18,-15}, {-18,-14}, {-18,-13}, {-18,-12}, {-18,-11}, {-18,-10}, {-18,-9}, {-18,-8}, {-18,-7}, {-18,-6}, {-18,-5}, {-18,-4}, {-18,-3}, {-18,-2}, {-18,-1}, {-18,0}, {-18,1}, {-18,2}, {-18,9}, {-18,10}, {-18,11}, {-18,12}, {-18,13}, {-18,14}, {-18,15}, {-18,23}, {-18,24}, {-18,152}, {-18,153}, {-17,-115}, {-17,-114}, {-17,-113}, {-17,-90}, {-17,-89}, {-17,-88}, {-17,-70}, {-17,-69}, {-17,-57}, {-17,-56}, {-17,-48}, {-17,-47}, {-17,-40}, {-17,-39}, {-17,-38}, {-17,-37}, {-17,-25}, {-17,-24}, {-17,-23}, {-17,-22}, {-17,-15}, {-17,-14}, {-17,-13}, {-17,-12}, {-17,-6}, {-17,-5}, {-17,-4}, {-17,-3}, {-17,-2}, {-17,-1}, {-17,0}, {-17,1}, {-17,2}, {-17,3}, {-17,4}, {-17,5}, {-17,6}, {-17,7}, {-17,8}, {-17,9}, {-17,10}, {-17,11}, {-17,12}, {-17,13}, {-17,14}, {-17,15}, {-17,23}, {-17,24}, {-17,152}, {-17,153}, {-16,-115}, {-16,-114}, {-16,-113}, {-16,-90}, {-16,-89}, {-16,-70}, {-16,-69}, {-16,-57}, {-16,-56}, {-16,-48}, {-16,-47}, {-16,-41}, {-16,-40}, {-16,-39}, {-16,-38}, {-16,-37}, {-16,-24}, {-16,-23}, {-16,-22}, {-16,-21}, {-16,-20}, {-16,-11}, {-16,-10}, {-16,2}, {-16,3}, {-16,4}, {-16,5}, {-16,6}, {-16,7}, {-16,8}, {-16,9}, {-16,10}, {-16,11}, {-16,12}, {-16,13}, {-16,14}, {-16,15}, {-16,16}, {-16,23}, {-16,24}, {-16,152}, {-16,153}, {-15,-115}, {-15,-114}, {-15,-113}, {-15,-90}, {-15,-89}, {-15,-70}, {-15,-69}, {-15,-57}, {-15,-56}, {-15,-48}, {-15,-47}, {-15,-41}, {-15,-40}, {-15,-39}, {-15,-38}, {-15,-23}, {-15,-22}, {-15,-21}, {-15,-20}, {-15,-19}, {-15,-18}, {-15,-15}, {-15,3}, {-15,4}, {-15,5}, {-15,6}, {-15,7}, {-15,8}, {-15,9}, {-15,10}, {-15,11}, {-15,12}, {-15,13}, {-15,14}, {-15,15}, {-15,16}, {-15,17}, {-15,18}, {-15,19}, {-15,23}, {-15,24}, {-15,25}, {-15,152}, {-15,153}, {-14,-115}, {-14,-114}, {-14,-113}, {-14,-112}, {-14,-90}, {-14,-89}, {-14,-70}, {-14,-69}, {-14,-57}, {-14,-56}, {-14,-48}, {-14,-47}, {-14,-41}, {-14,-40}, {-14,-39}, {-14,-21}, {-14,-20}, {-14,-19}, {-14,-18}, {-14,-17}, {-14,-16}, {-14,-15}, {-14,1}, {-14,2}, {-14,3}, {-14,4}, {-14,5}, {-14,6}, {-14,10}, {-14,13}, {-14,14}, {-14,15}, {-14,16}, {-14,17}, {-14,18}, {-14,19}, {-14,20}, {-14,21}, {-14,23}, {-14,24}, {-14,25}, {-14,152}, {-14,153}, {-13,-114}, {-13,-113}, {-13,-112}, {-13,-90}, {-13,-89}, {-13,-70}, {-13,-69}, {-13,-57}, {-13,-56}, {-13,-55}, {-13,-48}, {-13,-47}, {-13,-42}, {-13,-41}, {-13,-40}, {-13,-39}, {-13,-21}, {-13,-20}, {-13,-19}, {-13,-18}, {-13,-17}, {-13,-16}, {-13,-15}, {-13,0}, {-13,1}, {-13,2}, {-13,3}, {-13,4}, {-13,15}, {-13,16}, {-13,17}, {-13,18}, {-13,19}, {-13,20}, {-13,21}, {-13,22}, {-13,23}, {-13,24}, {-13,25}, {-13,26}, {-13,152}, {-13,153}, {-12,-114}, {-12,-113}, {-12,-112}, {-12,-111}, {-12,-90}, {-12,-89}, {-12,-70}, {-12,-69}, {-12,-57}, {-12,-56}, {-12,-55}, {-12,-48}, {-12,-47}, {-12,-42}, {-12,-41}, {-12,-40}, {-12,-18}, {-12,-17}, {-12,-16}, {-12,-15}, {-12,-14}, {-12,-13}, {-12,-12}, {-12,-3}, {-12,-2}, {-12,-1}, {-12,0}, {-12,1}, {-12,2}, {-12,3}, {-12,16}, {-12,17}, {-12,18}, {-12,19}, {-12,20}, {-12,21}, {-12,22}, {-12,23}, {-12,24}, {-12,25}, {-12,26}, {-12,27}, {-12,152}, {-12,153}, {-11,-114}, {-11,-113}, {-11,-112}, {-11,-111}, {-11,-110}, {-11,-90}, {-11,-89}, {-11,-70}, {-11,-69}, {-11,-57}, {-11,-56}, {-11,-55}, {-11,-49}, {-11,-48}, {-11,-47}, {-11,-43}, {-11,-42}, {-11,-41}, {-11,-40}, {-11,-16}, {-11,-15}, {-11,-14}, {-11,-13}, {-11,-12}, {-11,-11}, {-11,-10}, {-11,-9}, {-11,-5}, {-11,-4}, {-11,-3}, {-11,-2}, {-11,-1}, {-11,0}, {-11,1}, {-11,2}, {-11,18}, {-11,19}, {-11,20}, {-11,21}, {-11,22}, {-11,23}, {-11,24}, {-11,25}, {-11,26}, {-11,27}, {-11,28}, {-11,29}, {-11,30}, {-11,152}, {-11,153}, {-10,-114}, {-10,-113}, {-10,-112}, {-10,-111}, {-10,-110}, {-10,-109}, {-10,-91}, {-10,-90}, {-10,-89}, {-10,-70}, {-10,-69}, {-10,-57}, {-10,-56}, {-10,-55}, {-10,-49}, {-10,-48}, {-10,-47}, {-10,-43}, {-10,-42}, {-10,-41}, {-10,-40}, {-10,-13}, {-10,-12}, {-10,-11}, {-10,-10}, {-10,-9}, {-10,-8}, {-10,-7}, {-10,-6}, {-10,-5}, {-10,-4}, {-10,-3}, {-10,-2}, {-10,-1}, {-10,0}, {-10,9}, {-10,10}, {-10,11}, {-10,12}, {-10,13}, {-10,20}, {-10,21}, {-10,22}, {-10,23}, {-10,24}, {-10,25}, {-10,26}, {-10,27}, {-10,28}, {-10,29}, {-10,30}, {-10,152}, {-10,153}, {-9,-114}, {-9,-113}, {-9,-111}, {-9,-110}, {-9,-109}, {-9,-108}, {-9,-92}, {-9,-91}, {-9,-90}, {-9,-89}, {-9,-70}, {-9,-69}, {-9,-57}, {-9,-56}, {-9,-55}, {-9,-49}, {-9,-48}, {-9,-43}, {-9,-42}, {-9,-41}, {-9,-16}, {-9,-15}, {-9,-14}, {-9,-11}, {-9,-10}, {-9,-9}, {-9,-8}, {-9,-7}, {-9,-6}, {-9,-5}, {-9,-4}, {-9,-3}, {-9,-2}, {-9,-1}, {-9,0}, {-9,1}, {-9,2}, {-9,3}, {-9,4}, {-9,5}, {-9,6}, {-9,7}, {-9,8}, {-9,9}, {-9,10}, {-9,11}, {-9,12}, {-9,13}, {-9,14}, {-9,15}, {-9,16}, {-9,17}, {-9,18}, {-9,19}, {-9,20}, {-9,21}, {-9,22}, {-9,23}, {-9,24}, {-9,25}, {-9,26}, {-9,27}, {-9,28}, {-9,29}, {-9,30}, {-9,152}, {-9,153}, {-8,-114}, {-8,-113}, {-8,-110}, {-8,-109}, {-8,-108}, {-8,-107}, {-8,-106}, {-8,-92}, {-8,-91}, {-8,-90}, {-8,-70}, {-8,-69}, {-8,-57}, {-8,-56}, {-8,-55}, {-8,-49}, {-8,-48}, {-8,-44}, {-8,-43}, {-8,-42}, {-8,-19}, {-8,-18}, {-8,-14}, {-8,-11}, {-8,-10}, {-8,-9}, {-8,-8}, {-8,-7}, {-8,-6}, {-8,-5}, {-8,-4}, {-8,-3}, {-8,-2}, {-8,-1}, {-8,0}, {-8,1}, {-8,2}, {-8,3}, {-8,4}, {-8,5}, {-8,6}, {-8,7}, {-8,8}, {-8,9}, {-8,10}, {-8,11}, {-8,12}, {-8,13}, {-8,14}, {-8,15}, {-8,16}, {-8,17}, {-8,18}, {-8,19}, {-8,20}, {-8,21}, {-8,22}, {-8,23}, {-8,24}, {-8,25}, {-8,26}, {-8,27}, {-8,28}, {-8,29}, {-8,30}, {-8,152}, {-8,153}, {-7,-114}, {-7,-113}, {-7,-108}, {-7,-107}, {-7,-106}, {-7,-105}, {-7,-92}, {-7,-91}, {-7,-90}, {-7,-70}, {-7,-69}, {-7,-57}, {-7,-56}, {-7,-55}, {-7,-54}, {-7,-49}, {-7,-48}, {-7,-47}, {-7,-44}, {-7,-43}, {-7,-42}, {-7,-22}, {-7,-20}, {-7,-19}, {-7,-18}, {-7,-17}, {-7,-16}, {-7,-15}, {-7,-14}, {-7,-13}, {-7,-12}, {-7,-11}, {-7,-10}, {-7,-9}, {-7,-8}, {-7,-7}, {-7,-6}, {-7,-5}, {-7,-4}, {-7,-3}, {-7,-2}, {-7,-1}, {-7,0}, {-7,1}, {-7,2}, {-7,3}, {-7,4}, {-7,5}, {-7,6}, {-7,7}, {-7,8}, {-7,9}, {-7,10}, {-7,11}, {-7,12}, {-7,13}, {-7,14}, {-7,15}, {-7,16}, {-7,17}, {-7,18}, {-7,19}, {-7,20}, {-7,21}, {-7,22}, {-7,23}, {-7,24}, {-7,25}, {-7,26}, {-7,27}, {-7,28}, {-7,29}, {-7,30}, {-7,152}, {-7,153}, {-6,-114}, {-6,-113}, {-6,-107}, {-6,-106}, {-6,-105}, {-6,-104}, {-6,-103}, {-6,-93}, {-6,-92}, {-6,-91}, {-6,-90}, {-6,-70}, {-6,-69}, {-6,-57}, {-6,-56}, {-6,-55}, {-6,-54}, {-6,-49}, {-6,-48}, {-6,-47}, {-6,-45}, {-6,-44}, {-6,-43}, {-6,-24}, {-6,-23}, {-6,-22}, {-6,-21}, {-6,-20}, {-6,-19}, {-6,-18}, {-6,-17}, {-6,-16}, {-6,-15}, {-6,-14}, {-6,-13}, {-6,-12}, {-6,-11}, {-6,-10}, {-6,-9}, {-6,-8}, {-6,-7}, {-6,-6}, {-6,-5}, {-6,-4}, {-6,0}, {-6,1}, {-6,2}, {-6,3}, {-6,4}, {-6,5}, {-6,6}, {-6,7}, {-6,8}, {-6,9}, {-6,10}, {-6,11}, {-6,12}, {-6,13}, {-6,14}, {-6,15}, {-6,16}, {-6,17}, {-6,18}, {-6,19}, {-6,20}, {-6,21}, {-6,22}, {-6,27}, {-6,28}, {-6,29}, {-6,30}, {-6,152}, {-6,153}, {-5,-114}, {-5,-113}, {-5,-105}, {-5,-104}, {-5,-103}, {-5,-102}, {-5,-101}, {-5,-93}, {-5,-92}, {-5,-91}, {-5,-90}, {-5,-70}, {-5,-69}, {-5,-57}, {-5,-56}, {-5,-55}, {-5,-54}, {-5,-51}, {-5,-50}, {-5,-49}, {-5,-48}, {-5,-47}, {-5,-45}, {-5,-44}, {-5,-43}, {-5,-27}, {-5,-26}, {-5,-25}, {-5,-24}, {-5,-23}, {-5,-22}, {-5,-21}, {-5,-20}, {-5,-19}, {-5,-18}, {-5,-17}, {-5,-16}, {-5,-15}, {-5,-14}, {-5,-13}, {-5,-12}, {-5,-11}, {-5,-10}, {-5,-9}, {-5,-8}, {-5,4}, {-5,8}, {-5,10}, {-5,11}, {-5,12}, {-5,13}, {-5,14}, {-5,15}, {-5,16}, {-5,17}, {-5,18}, {-5,19}, {-5,21}, {-5,152}, {-5,153}, {-4,-114}, {-4,-113}, {-4,-104}, {-4,-103}, {-4,-102}, {-4,-101}, {-4,-100}, {-4,-93}, {-4,-92}, {-4,-91}, {-4,-90}, {-4,-70}, {-4,-69}, {-4,-58}, {-4,-57}, {-4,-56}, {-4,-55}, {-4,-54}, {-4,-51}, {-4,-50}, {-4,-49}, {-4,-48}, {-4,-47}, {-4,-46}, {-4,-45}, {-4,-44}, {-4,-31}, {-4,-30}, {-4,-29}, {-4,-28}, {-4,-27}, {-4,-26}, {-4,-25}, {-4,-24}, {-4,-23}, {-4,-22}, {-4,-21}, {-4,-20}, {-4,-18}, {-4,-17}, {-4,-16}, {-4,-15}, {-4,-14}, {-4,-13}, {-4,-12}, {-4,-11}, {-4,4}, {-4,5}, {-4,6}, {-4,7}, {-4,8}, {-4,151}, {-4,152}, {-4,153}, {-3,-114}, {-3,-113}, {-3,-102}, {-3,-101}, {-3,-100}, {-3,-99}, {-3,-98}, {-3,-92}, {-3,-91}, {-3,-90}, {-3,-70}, {-3,-69}, {-3,-58}, {-3,-57}, {-3,-56}, {-3,-55}, {-3,-54}, {-3,-51}, {-3,-50}, {-3,-49}, {-3,-48}, {-3,-47}, {-3,-46}, {-3,-45}, {-3,-44}, {-3,-36}, {-3,-35}, {-3,-34}, {-3,-33}, {-3,-32}, {-3,-31}, {-3,-30}, {-3,-29}, {-3,-28}, {-3,-27}, {-3,-26}, {-3,-25}, {-3,-24}, {-3,-23}, {-3,-22}, {-3,-21}, {-3,-20}, {-3,-19}, {-3,-18}, {-3,-17}, {-3,-16}, {-3,151}, {-3,152}, {-3,153}, {-2,-114}, {-2,-113}, {-2,-101}, {-2,-100}, {-2,-99}, {-2,-98}, {-2,-97}, {-2,-96}, {-2,-92}, {-2,-91}, {-2,-90}, {-2,-70}, {-2,-69}, {-2,-58}, {-2,-57}, {-2,-55}, {-2,-54}, {-2,-53}, {-2,-51}, {-2,-50}, {-2,-49}, {-2,-48}, {-2,-47}, {-2,-46}, {-2,-45}, {-2,-38}, {-2,-37}, {-2,-35}, {-2,-34}, {-2,-33}, {-2,-32}, {-2,-31}, {-2,-30}, {-2,-29}, {-2,-28}, {-2,-26}, {-2,-25}, {-2,-24}, {-2,-23}, {-2,-22}, {-2,-21}, {-2,-20}, {-2,-19}, {-2,-18}, {-2,-17}, {-2,151}, {-2,152}, {-1,-114}, {-1,-113}, {-1,-99}, {-1,-98}, {-1,-97}, {-1,-96}, {-1,-95}, {-1,-92}, {-1,-91}, {-1,-90}, {-1,-70}, {-1,-69}, {-1,-58}, {-1,-57}, {-1,-55}, {-1,-54}, {-1,-53}, {-1,-51}, {-1,-50}, {-1,-49}, {-1,-48}, {-1,-47}, {-1,-46}, {-1,-45}, {-1,-38}, {-1,-37}, {-1,-36}, {-1,-35}, {-1,-34}, {-1,-33}, {-1,-32}, {-1,-31}, {-1,-30}, {-1,-27}, {-1,-26}, {-1,-25}, {-1,-24}, {-1,-23}, {-1,-22}, {-1,-21}, {-1,-20}, {-1,151}, {-1,152}, {0,-114}, {0,-113}, {0,-112}, {0,-97}, {0,-96}, {0,-95}, {0,-94}, {0,-93}, {0,-92}, {0,-91}, {0,-90}, {0,-70}, {0,-69}, {0,-58}, {0,-57}, {0,-55}, {0,-54}, {0,-53}, {0,-51}, {0,-50}, {0,-49}, {0,-48}, {0,-47}, {0,-46}, {0,-41}, {0,-40}, {0,-39}, {0,-38}, {0,-37}, {0,-36}, {0,-35}, {0,-34}, {0,-33}, {0,-29}, {0,-28}, {0,-27}, {0,-26}, {0,-25}, {0,-24}, {0,-23}, {0,151}, {0,152}, {1,-114}, {1,-113}, {1,-112}, {1,-96}, {1,-95}, {1,-94}, {1,-93}, {1,-92}, {1,-91}, {1,-90}, {1,-70}, {1,-69}, {1,-58}, {1,-57}, {1,-54}, {1,-53}, {1,-52}, {1,-51}, {1,-50}, {1,-49}, {1,-48}, {1,-47}, {1,-46}, {1,-45}, {1,-44}, {1,-43}, {1,-42}, {1,-41}, {1,-40}, {1,-39}, {1,-38}, {1,-37}, {1,-35}, {1,-31}, {1,-30}, {1,-29}, {1,-28}, {1,-27}, {1,-26}, {1,-25}, {1,-24}, {1,151}, {1,152}, {2,-113}, {2,-112}, {2,-94}, {2,-93}, {2,-92}, {2,-91}, {2,-90}, {2,-70}, {2,-69}, {2,-68}, {2,-58}, {2,-57}, {2,-55}, {2,-54}, {2,-53}, {2,-52}, {2,-51}, {2,-50}, {2,-49}, {2,-48}, {2,-47}, {2,-46}, {2,-45}, {2,-44}, {2,-43}, {2,-42}, {2,-41}, {2,-40}, {2,-39}, {2,-38}, {2,-37}, {2,-33}, {2,-32}, {2,-31}, {2,-30}, {2,-29}, {2,-28}, {2,-27}, {2,150}, {2,151}, {2,152}, {3,-113}, {3,-112}, {3,-93}, {3,-92}, {3,-91}, {3,-70}, {3,-69}, {3,-68}, {3,-59}, {3,-58}, {3,-57}, {3,-56}, {3,-54}, {3,-53}, {3,-52}, {3,-51}, {3,-50}, {3,-49}, {3,-48}, {3,-47}, {3,-46}, {3,-45}, {3,-44}, {3,-43}, {3,-42}, {3,-41}, {3,-40}, {3,-39}, {3,-38}, {3,-37}, {3,-36}, {3,-35}, {3,-34}, {3,-33}, {3,-32}, {3,-31}, {3,-30}, {3,-29}, {3,-28}, {3,150}, {3,151}, {3,152}, {4,-113}, {4,-112}, {4,-92}, {4,-91}, {4,-70}, {4,-69}, {4,-68}, {4,-60}, {4,-59}, {4,-58}, {4,-57}, {4,-56}, {4,-55}, {4,-54}, {4,-53}, {4,-52}, {4,-51}, {4,-50}, {4,-49}, {4,-48}, {4,-47}, {4,-46}, {4,-45}, {4,-43}, {4,-42}, {4,-41}, {4,-36}, {4,-35}, {4,-34}, {4,-33}, {4,-31}, {4,150}, {4,151}, {5,-113}, {5,-112}, {5,-92}, {5,-91}, {5,-90}, {5,-70}, {5,-69}, {5,-68}, {5,-59}, {5,-58}, {5,-57}, {5,-56}, {5,-55}, {5,-54}, {5,-53}, {5,-52}, {5,-51}, {5,-50}, {5,-49}, {5,-48}, {5,-47}, {5,-46}, {5,-45}, {5,-44}, {5,-43}, {5,-38}, {5,-37}, {5,-36}, {5,-35}, {5,-34}, {5,-32}, {5,149}, {5,150}, {5,151}, {6,-113}, {6,-112}, {6,-111}, {6,-92}, {6,-91}, {6,-90}, {6,-70}, {6,-69}, {6,-68}, {6,-57}, {6,-56}, {6,-55}, {6,-54}, {6,-53}, {6,-52}, {6,-51}, {6,-50}, {6,-49}, {6,-48}, {6,-47}, {6,-46}, {6,-44}, {6,-43}, {6,-39}, {6,-38}, {6,-37}, {6,-35}, {6,149}, {6,150}, {6,151}, {7,-113}, {7,-112}, {7,-111}, {7,-110}, {7,-92}, {7,-91}, {7,-90}, {7,-69}, {7,-68}, {7,-56}, {7,-55}, {7,-54}, {7,-53}, {7,-52}, {7,-51}, {7,-50}, {7,-49}, {7,-48}, {7,-44}, {7,-43}, {7,-42}, {7,-40}, {7,-39}, {7,-38}, {7,-37}, {7,149}, {7,150}, {7,151}, {8,-112}, {8,-111}, {8,-110}, {8,-109}, {8,-108}, {8,-107}, {8,-106}, {8,-92}, {8,-91}, {8,-90}, {8,-69}, {8,-68}, {8,-54}, {8,-53}, {8,-52}, {8,-51}, {8,-50}, {8,-49}, {8,-43}, {8,-42}, {8,-41}, {8,-40}, {8,-39}, {8,149}, {8,150}, {9,-111}, {9,-110}, {9,-109}, {9,-108}, {9,-107}, {9,-106}, {9,-105}, {9,-92}, {9,-91}, {9,-90}, {9,-69}, {9,-68}, {9,-52}, {9,-51}, {9,-50}, {9,-43}, {9,-42}, {9,-41}, {9,149}, {9,150}, {10,-107}, {10,-106}, {10,-105}, {10,-104}, {10,-91}, {10,-90}, {10,-89}, {10,-69}, {10,-68}, {10,-51}, {10,-42}, {10,149}, {10,150}, {11,-106}, {11,-105}, {11,-104}, {11,-90}, {11,-89}, {11,-69}, {11,-68}, {11,149}, {11,150}, {12,-105}, {12,-104}, {12,-103}, {12,-90}, {12,-89}, {12,-69}, {12,-68}, {12,148}, {12,149}, {12,150}, {13,-105}, {13,-104}, {13,-103}, {13,-90}, {13,-89}, {13,-69}, {13,-68}, {13,148}, {13,149}, {13,150}, {14,-104}, {14,-103}, {14,-90}, {14,-89}, {14,-69}, {14,-68}, {14,148}, {14,149}, {14,150}, {15,-104}, {15,-103}, {15,-90}, {15,-89}, {15,-70}, {15,-69}, {15,-68}, {15,148}, {15,149}, {15,150}, {16,-104}, {16,-103}, {16,-90}, {16,-89}, {16,-70}, {16,-69}, {16,-68}, {16,-67}, {16,-51}, {16,-23}, {16,-15}, {16,-14}, {16,148}, {16,149}, {16,150}, {17,-104}, {17,-103}, {17,-102}, {17,-90}, {17,-89}, {17,-88}, {17,-70}, {17,-69}, {17,-68}, {17,-67}, {17,-66}, {17,-52}, {17,-51}, {17,-50}, {17,-24}, {17,-23}, {17,-22}, {17,-21}, {17,-20}, {17,-19}, {17,-18}, {17,-17}, {17,-16}, {17,-15}, {17,-14}, {17,147}, {17,148}, {17,149}, {17,150}, {18,-104}, {18,-103}, {18,-102}, {18,-90}, {18,-89}, {18,-88}, {18,-70}, {18,-69}, {18,-67}, {18,-66}, {18,-65}, {18,-64}, {18,-63}, {18,-62}, {18,-61}, {18,-60}, {18,-59}, {18,-58}, {18,-57}, {18,-56}, {18,-55}, {18,-54}, {18,-53}, {18,-52}, {18,-51}, {18,-50}, {18,-49}, {18,-48}, {18,-47}, {18,-46}, {18,-45}, {18,-44}, {18,-43}, {18,-42}, {18,-41}, {18,-40}, {18,-39}, {18,-38}, {18,-27}, {18,-26}, {18,-25}, {18,-24}, {18,-23}, {18,-22}, {18,-21}, {18,-20}, {18,-19}, {18,-18}, {18,-17}, {18,-16}, {18,-15}, {18,-14}, {18,147}, {18,148}, {18,149}, {18,150}, {19,-103}, {19,-102}, {19,-89}, {19,-88}, {19,-70}, {19,-69}, {19,-68}, {19,-67}, {19,-66}, {19,-65}, {19,-64}, {19,-63}, {19,-62}, {19,-61}, {19,-60}, {19,-59}, {19,-58}, {19,-57}, {19,-56}, {19,-55}, {19,-54}, {19,-53}, {19,-52}, {19,-51}, {19,-50}, {19,-49}, {19,-48}, {19,-47}, {19,-46}, {19,-45}, {19,-44}, {19,-43}, {19,-42}, {19,-41}, {19,-40}, {19,-39}, {19,-38}, {19,-37}, {19,-36}, {19,-35}, {19,-34}, {19,-33}, {19,-32}, {19,-31}, {19,-30}, {19,-29}, {19,-28}, {19,-27}, {19,-26}, {19,-25}, {19,-24}, {19,-23}, {19,-22}, {19,-21}, {19,-20}, {19,-19}, {19,-18}, {19,-17}, {19,-16}, {19,-15}, {19,-14}, {19,-13}, {19,-12}, {19,147}, {19,148}, {19,149}, {20,-103}, {20,-102}, {20,-89}, {20,-88}, {20,-70}, {20,-69}, {20,-68}, {20,-67}, {20,-66}, {20,-42}, {20,-41}, {20,-40}, {20,-39}, {20,-38}, {20,-37}, {20,-36}, {20,-35}, {20,-34}, {20,-33}, {20,-32}, {20,-31}, {20,-30}, {20,-29}, {20,-28}, {20,-27}, {20,-26}, {20,-25}, {20,-18}, {20,-17}, {20,-16}, {20,-15}, {20,-14}, {20,-13}, {20,-12}, {20,-11}, {20,147}, {20,148}, {20,149}, {21,-103}, {21,-102}, {21,-89}, {21,-88}, {21,-87}, {21,-70}, {21,-69}, {21,-68}, {21,-41}, {21,-40}, {21,-39}, {21,-38}, {21,-14}, {21,-13}, {21,-12}, {21,-11}, {21,-10}, {21,-9}, {21,-8}, {21,146}, {21,147}, {21,148}, {21,149}, {22,-103}, {22,-102}, {22,-89}, {22,-88}, {22,-87}, {22,-70}, {22,-69}, {22,-40}, {22,-39}, {22,-38}, {22,-12}, {22,-11}, {22,-10}, {22,-9}, {22,-8}, {22,146}, {22,147}, {22,148}, {22,149}, {23,-103}, {23,-102}, {23,-101}, {23,-89}, {23,-88}, {23,-87}, {23,-70}, {23,-69}, {23,-40}, {23,-39}, {23,-38}, {23,-11}, {23,-10}, {23,-9}, {23,-8}, {23,145}, {23,146}, {23,147}, {23,149}, {24,-102}, {24,-101}, {24,-89}, {24,-88}, {24,-87}, {24,-71}, {24,-70}, {24,-69}, {24,-39}, {24,-38}, {24,-37}, {24,-10}, {24,-9}, {24,-8}, {24,145}, {24,146}, {24,147}, {24,149}, {25,-102}, {25,-101}, {25,-89}, {25,-88}, {25,-87}, {25,-71}, {25,-70}, {25,-39}, {25,-38}, {25,-37}, {25,-9}, {25,-8}, {25,144}, {25,145}, {25,146}, {25,148}, {26,-102}, {26,-101}, {26,-90}, {26,-89}, {26,-88}, {26,-87}, {26,-71}, {26,-70}, {26,-38}, {26,-37}, {26,-36}, {26,144}, {26,145}, {26,146}, {26,148}, {27,-102}, {27,-101}, {27,-90}, {27,-89}, {27,-88}, {27,-87}, {27,-86}, {27,-71}, {27,-70}, {27,-38}, {27,-37}, {27,-36}, {27,143}, {27,144}, {27,145}, {27,148}, {28,-102}, {28,-101}, {28,-90}, {28,-89}, {28,-88}, {28,-87}, {28,-86}, {28,-71}, {28,-70}, {28,-37}, {28,-36}, {28,142}, {28,143}, {28,144}, {28,145}, {28,148}, {29,-102}, {29,-101}, {29,-90}, {29,-89}, {29,-88}, {29,-87}, {29,-86}, {29,-71}, {29,-70}, {29,-37}, {29,-36}, {29,-35}, {29,67}, {29,68}, {29,69}, {29,70}, {29,71}, {29,141}, {29,142}, {29,143}, {29,144}, {29,148}, {30,-102}, {30,-101}, {30,-100}, {30,-90}, {30,-89}, {30,-88}, {30,-87}, {30,-86}, {30,-71}, {30,-70}, {30,-37}, {30,-36}, {30,-35}, {30,-9}, {30,-8}, {30,58}, {30,59}, {30,60}, {30,61}, {30,62}, {30,63}, {30,64}, {30,65}, {30,66}, {30,67}, {30,68}, {30,69}, {30,70}, {30,71}, {30,72}, {30,73}, {30,74}, {30,89}, {30,90}, {30,91}, {30,92}, {30,93}, {30,94}, {30,95}, {30,96}, {30,97}, {30,98}, {30,99}, {30,100}, {30,101}, {30,127}, {30,128}, {30,129}, {30,130}, {30,131}, {30,132}, {30,133}, {30,134}, {30,135}, {30,136}, {30,137}, {30,138}, {30,139}, {30,140}, {30,141}, {30,142}, {30,143}, {30,148}, {31,-102}, {31,-101}, {31,-100}, {31,-91}, {31,-90}, {31,-89}, {31,-88}, {31,-87}, {31,-86}, {31,-71}, {31,-70}, {31,-36}, {31,-35}, {31,-34}, {31,-12}, {31,-11}, {31,-10}, {31,-9}, {31,-8}, {31,56}, {31,57}, {31,58}, {31,59}, {31,60}, {31,61}, {31,62}, {31,63}, {31,64}, {31,65}, {31,66}, {31,67}, {31,68}, {31,69}, {31,70}, {31,71}, {31,72}, {31,73}, {31,74}, {31,75}, {31,76}, {31,77}, {31,78}, {31,79}, {31,80}, {31,81}, {31,82}, {31,83}, {31,84}, {31,85}, {31,86}, {31,87}, {31,88}, {31,89}, {31,90}, {31,91}, {31,92}, {31,93}, {31,94}, {31,95}, {31,96}, {31,97}, {31,98}, {31,99}, {31,100}, {31,101}, {31,102}, {31,103}, {31,104}, {31,105}, {31,106}, {31,107}, {31,108}, {31,109}, {31,110}, {31,111}, {31,112}, {31,113}, {31,114}, {31,115}, {31,116}, {31,117}, {31,118}, {31,119}, {31,120}, {31,121}, {31,122}, {31,123}, {31,124}, {31,125}, {31,126}, {31,127}, {31,128}, {31,129}, {31,130}, {31,131}, {31,132}, {31,133}, {31,134}, {31,135}, {31,136}, {31,137}, {31,138}, {31,139}, {31,140}, {31,141}, {31,142}, {31,143}, {31,144}, {31,148}, {32,-101}, {32,-100}, {32,-91}, {32,-90}, {32,-89}, {32,-88}, {32,-87}, {32,-86}, {32,-71}, {32,-70}, {32,-36}, {32,-35}, {32,-34}, {32,-14}, {32,-13}, {32,-12}, {32,-11}, {32,-10}, {32,-9}, {32,-8}, {32,54}, {32,55}, {32,56}, {32,57}, {32,58}, {32,59}, {32,74}, {32,75}, {32,76}, {32,77}, {32,78}, {32,79}, {32,80}, {32,81}, {32,82}, {32,83}, {32,84}, {32,85}, {32,86}, {32,87}, {32,88}, {32,89}, {32,90}, {32,100}, {32,101}, {32,102}, {32,103}, {32,104}, {32,105}, {32,106}, {32,107}, {32,108}, {32,109}, {32,110}, {32,111}, {32,112}, {32,113}, {32,114}, {32,115}, {32,116}, {32,117}, {32,118}, {32,119}, {32,120}, {32,121}, {32,122}, {32,123}, {32,124}, {32,125}, {32,126}, {32,127}, {32,128}, {32,136}, {32,137}, {32,138}, {32,139}, {32,140}, {32,141}, {32,142}, {32,143}, {32,144}, {32,145}, {32,146}, {32,148}, {32,149}, {33,-101}, {33,-100}, {33,-91}, {33,-90}, {33,-87}, {33,-86}, {33,-71}, {33,-70}, {33,-69}, {33,-35}, {33,-34}, {33,-19}, {33,-18}, {33,-16}, {33,-15}, {33,-14}, {33,-13}, {33,-12}, {33,-11}, {33,-8}, {33,53}, {33,54}, {33,55}, {33,56}, {33,57}, {33,144}, {33,145}, {33,146}, {33,147}, {33,148}, {33,149}, {34,-101}, {34,-100}, {34,-92}, {34,-91}, {34,-90}, {34,-87}, {34,-86}, {34,-85}, {34,-70}, {34,-69}, {34,-35}, {34,-34}, {34,-21}, {34,-20}, {34,-19}, {34,-18}, {34,-17}, {34,-16}, {34,-15}, {34,-14}, {34,-13}, {34,-12}, {34,53}, {34,54}, {34,55}, {34,145}, {34,146}, {34,147}, {34,148}, {34,149}, {35,-101}, {35,-100}, {35,-99}, {35,-92}, {35,-91}, {35,-90}, {35,-87}, {35,-86}, {35,-85}, {35,-71}, {35,-70}, {35,-69}, {35,-41}, {35,-35}, {35,-34}, {35,-33}, {35,-25}, {35,-24}, {35,-23}, {35,-22}, {35,-21}, {35,-20}, {35,-19}, {35,-18}, {35,-17}, {35,-16}, {35,-15}, {35,-14}, {35,53}, {35,54}, {35,146}, {35,147}, {35,148}, {36,-101}, {36,-100}, {36,-99}, {36,-93}, {36,-92}, {36,-91}, {36,-86}, {36,-85}, {36,-71}, {36,-70}, {36,-69}, {36,-68}, {36,-67}, {36,-42}, {36,-41}, {36,-40}, {36,-39}, {36,-38}, {36,-37}, {36,-36}, {36,-35}, {36,-34}, {36,-33}, {36,-32}, {36,-31}, {36,-30}, {36,-29}, {36,-28}, {36,-27}, {36,-26}, {36,-25}, {36,-24}, {36,-23}, {36,-22}, {36,-21}, {36,-20}, {36,-19}, {36,-18}, {36,-17}, {36,-16}, {36,-15}, {36,-14}, {36,53}, {36,54}, {36,146}, {36,147}, {36,148}, {37,-100}, {37,-99}, {37,-93}, {37,-92}, {37,-91}, {37,-86}, {37,-85}, {37,-70}, {37,-69}, {37,-68}, {37,-67}, {37,-42}, {37,-41}, {37,-40}, {37,-39}, {37,-38}, {37,-37}, {37,-36}, {37,-35}, {37,-34}, {37,-33}, {37,-32}, {37,-31}, {37,-30}, {37,-29}, {37,-28}, {37,-27}, {37,-26}, {37,-25}, {37,-24}, {37,-23}, {37,-22}, {37,-21}, {37,-20}, {37,-19}, {37,-18}, {37,-17}, {37,53}, {37,54}, {37,147}, {37,148}, {38,-100}, {38,-99}, {38,-93}, {38,-92}, {38,-86}, {38,-85}, {38,-70}, {38,-69}, {38,-68}, {38,-67}, {38,-42}, {38,-41}, {38,-40}, {38,-39}, {38,-38}, {38,-37}, {38,-36}, {38,-35}, {38,-34}, {38,-33}, {38,-32}, {38,-31}, {38,-30}, {38,-29}, {38,-28}, {38,-27}, {38,-26}, {38,-25}, {38,-24}, {38,-23}, {38,-22}, {38,-21}, {38,-20}, {38,-19}, {38,-8}, {38,53}, {38,54}, {38,147}, {38,148}, {39,-100}, {39,-99}, {39,-94}, {39,-93}, {39,-92}, {39,-86}, {39,-85}, {39,-84}, {39,-71}, {39,-70}, {39,-69}, {39,-68}, {39,-67}, {39,-42}, {39,-41}, {39,-40}, {39,-39}, {39,-38}, {39,-37}, {39,-36}, {39,-35}, {39,-34}, {39,-33}, {39,-32}, {39,-31}, {39,-30}, {39,-29}, {39,-28}, {39,-27}, {39,-26}, {39,-25}, {39,-24}, {39,-23}, {39,-22}, {39,-21}, {39,-20}, {39,-19}, {39,-18}, {39,53}, {39,54}, {39,147}, {39,148}, {40,-100}, {40,-99}, {40,-98}, {40,-94}, {40,-93}, {40,-92}, {40,-85}, {40,-84}, {40,-71}, {40,-70}, {40,-33}, {40,-32}, {40,-29}, {40,-28}, {40,-27}, {40,-26}, {40,-25}, {40,-24}, {40,-23}, {40,-22}, {40,-21}, {40,-20}, {40,-19}, {40,-18}, {40,53}, {40,54}, {40,147}, {40,148}, {41,-100}, {41,-99}, {41,-98}, {41,-94}, {41,-93}, {41,-85}, {41,-84}, {41,-71}, {41,-70}, {41,-33}, {41,-32}, {41,-30}, {41,-29}, {41,-28}, {41,-25}, {41,-24}, {41,-23}, {41,-22}, {41,-21}, {41,-20}, {41,-19}, {41,-18}, {41,-17}, {41,-16}, {41,53}, {41,54}, {41,147}, {41,148}, {42,-99}, {42,-98}, {42,-94}, {42,-93}, {42,-85}, {42,-84}, {42,-71}, {42,-70}, {42,-33}, {42,-32}, {42,-31}, {42,-30}, {42,-29}, {42,-28}, {42,-26}, {42,-25}, {42,-24}, {42,-23}, {42,-19}, {42,-18}, {42,-17}, {42,-16}, {42,-15}, {42,-14}, {42,-13}, {42,-8}, {42,53}, {42,54}, {42,147}, {42,148}, {43,-99}, {43,-98}, {43,-94}, {43,-93}, {43,-90}, {43,-85}, {43,-84}, {43,-83}, {43,-71}, {43,-70}, {43,-33}, {43,-32}, {43,-31}, {43,-30}, {43,-29}, {43,-28}, {43,-27}, {43,-26}, {43,-25}, {43,-19}, {43,-18}, {43,-17}, {43,-16}, {43,-15}, {43,-14}, {43,-13}, {43,-12}, {43,-11}, {43,-10}, {43,-8}, {43,53}, {43,54}, {43,147}, {43,148}, {44,-99}, {44,-98}, {44,-95}, {44,-94}, {44,-93}, {44,-89}, {44,-88}, {44,-87}, {44,-86}, {44,-85}, {44,-84}, {44,-83}, {44,-71}, {44,-70}, {44,-33}, {44,-32}, {44,-31}, {44,-30}, {44,-28}, {44,-27}, {44,-26}, {44,-16}, {44,-15}, {44,-14}, {44,-13}, {44,-12}, {44,-11}, {44,-10}, {44,-9}, {44,-8}, {44,53}, {44,54}, {44,147}, {44,148}, {45,-99}, {45,-98}, {45,-97}, {45,-95}, {45,-94}, {45,-93}, {45,-90}, {45,-89}, {45,-88}, {45,-87}, {45,-86}, {45,-85}, {45,-84}, {45,-83}, {45,-71}, {45,-70}, {45,-34}, {45,-33}, {45,-32}, {45,-31}, {45,-29}, {45,-28}, {45,-27}, {45,-14}, {45,-13}, {45,-12}, {45,-11}, {45,-10}, {45,-9}, {45,-8}, {45,53}, {45,54}, {45,147}, {45,148}, {46,-99}, {46,-98}, {46,-97}, {46,-96}, {46,-95}, {46,-94}, {46,-93}, {46,-92}, {46,-91}, {46,-90}, {46,-89}, {46,-88}, {46,-87}, {46,-86}, {46,-85}, {46,-84}, {46,-83}, {46,-82}, {46,-71}, {46,-70}, {46,-33}, {46,-32}, {46,-31}, {46,-30}, {46,-29}, {46,-28}, {46,-14}, {46,-13}, {46,-12}, {46,-11}, {46,-10}, {46,-9}, {46,-8}, {46,53}, {46,54}, {46,147}, {46,148}, {47,-98}, {47,-97}, {47,-96}, {47,-95}, {47,-94}, {47,-93}, {47,-92}, {47,-91}, {47,-90}, {47,-85}, {47,-84}, {47,-83}, {47,-82}, {47,-71}, {47,-70}, {47,-33}, {47,-32}, {47,-31}, {47,-30}, {47,-29}, {47,-28}, {47,-18}, {47,-17}, {47,-16}, {47,-15}, {47,-14}, {47,-13}, {47,-12}, {47,-11}, {47,-10}, {47,53}, {47,54}, {47,147}, {47,148}, {47,149}, {48,-98}, {48,-97}, {48,-96}, {48,-95}, {48,-94}, {48,-93}, {48,-92}, {48,-91}, {48,-84}, {48,-83}, {48,-82}, {48,-71}, {48,-70}, {48,-34}, {48,-33}, {48,-32}, {48,-31}, {48,-30}, {48,-20}, {48,-19}, {48,-18}, {48,-17}, {48,-16}, {48,-15}, {48,-14}, {48,53}, {48,54}, {48,147}, {48,148}, {48,149}, {49,-97}, {49,-96}, {49,-95}, {49,-94}, {49,-93}, {49,-83}, {49,-82}, {49,-81}, {49,-71}, {49,-70}, {49,-34}, {49,-33}, {49,-32}, {49,-31}, {49,-23}, {49,-22}, {49,-21}, {49,-20}, {49,-19}, {49,-18}, {49,53}, {49,54}, {49,147}, {49,148}, {49,149}, {50,-97}, {50,-96}, {50,-95}, {50,-83}, {50,-82}, {50,-81}, {50,-71}, {50,-70}, {50,-35}, {50,-34}, {50,-33}, {50,-32}, {50,-31}, {50,-30}, {50,-25}, {50,-24}, {50,-23}, {50,-22}, {50,-21}, {50,-20}, {50,-8}, {50,53}, {50,54}, {50,147}, {50,148}, {50,149}, {51,-97}, {51,-96}, {51,-95}, {51,-82}, {51,-81}, {51,-71}, {51,-70}, {51,-35}, {51,-34}, {51,-33}, {51,-32}, {51,-31}, {51,-30}, {51,-28}, {51,-27}, {51,-26}, {51,-25}, {51,-24}, {51,-23}, {51,-10}, {51,-9}, {51,-8}, {51,53}, {51,54}, {51,147}, {51,148}, {51,149}, {52,-97}, {52,-96}, {52,-95}, {52,-82}, {52,-81}, {52,-80}, {52,-71}, {52,-70}, {52,-37}, {52,-36}, {52,-35}, {52,-34}, {52,-33}, {52,-31}, {52,-30}, {52,-29}, {52,-28}, {52,-27}, {52,-26}, {52,-25}, {52,-11}, {52,-10}, {52,-9}, {52,-8}, {52,53}, {52,54}, {52,147}, {52,148}, {52,149}, {53,-96}, {53,-82}, {53,-81}, {53,-80}, {53,-71}, {53,-70}, {53,-39}, {53,-38}, {53,-37}, {53,-36}, {53,-35}, {53,-31}, {53,-30}, {53,-29}, {53,-28}, {53,-12}, {53,-11}, {53,-10}, {53,-9}, {53,-8}, {53,53}, {53,54}, {53,147}, {53,148}, {53,149}, {54,-82}, {54,-81}, {54,-80}, {54,-71}, {54,-70}, {54,-69}, {54,-68}, {54,-39}, {54,-38}, {54,-37}, {54,-36}, {54,-33}, {54,-32}, {54,-31}, {54,-30}, {54,-29}, {54,-13}, {54,-12}, {54,-11}, {54,-10}, {54,-9}, {54,-8}, {54,53}, {54,54}, {54,55}, {54,147}, {54,148}, {54,149}, {55,-81}, {55,-80}, {55,-70}, {55,-69}, {55,-68}, {55,-67}, {55,-66}, {55,-42}, {55,-41}, {55,-40}, {55,-39}, {55,-38}, {55,-37}, {55,-36}, {55,-35}, {55,-34}, {55,-33}, {55,-32}, {55,-31}, {55,-30}, {55,-29}, {55,-15}, {55,-14}, {55,-13}, {55,-12}, {55,-11}, {55,-10}, {55,-9}, {55,53}, {55,54}, {55,55}, {55,147}, {55,148}, {55,149}, {56,-81}, {56,-80}, {56,-70}, {56,-69}, {56,-68}, {56,-67}, {56,-66}, {56,-65}, {56,-64}, {56,-63}, {56,-62}, {56,-61}, {56,-60}, {56,-59}, {56,-58}, {56,-57}, {56,-56}, {56,-55}, {56,-54}, {56,-53}, {56,-52}, {56,-51}, {56,-50}, {56,-49}, {56,-48}, {56,-47}, {56,-46}, {56,-45}, {56,-44}, {56,-43}, {56,-42}, {56,-41}, {56,-40}, {56,-39}, {56,-38}, {56,-37}, {56,-36}, {56,-35}, {56,-34}, {56,-33}, {56,-31}, {56,-30}, {56,-29}, {56,-19}, {56,-18}, {56,-17}, {56,-16}, {56,-15}, {56,-14}, {56,-13}, {56,-12}, {56,-11}, {56,-10}, {56,-9}, {56,54}, {56,55}, {56,147}, {56,148}, {56,149}, {57,-81}, {57,-80}, {57,-79}, {57,-70}, {57,-69}, {57,-68}, {57,-67}, {57,-66}, {57,-65}, {57,-64}, {57,-63}, {57,-62}, {57,-61}, {57,-60}, {57,-59}, {57,-58}, {57,-57}, {57,-56}, {57,-55}, {57,-54}, {57,-53}, {57,-52}, {57,-51}, {57,-50}, {57,-49}, {57,-48}, {57,-47}, {57,-46}, {57,-45}, {57,-44}, {57,-43}, {57,-42}, {57,-41}, {57,-40}, {57,-39}, {57,-38}, {57,-37}, {57,-36}, {57,-35}, {57,-34}, {57,-30}, {57,-29}, {57,-20}, {57,-19}, {57,-18}, {57,-10}, {57,-9}, {57,54}, {57,55}, {57,147}, {57,148}, {58,-80}, {58,-79}, {58,-70}, {58,-69}, {58,-68}, {58,-67}, {58,-61}, {58,-60}, {58,-59}, {58,-58}, {58,-57}, {58,-56}, {58,-55}, {58,-38}, {58,-37}, {58,-36}, {58,-35}, {58,-10}, {58,-9}, {58,54}, {58,55}, {58,147}, {58,148}, {59,-80}, {59,-79}, {59,-78}, {59,-70}, {59,-69}, {59,-60}, {59,-10}, {59,-9}, {59,53}, {59,54}, {59,55}, {59,147}, {59,148}, {59,149}, {60,-80}, {60,-79}, {60,-78}, {60,-70}, {60,-69}, {60,53}, {60,54}, {60,55}, {60,148}, {60,149}, {61,-80}, {61,-79}, {61,-78}, {61,-69}, {61,53}, {61,54}, {61,148}, {61,149}, {62,-79}, {62,-78}, {62,-77}, {62,-69}, {62,53}, {62,54}, {62,148}, {62,149}, {63,-79}, {63,-78}, {63,-77}, {63,-69}, {63,53}, {63,54}, {63,148}, {63,149}, {64,-78}, {64,-77}, {64,-70}, {64,-69}, {64,53}, {64,54}, {64,148}, {64,149}, {65,-78}, {65,-77}, {65,-70}, {65,-69}, {65,53}, {65,54}, {65,148}, {65,149}, {66,-79}, {66,-78}, {66,-77}, {66,-70}, {66,-69}, {66,53}, {66,54}, {66,148}, {66,149}, {67,-79}, {67,-78}, {67,-77}, {67,-76}, {67,-70}, {67,-69}, {67,53}, {67,54}, {67,148}, {67,149}, {68,-78}, {68,-77}, {68,-76}, {68,-75}, {68,-70}, {68,-69}, {68,53}, {68,54}, {68,148}, {68,149}, {69,-77}, {69,-76}, {69,-75}, {69,-74}, {69,-71}, {69,-70}, {69,-69}, {69,-68}, {69,-67}, {69,53}, {69,54}, {69,148}, {69,149}, {70,-76}, {70,-75}, {70,-74}, {70,-73}, {70,-72}, {70,-71}, {70,-70}, {70,-69}, {70,-68}, {70,-67}, {70,-66}, {70,53}, {70,54}, {70,55}, {70,148}, {70,149}, {71,-75}, {71,-74}, {71,-73}, {71,-72}, {71,-71}, {71,-70}, {71,-69}, {71,-68}, {71,-67}, {71,54}, {71,55}, {71,148}, {71,149}, {72,-75}, {72,-74}, {72,-73}, {72,54}, {72,55}, {72,148}, {72,149}, {73,-74}, {73,-73}, {73,-72}, {73,54}, {73,55}, {73,148}, {73,149}, {74,-73}, {74,-72}, {74,54}, {74,55}, {74,148}, {74,149}, {75,-73}, {75,-72}, {75,-71}, {75,54}, {75,55}, {75,148}, {75,149}, {76,-73}, {76,-72}, {76,-71}, {76,54}, {76,55}, {76,148}, {76,149}, {77,-72}, {77,-71}, {77,-70}, {77,-69}, {77,54}, {77,55}, {77,56}, {77,148}, {77,149}, {78,-71}, {78,-70}, {78,-69}, {78,-68}, {78,54}, {78,55}, {78,56}, {78,57}, {78,148}, {78,149}, {79,-71}, {79,-70}, {79,-69}, {79,-68}, {79,-67}, {79,-66}, {79,54}, {79,55}, {79,56}, {79,148}, {79,149}, {80,-70}, {80,-69}, {80,-68}, {80,-67}, {80,-66}, {80,53}, {80,54}, {80,55}, {80,148}, {80,149}, {81,-68}, {81,-67}, {81,-66}, {81,53}, {81,54}, {81,55}, {81,148}, {81,149}, {82,-68}, {82,-67}, {82,-66}, {82,53}, {82,54}, {82,148}, {82,149}, {83,-66}, {83,-30}, {83,-14}, {83,53}, {83,54}, {83,148}, {83,149}, {84,-66}, {84,-31}, {84,-30}, {84,-29}, {84,-16}, {84,-15}, {84,-14}, {84,-13}, {84,-12}, {84,-11}, {84,4}, {84,5}, {84,6}, {84,7}, {84,53}, {84,54}, {84,148}, {84,149}, {85,-30}, {85,-29}, {85,-28}, {85,-27}, {85,-18}, {85,-17}, {85,-16}, {85,-15}, {85,-14}, {85,-13}, {85,-12}, {85,-11}, {85,-10}, {85,0}, {85,1}, {85,2}, {85,3}, {85,4}, {85,5}, {85,6}, {85,7}, {85,8}, {85,9}, {85,10}, {85,11}, {85,12}, {85,13}, {85,14}, {85,15}, {85,16}, {85,17}, {85,18}, {85,19}, {85,20}, {85,21}, {85,22}, {85,23}, {85,24}, {85,25}, {85,26}, {85,27}, {85,28}, {85,29}, {85,42}, {85,43}, {85,44}, {85,45}, {85,46}, {85,47}, {85,48}, {85,49}, {85,50}, {85,51}, {85,52}, {85,53}, {85,54}, {85,55}, {85,148}, {85,149}, {86,-29}, {86,-28}, {86,-27}, {86,-26}, {86,-25}, {86,-24}, {86,-23}, {86,-22}, {86,-21}, {86,-20}, {86,-19}, {86,-18}, {86,-17}, {86,-16}, {86,-15}, {86,-14}, {86,-12}, {86,-11}, {86,-10}, {86,-9}, {86,-8}, {86,-7}, {86,-6}, {86,-5}, {86,-4}, {86,-3}, {86,-2}, {86,-1}, {86,0}, {86,1}, {86,2}, {86,3}, {86,4}, {86,5}, {86,6}, {86,7}, {86,8}, {86,9}, {86,10}, {86,11}, {86,12}, {86,13}, {86,14}, {86,15}, {86,16}, {86,17}, {86,18}, {86,19}, {86,20}, {86,21}, {86,22}, {86,23}, {86,24}, {86,25}, {86,26}, {86,27}, {86,28}, {86,29}, {86,30}, {86,31}, {86,32}, {86,33}, {86,34}, {86,35}, {86,36}, {86,37}, {86,38}, {86,39}, {86,40}, {86,41}, {86,42}, {86,43}, {86,44}, {86,45}, {86,46}, {86,47}, {86,48}, {86,49}, {86,50}, {86,51}, {86,52}, {86,53}, {86,54}, {86,55}, {86,93}, {86,94}, {86,148}, {86,149}, {87,-27}, {87,-26}, {87,-25}, {87,-24}, {87,-23}, {87,-22}, {87,-21}, {87,-20}, {87,-19}, {87,-18}, {87,-17}, {87,-16}, {87,-11}, {87,-10}, {87,-9}, {87,-8}, {87,-7}, {87,-6}, {87,-5}, {87,-4}, {87,-3}, {87,-2}, {87,-1}, {87,0}, {87,1}, {87,28}, {87,29}, {87,30}, {87,31}, {87,32}, {87,33}, {87,34}, {87,35}, {87,36}, {87,37}, {87,38}, {87,39}, {87,40}, {87,41}, {87,42}, {87,43}, {87,53}, {87,54}, {87,55}, {87,56}, {87,93}, {87,94}, {87,95}, {87,96}, {87,147}, {87,148}, {87,149}, {88,54}, {88,55}, {88,56}, {88,57}, {88,58}, {88,63}, {88,64}, {88,65}, {88,66}, {88,75}, {88,76}, {88,77}, {88,78}, {88,79}, {88,91}, {88,92}, {88,93}, {88,94}, {88,95}, {88,96}, {88,97}, {88,98}, {88,99}, {88,113}, {88,114}, {88,115}, {88,116}, {88,117}, {88,118}, {88,119}, {88,120}, {88,121}, {88,122}, {88,123}, {88,124}, {88,125}, {88,126}, {88,143}, {88,144}, {88,145}, {88,146}, {88,147}, {88,148}, {88,149}, {89,55}, {89,56}, {89,57}, {89,58}, {89,59}, {89,60}, {89,61}, {89,62}, {89,63}, {89,64}, {89,65}, {89,66}, {89,67}, {89,68}, {89,69}, {89,70}, {89,71}, {89,72}, {89,73}, {89,74}, {89,75}, {89,76}, {89,77}, {89,78}, {89,79}, {89,80}, {89,81}, {89,82}, {89,83}, {89,84}, {89,85}, {89,86}, {89,87}, {89,88}, {89,89}, {89,90}, {89,91}, {89,92}, {89,93}, {89,94}, {89,95}, {89,96}, {89,97}, {89,98}, {89,99}, {89,100}, {89,101}, {89,102}, {89,103}, {89,104}, {89,105}, {89,106}, {89,107}, {89,108}, {89,109}, {89,110}, {89,111}, {89,112}, {89,113}, {89,114}, {89,115}, {89,116}, {89,117}, {89,118}, {89,119}, {89,120}, {89,121}, {89,122}, {89,123}, {89,124}, {89,125}, {89,126}, {89,127}, {89,128}, {89,129}, {89,130}, {89,131}, {89,132}, {89,133}, {89,134}, {89,135}, {89,136}, {89,137}, {89,138}, {89,139}, {89,140}, {89,141}, {89,142}, {89,143}, {89,144}, {89,145}, {89,146}, {89,147}, {89,148}, {89,149}, {89,150}, {89,151}, {90,57}, {90,58}, {90,59}, {90,60}, {90,61}, {90,62}, {90,63}, {90,65}, {90,66}, {90,67}, {90,68}, {90,69}, {90,70}, {90,71}, {90,72}, {90,73}, {90,74}, {90,75}, {90,76}, {90,78}, {90,79}, {90,80}, {90,81}, {90,82}, {90,83}, {90,84}, {90,85}, {90,86}, {90,87}, {90,88}, {90,89}, {90,90}, {90,91}, {90,92}, {90,93}, {90,94}, {90,96}, {90,97}, {90,98}, {90,99}, {90,100}, {90,101}, {90,102}, {90,103}, {90,104}, {90,105}, {90,106}, {90,107}, {90,108}, {90,109}, {90,110}, {90,111}, {90,112}, {90,113}, {90,125}, {90,126}, {90,127}, {90,128}, {90,129}, {90,130}, {90,131}, {90,132}, {90,133}, {90,134}, {90,135}, {90,136}, {90,137}, {90,138}, {90,139}, {90,140}, {90,141}, {90,142}, {90,143}, {90,144}, {90,145}, {90,148}, {90,149}, {90,150}, {90,151}, {91,148}, {91,149}, {91,150}, {91,151}, }, + ["mineral-beige-dirt-5"] = {{-93,-23}, {-93,-22}, {-93,-21}, {-93,-20}, {-93,-19}, {-93,-18}, {-93,-17}, {-93,-16}, {-93,-15}, {-93,-14}, {-93,-13}, {-92,-18}, {-92,-17}, {-92,-16}, {-92,-15}, {-92,-14}, {-92,7}, {-91,-18}, {-91,-17}, {-91,-16}, {-91,-15}, {-91,6}, {-90,-18}, {-90,-17}, {-88,33}, {-88,34}, {-87,39}, {-83,60}, {-82,60}, {-82,61}, {-82,62}, {-81,61}, {-81,62}, {-81,63}, {-4,-19}, {-2,-27}, {-1,-29}, {-1,-28}, {0,-32}, {0,-31}, {0,-30}, {1,-36}, {1,-34}, {1,-33}, {1,-32}, {2,-36}, {2,-35}, {2,-34}, {6,-59}, {6,-58}, {7,-59}, {7,-58}, {7,-57}, {8,-59}, {8,-58}, {8,-57}, {8,-56}, {8,-55}, {9,-57}, {9,-56}, {9,-55}, {9,-54}, {9,-53}, {17,-49}, {17,-48}, {17,-47}, {17,-46}, {17,-45}, {17,-44}, {17,-43}, {17,-42}, {17,-41}, {17,-40}, {17,-39}, {17,-38}, {17,-37}, {17,-36}, {17,-35}, {17,-34}, {17,-33}, {17,-32}, {17,-31}, {17,-30}, {17,-29}, {17,-28}, {17,-27}, {17,-26}, {17,-25}, {18,-37}, {18,-36}, {18,-35}, {18,-34}, {18,-33}, {18,-32}, {18,-31}, {18,-30}, {18,-29}, {18,-28}, {23,148}, {24,148}, {25,147}, {26,147}, {27,146}, {31,147}, {32,147}, {56,-32}, {57,-33}, {57,-32}, {57,-31}, }, + ["concrete"] = {{-93,31}, {-93,32}, {-93,33}, {-93,34}, {-93,35}, {-93,36}, {-93,37}, {-93,38}, {-93,39}, {-92,-27}, {-92,-26}, {-92,-25}, {-92,-24}, {-92,-23}, {-92,-22}, {-92,-21}, {-92,-20}, {-92,-19}, {-92,31}, {-92,32}, {-92,33}, {-92,34}, {-92,35}, {-92,36}, {-92,37}, {-92,38}, {-92,39}, {-91,-27}, {-91,-26}, {-91,-25}, {-91,-24}, {-91,-23}, {-91,-22}, {-91,-21}, {-91,-20}, {-91,-19}, {-91,31}, {-91,32}, {-91,33}, {-91,34}, {-91,35}, {-91,36}, {-91,37}, {-91,38}, {-91,39}, {-90,-27}, {-90,-26}, {-90,-25}, {-90,-24}, {-90,-23}, {-90,-22}, {-90,-21}, {-90,-20}, {-90,-19}, {-87,-10}, {-87,-9}, {-87,-8}, {-87,-7}, {-87,-6}, {-87,-5}, {-87,-4}, {-87,-3}, {-87,-2}, {-87,-1}, {-87,0}, {-87,1}, {-87,2}, {-87,3}, {-87,4}, {-87,5}, {-87,6}, {-87,7}, {-87,8}, {-87,9}, {-87,10}, {-87,11}, {-87,12}, {-87,13}, {-87,14}, {-87,15}, {-87,16}, {-87,17}, {-87,18}, {-87,19}, {-87,20}, {-87,21}, {-87,22}, {-86,-11}, {-86,-10}, {-86,-9}, {-86,-8}, {-86,-5}, {-86,-4}, {-86,-3}, {-86,0}, {-86,1}, {-86,2}, {-86,5}, {-86,6}, {-86,7}, {-86,10}, {-86,11}, {-86,12}, {-86,15}, {-86,16}, {-86,17}, {-86,20}, {-86,21}, {-86,22}, {-86,23}, {-86,53}, {-86,54}, {-86,55}, {-86,56}, {-86,57}, {-85,-11}, {-85,-10}, {-85,-9}, {-85,-8}, {-85,-5}, {-85,-4}, {-85,-3}, {-85,0}, {-85,1}, {-85,2}, {-85,5}, {-85,6}, {-85,7}, {-85,10}, {-85,11}, {-85,12}, {-85,15}, {-85,16}, {-85,17}, {-85,20}, {-85,21}, {-85,22}, {-85,23}, {-85,52}, {-85,53}, {-85,54}, {-85,55}, {-85,56}, {-85,57}, {-85,58}, {-84,-11}, {-84,-10}, {-84,-9}, {-84,-8}, {-84,-7}, {-84,-6}, {-84,-5}, {-84,-4}, {-84,-3}, {-84,-2}, {-84,-1}, {-84,0}, {-84,1}, {-84,2}, {-84,3}, {-84,4}, {-84,5}, {-84,6}, {-84,7}, {-84,8}, {-84,9}, {-84,10}, {-84,11}, {-84,12}, {-84,13}, {-84,14}, {-84,15}, {-84,16}, {-84,17}, {-84,18}, {-84,19}, {-84,20}, {-84,21}, {-84,22}, {-84,23}, {-84,52}, {-84,55}, {-84,57}, {-84,94}, {-84,95}, {-83,-11}, {-83,-10}, {-83,-9}, {-83,-8}, {-83,-7}, {-83,-6}, {-83,-5}, {-83,-4}, {-83,-3}, {-83,-2}, {-83,-1}, {-83,0}, {-83,1}, {-83,2}, {-83,3}, {-83,4}, {-83,5}, {-83,6}, {-83,7}, {-83,8}, {-83,9}, {-83,10}, {-83,11}, {-83,12}, {-83,13}, {-83,14}, {-83,15}, {-83,16}, {-83,17}, {-83,18}, {-83,19}, {-83,20}, {-83,21}, {-83,22}, {-83,23}, {-83,24}, {-83,51}, {-83,52}, {-83,94}, {-83,95}, {-82,-11}, {-82,-10}, {-82,-9}, {-82,-8}, {-82,-7}, {-82,-6}, {-82,-5}, {-82,-4}, {-82,-3}, {-82,-2}, {-82,-1}, {-82,0}, {-82,1}, {-82,2}, {-82,3}, {-82,4}, {-82,5}, {-82,6}, {-82,7}, {-82,8}, {-82,9}, {-82,10}, {-82,11}, {-82,12}, {-82,13}, {-82,14}, {-82,15}, {-82,16}, {-82,17}, {-82,18}, {-82,19}, {-82,20}, {-82,21}, {-82,22}, {-82,23}, {-82,51}, {-82,52}, {-82,94}, {-82,95}, {-81,-11}, {-81,-10}, {-81,-9}, {-81,-8}, {-81,-5}, {-81,-4}, {-81,-3}, {-81,0}, {-81,1}, {-81,2}, {-81,5}, {-81,6}, {-81,7}, {-81,10}, {-81,11}, {-81,12}, {-81,15}, {-81,16}, {-81,17}, {-81,20}, {-81,21}, {-81,22}, {-81,23}, {-81,51}, {-81,52}, {-81,69}, {-81,70}, {-81,71}, {-81,73}, {-81,74}, {-81,75}, {-81,76}, {-81,77}, {-81,78}, {-81,79}, {-81,80}, {-81,81}, {-81,82}, {-81,83}, {-81,84}, {-81,85}, {-81,86}, {-81,87}, {-81,88}, {-81,89}, {-81,90}, {-81,92}, {-81,93}, {-81,94}, {-81,95}, {-80,-11}, {-80,-10}, {-80,-9}, {-80,-8}, {-80,-5}, {-80,-4}, {-80,-3}, {-80,0}, {-80,1}, {-80,2}, {-80,5}, {-80,6}, {-80,7}, {-80,10}, {-80,11}, {-80,12}, {-80,15}, {-80,16}, {-80,17}, {-80,20}, {-80,21}, {-80,22}, {-80,23}, {-80,51}, {-80,52}, {-80,69}, {-80,70}, {-80,71}, {-80,73}, {-80,74}, {-80,75}, {-80,76}, {-80,77}, {-80,78}, {-80,79}, {-80,80}, {-80,81}, {-80,82}, {-80,83}, {-80,84}, {-80,85}, {-80,86}, {-80,87}, {-80,88}, {-80,89}, {-80,90}, {-80,92}, {-80,93}, {-80,94}, {-80,95}, {-80,115}, {-80,116}, {-80,117}, {-79,-11}, {-79,-10}, {-79,-9}, {-79,-8}, {-79,-7}, {-79,-6}, {-79,-5}, {-79,-4}, {-79,-3}, {-79,-2}, {-79,-1}, {-79,0}, {-79,1}, {-79,2}, {-79,3}, {-79,4}, {-79,5}, {-79,6}, {-79,7}, {-79,8}, {-79,9}, {-79,10}, {-79,11}, {-79,12}, {-79,13}, {-79,14}, {-79,15}, {-79,16}, {-79,17}, {-79,18}, {-79,19}, {-79,20}, {-79,21}, {-79,22}, {-79,23}, {-79,69}, {-79,70}, {-79,93}, {-79,94}, {-79,95}, {-79,115}, {-79,116}, {-79,117}, {-78,-11}, {-78,-10}, {-78,-9}, {-78,-8}, {-78,-7}, {-78,-6}, {-78,-5}, {-78,-4}, {-78,-3}, {-78,-2}, {-78,-1}, {-78,0}, {-78,1}, {-78,2}, {-78,3}, {-78,4}, {-78,5}, {-78,6}, {-78,7}, {-78,8}, {-78,9}, {-78,10}, {-78,11}, {-78,12}, {-78,13}, {-78,14}, {-78,15}, {-78,16}, {-78,17}, {-78,18}, {-78,19}, {-78,20}, {-78,21}, {-78,22}, {-78,23}, {-78,68}, {-78,69}, {-78,70}, {-78,93}, {-78,94}, {-78,95}, {-78,115}, {-78,116}, {-78,117}, {-77,-11}, {-77,-10}, {-77,-9}, {-77,-8}, {-77,-7}, {-77,-6}, {-77,-5}, {-77,-4}, {-77,-3}, {-77,-2}, {-77,-1}, {-77,0}, {-77,1}, {-77,2}, {-77,3}, {-77,4}, {-77,5}, {-77,6}, {-77,7}, {-77,8}, {-77,9}, {-77,10}, {-77,11}, {-77,12}, {-77,13}, {-77,14}, {-77,15}, {-77,16}, {-77,17}, {-77,18}, {-77,19}, {-77,20}, {-77,21}, {-77,22}, {-77,23}, {-77,24}, {-77,68}, {-77,69}, {-77,70}, {-77,93}, {-77,94}, {-77,95}, {-77,114}, {-77,115}, {-77,116}, {-77,117}, {-76,-11}, {-76,-10}, {-76,-9}, {-76,-8}, {-76,-7}, {-76,-6}, {-76,-5}, {-76,-4}, {-76,-3}, {-76,-2}, {-76,-1}, {-76,0}, {-76,1}, {-76,2}, {-76,3}, {-76,4}, {-76,5}, {-76,6}, {-76,7}, {-76,8}, {-76,9}, {-76,10}, {-76,11}, {-76,12}, {-76,13}, {-76,14}, {-76,15}, {-76,16}, {-76,17}, {-76,18}, {-76,19}, {-76,20}, {-76,21}, {-76,22}, {-76,23}, {-76,41}, {-76,42}, {-76,69}, {-76,70}, {-76,93}, {-76,94}, {-76,95}, {-76,115}, {-76,116}, {-76,117}, {-76,120}, {-76,121}, {-76,122}, {-76,123}, {-76,124}, {-75,5}, {-75,6}, {-75,7}, {-75,68}, {-75,69}, {-75,70}, {-75,93}, {-75,94}, {-75,95}, {-75,115}, {-75,116}, {-75,117}, {-75,120}, {-75,121}, {-75,122}, {-75,123}, {-75,124}, {-74,68}, {-74,69}, {-74,70}, {-74,93}, {-74,94}, {-74,95}, {-74,115}, {-74,116}, {-74,117}, {-74,120}, {-74,121}, {-74,122}, {-74,123}, {-74,124}, {-73,-22}, {-73,-16}, {-73,68}, {-73,69}, {-73,70}, {-73,93}, {-73,94}, {-73,95}, {-73,115}, {-73,116}, {-73,117}, {-73,120}, {-73,121}, {-73,122}, {-73,123}, {-73,124}, {-72,-26}, {-72,-25}, {-72,-24}, {-72,-23}, {-72,-22}, {-72,-21}, {-72,-20}, {-72,-19}, {-72,-18}, {-72,-17}, {-72,-16}, {-72,-15}, {-72,68}, {-72,69}, {-72,70}, {-72,93}, {-72,94}, {-72,95}, {-72,115}, {-72,116}, {-72,117}, {-72,120}, {-72,121}, {-72,122}, {-72,123}, {-72,124}, {-71,-26}, {-71,-25}, {-71,-24}, {-71,-23}, {-71,-22}, {-71,-21}, {-71,-20}, {-71,-19}, {-71,-18}, {-71,-17}, {-71,-16}, {-71,-15}, {-71,68}, {-71,69}, {-71,70}, {-71,93}, {-71,94}, {-71,95}, {-71,115}, {-71,116}, {-71,117}, {-71,120}, {-71,121}, {-71,122}, {-71,123}, {-71,124}, {-70,-26}, {-70,-25}, {-70,-24}, {-70,-23}, {-70,-22}, {-70,-21}, {-70,-20}, {-70,-19}, {-70,-18}, {-70,-17}, {-70,-16}, {-70,-15}, {-70,68}, {-70,69}, {-70,70}, {-70,93}, {-70,94}, {-70,95}, {-70,115}, {-70,116}, {-70,117}, {-70,120}, {-70,121}, {-70,122}, {-70,123}, {-70,124}, {-69,-26}, {-69,-25}, {-69,-24}, {-69,-23}, {-69,-22}, {-69,-21}, {-69,-20}, {-69,-19}, {-69,-18}, {-69,-17}, {-69,-16}, {-69,-15}, {-69,68}, {-69,69}, {-69,70}, {-69,93}, {-69,94}, {-69,95}, {-69,115}, {-69,116}, {-69,117}, {-69,120}, {-69,121}, {-69,122}, {-69,123}, {-69,124}, {-68,-26}, {-68,-23}, {-68,-22}, {-68,-21}, {-68,-18}, {-68,-17}, {-68,-16}, {-68,-15}, {-68,41}, {-68,68}, {-68,69}, {-68,70}, {-68,93}, {-68,94}, {-68,95}, {-68,115}, {-68,116}, {-68,117}, {-68,120}, {-68,121}, {-68,122}, {-68,123}, {-68,124}, {-67,-26}, {-67,-23}, {-67,-22}, {-67,-21}, {-67,-18}, {-67,-17}, {-67,-16}, {-67,-15}, {-67,68}, {-67,69}, {-67,70}, {-67,93}, {-67,94}, {-67,95}, {-67,115}, {-67,116}, {-67,117}, {-67,120}, {-67,121}, {-67,122}, {-67,123}, {-67,124}, {-66,-26}, {-66,-25}, {-66,-24}, {-66,-23}, {-66,-22}, {-66,-21}, {-66,-20}, {-66,-19}, {-66,-18}, {-66,-17}, {-66,-16}, {-66,-15}, {-66,69}, {-66,70}, {-66,93}, {-66,94}, {-66,95}, {-66,115}, {-66,116}, {-66,117}, {-65,-26}, {-65,-25}, {-65,-24}, {-65,-23}, {-65,-22}, {-65,-21}, {-65,-20}, {-65,-19}, {-65,-18}, {-65,-17}, {-65,-16}, {-65,-15}, {-65,68}, {-65,69}, {-65,70}, {-65,93}, {-65,94}, {-65,95}, {-65,116}, {-64,-26}, {-64,-25}, {-64,-24}, {-64,-23}, {-64,-22}, {-64,-21}, {-64,-20}, {-64,-19}, {-64,-18}, {-64,-17}, {-64,-16}, {-64,-15}, {-64,68}, {-64,69}, {-64,70}, {-64,71}, {-64,73}, {-64,74}, {-64,75}, {-64,76}, {-64,77}, {-64,78}, {-64,79}, {-64,80}, {-64,81}, {-64,82}, {-64,83}, {-64,84}, {-64,85}, {-64,86}, {-64,87}, {-64,88}, {-64,89}, {-64,90}, {-64,92}, {-64,93}, {-64,94}, {-64,95}, {-63,-26}, {-63,-23}, {-63,-22}, {-63,-21}, {-63,-18}, {-63,-17}, {-63,-16}, {-63,-15}, {-63,69}, {-63,70}, {-63,71}, {-63,73}, {-63,74}, {-63,75}, {-63,76}, {-63,77}, {-63,78}, {-63,79}, {-63,80}, {-63,81}, {-63,82}, {-63,83}, {-63,84}, {-63,85}, {-63,86}, {-63,87}, {-63,88}, {-63,89}, {-63,90}, {-63,92}, {-63,93}, {-63,94}, {-63,95}, {-62,-26}, {-62,-23}, {-62,-22}, {-62,-21}, {-62,-18}, {-62,-17}, {-62,-16}, {-62,-15}, {-62,81}, {-62,82}, {-62,94}, {-62,95}, {-61,-26}, {-61,-25}, {-61,-24}, {-61,-23}, {-61,-22}, {-61,-21}, {-61,-20}, {-61,-19}, {-61,-18}, {-61,-17}, {-61,-16}, {-61,-15}, {-61,-14}, {-61,37}, {-61,42}, {-61,54}, {-61,55}, {-61,57}, {-61,58}, {-61,59}, {-61,60}, {-61,61}, {-61,62}, {-61,63}, {-61,65}, {-61,66}, {-61,67}, {-61,68}, {-61,69}, {-61,70}, {-61,71}, {-60,-26}, {-60,-25}, {-60,-24}, {-60,-23}, {-60,-22}, {-60,-21}, {-60,-20}, {-60,-19}, {-60,-18}, {-60,-17}, {-60,-16}, {-60,-15}, {-60,-14}, {-60,25}, {-60,42}, {-60,53}, {-60,54}, {-60,55}, {-60,57}, {-60,58}, {-60,59}, {-60,60}, {-60,61}, {-60,62}, {-60,63}, {-60,65}, {-60,66}, {-60,67}, {-60,68}, {-60,69}, {-60,70}, {-60,71}, {-59,-26}, {-59,-25}, {-59,-24}, {-59,-23}, {-59,-22}, {-59,-21}, {-59,-20}, {-59,-19}, {-59,-18}, {-59,-17}, {-59,-16}, {-59,-15}, {-59,-14}, {-59,42}, {-59,43}, {-59,52}, {-59,53}, {-59,54}, {-59,55}, {-59,57}, {-59,58}, {-59,59}, {-59,60}, {-59,61}, {-59,62}, {-59,63}, {-59,65}, {-59,66}, {-59,67}, {-59,68}, {-59,69}, {-59,70}, {-59,71}, {-58,-26}, {-58,-23}, {-58,-22}, {-58,-21}, {-58,-18}, {-58,-17}, {-58,-16}, {-58,-15}, {-58,42}, {-58,43}, {-58,44}, {-58,51}, {-58,52}, {-58,53}, {-58,54}, {-58,55}, {-58,57}, {-58,58}, {-58,59}, {-58,60}, {-58,61}, {-58,62}, {-58,63}, {-58,65}, {-58,66}, {-58,67}, {-58,68}, {-58,69}, {-58,70}, {-58,71}, {-57,-26}, {-57,-23}, {-57,-22}, {-57,-21}, {-57,-18}, {-57,-17}, {-57,-16}, {-57,-15}, {-57,42}, {-57,43}, {-57,44}, {-57,45}, {-57,47}, {-57,48}, {-57,49}, {-57,50}, {-57,51}, {-57,52}, {-57,53}, {-57,54}, {-57,66}, {-57,67}, {-57,68}, {-57,69}, {-57,70}, {-57,71}, {-56,-26}, {-56,-25}, {-56,-24}, {-56,-23}, {-56,-22}, {-56,-21}, {-56,-20}, {-56,-19}, {-56,-18}, {-56,-17}, {-56,-16}, {-56,-15}, {-56,42}, {-56,43}, {-56,44}, {-56,45}, {-56,47}, {-56,48}, {-56,49}, {-56,50}, {-56,51}, {-56,52}, {-56,53}, {-56,67}, {-56,68}, {-56,69}, {-56,70}, {-56,71}, {-56,72}, {-55,-26}, {-55,-25}, {-55,-24}, {-55,-23}, {-55,-22}, {-55,-21}, {-55,-20}, {-55,-19}, {-55,-18}, {-55,-17}, {-55,-16}, {-55,-15}, {-55,42}, {-55,43}, {-55,44}, {-55,45}, {-55,47}, {-55,48}, {-55,49}, {-55,50}, {-55,51}, {-55,52}, {-55,68}, {-55,69}, {-55,70}, {-55,71}, {-55,72}, {-55,73}, {-54,-26}, {-54,-25}, {-54,-24}, {-54,-23}, {-54,-22}, {-54,-21}, {-54,-20}, {-54,-19}, {-54,-18}, {-54,-17}, {-54,-16}, {-54,-15}, {-54,42}, {-54,43}, {-54,44}, {-54,45}, {-54,47}, {-54,48}, {-54,49}, {-54,50}, {-54,51}, {-54,69}, {-54,70}, {-54,71}, {-54,72}, {-54,73}, {-53,-26}, {-53,-23}, {-53,-22}, {-53,-21}, {-53,-18}, {-53,-17}, {-53,-16}, {-53,-15}, {-53,42}, {-53,43}, {-53,44}, {-53,45}, {-53,47}, {-53,48}, {-53,49}, {-53,50}, {-53,70}, {-53,71}, {-53,72}, {-52,-26}, {-52,-23}, {-52,-22}, {-52,-21}, {-52,-18}, {-52,-17}, {-52,-16}, {-52,-15}, {-52,42}, {-52,43}, {-52,44}, {-52,45}, {-52,47}, {-52,48}, {-52,49}, {-52,71}, {-52,72}, {-52,75}, {-52,81}, {-52,82}, {-52,92}, {-51,-26}, {-51,-25}, {-51,-24}, {-51,-23}, {-51,-22}, {-51,-21}, {-51,-20}, {-51,-19}, {-51,-18}, {-51,-17}, {-51,-16}, {-51,-15}, {-51,-14}, {-51,42}, {-51,43}, {-51,44}, {-51,45}, {-51,71}, {-51,72}, {-51,75}, {-51,81}, {-51,82}, {-51,92}, {-50,-26}, {-50,-25}, {-50,-24}, {-50,-23}, {-50,-22}, {-50,-21}, {-50,-20}, {-50,-19}, {-50,-18}, {-50,-17}, {-50,-16}, {-50,-15}, {-50,-14}, {-50,25}, {-50,42}, {-50,43}, {-50,44}, {-50,45}, {-50,47}, {-50,48}, {-50,49}, {-50,71}, {-50,72}, {-50,73}, {-50,75}, {-50,81}, {-50,82}, {-50,92}, {-49,-26}, {-49,-25}, {-49,-24}, {-49,-23}, {-49,-22}, {-49,-21}, {-49,-20}, {-49,-19}, {-49,-18}, {-49,-17}, {-49,-16}, {-49,-15}, {-49,-14}, {-49,37}, {-49,42}, {-49,43}, {-49,44}, {-49,45}, {-49,47}, {-49,48}, {-49,49}, {-49,71}, {-49,72}, {-49,75}, {-49,92}, {-48,-26}, {-48,-23}, {-48,-22}, {-48,-21}, {-48,-18}, {-48,-17}, {-48,-16}, {-48,-15}, {-48,42}, {-48,43}, {-48,44}, {-48,45}, {-48,47}, {-48,48}, {-48,49}, {-48,74}, {-48,75}, {-48,81}, {-48,82}, {-48,92}, {-47,-26}, {-47,-23}, {-47,-22}, {-47,-21}, {-47,-18}, {-47,-17}, {-47,-16}, {-47,-15}, {-47,42}, {-47,43}, {-47,44}, {-47,45}, {-47,47}, {-47,48}, {-47,49}, {-47,69}, {-47,80}, {-47,81}, {-47,82}, {-47,83}, {-47,92}, {-46,-26}, {-46,-25}, {-46,-24}, {-46,-23}, {-46,-22}, {-46,-21}, {-46,-20}, {-46,-19}, {-46,-18}, {-46,-17}, {-46,-16}, {-46,-15}, {-46,42}, {-46,43}, {-46,44}, {-46,45}, {-46,47}, {-46,48}, {-46,49}, {-46,68}, {-46,75}, {-46,76}, {-46,77}, {-46,79}, {-46,80}, {-46,81}, {-46,82}, {-46,83}, {-46,84}, {-46,86}, {-46,87}, {-46,88}, {-46,89}, {-46,91}, {-46,92}, {-45,-26}, {-45,-25}, {-45,-24}, {-45,-23}, {-45,-22}, {-45,-21}, {-45,-20}, {-45,-19}, {-45,-18}, {-45,-17}, {-45,-16}, {-45,-15}, {-45,42}, {-45,43}, {-45,44}, {-45,45}, {-45,47}, {-45,48}, {-45,49}, {-45,68}, {-45,75}, {-45,76}, {-45,77}, {-45,79}, {-45,80}, {-45,81}, {-45,82}, {-45,83}, {-45,84}, {-45,86}, {-45,87}, {-45,88}, {-45,89}, {-45,91}, {-45,92}, {-44,-26}, {-44,-25}, {-44,-24}, {-44,-23}, {-44,-22}, {-44,-21}, {-44,-20}, {-44,-19}, {-44,-18}, {-44,-17}, {-44,-16}, {-44,-15}, {-44,42}, {-44,43}, {-44,44}, {-44,45}, {-44,47}, {-44,48}, {-44,49}, {-44,68}, {-44,75}, {-44,76}, {-44,77}, {-44,79}, {-44,80}, {-44,81}, {-44,82}, {-44,83}, {-44,84}, {-44,86}, {-44,87}, {-44,88}, {-44,89}, {-44,91}, {-44,92}, {-43,-26}, {-43,-23}, {-43,-22}, {-43,-21}, {-43,-18}, {-43,-17}, {-43,-16}, {-43,-15}, {-43,42}, {-43,43}, {-43,44}, {-43,45}, {-43,47}, {-43,48}, {-43,49}, {-43,69}, {-43,80}, {-43,81}, {-43,82}, {-43,83}, {-43,92}, {-42,-26}, {-42,-23}, {-42,-22}, {-42,-21}, {-42,-18}, {-42,-17}, {-42,-16}, {-42,-15}, {-42,42}, {-42,43}, {-42,44}, {-42,45}, {-42,47}, {-42,48}, {-42,49}, {-42,74}, {-42,75}, {-42,81}, {-42,82}, {-42,92}, {-41,-26}, {-41,-25}, {-41,-24}, {-41,-23}, {-41,-22}, {-41,-21}, {-41,-20}, {-41,-19}, {-41,-18}, {-41,-17}, {-41,-16}, {-41,-15}, {-41,42}, {-41,43}, {-41,44}, {-41,45}, {-41,47}, {-41,48}, {-41,49}, {-41,71}, {-41,72}, {-41,75}, {-41,92}, {-40,-26}, {-40,-25}, {-40,-24}, {-40,-23}, {-40,-22}, {-40,-21}, {-40,-20}, {-40,-19}, {-40,-18}, {-40,-17}, {-40,-16}, {-40,-15}, {-40,42}, {-40,43}, {-40,44}, {-40,45}, {-40,47}, {-40,48}, {-40,49}, {-40,71}, {-40,72}, {-40,73}, {-40,75}, {-40,81}, {-40,82}, {-40,92}, {-39,-26}, {-39,-25}, {-39,-24}, {-39,-23}, {-39,-22}, {-39,-21}, {-39,-20}, {-39,-19}, {-39,-18}, {-39,-17}, {-39,-16}, {-39,-15}, {-39,71}, {-39,72}, {-39,75}, {-39,81}, {-39,82}, {-39,92}, {-38,-26}, {-38,-25}, {-38,-24}, {-38,-23}, {-38,-22}, {-38,-21}, {-38,-20}, {-38,-19}, {-38,-18}, {-38,-17}, {-38,-16}, {-38,-15}, {-38,46}, {-38,47}, {-38,48}, {-38,49}, {-38,71}, {-38,72}, {-38,81}, {-38,82}, {-38,92}, {-37,-22}, {-37,-16}, {-37,46}, {-37,47}, {-37,48}, {-37,49}, {-37,50}, {-37,70}, {-37,71}, {-37,72}, {-37,81}, {-37,82}, {-36,47}, {-36,48}, {-36,49}, {-36,50}, {-36,51}, {-36,69}, {-36,70}, {-36,71}, {-36,72}, {-35,5}, {-35,6}, {-35,7}, {-35,8}, {-35,9}, {-35,10}, {-35,11}, {-35,12}, {-35,13}, {-35,14}, {-35,15}, {-35,16}, {-35,17}, {-35,18}, {-35,19}, {-35,20}, {-35,21}, {-35,22}, {-35,23}, {-35,48}, {-35,49}, {-35,50}, {-35,51}, {-35,52}, {-35,68}, {-35,69}, {-35,70}, {-35,71}, {-35,72}, {-34,-11}, {-34,-10}, {-34,-9}, {-34,-8}, {-34,-7}, {-34,-6}, {-34,-5}, {-34,-4}, {-34,-3}, {-34,-2}, {-34,-1}, {-34,0}, {-34,1}, {-34,2}, {-34,3}, {-34,4}, {-34,5}, {-34,6}, {-34,7}, {-34,8}, {-34,9}, {-34,10}, {-34,11}, {-34,12}, {-34,13}, {-34,14}, {-34,15}, {-34,16}, {-34,17}, {-34,18}, {-34,19}, {-34,20}, {-34,21}, {-34,22}, {-34,23}, {-34,49}, {-34,50}, {-34,51}, {-34,52}, {-34,53}, {-34,67}, {-34,68}, {-34,69}, {-34,70}, {-34,71}, {-34,72}, {-33,-11}, {-33,-10}, {-33,-9}, {-33,-8}, {-33,-7}, {-33,-6}, {-33,-5}, {-33,-4}, {-33,-3}, {-33,-2}, {-33,-1}, {-33,0}, {-33,1}, {-33,2}, {-33,3}, {-33,4}, {-33,5}, {-33,6}, {-33,7}, {-33,8}, {-33,9}, {-33,10}, {-33,11}, {-33,12}, {-33,13}, {-33,14}, {-33,15}, {-33,16}, {-33,17}, {-33,18}, {-33,19}, {-33,20}, {-33,21}, {-33,22}, {-33,23}, {-33,24}, {-33,50}, {-33,51}, {-33,52}, {-33,53}, {-33,54}, {-33,66}, {-33,67}, {-33,68}, {-33,69}, {-33,70}, {-33,71}, {-33,72}, {-32,-11}, {-32,-10}, {-32,-9}, {-32,-8}, {-32,-7}, {-32,-6}, {-32,-5}, {-32,-4}, {-32,-3}, {-32,-2}, {-32,-1}, {-32,0}, {-32,1}, {-32,2}, {-32,3}, {-32,4}, {-32,5}, {-32,6}, {-32,7}, {-32,8}, {-32,9}, {-32,10}, {-32,11}, {-32,12}, {-32,13}, {-32,14}, {-32,15}, {-32,16}, {-32,17}, {-32,18}, {-32,19}, {-32,20}, {-32,21}, {-32,22}, {-32,23}, {-32,51}, {-32,52}, {-32,53}, {-32,54}, {-32,55}, {-32,57}, {-32,58}, {-32,59}, {-32,60}, {-32,61}, {-32,62}, {-32,63}, {-32,65}, {-32,66}, {-32,67}, {-32,68}, {-32,69}, {-32,70}, {-32,71}, {-32,72}, {-32,73}, {-31,-11}, {-31,-10}, {-31,-9}, {-31,-8}, {-31,-7}, {-31,-6}, {-31,-5}, {-31,-4}, {-31,-3}, {-31,-2}, {-31,-1}, {-31,0}, {-31,1}, {-31,2}, {-31,3}, {-31,4}, {-31,5}, {-31,6}, {-31,7}, {-31,8}, {-31,9}, {-31,10}, {-31,11}, {-31,12}, {-31,13}, {-31,14}, {-31,15}, {-31,16}, {-31,17}, {-31,18}, {-31,19}, {-31,20}, {-31,21}, {-31,22}, {-31,23}, {-31,52}, {-31,53}, {-31,54}, {-31,55}, {-31,57}, {-31,58}, {-31,59}, {-31,60}, {-31,61}, {-31,62}, {-31,63}, {-31,65}, {-31,66}, {-31,67}, {-31,68}, {-31,69}, {-31,70}, {-31,71}, {-31,72}, {-31,73}, {-30,-11}, {-30,-10}, {-30,-9}, {-30,-8}, {-30,-5}, {-30,-4}, {-30,-3}, {-30,0}, {-30,1}, {-30,2}, {-30,5}, {-30,6}, {-30,7}, {-30,10}, {-30,11}, {-30,12}, {-30,15}, {-30,16}, {-30,17}, {-30,20}, {-30,21}, {-30,22}, {-30,23}, {-30,72}, {-30,73}, {-29,-11}, {-29,-10}, {-29,-9}, {-29,-8}, {-29,-5}, {-29,-4}, {-29,-3}, {-29,0}, {-29,1}, {-29,2}, {-29,5}, {-29,6}, {-29,7}, {-29,10}, {-29,11}, {-29,12}, {-29,15}, {-29,16}, {-29,17}, {-29,20}, {-29,21}, {-29,22}, {-29,23}, {-29,72}, {-29,73}, {-29,116}, {-28,-11}, {-28,-10}, {-28,-9}, {-28,-8}, {-28,-7}, {-28,-6}, {-28,-5}, {-28,-4}, {-28,-3}, {-28,-2}, {-28,-1}, {-28,0}, {-28,1}, {-28,2}, {-28,3}, {-28,4}, {-28,5}, {-28,6}, {-28,7}, {-28,8}, {-28,9}, {-28,10}, {-28,11}, {-28,12}, {-28,13}, {-28,14}, {-28,15}, {-28,16}, {-28,17}, {-28,18}, {-28,19}, {-28,20}, {-28,21}, {-28,22}, {-28,23}, {-28,72}, {-28,73}, {-28,116}, {-28,117}, {-28,118}, {-27,-11}, {-27,-10}, {-27,-9}, {-27,-8}, {-27,-7}, {-27,-6}, {-27,-5}, {-27,-4}, {-27,-3}, {-27,-2}, {-27,-1}, {-27,0}, {-27,1}, {-27,2}, {-27,3}, {-27,4}, {-27,5}, {-27,6}, {-27,7}, {-27,8}, {-27,9}, {-27,10}, {-27,11}, {-27,12}, {-27,13}, {-27,14}, {-27,15}, {-27,16}, {-27,17}, {-27,18}, {-27,19}, {-27,20}, {-27,21}, {-27,22}, {-27,23}, {-27,24}, {-27,72}, {-27,73}, {-27,116}, {-27,117}, {-27,118}, {-26,-11}, {-26,-10}, {-26,-9}, {-26,-8}, {-26,-7}, {-26,-6}, {-26,-5}, {-26,-4}, {-26,-3}, {-26,-2}, {-26,-1}, {-26,0}, {-26,1}, {-26,2}, {-26,3}, {-26,4}, {-26,5}, {-26,6}, {-26,7}, {-26,8}, {-26,9}, {-26,10}, {-26,11}, {-26,12}, {-26,13}, {-26,14}, {-26,15}, {-26,16}, {-26,17}, {-26,18}, {-26,19}, {-26,20}, {-26,21}, {-26,22}, {-26,23}, {-26,72}, {-26,73}, {-26,81}, {-26,82}, {-26,116}, {-26,117}, {-26,140}, {-26,141}, {-26,142}, {-26,143}, {-26,144}, {-26,146}, {-25,-11}, {-25,-10}, {-25,-9}, {-25,-8}, {-25,-5}, {-25,-4}, {-25,-3}, {-25,0}, {-25,1}, {-25,2}, {-25,5}, {-25,6}, {-25,7}, {-25,10}, {-25,11}, {-25,12}, {-25,15}, {-25,16}, {-25,17}, {-25,20}, {-25,21}, {-25,22}, {-25,23}, {-25,72}, {-25,73}, {-25,79}, {-25,80}, {-25,81}, {-25,82}, {-25,83}, {-25,84}, {-25,116}, {-25,117}, {-25,140}, {-25,141}, {-25,142}, {-25,143}, {-25,144}, {-25,146}, {-24,-11}, {-24,-10}, {-24,-9}, {-24,-8}, {-24,-5}, {-24,-4}, {-24,-3}, {-24,0}, {-24,1}, {-24,2}, {-24,5}, {-24,6}, {-24,7}, {-24,10}, {-24,11}, {-24,12}, {-24,15}, {-24,16}, {-24,17}, {-24,20}, {-24,21}, {-24,22}, {-24,23}, {-24,72}, {-24,73}, {-24,74}, {-24,79}, {-24,80}, {-24,81}, {-24,82}, {-24,83}, {-24,84}, {-24,116}, {-24,117}, {-24,140}, {-24,146}, {-23,-10}, {-23,-9}, {-23,-8}, {-23,-7}, {-23,-6}, {-23,-5}, {-23,-4}, {-23,-3}, {-23,-2}, {-23,-1}, {-23,0}, {-23,1}, {-23,2}, {-23,3}, {-23,4}, {-23,5}, {-23,6}, {-23,7}, {-23,8}, {-23,9}, {-23,10}, {-23,11}, {-23,12}, {-23,13}, {-23,14}, {-23,15}, {-23,16}, {-23,17}, {-23,18}, {-23,19}, {-23,20}, {-23,21}, {-23,22}, {-23,23}, {-23,72}, {-23,73}, {-23,74}, {-23,116}, {-23,117}, {-23,140}, {-23,141}, {-23,142}, {-23,143}, {-23,144}, {-23,145}, {-23,146}, {-22,72}, {-22,73}, {-22,74}, {-22,75}, {-22,76}, {-22,77}, {-22,78}, {-22,79}, {-22,80}, {-22,81}, {-22,82}, {-22,83}, {-22,84}, {-22,85}, {-22,86}, {-22,87}, {-22,88}, {-22,89}, {-22,90}, {-22,91}, {-22,92}, {-22,93}, {-22,94}, {-22,95}, {-22,96}, {-22,97}, {-22,98}, {-22,99}, {-22,100}, {-22,101}, {-22,102}, {-22,103}, {-22,104}, {-22,105}, {-22,106}, {-22,107}, {-22,108}, {-22,109}, {-22,110}, {-22,111}, {-22,112}, {-22,113}, {-22,114}, {-22,115}, {-22,116}, {-22,117}, {-22,146}, {-21,72}, {-21,73}, {-21,74}, {-21,75}, {-21,76}, {-21,77}, {-21,78}, {-21,79}, {-21,80}, {-21,81}, {-21,82}, {-21,83}, {-21,84}, {-21,85}, {-21,86}, {-21,87}, {-21,88}, {-21,89}, {-21,90}, {-21,91}, {-21,92}, {-21,93}, {-21,94}, {-21,95}, {-21,96}, {-21,97}, {-21,98}, {-21,99}, {-21,100}, {-21,101}, {-21,102}, {-21,103}, {-21,104}, {-21,105}, {-21,106}, {-21,107}, {-21,108}, {-21,109}, {-21,110}, {-21,111}, {-21,112}, {-21,113}, {-21,114}, {-21,115}, {-21,116}, {-21,117}, {-20,72}, {-20,73}, {-20,74}, {-20,81}, {-20,82}, {-19,72}, {-19,73}, {-19,74}, {-19,81}, {-19,82}, {-18,72}, {-18,73}, {-18,74}, {-18,81}, {-18,82}, {-17,72}, {-17,73}, {-17,74}, {-17,81}, {-17,82}, {-16,72}, {-16,73}, {-16,74}, {-16,81}, {-16,82}, {-15,62}, {-15,64}, {-15,65}, {-15,67}, {-15,72}, {-15,73}, {-15,74}, {-15,81}, {-15,82}, {-14,72}, {-14,73}, {-14,74}, {-14,81}, {-14,82}, {-13,72}, {-13,73}, {-13,74}, {-13,81}, {-13,82}, {-12,72}, {-12,73}, {-12,74}, {-12,81}, {-12,82}, {-11,72}, {-11,73}, {-11,74}, {-11,81}, {-11,82}, {-10,32}, {-10,72}, {-10,73}, {-10,74}, {-10,81}, {-10,82}, {-9,32}, {-9,42}, {-9,56}, {-9,68}, {-9,72}, {-9,73}, {-9,74}, {-9,81}, {-9,82}, {-8,32}, {-8,42}, {-8,56}, {-8,68}, {-8,72}, {-8,73}, {-8,74}, {-8,81}, {-8,82}, {-7,32}, {-7,72}, {-7,73}, {-7,74}, {-7,81}, {-7,82}, {-6,72}, {-6,73}, {-6,74}, {-6,81}, {-6,82}, {-5,74}, {-5,81}, {-5,82}, {-4,81}, {-4,82}, {-3,78}, {-3,79}, {-3,80}, {-3,81}, {-2,48}, {-2,49}, {-2,62}, {-2,64}, {-2,65}, {-2,67}, {-2,78}, {-2,79}, {-2,80}, {-1,48}, {-1,49}, {3,53}, {4,53}, {5,53}, {12,75}, {12,85}, {13,75}, {13,85}, {14,75}, {14,85}, {15,15}, {15,16}, {15,31}, {15,32}, {16,15}, {16,16}, {16,31}, {16,32}, {16,57}, {16,58}, {16,59}, {16,60}, {16,61}, {16,75}, {16,76}, {16,77}, {16,78}, {16,79}, {16,80}, {16,81}, {16,82}, {16,83}, {16,84}, {16,85}, {16,91}, {17,57}, {17,58}, {17,59}, {17,60}, {17,61}, {18,57}, {18,58}, {18,59}, {18,60}, {18,61}, {18,75}, {18,85}, {19,57}, {19,58}, {19,59}, {19,60}, {19,61}, {19,75}, {19,85}, {20,57}, {20,58}, {20,59}, {20,60}, {20,61}, {20,75}, {20,85}, {21,-7}, {22,-7}, {22,57}, {25,-7}, {26,-7}, {26,50}, {26,51}, {26,55}, {29,-7}, {29,2}, {29,46}, {30,-7}, {30,2}, {30,46}, {33,-7}, {34,-7}, {36,-66}, {36,-43}, {37,-66}, {37,-43}, {37,-7}, {38,-66}, {38,-43}, {38,-7}, {39,-66}, {39,-43}, {41,-7}, {42,-7}, {45,-7}, {45,2}, {45,46}, {46,-7}, {46,2}, {46,46}, {49,-7}, {50,-7}, {53,-7}, {54,-7}, {55,-96}, {58,119}, {58,120}, {58,121}, {58,122}, {58,123}, {58,124}, {58,125}, {58,126}, {58,127}, {58,128}, {58,129}, {58,130}, {58,131}, {59,-34}, {59,-33}, {59,-32}, {59,-31}, {59,-30}, {59,-29}, {59,-28}, {59,-27}, {59,-26}, {59,-25}, {59,-24}, {59,-23}, {59,-22}, {59,-21}, {59,-20}, {59,-19}, {59,-18}, {59,15}, {59,16}, {59,31}, {59,32}, {59,119}, {60,15}, {60,16}, {60,31}, {60,32}, {60,118}, {60,119}, {61,119}, {62,119}, {63,119}, {64,119}, {65,100}, {65,119}, {66,119}, {67,88}, {67,119}, {68,-1}, {68,20}, {68,37}, {68,92}, {68,98}, {68,119}, {69,-1}, {69,20}, {69,37}, {69,91}, {69,99}, {69,118}, {69,119}, {70,-65}, {70,2}, {70,3}, {70,4}, {70,5}, {70,6}, {70,7}, {70,8}, {70,23}, {70,24}, {70,25}, {70,26}, {70,27}, {70,28}, {70,29}, {70,36}, {70,40}, {70,41}, {70,42}, {70,43}, {70,44}, {70,45}, {70,119}, {71,2}, {71,3}, {71,4}, {71,5}, {71,6}, {71,7}, {71,8}, {71,23}, {71,24}, {71,25}, {71,26}, {71,27}, {71,28}, {71,29}, {71,40}, {71,41}, {71,42}, {71,43}, {71,44}, {71,45}, {71,46}, {71,119}, {72,2}, {72,3}, {72,4}, {72,5}, {72,6}, {72,7}, {72,8}, {72,23}, {72,24}, {72,25}, {72,26}, {72,27}, {72,28}, {72,29}, {72,36}, {72,40}, {72,41}, {72,42}, {72,43}, {72,44}, {72,45}, {72,119}, {73,2}, {73,3}, {73,4}, {73,5}, {73,6}, {73,7}, {73,8}, {73,23}, {73,24}, {73,25}, {73,26}, {73,27}, {73,28}, {73,29}, {73,36}, {73,40}, {73,41}, {73,42}, {73,43}, {73,44}, {73,45}, {73,122}, {73,123}, {73,124}, {73,125}, {73,126}, {73,127}, {73,128}, {73,129}, {73,130}, {74,2}, {74,3}, {74,4}, {74,5}, {74,6}, {74,7}, {74,8}, {74,23}, {74,24}, {74,25}, {74,26}, {74,27}, {74,28}, {74,29}, {74,30}, {74,36}, {74,40}, {74,41}, {74,42}, {74,43}, {74,44}, {74,45}, {75,-64}, {75,-63}, {75,-62}, {75,-61}, {75,2}, {75,3}, {75,4}, {75,5}, {75,6}, {75,7}, {75,8}, {75,23}, {75,24}, {75,25}, {75,26}, {75,27}, {75,28}, {75,29}, {75,40}, {75,41}, {75,42}, {75,43}, {75,44}, {75,45}, {75,91}, {75,99}, {76,-64}, {76,-63}, {76,-62}, {76,-61}, {76,-60}, {76,-59}, {76,2}, {76,3}, {76,4}, {76,5}, {76,6}, {76,7}, {76,8}, {76,23}, {76,24}, {76,25}, {76,26}, {76,27}, {76,28}, {76,29}, {76,40}, {76,41}, {76,42}, {76,43}, {76,44}, {76,45}, {76,46}, {76,92}, {76,98}, {77,-64}, {77,-63}, {77,-62}, {77,-61}, {77,-60}, {77,-59}, {77,2}, {77,3}, {77,4}, {77,5}, {77,6}, {77,7}, {77,8}, {77,23}, {77,24}, {77,25}, {77,26}, {77,27}, {77,28}, {77,29}, {77,40}, {77,41}, {77,42}, {77,43}, {77,44}, {77,45}, {78,-92}, {78,-64}, {78,-63}, {78,-62}, {78,-61}, {78,-60}, {78,-59}, {78,2}, {78,3}, {78,4}, {78,5}, {78,6}, {78,7}, {78,8}, {78,23}, {78,24}, {78,25}, {78,26}, {78,27}, {78,28}, {78,29}, {78,40}, {78,41}, {78,42}, {78,43}, {78,44}, {78,45}, {79,-64}, {79,-63}, {79,-62}, {79,-61}, {79,-60}, {79,-59}, {79,5}, {79,26}, {79,40}, {79,41}, {79,42}, {79,43}, {79,44}, {79,45}, {79,90}, {79,100}, {80,-64}, {80,-63}, {80,-62}, {80,-61}, {80,-60}, {80,-59}, {81,-64}, {81,-63}, {81,-62}, {81,-61}, {81,-60}, {81,-59}, {82,-64}, {82,-63}, {82,-62}, {82,-61}, {82,-60}, {82,-59}, {83,-64}, {83,-63}, {83,-62}, {83,-61}, {83,-60}, {83,-59}, {84,-64}, {84,-63}, {84,-62}, {84,-61}, {84,-60}, {84,-59}, }, + ["interior-divider"] = {{-89,51}, {-89,52}, {-89,58}, {-89,59}, {-88,51}, {-88,52}, {-88,53}, {-88,54}, {-88,55}, {-88,56}, {-88,57}, {-88,58}, {-88,59}, {-88,96}, {-88,97}, {-88,98}, {-88,99}, {-88,100}, {-88,101}, {-88,102}, {-88,103}, {-87,-26}, {-87,-25}, {-87,-24}, {-87,-23}, {-87,-22}, {-87,-21}, {-87,-20}, {-87,-19}, {-87,-18}, {-87,-17}, {-87,-16}, {-87,-15}, {-87,-14}, {-87,-13}, {-87,-12}, {-87,24}, {-87,25}, {-87,26}, {-87,27}, {-87,28}, {-87,29}, {-87,30}, {-87,31}, {-87,32}, {-87,33}, {-87,34}, {-87,35}, {-87,36}, {-87,37}, {-87,38}, {-87,51}, {-87,52}, {-87,53}, {-87,54}, {-87,55}, {-87,56}, {-87,57}, {-87,58}, {-87,59}, {-87,96}, {-87,97}, {-87,98}, {-87,99}, {-87,100}, {-87,101}, {-87,102}, {-87,103}, {-86,-26}, {-86,-25}, {-86,-24}, {-86,-23}, {-86,-22}, {-86,-21}, {-86,-20}, {-86,-19}, {-86,-18}, {-86,-17}, {-86,-16}, {-86,-15}, {-86,-14}, {-86,-13}, {-86,-12}, {-86,-7}, {-86,-6}, {-86,-2}, {-86,-1}, {-86,3}, {-86,4}, {-86,8}, {-86,9}, {-86,13}, {-86,14}, {-86,18}, {-86,19}, {-86,24}, {-86,25}, {-86,26}, {-86,27}, {-86,28}, {-86,29}, {-86,30}, {-86,31}, {-86,32}, {-86,33}, {-86,34}, {-86,35}, {-86,36}, {-86,37}, {-86,38}, {-86,51}, {-86,52}, {-86,58}, {-86,59}, {-86,93}, {-86,94}, {-86,95}, {-86,96}, {-86,97}, {-86,102}, {-86,103}, {-85,-26}, {-85,-25}, {-85,-13}, {-85,-12}, {-85,-7}, {-85,-6}, {-85,-2}, {-85,-1}, {-85,3}, {-85,4}, {-85,8}, {-85,9}, {-85,13}, {-85,14}, {-85,18}, {-85,19}, {-85,24}, {-85,25}, {-85,28}, {-85,30}, {-85,32}, {-85,34}, {-85,37}, {-85,38}, {-85,93}, {-85,94}, {-85,95}, {-85,96}, {-85,97}, {-85,102}, {-85,103}, {-84,-26}, {-84,-25}, {-84,-13}, {-84,-12}, {-84,24}, {-84,25}, {-84,28}, {-84,30}, {-84,32}, {-84,34}, {-84,37}, {-84,38}, {-84,46}, {-84,47}, {-84,49}, {-84,50}, {-84,53}, {-84,54}, {-84,56}, {-84,58}, {-84,59}, {-84,93}, {-84,96}, {-84,97}, {-84,98}, {-84,99}, {-84,101}, {-84,102}, {-84,103}, {-84,104}, {-84,105}, {-84,106}, {-84,107}, {-84,108}, {-84,109}, {-84,110}, {-84,111}, {-84,112}, {-84,113}, {-84,114}, {-83,-26}, {-83,-25}, {-83,-24}, {-83,-22}, {-83,-21}, {-83,-20}, {-83,-19}, {-83,-18}, {-83,-17}, {-83,-16}, {-83,-13}, {-83,-12}, {-83,28}, {-83,30}, {-83,32}, {-83,34}, {-83,37}, {-83,38}, {-83,46}, {-83,50}, {-83,53}, {-83,56}, {-83,59}, {-83,67}, {-83,68}, {-83,69}, {-83,70}, {-83,71}, {-83,72}, {-83,73}, {-83,74}, {-83,75}, {-83,76}, {-83,77}, {-83,78}, {-83,79}, {-83,80}, {-83,81}, {-83,82}, {-83,83}, {-83,84}, {-83,85}, {-83,86}, {-83,87}, {-83,88}, {-83,89}, {-83,90}, {-83,91}, {-83,92}, {-83,93}, {-83,96}, {-83,97}, {-83,98}, {-83,99}, {-83,101}, {-83,102}, {-83,103}, {-83,104}, {-83,105}, {-83,106}, {-83,107}, {-83,108}, {-83,109}, {-83,110}, {-83,111}, {-83,112}, {-83,113}, {-83,114}, {-82,-26}, {-82,-25}, {-82,-16}, {-82,-13}, {-82,-12}, {-82,24}, {-82,25}, {-82,28}, {-82,30}, {-82,32}, {-82,34}, {-82,37}, {-82,38}, {-82,41}, {-82,42}, {-82,43}, {-82,44}, {-82,45}, {-82,46}, {-82,47}, {-82,48}, {-82,49}, {-82,50}, {-82,53}, {-82,56}, {-82,59}, {-82,66}, {-82,67}, {-82,68}, {-82,69}, {-82,70}, {-82,71}, {-82,72}, {-82,73}, {-82,74}, {-82,75}, {-82,76}, {-82,77}, {-82,78}, {-82,79}, {-82,80}, {-82,81}, {-82,82}, {-82,83}, {-82,84}, {-82,85}, {-82,86}, {-82,87}, {-82,88}, {-82,89}, {-82,90}, {-82,91}, {-82,92}, {-82,93}, {-82,102}, {-82,103}, {-82,113}, {-82,114}, {-81,-26}, {-81,-25}, {-81,-16}, {-81,-13}, {-81,-12}, {-81,-7}, {-81,-6}, {-81,-2}, {-81,-1}, {-81,3}, {-81,4}, {-81,8}, {-81,9}, {-81,13}, {-81,14}, {-81,18}, {-81,19}, {-81,24}, {-81,25}, {-81,30}, {-81,32}, {-81,34}, {-81,37}, {-81,38}, {-81,41}, {-81,42}, {-81,43}, {-81,44}, {-81,45}, {-81,46}, {-81,47}, {-81,48}, {-81,49}, {-81,50}, {-81,53}, {-81,56}, {-81,59}, {-81,102}, {-81,103}, {-81,113}, {-81,114}, {-80,-26}, {-80,-25}, {-80,-24}, {-80,-22}, {-80,-21}, {-80,-20}, {-80,-19}, {-80,-18}, {-80,-17}, {-80,-16}, {-80,-13}, {-80,-12}, {-80,-7}, {-80,-6}, {-80,-2}, {-80,-1}, {-80,3}, {-80,4}, {-80,8}, {-80,9}, {-80,13}, {-80,14}, {-80,18}, {-80,19}, {-80,24}, {-80,25}, {-80,26}, {-80,27}, {-80,28}, {-80,30}, {-80,32}, {-80,34}, {-80,37}, {-80,38}, {-80,41}, {-80,42}, {-80,49}, {-80,50}, {-80,53}, {-80,54}, {-80,55}, {-80,56}, {-80,57}, {-80,58}, {-80,59}, {-80,60}, {-80,61}, {-80,62}, {-80,63}, {-80,64}, {-80,65}, {-80,66}, {-80,67}, {-80,68}, {-80,102}, {-80,103}, {-80,113}, {-80,114}, {-79,-26}, {-79,-25}, {-79,-16}, {-79,-13}, {-79,-12}, {-79,24}, {-79,25}, {-79,28}, {-79,34}, {-79,37}, {-79,38}, {-79,41}, {-79,42}, {-79,43}, {-79,44}, {-79,45}, {-79,46}, {-79,49}, {-79,50}, {-79,51}, {-79,53}, {-79,54}, {-79,55}, {-79,56}, {-79,57}, {-79,58}, {-79,59}, {-79,60}, {-79,61}, {-79,62}, {-79,63}, {-79,64}, {-79,65}, {-79,66}, {-79,67}, {-79,68}, {-79,102}, {-79,103}, {-79,113}, {-79,114}, {-78,-26}, {-78,-25}, {-78,-16}, {-78,-13}, {-78,-12}, {-78,24}, {-78,25}, {-78,28}, {-78,29}, {-78,30}, {-78,31}, {-78,32}, {-78,33}, {-78,34}, {-78,37}, {-78,38}, {-78,41}, {-78,42}, {-78,46}, {-78,49}, {-78,50}, {-78,53}, {-78,60}, {-78,61}, {-78,67}, {-78,102}, {-78,103}, {-78,113}, {-78,114}, {-77,-26}, {-77,-25}, {-77,-24}, {-77,-23}, {-77,-22}, {-77,-21}, {-77,-20}, {-77,-19}, {-77,-18}, {-77,-17}, {-77,-16}, {-77,-13}, {-77,-12}, {-77,37}, {-77,38}, {-77,41}, {-77,42}, {-77,46}, {-77,49}, {-77,50}, {-77,53}, {-77,60}, {-77,61}, {-77,67}, {-77,102}, {-77,103}, {-77,105}, {-77,106}, {-77,107}, {-76,-26}, {-76,-25}, {-76,-18}, {-76,-13}, {-76,-12}, {-76,24}, {-76,25}, {-76,37}, {-76,38}, {-76,49}, {-76,50}, {-76,53}, {-76,54}, {-76,56}, {-76,57}, {-76,58}, {-76,59}, {-76,60}, {-76,61}, {-76,62}, {-76,64}, {-76,65}, {-76,66}, {-76,67}, {-76,68}, {-76,106}, {-76,113}, {-76,114}, {-75,-26}, {-75,-25}, {-75,-18}, {-75,-13}, {-75,-12}, {-75,-11}, {-75,-10}, {-75,-9}, {-75,-8}, {-75,-7}, {-75,-6}, {-75,-5}, {-75,-4}, {-75,-3}, {-75,-2}, {-75,-1}, {-75,0}, {-75,1}, {-75,2}, {-75,3}, {-75,4}, {-75,8}, {-75,9}, {-75,10}, {-75,11}, {-75,12}, {-75,13}, {-75,14}, {-75,15}, {-75,16}, {-75,17}, {-75,18}, {-75,19}, {-75,20}, {-75,21}, {-75,22}, {-75,23}, {-75,24}, {-75,25}, {-75,26}, {-75,27}, {-75,28}, {-75,29}, {-75,30}, {-75,31}, {-75,32}, {-75,33}, {-75,34}, {-75,35}, {-75,36}, {-75,37}, {-75,38}, {-75,41}, {-75,42}, {-75,46}, {-75,49}, {-75,50}, {-75,60}, {-75,61}, {-75,67}, {-75,102}, {-75,103}, {-75,105}, {-75,106}, {-75,107}, {-75,113}, {-75,114}, {-74,-26}, {-74,-25}, {-74,-24}, {-74,-23}, {-74,-21}, {-74,-20}, {-74,-19}, {-74,-18}, {-74,-17}, {-74,-15}, {-74,-14}, {-74,-13}, {-74,-12}, {-74,-11}, {-74,-10}, {-74,-9}, {-74,-8}, {-74,-7}, {-74,-6}, {-74,-5}, {-74,-4}, {-74,-3}, {-74,-2}, {-74,-1}, {-74,0}, {-74,1}, {-74,2}, {-74,3}, {-74,4}, {-74,8}, {-74,9}, {-74,10}, {-74,11}, {-74,12}, {-74,13}, {-74,14}, {-74,15}, {-74,16}, {-74,17}, {-74,18}, {-74,19}, {-74,20}, {-74,21}, {-74,22}, {-74,23}, {-74,24}, {-74,25}, {-74,26}, {-74,27}, {-74,28}, {-74,29}, {-74,30}, {-74,31}, {-74,32}, {-74,33}, {-74,34}, {-74,35}, {-74,36}, {-74,37}, {-74,38}, {-74,41}, {-74,42}, {-74,46}, {-74,49}, {-74,50}, {-74,60}, {-74,61}, {-74,63}, {-74,65}, {-74,67}, {-74,102}, {-74,103}, {-74,113}, {-74,114}, {-73,-71}, {-73,-68}, {-73,-26}, {-73,-25}, {-73,-24}, {-73,-23}, {-73,-21}, {-73,-20}, {-73,-19}, {-73,-18}, {-73,-17}, {-73,-15}, {-73,-14}, {-73,-13}, {-73,-12}, {-73,-11}, {-73,-10}, {-73,-9}, {-73,-8}, {-73,-7}, {-73,-6}, {-73,-5}, {-73,-4}, {-73,-3}, {-73,-2}, {-73,-1}, {-73,0}, {-73,1}, {-73,2}, {-73,3}, {-73,4}, {-73,8}, {-73,9}, {-73,10}, {-73,11}, {-73,12}, {-73,13}, {-73,14}, {-73,15}, {-73,16}, {-73,17}, {-73,18}, {-73,19}, {-73,20}, {-73,21}, {-73,22}, {-73,23}, {-73,24}, {-73,25}, {-73,29}, {-73,30}, {-73,36}, {-73,37}, {-73,41}, {-73,42}, {-73,43}, {-73,44}, {-73,45}, {-73,46}, {-73,47}, {-73,48}, {-73,49}, {-73,50}, {-73,60}, {-73,61}, {-73,67}, {-73,102}, {-73,103}, {-73,110}, {-73,111}, {-73,112}, {-73,113}, {-73,114}, {-72,-80}, {-72,-79}, {-72,-78}, {-72,-76}, {-72,-73}, {-72,-72}, {-72,-71}, {-72,-68}, {-72,-67}, {-72,-66}, {-72,-64}, {-72,-63}, {-72,-61}, {-72,-60}, {-72,-59}, {-72,-14}, {-72,-13}, {-72,-12}, {-72,24}, {-72,25}, {-72,26}, {-72,29}, {-72,30}, {-72,36}, {-72,37}, {-72,41}, {-72,42}, {-72,49}, {-72,50}, {-72,60}, {-72,61}, {-72,67}, {-72,102}, {-72,103}, {-72,104}, {-72,105}, {-72,106}, {-72,107}, {-72,108}, {-72,110}, {-72,111}, {-72,112}, {-72,113}, {-72,114}, {-71,-80}, {-71,-79}, {-71,-78}, {-71,-77}, {-71,-76}, {-71,-75}, {-71,-74}, {-71,-73}, {-71,-72}, {-71,-71}, {-71,-68}, {-71,-67}, {-71,-66}, {-71,-65}, {-71,-64}, {-71,-63}, {-71,-62}, {-71,-61}, {-71,-60}, {-71,-59}, {-71,-14}, {-71,-13}, {-71,-12}, {-71,24}, {-71,25}, {-71,26}, {-71,29}, {-71,30}, {-71,32}, {-71,33}, {-71,34}, {-71,35}, {-71,36}, {-71,37}, {-71,41}, {-71,42}, {-71,43}, {-71,44}, {-71,45}, {-71,46}, {-71,47}, {-71,49}, {-71,50}, {-71,67}, {-71,102}, {-71,103}, {-71,106}, {-71,113}, {-71,114}, {-70,-80}, {-70,-79}, {-70,-78}, {-70,-77}, {-70,-76}, {-70,-75}, {-70,-74}, {-70,-73}, {-70,-72}, {-70,-71}, {-70,-68}, {-70,-67}, {-70,-66}, {-70,-65}, {-70,-64}, {-70,-63}, {-70,-62}, {-70,-61}, {-70,-60}, {-70,-59}, {-70,-14}, {-70,-13}, {-70,-12}, {-70,24}, {-70,25}, {-70,26}, {-70,29}, {-70,30}, {-70,36}, {-70,37}, {-70,41}, {-70,49}, {-70,50}, {-70,60}, {-70,61}, {-70,67}, {-70,102}, {-70,103}, {-70,106}, {-70,113}, {-70,114}, {-69,-79}, {-69,-78}, {-69,-71}, {-69,-68}, {-69,-61}, {-69,-60}, {-69,-14}, {-69,-13}, {-69,-12}, {-69,24}, {-69,25}, {-69,26}, {-69,29}, {-69,30}, {-69,36}, {-69,37}, {-69,41}, {-69,49}, {-69,50}, {-69,60}, {-69,61}, {-69,67}, {-69,96}, {-69,97}, {-69,98}, {-69,99}, {-69,101}, {-69,102}, {-69,103}, {-69,106}, {-69,113}, {-69,114}, {-68,-80}, {-68,-79}, {-68,-78}, {-68,-61}, {-68,-60}, {-68,-59}, {-68,-25}, {-68,-24}, {-68,-20}, {-68,-19}, {-68,-14}, {-68,-13}, {-68,-12}, {-68,24}, {-68,25}, {-68,26}, {-68,29}, {-68,30}, {-68,32}, {-68,33}, {-68,34}, {-68,35}, {-68,36}, {-68,37}, {-68,49}, {-68,50}, {-68,60}, {-68,61}, {-68,67}, {-68,96}, {-68,97}, {-68,98}, {-68,99}, {-68,101}, {-68,102}, {-68,103}, {-68,106}, {-68,113}, {-68,114}, {-67,-80}, {-67,-79}, {-67,-78}, {-67,-61}, {-67,-60}, {-67,-59}, {-67,-25}, {-67,-24}, {-67,-20}, {-67,-19}, {-67,-14}, {-67,-13}, {-67,-12}, {-67,24}, {-67,25}, {-67,26}, {-67,29}, {-67,30}, {-67,36}, {-67,37}, {-67,41}, {-67,49}, {-67,50}, {-67,60}, {-67,61}, {-67,67}, {-67,96}, {-67,97}, {-67,102}, {-67,103}, {-67,106}, {-67,113}, {-67,114}, {-66,-79}, {-66,-78}, {-66,-61}, {-66,-60}, {-66,-14}, {-66,-13}, {-66,-12}, {-66,24}, {-66,25}, {-66,26}, {-66,29}, {-66,30}, {-66,36}, {-66,37}, {-66,41}, {-66,49}, {-66,50}, {-66,51}, {-66,52}, {-66,53}, {-66,54}, {-66,56}, {-66,57}, {-66,58}, {-66,59}, {-66,60}, {-66,61}, {-66,62}, {-66,64}, {-66,65}, {-66,66}, {-66,67}, {-66,68}, {-66,96}, {-66,97}, {-66,102}, {-66,103}, {-66,113}, {-66,114}, {-65,-80}, {-65,-79}, {-65,-78}, {-65,-73}, {-65,-72}, {-65,-67}, {-65,-66}, {-65,-61}, {-65,-60}, {-65,-59}, {-65,-14}, {-65,-13}, {-65,-12}, {-65,24}, {-65,25}, {-65,26}, {-65,29}, {-65,30}, {-65,32}, {-65,33}, {-65,34}, {-65,35}, {-65,36}, {-65,37}, {-65,41}, {-65,42}, {-65,43}, {-65,44}, {-65,45}, {-65,46}, {-65,47}, {-65,49}, {-65,50}, {-65,53}, {-65,57}, {-65,60}, {-65,61}, {-65,67}, {-65,96}, {-65,97}, {-65,98}, {-65,99}, {-65,101}, {-65,102}, {-65,103}, {-65,104}, {-65,105}, {-65,106}, {-65,107}, {-65,108}, {-65,109}, {-65,110}, {-65,111}, {-65,112}, {-65,113}, {-65,114}, {-65,115}, {-65,117}, {-65,118}, {-65,119}, {-65,120}, {-65,121}, {-65,122}, {-65,123}, {-65,124}, {-65,125}, {-65,126}, {-65,127}, {-65,128}, {-65,129}, {-65,130}, {-65,131}, {-65,132}, {-65,133}, {-65,134}, {-65,137}, {-65,138}, {-65,139}, {-64,-80}, {-64,-79}, {-64,-78}, {-64,-73}, {-64,-72}, {-64,-67}, {-64,-66}, {-64,-61}, {-64,-60}, {-64,-59}, {-64,-14}, {-64,-13}, {-64,-12}, {-64,24}, {-64,25}, {-64,26}, {-64,36}, {-64,37}, {-64,41}, {-64,42}, {-64,49}, {-64,50}, {-64,60}, {-64,61}, {-64,67}, {-64,96}, {-64,97}, {-64,98}, {-64,99}, {-64,101}, {-64,102}, {-64,103}, {-64,104}, {-64,105}, {-64,106}, {-64,107}, {-64,108}, {-64,109}, {-64,110}, {-64,111}, {-64,112}, {-64,113}, {-64,114}, {-64,115}, {-64,117}, {-64,118}, {-64,119}, {-64,120}, {-64,121}, {-64,122}, {-64,123}, {-64,124}, {-64,125}, {-64,126}, {-64,127}, {-64,128}, {-64,129}, {-64,130}, {-64,131}, {-64,132}, {-64,133}, {-64,134}, {-64,137}, {-64,138}, {-64,139}, {-63,-79}, {-63,-78}, {-63,-62}, {-63,-61}, {-63,-60}, {-63,-59}, {-63,-58}, {-63,-25}, {-63,-24}, {-63,-20}, {-63,-19}, {-63,-14}, {-63,-13}, {-63,-12}, {-63,24}, {-63,25}, {-63,26}, {-63,29}, {-63,30}, {-63,36}, {-63,37}, {-63,41}, {-63,42}, {-63,43}, {-63,44}, {-63,45}, {-63,46}, {-63,47}, {-63,48}, {-63,49}, {-63,50}, {-63,51}, {-63,52}, {-63,53}, {-63,54}, {-63,55}, {-63,56}, {-63,57}, {-63,58}, {-63,59}, {-63,60}, {-63,61}, {-63,62}, {-63,63}, {-63,64}, {-63,65}, {-63,66}, {-63,67}, {-63,68}, {-63,96}, {-63,97}, {-63,138}, {-63,139}, {-62,-80}, {-62,-79}, {-62,-78}, {-62,-25}, {-62,-24}, {-62,-20}, {-62,-19}, {-62,-14}, {-62,-13}, {-62,-12}, {-62,24}, {-62,25}, {-62,26}, {-62,28}, {-62,29}, {-62,30}, {-62,31}, {-62,32}, {-62,33}, {-62,34}, {-62,35}, {-62,36}, {-62,37}, {-62,41}, {-62,42}, {-62,43}, {-62,44}, {-62,45}, {-62,46}, {-62,47}, {-62,48}, {-62,49}, {-62,50}, {-62,51}, {-62,52}, {-62,53}, {-62,54}, {-62,55}, {-62,56}, {-62,57}, {-62,58}, {-62,59}, {-62,60}, {-62,61}, {-62,62}, {-62,63}, {-62,64}, {-62,65}, {-62,66}, {-62,67}, {-62,68}, {-62,70}, {-62,71}, {-62,72}, {-62,73}, {-62,74}, {-62,75}, {-62,76}, {-62,77}, {-62,78}, {-62,79}, {-62,80}, {-62,83}, {-62,84}, {-62,85}, {-62,86}, {-62,87}, {-62,88}, {-62,89}, {-62,90}, {-62,91}, {-62,92}, {-62,93}, {-62,96}, {-62,97}, {-62,138}, {-62,139}, {-61,-80}, {-61,-79}, {-61,-78}, {-61,24}, {-61,25}, {-61,72}, {-61,73}, {-61,74}, {-61,75}, {-61,76}, {-61,77}, {-61,78}, {-61,79}, {-61,80}, {-61,83}, {-61,84}, {-61,85}, {-61,86}, {-61,87}, {-61,88}, {-61,89}, {-61,90}, {-61,91}, {-61,92}, {-61,93}, {-61,94}, {-61,95}, {-61,96}, {-61,97}, {-61,98}, {-61,99}, {-61,100}, {-61,101}, {-61,102}, {-61,103}, {-61,104}, {-61,105}, {-61,106}, {-61,107}, {-61,108}, {-61,109}, {-61,110}, {-61,111}, {-61,112}, {-61,113}, {-61,114}, {-61,118}, {-61,119}, {-61,120}, {-61,121}, {-61,122}, {-61,123}, {-61,124}, {-61,125}, {-61,128}, {-61,129}, {-61,130}, {-61,131}, {-61,132}, {-61,133}, {-61,134}, {-61,138}, {-61,139}, {-60,-79}, {-60,-78}, {-60,-62}, {-60,-61}, {-60,-60}, {-60,-59}, {-60,-58}, {-60,30}, {-60,32}, {-60,33}, {-60,35}, {-60,36}, {-60,37}, {-60,72}, {-60,73}, {-60,74}, {-60,75}, {-60,76}, {-60,77}, {-60,78}, {-60,79}, {-60,80}, {-60,83}, {-60,84}, {-60,85}, {-60,86}, {-60,87}, {-60,88}, {-60,89}, {-60,90}, {-60,91}, {-60,92}, {-60,93}, {-60,94}, {-60,95}, {-60,96}, {-60,97}, {-60,98}, {-60,99}, {-60,100}, {-60,101}, {-60,102}, {-60,103}, {-60,104}, {-60,105}, {-60,106}, {-60,107}, {-60,108}, {-60,109}, {-60,110}, {-60,111}, {-60,112}, {-60,113}, {-60,114}, {-60,118}, {-60,119}, {-60,125}, {-60,128}, {-60,134}, {-60,138}, {-60,139}, {-59,-80}, {-59,-79}, {-59,-78}, {-59,-73}, {-59,-72}, {-59,-67}, {-59,-66}, {-59,-61}, {-59,-60}, {-59,-59}, {-59,24}, {-59,25}, {-59,30}, {-59,33}, {-59,36}, {-59,37}, {-59,78}, {-59,79}, {-59,83}, {-59,84}, {-59,92}, {-59,93}, {-59,113}, {-59,114}, {-59,118}, {-59,119}, {-59,125}, {-59,128}, {-59,134}, {-59,138}, {-59,139}, {-58,-80}, {-58,-79}, {-58,-78}, {-58,-73}, {-58,-72}, {-58,-67}, {-58,-66}, {-58,-61}, {-58,-60}, {-58,-59}, {-58,-25}, {-58,-24}, {-58,-20}, {-58,-19}, {-58,-14}, {-58,-13}, {-58,-12}, {-58,24}, {-58,25}, {-58,26}, {-58,30}, {-58,33}, {-58,36}, {-58,37}, {-58,78}, {-58,79}, {-58,83}, {-58,84}, {-58,92}, {-58,93}, {-58,95}, {-58,96}, {-58,97}, {-58,98}, {-58,99}, {-58,101}, {-58,102}, {-58,109}, {-58,110}, {-58,111}, {-58,113}, {-58,114}, {-58,118}, {-58,119}, {-58,125}, {-58,128}, {-58,138}, {-58,139}, {-57,-79}, {-57,-78}, {-57,-61}, {-57,-60}, {-57,-25}, {-57,-24}, {-57,-20}, {-57,-19}, {-57,-14}, {-57,-13}, {-57,-12}, {-57,24}, {-57,25}, {-57,26}, {-57,30}, {-57,33}, {-57,36}, {-57,37}, {-57,78}, {-57,79}, {-57,92}, {-57,93}, {-57,98}, {-57,99}, {-57,102}, {-57,109}, {-57,113}, {-57,114}, {-57,118}, {-57,119}, {-57,125}, {-57,128}, {-57,134}, {-57,138}, {-57,139}, {-56,-80}, {-56,-79}, {-56,-78}, {-56,-61}, {-56,-60}, {-56,-59}, {-56,-14}, {-56,-13}, {-56,-12}, {-56,24}, {-56,25}, {-56,26}, {-56,30}, {-56,31}, {-56,32}, {-56,33}, {-56,34}, {-56,35}, {-56,36}, {-56,37}, {-56,78}, {-56,79}, {-56,83}, {-56,84}, {-56,92}, {-56,93}, {-56,94}, {-56,95}, {-56,96}, {-56,97}, {-56,98}, {-56,99}, {-56,102}, {-56,109}, {-56,110}, {-56,111}, {-56,113}, {-56,114}, {-56,118}, {-56,119}, {-56,128}, {-56,134}, {-56,138}, {-56,139}, {-55,-80}, {-55,-79}, {-55,-78}, {-55,-61}, {-55,-60}, {-55,-59}, {-55,-14}, {-55,-13}, {-55,-12}, {-55,24}, {-55,25}, {-55,26}, {-55,36}, {-55,37}, {-55,78}, {-55,79}, {-55,83}, {-55,84}, {-55,92}, {-55,93}, {-55,98}, {-55,99}, {-55,102}, {-55,109}, {-55,113}, {-55,114}, {-55,118}, {-55,119}, {-55,125}, {-55,128}, {-55,129}, {-55,131}, {-55,132}, {-55,133}, {-55,134}, {-55,138}, {-55,139}, {-54,-79}, {-54,-78}, {-54,-71}, {-54,-68}, {-54,-61}, {-54,-60}, {-54,-14}, {-54,-13}, {-54,-12}, {-54,24}, {-54,25}, {-54,26}, {-54,30}, {-54,32}, {-54,33}, {-54,34}, {-54,35}, {-54,36}, {-54,37}, {-54,74}, {-54,75}, {-54,76}, {-54,77}, {-54,78}, {-54,79}, {-54,80}, {-54,83}, {-54,84}, {-54,85}, {-54,86}, {-54,87}, {-54,88}, {-54,89}, {-54,90}, {-54,91}, {-54,92}, {-54,93}, {-54,98}, {-54,99}, {-54,102}, {-54,109}, {-54,113}, {-54,114}, {-54,118}, {-54,119}, {-54,125}, {-54,128}, {-54,134}, {-54,138}, {-54,139}, {-53,-80}, {-53,-79}, {-53,-78}, {-53,-77}, {-53,-76}, {-53,-75}, {-53,-74}, {-53,-73}, {-53,-72}, {-53,-71}, {-53,-68}, {-53,-67}, {-53,-66}, {-53,-65}, {-53,-64}, {-53,-63}, {-53,-62}, {-53,-61}, {-53,-60}, {-53,-59}, {-53,-25}, {-53,-24}, {-53,-20}, {-53,-19}, {-53,-14}, {-53,-13}, {-53,-12}, {-53,24}, {-53,25}, {-53,26}, {-53,30}, {-53,36}, {-53,37}, {-53,73}, {-53,74}, {-53,92}, {-53,93}, {-53,94}, {-53,95}, {-53,96}, {-53,98}, {-53,99}, {-53,100}, {-53,101}, {-53,102}, {-53,103}, {-53,104}, {-53,105}, {-53,107}, {-53,108}, {-53,109}, {-53,110}, {-53,111}, {-53,112}, {-53,113}, {-53,114}, {-53,118}, {-53,119}, {-53,120}, {-53,122}, {-53,123}, {-53,124}, {-53,125}, {-53,128}, {-53,129}, {-53,130}, {-53,131}, {-53,132}, {-53,133}, {-53,134}, {-53,138}, {-53,139}, {-52,-80}, {-52,-79}, {-52,-78}, {-52,-77}, {-52,-76}, {-52,-75}, {-52,-74}, {-52,-73}, {-52,-72}, {-52,-71}, {-52,-68}, {-52,-67}, {-52,-66}, {-52,-65}, {-52,-64}, {-52,-63}, {-52,-62}, {-52,-61}, {-52,-60}, {-52,-59}, {-52,-25}, {-52,-24}, {-52,-20}, {-52,-19}, {-52,-14}, {-52,-13}, {-52,-12}, {-52,24}, {-52,25}, {-52,26}, {-52,30}, {-52,32}, {-52,33}, {-52,34}, {-52,35}, {-52,36}, {-52,37}, {-52,73}, {-52,74}, {-52,93}, {-52,94}, {-52,95}, {-52,96}, {-52,98}, {-52,99}, {-52,100}, {-52,101}, {-52,102}, {-52,103}, {-52,104}, {-52,105}, {-52,107}, {-52,108}, {-52,109}, {-52,110}, {-52,111}, {-52,112}, {-52,113}, {-52,114}, {-52,118}, {-52,119}, {-52,125}, {-52,128}, {-52,134}, {-52,138}, {-52,139}, {-51,-80}, {-51,-79}, {-51,-76}, {-51,-75}, {-51,-73}, {-51,-72}, {-51,-71}, {-51,-68}, {-51,-67}, {-51,-66}, {-51,-64}, {-51,-63}, {-51,-61}, {-51,-60}, {-51,-59}, {-51,24}, {-51,25}, {-51,30}, {-51,36}, {-51,37}, {-51,73}, {-51,74}, {-51,98}, {-51,99}, {-51,113}, {-51,114}, {-51,118}, {-51,119}, {-51,125}, {-51,128}, {-51,134}, {-51,138}, {-51,139}, {-50,-71}, {-50,-68}, {-50,30}, {-50,31}, {-50,32}, {-50,33}, {-50,34}, {-50,35}, {-50,36}, {-50,37}, {-50,98}, {-50,99}, {-50,113}, {-50,114}, {-50,118}, {-50,119}, {-50,120}, {-50,121}, {-50,122}, {-50,123}, {-50,124}, {-50,125}, {-50,128}, {-50,138}, {-50,139}, {-49,24}, {-49,25}, {-49,113}, {-49,114}, {-49,118}, {-49,119}, {-49,125}, {-49,128}, {-49,134}, {-49,138}, {-49,139}, {-48,-66}, {-48,-65}, {-48,-61}, {-48,-60}, {-48,-25}, {-48,-24}, {-48,-20}, {-48,-19}, {-48,-14}, {-48,-13}, {-48,-12}, {-48,24}, {-48,25}, {-48,26}, {-48,30}, {-48,31}, {-48,32}, {-48,33}, {-48,34}, {-48,35}, {-48,36}, {-48,37}, {-48,98}, {-48,99}, {-48,113}, {-48,114}, {-48,118}, {-48,119}, {-48,125}, {-48,128}, {-48,134}, {-48,138}, {-48,139}, {-47,-66}, {-47,-65}, {-47,-61}, {-47,-60}, {-47,-25}, {-47,-24}, {-47,-20}, {-47,-19}, {-47,-14}, {-47,-13}, {-47,-12}, {-47,24}, {-47,25}, {-47,26}, {-47,36}, {-47,37}, {-47,98}, {-47,99}, {-47,113}, {-47,114}, {-47,118}, {-47,119}, {-47,125}, {-47,128}, {-47,129}, {-47,131}, {-47,132}, {-47,133}, {-47,134}, {-47,138}, {-47,139}, {-46,-66}, {-46,-65}, {-46,-61}, {-46,-60}, {-46,-14}, {-46,-13}, {-46,-12}, {-46,24}, {-46,25}, {-46,26}, {-46,30}, {-46,36}, {-46,37}, {-46,98}, {-46,99}, {-46,113}, {-46,114}, {-46,118}, {-46,119}, {-46,125}, {-46,128}, {-46,134}, {-46,138}, {-46,139}, {-45,-66}, {-45,-65}, {-45,-64}, {-45,-63}, {-45,-62}, {-45,-61}, {-45,-60}, {-45,-14}, {-45,-13}, {-45,-12}, {-45,24}, {-45,25}, {-45,26}, {-45,30}, {-45,32}, {-45,33}, {-45,34}, {-45,35}, {-45,36}, {-45,37}, {-45,98}, {-45,99}, {-45,128}, {-45,129}, {-45,130}, {-45,131}, {-45,132}, {-45,133}, {-45,134}, {-45,138}, {-45,139}, {-44,-66}, {-44,-65}, {-44,-64}, {-44,-63}, {-44,-62}, {-44,-61}, {-44,-60}, {-44,-14}, {-44,-13}, {-44,-12}, {-44,24}, {-44,25}, {-44,26}, {-44,30}, {-44,36}, {-44,37}, {-44,98}, {-44,99}, {-44,113}, {-44,114}, {-44,118}, {-44,119}, {-44,125}, {-44,128}, {-44,134}, {-44,138}, {-44,139}, {-43,-81}, {-43,-80}, {-43,-79}, {-43,-78}, {-43,-77}, {-43,-66}, {-43,-65}, {-43,-61}, {-43,-60}, {-43,-25}, {-43,-24}, {-43,-20}, {-43,-19}, {-43,-14}, {-43,-13}, {-43,-12}, {-43,24}, {-43,25}, {-43,26}, {-43,30}, {-43,36}, {-43,37}, {-43,98}, {-43,99}, {-43,113}, {-43,114}, {-43,118}, {-43,119}, {-43,125}, {-43,128}, {-43,134}, {-43,138}, {-43,139}, {-42,-81}, {-42,-80}, {-42,-79}, {-42,-78}, {-42,-77}, {-42,-66}, {-42,-65}, {-42,-61}, {-42,-60}, {-42,-25}, {-42,-24}, {-42,-20}, {-42,-19}, {-42,-14}, {-42,-13}, {-42,-12}, {-42,24}, {-42,25}, {-42,26}, {-42,30}, {-42,32}, {-42,33}, {-42,34}, {-42,35}, {-42,36}, {-42,37}, {-42,98}, {-42,99}, {-42,113}, {-42,114}, {-42,118}, {-42,119}, {-42,120}, {-42,122}, {-42,123}, {-42,124}, {-42,125}, {-42,128}, {-42,138}, {-42,139}, {-41,-79}, {-41,-78}, {-41,-77}, {-41,-66}, {-41,-65}, {-41,-61}, {-41,-60}, {-41,-14}, {-41,-13}, {-41,-12}, {-41,24}, {-41,25}, {-41,26}, {-41,30}, {-41,36}, {-41,37}, {-41,113}, {-41,114}, {-41,118}, {-41,119}, {-41,125}, {-41,128}, {-41,134}, {-41,138}, {-41,139}, {-40,-78}, {-40,-77}, {-40,-76}, {-40,-75}, {-40,-74}, {-40,-73}, {-40,-72}, {-40,-66}, {-40,-65}, {-40,-14}, {-40,-13}, {-40,-12}, {-40,24}, {-40,25}, {-40,26}, {-40,30}, {-40,36}, {-40,37}, {-40,98}, {-40,99}, {-40,113}, {-40,114}, {-40,118}, {-40,119}, {-40,125}, {-40,128}, {-40,134}, {-40,138}, {-40,139}, {-39,-78}, {-39,-77}, {-39,-76}, {-39,-75}, {-39,-74}, {-39,-73}, {-39,-72}, {-39,-66}, {-39,-65}, {-39,-61}, {-39,-60}, {-39,-14}, {-39,-13}, {-39,-12}, {-39,24}, {-39,25}, {-39,26}, {-39,30}, {-39,32}, {-39,33}, {-39,34}, {-39,35}, {-39,36}, {-39,37}, {-39,73}, {-39,74}, {-39,98}, {-39,99}, {-39,113}, {-39,114}, {-39,118}, {-39,119}, {-39,120}, {-39,121}, {-39,122}, {-39,123}, {-39,124}, {-39,125}, {-39,128}, {-39,129}, {-39,131}, {-39,132}, {-39,133}, {-39,134}, {-39,138}, {-39,139}, {-38,-75}, {-38,-74}, {-38,-73}, {-38,-72}, {-38,-66}, {-38,-65}, {-38,-61}, {-38,-60}, {-38,-14}, {-38,-13}, {-38,-12}, {-38,24}, {-38,25}, {-38,26}, {-38,30}, {-38,36}, {-38,37}, {-38,73}, {-38,74}, {-38,75}, {-38,93}, {-38,94}, {-38,95}, {-38,96}, {-38,98}, {-38,99}, {-38,100}, {-38,101}, {-38,102}, {-38,103}, {-38,104}, {-38,105}, {-38,107}, {-38,108}, {-38,109}, {-38,110}, {-38,111}, {-38,112}, {-38,113}, {-38,114}, {-38,118}, {-38,119}, {-38,125}, {-38,128}, {-38,134}, {-38,138}, {-38,139}, {-37,-73}, {-37,-72}, {-37,-66}, {-37,-65}, {-37,-61}, {-37,-60}, {-37,-26}, {-37,-25}, {-37,-24}, {-37,-23}, {-37,-21}, {-37,-20}, {-37,-19}, {-37,-18}, {-37,-17}, {-37,-15}, {-37,-14}, {-37,-13}, {-37,-12}, {-37,-11}, {-37,-10}, {-37,-9}, {-37,-8}, {-37,-7}, {-37,-6}, {-37,-5}, {-37,-4}, {-37,-3}, {-37,-2}, {-37,-1}, {-37,0}, {-37,1}, {-37,2}, {-37,3}, {-37,4}, {-37,24}, {-37,25}, {-37,26}, {-37,30}, {-37,36}, {-37,37}, {-37,73}, {-37,74}, {-37,75}, {-37,92}, {-37,93}, {-37,94}, {-37,95}, {-37,96}, {-37,98}, {-37,99}, {-37,100}, {-37,101}, {-37,102}, {-37,103}, {-37,104}, {-37,105}, {-37,107}, {-37,108}, {-37,109}, {-37,110}, {-37,111}, {-37,112}, {-37,113}, {-37,114}, {-37,118}, {-37,119}, {-37,125}, {-37,128}, {-37,129}, {-37,130}, {-37,131}, {-37,132}, {-37,133}, {-37,134}, {-37,138}, {-37,139}, {-36,-73}, {-36,-72}, {-36,-66}, {-36,-65}, {-36,-64}, {-36,-63}, {-36,-62}, {-36,-61}, {-36,-60}, {-36,-26}, {-36,-25}, {-36,-24}, {-36,-23}, {-36,-21}, {-36,-20}, {-36,-19}, {-36,-18}, {-36,-17}, {-36,-15}, {-36,-14}, {-36,-13}, {-36,-12}, {-36,-11}, {-36,-10}, {-36,-9}, {-36,-8}, {-36,-7}, {-36,-6}, {-36,-5}, {-36,-4}, {-36,-3}, {-36,-2}, {-36,-1}, {-36,0}, {-36,1}, {-36,2}, {-36,3}, {-36,4}, {-36,24}, {-36,25}, {-36,26}, {-36,27}, {-36,28}, {-36,29}, {-36,30}, {-36,31}, {-36,32}, {-36,33}, {-36,34}, {-36,35}, {-36,36}, {-36,37}, {-36,41}, {-36,42}, {-36,43}, {-36,44}, {-36,45}, {-36,46}, {-36,74}, {-36,75}, {-36,76}, {-36,77}, {-36,78}, {-36,79}, {-36,80}, {-36,83}, {-36,84}, {-36,85}, {-36,86}, {-36,87}, {-36,88}, {-36,89}, {-36,90}, {-36,91}, {-36,92}, {-36,93}, {-36,98}, {-36,99}, {-36,102}, {-36,109}, {-36,113}, {-36,114}, {-36,118}, {-36,119}, {-36,128}, {-36,134}, {-36,138}, {-36,139}, {-35,-73}, {-35,-72}, {-35,-66}, {-35,-65}, {-35,-61}, {-35,-60}, {-35,-26}, {-35,-25}, {-35,-18}, {-35,-13}, {-35,-12}, {-35,-11}, {-35,-10}, {-35,-9}, {-35,-8}, {-35,-7}, {-35,-6}, {-35,-5}, {-35,-4}, {-35,-3}, {-35,-2}, {-35,-1}, {-35,0}, {-35,1}, {-35,2}, {-35,3}, {-35,4}, {-35,24}, {-35,25}, {-35,26}, {-35,27}, {-35,28}, {-35,29}, {-35,30}, {-35,31}, {-35,32}, {-35,33}, {-35,34}, {-35,35}, {-35,36}, {-35,37}, {-35,41}, {-35,45}, {-35,46}, {-35,76}, {-35,77}, {-35,86}, {-35,87}, {-35,92}, {-35,93}, {-35,94}, {-35,95}, {-35,96}, {-35,98}, {-35,99}, {-35,102}, {-35,109}, {-35,113}, {-35,114}, {-35,118}, {-35,119}, {-35,125}, {-35,128}, {-35,134}, {-35,138}, {-35,139}, {-34,-73}, {-34,-72}, {-34,-66}, {-34,-65}, {-34,-61}, {-34,-60}, {-34,-26}, {-34,-25}, {-34,-18}, {-34,-13}, {-34,-12}, {-34,24}, {-34,25}, {-34,36}, {-34,37}, {-34,41}, {-34,45}, {-34,46}, {-34,76}, {-34,77}, {-34,92}, {-34,93}, {-34,98}, {-34,99}, {-34,102}, {-34,109}, {-34,110}, {-34,112}, {-34,113}, {-34,114}, {-34,118}, {-34,119}, {-34,125}, {-34,128}, {-34,138}, {-34,139}, {-33,-73}, {-33,-72}, {-33,-66}, {-33,-65}, {-33,-26}, {-33,-25}, {-33,-24}, {-33,-23}, {-33,-22}, {-33,-21}, {-33,-20}, {-33,-19}, {-33,-18}, {-33,-17}, {-33,-16}, {-33,-13}, {-33,-12}, {-33,36}, {-33,37}, {-33,41}, {-33,45}, {-33,46}, {-33,76}, {-33,77}, {-33,86}, {-33,87}, {-33,92}, {-33,93}, {-33,94}, {-33,95}, {-33,96}, {-33,97}, {-33,98}, {-33,99}, {-33,102}, {-33,109}, {-33,113}, {-33,114}, {-33,118}, {-33,119}, {-33,120}, {-33,122}, {-33,123}, {-33,124}, {-33,125}, {-33,128}, {-33,134}, {-33,138}, {-33,139}, {-32,-73}, {-32,-72}, {-32,-66}, {-32,-65}, {-32,-61}, {-32,-60}, {-32,-26}, {-32,-25}, {-32,-16}, {-32,-13}, {-32,-12}, {-32,24}, {-32,25}, {-32,28}, {-32,36}, {-32,37}, {-32,41}, {-32,45}, {-32,46}, {-32,76}, {-32,77}, {-32,86}, {-32,87}, {-32,88}, {-32,89}, {-32,90}, {-32,91}, {-32,92}, {-32,93}, {-32,98}, {-32,99}, {-32,100}, {-32,102}, {-32,109}, {-32,110}, {-32,112}, {-32,113}, {-32,114}, {-32,118}, {-32,119}, {-32,125}, {-32,128}, {-32,134}, {-32,138}, {-32,139}, {-31,-73}, {-31,-72}, {-31,-66}, {-31,-65}, {-31,-61}, {-31,-60}, {-31,-26}, {-31,-25}, {-31,-16}, {-31,-13}, {-31,-12}, {-31,24}, {-31,25}, {-31,28}, {-31,29}, {-31,30}, {-31,31}, {-31,32}, {-31,33}, {-31,34}, {-31,35}, {-31,36}, {-31,37}, {-31,41}, {-31,45}, {-31,46}, {-31,76}, {-31,77}, {-31,86}, {-31,87}, {-31,88}, {-31,89}, {-31,90}, {-31,91}, {-31,92}, {-31,93}, {-31,113}, {-31,114}, {-31,118}, {-31,119}, {-31,125}, {-31,128}, {-31,129}, {-31,131}, {-31,132}, {-31,133}, {-31,134}, {-31,138}, {-31,139}, {-30,-73}, {-30,-72}, {-30,-66}, {-30,-65}, {-30,-64}, {-30,-63}, {-30,-62}, {-30,-61}, {-30,-60}, {-30,-26}, {-30,-25}, {-30,-24}, {-30,-22}, {-30,-21}, {-30,-20}, {-30,-19}, {-30,-18}, {-30,-17}, {-30,-16}, {-30,-13}, {-30,-12}, {-30,-7}, {-30,-6}, {-30,-2}, {-30,-1}, {-30,3}, {-30,4}, {-30,8}, {-30,9}, {-30,13}, {-30,14}, {-30,18}, {-30,19}, {-30,24}, {-30,25}, {-30,26}, {-30,27}, {-30,28}, {-30,36}, {-30,37}, {-30,41}, {-30,42}, {-30,43}, {-30,45}, {-30,46}, {-30,47}, {-30,48}, {-30,49}, {-30,50}, {-30,51}, {-30,52}, {-30,53}, {-30,54}, {-30,55}, {-30,56}, {-30,57}, {-30,58}, {-30,59}, {-30,60}, {-30,61}, {-30,62}, {-30,63}, {-30,64}, {-30,65}, {-30,66}, {-30,67}, {-30,68}, {-30,69}, {-30,70}, {-30,71}, {-30,76}, {-30,77}, {-30,86}, {-30,87}, {-30,91}, {-30,92}, {-30,93}, {-30,94}, {-30,95}, {-30,96}, {-30,97}, {-30,98}, {-30,99}, {-30,100}, {-30,101}, {-30,102}, {-30,103}, {-30,104}, {-30,105}, {-30,106}, {-30,107}, {-30,108}, {-30,109}, {-30,110}, {-30,111}, {-30,112}, {-30,113}, {-30,114}, {-30,115}, {-30,117}, {-30,118}, {-30,119}, {-30,125}, {-30,128}, {-30,134}, {-30,138}, {-30,139}, {-29,-73}, {-29,-72}, {-29,-66}, {-29,-65}, {-29,-61}, {-29,-60}, {-29,-26}, {-29,-25}, {-29,-16}, {-29,-13}, {-29,-12}, {-29,-7}, {-29,-6}, {-29,-2}, {-29,-1}, {-29,3}, {-29,4}, {-29,8}, {-29,9}, {-29,13}, {-29,14}, {-29,18}, {-29,19}, {-29,24}, {-29,25}, {-29,28}, {-29,30}, {-29,32}, {-29,34}, {-29,36}, {-29,37}, {-29,41}, {-29,71}, {-29,76}, {-29,77}, {-29,86}, {-29,87}, {-29,91}, {-29,92}, {-29,93}, {-29,94}, {-29,95}, {-29,96}, {-29,97}, {-29,98}, {-29,99}, {-29,100}, {-29,101}, {-29,102}, {-29,103}, {-29,104}, {-29,105}, {-29,106}, {-29,107}, {-29,108}, {-29,109}, {-29,110}, {-29,111}, {-29,112}, {-29,113}, {-29,114}, {-29,115}, {-29,117}, {-29,118}, {-29,119}, {-29,120}, {-29,121}, {-29,122}, {-29,123}, {-29,124}, {-29,125}, {-29,128}, {-29,129}, {-29,130}, {-29,131}, {-29,132}, {-29,133}, {-29,134}, {-29,138}, {-29,139}, {-28,-73}, {-28,-72}, {-28,-66}, {-28,-65}, {-28,-61}, {-28,-60}, {-28,-26}, {-28,-25}, {-28,-16}, {-28,-13}, {-28,-12}, {-28,24}, {-28,25}, {-28,30}, {-28,32}, {-28,34}, {-28,36}, {-28,37}, {-28,41}, {-28,68}, {-28,71}, {-28,76}, {-28,77}, {-28,86}, {-28,87}, {-28,138}, {-28,139}, {-27,-73}, {-27,-72}, {-27,-66}, {-27,-65}, {-27,-26}, {-27,-25}, {-27,-24}, {-27,-22}, {-27,-21}, {-27,-20}, {-27,-19}, {-27,-18}, {-27,-17}, {-27,-16}, {-27,-13}, {-27,-12}, {-27,28}, {-27,30}, {-27,32}, {-27,34}, {-27,36}, {-27,37}, {-27,41}, {-27,42}, {-27,43}, {-27,45}, {-27,46}, {-27,47}, {-27,48}, {-27,49}, {-27,50}, {-27,51}, {-27,52}, {-27,53}, {-27,54}, {-27,55}, {-27,56}, {-27,57}, {-27,58}, {-27,59}, {-27,60}, {-27,61}, {-27,62}, {-27,63}, {-27,64}, {-27,65}, {-27,66}, {-27,67}, {-27,68}, {-27,71}, {-27,76}, {-27,77}, {-27,78}, {-27,79}, {-27,80}, {-27,83}, {-27,84}, {-27,85}, {-27,86}, {-27,87}, {-27,138}, {-27,139}, {-27,145}, {-27,146}, {-27,147}, {-26,-73}, {-26,-72}, {-26,-66}, {-26,-65}, {-26,-61}, {-26,-60}, {-26,-26}, {-26,-25}, {-26,-13}, {-26,-12}, {-26,24}, {-26,25}, {-26,28}, {-26,30}, {-26,32}, {-26,34}, {-26,36}, {-26,37}, {-26,41}, {-26,57}, {-26,61}, {-26,62}, {-26,68}, {-26,71}, {-26,76}, {-26,77}, {-26,78}, {-26,79}, {-26,80}, {-26,83}, {-26,84}, {-26,85}, {-26,86}, {-26,87}, {-26,118}, {-26,119}, {-26,120}, {-26,121}, {-26,122}, {-26,123}, {-26,124}, {-26,125}, {-26,128}, {-26,129}, {-26,130}, {-26,131}, {-26,132}, {-26,133}, {-26,134}, {-26,138}, {-26,139}, {-26,145}, {-26,147}, {-25,-73}, {-25,-72}, {-25,-66}, {-25,-65}, {-25,-61}, {-25,-60}, {-25,-26}, {-25,-25}, {-25,-13}, {-25,-12}, {-25,-7}, {-25,-6}, {-25,-2}, {-25,-1}, {-25,3}, {-25,4}, {-25,8}, {-25,9}, {-25,13}, {-25,14}, {-25,18}, {-25,19}, {-25,24}, {-25,25}, {-25,28}, {-25,30}, {-25,32}, {-25,34}, {-25,36}, {-25,37}, {-25,41}, {-25,45}, {-25,46}, {-25,47}, {-25,48}, {-25,49}, {-25,50}, {-25,51}, {-25,52}, {-25,53}, {-25,57}, {-25,61}, {-25,62}, {-25,68}, {-25,71}, {-25,78}, {-25,85}, {-25,118}, {-25,119}, {-25,125}, {-25,128}, {-25,134}, {-25,138}, {-25,139}, {-25,145}, {-25,147}, {-24,-73}, {-24,-72}, {-24,-66}, {-24,-65}, {-24,-61}, {-24,-60}, {-24,-26}, {-24,-25}, {-24,-24}, {-24,-23}, {-24,-22}, {-24,-21}, {-24,-20}, {-24,-19}, {-24,-18}, {-24,-17}, {-24,-16}, {-24,-15}, {-24,-14}, {-24,-13}, {-24,-12}, {-24,-7}, {-24,-6}, {-24,-2}, {-24,-1}, {-24,3}, {-24,4}, {-24,8}, {-24,9}, {-24,13}, {-24,14}, {-24,18}, {-24,19}, {-24,24}, {-24,25}, {-24,26}, {-24,27}, {-24,28}, {-24,29}, {-24,30}, {-24,31}, {-24,32}, {-24,33}, {-24,34}, {-24,35}, {-24,36}, {-24,37}, {-24,41}, {-24,45}, {-24,53}, {-24,57}, {-24,68}, {-24,71}, {-24,78}, {-24,85}, {-24,118}, {-24,119}, {-24,125}, {-24,128}, {-24,134}, {-24,138}, {-24,139}, {-24,141}, {-24,142}, {-24,143}, {-24,144}, {-24,145}, {-24,147}, {-23,-73}, {-23,-72}, {-23,-66}, {-23,-65}, {-23,-61}, {-23,-60}, {-23,-26}, {-23,-25}, {-23,-24}, {-23,-23}, {-23,-22}, {-23,-21}, {-23,-20}, {-23,-19}, {-23,-18}, {-23,-17}, {-23,-16}, {-23,-15}, {-23,-14}, {-23,-13}, {-23,-12}, {-23,24}, {-23,25}, {-23,26}, {-23,27}, {-23,28}, {-23,29}, {-23,30}, {-23,31}, {-23,32}, {-23,33}, {-23,34}, {-23,35}, {-23,36}, {-23,37}, {-23,41}, {-23,45}, {-23,53}, {-23,57}, {-23,61}, {-23,62}, {-23,68}, {-23,71}, {-23,78}, {-23,79}, {-23,84}, {-23,85}, {-23,118}, {-23,119}, {-23,128}, {-23,138}, {-23,139}, {-23,147}, {-22,-73}, {-22,-72}, {-22,-66}, {-22,-65}, {-22,-61}, {-22,-60}, {-22,36}, {-22,37}, {-22,41}, {-22,45}, {-22,53}, {-22,57}, {-22,61}, {-22,62}, {-22,68}, {-22,71}, {-22,118}, {-22,119}, {-22,125}, {-22,128}, {-22,134}, {-22,138}, {-22,139}, {-22,140}, {-22,141}, {-22,142}, {-22,143}, {-22,144}, {-22,145}, {-22,147}, {-21,-73}, {-21,-72}, {-21,-66}, {-21,-65}, {-21,-61}, {-21,-60}, {-21,36}, {-21,37}, {-21,38}, {-21,39}, {-21,40}, {-21,41}, {-21,42}, {-21,43}, {-21,44}, {-21,45}, {-21,46}, {-21,47}, {-21,50}, {-21,51}, {-21,52}, {-21,53}, {-21,54}, {-21,55}, {-21,56}, {-21,57}, {-21,58}, {-21,59}, {-21,60}, {-21,61}, {-21,62}, {-21,63}, {-21,64}, {-21,66}, {-21,67}, {-21,68}, {-21,71}, {-21,118}, {-21,119}, {-21,125}, {-21,128}, {-21,134}, {-21,138}, {-21,139}, {-21,141}, {-21,147}, {-20,-73}, {-20,-72}, {-20,-66}, {-20,-65}, {-20,-61}, {-20,-60}, {-20,36}, {-20,37}, {-20,38}, {-20,39}, {-20,40}, {-20,41}, {-20,42}, {-20,43}, {-20,44}, {-20,45}, {-20,46}, {-20,47}, {-20,50}, {-20,51}, {-20,52}, {-20,53}, {-20,54}, {-20,55}, {-20,56}, {-20,57}, {-20,58}, {-20,59}, {-20,60}, {-20,61}, {-20,62}, {-20,63}, {-20,64}, {-20,66}, {-20,67}, {-20,68}, {-20,71}, {-20,118}, {-20,119}, {-20,121}, {-20,122}, {-20,123}, {-20,124}, {-20,125}, {-20,128}, {-20,130}, {-20,131}, {-20,132}, {-20,133}, {-20,134}, {-20,138}, {-20,139}, {-20,141}, {-20,147}, {-19,-73}, {-19,-72}, {-19,-66}, {-19,-65}, {-19,-61}, {-19,-60}, {-19,36}, {-19,37}, {-19,41}, {-19,42}, {-19,55}, {-19,56}, {-19,60}, {-19,61}, {-19,68}, {-19,71}, {-19,118}, {-19,119}, {-19,122}, {-19,125}, {-19,128}, {-19,131}, {-19,134}, {-19,138}, {-19,139}, {-19,141}, {-19,147}, {-18,-73}, {-18,-72}, {-18,-66}, {-18,-65}, {-18,-64}, {-18,-63}, {-18,-62}, {-18,-61}, {-18,-60}, {-18,36}, {-18,37}, {-18,41}, {-18,42}, {-18,68}, {-18,71}, {-18,118}, {-18,119}, {-18,122}, {-18,125}, {-18,128}, {-18,131}, {-18,134}, {-18,138}, {-18,139}, {-18,141}, {-18,147}, {-17,-73}, {-17,-72}, {-17,-66}, {-17,-65}, {-17,-61}, {-17,-60}, {-17,36}, {-17,37}, {-17,41}, {-17,42}, {-17,55}, {-17,56}, {-17,60}, {-17,61}, {-17,68}, {-17,71}, {-17,118}, {-17,119}, {-17,120}, {-17,121}, {-17,122}, {-17,123}, {-17,125}, {-17,128}, {-17,129}, {-17,130}, {-17,131}, {-17,132}, {-17,134}, {-17,138}, {-17,139}, {-17,147}, {-16,-73}, {-16,-72}, {-16,-66}, {-16,-65}, {-16,-61}, {-16,-60}, {-16,31}, {-16,32}, {-16,33}, {-16,34}, {-16,35}, {-16,36}, {-16,37}, {-16,38}, {-16,40}, {-16,41}, {-16,42}, {-16,43}, {-16,44}, {-16,45}, {-16,46}, {-16,47}, {-16,48}, {-16,49}, {-16,50}, {-16,51}, {-16,52}, {-16,53}, {-16,54}, {-16,55}, {-16,56}, {-16,57}, {-16,58}, {-16,59}, {-16,60}, {-16,61}, {-16,68}, {-16,71}, {-16,118}, {-16,119}, {-16,125}, {-16,128}, {-16,134}, {-16,138}, {-16,139}, {-16,141}, {-16,147}, {-15,-73}, {-15,-72}, {-15,-66}, {-15,-65}, {-15,-61}, {-15,-60}, {-15,31}, {-15,33}, {-15,36}, {-15,37}, {-15,38}, {-15,40}, {-15,41}, {-15,42}, {-15,43}, {-15,44}, {-15,45}, {-15,46}, {-15,47}, {-15,48}, {-15,49}, {-15,50}, {-15,51}, {-15,52}, {-15,53}, {-15,54}, {-15,55}, {-15,56}, {-15,57}, {-15,58}, {-15,59}, {-15,60}, {-15,61}, {-15,68}, {-15,71}, {-15,118}, {-15,119}, {-15,125}, {-15,128}, {-15,134}, {-15,138}, {-15,139}, {-15,141}, {-15,147}, {-14,-73}, {-14,-72}, {-14,-66}, {-14,-65}, {-14,-61}, {-14,-60}, {-14,31}, {-14,41}, {-14,42}, {-14,55}, {-14,56}, {-14,68}, {-14,71}, {-14,118}, {-14,119}, {-14,128}, {-14,138}, {-14,139}, {-14,141}, {-14,142}, {-14,143}, {-14,144}, {-14,145}, {-14,146}, {-14,147}, {-13,-73}, {-13,-72}, {-13,-66}, {-13,-65}, {-13,-61}, {-13,-60}, {-13,31}, {-13,33}, {-13,41}, {-13,42}, {-13,55}, {-13,56}, {-13,68}, {-13,71}, {-13,118}, {-13,119}, {-13,125}, {-13,128}, {-13,134}, {-13,138}, {-13,139}, {-13,141}, {-13,147}, {-12,-73}, {-12,-72}, {-12,-66}, {-12,-65}, {-12,-61}, {-12,-60}, {-12,31}, {-12,33}, {-12,37}, {-12,38}, {-12,41}, {-12,42}, {-12,45}, {-12,46}, {-12,51}, {-12,52}, {-12,55}, {-12,56}, {-12,59}, {-12,60}, {-12,68}, {-12,71}, {-12,118}, {-12,119}, {-12,125}, {-12,128}, {-12,134}, {-12,138}, {-12,139}, {-12,141}, {-12,145}, {-12,147}, {-11,-73}, {-11,-72}, {-11,-66}, {-11,-65}, {-11,-61}, {-11,-60}, {-11,31}, {-11,32}, {-11,33}, {-11,37}, {-11,38}, {-11,41}, {-11,42}, {-11,45}, {-11,46}, {-11,51}, {-11,52}, {-11,55}, {-11,56}, {-11,59}, {-11,60}, {-11,68}, {-11,71}, {-11,118}, {-11,119}, {-11,120}, {-11,121}, {-11,122}, {-11,123}, {-11,124}, {-11,125}, {-11,128}, {-11,129}, {-11,130}, {-11,131}, {-11,132}, {-11,133}, {-11,134}, {-11,138}, {-11,139}, {-11,141}, {-11,145}, {-11,147}, {-10,-73}, {-10,-72}, {-10,-66}, {-10,-65}, {-10,-61}, {-10,-60}, {-10,41}, {-10,42}, {-10,55}, {-10,56}, {-10,68}, {-10,71}, {-10,118}, {-10,119}, {-10,125}, {-10,128}, {-10,134}, {-10,138}, {-10,139}, {-10,141}, {-10,145}, {-10,147}, {-9,-73}, {-9,-72}, {-9,-66}, {-9,-65}, {-9,-61}, {-9,-60}, {-9,118}, {-9,119}, {-9,120}, {-9,125}, {-9,128}, {-9,129}, {-9,132}, {-9,133}, {-9,134}, {-9,138}, {-9,139}, {-9,145}, {-9,147}, {-8,-73}, {-8,-72}, {-8,-66}, {-8,-65}, {-8,-61}, {-8,-60}, {-8,118}, {-8,119}, {-8,125}, {-8,128}, {-8,134}, {-8,138}, {-8,139}, {-8,141}, {-8,145}, {-8,147}, {-7,-73}, {-7,-72}, {-7,-66}, {-7,-65}, {-7,-61}, {-7,-60}, {-7,41}, {-7,42}, {-7,55}, {-7,56}, {-7,68}, {-7,71}, {-7,118}, {-7,119}, {-7,128}, {-7,134}, {-7,138}, {-7,139}, {-7,141}, {-7,145}, {-7,147}, {-6,-73}, {-6,-72}, {-6,-66}, {-6,-65}, {-6,-61}, {-6,-60}, {-6,31}, {-6,32}, {-6,33}, {-6,37}, {-6,38}, {-6,41}, {-6,42}, {-6,45}, {-6,46}, {-6,51}, {-6,52}, {-6,55}, {-6,56}, {-6,59}, {-6,60}, {-6,68}, {-6,71}, {-6,118}, {-6,119}, {-6,125}, {-6,128}, {-6,134}, {-6,141}, {-6,142}, {-6,143}, {-6,144}, {-6,145}, {-6,146}, {-6,147}, {-5,-73}, {-5,-72}, {-5,-66}, {-5,-65}, {-5,-61}, {-5,-60}, {-5,31}, {-5,33}, {-5,37}, {-5,38}, {-5,41}, {-5,42}, {-5,45}, {-5,46}, {-5,51}, {-5,52}, {-5,55}, {-5,56}, {-5,59}, {-5,60}, {-5,68}, {-5,69}, {-5,70}, {-5,71}, {-5,72}, {-5,73}, {-5,75}, {-5,76}, {-5,77}, {-5,118}, {-5,119}, {-5,125}, {-5,128}, {-5,134}, {-5,141}, {-5,147}, {-4,-73}, {-4,-72}, {-4,-66}, {-4,-65}, {-4,-61}, {-4,-60}, {-4,31}, {-4,33}, {-4,41}, {-4,42}, {-4,55}, {-4,56}, {-4,68}, {-4,71}, {-4,77}, {-4,90}, {-4,91}, {-4,92}, {-4,93}, {-4,94}, {-4,95}, {-4,96}, {-4,97}, {-4,98}, {-4,99}, {-4,100}, {-4,101}, {-4,102}, {-4,103}, {-4,104}, {-4,105}, {-4,106}, {-4,107}, {-4,108}, {-4,109}, {-4,110}, {-4,111}, {-4,112}, {-4,113}, {-4,114}, {-4,115}, {-4,116}, {-4,117}, {-4,118}, {-4,119}, {-4,125}, {-4,128}, {-4,134}, {-4,138}, {-4,139}, {-4,141}, {-4,147}, {-3,-73}, {-3,-72}, {-3,-66}, {-3,-65}, {-3,-61}, {-3,-60}, {-3,31}, {-3,41}, {-3,42}, {-3,55}, {-3,56}, {-3,68}, {-3,90}, {-3,91}, {-3,92}, {-3,93}, {-3,94}, {-3,95}, {-3,96}, {-3,97}, {-3,98}, {-3,99}, {-3,100}, {-3,101}, {-3,102}, {-3,103}, {-3,104}, {-3,105}, {-3,106}, {-3,107}, {-3,108}, {-3,109}, {-3,110}, {-3,111}, {-3,112}, {-3,113}, {-3,114}, {-3,115}, {-3,116}, {-3,117}, {-3,118}, {-3,119}, {-3,120}, {-3,121}, {-3,122}, {-3,123}, {-3,124}, {-3,125}, {-3,128}, {-3,129}, {-3,131}, {-3,132}, {-3,133}, {-3,134}, {-3,138}, {-3,139}, {-3,147}, {-2,-73}, {-2,-72}, {-2,-66}, {-2,-65}, {-2,-61}, {-2,-60}, {-2,31}, {-2,33}, {-2,36}, {-2,37}, {-2,38}, {-2,39}, {-2,40}, {-2,41}, {-2,42}, {-2,43}, {-2,44}, {-2,45}, {-2,46}, {-2,47}, {-2,50}, {-2,51}, {-2,52}, {-2,53}, {-2,54}, {-2,55}, {-2,56}, {-2,57}, {-2,58}, {-2,59}, {-2,60}, {-2,61}, {-2,68}, {-2,71}, {-2,90}, {-2,91}, {-2,94}, {-2,119}, {-2,125}, {-2,128}, {-2,134}, {-2,138}, {-2,139}, {-2,141}, {-2,147}, {-1,-73}, {-1,-72}, {-1,-66}, {-1,-65}, {-1,-64}, {-1,-62}, {-1,-61}, {-1,-60}, {-1,31}, {-1,32}, {-1,33}, {-1,34}, {-1,35}, {-1,36}, {-1,37}, {-1,38}, {-1,39}, {-1,40}, {-1,41}, {-1,42}, {-1,43}, {-1,44}, {-1,45}, {-1,46}, {-1,47}, {-1,50}, {-1,51}, {-1,52}, {-1,53}, {-1,54}, {-1,55}, {-1,56}, {-1,57}, {-1,58}, {-1,59}, {-1,60}, {-1,61}, {-1,68}, {-1,71}, {-1,72}, {-1,73}, {-1,75}, {-1,76}, {-1,77}, {-1,90}, {-1,91}, {-1,94}, {-1,125}, {-1,134}, {-1,138}, {-1,139}, {-1,141}, {-1,147}, {0,-73}, {0,-72}, {0,-66}, {0,-65}, {0,-61}, {0,-60}, {0,36}, {0,37}, {0,41}, {0,42}, {0,55}, {0,56}, {0,60}, {0,61}, {0,68}, {0,71}, {0,77}, {0,90}, {0,91}, {0,94}, {0,96}, {0,97}, {0,98}, {0,99}, {0,100}, {0,101}, {0,102}, {0,104}, {0,105}, {0,106}, {0,107}, {0,108}, {0,109}, {0,110}, {0,111}, {0,113}, {0,114}, {0,115}, {0,116}, {0,119}, {0,125}, {0,128}, {0,134}, {0,138}, {0,139}, {0,141}, {0,147}, {1,-73}, {1,-72}, {1,-66}, {1,-65}, {1,-61}, {1,-60}, {1,36}, {1,37}, {1,60}, {1,61}, {1,68}, {1,71}, {1,77}, {1,90}, {1,91}, {1,94}, {1,99}, {1,102}, {1,108}, {1,111}, {1,116}, {1,119}, {1,120}, {1,122}, {1,123}, {1,124}, {1,125}, {1,128}, {1,129}, {1,130}, {1,131}, {1,132}, {1,133}, {1,134}, {1,138}, {1,139}, {1,141}, {1,147}, {2,-73}, {2,-72}, {2,-66}, {2,-65}, {2,-61}, {2,-60}, {2,36}, {2,37}, {2,41}, {2,42}, {2,55}, {2,56}, {2,60}, {2,61}, {2,68}, {2,71}, {2,77}, {2,90}, {2,91}, {2,94}, {2,102}, {2,111}, {2,116}, {2,119}, {2,125}, {2,128}, {2,134}, {2,138}, {2,139}, {2,141}, {2,142}, {2,143}, {2,144}, {2,145}, {2,147}, {3,-73}, {3,-72}, {3,-66}, {3,-65}, {3,-61}, {3,-60}, {3,36}, {3,37}, {3,38}, {3,39}, {3,40}, {3,41}, {3,42}, {3,43}, {3,44}, {3,45}, {3,46}, {3,47}, {3,48}, {3,49}, {3,50}, {3,51}, {3,52}, {3,54}, {3,55}, {3,56}, {3,57}, {3,58}, {3,59}, {3,60}, {3,61}, {3,62}, {3,63}, {3,64}, {3,65}, {3,66}, {3,67}, {3,68}, {3,69}, {3,70}, {3,71}, {3,72}, {3,73}, {3,74}, {3,75}, {3,76}, {3,77}, {3,78}, {3,79}, {3,80}, {3,81}, {3,82}, {3,83}, {3,84}, {3,85}, {3,86}, {3,87}, {3,88}, {3,89}, {3,90}, {3,91}, {3,94}, {3,99}, {3,102}, {3,108}, {3,111}, {3,116}, {3,119}, {3,125}, {3,128}, {3,138}, {3,139}, {3,141}, {3,147}, {4,-73}, {4,-72}, {4,-66}, {4,-65}, {4,36}, {4,37}, {4,38}, {4,39}, {4,40}, {4,41}, {4,42}, {4,43}, {4,44}, {4,45}, {4,46}, {4,47}, {4,48}, {4,49}, {4,50}, {4,51}, {4,52}, {4,54}, {4,55}, {4,56}, {4,57}, {4,58}, {4,59}, {4,60}, {4,61}, {4,62}, {4,63}, {4,64}, {4,65}, {4,66}, {4,67}, {4,68}, {4,69}, {4,70}, {4,71}, {4,72}, {4,73}, {4,74}, {4,75}, {4,76}, {4,77}, {4,78}, {4,79}, {4,80}, {4,81}, {4,82}, {4,83}, {4,84}, {4,85}, {4,86}, {4,87}, {4,88}, {4,89}, {4,90}, {4,91}, {4,94}, {4,95}, {4,96}, {4,97}, {4,98}, {4,99}, {4,100}, {4,101}, {4,102}, {4,103}, {4,104}, {4,105}, {4,106}, {4,107}, {4,108}, {4,109}, {4,110}, {4,111}, {4,112}, {4,113}, {4,114}, {4,115}, {4,116}, {4,119}, {4,120}, {4,121}, {4,122}, {4,123}, {4,124}, {4,125}, {4,128}, {4,129}, {4,130}, {4,131}, {4,132}, {4,133}, {4,134}, {4,135}, {4,136}, {4,137}, {4,138}, {4,139}, {4,141}, {4,142}, {4,143}, {4,144}, {4,145}, {4,146}, {4,147}, {5,-73}, {5,-72}, {5,-66}, {5,-65}, {5,-61}, {5,-60}, {5,36}, {5,37}, {5,38}, {5,39}, {5,40}, {5,41}, {5,42}, {5,43}, {5,44}, {5,45}, {5,46}, {5,47}, {5,48}, {5,49}, {5,50}, {5,51}, {5,52}, {5,54}, {5,55}, {5,56}, {5,57}, {5,58}, {5,59}, {5,60}, {5,61}, {5,77}, {5,85}, {5,91}, {5,134}, {5,138}, {5,139}, {5,141}, {5,147}, {6,-73}, {6,-72}, {6,-66}, {6,-65}, {6,-61}, {6,-60}, {6,36}, {6,37}, {6,50}, {6,51}, {6,55}, {6,60}, {6,61}, {6,77}, {6,138}, {6,139}, {6,147}, {7,-73}, {7,-72}, {7,-66}, {7,-65}, {7,-61}, {7,-60}, {7,36}, {7,37}, {7,60}, {7,61}, {7,66}, {7,77}, {7,85}, {7,91}, {7,134}, {7,138}, {7,139}, {7,141}, {7,147}, {8,-73}, {8,-72}, {8,-66}, {8,-65}, {8,-61}, {8,-60}, {8,36}, {8,37}, {8,60}, {8,61}, {8,66}, {8,67}, {8,68}, {8,69}, {8,70}, {8,72}, {8,73}, {8,74}, {8,75}, {8,76}, {8,77}, {8,78}, {8,79}, {8,80}, {8,81}, {8,82}, {8,83}, {8,84}, {8,85}, {8,86}, {8,87}, {8,88}, {8,89}, {8,90}, {8,91}, {8,92}, {8,94}, {8,95}, {8,96}, {8,97}, {8,98}, {8,99}, {8,100}, {8,101}, {8,102}, {8,103}, {8,104}, {8,105}, {8,106}, {8,107}, {8,109}, {8,110}, {8,111}, {8,112}, {8,114}, {8,115}, {8,116}, {8,117}, {8,118}, {8,119}, {8,120}, {8,122}, {8,123}, {8,124}, {8,125}, {8,126}, {8,127}, {8,128}, {8,130}, {8,131}, {8,132}, {8,133}, {8,134}, {8,135}, {8,137}, {8,138}, {8,139}, {8,140}, {8,141}, {8,142}, {8,143}, {8,144}, {8,145}, {8,146}, {8,147}, {9,-73}, {9,-72}, {9,-66}, {9,-65}, {9,-61}, {9,-60}, {9,36}, {9,37}, {9,50}, {9,51}, {9,55}, {9,60}, {9,61}, {9,66}, {9,75}, {9,85}, {9,91}, {9,101}, {9,106}, {9,110}, {9,116}, {9,118}, {9,124}, {9,126}, {9,132}, {9,134}, {9,138}, {9,139}, {10,-73}, {10,-72}, {10,-66}, {10,-65}, {10,-64}, {10,-63}, {10,-62}, {10,-61}, {10,-60}, {10,-59}, {10,-58}, {10,-57}, {10,-56}, {10,-55}, {10,-54}, {10,-53}, {10,-52}, {10,-50}, {10,-49}, {10,-48}, {10,-47}, {10,-46}, {10,-45}, {10,-44}, {10,-43}, {10,-41}, {10,-40}, {10,-39}, {10,-38}, {10,-37}, {10,-36}, {10,-35}, {10,-34}, {10,-33}, {10,-32}, {10,-31}, {10,-30}, {10,-29}, {10,-28}, {10,-27}, {10,-26}, {10,-25}, {10,-24}, {10,-23}, {10,-22}, {10,-21}, {10,-20}, {10,-19}, {10,-18}, {10,-17}, {10,-16}, {10,-15}, {10,-14}, {10,-13}, {10,-12}, {10,-11}, {10,-10}, {10,-9}, {10,-8}, {10,-7}, {10,-6}, {10,-5}, {10,-4}, {10,-3}, {10,-2}, {10,-1}, {10,0}, {10,1}, {10,2}, {10,3}, {10,4}, {10,5}, {10,6}, {10,7}, {10,8}, {10,9}, {10,10}, {10,11}, {10,12}, {10,13}, {10,14}, {10,15}, {10,16}, {10,17}, {10,18}, {10,19}, {10,20}, {10,21}, {10,22}, {10,23}, {10,24}, {10,25}, {10,26}, {10,27}, {10,28}, {10,29}, {10,30}, {10,31}, {10,32}, {10,33}, {10,34}, {10,35}, {10,36}, {10,37}, {10,38}, {10,39}, {10,40}, {10,41}, {10,42}, {10,43}, {10,44}, {10,45}, {10,46}, {10,47}, {10,48}, {10,49}, {10,50}, {10,51}, {10,52}, {10,54}, {10,55}, {10,56}, {10,57}, {10,58}, {10,59}, {10,60}, {10,61}, {10,66}, {10,75}, {10,85}, {10,91}, {10,101}, {10,106}, {10,110}, {10,116}, {10,118}, {10,124}, {10,126}, {10,132}, {10,134}, {10,138}, {10,139}, {11,-73}, {11,-72}, {11,-66}, {11,-65}, {11,-64}, {11,-63}, {11,-62}, {11,-61}, {11,-60}, {11,-59}, {11,-58}, {11,-57}, {11,-56}, {11,-55}, {11,-54}, {11,-53}, {11,-52}, {11,-50}, {11,-49}, {11,-48}, {11,-47}, {11,-46}, {11,-45}, {11,-44}, {11,-43}, {11,-41}, {11,-40}, {11,-39}, {11,-38}, {11,-37}, {11,-36}, {11,-35}, {11,-34}, {11,-33}, {11,-32}, {11,-31}, {11,-30}, {11,-29}, {11,-28}, {11,-27}, {11,-26}, {11,-25}, {11,-24}, {11,-23}, {11,-22}, {11,-21}, {11,-20}, {11,-19}, {11,-18}, {11,-17}, {11,-16}, {11,-15}, {11,-14}, {11,-13}, {11,-12}, {11,-11}, {11,-10}, {11,-9}, {11,-8}, {11,-7}, {11,-6}, {11,-5}, {11,-4}, {11,-3}, {11,-2}, {11,-1}, {11,0}, {11,1}, {11,2}, {11,3}, {11,4}, {11,5}, {11,6}, {11,7}, {11,8}, {11,9}, {11,10}, {11,11}, {11,12}, {11,13}, {11,14}, {11,15}, {11,16}, {11,17}, {11,18}, {11,19}, {11,20}, {11,21}, {11,22}, {11,23}, {11,24}, {11,25}, {11,26}, {11,27}, {11,28}, {11,29}, {11,30}, {11,31}, {11,32}, {11,33}, {11,34}, {11,35}, {11,36}, {11,37}, {11,38}, {11,39}, {11,40}, {11,41}, {11,42}, {11,43}, {11,44}, {11,45}, {11,46}, {11,47}, {11,48}, {11,49}, {11,50}, {11,51}, {11,52}, {11,54}, {11,55}, {11,56}, {11,57}, {11,58}, {11,59}, {11,60}, {11,61}, {11,62}, {11,63}, {11,64}, {11,65}, {11,66}, {11,68}, {11,69}, {11,70}, {11,71}, {11,72}, {11,74}, {11,75}, {11,85}, {11,86}, {11,87}, {11,88}, {11,90}, {11,91}, {11,92}, {11,93}, {11,94}, {11,96}, {11,97}, {11,98}, {11,99}, {11,100}, {11,101}, {11,102}, {11,104}, {11,105}, {11,106}, {11,110}, {11,116}, {11,118}, {11,124}, {11,126}, {11,132}, {11,134}, {11,138}, {11,139}, {12,-73}, {12,-72}, {12,-66}, {12,-65}, {12,-52}, {12,-50}, {12,-30}, {12,-29}, {12,-22}, {12,-21}, {12,-7}, {12,-6}, {12,1}, {12,2}, {12,23}, {12,24}, {12,46}, {12,50}, {12,51}, {12,71}, {12,91}, {12,101}, {12,106}, {12,110}, {12,118}, {12,126}, {12,134}, {12,138}, {12,139}, {13,-73}, {13,-72}, {13,-66}, {13,-65}, {13,-50}, {13,-30}, {13,-29}, {13,-22}, {13,-21}, {13,-7}, {13,-6}, {13,1}, {13,2}, {13,23}, {13,24}, {13,50}, {13,51}, {13,71}, {13,91}, {13,101}, {13,106}, {13,110}, {13,116}, {13,118}, {13,124}, {13,126}, {13,132}, {13,134}, {13,138}, {13,139}, {14,-79}, {14,-78}, {14,-77}, {14,-76}, {14,-75}, {14,-74}, {14,-73}, {14,-72}, {14,-66}, {14,-65}, {14,-52}, {14,-50}, {14,-30}, {14,-29}, {14,-22}, {14,-21}, {14,-7}, {14,-6}, {14,1}, {14,2}, {14,23}, {14,24}, {14,46}, {14,50}, {14,51}, {14,52}, {14,54}, {14,55}, {14,56}, {14,57}, {14,58}, {14,59}, {14,60}, {14,61}, {14,62}, {14,63}, {14,64}, {14,66}, {14,67}, {14,68}, {14,69}, {14,70}, {14,71}, {14,91}, {14,106}, {14,110}, {14,111}, {14,112}, {14,113}, {14,114}, {14,115}, {14,116}, {14,117}, {14,118}, {14,119}, {14,120}, {14,121}, {14,122}, {14,123}, {14,124}, {14,125}, {14,126}, {14,127}, {14,128}, {14,129}, {14,130}, {14,131}, {14,132}, {14,133}, {14,134}, {14,138}, {14,139}, {15,-87}, {15,-86}, {15,-85}, {15,-84}, {15,-83}, {15,-82}, {15,-81}, {15,-80}, {15,-79}, {15,-78}, {15,-77}, {15,-76}, {15,-75}, {15,-74}, {15,-73}, {15,-72}, {15,-66}, {15,-65}, {15,-64}, {15,-63}, {15,-62}, {15,-61}, {15,-60}, {15,-59}, {15,-58}, {15,-57}, {15,-56}, {15,-55}, {15,-54}, {15,-53}, {15,-52}, {15,-50}, {15,-49}, {15,-48}, {15,-47}, {15,-46}, {15,-45}, {15,-44}, {15,-43}, {15,-42}, {15,-41}, {15,-40}, {15,-39}, {15,-38}, {15,-37}, {15,-36}, {15,-35}, {15,-34}, {15,-33}, {15,-32}, {15,-31}, {15,-30}, {15,-29}, {15,-28}, {15,-27}, {15,-26}, {15,-25}, {15,-24}, {15,-22}, {15,-21}, {15,-20}, {15,-19}, {15,-18}, {15,-17}, {15,-16}, {15,-13}, {15,-12}, {15,-11}, {15,-10}, {15,-9}, {15,-8}, {15,-7}, {15,-6}, {15,-5}, {15,-4}, {15,-3}, {15,-2}, {15,0}, {15,1}, {15,2}, {15,3}, {15,4}, {15,5}, {15,6}, {15,7}, {15,8}, {15,9}, {15,10}, {15,11}, {15,12}, {15,13}, {15,14}, {15,17}, {15,18}, {15,19}, {15,20}, {15,21}, {15,22}, {15,23}, {15,24}, {15,25}, {15,26}, {15,27}, {15,28}, {15,29}, {15,30}, {15,33}, {15,34}, {15,35}, {15,36}, {15,37}, {15,38}, {15,39}, {15,40}, {15,41}, {15,42}, {15,43}, {15,44}, {15,45}, {15,46}, {15,50}, {15,51}, {15,55}, {15,63}, {15,67}, {15,71}, {15,91}, {15,101}, {15,106}, {15,138}, {15,139}, {16,-87}, {16,-86}, {16,-85}, {16,-84}, {16,-83}, {16,-82}, {16,-81}, {16,-80}, {16,-79}, {16,-78}, {16,-77}, {16,-76}, {16,-75}, {16,-74}, {16,-73}, {16,-72}, {16,-66}, {16,-65}, {16,-64}, {16,-63}, {16,-62}, {16,-61}, {16,-60}, {16,-59}, {16,-58}, {16,-57}, {16,-56}, {16,-55}, {16,-54}, {16,-53}, {16,-52}, {16,-50}, {16,-49}, {16,-48}, {16,-47}, {16,-46}, {16,-45}, {16,-44}, {16,-43}, {16,-42}, {16,-41}, {16,-40}, {16,-39}, {16,-38}, {16,-37}, {16,-36}, {16,-35}, {16,-34}, {16,-33}, {16,-32}, {16,-31}, {16,-30}, {16,-29}, {16,-28}, {16,-27}, {16,-26}, {16,-25}, {16,-24}, {16,-22}, {16,-21}, {16,-20}, {16,-19}, {16,-18}, {16,-17}, {16,-16}, {16,-13}, {16,-12}, {16,-11}, {16,-10}, {16,-9}, {16,-8}, {16,-7}, {16,-6}, {16,-5}, {16,-4}, {16,-3}, {16,-2}, {16,0}, {16,1}, {16,2}, {16,3}, {16,4}, {16,5}, {16,6}, {16,7}, {16,8}, {16,9}, {16,10}, {16,11}, {16,12}, {16,13}, {16,14}, {16,17}, {16,18}, {16,19}, {16,20}, {16,21}, {16,22}, {16,23}, {16,24}, {16,25}, {16,26}, {16,27}, {16,28}, {16,29}, {16,30}, {16,33}, {16,34}, {16,35}, {16,36}, {16,37}, {16,38}, {16,39}, {16,40}, {16,41}, {16,42}, {16,43}, {16,44}, {16,45}, {16,46}, {16,50}, {16,51}, {16,55}, {16,67}, {16,71}, {16,101}, {16,106}, {16,138}, {16,139}, {17,-86}, {17,-7}, {17,-6}, {17,1}, {17,2}, {17,45}, {17,46}, {17,50}, {17,51}, {17,55}, {17,63}, {17,67}, {17,71}, {17,91}, {17,101}, {17,106}, {17,138}, {17,139}, {18,-86}, {18,-7}, {18,-6}, {18,1}, {18,2}, {18,45}, {18,46}, {18,50}, {18,51}, {18,55}, {18,63}, {18,67}, {18,71}, {18,91}, {18,101}, {18,106}, {18,110}, {18,111}, {18,112}, {18,114}, {18,115}, {18,116}, {18,117}, {18,118}, {18,119}, {18,120}, {18,122}, {18,123}, {18,124}, {18,125}, {18,126}, {18,127}, {18,128}, {18,130}, {18,131}, {18,132}, {18,133}, {18,134}, {18,138}, {18,139}, {19,-86}, {19,-8}, {19,-7}, {19,-6}, {19,-5}, {19,-4}, {19,-3}, {19,-2}, {19,0}, {19,1}, {19,2}, {19,5}, {19,6}, {19,9}, {19,10}, {19,13}, {19,14}, {19,17}, {19,18}, {19,21}, {19,22}, {19,25}, {19,26}, {19,29}, {19,30}, {19,33}, {19,34}, {19,37}, {19,38}, {19,41}, {19,42}, {19,45}, {19,46}, {19,50}, {19,51}, {19,55}, {19,63}, {19,67}, {19,71}, {19,91}, {19,101}, {19,106}, {19,110}, {19,116}, {19,118}, {19,124}, {19,126}, {19,132}, {19,134}, {19,138}, {19,139}, {20,-86}, {20,-85}, {20,-84}, {20,-8}, {20,-7}, {20,-6}, {20,-5}, {20,-4}, {20,-3}, {20,-2}, {20,0}, {20,1}, {20,2}, {20,5}, {20,6}, {20,9}, {20,10}, {20,13}, {20,14}, {20,17}, {20,18}, {20,21}, {20,22}, {20,25}, {20,26}, {20,29}, {20,30}, {20,33}, {20,34}, {20,37}, {20,38}, {20,41}, {20,42}, {20,45}, {20,46}, {20,50}, {20,51}, {20,55}, {20,63}, {20,64}, {20,65}, {20,66}, {20,67}, {20,71}, {20,91}, {20,101}, {20,106}, {20,110}, {20,116}, {20,118}, {20,124}, {20,126}, {20,132}, {20,134}, {20,138}, {20,139}, {21,-86}, {21,-85}, {21,-84}, {21,-66}, {21,-65}, {21,-64}, {21,-63}, {21,-62}, {21,-61}, {21,-60}, {21,-59}, {21,-58}, {21,-57}, {21,-56}, {21,-55}, {21,-54}, {21,-53}, {21,-52}, {21,-51}, {21,-50}, {21,-49}, {21,-48}, {21,-47}, {21,-46}, {21,-45}, {21,-44}, {21,-43}, {21,1}, {21,2}, {21,45}, {21,46}, {21,50}, {21,51}, {21,55}, {21,63}, {21,67}, {21,71}, {21,72}, {21,74}, {21,75}, {21,85}, {21,86}, {21,87}, {21,88}, {21,90}, {21,91}, {21,96}, {21,97}, {21,98}, {21,99}, {21,100}, {21,101}, {21,102}, {21,106}, {21,110}, {21,116}, {21,118}, {21,124}, {21,126}, {21,132}, {21,134}, {21,138}, {21,139}, {22,-85}, {22,-84}, {22,-66}, {22,-65}, {22,-64}, {22,-63}, {22,-62}, {22,-61}, {22,-60}, {22,-59}, {22,-58}, {22,-57}, {22,-56}, {22,-55}, {22,-54}, {22,-53}, {22,-52}, {22,-51}, {22,-50}, {22,-49}, {22,-48}, {22,-47}, {22,-46}, {22,-45}, {22,-44}, {22,-43}, {22,1}, {22,2}, {22,45}, {22,46}, {22,50}, {22,51}, {22,55}, {22,56}, {22,58}, {22,59}, {22,60}, {22,61}, {22,62}, {22,63}, {22,67}, {22,71}, {22,75}, {22,85}, {22,91}, {22,101}, {22,106}, {22,110}, {22,118}, {22,126}, {22,134}, {22,138}, {22,139}, {23,-85}, {23,-84}, {23,-66}, {23,-65}, {23,-64}, {23,-63}, {23,-62}, {23,-61}, {23,-60}, {23,-59}, {23,-58}, {23,-57}, {23,-56}, {23,-55}, {23,-54}, {23,-53}, {23,-52}, {23,-51}, {23,-50}, {23,-49}, {23,-48}, {23,-47}, {23,-46}, {23,-45}, {23,-44}, {23,-43}, {23,-7}, {23,-6}, {23,-3}, {23,-2}, {23,1}, {23,2}, {23,5}, {23,6}, {23,9}, {23,10}, {23,13}, {23,14}, {23,17}, {23,18}, {23,21}, {23,22}, {23,25}, {23,26}, {23,29}, {23,30}, {23,33}, {23,34}, {23,37}, {23,38}, {23,41}, {23,42}, {23,45}, {23,46}, {23,50}, {23,51}, {23,55}, {23,63}, {23,67}, {23,71}, {23,75}, {23,85}, {23,91}, {23,101}, {23,106}, {23,110}, {23,116}, {23,118}, {23,124}, {23,126}, {23,132}, {23,134}, {23,138}, {23,139}, {24,-85}, {24,-84}, {24,-66}, {24,-65}, {24,-64}, {24,-63}, {24,-62}, {24,-61}, {24,-60}, {24,-59}, {24,-58}, {24,-57}, {24,-56}, {24,-55}, {24,-54}, {24,-53}, {24,-52}, {24,-51}, {24,-50}, {24,-49}, {24,-48}, {24,-47}, {24,-46}, {24,-45}, {24,-44}, {24,-43}, {24,-7}, {24,-6}, {24,-3}, {24,-2}, {24,1}, {24,2}, {24,5}, {24,6}, {24,9}, {24,10}, {24,13}, {24,14}, {24,17}, {24,18}, {24,21}, {24,22}, {24,25}, {24,26}, {24,29}, {24,30}, {24,33}, {24,34}, {24,37}, {24,38}, {24,41}, {24,42}, {24,45}, {24,46}, {24,50}, {24,51}, {24,52}, {24,53}, {24,54}, {24,55}, {24,63}, {24,64}, {24,66}, {24,67}, {24,68}, {24,69}, {24,70}, {24,71}, {24,72}, {24,73}, {24,74}, {24,75}, {24,76}, {24,77}, {24,78}, {24,79}, {24,80}, {24,81}, {24,82}, {24,83}, {24,84}, {24,85}, {24,86}, {24,87}, {24,88}, {24,90}, {24,91}, {24,92}, {24,93}, {24,94}, {24,95}, {24,96}, {24,97}, {24,98}, {24,99}, {24,100}, {24,101}, {24,102}, {24,103}, {24,104}, {24,105}, {24,106}, {24,110}, {24,111}, {24,112}, {24,113}, {24,115}, {24,116}, {24,117}, {24,118}, {24,119}, {24,120}, {24,121}, {24,123}, {24,124}, {24,125}, {24,126}, {24,127}, {24,128}, {24,129}, {24,131}, {24,132}, {24,133}, {24,134}, {24,138}, {24,139}, {25,-85}, {25,-84}, {25,-83}, {25,-67}, {25,-66}, {25,-65}, {25,-64}, {25,-63}, {25,-62}, {25,-61}, {25,-60}, {25,-59}, {25,-58}, {25,-57}, {25,-56}, {25,-55}, {25,-54}, {25,-53}, {25,-52}, {25,-51}, {25,-50}, {25,-49}, {25,-48}, {25,-47}, {25,-46}, {25,-45}, {25,-44}, {25,-43}, {25,-42}, {25,1}, {25,2}, {25,45}, {25,46}, {25,50}, {25,51}, {25,55}, {25,63}, {25,75}, {25,80}, {25,95}, {25,106}, {25,110}, {25,118}, {25,126}, {25,134}, {25,138}, {25,139}, {26,-84}, {26,-83}, {26,-66}, {26,-65}, {26,-64}, {26,-63}, {26,-62}, {26,-61}, {26,-60}, {26,-59}, {26,-58}, {26,-57}, {26,-56}, {26,-55}, {26,-54}, {26,-53}, {26,-52}, {26,-51}, {26,-50}, {26,-49}, {26,-48}, {26,-47}, {26,-46}, {26,-45}, {26,-44}, {26,-43}, {26,1}, {26,2}, {26,45}, {26,46}, {26,63}, {26,80}, {26,95}, {26,110}, {26,118}, {26,126}, {26,134}, {26,138}, {26,139}, {27,-84}, {27,-83}, {27,-66}, {27,-65}, {27,-64}, {27,-63}, {27,-62}, {27,-61}, {27,-60}, {27,-59}, {27,-58}, {27,-57}, {27,-56}, {27,-55}, {27,-54}, {27,-53}, {27,-52}, {27,-51}, {27,-50}, {27,-49}, {27,-48}, {27,-47}, {27,-46}, {27,-45}, {27,-44}, {27,-43}, {27,-7}, {27,-6}, {27,-3}, {27,-2}, {27,1}, {27,2}, {27,5}, {27,6}, {27,9}, {27,10}, {27,13}, {27,14}, {27,17}, {27,18}, {27,21}, {27,22}, {27,25}, {27,26}, {27,29}, {27,30}, {27,33}, {27,34}, {27,37}, {27,38}, {27,41}, {27,42}, {27,45}, {27,46}, {27,50}, {27,51}, {27,55}, {27,63}, {27,75}, {27,80}, {27,95}, {27,106}, {27,110}, {27,118}, {27,126}, {27,134}, {27,138}, {27,139}, {28,-84}, {28,-83}, {28,-82}, {28,-67}, {28,-66}, {28,-65}, {28,-64}, {28,-63}, {28,-62}, {28,-61}, {28,-60}, {28,-59}, {28,-58}, {28,-57}, {28,-56}, {28,-55}, {28,-54}, {28,-53}, {28,-52}, {28,-51}, {28,-50}, {28,-49}, {28,-48}, {28,-47}, {28,-46}, {28,-45}, {28,-44}, {28,-43}, {28,-42}, {28,-7}, {28,-6}, {28,-3}, {28,-2}, {28,1}, {28,2}, {28,5}, {28,6}, {28,9}, {28,10}, {28,13}, {28,14}, {28,17}, {28,18}, {28,21}, {28,22}, {28,25}, {28,26}, {28,29}, {28,30}, {28,33}, {28,34}, {28,37}, {28,38}, {28,41}, {28,42}, {28,45}, {28,46}, {28,50}, {28,51}, {28,52}, {28,53}, {28,54}, {28,55}, {28,56}, {28,57}, {28,58}, {28,59}, {28,60}, {28,61}, {28,62}, {28,63}, {28,64}, {28,65}, {28,66}, {28,67}, {28,68}, {28,69}, {28,70}, {28,71}, {28,72}, {28,73}, {28,74}, {28,75}, {28,76}, {28,77}, {28,78}, {28,79}, {28,80}, {28,81}, {28,82}, {28,83}, {28,84}, {28,85}, {28,86}, {28,87}, {28,88}, {28,89}, {28,90}, {28,91}, {28,92}, {28,93}, {28,94}, {28,95}, {28,96}, {28,97}, {28,98}, {28,99}, {28,100}, {28,101}, {28,102}, {28,103}, {28,104}, {28,105}, {28,106}, {28,107}, {28,108}, {28,109}, {28,110}, {28,111}, {28,112}, {28,113}, {28,114}, {28,115}, {28,116}, {28,117}, {28,118}, {28,119}, {28,120}, {28,121}, {28,122}, {28,123}, {28,124}, {28,125}, {28,126}, {28,127}, {28,128}, {28,129}, {28,130}, {28,131}, {28,132}, {28,133}, {28,134}, {28,135}, {28,136}, {28,137}, {28,138}, {28,139}, {29,-84}, {29,-83}, {29,-82}, {29,-66}, {29,-65}, {29,-64}, {29,-63}, {29,-46}, {29,-45}, {29,-44}, {29,-43}, {29,50}, {29,51}, {30,-83}, {30,-82}, {30,-66}, {30,-65}, {30,-64}, {30,-63}, {30,-46}, {30,-45}, {30,-44}, {30,-43}, {30,50}, {30,51}, {31,-83}, {31,-82}, {31,-67}, {31,-66}, {31,-65}, {31,-64}, {31,-63}, {31,-46}, {31,-45}, {31,-44}, {31,-43}, {31,-42}, {31,-7}, {31,-6}, {31,-3}, {31,-2}, {31,1}, {31,2}, {31,5}, {31,6}, {31,9}, {31,10}, {31,13}, {31,14}, {31,17}, {31,18}, {31,21}, {31,22}, {31,25}, {31,26}, {31,29}, {31,30}, {31,33}, {31,34}, {31,37}, {31,38}, {31,41}, {31,42}, {31,45}, {31,46}, {31,50}, {31,51}, {32,-83}, {32,-82}, {32,-81}, {32,-66}, {32,-65}, {32,-64}, {32,-63}, {32,-46}, {32,-45}, {32,-44}, {32,-43}, {32,-7}, {32,-6}, {32,-3}, {32,-2}, {32,1}, {32,2}, {32,5}, {32,6}, {32,9}, {32,10}, {32,13}, {32,14}, {32,17}, {32,18}, {32,21}, {32,22}, {32,25}, {32,26}, {32,29}, {32,30}, {32,33}, {32,34}, {32,37}, {32,38}, {32,41}, {32,42}, {32,45}, {32,46}, {32,50}, {32,51}, {33,-82}, {33,-81}, {33,-66}, {33,-65}, {33,-64}, {33,-63}, {33,-59}, {33,-58}, {33,-57}, {33,-52}, {33,-51}, {33,-50}, {33,-46}, {33,-45}, {33,-44}, {33,-43}, {33,1}, {33,2}, {33,45}, {33,46}, {33,50}, {33,51}, {34,-82}, {34,-81}, {34,-67}, {34,-66}, {34,-65}, {34,-64}, {34,-63}, {34,-59}, {34,-58}, {34,-57}, {34,-52}, {34,-51}, {34,-50}, {34,-46}, {34,-45}, {34,-44}, {34,-43}, {34,-42}, {34,1}, {34,2}, {34,45}, {34,46}, {34,50}, {34,51}, {34,57}, {34,58}, {34,59}, {34,60}, {34,61}, {34,62}, {34,63}, {34,64}, {34,65}, {34,66}, {34,67}, {34,68}, {34,69}, {34,70}, {34,71}, {34,72}, {34,73}, {34,74}, {34,75}, {34,76}, {34,77}, {34,78}, {34,79}, {34,80}, {34,81}, {34,82}, {34,83}, {34,84}, {34,85}, {34,86}, {34,87}, {34,88}, {34,89}, {34,90}, {34,91}, {34,92}, {34,93}, {34,94}, {34,95}, {34,96}, {34,97}, {34,98}, {34,99}, {34,100}, {34,101}, {34,102}, {34,103}, {34,104}, {34,105}, {34,106}, {34,107}, {34,108}, {34,109}, {34,110}, {34,111}, {34,112}, {34,113}, {34,114}, {34,115}, {34,116}, {34,117}, {34,118}, {34,119}, {34,120}, {34,121}, {34,122}, {34,123}, {34,124}, {34,125}, {34,126}, {34,127}, {34,128}, {34,129}, {34,130}, {34,131}, {34,132}, {34,133}, {34,134}, {34,135}, {34,136}, {34,137}, {34,138}, {34,139}, {34,140}, {34,141}, {34,142}, {34,143}, {34,144}, {35,-82}, {35,-81}, {35,-67}, {35,-66}, {35,-65}, {35,-64}, {35,-63}, {35,-59}, {35,-58}, {35,-57}, {35,-52}, {35,-51}, {35,-50}, {35,-46}, {35,-45}, {35,-44}, {35,-43}, {35,-42}, {35,-7}, {35,-6}, {35,-3}, {35,-2}, {35,1}, {35,2}, {35,5}, {35,6}, {35,9}, {35,10}, {35,13}, {35,14}, {35,17}, {35,18}, {35,21}, {35,22}, {35,25}, {35,26}, {35,29}, {35,30}, {35,33}, {35,34}, {35,37}, {35,38}, {35,41}, {35,42}, {35,45}, {35,46}, {35,50}, {35,51}, {35,57}, {35,58}, {35,59}, {35,60}, {35,61}, {35,62}, {35,63}, {35,64}, {35,65}, {35,66}, {35,67}, {35,68}, {35,69}, {35,70}, {35,71}, {35,72}, {35,73}, {35,74}, {35,75}, {35,76}, {35,77}, {35,78}, {35,79}, {35,80}, {35,81}, {35,82}, {35,83}, {35,84}, {35,85}, {35,86}, {35,87}, {35,88}, {35,89}, {35,90}, {35,91}, {35,92}, {35,93}, {35,94}, {35,95}, {35,96}, {35,97}, {35,98}, {35,99}, {35,100}, {35,101}, {35,102}, {35,103}, {35,104}, {35,105}, {35,106}, {35,107}, {35,108}, {35,109}, {35,110}, {35,111}, {35,112}, {35,113}, {35,114}, {35,115}, {35,116}, {35,117}, {35,118}, {35,119}, {35,120}, {35,121}, {35,122}, {35,123}, {35,124}, {35,125}, {35,126}, {35,127}, {35,128}, {35,129}, {35,130}, {35,131}, {35,132}, {35,133}, {35,134}, {35,135}, {35,136}, {35,137}, {35,138}, {35,139}, {35,140}, {35,141}, {35,142}, {35,143}, {35,144}, {36,-82}, {36,-81}, {36,-80}, {36,-7}, {36,-6}, {36,-3}, {36,-2}, {36,1}, {36,2}, {36,5}, {36,6}, {36,9}, {36,10}, {36,13}, {36,14}, {36,17}, {36,18}, {36,21}, {36,22}, {36,25}, {36,26}, {36,29}, {36,30}, {36,33}, {36,34}, {36,37}, {36,38}, {36,41}, {36,42}, {36,45}, {36,46}, {36,50}, {36,51}, {36,57}, {36,58}, {36,62}, {36,68}, {36,74}, {36,75}, {36,79}, {36,80}, {36,88}, {36,96}, {36,104}, {36,105}, {36,109}, {36,127}, {36,139}, {36,143}, {36,144}, {37,-82}, {37,-81}, {37,-80}, {37,1}, {37,2}, {37,45}, {37,46}, {37,50}, {37,51}, {37,57}, {37,58}, {37,68}, {37,74}, {37,75}, {37,79}, {37,80}, {37,104}, {37,105}, {37,127}, {37,143}, {37,144}, {38,-81}, {38,-80}, {38,1}, {38,2}, {38,45}, {38,46}, {38,50}, {38,51}, {38,57}, {38,58}, {38,62}, {38,68}, {38,74}, {38,75}, {38,79}, {38,80}, {38,88}, {38,96}, {38,104}, {38,105}, {38,109}, {38,127}, {38,139}, {38,143}, {38,144}, {39,-81}, {39,-80}, {39,-7}, {39,-6}, {39,-3}, {39,-2}, {39,1}, {39,2}, {39,5}, {39,6}, {39,9}, {39,10}, {39,13}, {39,14}, {39,17}, {39,18}, {39,21}, {39,22}, {39,25}, {39,26}, {39,29}, {39,30}, {39,33}, {39,34}, {39,37}, {39,38}, {39,41}, {39,42}, {39,45}, {39,46}, {39,50}, {39,51}, {39,57}, {39,58}, {39,59}, {39,60}, {39,61}, {39,62}, {39,63}, {39,65}, {39,66}, {39,67}, {39,68}, {39,69}, {39,70}, {39,71}, {39,74}, {39,75}, {39,79}, {39,80}, {39,81}, {39,82}, {39,83}, {39,84}, {39,85}, {39,86}, {39,87}, {39,88}, {39,89}, {39,90}, {39,92}, {39,93}, {39,94}, {39,95}, {39,96}, {39,97}, {39,98}, {39,99}, {39,100}, {39,101}, {39,102}, {39,103}, {39,104}, {39,105}, {39,109}, {39,110}, {39,111}, {39,112}, {39,113}, {39,114}, {39,115}, {39,117}, {39,118}, {39,119}, {39,120}, {39,121}, {39,122}, {39,123}, {39,124}, {39,126}, {39,127}, {39,128}, {39,129}, {39,130}, {39,131}, {39,132}, {39,133}, {39,134}, {39,135}, {39,137}, {39,138}, {39,139}, {39,143}, {39,144}, {40,-81}, {40,-80}, {40,-79}, {40,-67}, {40,-66}, {40,-65}, {40,-64}, {40,-63}, {40,-59}, {40,-58}, {40,-57}, {40,-52}, {40,-51}, {40,-50}, {40,-46}, {40,-45}, {40,-44}, {40,-43}, {40,-42}, {40,-7}, {40,-6}, {40,-3}, {40,-2}, {40,1}, {40,2}, {40,5}, {40,6}, {40,9}, {40,10}, {40,13}, {40,14}, {40,17}, {40,18}, {40,21}, {40,22}, {40,25}, {40,26}, {40,29}, {40,30}, {40,33}, {40,34}, {40,37}, {40,38}, {40,41}, {40,42}, {40,45}, {40,46}, {40,50}, {40,51}, {40,57}, {40,58}, {40,62}, {40,74}, {40,75}, {40,79}, {40,80}, {40,104}, {40,105}, {40,109}, {40,123}, {40,127}, {40,139}, {40,143}, {40,144}, {41,-80}, {41,-79}, {41,-67}, {41,-66}, {41,-65}, {41,-64}, {41,-63}, {41,-59}, {41,-58}, {41,-57}, {41,-52}, {41,-51}, {41,-50}, {41,-46}, {41,-45}, {41,-44}, {41,-43}, {41,-42}, {41,1}, {41,2}, {41,45}, {41,46}, {41,50}, {41,51}, {41,57}, {41,58}, {41,62}, {41,74}, {41,75}, {41,79}, {41,80}, {41,104}, {41,105}, {41,109}, {41,123}, {41,127}, {41,137}, {41,138}, {41,139}, {41,143}, {41,144}, {42,-80}, {42,-79}, {42,-66}, {42,-65}, {42,-64}, {42,-63}, {42,-59}, {42,-58}, {42,-57}, {42,-52}, {42,-51}, {42,-50}, {42,-46}, {42,-45}, {42,-44}, {42,-43}, {42,1}, {42,2}, {42,45}, {42,46}, {42,50}, {42,51}, {42,57}, {42,58}, {42,62}, {42,74}, {42,75}, {42,123}, {42,127}, {42,139}, {42,143}, {42,144}, {43,-80}, {43,-79}, {43,-66}, {43,-65}, {43,-64}, {43,-63}, {43,-46}, {43,-45}, {43,-44}, {43,-43}, {43,-7}, {43,-6}, {43,-3}, {43,-2}, {43,1}, {43,2}, {43,5}, {43,6}, {43,9}, {43,10}, {43,13}, {43,14}, {43,17}, {43,18}, {43,21}, {43,22}, {43,25}, {43,26}, {43,29}, {43,30}, {43,33}, {43,34}, {43,37}, {43,38}, {43,41}, {43,42}, {43,45}, {43,46}, {43,50}, {43,51}, {43,57}, {43,58}, {43,62}, {43,74}, {43,75}, {43,79}, {43,80}, {43,104}, {43,105}, {43,109}, {43,123}, {43,127}, {43,137}, {43,138}, {43,139}, {43,143}, {43,144}, {44,-80}, {44,-79}, {44,-78}, {44,-67}, {44,-66}, {44,-65}, {44,-64}, {44,-63}, {44,-46}, {44,-45}, {44,-44}, {44,-43}, {44,-42}, {44,-7}, {44,-6}, {44,-3}, {44,-2}, {44,1}, {44,2}, {44,5}, {44,6}, {44,9}, {44,10}, {44,13}, {44,14}, {44,17}, {44,18}, {44,21}, {44,22}, {44,25}, {44,26}, {44,29}, {44,30}, {44,33}, {44,34}, {44,37}, {44,38}, {44,41}, {44,42}, {44,45}, {44,46}, {44,50}, {44,51}, {44,57}, {44,58}, {44,74}, {44,75}, {44,79}, {44,80}, {44,104}, {44,105}, {44,109}, {44,123}, {44,127}, {44,139}, {44,143}, {44,144}, {45,-80}, {45,-79}, {45,-78}, {45,-66}, {45,-65}, {45,-64}, {45,-63}, {45,-46}, {45,-45}, {45,-44}, {45,-43}, {45,50}, {45,51}, {45,57}, {45,58}, {45,62}, {45,74}, {45,75}, {45,79}, {45,80}, {45,104}, {45,105}, {45,109}, {45,123}, {45,127}, {45,137}, {45,138}, {45,139}, {45,143}, {45,144}, {46,-79}, {46,-78}, {46,-66}, {46,-65}, {46,-64}, {46,-63}, {46,-46}, {46,-45}, {46,-44}, {46,-43}, {46,50}, {46,51}, {46,57}, {46,58}, {46,62}, {46,74}, {46,75}, {46,79}, {46,80}, {46,104}, {46,105}, {46,109}, {46,123}, {46,127}, {46,139}, {46,143}, {46,144}, {47,-79}, {47,-78}, {47,-67}, {47,-66}, {47,-65}, {47,-64}, {47,-63}, {47,-62}, {47,-61}, {47,-59}, {47,-58}, {47,-57}, {47,-56}, {47,-55}, {47,-54}, {47,-53}, {47,-52}, {47,-51}, {47,-50}, {47,-49}, {47,-48}, {47,-47}, {47,-46}, {47,-45}, {47,-44}, {47,-43}, {47,-42}, {47,-7}, {47,-6}, {47,-3}, {47,-2}, {47,1}, {47,2}, {47,5}, {47,6}, {47,9}, {47,10}, {47,13}, {47,14}, {47,17}, {47,18}, {47,21}, {47,22}, {47,25}, {47,26}, {47,29}, {47,30}, {47,33}, {47,34}, {47,37}, {47,38}, {47,41}, {47,42}, {47,45}, {47,46}, {47,50}, {47,51}, {47,57}, {47,58}, {47,62}, {47,74}, {47,75}, {47,79}, {47,80}, {47,104}, {47,105}, {47,109}, {47,123}, {47,127}, {47,137}, {47,138}, {47,139}, {47,143}, {47,144}, {48,-79}, {48,-78}, {48,-77}, {48,-66}, {48,-65}, {48,-64}, {48,-63}, {48,-62}, {48,-61}, {48,-59}, {48,-58}, {48,-57}, {48,-56}, {48,-55}, {48,-54}, {48,-53}, {48,-52}, {48,-51}, {48,-50}, {48,-49}, {48,-48}, {48,-47}, {48,-46}, {48,-45}, {48,-44}, {48,-43}, {48,-7}, {48,-6}, {48,-3}, {48,-2}, {48,1}, {48,2}, {48,5}, {48,6}, {48,9}, {48,10}, {48,13}, {48,14}, {48,17}, {48,18}, {48,21}, {48,22}, {48,25}, {48,26}, {48,29}, {48,30}, {48,33}, {48,34}, {48,37}, {48,38}, {48,41}, {48,42}, {48,45}, {48,46}, {48,50}, {48,51}, {48,57}, {48,58}, {48,59}, {48,60}, {48,61}, {48,62}, {48,74}, {48,75}, {48,79}, {48,80}, {48,104}, {48,105}, {48,109}, {48,123}, {48,127}, {48,139}, {48,143}, {48,144}, {49,-87}, {49,-86}, {49,-79}, {49,-78}, {49,-77}, {49,-66}, {49,-65}, {49,-64}, {49,-63}, {49,-62}, {49,-61}, {49,-59}, {49,-58}, {49,-57}, {49,-56}, {49,-55}, {49,-54}, {49,-53}, {49,-52}, {49,-51}, {49,-50}, {49,-49}, {49,-48}, {49,-47}, {49,-46}, {49,-45}, {49,-44}, {49,-43}, {49,1}, {49,2}, {49,45}, {49,46}, {49,50}, {49,51}, {49,57}, {49,58}, {49,62}, {49,74}, {49,75}, {49,76}, {49,77}, {49,78}, {49,79}, {49,80}, {49,104}, {49,105}, {49,109}, {49,123}, {49,127}, {49,137}, {49,138}, {49,139}, {49,143}, {49,144}, {50,-88}, {50,-87}, {50,-86}, {50,-85}, {50,-78}, {50,-77}, {50,-67}, {50,-66}, {50,-65}, {50,-64}, {50,-63}, {50,-46}, {50,-45}, {50,-44}, {50,-43}, {50,-42}, {50,1}, {50,2}, {50,45}, {50,46}, {50,50}, {50,51}, {50,57}, {50,58}, {50,62}, {50,74}, {50,75}, {50,79}, {50,80}, {50,104}, {50,105}, {50,109}, {50,123}, {50,127}, {50,139}, {50,143}, {50,144}, {51,-90}, {51,-89}, {51,-88}, {51,-87}, {51,-86}, {51,-85}, {51,-78}, {51,-77}, {51,-66}, {51,-65}, {51,-64}, {51,-63}, {51,-46}, {51,-45}, {51,-44}, {51,-43}, {51,-7}, {51,-6}, {51,-3}, {51,-2}, {51,1}, {51,2}, {51,5}, {51,6}, {51,9}, {51,10}, {51,13}, {51,14}, {51,17}, {51,18}, {51,21}, {51,22}, {51,25}, {51,26}, {51,29}, {51,30}, {51,33}, {51,34}, {51,37}, {51,38}, {51,41}, {51,42}, {51,45}, {51,46}, {51,50}, {51,51}, {51,57}, {51,58}, {51,62}, {51,74}, {51,75}, {51,79}, {51,80}, {51,104}, {51,105}, {51,109}, {51,110}, {51,112}, {51,113}, {51,114}, {51,115}, {51,116}, {51,117}, {51,118}, {51,119}, {51,120}, {51,121}, {51,122}, {51,123}, {51,124}, {51,126}, {51,127}, {51,128}, {51,129}, {51,130}, {51,131}, {51,132}, {51,133}, {51,134}, {51,135}, {51,136}, {51,137}, {51,138}, {51,139}, {51,140}, {51,141}, {51,142}, {51,143}, {51,144}, {52,-91}, {52,-90}, {52,-89}, {52,-88}, {52,-87}, {52,-86}, {52,-85}, {52,-84}, {52,-78}, {52,-77}, {52,-76}, {52,-66}, {52,-65}, {52,-64}, {52,-63}, {52,-62}, {52,-61}, {52,-60}, {52,-59}, {52,-58}, {52,-57}, {52,-56}, {52,-55}, {52,-54}, {52,-53}, {52,-52}, {52,-51}, {52,-50}, {52,-49}, {52,-48}, {52,-47}, {52,-46}, {52,-45}, {52,-44}, {52,-43}, {52,-7}, {52,-6}, {52,-3}, {52,-2}, {52,1}, {52,2}, {52,5}, {52,6}, {52,9}, {52,10}, {52,13}, {52,14}, {52,17}, {52,18}, {52,21}, {52,22}, {52,25}, {52,26}, {52,29}, {52,30}, {52,33}, {52,34}, {52,37}, {52,38}, {52,41}, {52,42}, {52,45}, {52,46}, {52,50}, {52,51}, {52,57}, {52,58}, {52,62}, {52,74}, {52,75}, {52,79}, {52,80}, {52,104}, {52,105}, {52,109}, {52,114}, {52,118}, {52,130}, {52,135}, {52,139}, {52,143}, {52,144}, {53,-101}, {53,-100}, {53,-99}, {53,-98}, {53,-97}, {53,-95}, {53,-94}, {53,-93}, {53,-92}, {53,-91}, {53,-90}, {53,-89}, {53,-88}, {53,-87}, {53,-86}, {53,-85}, {53,-84}, {53,-77}, {53,-76}, {53,-66}, {53,-65}, {53,-64}, {53,-63}, {53,-62}, {53,-61}, {53,-60}, {53,-59}, {53,-58}, {53,-57}, {53,-56}, {53,-55}, {53,-54}, {53,-53}, {53,-52}, {53,-51}, {53,-50}, {53,-49}, {53,-48}, {53,-47}, {53,-46}, {53,-45}, {53,-44}, {53,-43}, {53,1}, {53,2}, {53,45}, {53,46}, {53,50}, {53,51}, {53,57}, {53,58}, {53,62}, {53,74}, {53,75}, {53,79}, {53,80}, {53,104}, {53,105}, {53,114}, {53,130}, {53,143}, {53,144}, {54,-101}, {54,-100}, {54,-99}, {54,-98}, {54,-97}, {54,-95}, {54,-94}, {54,-93}, {54,-92}, {54,-91}, {54,-85}, {54,-84}, {54,-77}, {54,-76}, {54,-66}, {54,-65}, {54,-64}, {54,-63}, {54,-62}, {54,-61}, {54,-60}, {54,-59}, {54,-58}, {54,-57}, {54,-56}, {54,-55}, {54,-54}, {54,-53}, {54,-52}, {54,-51}, {54,-50}, {54,-49}, {54,-48}, {54,-47}, {54,-46}, {54,-45}, {54,-44}, {54,-43}, {54,1}, {54,2}, {54,45}, {54,46}, {54,50}, {54,51}, {54,57}, {54,58}, {54,74}, {54,75}, {54,79}, {54,80}, {54,104}, {54,105}, {54,109}, {54,114}, {54,118}, {54,130}, {54,135}, {54,139}, {54,143}, {54,144}, {55,-101}, {55,-100}, {55,-99}, {55,-98}, {55,-97}, {55,-95}, {55,-94}, {55,-93}, {55,-92}, {55,-85}, {55,-84}, {55,-83}, {55,-77}, {55,-76}, {55,-8}, {55,-7}, {55,-6}, {55,-5}, {55,-4}, {55,-3}, {55,-2}, {55,0}, {55,1}, {55,2}, {55,5}, {55,6}, {55,9}, {55,10}, {55,13}, {55,14}, {55,17}, {55,18}, {55,21}, {55,22}, {55,25}, {55,26}, {55,29}, {55,30}, {55,33}, {55,34}, {55,37}, {55,38}, {55,41}, {55,42}, {55,45}, {55,46}, {55,50}, {55,51}, {55,57}, {55,58}, {55,62}, {55,74}, {55,75}, {55,79}, {55,80}, {55,104}, {55,105}, {55,106}, {55,108}, {55,109}, {55,110}, {55,111}, {55,112}, {55,113}, {55,114}, {55,115}, {55,116}, {55,117}, {55,118}, {55,119}, {55,120}, {55,121}, {55,122}, {55,123}, {55,124}, {55,126}, {55,127}, {55,128}, {55,129}, {55,130}, {55,132}, {55,133}, {55,134}, {55,135}, {55,136}, {55,137}, {55,138}, {55,139}, {55,140}, {55,141}, {55,142}, {55,143}, {55,144}, {56,-100}, {56,-99}, {56,-98}, {56,-94}, {56,-85}, {56,-84}, {56,-83}, {56,-77}, {56,-76}, {56,-75}, {56,-8}, {56,-7}, {56,-6}, {56,-5}, {56,-4}, {56,-3}, {56,-2}, {56,0}, {56,1}, {56,2}, {56,5}, {56,6}, {56,9}, {56,10}, {56,13}, {56,14}, {56,17}, {56,18}, {56,21}, {56,22}, {56,25}, {56,26}, {56,29}, {56,30}, {56,33}, {56,34}, {56,37}, {56,38}, {56,41}, {56,42}, {56,45}, {56,46}, {56,50}, {56,51}, {56,57}, {56,58}, {56,62}, {56,74}, {56,75}, {56,79}, {56,80}, {56,104}, {56,105}, {56,109}, {56,135}, {56,139}, {56,143}, {56,144}, {57,-100}, {57,-99}, {57,-98}, {57,-88}, {57,-87}, {57,-86}, {57,-85}, {57,-84}, {57,-83}, {57,-77}, {57,-76}, {57,-75}, {57,-7}, {57,-6}, {57,1}, {57,2}, {57,45}, {57,46}, {57,50}, {57,51}, {57,57}, {57,58}, {57,62}, {57,74}, {57,75}, {57,79}, {57,80}, {57,104}, {57,105}, {57,109}, {57,143}, {57,144}, {58,-100}, {58,-99}, {58,-98}, {58,-94}, {58,-91}, {58,-90}, {58,-89}, {58,-88}, {58,-84}, {58,-83}, {58,-82}, {58,-76}, {58,-75}, {58,-7}, {58,-6}, {58,1}, {58,2}, {58,45}, {58,46}, {58,50}, {58,51}, {58,57}, {58,58}, {58,62}, {58,74}, {58,75}, {58,79}, {58,80}, {58,104}, {58,105}, {58,109}, {58,115}, {58,116}, {58,117}, {58,118}, {58,132}, {58,133}, {58,134}, {58,135}, {58,139}, {58,143}, {58,144}, {59,-100}, {59,-99}, {59,-98}, {59,-97}, {59,-96}, {59,-94}, {59,-93}, {59,-92}, {59,-91}, {59,-84}, {59,-83}, {59,-82}, {59,-76}, {59,-75}, {59,-66}, {59,-65}, {59,-64}, {59,-63}, {59,-62}, {59,-61}, {59,-59}, {59,-58}, {59,-57}, {59,-56}, {59,-55}, {59,-54}, {59,-53}, {59,-52}, {59,-51}, {59,-50}, {59,-49}, {59,-48}, {59,-47}, {59,-46}, {59,-45}, {59,-44}, {59,-43}, {59,-42}, {59,-41}, {59,-40}, {59,-39}, {59,-38}, {59,-37}, {59,-36}, {59,-35}, {59,-17}, {59,-16}, {59,-15}, {59,-14}, {59,-13}, {59,-12}, {59,-11}, {59,-8}, {59,-7}, {59,-6}, {59,-5}, {59,-4}, {59,-3}, {59,-2}, {59,0}, {59,1}, {59,2}, {59,3}, {59,4}, {59,5}, {59,6}, {59,7}, {59,8}, {59,9}, {59,10}, {59,11}, {59,12}, {59,13}, {59,14}, {59,17}, {59,18}, {59,19}, {59,20}, {59,21}, {59,22}, {59,23}, {59,24}, {59,25}, {59,26}, {59,27}, {59,28}, {59,29}, {59,30}, {59,33}, {59,34}, {59,35}, {59,36}, {59,37}, {59,38}, {59,39}, {59,40}, {59,41}, {59,42}, {59,43}, {59,44}, {59,45}, {59,46}, {59,50}, {59,51}, {59,57}, {59,58}, {59,59}, {59,60}, {59,61}, {59,62}, {59,74}, {59,75}, {59,79}, {59,80}, {59,81}, {59,82}, {59,83}, {59,84}, {59,85}, {59,86}, {59,87}, {59,88}, {59,89}, {59,90}, {59,92}, {59,93}, {59,94}, {59,95}, {59,96}, {59,97}, {59,98}, {59,99}, {59,100}, {59,101}, {59,102}, {59,103}, {59,104}, {59,105}, {59,115}, {59,118}, {59,132}, {59,135}, {59,139}, {59,143}, {59,144}, {60,-102}, {60,-101}, {60,-100}, {60,-99}, {60,-98}, {60,-97}, {60,-93}, {60,-84}, {60,-83}, {60,-82}, {60,-76}, {60,-75}, {60,-74}, {60,-66}, {60,-65}, {60,-64}, {60,-63}, {60,-62}, {60,-61}, {60,-59}, {60,-58}, {60,-57}, {60,-56}, {60,-55}, {60,-54}, {60,-53}, {60,-52}, {60,-51}, {60,-50}, {60,-49}, {60,-48}, {60,-47}, {60,-46}, {60,-45}, {60,-44}, {60,-43}, {60,-42}, {60,-41}, {60,-40}, {60,-39}, {60,-38}, {60,-37}, {60,-36}, {60,-35}, {60,-17}, {60,-16}, {60,-15}, {60,-14}, {60,-13}, {60,-12}, {60,-11}, {60,-8}, {60,-7}, {60,-6}, {60,-5}, {60,-4}, {60,-3}, {60,-2}, {60,0}, {60,1}, {60,2}, {60,3}, {60,4}, {60,5}, {60,6}, {60,7}, {60,8}, {60,9}, {60,10}, {60,11}, {60,12}, {60,13}, {60,14}, {60,17}, {60,18}, {60,19}, {60,20}, {60,21}, {60,22}, {60,23}, {60,24}, {60,25}, {60,26}, {60,27}, {60,28}, {60,29}, {60,30}, {60,33}, {60,34}, {60,35}, {60,36}, {60,37}, {60,38}, {60,39}, {60,40}, {60,41}, {60,42}, {60,43}, {60,44}, {60,45}, {60,46}, {60,50}, {60,51}, {60,57}, {60,58}, {60,62}, {60,74}, {60,75}, {60,79}, {60,80}, {60,104}, {60,105}, {60,109}, {60,115}, {60,132}, {60,135}, {60,139}, {60,143}, {60,144}, {61,-106}, {61,-105}, {61,-104}, {61,-103}, {61,-102}, {61,-101}, {61,-100}, {61,-99}, {61,-98}, {61,-97}, {61,-87}, {61,-86}, {61,-85}, {61,-84}, {61,-83}, {61,-82}, {61,-81}, {61,-76}, {61,-75}, {61,-74}, {61,-66}, {61,-65}, {61,-54}, {61,-36}, {61,-35}, {61,-17}, {61,-16}, {61,-7}, {61,-6}, {61,1}, {61,2}, {61,23}, {61,24}, {61,45}, {61,46}, {61,50}, {61,51}, {61,57}, {61,58}, {61,62}, {61,109}, {61,115}, {61,118}, {61,132}, {61,135}, {61,139}, {61,143}, {61,144}, {62,-109}, {62,-108}, {62,-107}, {62,-106}, {62,-105}, {62,-104}, {62,-103}, {62,-102}, {62,-101}, {62,-100}, {62,-99}, {62,-98}, {62,-97}, {62,-93}, {62,-90}, {62,-89}, {62,-88}, {62,-87}, {62,-83}, {62,-82}, {62,-81}, {62,-75}, {62,-74}, {62,-66}, {62,-65}, {62,-54}, {62,-36}, {62,-35}, {62,-17}, {62,-16}, {62,-7}, {62,-6}, {62,1}, {62,2}, {62,23}, {62,24}, {62,45}, {62,46}, {62,50}, {62,51}, {62,57}, {62,58}, {62,62}, {62,74}, {62,75}, {62,79}, {62,80}, {62,104}, {62,105}, {62,109}, {62,115}, {62,118}, {62,132}, {62,135}, {62,139}, {62,143}, {62,144}, {63,-109}, {63,-108}, {63,-107}, {63,-106}, {63,-105}, {63,-104}, {63,-103}, {63,-102}, {63,-101}, {63,-100}, {63,-99}, {63,-98}, {63,-97}, {63,-96}, {63,-95}, {63,-93}, {63,-92}, {63,-91}, {63,-90}, {63,-83}, {63,-82}, {63,-81}, {63,-75}, {63,-74}, {63,-73}, {63,-66}, {63,-65}, {63,-64}, {63,-62}, {63,-61}, {63,-60}, {63,-59}, {63,-58}, {63,-57}, {63,-56}, {63,-55}, {63,-54}, {63,-53}, {63,-52}, {63,-51}, {63,-49}, {63,-48}, {63,-47}, {63,-46}, {63,-45}, {63,-44}, {63,-43}, {63,-42}, {63,-41}, {63,-40}, {63,-39}, {63,-38}, {63,-36}, {63,-35}, {63,-17}, {63,-16}, {63,-8}, {63,-7}, {63,-6}, {63,-5}, {63,-4}, {63,-3}, {63,-2}, {63,0}, {63,1}, {63,2}, {63,3}, {63,4}, {63,5}, {63,6}, {63,7}, {63,8}, {63,9}, {63,10}, {63,11}, {63,12}, {63,13}, {63,14}, {63,15}, {63,16}, {63,17}, {63,18}, {63,19}, {63,20}, {63,21}, {63,22}, {63,23}, {63,24}, {63,25}, {63,26}, {63,27}, {63,28}, {63,29}, {63,30}, {63,31}, {63,32}, {63,33}, {63,34}, {63,35}, {63,36}, {63,37}, {63,38}, {63,39}, {63,40}, {63,41}, {63,42}, {63,43}, {63,44}, {63,45}, {63,46}, {63,47}, {63,48}, {63,49}, {63,50}, {63,51}, {63,57}, {63,58}, {63,62}, {63,74}, {63,75}, {63,76}, {63,77}, {63,78}, {63,79}, {63,80}, {63,81}, {63,82}, {63,83}, {63,84}, {63,85}, {63,86}, {63,87}, {63,88}, {63,89}, {63,90}, {63,91}, {63,92}, {63,93}, {63,94}, {63,95}, {63,98}, {63,99}, {63,100}, {63,101}, {63,102}, {63,103}, {63,104}, {63,105}, {63,109}, {63,115}, {63,118}, {63,132}, {63,135}, {63,139}, {63,143}, {63,144}, {64,-109}, {64,-108}, {64,-107}, {64,-106}, {64,-105}, {64,-104}, {64,-103}, {64,-102}, {64,-101}, {64,-100}, {64,-99}, {64,-98}, {64,-97}, {64,-96}, {64,-92}, {64,-83}, {64,-82}, {64,-81}, {64,-75}, {64,-74}, {64,-73}, {64,-66}, {64,-65}, {64,-62}, {64,-54}, {64,-51}, {64,-49}, {64,-40}, {64,-39}, {64,-36}, {64,-35}, {64,-34}, {64,-33}, {64,-32}, {64,-31}, {64,-29}, {64,-28}, {64,-27}, {64,-26}, {64,-25}, {64,-24}, {64,-23}, {64,-21}, {64,-20}, {64,-19}, {64,-18}, {64,-17}, {64,-16}, {64,-12}, {64,-11}, {64,-10}, {64,-8}, {64,-7}, {64,-6}, {64,-5}, {64,-4}, {64,-3}, {64,-2}, {64,0}, {64,1}, {64,2}, {64,3}, {64,4}, {64,5}, {64,6}, {64,7}, {64,8}, {64,9}, {64,10}, {64,11}, {64,12}, {64,13}, {64,14}, {64,15}, {64,16}, {64,17}, {64,18}, {64,19}, {64,20}, {64,21}, {64,22}, {64,23}, {64,24}, {64,25}, {64,26}, {64,27}, {64,28}, {64,29}, {64,30}, {64,31}, {64,32}, {64,33}, {64,34}, {64,35}, {64,36}, {64,37}, {64,38}, {64,39}, {64,40}, {64,41}, {64,42}, {64,43}, {64,44}, {64,45}, {64,46}, {64,50}, {64,51}, {64,57}, {64,58}, {64,74}, {64,75}, {64,79}, {64,80}, {64,86}, {64,90}, {64,100}, {64,104}, {64,105}, {64,109}, {64,115}, {64,118}, {64,132}, {64,135}, {64,139}, {64,143}, {64,144}, {65,-108}, {65,-107}, {65,-106}, {65,-105}, {65,-99}, {65,-98}, {65,-97}, {65,-96}, {65,-86}, {65,-85}, {65,-83}, {65,-82}, {65,-81}, {65,-80}, {65,-75}, {65,-74}, {65,-73}, {65,-66}, {65,-65}, {65,-62}, {65,-54}, {65,-51}, {65,-40}, {65,-39}, {65,-36}, {65,-35}, {65,-34}, {65,-33}, {65,-32}, {65,-31}, {65,-29}, {65,-28}, {65,-27}, {65,-26}, {65,-25}, {65,-24}, {65,-23}, {65,-21}, {65,-20}, {65,-19}, {65,-18}, {65,-17}, {65,-16}, {65,-12}, {65,-11}, {65,-7}, {65,-6}, {65,46}, {65,50}, {65,51}, {65,57}, {65,58}, {65,62}, {65,74}, {65,75}, {65,90}, {65,104}, {65,105}, {65,109}, {65,115}, {65,118}, {65,132}, {65,135}, {65,139}, {65,143}, {65,144}, {66,-108}, {66,-107}, {66,-106}, {66,-105}, {66,-99}, {66,-98}, {66,-97}, {66,-96}, {66,-92}, {66,-89}, {66,-88}, {66,-87}, {66,-86}, {66,-82}, {66,-81}, {66,-80}, {66,-74}, {66,-73}, {66,-66}, {66,-65}, {66,-62}, {66,-54}, {66,-51}, {66,-40}, {66,-39}, {66,-36}, {66,-35}, {66,-17}, {66,-16}, {66,-12}, {66,-11}, {66,-7}, {66,-6}, {66,50}, {66,51}, {66,57}, {66,58}, {66,62}, {66,74}, {66,75}, {66,79}, {66,80}, {66,86}, {66,90}, {66,100}, {66,104}, {66,105}, {66,109}, {66,115}, {66,118}, {66,132}, {66,135}, {66,139}, {66,143}, {66,144}, {67,-108}, {67,-107}, {67,-106}, {67,-105}, {67,-104}, {67,-99}, {67,-98}, {67,-97}, {67,-96}, {67,-95}, {67,-94}, {67,-92}, {67,-91}, {67,-90}, {67,-89}, {67,-74}, {67,-73}, {67,-66}, {67,-65}, {67,-62}, {67,-54}, {67,-51}, {67,-49}, {67,-40}, {67,-39}, {67,-36}, {67,-35}, {67,-17}, {67,-16}, {67,-12}, {67,-11}, {67,-7}, {67,-6}, {67,46}, {67,50}, {67,51}, {67,57}, {67,58}, {67,62}, {67,74}, {67,75}, {67,79}, {67,80}, {67,86}, {67,87}, {67,89}, {67,90}, {67,100}, {67,101}, {67,102}, {67,103}, {67,104}, {67,105}, {67,109}, {67,115}, {67,116}, {67,117}, {67,118}, {67,132}, {67,135}, {67,139}, {67,143}, {67,144}, {68,-108}, {68,-107}, {68,-106}, {68,-105}, {68,-104}, {68,-99}, {68,-98}, {68,-97}, {68,-96}, {68,-95}, {68,-91}, {68,-90}, {68,-81}, {68,-80}, {68,-79}, {68,-66}, {68,-65}, {68,-64}, {68,-62}, {68,-61}, {68,-60}, {68,-59}, {68,-57}, {68,-56}, {68,-55}, {68,-54}, {68,-53}, {68,-51}, {68,-50}, {68,-49}, {68,-48}, {68,-47}, {68,-46}, {68,-44}, {68,-43}, {68,-42}, {68,-41}, {68,-40}, {68,-39}, {68,-36}, {68,-35}, {68,-17}, {68,-16}, {68,-12}, {68,-11}, {68,-10}, {68,-8}, {68,-7}, {68,-6}, {68,-5}, {68,-4}, {68,-3}, {68,-2}, {68,0}, {68,1}, {68,2}, {68,3}, {68,4}, {68,5}, {68,6}, {68,7}, {68,8}, {68,9}, {68,10}, {68,11}, {68,12}, {68,13}, {68,14}, {68,15}, {68,16}, {68,17}, {68,18}, {68,19}, {68,21}, {68,22}, {68,23}, {68,24}, {68,25}, {68,26}, {68,27}, {68,28}, {68,29}, {68,30}, {68,31}, {68,32}, {68,33}, {68,34}, {68,35}, {68,36}, {68,38}, {68,39}, {68,40}, {68,41}, {68,42}, {68,43}, {68,44}, {68,45}, {68,46}, {68,50}, {68,51}, {68,57}, {68,58}, {68,62}, {68,74}, {68,75}, {68,79}, {68,80}, {68,86}, {68,104}, {68,105}, {68,109}, {68,115}, {68,118}, {68,132}, {68,135}, {68,139}, {68,143}, {68,144}, {69,-107}, {69,-106}, {69,-105}, {69,-104}, {69,-98}, {69,-97}, {69,-96}, {69,-95}, {69,-91}, {69,-90}, {69,-84}, {69,-83}, {69,-82}, {69,-81}, {69,-80}, {69,-79}, {69,-66}, {69,-65}, {69,-40}, {69,-39}, {69,-36}, {69,-35}, {69,-17}, {69,-16}, {69,-12}, {69,-11}, {69,-8}, {69,-7}, {69,-6}, {69,-5}, {69,-4}, {69,-3}, {69,-2}, {69,0}, {69,1}, {69,2}, {69,3}, {69,4}, {69,5}, {69,6}, {69,7}, {69,8}, {69,9}, {69,10}, {69,11}, {69,12}, {69,13}, {69,14}, {69,15}, {69,16}, {69,17}, {69,18}, {69,19}, {69,21}, {69,22}, {69,23}, {69,24}, {69,25}, {69,26}, {69,27}, {69,28}, {69,29}, {69,30}, {69,31}, {69,32}, {69,33}, {69,34}, {69,35}, {69,36}, {69,38}, {69,39}, {69,40}, {69,41}, {69,42}, {69,43}, {69,44}, {69,45}, {69,46}, {69,50}, {69,51}, {69,57}, {69,58}, {69,59}, {69,60}, {69,61}, {69,62}, {69,74}, {69,75}, {69,79}, {69,80}, {69,86}, {69,104}, {69,105}, {69,106}, {69,107}, {69,108}, {69,109}, {69,110}, {69,111}, {69,112}, {69,113}, {69,114}, {69,115}, {69,132}, {69,135}, {69,136}, {69,137}, {69,138}, {69,139}, {69,140}, {69,141}, {69,142}, {69,143}, {69,144}, {70,-107}, {70,-106}, {70,-105}, {70,-104}, {70,-98}, {70,-97}, {70,-96}, {70,-95}, {70,-91}, {70,-90}, {70,-87}, {70,-86}, {70,-85}, {70,-84}, {70,-83}, {70,-82}, {70,-81}, {70,-80}, {70,-79}, {70,-40}, {70,-39}, {70,-38}, {70,-36}, {70,-35}, {70,-17}, {70,-16}, {70,-12}, {70,-11}, {70,-7}, {70,-6}, {70,-2}, {70,11}, {70,15}, {70,19}, {70,30}, {70,46}, {70,47}, {70,48}, {70,49}, {70,50}, {70,51}, {70,57}, {70,58}, {70,62}, {70,74}, {70,75}, {70,79}, {70,80}, {70,86}, {70,109}, {70,118}, {70,132}, {70,143}, {70,144}, {71,-107}, {71,-106}, {71,-105}, {71,-104}, {71,-98}, {71,-97}, {71,-96}, {71,-95}, {71,-91}, {71,-90}, {71,-89}, {71,-88}, {71,-87}, {71,-86}, {71,-85}, {71,-84}, {71,-83}, {71,-82}, {71,-81}, {71,-80}, {71,-79}, {71,-78}, {71,-66}, {71,-65}, {71,-58}, {71,-57}, {71,-56}, {71,-55}, {71,-54}, {71,-51}, {71,-50}, {71,-49}, {71,-48}, {71,-36}, {71,-35}, {71,-17}, {71,-16}, {71,-12}, {71,-11}, {71,-2}, {71,-1}, {71,0}, {71,1}, {71,11}, {71,15}, {71,19}, {71,20}, {71,21}, {71,22}, {71,30}, {71,36}, {71,37}, {71,38}, {71,39}, {71,50}, {71,51}, {71,57}, {71,58}, {71,62}, {71,74}, {71,75}, {71,79}, {71,80}, {71,86}, {71,104}, {71,105}, {71,118}, {71,132}, {71,143}, {71,144}, {72,-107}, {72,-106}, {72,-105}, {72,-104}, {72,-97}, {72,-96}, {72,-95}, {72,-94}, {72,-93}, {72,-91}, {72,-90}, {72,-89}, {72,-88}, {72,-87}, {72,-86}, {72,-85}, {72,-84}, {72,-83}, {72,-80}, {72,-79}, {72,-78}, {72,-66}, {72,-65}, {72,-58}, {72,-51}, {72,-40}, {72,-39}, {72,-36}, {72,-35}, {72,-17}, {72,-16}, {72,-12}, {72,-11}, {72,-2}, {72,11}, {72,15}, {72,19}, {72,30}, {72,46}, {72,50}, {72,51}, {72,57}, {72,58}, {72,62}, {72,74}, {72,75}, {72,79}, {72,80}, {72,86}, {72,104}, {72,105}, {72,109}, {72,118}, {72,132}, {72,143}, {72,144}, {73,-106}, {73,-105}, {73,-104}, {73,-97}, {73,-96}, {73,-95}, {73,-94}, {73,-89}, {73,-88}, {73,-87}, {73,-80}, {73,-79}, {73,-78}, {73,-66}, {73,-65}, {73,-58}, {73,-51}, {73,-40}, {73,-39}, {73,-36}, {73,-35}, {73,-17}, {73,-16}, {73,-12}, {73,-11}, {73,-7}, {73,-6}, {73,-2}, {73,11}, {73,15}, {73,19}, {73,30}, {73,46}, {73,50}, {73,51}, {73,57}, {73,58}, {73,62}, {73,74}, {73,75}, {73,79}, {73,80}, {73,86}, {73,104}, {73,105}, {73,109}, {73,110}, {73,111}, {73,112}, {73,113}, {73,114}, {73,115}, {73,116}, {73,117}, {73,118}, {73,119}, {73,120}, {73,121}, {73,131}, {73,132}, {73,133}, {73,134}, {73,135}, {73,136}, {73,137}, {73,138}, {73,139}, {73,140}, {73,142}, {73,143}, {73,144}, {74,-106}, {74,-105}, {74,-104}, {74,-103}, {74,-102}, {74,-101}, {74,-99}, {74,-98}, {74,-97}, {74,-96}, {74,-95}, {74,-94}, {74,-89}, {74,-88}, {74,-87}, {74,-86}, {74,-79}, {74,-78}, {74,-77}, {74,-66}, {74,-65}, {74,-58}, {74,-51}, {74,-40}, {74,-39}, {74,-36}, {74,-35}, {74,-17}, {74,-16}, {74,-12}, {74,-11}, {74,-7}, {74,-6}, {74,-2}, {74,11}, {74,46}, {74,47}, {74,48}, {74,49}, {74,50}, {74,51}, {74,57}, {74,58}, {74,74}, {74,75}, {74,79}, {74,80}, {74,86}, {74,104}, {74,105}, {74,109}, {74,119}, {74,139}, {74,143}, {74,144}, {75,-106}, {75,-105}, {75,-104}, {75,-103}, {75,-102}, {75,-96}, {75,-95}, {75,-94}, {75,-89}, {75,-88}, {75,-87}, {75,-86}, {75,-78}, {75,-77}, {75,-66}, {75,-65}, {75,-60}, {75,-59}, {75,-58}, {75,-57}, {75,-56}, {75,-55}, {75,-53}, {75,-52}, {75,-51}, {75,-50}, {75,-49}, {75,-48}, {75,-47}, {75,-46}, {75,-45}, {75,-44}, {75,-43}, {75,-42}, {75,-41}, {75,-40}, {75,-39}, {75,-38}, {75,-37}, {75,-36}, {75,-35}, {75,-17}, {75,-16}, {75,-12}, {75,-11}, {75,-7}, {75,-6}, {75,-2}, {75,11}, {75,15}, {75,19}, {75,30}, {75,36}, {75,46}, {75,50}, {75,51}, {75,57}, {75,58}, {75,62}, {75,74}, {75,75}, {75,79}, {75,80}, {75,86}, {75,104}, {75,105}, {75,109}, {75,143}, {75,144}, {76,-105}, {76,-104}, {76,-103}, {76,-102}, {76,-96}, {76,-95}, {76,-94}, {76,-89}, {76,-88}, {76,-87}, {76,-86}, {76,-78}, {76,-77}, {76,-66}, {76,-65}, {76,-58}, {76,-53}, {76,-52}, {76,-51}, {76,-50}, {76,-49}, {76,-48}, {76,-47}, {76,-46}, {76,-45}, {76,-44}, {76,-43}, {76,-42}, {76,-41}, {76,-40}, {76,-39}, {76,-38}, {76,-37}, {76,-36}, {76,-35}, {76,-17}, {76,-16}, {76,-12}, {76,-11}, {76,-7}, {76,-6}, {76,-2}, {76,11}, {76,15}, {76,19}, {76,30}, {76,36}, {76,50}, {76,51}, {76,57}, {76,58}, {76,59}, {76,61}, {76,62}, {76,74}, {76,75}, {76,79}, {76,80}, {76,86}, {76,104}, {76,105}, {76,109}, {76,119}, {76,139}, {76,143}, {76,144}, {77,-105}, {77,-104}, {77,-103}, {77,-102}, {77,-96}, {77,-95}, {77,-94}, {77,-93}, {77,-92}, {77,-89}, {77,-88}, {77,-78}, {77,-77}, {77,-76}, {77,-58}, {77,-53}, {77,-52}, {77,-36}, {77,-35}, {77,-34}, {77,-33}, {77,-32}, {77,-31}, {77,-29}, {77,-28}, {77,-27}, {77,-26}, {77,-25}, {77,-24}, {77,-23}, {77,-21}, {77,-20}, {77,-19}, {77,-18}, {77,-17}, {77,-16}, {77,-12}, {77,-11}, {77,-7}, {77,-6}, {77,-2}, {77,11}, {77,15}, {77,19}, {77,30}, {77,36}, {77,46}, {77,50}, {77,51}, {77,57}, {77,58}, {77,62}, {77,74}, {77,75}, {77,79}, {77,80}, {77,81}, {77,82}, {77,83}, {77,84}, {77,85}, {77,86}, {77,87}, {77,88}, {77,89}, {77,90}, {77,100}, {77,101}, {77,102}, {77,103}, {77,104}, {77,105}, {77,109}, {77,119}, {77,121}, {77,122}, {77,123}, {77,124}, {77,125}, {77,126}, {77,127}, {77,128}, {77,129}, {77,130}, {77,131}, {77,139}, {77,143}, {77,144}, {78,-105}, {78,-104}, {78,-103}, {78,-102}, {78,-101}, {78,-89}, {78,-88}, {78,-78}, {78,-77}, {78,-76}, {78,-58}, {78,-53}, {78,-52}, {78,-36}, {78,-35}, {78,-34}, {78,-33}, {78,-32}, {78,-31}, {78,-29}, {78,-28}, {78,-27}, {78,-26}, {78,-25}, {78,-24}, {78,-23}, {78,-21}, {78,-20}, {78,-19}, {78,-18}, {78,-17}, {78,-16}, {78,-12}, {78,-11}, {78,-7}, {78,-6}, {78,-2}, {78,11}, {78,15}, {78,19}, {78,30}, {78,36}, {78,46}, {78,50}, {78,51}, {78,62}, {78,74}, {78,75}, {78,79}, {78,80}, {78,86}, {78,90}, {78,100}, {78,104}, {78,105}, {78,109}, {78,119}, {78,131}, {78,139}, {78,143}, {78,144}, {79,-105}, {79,-104}, {79,-103}, {79,-102}, {79,-101}, {79,-96}, {79,-95}, {79,-94}, {79,-93}, {79,-92}, {79,-91}, {79,-90}, {79,-89}, {79,-88}, {79,-77}, {79,-76}, {79,-58}, {79,-53}, {79,-52}, {79,-36}, {79,-35}, {79,-26}, {79,-17}, {79,-16}, {79,-15}, {79,-13}, {79,-12}, {79,-11}, {79,-10}, {79,-9}, {79,-8}, {79,-7}, {79,-6}, {79,-5}, {79,-3}, {79,-2}, {79,-1}, {79,0}, {79,1}, {79,2}, {79,3}, {79,4}, {79,6}, {79,7}, {79,8}, {79,9}, {79,10}, {79,11}, {79,12}, {79,13}, {79,15}, {79,17}, {79,18}, {79,19}, {79,20}, {79,21}, {79,22}, {79,23}, {79,24}, {79,25}, {79,27}, {79,28}, {79,29}, {79,30}, {79,31}, {79,33}, {79,34}, {79,35}, {79,36}, {79,37}, {79,38}, {79,39}, {79,46}, {79,50}, {79,51}, {79,57}, {79,58}, {79,62}, {79,74}, {79,75}, {79,104}, {79,105}, {79,109}, {79,119}, {79,131}, {79,139}, {79,143}, {79,144}, {80,-105}, {80,-104}, {80,-103}, {80,-102}, {80,-101}, {80,-100}, {80,-99}, {80,-98}, {80,-97}, {80,-96}, {80,-95}, {80,-94}, {80,-93}, {80,-92}, {80,-91}, {80,-90}, {80,-89}, {80,-88}, {80,-77}, {80,-76}, {80,-75}, {80,-58}, {80,-56}, {80,-55}, {80,-54}, {80,-53}, {80,-52}, {80,-36}, {80,-35}, {80,-26}, {80,-17}, {80,-16}, {80,-12}, {80,-11}, {80,1}, {80,9}, {80,15}, {80,22}, {80,30}, {80,39}, {80,46}, {80,50}, {80,51}, {80,57}, {80,58}, {80,62}, {80,74}, {80,75}, {80,79}, {80,80}, {80,86}, {80,90}, {80,100}, {80,104}, {80,105}, {80,109}, {80,119}, {80,131}, {80,139}, {80,143}, {80,144}, {81,-104}, {81,-103}, {81,-102}, {81,-101}, {81,-100}, {81,-99}, {81,-98}, {81,-97}, {81,-96}, {81,-95}, {81,-94}, {81,-93}, {81,-92}, {81,-77}, {81,-76}, {81,-75}, {81,-58}, {81,-55}, {81,-54}, {81,-53}, {81,-52}, {81,-36}, {81,-35}, {81,-26}, {81,-17}, {81,-16}, {81,-12}, {81,-11}, {81,1}, {81,9}, {81,15}, {81,22}, {81,30}, {81,39}, {81,46}, {81,50}, {81,51}, {81,57}, {81,58}, {81,59}, {81,61}, {81,62}, {81,63}, {81,64}, {81,65}, {81,66}, {81,67}, {81,68}, {81,69}, {81,70}, {81,71}, {81,72}, {81,73}, {81,74}, {81,75}, {81,76}, {81,77}, {81,78}, {81,79}, {81,80}, {81,81}, {81,82}, {81,83}, {81,84}, {81,85}, {81,86}, {81,88}, {81,89}, {81,90}, {81,91}, {81,92}, {81,93}, {81,94}, {81,95}, {81,96}, {81,97}, {81,99}, {81,100}, {81,101}, {81,102}, {81,103}, {81,104}, {81,105}, {81,109}, {81,110}, {81,112}, {81,113}, {81,114}, {81,115}, {81,116}, {81,117}, {81,118}, {81,119}, {81,120}, {81,122}, {81,123}, {81,124}, {81,125}, {81,126}, {81,127}, {81,128}, {81,129}, {81,131}, {81,132}, {81,133}, {81,134}, {81,135}, {81,136}, {81,138}, {81,139}, {81,140}, {81,142}, {81,143}, {81,144}, {82,-104}, {82,-103}, {82,-102}, {82,-101}, {82,-100}, {82,-99}, {82,-98}, {82,-97}, {82,-96}, {82,-76}, {82,-75}, {82,-58}, {82,-55}, {82,-54}, {82,-53}, {82,-36}, {82,-35}, {82,-34}, {82,-33}, {82,-32}, {82,-31}, {82,-29}, {82,-28}, {82,-27}, {82,-26}, {82,-25}, {82,-24}, {82,-23}, {82,-22}, {82,-21}, {82,-20}, {82,-19}, {82,-18}, {82,-17}, {82,-16}, {82,-15}, {82,-13}, {82,-12}, {82,-11}, {82,-10}, {82,-9}, {82,-8}, {82,-7}, {82,-6}, {82,-5}, {82,-4}, {82,-3}, {82,-2}, {82,-1}, {82,0}, {82,1}, {82,2}, {82,3}, {82,4}, {82,5}, {82,6}, {82,7}, {82,8}, {82,9}, {82,10}, {82,11}, {82,12}, {82,13}, {82,14}, {82,15}, {82,16}, {82,17}, {82,18}, {82,19}, {82,20}, {82,21}, {82,22}, {82,23}, {82,24}, {82,25}, {82,26}, {82,27}, {82,28}, {82,29}, {82,30}, {82,31}, {82,32}, {82,33}, {82,34}, {82,35}, {82,36}, {82,37}, {82,38}, {82,39}, {82,40}, {82,41}, {82,42}, {82,43}, {82,44}, {82,45}, {82,46}, {82,47}, {82,48}, {82,49}, {82,50}, {82,51}, {82,57}, {82,58}, {82,62}, {82,74}, {82,88}, {82,96}, {82,104}, {82,105}, {82,109}, {82,115}, {82,119}, {82,126}, {82,131}, {82,135}, {82,139}, {82,143}, {82,144}, {83,-104}, {83,-103}, {83,-102}, {83,-101}, {83,-100}, {83,-76}, {83,-75}, {83,-74}, {83,-58}, {83,-57}, {83,-56}, {83,-55}, {83,-54}, {83,-53}, {83,-36}, {83,-35}, {83,-34}, {83,-33}, {83,-32}, {83,-31}, {83,-29}, {83,-28}, {83,-27}, {83,-26}, {83,-25}, {83,-24}, {83,-23}, {83,-22}, {83,-21}, {83,-20}, {83,-19}, {83,-18}, {83,-17}, {83,-16}, {83,-15}, {83,-13}, {83,-12}, {83,-11}, {83,-10}, {83,-9}, {83,-8}, {83,-7}, {83,-6}, {83,-5}, {83,-4}, {83,-3}, {83,-2}, {83,-1}, {83,0}, {83,1}, {83,2}, {83,3}, {83,4}, {83,5}, {83,6}, {83,7}, {83,8}, {83,9}, {83,10}, {83,11}, {83,12}, {83,13}, {83,14}, {83,15}, {83,16}, {83,17}, {83,18}, {83,19}, {83,20}, {83,21}, {83,22}, {83,23}, {83,24}, {83,25}, {83,26}, {83,27}, {83,28}, {83,29}, {83,30}, {83,31}, {83,32}, {83,33}, {83,34}, {83,35}, {83,36}, {83,37}, {83,38}, {83,39}, {83,40}, {83,41}, {83,42}, {83,43}, {83,44}, {83,45}, {83,46}, {83,47}, {83,48}, {83,49}, {83,50}, {83,51}, {83,57}, {83,58}, {83,88}, {83,109}, {83,119}, {83,126}, {83,135}, {83,139}, {83,143}, {83,144}, {84,-76}, {84,-75}, {84,-74}, {84,-58}, {84,-57}, {84,-56}, {84,-55}, {84,-54}, {84,-36}, {84,-35}, {84,57}, {84,58}, {84,62}, {84,74}, {84,88}, {84,96}, {84,104}, {84,105}, {84,109}, {84,115}, {84,119}, {84,126}, {84,131}, {84,135}, {84,139}, {84,143}, {84,144}, {85,-75}, {85,-74}, {85,-73}, {85,-72}, {85,-71}, {85,-70}, {85,-69}, {85,-68}, {85,-67}, {85,-66}, {85,-65}, {85,-64}, {85,-63}, {85,-62}, {85,-61}, {85,-60}, {85,-59}, {85,-58}, {85,-57}, {85,-56}, {85,-55}, {85,57}, {85,58}, {85,59}, {85,60}, {85,61}, {85,62}, {85,63}, {85,64}, {85,65}, {85,66}, {85,67}, {85,68}, {85,69}, {85,70}, {85,71}, {85,72}, {85,73}, {85,74}, {85,75}, {85,76}, {85,77}, {85,78}, {85,79}, {85,80}, {85,81}, {85,82}, {85,83}, {85,84}, {85,85}, {85,86}, {85,87}, {85,88}, {85,89}, {85,90}, {85,91}, {85,92}, {85,95}, {85,96}, {85,97}, {85,98}, {85,99}, {85,100}, {85,101}, {85,102}, {85,103}, {85,104}, {85,105}, {85,106}, {85,107}, {85,108}, {85,109}, {85,110}, {85,111}, {85,112}, {85,113}, {85,114}, {85,115}, {85,116}, {85,117}, {85,118}, {85,119}, {85,120}, {85,121}, {85,122}, {85,123}, {85,124}, {85,125}, {85,126}, {85,127}, {85,128}, {85,129}, {85,130}, {85,131}, {85,132}, {85,133}, {85,134}, {85,135}, {85,136}, {85,137}, {85,138}, {85,139}, {85,140}, {85,141}, {85,142}, {85,143}, {85,144}, {86,-75}, {86,-74}, {86,-73}, {86,-72}, {86,-71}, {86,-70}, {86,-69}, {86,-68}, {86,-67}, {86,-66}, {86,-65}, {86,-64}, {86,-63}, {86,-62}, {86,-61}, {86,-60}, {86,-59}, {86,-58}, {86,-57}, {86,57}, {86,58}, {86,59}, {86,60}, {86,61}, {86,62}, {86,63}, {86,64}, {86,65}, {86,66}, {86,67}, {86,68}, {86,69}, {86,70}, {86,71}, {86,72}, {86,73}, {86,74}, {86,75}, {86,76}, {86,77}, {86,78}, {86,79}, {86,80}, {86,81}, {86,82}, {86,83}, {86,84}, {86,85}, {86,86}, {86,87}, {86,88}, {86,89}, {86,90}, {86,91}, {86,92}, {86,95}, {86,96}, {86,97}, {86,98}, {86,99}, {86,100}, {86,101}, {86,102}, {86,103}, {86,104}, {86,105}, {86,106}, {86,107}, {86,108}, {86,109}, {86,110}, {86,111}, {86,112}, {86,113}, {86,114}, {86,115}, {86,116}, {86,117}, {86,118}, {86,119}, {86,120}, {86,121}, {86,122}, {86,123}, {86,124}, {86,125}, {86,126}, {86,127}, {86,128}, {86,129}, {86,130}, {86,131}, {86,132}, {86,133}, {86,134}, {86,135}, {86,136}, {86,137}, {86,138}, {86,139}, {86,140}, {86,141}, {86,142}, {86,143}, {86,144}, }, + ["stone-path"] = {{-88,-10}, {-88,-9}, {-88,-8}, {-88,-7}, {-88,-6}, {-88,-5}, {-88,-4}, {-88,-3}, {-88,-2}, {-88,-1}, {-88,0}, {-88,1}, {-88,2}, {-88,3}, {-88,4}, {-88,5}, {-88,6}, {-88,7}, {-88,8}, {-88,9}, {-88,10}, {-88,11}, {-88,12}, {-88,13}, {-88,14}, {-88,15}, {-88,16}, {-88,17}, {-88,18}, {-88,19}, {-88,20}, {-88,21}, {-88,22}, {-87,-11}, {-87,23}, {-85,51}, {-85,59}, {-84,51}, {-82,96}, {-81,67}, {-81,68}, {-81,72}, {-81,91}, {-81,96}, {-81,115}, {-81,116}, {-81,117}, {-80,72}, {-80,91}, {-80,96}, {-79,71}, {-79,92}, {-79,96}, {-78,71}, {-78,92}, {-78,96}, {-77,71}, {-77,92}, {-77,96}, {-77,118}, {-76,71}, {-76,92}, {-76,96}, {-75,71}, {-75,92}, {-75,96}, {-74,5}, {-74,6}, {-74,7}, {-74,71}, {-74,92}, {-74,96}, {-73,71}, {-73,92}, {-73,96}, {-72,-27}, {-72,71}, {-72,92}, {-72,96}, {-71,-27}, {-71,71}, {-71,92}, {-71,96}, {-70,-27}, {-70,71}, {-70,92}, {-70,96}, {-69,-27}, {-69,71}, {-69,92}, {-68,-27}, {-68,71}, {-68,92}, {-67,-27}, {-67,71}, {-67,92}, {-66,-27}, {-66,71}, {-66,92}, {-65,-27}, {-65,71}, {-65,92}, {-65,135}, {-65,136}, {-64,-27}, {-64,72}, {-64,91}, {-63,-27}, {-63,72}, {-63,91}, {-62,-27}, {-62,69}, {-61,-27}, {-61,-13}, {-61,56}, {-61,64}, {-60,-27}, {-60,-13}, {-60,56}, {-60,64}, {-59,-27}, {-59,-13}, {-59,56}, {-59,64}, {-58,-27}, {-57,-27}, {-57,46}, {-56,-27}, {-56,46}, {-55,-27}, {-55,46}, {-54,-27}, {-54,46}, {-53,-27}, {-53,46}, {-53,76}, {-53,77}, {-53,78}, {-53,79}, {-53,80}, {-53,83}, {-53,84}, {-53,85}, {-53,86}, {-53,87}, {-53,88}, {-53,89}, {-53,90}, {-53,91}, {-53,97}, {-53,106}, {-52,-27}, {-52,46}, {-52,97}, {-52,106}, {-51,-27}, {-51,-13}, {-51,46}, {-51,47}, {-51,48}, {-51,93}, {-50,-27}, {-50,-13}, {-50,46}, {-50,74}, {-50,93}, {-49,-27}, {-49,-13}, {-49,46}, {-49,73}, {-49,74}, {-49,81}, {-49,82}, {-49,93}, {-48,-27}, {-48,46}, {-48,72}, {-48,73}, {-48,93}, {-47,-27}, {-47,46}, {-47,68}, {-47,73}, {-47,74}, {-47,93}, {-46,-27}, {-46,46}, {-46,67}, {-46,74}, {-46,78}, {-46,85}, {-46,90}, {-46,93}, {-45,-27}, {-45,46}, {-45,67}, {-45,74}, {-45,78}, {-45,85}, {-45,90}, {-45,93}, {-45,114}, {-44,-27}, {-44,46}, {-44,67}, {-44,74}, {-44,78}, {-44,85}, {-44,90}, {-44,93}, {-43,-27}, {-43,46}, {-43,68}, {-43,73}, {-43,74}, {-43,93}, {-42,-27}, {-42,46}, {-42,72}, {-42,73}, {-42,93}, {-41,-27}, {-41,46}, {-41,73}, {-41,74}, {-41,81}, {-41,82}, {-41,93}, {-40,-27}, {-40,46}, {-40,74}, {-40,93}, {-39,-27}, {-39,41}, {-39,42}, {-39,43}, {-39,44}, {-39,45}, {-39,46}, {-39,47}, {-39,48}, {-39,93}, {-38,-27}, {-38,97}, {-38,106}, {-37,76}, {-37,77}, {-37,78}, {-37,79}, {-37,80}, {-37,83}, {-37,84}, {-37,85}, {-37,86}, {-37,87}, {-37,88}, {-37,89}, {-37,90}, {-37,91}, {-37,97}, {-37,106}, {-36,5}, {-36,6}, {-36,7}, {-36,8}, {-36,9}, {-31,56}, {-31,64}, {-28,115}, {-27,115}, {-27,140}, {-27,141}, {-27,142}, {-27,143}, {-27,144}, {-26,115}, {-25,115}, {-24,115}, {-23,-11}, {-23,80}, {-23,81}, {-23,82}, {-23,83}, {-23,115}, {-22,-10}, {-22,-9}, {-22,-8}, {-22,-7}, {-22,-6}, {-22,-5}, {-22,-4}, {-22,-3}, {-22,-2}, {-22,-1}, {-22,0}, {-22,1}, {-22,2}, {-22,3}, {-22,4}, {-22,5}, {-22,6}, {-22,7}, {-22,8}, {-22,9}, {-22,10}, {-22,11}, {-22,12}, {-22,13}, {-22,14}, {-22,15}, {-22,16}, {-22,17}, {-22,18}, {-22,19}, {-22,20}, {-22,21}, {-22,22}, {-22,23}, {-10,31}, {-9,31}, {-9,71}, {-8,31}, {-8,71}, {-7,31}, {-3,77}, {-2,77}, {9,76}, {9,84}, {10,76}, {10,84}, {11,76}, {11,84}, {12,76}, {12,84}, {13,76}, {13,84}, {19,76}, {19,84}, {20,76}, {20,84}, {21,76}, {21,84}, {22,76}, {22,84}, {23,76}, {23,84}, {54,-96}, {58,-34}, {58,-33}, {58,-32}, {58,-31}, {58,-30}, {58,-29}, {58,-28}, {58,-27}, {58,-26}, {58,-25}, {58,-24}, {58,-23}, {58,-22}, {58,-21}, {58,-20}, {58,-19}, {58,-18}, {67,-80}, {68,93}, {68,97}, {69,92}, {69,98}, {70,91}, {70,99}, {74,91}, {74,99}, {75,92}, {75,98}, {76,93}, {76,97}, {77,-65}, {78,-65}, {79,-65}, {80,-65}, {81,-65}, {82,-65}, {83,-65}, {84,-65}, }, + ["black-refined-concrete"] = {{-86,98}, {-86,99}, {-86,100}, {-86,101}, {-85,-24}, {-85,-23}, {-85,-22}, {-85,-21}, {-85,-20}, {-85,-19}, {-85,-18}, {-85,-17}, {-85,-16}, {-85,-15}, {-85,-14}, {-85,26}, {-85,27}, {-85,29}, {-85,31}, {-85,33}, {-85,35}, {-85,36}, {-85,98}, {-85,99}, {-85,100}, {-85,101}, {-84,-24}, {-84,-23}, {-84,-22}, {-84,-21}, {-84,-20}, {-84,-19}, {-84,-18}, {-84,-17}, {-84,-16}, {-84,-15}, {-84,-14}, {-84,26}, {-84,27}, {-84,29}, {-84,31}, {-84,33}, {-84,35}, {-84,36}, {-84,100}, {-83,-23}, {-83,-15}, {-83,-14}, {-83,26}, {-83,27}, {-83,29}, {-83,31}, {-83,33}, {-83,35}, {-83,36}, {-82,-24}, {-82,-23}, {-82,-22}, {-82,-21}, {-82,-20}, {-82,-19}, {-82,-18}, {-82,-17}, {-82,-15}, {-82,-14}, {-82,26}, {-82,27}, {-82,29}, {-82,31}, {-82,33}, {-82,35}, {-82,36}, {-81,-24}, {-81,-23}, {-81,-22}, {-81,-21}, {-81,-20}, {-81,-19}, {-81,-18}, {-81,-17}, {-81,-15}, {-81,-14}, {-81,26}, {-81,27}, {-81,28}, {-81,29}, {-81,31}, {-81,33}, {-81,35}, {-81,36}, {-80,-23}, {-80,-15}, {-80,-14}, {-80,29}, {-80,31}, {-80,33}, {-80,35}, {-80,36}, {-80,43}, {-80,44}, {-80,45}, {-80,46}, {-80,47}, {-80,48}, {-79,-24}, {-79,-23}, {-79,-22}, {-79,-21}, {-79,-20}, {-79,-19}, {-79,-18}, {-79,-17}, {-79,-15}, {-79,-14}, {-79,26}, {-79,27}, {-79,29}, {-79,30}, {-79,31}, {-79,32}, {-79,33}, {-79,35}, {-79,36}, {-79,47}, {-79,48}, {-79,52}, {-78,-24}, {-78,-23}, {-78,-22}, {-78,-21}, {-78,-20}, {-78,-19}, {-78,-18}, {-78,-17}, {-78,-15}, {-78,-14}, {-78,26}, {-78,27}, {-78,35}, {-78,36}, {-78,43}, {-78,44}, {-78,45}, {-78,47}, {-78,48}, {-78,51}, {-78,52}, {-78,54}, {-78,55}, {-78,56}, {-78,57}, {-78,58}, {-78,59}, {-78,62}, {-78,63}, {-78,64}, {-78,65}, {-78,66}, {-77,-15}, {-77,-14}, {-77,26}, {-77,27}, {-77,28}, {-77,29}, {-77,30}, {-77,31}, {-77,32}, {-77,33}, {-77,34}, {-77,35}, {-77,36}, {-77,43}, {-77,44}, {-77,45}, {-77,47}, {-77,48}, {-77,51}, {-77,52}, {-77,54}, {-77,55}, {-77,56}, {-77,57}, {-77,58}, {-77,59}, {-77,62}, {-77,63}, {-77,64}, {-77,65}, {-77,66}, {-76,-24}, {-76,-23}, {-76,-22}, {-76,-21}, {-76,-20}, {-76,-19}, {-76,-17}, {-76,-16}, {-76,-15}, {-76,-14}, {-76,26}, {-76,27}, {-76,28}, {-76,29}, {-76,30}, {-76,31}, {-76,32}, {-76,33}, {-76,34}, {-76,35}, {-76,36}, {-76,43}, {-76,44}, {-76,45}, {-76,46}, {-76,47}, {-76,48}, {-75,-24}, {-75,-23}, {-75,-22}, {-75,-21}, {-75,-20}, {-75,-19}, {-75,-17}, {-75,-16}, {-75,-15}, {-75,-14}, {-75,43}, {-75,44}, {-75,45}, {-75,47}, {-75,48}, {-74,43}, {-74,44}, {-74,45}, {-74,47}, {-74,48}, {-73,26}, {-73,27}, {-73,28}, {-73,31}, {-73,32}, {-73,33}, {-73,34}, {-73,35}, {-72,27}, {-72,28}, {-72,31}, {-72,32}, {-72,33}, {-72,34}, {-72,35}, {-72,43}, {-72,44}, {-72,45}, {-72,46}, {-72,47}, {-72,48}, {-71,27}, {-71,28}, {-71,31}, {-71,48}, {-71,104}, {-71,105}, {-70,-70}, {-70,-69}, {-70,27}, {-70,28}, {-70,31}, {-70,32}, {-70,33}, {-70,34}, {-70,35}, {-70,42}, {-70,43}, {-70,44}, {-70,45}, {-70,46}, {-70,47}, {-70,48}, {-70,104}, {-70,105}, {-69,-77}, {-69,-76}, {-69,-75}, {-69,-74}, {-69,-73}, {-69,-72}, {-69,-70}, {-69,-69}, {-69,-67}, {-69,-66}, {-69,-65}, {-69,-64}, {-69,-63}, {-69,-62}, {-69,27}, {-69,28}, {-69,31}, {-69,32}, {-69,33}, {-69,34}, {-69,35}, {-69,42}, {-69,43}, {-69,44}, {-69,45}, {-69,46}, {-69,47}, {-69,48}, {-69,104}, {-69,105}, {-68,-77}, {-68,-76}, {-68,-75}, {-68,-74}, {-68,-73}, {-68,-72}, {-68,-71}, {-68,-70}, {-68,-69}, {-68,-68}, {-68,-67}, {-68,-66}, {-68,-65}, {-68,-64}, {-68,-63}, {-68,-62}, {-68,27}, {-68,28}, {-68,31}, {-68,42}, {-68,43}, {-68,44}, {-68,45}, {-68,46}, {-68,47}, {-68,48}, {-68,100}, {-68,104}, {-68,105}, {-67,-77}, {-67,-76}, {-67,-74}, {-67,-73}, {-67,-71}, {-67,-70}, {-67,-69}, {-67,-68}, {-67,-66}, {-67,-65}, {-67,-63}, {-67,-62}, {-67,27}, {-67,28}, {-67,31}, {-67,32}, {-67,33}, {-67,34}, {-67,35}, {-67,42}, {-67,43}, {-67,44}, {-67,45}, {-67,46}, {-67,47}, {-67,48}, {-67,98}, {-67,99}, {-67,100}, {-67,101}, {-67,104}, {-67,105}, {-66,-77}, {-66,-76}, {-66,-75}, {-66,-74}, {-66,-73}, {-66,-72}, {-66,-71}, {-66,-70}, {-66,-69}, {-66,-68}, {-66,-67}, {-66,-66}, {-66,-65}, {-66,-64}, {-66,-63}, {-66,-62}, {-66,27}, {-66,28}, {-66,31}, {-66,32}, {-66,33}, {-66,34}, {-66,35}, {-66,42}, {-66,43}, {-66,44}, {-66,45}, {-66,46}, {-66,47}, {-66,48}, {-66,98}, {-66,99}, {-66,100}, {-66,101}, {-66,104}, {-66,105}, {-65,-77}, {-65,-76}, {-65,-75}, {-65,-74}, {-65,-71}, {-65,-70}, {-65,-69}, {-65,-68}, {-65,-65}, {-65,-64}, {-65,-63}, {-65,-62}, {-65,27}, {-65,28}, {-65,31}, {-65,48}, {-65,51}, {-65,52}, {-65,54}, {-65,55}, {-65,56}, {-65,58}, {-65,59}, {-65,62}, {-65,63}, {-65,64}, {-65,65}, {-65,66}, {-65,100}, {-64,-77}, {-64,-76}, {-64,-74}, {-64,-71}, {-64,-70}, {-64,-69}, {-64,-68}, {-64,-65}, {-64,-63}, {-64,-62}, {-64,27}, {-64,28}, {-64,29}, {-64,30}, {-64,31}, {-64,32}, {-64,33}, {-64,34}, {-64,35}, {-64,43}, {-64,44}, {-64,45}, {-64,46}, {-64,47}, {-64,48}, {-64,51}, {-64,52}, {-64,53}, {-64,54}, {-64,55}, {-64,56}, {-64,57}, {-64,58}, {-64,59}, {-64,62}, {-64,63}, {-64,64}, {-64,65}, {-64,66}, {-64,100}, {-63,-77}, {-63,-76}, {-63,-75}, {-63,-74}, {-63,-73}, {-63,-72}, {-63,-71}, {-63,-70}, {-63,-69}, {-63,-68}, {-63,-67}, {-63,-66}, {-63,-65}, {-63,-64}, {-63,-63}, {-63,27}, {-63,28}, {-63,31}, {-63,32}, {-63,33}, {-63,34}, {-63,35}, {-63,98}, {-63,99}, {-63,100}, {-63,101}, {-63,102}, {-63,103}, {-63,104}, {-63,105}, {-63,106}, {-63,107}, {-63,108}, {-63,109}, {-63,110}, {-63,111}, {-63,112}, {-63,113}, {-63,114}, {-63,115}, {-63,116}, {-63,117}, {-63,118}, {-63,119}, {-63,120}, {-63,121}, {-63,122}, {-63,123}, {-63,124}, {-63,125}, {-63,126}, {-63,127}, {-63,128}, {-63,129}, {-63,130}, {-63,131}, {-63,132}, {-63,133}, {-63,134}, {-63,135}, {-63,136}, {-63,137}, {-62,-77}, {-62,-76}, {-62,-75}, {-62,-74}, {-62,-73}, {-62,-72}, {-62,-71}, {-62,-70}, {-62,-69}, {-62,-68}, {-62,-67}, {-62,-66}, {-62,-65}, {-62,-64}, {-62,-63}, {-62,-62}, {-62,-61}, {-62,27}, {-62,98}, {-62,99}, {-62,100}, {-62,101}, {-62,102}, {-62,103}, {-62,104}, {-62,105}, {-62,106}, {-62,107}, {-62,108}, {-62,109}, {-62,110}, {-62,111}, {-62,112}, {-62,113}, {-62,114}, {-62,115}, {-62,116}, {-62,117}, {-62,118}, {-62,119}, {-62,120}, {-62,121}, {-62,122}, {-62,123}, {-62,124}, {-62,125}, {-62,126}, {-62,127}, {-62,128}, {-62,129}, {-62,130}, {-62,131}, {-62,132}, {-62,133}, {-62,134}, {-62,135}, {-62,136}, {-62,137}, {-61,-77}, {-61,-76}, {-61,-75}, {-61,-74}, {-61,-73}, {-61,-72}, {-61,-71}, {-61,-70}, {-61,-69}, {-61,-68}, {-61,-67}, {-61,-66}, {-61,-65}, {-61,-64}, {-61,-63}, {-61,-62}, {-61,-61}, {-61,26}, {-61,27}, {-61,28}, {-61,29}, {-61,30}, {-61,31}, {-61,32}, {-61,33}, {-61,34}, {-61,35}, {-61,36}, {-61,115}, {-61,116}, {-61,117}, {-61,126}, {-61,127}, {-61,135}, {-61,136}, {-61,137}, {-60,-77}, {-60,-76}, {-60,-75}, {-60,-74}, {-60,-73}, {-60,-72}, {-60,-71}, {-60,-70}, {-60,-69}, {-60,-68}, {-60,-67}, {-60,-66}, {-60,-65}, {-60,-64}, {-60,-63}, {-60,26}, {-60,27}, {-60,28}, {-60,29}, {-60,31}, {-60,34}, {-60,115}, {-60,116}, {-60,117}, {-60,126}, {-60,127}, {-60,135}, {-60,136}, {-60,137}, {-59,-77}, {-59,-76}, {-59,-74}, {-59,-71}, {-59,-70}, {-59,-69}, {-59,-68}, {-59,-65}, {-59,-63}, {-59,-62}, {-59,26}, {-59,27}, {-59,28}, {-59,29}, {-59,31}, {-59,32}, {-59,34}, {-59,35}, {-59,85}, {-59,86}, {-59,87}, {-59,88}, {-59,89}, {-59,90}, {-59,91}, {-59,94}, {-59,95}, {-59,96}, {-59,97}, {-59,98}, {-59,99}, {-59,100}, {-59,101}, {-59,102}, {-59,103}, {-59,104}, {-59,105}, {-59,106}, {-59,107}, {-59,108}, {-59,109}, {-59,110}, {-59,111}, {-59,112}, {-59,115}, {-59,116}, {-59,117}, {-59,126}, {-59,127}, {-59,135}, {-59,136}, {-59,137}, {-58,-77}, {-58,-76}, {-58,-75}, {-58,-74}, {-58,-71}, {-58,-70}, {-58,-69}, {-58,-68}, {-58,-65}, {-58,-64}, {-58,-63}, {-58,-62}, {-58,27}, {-58,28}, {-58,29}, {-58,31}, {-58,32}, {-58,34}, {-58,35}, {-58,85}, {-58,86}, {-58,87}, {-58,88}, {-58,89}, {-58,90}, {-58,91}, {-58,94}, {-58,100}, {-58,103}, {-58,104}, {-58,105}, {-58,106}, {-58,107}, {-58,108}, {-58,112}, {-58,115}, {-58,116}, {-58,117}, {-58,126}, {-58,127}, {-58,135}, {-58,136}, {-58,137}, {-57,-77}, {-57,-76}, {-57,-75}, {-57,-74}, {-57,-73}, {-57,-72}, {-57,-71}, {-57,-70}, {-57,-69}, {-57,-68}, {-57,-67}, {-57,-66}, {-57,-65}, {-57,-64}, {-57,-63}, {-57,-62}, {-57,27}, {-57,28}, {-57,29}, {-57,31}, {-57,32}, {-57,34}, {-57,35}, {-57,84}, {-57,85}, {-57,86}, {-57,87}, {-57,88}, {-57,89}, {-57,90}, {-57,91}, {-57,94}, {-57,95}, {-57,96}, {-57,97}, {-57,100}, {-57,101}, {-57,103}, {-57,104}, {-57,105}, {-57,106}, {-57,107}, {-57,108}, {-57,110}, {-57,111}, {-57,112}, {-57,115}, {-57,116}, {-57,117}, {-57,126}, {-57,127}, {-57,135}, {-57,136}, {-57,137}, {-56,-77}, {-56,-76}, {-56,-74}, {-56,-73}, {-56,-71}, {-56,-70}, {-56,-69}, {-56,-68}, {-56,-66}, {-56,-65}, {-56,-63}, {-56,-62}, {-56,27}, {-56,28}, {-56,29}, {-56,85}, {-56,86}, {-56,87}, {-56,88}, {-56,89}, {-56,90}, {-56,91}, {-56,100}, {-56,101}, {-56,103}, {-56,104}, {-56,105}, {-56,106}, {-56,107}, {-56,108}, {-56,112}, {-56,115}, {-56,116}, {-56,117}, {-56,126}, {-56,127}, {-56,135}, {-56,136}, {-56,137}, {-55,-77}, {-55,-76}, {-55,-75}, {-55,-74}, {-55,-73}, {-55,-72}, {-55,-71}, {-55,-70}, {-55,-69}, {-55,-68}, {-55,-67}, {-55,-66}, {-55,-65}, {-55,-64}, {-55,-63}, {-55,-62}, {-55,27}, {-55,28}, {-55,29}, {-55,30}, {-55,31}, {-55,32}, {-55,33}, {-55,34}, {-55,35}, {-55,85}, {-55,86}, {-55,87}, {-55,88}, {-55,89}, {-55,90}, {-55,91}, {-55,94}, {-55,95}, {-55,96}, {-55,97}, {-55,100}, {-55,101}, {-55,103}, {-55,104}, {-55,105}, {-55,106}, {-55,107}, {-55,108}, {-55,110}, {-55,111}, {-55,112}, {-55,115}, {-55,116}, {-55,117}, {-55,126}, {-55,127}, {-55,135}, {-55,136}, {-55,137}, {-54,-77}, {-54,-76}, {-54,-75}, {-54,-74}, {-54,-73}, {-54,-72}, {-54,-70}, {-54,-69}, {-54,-67}, {-54,-66}, {-54,-65}, {-54,-64}, {-54,-63}, {-54,-62}, {-54,27}, {-54,28}, {-54,29}, {-54,31}, {-54,94}, {-54,95}, {-54,96}, {-54,97}, {-54,100}, {-54,101}, {-54,103}, {-54,104}, {-54,105}, {-54,106}, {-54,107}, {-54,108}, {-54,110}, {-54,111}, {-54,112}, {-54,115}, {-54,116}, {-54,117}, {-54,126}, {-54,127}, {-54,129}, {-54,130}, {-54,131}, {-54,132}, {-54,133}, {-54,135}, {-54,136}, {-54,137}, {-53,-70}, {-53,-69}, {-53,27}, {-53,28}, {-53,29}, {-53,31}, {-53,32}, {-53,33}, {-53,34}, {-53,35}, {-53,115}, {-53,116}, {-53,117}, {-53,126}, {-53,127}, {-53,135}, {-53,136}, {-53,137}, {-52,27}, {-52,28}, {-52,29}, {-52,31}, {-52,115}, {-52,116}, {-52,117}, {-52,120}, {-52,121}, {-52,122}, {-52,123}, {-52,124}, {-52,126}, {-52,127}, {-52,135}, {-52,136}, {-52,137}, {-51,26}, {-51,27}, {-51,28}, {-51,29}, {-51,31}, {-51,32}, {-51,33}, {-51,34}, {-51,35}, {-51,115}, {-51,116}, {-51,117}, {-51,120}, {-51,121}, {-51,122}, {-51,123}, {-51,124}, {-51,126}, {-51,127}, {-51,135}, {-51,136}, {-51,137}, {-50,26}, {-50,27}, {-50,28}, {-50,29}, {-50,115}, {-50,116}, {-50,117}, {-50,126}, {-50,127}, {-50,135}, {-50,136}, {-50,137}, {-49,26}, {-49,27}, {-49,28}, {-49,29}, {-49,30}, {-49,31}, {-49,32}, {-49,33}, {-49,34}, {-49,35}, {-49,36}, {-49,115}, {-49,116}, {-49,117}, {-49,126}, {-49,127}, {-49,135}, {-49,136}, {-49,137}, {-48,27}, {-48,28}, {-48,29}, {-48,115}, {-48,116}, {-48,117}, {-48,126}, {-48,127}, {-48,135}, {-48,136}, {-48,137}, {-47,27}, {-47,28}, {-47,29}, {-47,30}, {-47,31}, {-47,32}, {-47,33}, {-47,34}, {-47,35}, {-47,115}, {-47,116}, {-47,117}, {-47,126}, {-47,127}, {-47,135}, {-47,136}, {-47,137}, {-46,27}, {-46,28}, {-46,29}, {-46,31}, {-46,32}, {-46,33}, {-46,34}, {-46,35}, {-46,115}, {-46,116}, {-46,117}, {-46,126}, {-46,127}, {-46,129}, {-46,130}, {-46,131}, {-46,132}, {-46,133}, {-46,135}, {-46,136}, {-46,137}, {-45,27}, {-45,28}, {-45,29}, {-45,31}, {-45,115}, {-45,116}, {-45,117}, {-45,118}, {-45,126}, {-45,127}, {-45,135}, {-45,136}, {-45,137}, {-44,27}, {-44,28}, {-44,29}, {-44,31}, {-44,32}, {-44,33}, {-44,34}, {-44,35}, {-44,115}, {-44,116}, {-44,117}, {-44,126}, {-44,127}, {-44,135}, {-44,136}, {-44,137}, {-43,-64}, {-43,-63}, {-43,-62}, {-43,27}, {-43,28}, {-43,29}, {-43,31}, {-43,32}, {-43,33}, {-43,34}, {-43,35}, {-43,115}, {-43,116}, {-43,117}, {-43,126}, {-43,127}, {-43,135}, {-43,136}, {-43,137}, {-42,-64}, {-42,-63}, {-42,-62}, {-42,27}, {-42,28}, {-42,29}, {-42,31}, {-42,115}, {-42,116}, {-42,117}, {-42,126}, {-42,127}, {-42,135}, {-42,136}, {-42,137}, {-41,-64}, {-41,-63}, {-41,-62}, {-41,27}, {-41,28}, {-41,29}, {-41,31}, {-41,32}, {-41,33}, {-41,34}, {-41,35}, {-41,115}, {-41,116}, {-41,117}, {-41,120}, {-41,121}, {-41,122}, {-41,123}, {-41,124}, {-41,126}, {-41,127}, {-41,135}, {-41,136}, {-41,137}, {-40,-64}, {-40,-63}, {-40,-62}, {-40,27}, {-40,28}, {-40,29}, {-40,31}, {-40,32}, {-40,33}, {-40,34}, {-40,35}, {-40,115}, {-40,116}, {-40,117}, {-40,120}, {-40,121}, {-40,122}, {-40,123}, {-40,124}, {-40,126}, {-40,127}, {-40,135}, {-40,136}, {-40,137}, {-39,-64}, {-39,-63}, {-39,-62}, {-39,27}, {-39,28}, {-39,29}, {-39,31}, {-39,115}, {-39,116}, {-39,117}, {-39,126}, {-39,127}, {-39,135}, {-39,136}, {-39,137}, {-38,-64}, {-38,-63}, {-38,-62}, {-38,27}, {-38,28}, {-38,29}, {-38,31}, {-38,32}, {-38,33}, {-38,34}, {-38,35}, {-38,115}, {-38,116}, {-38,117}, {-38,126}, {-38,127}, {-38,129}, {-38,130}, {-38,131}, {-38,132}, {-38,133}, {-38,135}, {-38,136}, {-38,137}, {-37,-64}, {-37,-63}, {-37,-62}, {-37,27}, {-37,28}, {-37,29}, {-37,31}, {-37,32}, {-37,33}, {-37,34}, {-37,35}, {-37,115}, {-37,116}, {-37,117}, {-37,126}, {-37,127}, {-37,135}, {-37,136}, {-37,137}, {-36,94}, {-36,95}, {-36,96}, {-36,97}, {-36,100}, {-36,101}, {-36,103}, {-36,104}, {-36,105}, {-36,106}, {-36,107}, {-36,108}, {-36,110}, {-36,111}, {-36,112}, {-36,115}, {-36,116}, {-36,117}, {-36,126}, {-36,127}, {-36,135}, {-36,136}, {-36,137}, {-35,-64}, {-35,-63}, {-35,-62}, {-35,-24}, {-35,-23}, {-35,-22}, {-35,-21}, {-35,-20}, {-35,-19}, {-35,-17}, {-35,-16}, {-35,-15}, {-35,-14}, {-35,42}, {-35,43}, {-35,44}, {-35,88}, {-35,89}, {-35,90}, {-35,91}, {-35,97}, {-35,100}, {-35,101}, {-35,103}, {-35,104}, {-35,105}, {-35,106}, {-35,107}, {-35,108}, {-35,110}, {-35,111}, {-35,112}, {-35,115}, {-35,116}, {-35,117}, {-35,126}, {-35,127}, {-35,135}, {-35,136}, {-35,137}, {-34,-64}, {-34,-63}, {-34,-62}, {-34,-24}, {-34,-23}, {-34,-22}, {-34,-21}, {-34,-20}, {-34,-19}, {-34,-17}, {-34,-16}, {-34,-15}, {-34,-14}, {-34,26}, {-34,27}, {-34,28}, {-34,29}, {-34,30}, {-34,31}, {-34,32}, {-34,33}, {-34,34}, {-34,35}, {-34,42}, {-34,43}, {-34,44}, {-34,87}, {-34,88}, {-34,89}, {-34,90}, {-34,91}, {-34,94}, {-34,95}, {-34,96}, {-34,97}, {-34,100}, {-34,101}, {-34,103}, {-34,104}, {-34,105}, {-34,106}, {-34,107}, {-34,108}, {-34,111}, {-34,115}, {-34,116}, {-34,117}, {-34,126}, {-34,127}, {-34,135}, {-34,136}, {-34,137}, {-33,-64}, {-33,-63}, {-33,-62}, {-33,-15}, {-33,-14}, {-33,26}, {-33,27}, {-33,28}, {-33,29}, {-33,30}, {-33,31}, {-33,32}, {-33,33}, {-33,34}, {-33,35}, {-33,42}, {-33,43}, {-33,44}, {-33,88}, {-33,89}, {-33,90}, {-33,91}, {-33,100}, {-33,101}, {-33,103}, {-33,104}, {-33,105}, {-33,106}, {-33,107}, {-33,108}, {-33,110}, {-33,111}, {-33,112}, {-33,115}, {-33,116}, {-33,117}, {-33,126}, {-33,127}, {-33,135}, {-33,136}, {-33,137}, {-32,-64}, {-32,-63}, {-32,-62}, {-32,-24}, {-32,-23}, {-32,-22}, {-32,-21}, {-32,-20}, {-32,-19}, {-32,-18}, {-32,-17}, {-32,-15}, {-32,-14}, {-32,26}, {-32,27}, {-32,29}, {-32,30}, {-32,31}, {-32,32}, {-32,33}, {-32,34}, {-32,35}, {-32,42}, {-32,43}, {-32,44}, {-32,94}, {-32,95}, {-32,96}, {-32,97}, {-32,101}, {-32,103}, {-32,104}, {-32,105}, {-32,106}, {-32,107}, {-32,108}, {-32,111}, {-32,115}, {-32,116}, {-32,117}, {-32,120}, {-32,121}, {-32,122}, {-32,123}, {-32,124}, {-32,126}, {-32,127}, {-32,135}, {-32,136}, {-32,137}, {-31,-64}, {-31,-63}, {-31,-62}, {-31,-24}, {-31,-23}, {-31,-22}, {-31,-21}, {-31,-20}, {-31,-19}, {-31,-18}, {-31,-17}, {-31,-15}, {-31,-14}, {-31,26}, {-31,27}, {-31,42}, {-31,43}, {-31,44}, {-31,94}, {-31,95}, {-31,96}, {-31,97}, {-31,98}, {-31,99}, {-31,100}, {-31,101}, {-31,102}, {-31,103}, {-31,104}, {-31,105}, {-31,106}, {-31,107}, {-31,108}, {-31,109}, {-31,110}, {-31,111}, {-31,112}, {-31,115}, {-31,116}, {-31,117}, {-31,120}, {-31,121}, {-31,122}, {-31,123}, {-31,124}, {-31,126}, {-31,127}, {-31,135}, {-31,136}, {-31,137}, {-30,-23}, {-30,-15}, {-30,-14}, {-30,29}, {-30,30}, {-30,31}, {-30,32}, {-30,33}, {-30,34}, {-30,35}, {-30,44}, {-30,120}, {-30,121}, {-30,122}, {-30,123}, {-30,124}, {-30,126}, {-30,127}, {-30,129}, {-30,130}, {-30,131}, {-30,132}, {-30,133}, {-30,135}, {-30,136}, {-30,137}, {-29,-64}, {-29,-63}, {-29,-62}, {-29,-24}, {-29,-23}, {-29,-22}, {-29,-21}, {-29,-20}, {-29,-19}, {-29,-18}, {-29,-17}, {-29,-15}, {-29,-14}, {-29,26}, {-29,27}, {-29,29}, {-29,31}, {-29,33}, {-29,35}, {-29,42}, {-29,43}, {-29,44}, {-29,45}, {-29,46}, {-29,47}, {-29,48}, {-29,49}, {-29,50}, {-29,51}, {-29,52}, {-29,53}, {-29,54}, {-29,55}, {-29,56}, {-29,57}, {-29,58}, {-29,59}, {-29,60}, {-29,61}, {-29,62}, {-29,63}, {-29,64}, {-29,65}, {-29,66}, {-29,67}, {-29,68}, {-29,69}, {-29,70}, {-29,126}, {-29,127}, {-29,135}, {-29,136}, {-29,137}, {-28,-64}, {-28,-63}, {-28,-62}, {-28,-24}, {-28,-23}, {-28,-22}, {-28,-21}, {-28,-20}, {-28,-19}, {-28,-18}, {-28,-17}, {-28,-15}, {-28,-14}, {-28,26}, {-28,27}, {-28,28}, {-28,29}, {-28,31}, {-28,33}, {-28,35}, {-28,42}, {-28,43}, {-28,44}, {-28,45}, {-28,46}, {-28,47}, {-28,48}, {-28,49}, {-28,50}, {-28,51}, {-28,52}, {-28,53}, {-28,54}, {-28,55}, {-28,56}, {-28,57}, {-28,58}, {-28,59}, {-28,60}, {-28,61}, {-28,62}, {-28,63}, {-28,64}, {-28,65}, {-28,66}, {-28,67}, {-28,69}, {-28,70}, {-28,120}, {-28,121}, {-28,122}, {-28,123}, {-28,124}, {-28,125}, {-28,126}, {-28,127}, {-28,128}, {-28,129}, {-28,130}, {-28,131}, {-28,132}, {-28,133}, {-28,134}, {-28,135}, {-28,136}, {-28,137}, {-27,-64}, {-27,-63}, {-27,-62}, {-27,-23}, {-27,-15}, {-27,-14}, {-27,26}, {-27,27}, {-27,29}, {-27,31}, {-27,33}, {-27,35}, {-27,44}, {-27,69}, {-27,70}, {-27,120}, {-27,121}, {-27,122}, {-27,123}, {-27,124}, {-27,125}, {-27,126}, {-27,127}, {-27,128}, {-27,129}, {-27,130}, {-27,131}, {-27,132}, {-27,133}, {-27,134}, {-27,135}, {-27,136}, {-27,137}, {-26,-64}, {-26,-63}, {-26,-62}, {-26,-24}, {-26,-23}, {-26,-22}, {-26,-21}, {-26,-20}, {-26,-19}, {-26,-18}, {-26,-17}, {-26,-16}, {-26,-15}, {-26,-14}, {-26,26}, {-26,27}, {-26,29}, {-26,31}, {-26,33}, {-26,35}, {-26,42}, {-26,43}, {-26,44}, {-26,45}, {-26,46}, {-26,47}, {-26,48}, {-26,49}, {-26,50}, {-26,51}, {-26,52}, {-26,53}, {-26,54}, {-26,55}, {-26,56}, {-26,58}, {-26,59}, {-26,60}, {-26,63}, {-26,64}, {-26,65}, {-26,66}, {-26,67}, {-26,69}, {-26,70}, {-26,126}, {-26,127}, {-26,135}, {-26,136}, {-26,137}, {-25,-64}, {-25,-63}, {-25,-62}, {-25,-24}, {-25,-23}, {-25,-22}, {-25,-21}, {-25,-20}, {-25,-19}, {-25,-18}, {-25,-17}, {-25,-16}, {-25,-15}, {-25,-14}, {-25,26}, {-25,27}, {-25,29}, {-25,31}, {-25,33}, {-25,35}, {-25,42}, {-25,43}, {-25,44}, {-25,54}, {-25,55}, {-25,56}, {-25,58}, {-25,59}, {-25,60}, {-25,63}, {-25,64}, {-25,65}, {-25,66}, {-25,67}, {-25,69}, {-25,70}, {-25,126}, {-25,127}, {-25,135}, {-25,136}, {-25,137}, {-24,-64}, {-24,-63}, {-24,-62}, {-24,42}, {-24,43}, {-24,44}, {-24,46}, {-24,47}, {-24,48}, {-24,49}, {-24,50}, {-24,51}, {-24,52}, {-24,54}, {-24,55}, {-24,56}, {-24,58}, {-24,59}, {-24,60}, {-24,61}, {-24,62}, {-24,63}, {-24,64}, {-24,65}, {-24,66}, {-24,67}, {-24,69}, {-24,70}, {-24,126}, {-24,127}, {-24,135}, {-24,136}, {-24,137}, {-23,-64}, {-23,-63}, {-23,-62}, {-23,42}, {-23,43}, {-23,44}, {-23,46}, {-23,47}, {-23,48}, {-23,49}, {-23,50}, {-23,51}, {-23,52}, {-23,54}, {-23,55}, {-23,56}, {-23,58}, {-23,59}, {-23,60}, {-23,63}, {-23,64}, {-23,65}, {-23,66}, {-23,67}, {-23,69}, {-23,70}, {-23,126}, {-23,127}, {-23,135}, {-23,136}, {-23,137}, {-22,-64}, {-22,-63}, {-22,-62}, {-22,42}, {-22,43}, {-22,44}, {-22,46}, {-22,47}, {-22,48}, {-22,49}, {-22,50}, {-22,51}, {-22,52}, {-22,54}, {-22,55}, {-22,56}, {-22,58}, {-22,59}, {-22,60}, {-22,63}, {-22,64}, {-22,65}, {-22,66}, {-22,67}, {-22,69}, {-22,70}, {-22,126}, {-22,127}, {-22,135}, {-22,136}, {-22,137}, {-21,-64}, {-21,-63}, {-21,-62}, {-21,48}, {-21,49}, {-21,65}, {-21,69}, {-21,70}, {-21,126}, {-21,127}, {-21,135}, {-21,136}, {-21,137}, {-21,140}, {-21,142}, {-21,143}, {-21,144}, {-21,145}, {-21,146}, {-20,-64}, {-20,-63}, {-20,-62}, {-20,48}, {-20,49}, {-20,69}, {-20,70}, {-20,126}, {-20,127}, {-20,135}, {-20,136}, {-20,137}, {-20,140}, {-20,142}, {-20,143}, {-20,144}, {-20,145}, {-20,146}, {-19,-64}, {-19,-63}, {-19,-62}, {-19,38}, {-19,39}, {-19,40}, {-19,43}, {-19,44}, {-19,45}, {-19,46}, {-19,47}, {-19,48}, {-19,49}, {-19,50}, {-19,51}, {-19,52}, {-19,53}, {-19,54}, {-19,57}, {-19,58}, {-19,59}, {-19,69}, {-19,70}, {-19,120}, {-19,121}, {-19,123}, {-19,124}, {-19,126}, {-19,127}, {-19,129}, {-19,130}, {-19,132}, {-19,133}, {-19,135}, {-19,136}, {-19,137}, {-19,140}, {-19,142}, {-19,143}, {-19,144}, {-19,145}, {-19,146}, {-18,38}, {-18,39}, {-18,40}, {-18,43}, {-18,44}, {-18,45}, {-18,46}, {-18,47}, {-18,48}, {-18,49}, {-18,50}, {-18,51}, {-18,52}, {-18,53}, {-18,54}, {-18,55}, {-18,56}, {-18,57}, {-18,58}, {-18,59}, {-18,60}, {-18,69}, {-18,70}, {-18,120}, {-18,121}, {-18,123}, {-18,124}, {-18,126}, {-18,127}, {-18,129}, {-18,130}, {-18,132}, {-18,133}, {-18,135}, {-18,136}, {-18,137}, {-18,140}, {-18,142}, {-18,143}, {-18,144}, {-18,145}, {-18,146}, {-17,-64}, {-17,-63}, {-17,-62}, {-17,38}, {-17,39}, {-17,40}, {-17,43}, {-17,44}, {-17,45}, {-17,46}, {-17,47}, {-17,48}, {-17,49}, {-17,50}, {-17,51}, {-17,52}, {-17,53}, {-17,54}, {-17,57}, {-17,58}, {-17,59}, {-17,69}, {-17,70}, {-17,124}, {-17,126}, {-17,127}, {-17,133}, {-17,135}, {-17,136}, {-17,137}, {-17,140}, {-17,141}, {-17,142}, {-17,143}, {-17,144}, {-17,145}, {-17,146}, {-16,-64}, {-16,-63}, {-16,-62}, {-16,39}, {-16,69}, {-16,70}, {-16,126}, {-16,127}, {-16,135}, {-16,136}, {-16,137}, {-16,140}, {-16,142}, {-16,143}, {-16,144}, {-16,145}, {-16,146}, {-15,-64}, {-15,-63}, {-15,-62}, {-15,69}, {-15,70}, {-15,126}, {-15,127}, {-15,135}, {-15,136}, {-15,137}, {-15,140}, {-15,142}, {-15,143}, {-15,144}, {-15,145}, {-15,146}, {-14,-64}, {-14,-63}, {-14,-62}, {-14,69}, {-14,70}, {-14,126}, {-14,127}, {-14,135}, {-14,136}, {-14,137}, {-14,140}, {-13,-64}, {-13,-63}, {-13,-62}, {-13,69}, {-13,70}, {-13,126}, {-13,127}, {-13,135}, {-13,136}, {-13,137}, {-13,140}, {-13,142}, {-13,143}, {-13,144}, {-13,145}, {-13,146}, {-12,-64}, {-12,-63}, {-12,-62}, {-12,69}, {-12,70}, {-12,126}, {-12,127}, {-12,135}, {-12,136}, {-12,137}, {-12,140}, {-12,142}, {-12,143}, {-12,144}, {-12,146}, {-11,-64}, {-11,-63}, {-11,-62}, {-11,69}, {-11,70}, {-11,126}, {-11,127}, {-11,135}, {-11,136}, {-11,137}, {-11,140}, {-11,142}, {-11,143}, {-11,144}, {-11,146}, {-10,-64}, {-10,-63}, {-10,-62}, {-10,120}, {-10,121}, {-10,122}, {-10,123}, {-10,124}, {-10,126}, {-10,127}, {-10,129}, {-10,130}, {-10,131}, {-10,132}, {-10,133}, {-10,135}, {-10,136}, {-10,137}, {-10,140}, {-10,142}, {-10,143}, {-10,144}, {-10,146}, {-9,-64}, {-9,-63}, {-9,-62}, {-9,121}, {-9,122}, {-9,123}, {-9,124}, {-9,126}, {-9,127}, {-9,130}, {-9,131}, {-9,135}, {-9,136}, {-9,137}, {-9,140}, {-9,141}, {-9,142}, {-9,143}, {-9,144}, {-9,146}, {-8,-64}, {-8,-63}, {-8,-62}, {-8,126}, {-8,127}, {-8,135}, {-8,136}, {-8,137}, {-8,140}, {-8,142}, {-8,143}, {-8,144}, {-8,146}, {-7,-64}, {-7,-63}, {-7,-62}, {-7,126}, {-7,127}, {-7,135}, {-7,136}, {-7,137}, {-7,140}, {-7,142}, {-7,143}, {-7,144}, {-7,146}, {-6,-64}, {-6,-63}, {-6,-62}, {-6,69}, {-6,70}, {-6,126}, {-6,127}, {-6,135}, {-6,136}, {-6,137}, {-6,138}, {-6,139}, {-6,140}, {-5,-64}, {-5,-63}, {-5,-62}, {-5,126}, {-5,127}, {-5,135}, {-5,136}, {-5,137}, {-5,138}, {-5,139}, {-5,140}, {-5,142}, {-5,143}, {-5,144}, {-5,145}, {-5,146}, {-4,-64}, {-4,-63}, {-4,-62}, {-4,69}, {-4,70}, {-4,126}, {-4,127}, {-4,135}, {-4,136}, {-4,137}, {-4,140}, {-4,142}, {-4,143}, {-4,144}, {-4,145}, {-4,146}, {-3,-64}, {-3,-63}, {-3,-62}, {-3,69}, {-3,70}, {-3,126}, {-3,127}, {-3,135}, {-3,136}, {-3,137}, {-3,140}, {-3,141}, {-3,142}, {-3,143}, {-3,144}, {-3,145}, {-3,146}, {-2,-64}, {-2,-63}, {-2,-62}, {-2,69}, {-2,70}, {-2,92}, {-2,93}, {-2,95}, {-2,96}, {-2,97}, {-2,98}, {-2,99}, {-2,100}, {-2,101}, {-2,102}, {-2,103}, {-2,104}, {-2,105}, {-2,106}, {-2,107}, {-2,108}, {-2,109}, {-2,110}, {-2,111}, {-2,112}, {-2,113}, {-2,114}, {-2,115}, {-2,116}, {-2,117}, {-2,118}, {-2,120}, {-2,121}, {-2,122}, {-2,123}, {-2,124}, {-2,126}, {-2,127}, {-2,129}, {-2,130}, {-2,131}, {-2,132}, {-2,133}, {-2,135}, {-2,136}, {-2,137}, {-2,140}, {-2,142}, {-2,143}, {-2,144}, {-2,145}, {-2,146}, {-1,-63}, {-1,69}, {-1,70}, {-1,92}, {-1,93}, {-1,95}, {-1,96}, {-1,97}, {-1,98}, {-1,99}, {-1,100}, {-1,101}, {-1,102}, {-1,103}, {-1,104}, {-1,105}, {-1,106}, {-1,107}, {-1,108}, {-1,109}, {-1,110}, {-1,111}, {-1,112}, {-1,113}, {-1,114}, {-1,115}, {-1,116}, {-1,117}, {-1,118}, {-1,119}, {-1,120}, {-1,121}, {-1,122}, {-1,123}, {-1,124}, {-1,126}, {-1,127}, {-1,128}, {-1,129}, {-1,130}, {-1,131}, {-1,132}, {-1,133}, {-1,135}, {-1,136}, {-1,137}, {-1,140}, {-1,142}, {-1,143}, {-1,144}, {-1,145}, {-1,146}, {0,-64}, {0,-63}, {0,-62}, {0,38}, {0,39}, {0,40}, {0,43}, {0,44}, {0,45}, {0,46}, {0,47}, {0,48}, {0,49}, {0,50}, {0,51}, {0,52}, {0,53}, {0,54}, {0,57}, {0,58}, {0,59}, {0,69}, {0,70}, {0,92}, {0,93}, {0,95}, {0,103}, {0,112}, {0,117}, {0,118}, {0,120}, {0,121}, {0,122}, {0,123}, {0,124}, {0,126}, {0,127}, {0,129}, {0,130}, {0,131}, {0,132}, {0,133}, {0,135}, {0,136}, {0,137}, {0,140}, {0,142}, {0,143}, {0,144}, {0,145}, {0,146}, {1,-64}, {1,-63}, {1,-62}, {1,38}, {1,39}, {1,40}, {1,41}, {1,42}, {1,43}, {1,44}, {1,45}, {1,46}, {1,47}, {1,48}, {1,49}, {1,50}, {1,51}, {1,52}, {1,53}, {1,54}, {1,55}, {1,56}, {1,57}, {1,58}, {1,59}, {1,69}, {1,70}, {1,92}, {1,93}, {1,95}, {1,96}, {1,97}, {1,98}, {1,100}, {1,101}, {1,103}, {1,104}, {1,105}, {1,106}, {1,107}, {1,109}, {1,110}, {1,112}, {1,113}, {1,114}, {1,115}, {1,117}, {1,118}, {1,121}, {1,126}, {1,127}, {1,135}, {1,136}, {1,137}, {1,140}, {1,142}, {1,143}, {1,144}, {1,145}, {1,146}, {2,-64}, {2,-63}, {2,-62}, {2,38}, {2,39}, {2,40}, {2,43}, {2,44}, {2,45}, {2,46}, {2,47}, {2,48}, {2,49}, {2,50}, {2,51}, {2,52}, {2,53}, {2,54}, {2,57}, {2,58}, {2,59}, {2,69}, {2,70}, {2,92}, {2,93}, {2,95}, {2,96}, {2,97}, {2,98}, {2,99}, {2,100}, {2,101}, {2,103}, {2,104}, {2,105}, {2,106}, {2,107}, {2,108}, {2,109}, {2,110}, {2,112}, {2,113}, {2,114}, {2,115}, {2,117}, {2,118}, {2,120}, {2,121}, {2,122}, {2,123}, {2,124}, {2,126}, {2,127}, {2,129}, {2,130}, {2,131}, {2,132}, {2,133}, {2,135}, {2,136}, {2,137}, {2,140}, {2,146}, {3,-64}, {3,-63}, {3,-62}, {3,92}, {3,93}, {3,95}, {3,96}, {3,97}, {3,98}, {3,100}, {3,101}, {3,103}, {3,104}, {3,105}, {3,106}, {3,107}, {3,109}, {3,110}, {3,112}, {3,113}, {3,114}, {3,115}, {3,117}, {3,118}, {3,120}, {3,121}, {3,122}, {3,123}, {3,124}, {3,126}, {3,127}, {3,129}, {3,130}, {3,131}, {3,132}, {3,133}, {3,134}, {3,135}, {3,136}, {3,137}, {3,140}, {3,142}, {3,143}, {3,144}, {3,145}, {3,146}, {4,-64}, {4,-63}, {4,-62}, {4,92}, {4,93}, {4,117}, {4,118}, {4,126}, {4,127}, {4,140}, {5,-64}, {5,-63}, {5,-62}, {5,62}, {5,63}, {5,64}, {5,65}, {5,66}, {5,67}, {5,68}, {5,69}, {5,70}, {5,71}, {5,72}, {5,73}, {5,74}, {5,75}, {5,76}, {5,78}, {5,79}, {5,80}, {5,81}, {5,82}, {5,83}, {5,84}, {5,86}, {5,87}, {5,88}, {5,89}, {5,90}, {5,92}, {5,93}, {5,94}, {5,95}, {5,96}, {5,97}, {5,98}, {5,99}, {5,100}, {5,101}, {5,102}, {5,103}, {5,104}, {5,105}, {5,106}, {5,107}, {5,108}, {5,109}, {5,110}, {5,111}, {5,112}, {5,113}, {5,114}, {5,115}, {5,116}, {5,117}, {5,118}, {5,119}, {5,120}, {5,121}, {5,122}, {5,123}, {5,124}, {5,125}, {5,126}, {5,127}, {5,128}, {5,129}, {5,130}, {5,131}, {5,132}, {5,133}, {5,135}, {5,136}, {5,137}, {5,140}, {5,142}, {5,143}, {5,144}, {5,145}, {5,146}, {6,-64}, {6,-63}, {6,-62}, {6,38}, {6,39}, {6,40}, {6,41}, {6,42}, {6,43}, {6,44}, {6,45}, {6,46}, {6,47}, {6,48}, {6,49}, {6,52}, {6,53}, {6,54}, {6,56}, {6,57}, {6,58}, {6,59}, {6,62}, {6,63}, {6,64}, {6,65}, {6,66}, {6,67}, {6,68}, {6,69}, {6,70}, {6,71}, {6,72}, {6,73}, {6,74}, {6,75}, {6,76}, {6,78}, {6,79}, {6,80}, {6,81}, {6,82}, {6,83}, {6,84}, {6,85}, {6,86}, {6,87}, {6,88}, {6,89}, {6,90}, {6,91}, {6,92}, {6,93}, {6,94}, {6,95}, {6,96}, {6,97}, {6,98}, {6,99}, {6,100}, {6,101}, {6,102}, {6,103}, {6,104}, {6,105}, {6,106}, {6,107}, {6,108}, {6,109}, {6,110}, {6,111}, {6,112}, {6,113}, {6,114}, {6,115}, {6,116}, {6,117}, {6,118}, {6,119}, {6,120}, {6,121}, {6,122}, {6,123}, {6,124}, {6,125}, {6,126}, {6,127}, {6,128}, {6,129}, {6,130}, {6,131}, {6,132}, {6,133}, {6,134}, {6,135}, {6,136}, {6,137}, {6,140}, {6,141}, {6,142}, {6,143}, {6,144}, {6,145}, {6,146}, {7,-64}, {7,-63}, {7,-62}, {7,38}, {7,39}, {7,40}, {7,41}, {7,42}, {7,43}, {7,44}, {7,45}, {7,46}, {7,47}, {7,48}, {7,49}, {7,50}, {7,51}, {7,52}, {7,53}, {7,54}, {7,55}, {7,56}, {7,57}, {7,58}, {7,59}, {7,62}, {7,63}, {7,64}, {7,65}, {7,67}, {7,68}, {7,69}, {7,70}, {7,71}, {7,72}, {7,73}, {7,74}, {7,75}, {7,76}, {7,78}, {7,79}, {7,80}, {7,81}, {7,82}, {7,83}, {7,84}, {7,86}, {7,87}, {7,88}, {7,89}, {7,90}, {7,92}, {7,93}, {7,94}, {7,95}, {7,96}, {7,97}, {7,98}, {7,99}, {7,100}, {7,101}, {7,102}, {7,103}, {7,104}, {7,105}, {7,106}, {7,107}, {7,108}, {7,109}, {7,110}, {7,111}, {7,112}, {7,113}, {7,114}, {7,115}, {7,116}, {7,117}, {7,118}, {7,119}, {7,120}, {7,121}, {7,122}, {7,123}, {7,124}, {7,125}, {7,126}, {7,127}, {7,128}, {7,129}, {7,130}, {7,131}, {7,132}, {7,133}, {7,135}, {7,136}, {7,137}, {7,140}, {7,142}, {7,143}, {7,144}, {7,145}, {7,146}, {8,-64}, {8,-63}, {8,-62}, {8,38}, {8,39}, {8,40}, {8,41}, {8,42}, {8,43}, {8,44}, {8,45}, {8,46}, {8,47}, {8,48}, {8,49}, {8,50}, {8,51}, {8,52}, {8,53}, {8,54}, {8,55}, {8,56}, {8,57}, {8,58}, {8,59}, {8,62}, {8,63}, {8,64}, {8,65}, {8,71}, {8,93}, {8,108}, {8,136}, {9,-64}, {9,-63}, {9,-62}, {9,38}, {9,39}, {9,40}, {9,41}, {9,42}, {9,43}, {9,44}, {9,45}, {9,46}, {9,47}, {9,48}, {9,49}, {9,52}, {9,53}, {9,54}, {9,56}, {9,57}, {9,58}, {9,59}, {9,62}, {9,63}, {9,64}, {9,65}, {9,67}, {9,68}, {9,69}, {9,70}, {9,71}, {9,72}, {9,73}, {9,74}, {9,86}, {9,87}, {9,88}, {9,89}, {9,90}, {9,92}, {9,93}, {9,94}, {9,95}, {9,96}, {9,97}, {9,98}, {9,99}, {9,100}, {9,102}, {9,103}, {9,104}, {9,105}, {9,107}, {9,108}, {9,109}, {9,117}, {9,125}, {9,133}, {9,135}, {9,136}, {9,137}, {10,53}, {10,62}, {10,63}, {10,64}, {10,65}, {10,67}, {10,68}, {10,69}, {10,70}, {10,71}, {10,72}, {10,73}, {10,74}, {10,86}, {10,87}, {10,88}, {10,89}, {10,90}, {10,92}, {10,93}, {10,94}, {10,95}, {10,96}, {10,97}, {10,98}, {10,99}, {10,100}, {10,102}, {10,103}, {10,104}, {10,105}, {10,107}, {10,108}, {10,109}, {10,117}, {10,125}, {10,133}, {10,135}, {10,136}, {10,137}, {11,53}, {11,67}, {11,103}, {11,107}, {11,108}, {11,109}, {11,117}, {11,125}, {11,133}, {11,135}, {11,136}, {11,137}, {12,-64}, {12,-63}, {12,-62}, {12,-61}, {12,-60}, {12,-59}, {12,-58}, {12,-57}, {12,-56}, {12,-55}, {12,-54}, {12,-53}, {12,-51}, {12,-49}, {12,-48}, {12,-47}, {12,-46}, {12,-45}, {12,-44}, {12,-43}, {12,-42}, {12,-41}, {12,-40}, {12,-39}, {12,-38}, {12,-37}, {12,-36}, {12,-35}, {12,-34}, {12,-33}, {12,-32}, {12,-31}, {12,-28}, {12,-27}, {12,-26}, {12,-25}, {12,-24}, {12,-23}, {12,-20}, {12,-19}, {12,-18}, {12,-17}, {12,-16}, {12,-15}, {12,-14}, {12,-13}, {12,-12}, {12,-11}, {12,-10}, {12,-9}, {12,-8}, {12,-5}, {12,-4}, {12,-3}, {12,-2}, {12,-1}, {12,0}, {12,3}, {12,4}, {12,5}, {12,6}, {12,7}, {12,8}, {12,9}, {12,10}, {12,11}, {12,12}, {12,13}, {12,14}, {12,15}, {12,16}, {12,17}, {12,18}, {12,19}, {12,20}, {12,21}, {12,22}, {12,25}, {12,26}, {12,27}, {12,28}, {12,29}, {12,30}, {12,31}, {12,32}, {12,33}, {12,34}, {12,35}, {12,36}, {12,37}, {12,38}, {12,39}, {12,40}, {12,41}, {12,42}, {12,43}, {12,44}, {12,45}, {12,47}, {12,48}, {12,49}, {12,52}, {12,53}, {12,54}, {12,55}, {12,56}, {12,57}, {12,58}, {12,59}, {12,60}, {12,61}, {12,62}, {12,63}, {12,64}, {12,65}, {12,66}, {12,67}, {12,68}, {12,69}, {12,70}, {12,102}, {12,103}, {12,104}, {12,105}, {12,107}, {12,108}, {12,109}, {12,117}, {12,125}, {12,133}, {12,135}, {12,136}, {12,137}, {13,-64}, {13,-63}, {13,-62}, {13,-61}, {13,-60}, {13,-59}, {13,-58}, {13,-57}, {13,-56}, {13,-55}, {13,-54}, {13,-53}, {13,-52}, {13,-51}, {13,-49}, {13,-48}, {13,-47}, {13,-46}, {13,-45}, {13,-44}, {13,-43}, {13,-42}, {13,-41}, {13,-40}, {13,-39}, {13,-38}, {13,-37}, {13,-36}, {13,-35}, {13,-34}, {13,-33}, {13,-32}, {13,-31}, {13,-28}, {13,-27}, {13,-26}, {13,-25}, {13,-24}, {13,-23}, {13,-20}, {13,-19}, {13,-18}, {13,-17}, {13,-16}, {13,-15}, {13,-14}, {13,-13}, {13,-12}, {13,-11}, {13,-10}, {13,-9}, {13,-8}, {13,-5}, {13,-4}, {13,-3}, {13,-2}, {13,-1}, {13,0}, {13,3}, {13,4}, {13,5}, {13,6}, {13,7}, {13,8}, {13,9}, {13,10}, {13,11}, {13,12}, {13,13}, {13,14}, {13,15}, {13,16}, {13,17}, {13,18}, {13,19}, {13,20}, {13,21}, {13,22}, {13,25}, {13,26}, {13,27}, {13,28}, {13,29}, {13,30}, {13,31}, {13,32}, {13,33}, {13,34}, {13,35}, {13,36}, {13,37}, {13,38}, {13,39}, {13,40}, {13,41}, {13,42}, {13,43}, {13,44}, {13,45}, {13,46}, {13,47}, {13,48}, {13,49}, {13,52}, {13,53}, {13,54}, {13,55}, {13,56}, {13,57}, {13,58}, {13,59}, {13,60}, {13,61}, {13,62}, {13,63}, {13,64}, {13,65}, {13,66}, {13,67}, {13,68}, {13,69}, {13,70}, {13,102}, {13,103}, {13,104}, {13,105}, {13,107}, {13,108}, {13,109}, {13,117}, {13,125}, {13,133}, {13,135}, {13,136}, {13,137}, {14,-64}, {14,-63}, {14,-62}, {14,-61}, {14,-60}, {14,-59}, {14,-58}, {14,-57}, {14,-56}, {14,-55}, {14,-54}, {14,-53}, {14,-51}, {14,-49}, {14,-48}, {14,-47}, {14,-46}, {14,-45}, {14,-44}, {14,-43}, {14,-42}, {14,-41}, {14,-40}, {14,-39}, {14,-38}, {14,-37}, {14,-36}, {14,-35}, {14,-34}, {14,-33}, {14,-32}, {14,-31}, {14,-28}, {14,-27}, {14,-26}, {14,-25}, {14,-24}, {14,-23}, {14,-20}, {14,-19}, {14,-18}, {14,-17}, {14,-16}, {14,-15}, {14,-14}, {14,-13}, {14,-12}, {14,-11}, {14,-10}, {14,-9}, {14,-8}, {14,-5}, {14,-4}, {14,-3}, {14,-2}, {14,-1}, {14,0}, {14,3}, {14,4}, {14,5}, {14,6}, {14,7}, {14,8}, {14,9}, {14,10}, {14,11}, {14,12}, {14,13}, {14,14}, {14,15}, {14,16}, {14,17}, {14,18}, {14,19}, {14,20}, {14,21}, {14,22}, {14,25}, {14,26}, {14,27}, {14,28}, {14,29}, {14,30}, {14,31}, {14,32}, {14,33}, {14,34}, {14,35}, {14,36}, {14,37}, {14,38}, {14,39}, {14,40}, {14,41}, {14,42}, {14,43}, {14,44}, {14,45}, {14,47}, {14,48}, {14,49}, {14,53}, {14,65}, {14,102}, {14,103}, {14,104}, {14,105}, {14,107}, {14,108}, {14,109}, {14,135}, {14,136}, {14,137}, {15,47}, {15,48}, {15,49}, {15,52}, {15,53}, {15,54}, {15,64}, {15,65}, {15,66}, {15,68}, {15,69}, {15,70}, {15,102}, {15,103}, {15,104}, {15,105}, {15,107}, {15,108}, {15,109}, {15,110}, {15,111}, {15,112}, {15,113}, {15,114}, {15,115}, {15,116}, {15,117}, {15,118}, {15,119}, {15,120}, {15,121}, {15,122}, {15,123}, {15,124}, {15,125}, {15,126}, {15,127}, {15,128}, {15,129}, {15,130}, {15,131}, {15,132}, {15,133}, {15,134}, {15,135}, {15,136}, {15,137}, {16,-1}, {16,47}, {16,48}, {16,49}, {16,52}, {16,53}, {16,54}, {16,64}, {16,65}, {16,66}, {16,68}, {16,69}, {16,70}, {16,102}, {16,103}, {16,104}, {16,105}, {16,107}, {16,108}, {16,109}, {16,110}, {16,111}, {16,112}, {16,113}, {16,114}, {16,115}, {16,116}, {16,117}, {16,118}, {16,119}, {16,120}, {16,121}, {16,122}, {16,123}, {16,124}, {16,125}, {16,126}, {16,127}, {16,128}, {16,129}, {16,130}, {16,131}, {16,132}, {16,133}, {16,134}, {16,135}, {16,136}, {16,137}, {17,-5}, {17,-4}, {17,-3}, {17,-2}, {17,-1}, {17,0}, {17,47}, {17,48}, {17,49}, {17,52}, {17,53}, {17,54}, {17,64}, {17,65}, {17,66}, {17,68}, {17,69}, {17,70}, {17,102}, {17,103}, {17,104}, {17,105}, {17,107}, {17,108}, {17,109}, {17,110}, {17,111}, {17,112}, {17,113}, {17,114}, {17,115}, {17,116}, {17,117}, {17,118}, {17,119}, {17,120}, {17,121}, {17,122}, {17,123}, {17,124}, {17,125}, {17,126}, {17,127}, {17,128}, {17,129}, {17,130}, {17,131}, {17,132}, {17,133}, {17,134}, {17,135}, {17,136}, {17,137}, {18,-5}, {18,-4}, {18,-3}, {18,-2}, {18,-1}, {18,0}, {18,47}, {18,48}, {18,49}, {18,52}, {18,53}, {18,54}, {18,64}, {18,65}, {18,66}, {18,68}, {18,69}, {18,70}, {18,102}, {18,103}, {18,104}, {18,105}, {18,107}, {18,108}, {18,109}, {18,135}, {18,136}, {18,137}, {19,-1}, {19,47}, {19,48}, {19,49}, {19,52}, {19,53}, {19,54}, {19,64}, {19,65}, {19,66}, {19,68}, {19,69}, {19,70}, {19,102}, {19,103}, {19,104}, {19,105}, {19,107}, {19,108}, {19,109}, {19,117}, {19,125}, {19,133}, {19,135}, {19,136}, {19,137}, {20,47}, {20,48}, {20,49}, {20,52}, {20,53}, {20,54}, {20,68}, {20,69}, {20,70}, {20,102}, {20,103}, {20,104}, {20,105}, {20,107}, {20,108}, {20,109}, {20,117}, {20,125}, {20,133}, {20,135}, {20,136}, {20,137}, {21,47}, {21,48}, {21,49}, {21,52}, {21,53}, {21,54}, {21,64}, {21,65}, {21,66}, {21,68}, {21,69}, {21,70}, {21,103}, {21,104}, {21,105}, {21,107}, {21,108}, {21,109}, {21,117}, {21,125}, {21,133}, {21,135}, {21,136}, {21,137}, {22,47}, {22,48}, {22,49}, {22,52}, {22,53}, {22,54}, {22,64}, {22,65}, {22,66}, {22,68}, {22,69}, {22,70}, {22,86}, {22,87}, {22,88}, {22,89}, {22,90}, {22,92}, {22,93}, {22,94}, {22,95}, {22,96}, {22,97}, {22,98}, {22,99}, {22,100}, {22,102}, {22,103}, {22,104}, {22,105}, {22,107}, {22,108}, {22,109}, {22,117}, {22,125}, {22,133}, {22,135}, {22,136}, {22,137}, {23,47}, {23,48}, {23,49}, {23,52}, {23,53}, {23,54}, {23,56}, {23,57}, {23,58}, {23,59}, {23,60}, {23,61}, {23,62}, {23,64}, {23,65}, {23,66}, {23,68}, {23,69}, {23,70}, {23,86}, {23,87}, {23,88}, {23,89}, {23,90}, {23,92}, {23,93}, {23,94}, {23,95}, {23,96}, {23,97}, {23,98}, {23,99}, {23,100}, {23,102}, {23,103}, {23,104}, {23,105}, {23,107}, {23,108}, {23,109}, {23,117}, {23,125}, {23,133}, {23,135}, {23,136}, {23,137}, {24,47}, {24,48}, {24,49}, {24,56}, {24,57}, {24,58}, {24,59}, {24,60}, {24,61}, {24,62}, {24,65}, {24,89}, {24,107}, {24,108}, {24,109}, {24,135}, {24,136}, {24,137}, {25,47}, {25,48}, {25,49}, {25,52}, {25,53}, {25,54}, {25,56}, {25,57}, {25,58}, {25,59}, {25,60}, {25,61}, {25,62}, {25,64}, {25,65}, {25,66}, {25,67}, {25,68}, {25,69}, {25,70}, {25,71}, {25,72}, {25,73}, {25,74}, {25,76}, {25,77}, {25,78}, {25,79}, {25,81}, {25,82}, {25,83}, {25,84}, {25,85}, {25,86}, {25,87}, {25,88}, {25,89}, {25,90}, {25,91}, {25,92}, {25,93}, {25,94}, {25,96}, {25,97}, {25,98}, {25,99}, {25,100}, {25,101}, {25,102}, {25,103}, {25,104}, {25,105}, {25,107}, {25,108}, {25,109}, {25,111}, {25,112}, {25,113}, {25,114}, {25,115}, {25,116}, {25,117}, {25,119}, {25,120}, {25,121}, {25,122}, {25,123}, {25,124}, {25,125}, {25,127}, {25,128}, {25,129}, {25,130}, {25,131}, {25,132}, {25,133}, {25,135}, {25,136}, {25,137}, {26,47}, {26,48}, {26,49}, {26,52}, {26,53}, {26,54}, {26,56}, {26,57}, {26,58}, {26,59}, {26,60}, {26,61}, {26,62}, {26,64}, {26,65}, {26,66}, {26,67}, {26,68}, {26,69}, {26,70}, {26,71}, {26,72}, {26,73}, {26,74}, {26,75}, {26,76}, {26,77}, {26,78}, {26,79}, {26,81}, {26,82}, {26,83}, {26,84}, {26,85}, {26,86}, {26,87}, {26,88}, {26,89}, {26,90}, {26,91}, {26,92}, {26,93}, {26,94}, {26,96}, {26,97}, {26,98}, {26,99}, {26,100}, {26,101}, {26,102}, {26,103}, {26,104}, {26,105}, {26,106}, {26,107}, {26,108}, {26,109}, {26,111}, {26,112}, {26,113}, {26,114}, {26,115}, {26,116}, {26,117}, {26,119}, {26,120}, {26,121}, {26,122}, {26,123}, {26,124}, {26,125}, {26,127}, {26,128}, {26,129}, {26,130}, {26,131}, {26,132}, {26,133}, {26,135}, {26,136}, {26,137}, {27,47}, {27,48}, {27,49}, {27,52}, {27,53}, {27,54}, {27,56}, {27,57}, {27,58}, {27,59}, {27,60}, {27,61}, {27,62}, {27,64}, {27,65}, {27,66}, {27,67}, {27,68}, {27,69}, {27,70}, {27,71}, {27,72}, {27,73}, {27,74}, {27,76}, {27,77}, {27,78}, {27,79}, {27,81}, {27,82}, {27,83}, {27,84}, {27,85}, {27,86}, {27,87}, {27,88}, {27,89}, {27,90}, {27,91}, {27,92}, {27,93}, {27,94}, {27,96}, {27,97}, {27,98}, {27,99}, {27,100}, {27,101}, {27,102}, {27,103}, {27,104}, {27,105}, {27,107}, {27,108}, {27,109}, {27,111}, {27,112}, {27,113}, {27,114}, {27,115}, {27,116}, {27,117}, {27,119}, {27,120}, {27,121}, {27,122}, {27,123}, {27,124}, {27,125}, {27,127}, {27,128}, {27,129}, {27,130}, {27,131}, {27,132}, {27,133}, {27,135}, {27,136}, {27,137}, {28,47}, {28,48}, {28,49}, {29,47}, {29,48}, {29,49}, {30,47}, {30,48}, {30,49}, {31,47}, {31,48}, {31,49}, {32,47}, {32,48}, {32,49}, {33,47}, {33,48}, {33,49}, {34,47}, {34,48}, {34,49}, {35,47}, {35,48}, {35,49}, {36,47}, {36,48}, {36,49}, {36,59}, {36,60}, {36,61}, {36,63}, {36,64}, {36,65}, {36,66}, {36,67}, {36,69}, {36,70}, {36,71}, {36,72}, {36,73}, {36,76}, {36,77}, {36,78}, {36,81}, {36,82}, {36,83}, {36,84}, {36,85}, {36,86}, {36,87}, {36,89}, {36,90}, {36,91}, {36,92}, {36,93}, {36,94}, {36,95}, {36,97}, {36,98}, {36,99}, {36,100}, {36,101}, {36,102}, {36,103}, {36,106}, {36,107}, {36,108}, {36,110}, {36,111}, {36,112}, {36,113}, {36,114}, {36,115}, {36,116}, {36,117}, {36,118}, {36,119}, {36,120}, {36,121}, {36,122}, {36,123}, {36,124}, {36,125}, {36,126}, {36,128}, {36,129}, {36,130}, {36,131}, {36,132}, {36,133}, {36,134}, {36,135}, {36,136}, {36,137}, {36,138}, {36,140}, {36,141}, {36,142}, {37,47}, {37,48}, {37,49}, {37,59}, {37,60}, {37,61}, {37,62}, {37,63}, {37,64}, {37,65}, {37,66}, {37,67}, {37,69}, {37,70}, {37,71}, {37,72}, {37,73}, {37,76}, {37,77}, {37,78}, {37,81}, {37,82}, {37,83}, {37,84}, {37,85}, {37,86}, {37,87}, {37,88}, {37,89}, {37,90}, {37,91}, {37,92}, {37,93}, {37,94}, {37,95}, {37,96}, {37,97}, {37,98}, {37,99}, {37,100}, {37,101}, {37,102}, {37,103}, {37,106}, {37,107}, {37,108}, {37,109}, {37,110}, {37,111}, {37,112}, {37,113}, {37,114}, {37,115}, {37,116}, {37,117}, {37,118}, {37,119}, {37,120}, {37,121}, {37,122}, {37,123}, {37,124}, {37,125}, {37,126}, {37,128}, {37,129}, {37,130}, {37,131}, {37,132}, {37,133}, {37,134}, {37,135}, {37,136}, {37,137}, {37,138}, {37,139}, {37,140}, {37,141}, {37,142}, {38,47}, {38,48}, {38,49}, {38,59}, {38,60}, {38,61}, {38,63}, {38,64}, {38,65}, {38,66}, {38,67}, {38,69}, {38,70}, {38,71}, {38,72}, {38,73}, {38,76}, {38,77}, {38,78}, {38,81}, {38,82}, {38,83}, {38,84}, {38,85}, {38,86}, {38,87}, {38,89}, {38,90}, {38,91}, {38,92}, {38,93}, {38,94}, {38,95}, {38,97}, {38,98}, {38,99}, {38,100}, {38,101}, {38,102}, {38,103}, {38,106}, {38,107}, {38,108}, {38,110}, {38,111}, {38,112}, {38,113}, {38,114}, {38,115}, {38,116}, {38,117}, {38,118}, {38,119}, {38,120}, {38,121}, {38,122}, {38,123}, {38,124}, {38,125}, {38,126}, {38,128}, {38,129}, {38,130}, {38,131}, {38,132}, {38,133}, {38,134}, {38,135}, {38,136}, {38,137}, {38,138}, {38,140}, {38,141}, {38,142}, {39,47}, {39,48}, {39,49}, {39,76}, {39,77}, {39,78}, {39,106}, {39,107}, {39,108}, {39,125}, {39,140}, {39,141}, {39,142}, {40,47}, {40,48}, {40,49}, {40,59}, {40,60}, {40,61}, {40,76}, {40,77}, {40,78}, {40,106}, {40,107}, {40,108}, {40,124}, {40,125}, {40,126}, {40,140}, {40,141}, {40,142}, {41,47}, {41,48}, {41,49}, {41,59}, {41,60}, {41,61}, {41,76}, {41,77}, {41,78}, {41,106}, {41,107}, {41,108}, {41,124}, {41,125}, {41,126}, {41,140}, {41,141}, {41,142}, {42,47}, {42,48}, {42,49}, {42,59}, {42,60}, {42,61}, {42,76}, {42,77}, {42,78}, {42,79}, {42,105}, {42,106}, {42,107}, {42,108}, {42,124}, {42,125}, {42,126}, {42,140}, {42,141}, {42,142}, {43,47}, {43,48}, {43,49}, {43,59}, {43,60}, {43,61}, {43,76}, {43,77}, {43,78}, {43,106}, {43,107}, {43,108}, {43,124}, {43,125}, {43,126}, {43,140}, {43,141}, {43,142}, {44,47}, {44,48}, {44,49}, {44,59}, {44,60}, {44,61}, {44,76}, {44,77}, {44,78}, {44,106}, {44,107}, {44,108}, {44,124}, {44,125}, {44,126}, {44,140}, {44,141}, {44,142}, {45,47}, {45,48}, {45,49}, {45,59}, {45,60}, {45,61}, {45,76}, {45,77}, {45,78}, {45,106}, {45,107}, {45,108}, {45,124}, {45,125}, {45,126}, {45,140}, {45,141}, {45,142}, {46,47}, {46,48}, {46,49}, {46,59}, {46,60}, {46,61}, {46,76}, {46,77}, {46,78}, {46,106}, {46,107}, {46,108}, {46,124}, {46,125}, {46,126}, {46,140}, {46,141}, {46,142}, {47,47}, {47,48}, {47,49}, {47,59}, {47,60}, {47,61}, {47,76}, {47,77}, {47,78}, {47,106}, {47,107}, {47,108}, {47,124}, {47,125}, {47,126}, {47,140}, {47,141}, {47,142}, {48,47}, {48,48}, {48,49}, {48,76}, {48,77}, {48,78}, {48,106}, {48,107}, {48,108}, {48,124}, {48,125}, {48,126}, {48,140}, {48,141}, {48,142}, {49,-60}, {49,47}, {49,48}, {49,49}, {49,59}, {49,60}, {49,61}, {49,106}, {49,107}, {49,108}, {49,124}, {49,125}, {49,126}, {49,140}, {49,141}, {49,142}, {50,-62}, {50,-61}, {50,-60}, {50,-59}, {50,-58}, {50,-57}, {50,-56}, {50,-55}, {50,-54}, {50,-53}, {50,-52}, {50,-51}, {50,-50}, {50,-49}, {50,-48}, {50,-47}, {50,47}, {50,48}, {50,49}, {50,59}, {50,60}, {50,61}, {50,76}, {50,77}, {50,78}, {50,106}, {50,107}, {50,108}, {50,124}, {50,125}, {50,126}, {50,140}, {50,141}, {50,142}, {51,-62}, {51,-61}, {51,-60}, {51,-59}, {51,-58}, {51,-57}, {51,-56}, {51,-55}, {51,-54}, {51,-53}, {51,-52}, {51,-51}, {51,-50}, {51,-49}, {51,-48}, {51,-47}, {51,47}, {51,48}, {51,49}, {51,59}, {51,60}, {51,61}, {51,76}, {51,77}, {51,78}, {51,106}, {51,107}, {51,108}, {51,125}, {52,47}, {52,48}, {52,49}, {52,59}, {52,60}, {52,61}, {52,76}, {52,77}, {52,78}, {52,106}, {52,107}, {52,108}, {52,110}, {52,111}, {52,112}, {52,113}, {52,115}, {52,116}, {52,117}, {52,119}, {52,120}, {52,121}, {52,122}, {52,123}, {52,124}, {52,125}, {52,126}, {52,127}, {52,128}, {52,129}, {52,131}, {52,132}, {52,133}, {52,134}, {52,136}, {52,137}, {52,138}, {52,140}, {52,141}, {52,142}, {53,47}, {53,48}, {53,49}, {53,59}, {53,60}, {53,61}, {53,76}, {53,77}, {53,78}, {53,106}, {53,107}, {53,108}, {53,109}, {53,110}, {53,111}, {53,112}, {53,113}, {53,115}, {53,116}, {53,117}, {53,118}, {53,119}, {53,120}, {53,121}, {53,122}, {53,123}, {53,124}, {53,125}, {53,126}, {53,127}, {53,128}, {53,129}, {53,131}, {53,132}, {53,133}, {53,134}, {53,135}, {53,136}, {53,137}, {53,138}, {53,139}, {53,140}, {53,141}, {53,142}, {54,-90}, {54,-89}, {54,-88}, {54,-87}, {54,-86}, {54,47}, {54,48}, {54,49}, {54,59}, {54,60}, {54,61}, {54,76}, {54,77}, {54,78}, {54,106}, {54,107}, {54,108}, {54,110}, {54,111}, {54,112}, {54,113}, {54,115}, {54,116}, {54,117}, {54,119}, {54,120}, {54,121}, {54,122}, {54,123}, {54,124}, {54,125}, {54,126}, {54,127}, {54,128}, {54,129}, {54,131}, {54,132}, {54,133}, {54,134}, {54,136}, {54,137}, {54,138}, {54,140}, {54,141}, {54,142}, {55,-91}, {55,-90}, {55,-89}, {55,-88}, {55,-87}, {55,-86}, {55,47}, {55,48}, {55,49}, {55,59}, {55,60}, {55,61}, {55,76}, {55,77}, {55,78}, {55,107}, {56,-93}, {56,-92}, {56,-91}, {56,-90}, {56,-89}, {56,-88}, {56,-87}, {56,-86}, {56,-1}, {56,47}, {56,48}, {56,49}, {56,59}, {56,60}, {56,61}, {56,76}, {56,77}, {56,78}, {56,106}, {56,107}, {56,108}, {56,136}, {56,137}, {56,138}, {56,140}, {56,141}, {56,142}, {57,-93}, {57,-92}, {57,-91}, {57,-90}, {57,-89}, {57,-5}, {57,-4}, {57,-3}, {57,-2}, {57,-1}, {57,0}, {57,47}, {57,48}, {57,49}, {57,59}, {57,60}, {57,61}, {57,76}, {57,77}, {57,78}, {57,106}, {57,107}, {57,108}, {57,135}, {57,136}, {57,137}, {57,138}, {57,139}, {57,140}, {57,141}, {57,142}, {58,-93}, {58,-92}, {58,-87}, {58,-86}, {58,-85}, {58,-5}, {58,-4}, {58,-3}, {58,-2}, {58,-1}, {58,0}, {58,47}, {58,48}, {58,49}, {58,59}, {58,60}, {58,61}, {58,76}, {58,77}, {58,78}, {58,106}, {58,107}, {58,108}, {58,136}, {58,137}, {58,138}, {58,140}, {58,141}, {58,142}, {59,-90}, {59,-89}, {59,-88}, {59,-87}, {59,-86}, {59,-85}, {59,-1}, {59,47}, {59,48}, {59,49}, {59,76}, {59,77}, {59,78}, {59,106}, {59,107}, {59,108}, {59,116}, {59,117}, {59,133}, {59,134}, {59,136}, {59,137}, {59,138}, {59,140}, {59,141}, {59,142}, {60,-92}, {60,-91}, {60,-90}, {60,-89}, {60,-88}, {60,-87}, {60,-86}, {60,-85}, {60,-1}, {60,47}, {60,48}, {60,49}, {60,59}, {60,60}, {60,61}, {60,76}, {60,77}, {60,78}, {60,81}, {60,82}, {60,83}, {60,84}, {60,85}, {60,86}, {60,87}, {60,88}, {60,89}, {60,90}, {60,91}, {60,92}, {60,93}, {60,94}, {60,95}, {60,96}, {60,97}, {60,98}, {60,99}, {60,100}, {60,101}, {60,102}, {60,103}, {60,106}, {60,107}, {60,108}, {60,116}, {60,117}, {60,133}, {60,134}, {60,136}, {60,137}, {60,138}, {60,140}, {60,141}, {60,142}, {61,-92}, {61,-91}, {61,-90}, {61,-89}, {61,-88}, {61,-64}, {61,-63}, {61,-62}, {61,-61}, {61,-60}, {61,-59}, {61,-58}, {61,-57}, {61,-56}, {61,-55}, {61,-53}, {61,-52}, {61,-51}, {61,-50}, {61,-49}, {61,-48}, {61,-47}, {61,-46}, {61,-45}, {61,-44}, {61,-43}, {61,-42}, {61,-41}, {61,-40}, {61,-39}, {61,-38}, {61,-37}, {61,-15}, {61,-14}, {61,-13}, {61,-12}, {61,-11}, {61,-10}, {61,-9}, {61,-8}, {61,-5}, {61,-4}, {61,-3}, {61,-2}, {61,-1}, {61,0}, {61,3}, {61,4}, {61,5}, {61,6}, {61,7}, {61,8}, {61,9}, {61,10}, {61,11}, {61,12}, {61,13}, {61,14}, {61,15}, {61,16}, {61,17}, {61,18}, {61,19}, {61,20}, {61,21}, {61,22}, {61,25}, {61,26}, {61,27}, {61,28}, {61,29}, {61,30}, {61,31}, {61,32}, {61,33}, {61,34}, {61,35}, {61,36}, {61,37}, {61,38}, {61,39}, {61,40}, {61,41}, {61,42}, {61,43}, {61,44}, {61,47}, {61,48}, {61,49}, {61,59}, {61,60}, {61,61}, {61,75}, {61,76}, {61,77}, {61,78}, {61,79}, {61,80}, {61,81}, {61,82}, {61,83}, {61,84}, {61,85}, {61,86}, {61,87}, {61,88}, {61,89}, {61,90}, {61,91}, {61,92}, {61,93}, {61,94}, {61,95}, {61,96}, {61,97}, {61,98}, {61,99}, {61,100}, {61,101}, {61,102}, {61,103}, {61,104}, {61,105}, {61,106}, {61,107}, {61,108}, {61,116}, {61,117}, {61,133}, {61,134}, {61,136}, {61,137}, {61,138}, {61,140}, {61,141}, {61,142}, {62,-92}, {62,-91}, {62,-86}, {62,-85}, {62,-84}, {62,-64}, {62,-63}, {62,-62}, {62,-61}, {62,-60}, {62,-59}, {62,-58}, {62,-57}, {62,-56}, {62,-55}, {62,-53}, {62,-52}, {62,-51}, {62,-50}, {62,-49}, {62,-48}, {62,-47}, {62,-46}, {62,-45}, {62,-44}, {62,-43}, {62,-42}, {62,-41}, {62,-40}, {62,-39}, {62,-38}, {62,-37}, {62,-15}, {62,-14}, {62,-13}, {62,-12}, {62,-11}, {62,-10}, {62,-9}, {62,-8}, {62,-5}, {62,-4}, {62,-3}, {62,-2}, {62,-1}, {62,0}, {62,3}, {62,4}, {62,5}, {62,6}, {62,7}, {62,8}, {62,9}, {62,10}, {62,11}, {62,12}, {62,13}, {62,14}, {62,15}, {62,16}, {62,17}, {62,18}, {62,19}, {62,20}, {62,21}, {62,22}, {62,25}, {62,26}, {62,27}, {62,28}, {62,29}, {62,30}, {62,31}, {62,32}, {62,33}, {62,34}, {62,35}, {62,36}, {62,37}, {62,38}, {62,39}, {62,40}, {62,41}, {62,42}, {62,43}, {62,44}, {62,47}, {62,48}, {62,49}, {62,59}, {62,60}, {62,61}, {62,76}, {62,77}, {62,78}, {62,81}, {62,82}, {62,83}, {62,84}, {62,85}, {62,86}, {62,87}, {62,88}, {62,89}, {62,90}, {62,91}, {62,92}, {62,93}, {62,94}, {62,95}, {62,96}, {62,97}, {62,98}, {62,99}, {62,100}, {62,101}, {62,102}, {62,103}, {62,106}, {62,107}, {62,108}, {62,116}, {62,117}, {62,133}, {62,134}, {62,136}, {62,137}, {62,138}, {62,140}, {62,141}, {62,142}, {63,-89}, {63,-88}, {63,-87}, {63,-86}, {63,-85}, {63,-84}, {63,-63}, {63,-50}, {63,-37}, {63,-15}, {63,-14}, {63,-13}, {63,-12}, {63,-11}, {63,-10}, {63,-9}, {63,-1}, {63,59}, {63,60}, {63,61}, {63,106}, {63,107}, {63,108}, {63,116}, {63,117}, {63,133}, {63,134}, {63,136}, {63,137}, {63,138}, {63,140}, {63,141}, {63,142}, {64,-91}, {64,-90}, {64,-89}, {64,-88}, {64,-87}, {64,-86}, {64,-85}, {64,-84}, {64,-64}, {64,-63}, {64,-61}, {64,-60}, {64,-59}, {64,-58}, {64,-57}, {64,-56}, {64,-55}, {64,-53}, {64,-52}, {64,-50}, {64,-48}, {64,-47}, {64,-46}, {64,-45}, {64,-44}, {64,-43}, {64,-42}, {64,-41}, {64,-38}, {64,-37}, {64,-15}, {64,-14}, {64,-13}, {64,-9}, {64,-1}, {64,47}, {64,48}, {64,49}, {64,59}, {64,60}, {64,61}, {64,76}, {64,77}, {64,78}, {64,87}, {64,88}, {64,89}, {64,101}, {64,102}, {64,103}, {64,106}, {64,107}, {64,108}, {64,116}, {64,117}, {64,133}, {64,134}, {64,136}, {64,137}, {64,138}, {64,140}, {64,141}, {64,142}, {65,-104}, {65,-103}, {65,-102}, {65,-101}, {65,-100}, {65,-91}, {65,-90}, {65,-89}, {65,-88}, {65,-87}, {65,-84}, {65,-64}, {65,-63}, {65,-61}, {65,-60}, {65,-59}, {65,-58}, {65,-57}, {65,-56}, {65,-55}, {65,-53}, {65,-52}, {65,-50}, {65,-49}, {65,-48}, {65,-47}, {65,-46}, {65,-45}, {65,-44}, {65,-43}, {65,-42}, {65,-41}, {65,-38}, {65,-37}, {65,-15}, {65,-14}, {65,-13}, {65,-10}, {65,-9}, {65,-8}, {65,-5}, {65,-4}, {65,-3}, {65,-2}, {65,-1}, {65,0}, {65,1}, {65,2}, {65,3}, {65,4}, {65,5}, {65,6}, {65,7}, {65,8}, {65,9}, {65,10}, {65,11}, {65,12}, {65,13}, {65,14}, {65,15}, {65,16}, {65,17}, {65,18}, {65,19}, {65,20}, {65,21}, {65,22}, {65,23}, {65,24}, {65,25}, {65,26}, {65,27}, {65,28}, {65,29}, {65,30}, {65,31}, {65,32}, {65,33}, {65,34}, {65,35}, {65,36}, {65,37}, {65,38}, {65,39}, {65,40}, {65,41}, {65,42}, {65,43}, {65,44}, {65,45}, {65,47}, {65,48}, {65,49}, {65,59}, {65,60}, {65,61}, {65,76}, {65,77}, {65,78}, {65,79}, {65,87}, {65,88}, {65,89}, {65,101}, {65,102}, {65,103}, {65,106}, {65,107}, {65,108}, {65,116}, {65,117}, {65,133}, {65,134}, {65,136}, {65,137}, {65,138}, {65,140}, {65,141}, {65,142}, {66,-104}, {66,-103}, {66,-102}, {66,-101}, {66,-100}, {66,-91}, {66,-90}, {66,-85}, {66,-84}, {66,-83}, {66,-64}, {66,-63}, {66,-61}, {66,-60}, {66,-59}, {66,-58}, {66,-57}, {66,-56}, {66,-55}, {66,-53}, {66,-52}, {66,-50}, {66,-49}, {66,-48}, {66,-47}, {66,-46}, {66,-45}, {66,-44}, {66,-43}, {66,-42}, {66,-41}, {66,-38}, {66,-37}, {66,-15}, {66,-14}, {66,-13}, {66,-10}, {66,-9}, {66,-8}, {66,-5}, {66,-4}, {66,-3}, {66,-2}, {66,-1}, {66,0}, {66,1}, {66,2}, {66,3}, {66,4}, {66,5}, {66,6}, {66,7}, {66,8}, {66,9}, {66,10}, {66,11}, {66,12}, {66,13}, {66,14}, {66,15}, {66,16}, {66,17}, {66,18}, {66,19}, {66,20}, {66,21}, {66,22}, {66,23}, {66,24}, {66,25}, {66,26}, {66,27}, {66,28}, {66,29}, {66,30}, {66,31}, {66,32}, {66,33}, {66,34}, {66,35}, {66,36}, {66,37}, {66,38}, {66,39}, {66,40}, {66,41}, {66,42}, {66,43}, {66,44}, {66,45}, {66,46}, {66,47}, {66,48}, {66,49}, {66,59}, {66,60}, {66,61}, {66,76}, {66,77}, {66,78}, {66,87}, {66,88}, {66,89}, {66,101}, {66,102}, {66,103}, {66,106}, {66,107}, {66,108}, {66,116}, {66,117}, {66,133}, {66,134}, {66,136}, {66,137}, {66,138}, {66,140}, {66,141}, {66,142}, {67,-103}, {67,-102}, {67,-101}, {67,-100}, {67,-88}, {67,-87}, {67,-86}, {67,-85}, {67,-84}, {67,-83}, {67,-82}, {67,-64}, {67,-63}, {67,-61}, {67,-60}, {67,-59}, {67,-58}, {67,-57}, {67,-56}, {67,-55}, {67,-53}, {67,-52}, {67,-50}, {67,-48}, {67,-47}, {67,-46}, {67,-45}, {67,-44}, {67,-43}, {67,-42}, {67,-41}, {67,-38}, {67,-37}, {67,-15}, {67,-14}, {67,-13}, {67,-10}, {67,-9}, {67,-8}, {67,-5}, {67,-4}, {67,-3}, {67,-2}, {67,-1}, {67,0}, {67,1}, {67,2}, {67,3}, {67,4}, {67,5}, {67,6}, {67,7}, {67,8}, {67,9}, {67,10}, {67,11}, {67,12}, {67,13}, {67,14}, {67,15}, {67,16}, {67,17}, {67,18}, {67,19}, {67,20}, {67,21}, {67,22}, {67,23}, {67,24}, {67,25}, {67,26}, {67,27}, {67,28}, {67,29}, {67,30}, {67,31}, {67,32}, {67,33}, {67,34}, {67,35}, {67,36}, {67,37}, {67,38}, {67,39}, {67,40}, {67,41}, {67,42}, {67,43}, {67,44}, {67,45}, {67,47}, {67,48}, {67,49}, {67,59}, {67,60}, {67,61}, {67,76}, {67,77}, {67,78}, {67,106}, {67,107}, {67,108}, {67,133}, {67,134}, {67,136}, {67,137}, {67,138}, {67,140}, {67,141}, {67,142}, {68,-103}, {68,-102}, {68,-101}, {68,-100}, {68,-89}, {68,-88}, {68,-87}, {68,-86}, {68,-85}, {68,-84}, {68,-83}, {68,-82}, {68,-38}, {68,-37}, {68,-15}, {68,-14}, {68,-13}, {68,-9}, {68,47}, {68,48}, {68,49}, {68,59}, {68,60}, {68,61}, {68,76}, {68,77}, {68,78}, {68,106}, {68,107}, {68,108}, {68,116}, {68,117}, {68,133}, {68,134}, {68,136}, {68,137}, {68,138}, {68,140}, {68,141}, {68,142}, {69,-103}, {69,-102}, {69,-101}, {69,-100}, {69,-99}, {69,-89}, {69,-88}, {69,-87}, {69,-86}, {69,-85}, {69,-38}, {69,-37}, {69,-15}, {69,-14}, {69,-13}, {69,-10}, {69,-9}, {69,47}, {69,48}, {69,49}, {69,76}, {69,77}, {69,78}, {69,116}, {69,117}, {69,133}, {69,134}, {70,-103}, {70,-102}, {70,-101}, {70,-100}, {70,-99}, {70,-89}, {70,-88}, {70,-37}, {70,-15}, {70,-14}, {70,-13}, {70,-10}, {70,-9}, {70,-8}, {70,-5}, {70,-4}, {70,-3}, {70,12}, {70,13}, {70,14}, {70,16}, {70,17}, {70,18}, {70,31}, {70,32}, {70,33}, {70,34}, {70,35}, {70,59}, {70,60}, {70,61}, {70,76}, {70,77}, {70,78}, {70,105}, {70,106}, {70,107}, {70,108}, {70,110}, {70,111}, {70,112}, {70,113}, {70,114}, {70,115}, {70,116}, {70,117}, {70,133}, {70,134}, {70,135}, {70,136}, {70,137}, {70,138}, {70,139}, {70,140}, {70,141}, {70,142}, {71,-103}, {71,-102}, {71,-101}, {71,-100}, {71,-99}, {71,-39}, {71,-38}, {71,-37}, {71,-15}, {71,-14}, {71,-13}, {71,-10}, {71,-9}, {71,-8}, {71,-7}, {71,-6}, {71,-5}, {71,-4}, {71,-3}, {71,12}, {71,13}, {71,14}, {71,16}, {71,17}, {71,18}, {71,31}, {71,32}, {71,33}, {71,34}, {71,35}, {71,47}, {71,48}, {71,49}, {71,59}, {71,60}, {71,61}, {71,76}, {71,77}, {71,78}, {71,106}, {71,107}, {71,108}, {71,109}, {71,110}, {71,111}, {71,112}, {71,113}, {71,114}, {71,115}, {71,116}, {71,117}, {71,133}, {71,134}, {71,135}, {71,136}, {71,137}, {71,138}, {71,139}, {71,140}, {71,141}, {71,142}, {72,-103}, {72,-102}, {72,-101}, {72,-100}, {72,-99}, {72,-98}, {72,-57}, {72,-56}, {72,-55}, {72,-54}, {72,-53}, {72,-52}, {72,-38}, {72,-37}, {72,-15}, {72,-14}, {72,-13}, {72,-10}, {72,-9}, {72,-8}, {72,-7}, {72,-6}, {72,-5}, {72,-4}, {72,-3}, {72,12}, {72,13}, {72,14}, {72,16}, {72,17}, {72,18}, {72,31}, {72,32}, {72,33}, {72,34}, {72,35}, {72,47}, {72,48}, {72,49}, {72,59}, {72,60}, {72,61}, {72,76}, {72,77}, {72,78}, {72,106}, {72,107}, {72,108}, {72,110}, {72,111}, {72,112}, {72,113}, {72,114}, {72,115}, {72,116}, {72,117}, {72,133}, {72,134}, {72,135}, {72,136}, {72,137}, {72,138}, {72,139}, {72,140}, {72,141}, {72,142}, {73,-103}, {73,-102}, {73,-101}, {73,-100}, {73,-99}, {73,-98}, {73,-57}, {73,-56}, {73,-55}, {73,-54}, {73,-53}, {73,-52}, {73,-38}, {73,-37}, {73,-15}, {73,-14}, {73,-13}, {73,-10}, {73,-9}, {73,-8}, {73,-5}, {73,-4}, {73,-3}, {73,12}, {73,13}, {73,14}, {73,16}, {73,17}, {73,18}, {73,31}, {73,32}, {73,33}, {73,34}, {73,35}, {73,47}, {73,48}, {73,49}, {73,59}, {73,60}, {73,61}, {73,76}, {73,77}, {73,78}, {73,106}, {73,107}, {73,108}, {73,141}, {74,-100}, {74,-57}, {74,-56}, {74,-55}, {74,-54}, {74,-53}, {74,-52}, {74,-38}, {74,-37}, {74,-15}, {74,-14}, {74,-13}, {74,-10}, {74,-9}, {74,-8}, {74,-5}, {74,-4}, {74,-3}, {74,12}, {74,13}, {74,14}, {74,15}, {74,16}, {74,17}, {74,18}, {74,31}, {74,32}, {74,33}, {74,34}, {74,35}, {74,59}, {74,60}, {74,61}, {74,76}, {74,77}, {74,78}, {74,106}, {74,107}, {74,108}, {74,140}, {74,141}, {74,142}, {75,-101}, {75,-100}, {75,-99}, {75,-98}, {75,-97}, {75,-54}, {75,-15}, {75,-14}, {75,-13}, {75,-10}, {75,-9}, {75,-8}, {75,-5}, {75,-4}, {75,-3}, {75,12}, {75,13}, {75,14}, {75,16}, {75,17}, {75,18}, {75,31}, {75,32}, {75,33}, {75,34}, {75,35}, {75,47}, {75,48}, {75,49}, {75,59}, {75,60}, {75,61}, {75,76}, {75,77}, {75,78}, {75,106}, {75,107}, {75,108}, {75,140}, {75,141}, {75,142}, {76,-101}, {76,-100}, {76,-99}, {76,-98}, {76,-97}, {76,-57}, {76,-56}, {76,-55}, {76,-54}, {76,-15}, {76,-14}, {76,-13}, {76,-10}, {76,-9}, {76,-8}, {76,-5}, {76,-4}, {76,-3}, {76,12}, {76,13}, {76,14}, {76,16}, {76,17}, {76,18}, {76,31}, {76,32}, {76,33}, {76,34}, {76,35}, {76,47}, {76,48}, {76,49}, {76,60}, {76,76}, {76,77}, {76,78}, {76,106}, {76,107}, {76,108}, {76,140}, {76,141}, {76,142}, {77,-101}, {77,-100}, {77,-99}, {77,-98}, {77,-97}, {77,-57}, {77,-56}, {77,-55}, {77,-54}, {77,-37}, {77,-15}, {77,-14}, {77,-13}, {77,-10}, {77,-9}, {77,-8}, {77,-5}, {77,-4}, {77,-3}, {77,12}, {77,13}, {77,14}, {77,16}, {77,17}, {77,18}, {77,31}, {77,32}, {77,33}, {77,34}, {77,35}, {77,47}, {77,48}, {77,49}, {77,59}, {77,60}, {77,61}, {77,76}, {77,77}, {77,78}, {77,106}, {77,107}, {77,108}, {77,140}, {77,141}, {77,142}, {78,-100}, {78,-99}, {78,-98}, {78,-97}, {78,-96}, {78,-95}, {78,-94}, {78,-93}, {78,-57}, {78,-56}, {78,-55}, {78,-54}, {78,-37}, {78,-30}, {78,-22}, {78,-15}, {78,-14}, {78,-13}, {78,-10}, {78,-9}, {78,-8}, {78,-5}, {78,-4}, {78,-3}, {78,12}, {78,13}, {78,14}, {78,16}, {78,17}, {78,18}, {78,31}, {78,32}, {78,33}, {78,34}, {78,35}, {78,47}, {78,48}, {78,49}, {78,58}, {78,59}, {78,60}, {78,61}, {78,76}, {78,77}, {78,78}, {78,81}, {78,82}, {78,83}, {78,84}, {78,85}, {78,87}, {78,88}, {78,89}, {78,101}, {78,102}, {78,103}, {78,106}, {78,107}, {78,108}, {78,120}, {78,121}, {78,122}, {78,123}, {78,124}, {78,125}, {78,126}, {78,127}, {78,128}, {78,129}, {78,130}, {78,140}, {78,141}, {78,142}, {79,-100}, {79,-99}, {79,-98}, {79,-97}, {79,-57}, {79,-56}, {79,-55}, {79,-54}, {79,-37}, {79,-34}, {79,-33}, {79,-32}, {79,-31}, {79,-30}, {79,-29}, {79,-28}, {79,-27}, {79,-25}, {79,-24}, {79,-23}, {79,-22}, {79,-21}, {79,-20}, {79,-19}, {79,-18}, {79,-14}, {79,-4}, {79,14}, {79,16}, {79,32}, {79,47}, {79,48}, {79,49}, {79,59}, {79,60}, {79,61}, {79,76}, {79,77}, {79,78}, {79,79}, {79,80}, {79,81}, {79,82}, {79,83}, {79,84}, {79,85}, {79,86}, {79,87}, {79,88}, {79,89}, {79,101}, {79,102}, {79,103}, {79,106}, {79,107}, {79,108}, {79,120}, {79,121}, {79,122}, {79,123}, {79,124}, {79,125}, {79,126}, {79,127}, {79,128}, {79,129}, {79,130}, {79,140}, {79,141}, {79,142}, {80,-57}, {80,-34}, {80,-33}, {80,-32}, {80,-31}, {80,-30}, {80,-29}, {80,-28}, {80,-27}, {80,-25}, {80,-24}, {80,-23}, {80,-22}, {80,-21}, {80,-20}, {80,-19}, {80,-18}, {80,-15}, {80,-14}, {80,-13}, {80,-10}, {80,-9}, {80,-8}, {80,-7}, {80,-6}, {80,-5}, {80,-4}, {80,-3}, {80,-2}, {80,-1}, {80,0}, {80,2}, {80,3}, {80,4}, {80,5}, {80,6}, {80,7}, {80,8}, {80,10}, {80,11}, {80,12}, {80,13}, {80,14}, {80,16}, {80,17}, {80,18}, {80,19}, {80,20}, {80,21}, {80,23}, {80,24}, {80,25}, {80,26}, {80,27}, {80,28}, {80,29}, {80,31}, {80,32}, {80,33}, {80,34}, {80,35}, {80,36}, {80,37}, {80,38}, {80,40}, {80,41}, {80,42}, {80,43}, {80,44}, {80,45}, {80,47}, {80,48}, {80,49}, {80,59}, {80,60}, {80,61}, {80,76}, {80,77}, {80,78}, {80,81}, {80,82}, {80,83}, {80,84}, {80,85}, {80,87}, {80,88}, {80,89}, {80,101}, {80,102}, {80,103}, {80,106}, {80,107}, {80,108}, {80,120}, {80,121}, {80,122}, {80,123}, {80,124}, {80,125}, {80,126}, {80,127}, {80,128}, {80,129}, {80,130}, {80,140}, {80,141}, {80,142}, {81,-57}, {81,-56}, {81,-34}, {81,-33}, {81,-32}, {81,-31}, {81,-30}, {81,-29}, {81,-28}, {81,-27}, {81,-25}, {81,-24}, {81,-23}, {81,-22}, {81,-21}, {81,-20}, {81,-19}, {81,-18}, {81,-15}, {81,-14}, {81,-13}, {81,-10}, {81,-9}, {81,-8}, {81,-7}, {81,-6}, {81,-5}, {81,-4}, {81,-3}, {81,-2}, {81,-1}, {81,0}, {81,2}, {81,3}, {81,4}, {81,5}, {81,6}, {81,7}, {81,8}, {81,10}, {81,11}, {81,12}, {81,13}, {81,14}, {81,16}, {81,17}, {81,18}, {81,19}, {81,20}, {81,21}, {81,23}, {81,24}, {81,25}, {81,26}, {81,27}, {81,28}, {81,29}, {81,31}, {81,32}, {81,33}, {81,34}, {81,35}, {81,36}, {81,37}, {81,38}, {81,40}, {81,41}, {81,42}, {81,43}, {81,44}, {81,45}, {81,47}, {81,48}, {81,49}, {81,60}, {81,87}, {81,106}, {81,107}, {81,108}, {81,121}, {81,130}, {81,141}, {82,-57}, {82,-56}, {82,59}, {82,60}, {82,61}, {82,63}, {82,64}, {82,65}, {82,66}, {82,67}, {82,68}, {82,69}, {82,70}, {82,71}, {82,72}, {82,73}, {82,75}, {82,76}, {82,77}, {82,78}, {82,79}, {82,80}, {82,81}, {82,82}, {82,83}, {82,84}, {82,85}, {82,86}, {82,87}, {82,89}, {82,90}, {82,91}, {82,92}, {82,93}, {82,94}, {82,95}, {82,97}, {82,98}, {82,99}, {82,100}, {82,101}, {82,102}, {82,103}, {82,106}, {82,107}, {82,108}, {82,110}, {82,111}, {82,112}, {82,113}, {82,114}, {82,116}, {82,117}, {82,118}, {82,120}, {82,121}, {82,122}, {82,123}, {82,124}, {82,125}, {82,127}, {82,128}, {82,129}, {82,130}, {82,132}, {82,133}, {82,134}, {82,136}, {82,137}, {82,138}, {82,140}, {82,141}, {82,142}, {83,59}, {83,60}, {83,61}, {83,62}, {83,63}, {83,64}, {83,65}, {83,66}, {83,67}, {83,68}, {83,69}, {83,70}, {83,71}, {83,72}, {83,73}, {83,74}, {83,75}, {83,76}, {83,77}, {83,78}, {83,79}, {83,80}, {83,81}, {83,82}, {83,83}, {83,84}, {83,85}, {83,86}, {83,87}, {83,89}, {83,90}, {83,91}, {83,92}, {83,93}, {83,94}, {83,95}, {83,96}, {83,97}, {83,98}, {83,99}, {83,100}, {83,101}, {83,102}, {83,103}, {83,104}, {83,105}, {83,106}, {83,107}, {83,108}, {83,110}, {83,111}, {83,112}, {83,113}, {83,114}, {83,115}, {83,116}, {83,117}, {83,118}, {83,120}, {83,121}, {83,122}, {83,123}, {83,124}, {83,125}, {83,127}, {83,128}, {83,129}, {83,130}, {83,131}, {83,132}, {83,133}, {83,134}, {83,136}, {83,137}, {83,138}, {83,140}, {83,141}, {83,142}, {84,59}, {84,60}, {84,61}, {84,63}, {84,64}, {84,65}, {84,66}, {84,67}, {84,68}, {84,69}, {84,70}, {84,71}, {84,72}, {84,73}, {84,75}, {84,76}, {84,77}, {84,78}, {84,79}, {84,80}, {84,81}, {84,82}, {84,83}, {84,84}, {84,85}, {84,86}, {84,87}, {84,89}, {84,90}, {84,91}, {84,92}, {84,93}, {84,94}, {84,95}, {84,97}, {84,98}, {84,99}, {84,100}, {84,101}, {84,102}, {84,103}, {84,106}, {84,107}, {84,108}, {84,110}, {84,111}, {84,112}, {84,113}, {84,114}, {84,116}, {84,117}, {84,118}, {84,120}, {84,121}, {84,122}, {84,123}, {84,124}, {84,125}, {84,127}, {84,128}, {84,129}, {84,130}, {84,132}, {84,133}, {84,134}, {84,136}, {84,137}, {84,138}, {84,140}, {84,141}, {84,142}, }, + ["vegetation-green-grass-2"] = {{-85,104}, {-84,92}, {-81,60}, {-79,72}, {-79,75}, {-79,76}, {-79,77}, {-79,78}, {-79,79}, {-79,80}, {-79,81}, {-79,82}, {-79,83}, {-79,84}, {-79,85}, {-79,86}, {-79,87}, {-79,88}, {-79,89}, {-79,90}, {-79,91}, {-78,-113}, {-78,74}, {-78,75}, {-78,78}, {-78,83}, {-78,84}, {-78,85}, {-78,86}, {-78,87}, {-78,88}, {-78,89}, {-78,90}, {-78,91}, {-77,-112}, {-77,-111}, {-77,-103}, {-77,-102}, {-77,72}, {-77,73}, {-77,88}, {-77,91}, {-76,-110}, {-76,-109}, {-76,-108}, {-76,-103}, {-76,-93}, {-76,72}, {-76,73}, {-76,88}, {-76,118}, {-75,-107}, {-75,72}, {-75,73}, {-75,76}, {-75,118}, {-74,-106}, {-74,-99}, {-74,72}, {-74,87}, {-74,118}, {-73,72}, {-73,91}, {-73,118}, {-73,119}, {-72,72}, {-72,91}, {-72,118}, {-72,119}, {-71,-91}, {-71,72}, {-71,91}, {-71,118}, {-71,119}, {-70,-98}, {-70,-91}, {-70,72}, {-70,91}, {-70,118}, {-70,119}, {-69,-109}, {-69,-108}, {-69,72}, {-69,73}, {-69,88}, {-69,89}, {-69,90}, {-69,118}, {-69,119}, {-68,-98}, {-68,-97}, {-68,-96}, {-68,72}, {-68,87}, {-68,88}, {-68,89}, {-68,118}, {-68,119}, {-67,-96}, {-67,-95}, {-67,72}, {-67,73}, {-67,74}, {-67,75}, {-67,85}, {-67,86}, {-67,87}, {-67,88}, {-67,118}, {-67,119}, {-66,-113}, {-66,-112}, {-66,72}, {-66,73}, {-66,74}, {-66,75}, {-66,82}, {-66,83}, {-66,84}, {-66,85}, {-66,86}, {-66,118}, {-66,119}, {-66,120}, {-66,122}, {-65,-111}, {-65,-110}, {-65,-101}, {-65,72}, {-65,73}, {-65,74}, {-65,75}, {-65,76}, {-65,77}, {-65,78}, {-65,79}, {-65,80}, {-65,81}, {-65,82}, {-64,-109}, {-64,-108}, {-64,-101}, {-64,-100}, {-62,-105}, {-62,-104}, {-61,-105}, {-61,-104}, {-61,43}, {-61,44}, {-61,45}, {-61,46}, {-61,47}, {-61,48}, {-61,49}, {-61,50}, {-61,51}, {-61,52}, {-61,53}, {-60,-95}, {-60,-94}, {-60,43}, {-60,44}, {-60,45}, {-60,46}, {-60,47}, {-60,48}, {-60,49}, {-60,50}, {-60,51}, {-60,52}, {-59,44}, {-59,45}, {-59,46}, {-59,47}, {-59,48}, {-59,49}, {-59,50}, {-59,51}, {-59,74}, {-58,-98}, {-58,45}, {-58,46}, {-58,47}, {-58,48}, {-58,49}, {-58,50}, {-58,74}, {-57,-108}, {-57,-107}, {-57,-98}, {-57,-97}, {-57,72}, {-57,73}, {-57,74}, {-57,75}, {-57,76}, {-56,-107}, {-56,-106}, {-56,-97}, {-56,-96}, {-56,73}, {-56,74}, {-56,75}, {-55,-105}, {-55,-104}, {-55,-95}, {-55,-94}, {-55,-93}, {-55,74}, {-55,75}, {-54,-104}, {-54,-94}, {-54,-93}, {-53,-104}, {-53,-103}, {-52,-111}, {-52,-110}, {-52,-103}, {-52,-102}, {-51,-110}, {-51,-109}, {-51,-108}, {-51,-101}, {-51,-100}, {-50,-100}, {-50,-99}, {-50,-98}, {-50,-96}, {-50,-95}, {-49,-106}, {-49,-98}, {-49,-97}, {-49,-96}, {-49,-95}, {-48,-106}, {-48,-105}, {-48,-104}, {-48,-95}, {-48,-94}, {-48,-93}, {-48,-92}, {-47,-104}, {-47,-103}, {-47,-95}, {-47,-94}, {-47,-93}, {-47,-92}, {-47,-91}, {-46,-103}, {-46,-91}, {-44,-100}, {-44,-99}, {-44,-98}, {-44,-97}, {-43,-106}, {-43,-105}, {-43,-99}, {-43,-98}, {-43,-97}, {-43,-96}, {-42,-106}, {-42,-105}, {-42,-104}, {-42,-96}, {-42,-95}, {-41,-103}, {-41,-102}, {-41,-95}, {-41,-94}, {-41,-93}, {-40,-102}, {-40,-101}, {-38,-107}, {-38,-106}, {-38,-99}, {-38,-98}, {-37,-106}, {-37,-99}, {-37,-98}, {-37,-97}, {-37,-95}, {-37,-75}, {-37,-74}, {-36,-102}, {-36,-96}, {-36,-95}, {-36,-94}, {-36,-93}, {-36,-77}, {-36,-76}, {-36,-75}, {-36,-74}, {-35,-102}, {-35,-101}, {-35,-100}, {-35,-95}, {-35,-94}, {-35,-93}, {-35,-92}, {-35,-77}, {-35,-76}, {-35,-75}, {-35,-74}, {-35,47}, {-34,-100}, {-34,-99}, {-34,-93}, {-34,47}, {-34,48}, {-34,73}, {-33,-99}, {-33,47}, {-33,48}, {-33,49}, {-33,73}, {-32,-107}, {-32,-106}, {-32,-105}, {-32,-98}, {-32,-97}, {-32,-76}, {-32,-75}, {-32,47}, {-32,48}, {-32,49}, {-32,50}, {-31,-105}, {-31,-104}, {-31,-103}, {-31,-97}, {-31,-96}, {-31,-79}, {-31,-78}, {-31,-76}, {-31,-75}, {-31,47}, {-31,48}, {-31,49}, {-31,50}, {-31,51}, {-30,-103}, {-30,-102}, {-30,-101}, {-30,-79}, {-30,-78}, {-30,-76}, {-30,-75}, {-30,74}, {-30,75}, {-29,-101}, {-29,-76}, {-29,-75}, {-29,74}, {-29,75}, {-28,-98}, {-28,74}, {-28,75}, {-28,105}, {-28,106}, {-28,107}, {-28,108}, {-28,109}, {-28,110}, {-27,-98}, {-27,-97}, {-27,-96}, {-27,74}, {-27,75}, {-27,99}, {-27,105}, {-27,106}, {-27,107}, {-27,108}, {-27,109}, {-27,110}, {-26,-107}, {-26,-106}, {-26,-105}, {-26,-96}, {-26,-95}, {-26,-79}, {-26,-78}, {-26,-77}, {-26,-76}, {-26,-75}, {-26,-74}, {-26,74}, {-26,75}, {-26,91}, {-26,92}, {-26,99}, {-26,104}, {-26,105}, {-26,106}, {-26,107}, {-26,108}, {-26,109}, {-26,110}, {-26,111}, {-26,112}, {-26,113}, {-26,114}, {-25,-104}, {-25,-103}, {-25,-79}, {-25,-78}, {-25,-77}, {-25,-76}, {-25,-75}, {-25,-74}, {-25,74}, {-25,75}, {-25,76}, {-25,77}, {-25,86}, {-25,91}, {-25,92}, {-25,94}, {-25,95}, {-25,96}, {-25,97}, {-25,99}, {-25,100}, {-25,101}, {-25,102}, {-25,103}, {-25,104}, {-25,105}, {-25,106}, {-25,107}, {-25,109}, {-25,110}, {-25,111}, {-25,112}, {-25,113}, {-25,114}, {-24,-103}, {-24,-102}, {-24,-101}, {-24,75}, {-24,76}, {-24,77}, {-24,86}, {-24,91}, {-24,92}, {-24,93}, {-24,94}, {-24,95}, {-24,96}, {-24,97}, {-24,98}, {-24,99}, {-24,100}, {-24,101}, {-24,102}, {-24,103}, {-24,104}, {-24,105}, {-24,106}, {-24,107}, {-24,108}, {-24,109}, {-24,110}, {-24,111}, {-24,112}, {-24,113}, {-24,114}, {-23,-101}, {-23,-100}, {-23,-99}, {-23,75}, {-23,76}, {-23,77}, {-23,86}, {-23,87}, {-23,88}, {-23,89}, {-23,90}, {-23,91}, {-23,92}, {-23,93}, {-23,94}, {-23,95}, {-23,96}, {-23,97}, {-23,98}, {-23,99}, {-23,100}, {-23,101}, {-23,102}, {-23,103}, {-23,104}, {-23,105}, {-23,106}, {-23,107}, {-23,108}, {-23,109}, {-23,110}, {-23,111}, {-23,112}, {-23,113}, {-23,114}, {-22,-99}, {-22,-98}, {-22,-97}, {-22,-80}, {-21,-97}, {-21,-82}, {-21,-81}, {-21,-80}, {-21,-79}, {-21,-78}, {-21,-77}, {-21,-76}, {-21,-75}, {-21,-74}, {-20,-106}, {-20,-105}, {-20,-104}, {-20,-81}, {-20,-80}, {-20,-77}, {-20,-76}, {-20,-75}, {-20,-74}, {-20,35}, {-20,75}, {-20,76}, {-20,77}, {-20,78}, {-20,79}, {-20,80}, {-20,89}, {-20,90}, {-20,91}, {-20,92}, {-20,93}, {-20,94}, {-20,95}, {-20,96}, {-20,97}, {-20,98}, {-20,99}, {-20,100}, {-20,101}, {-20,102}, {-20,103}, {-20,104}, {-20,105}, {-20,106}, {-20,107}, {-20,108}, {-20,109}, {-20,110}, {-20,111}, {-20,112}, {-20,113}, {-20,114}, {-20,115}, {-20,116}, {-20,117}, {-19,-104}, {-19,-103}, {-19,35}, {-19,75}, {-19,76}, {-19,77}, {-19,78}, {-19,79}, {-19,80}, {-19,85}, {-19,86}, {-19,87}, {-19,88}, {-19,89}, {-19,90}, {-19,91}, {-19,92}, {-19,93}, {-19,94}, {-19,95}, {-19,96}, {-19,102}, {-19,103}, {-19,104}, {-19,105}, {-19,106}, {-19,107}, {-19,108}, {-19,109}, {-19,110}, {-19,111}, {-19,112}, {-19,113}, {-19,114}, {-19,115}, {-19,116}, {-19,117}, {-18,-102}, {-18,-101}, {-18,35}, {-18,75}, {-18,80}, {-18,86}, {-18,87}, {-18,88}, {-18,89}, {-18,90}, {-18,91}, {-18,93}, {-18,104}, {-18,105}, {-18,106}, {-18,107}, {-18,108}, {-18,109}, {-18,112}, {-18,113}, {-18,114}, {-18,115}, {-18,116}, {-18,117}, {-17,-101}, {-17,-100}, {-17,35}, {-17,75}, {-17,80}, {-17,85}, {-17,86}, {-17,87}, {-17,88}, {-17,104}, {-17,105}, {-17,106}, {-17,107}, {-17,108}, {-17,109}, {-17,110}, {-17,111}, {-17,112}, {-17,113}, {-17,114}, {-17,115}, {-17,116}, {-17,117}, {-16,-100}, {-16,-99}, {-16,-80}, {-16,-79}, {-16,-78}, {-16,-77}, {-16,-76}, {-16,-75}, {-16,-74}, {-16,75}, {-16,80}, {-16,85}, {-16,86}, {-16,89}, {-16,106}, {-16,107}, {-16,108}, {-16,109}, {-16,110}, {-16,112}, {-16,113}, {-16,114}, {-16,115}, {-16,116}, {-15,-97}, {-15,-96}, {-15,-95}, {-15,-80}, {-15,-79}, {-15,-78}, {-15,-77}, {-15,-76}, {-15,-75}, {-15,-74}, {-15,75}, {-15,80}, {-15,84}, {-15,107}, {-15,108}, {-15,109}, {-15,110}, {-15,114}, {-15,115}, {-15,116}, {-14,-97}, {-14,-96}, {-14,-95}, {-14,75}, {-14,80}, {-14,83}, {-14,84}, {-14,86}, {-14,104}, {-14,107}, {-14,108}, {-14,109}, {-14,115}, {-13,-103}, {-13,-102}, {-13,75}, {-13,80}, {-13,83}, {-13,84}, {-13,85}, {-13,86}, {-13,97}, {-13,107}, {-13,108}, {-13,109}, {-13,110}, {-12,-102}, {-12,-101}, {-12,75}, {-12,76}, {-12,79}, {-12,80}, {-12,83}, {-12,84}, {-12,85}, {-12,86}, {-12,106}, {-12,108}, {-12,109}, {-11,-83}, {-11,-82}, {-11,-81}, {-11,-80}, {-11,-79}, {-11,-78}, {-11,-77}, {-11,-75}, {-11,-74}, {-11,75}, {-11,76}, {-11,79}, {-11,80}, {-11,83}, {-11,84}, {-11,85}, {-11,86}, {-11,103}, {-11,109}, {-11,148}, {-10,-83}, {-10,-82}, {-10,-81}, {-10,-80}, {-10,-79}, {-10,-78}, {-10,-77}, {-10,-75}, {-10,-74}, {-10,75}, {-10,76}, {-10,77}, {-10,78}, {-10,79}, {-10,80}, {-10,83}, {-10,84}, {-10,85}, {-10,109}, {-10,115}, {-10,148}, {-9,75}, {-9,76}, {-9,77}, {-9,78}, {-9,79}, {-9,80}, {-9,83}, {-9,84}, {-9,85}, {-9,86}, {-9,115}, {-8,77}, {-8,78}, {-8,79}, {-8,80}, {-8,83}, {-8,84}, {-8,85}, {-8,101}, {-8,102}, {-8,105}, {-8,109}, {-7,78}, {-7,79}, {-7,80}, {-7,83}, {-7,84}, {-7,85}, {-7,102}, {-7,103}, {-7,104}, {-7,105}, {-7,106}, {-7,107}, {-7,109}, {-7,110}, {-6,-80}, {-6,-79}, {-6,-77}, {-6,-76}, {-6,-75}, {-6,-74}, {-6,79}, {-6,80}, {-6,83}, {-6,84}, {-6,85}, {-6,86}, {-6,91}, {-6,92}, {-6,93}, {-6,94}, {-6,103}, {-6,104}, {-6,105}, {-6,106}, {-6,107}, {-6,108}, {-5,-83}, {-5,-80}, {-5,-79}, {-5,-77}, {-5,-76}, {-5,-75}, {-5,-74}, {-5,80}, {-5,83}, {-5,84}, {-5,85}, {-5,86}, {-5,88}, {-5,89}, {-5,91}, {-5,92}, {-4,80}, {-4,83}, {-4,84}, {-4,85}, {-4,87}, {-3,82}, {-3,83}, {-3,88}, {-3,89}, {-2,-75}, {-2,-74}, {-2,81}, {-2,82}, {-2,83}, {-2,87}, {-2,88}, {-2,89}, {-1,-83}, {-1,-82}, {-1,-79}, {-1,-78}, {-1,-77}, {-1,-76}, {-1,-75}, {-1,-74}, {-1,78}, {-1,79}, {-1,80}, {-1,81}, {-1,82}, {-1,83}, {-1,84}, {-1,85}, {0,-83}, {0,-82}, {0,-79}, {0,-78}, {0,-77}, {0,-76}, {0,35}, {0,79}, {0,80}, {0,81}, {0,82}, {0,83}, {0,84}, {0,85}, {1,79}, {1,80}, {1,81}, {1,82}, {1,83}, {1,84}, {2,83}, {2,84}, {2,85}, {3,-85}, {3,-84}, {4,-85}, {4,-84}, {4,-83}, {4,-82}, {4,-80}, {4,-79}, {4,-78}, {4,-75}, {4,-74}, {4,34}, {5,-83}, {5,-82}, {5,-80}, {5,-79}, {5,-78}, {5,-75}, {5,-74}, {5,34}, {5,35}, {6,34}, {6,35}, {7,30}, {8,30}, {9,-80}, {9,-79}, {9,-75}, {9,-74}, {9,-19}, {9,-18}, {9,-17}, {9,-16}, {9,13}, {9,14}, {9,15}, {9,16}, {9,17}, {9,18}, {9,22}, {9,23}, {9,24}, {9,26}, {9,29}, {9,30}, {9,31}, {9,140}, {9,141}, {9,142}, {10,-80}, {10,-79}, {10,-76}, {10,-75}, {10,-74}, {10,140}, {11,-76}, {11,-75}, {11,-74}, {11,140}, {12,-77}, {12,-76}, {12,-75}, {12,-74}, {12,140}, {13,-78}, {13,-77}, {13,-76}, {13,-75}, {13,-74}, {13,140}, {17,-82}, {17,-81}, {18,-83}, {18,-82}, {18,-81}, {19,-84}, {19,-83}, {19,-82}, {25,-24}, {25,-23}, {26,-27}, {26,-24}, {26,-23}, {29,52}, {29,53}, {30,52}, {59,120}, {59,121}, {60,120}, {60,127}, {60,128}, {63,120}, {68,120}, {68,130}, {69,129}, {69,130}, }, + ["refined-concrete"] = {{-83,25}, {-83,47}, {-83,48}, {-83,49}, {-83,54}, {-83,55}, {-83,57}, {-83,58}, {-83,100}, {-82,54}, {-82,55}, {-82,57}, {-82,58}, {-82,97}, {-82,98}, {-82,99}, {-82,100}, {-82,101}, {-82,104}, {-82,105}, {-82,106}, {-82,107}, {-82,108}, {-82,109}, {-82,110}, {-82,111}, {-82,112}, {-81,54}, {-81,55}, {-81,57}, {-81,58}, {-81,97}, {-81,98}, {-81,99}, {-81,100}, {-81,101}, {-81,104}, {-81,105}, {-81,106}, {-81,107}, {-81,108}, {-81,109}, {-81,110}, {-81,111}, {-81,112}, {-80,97}, {-80,98}, {-80,99}, {-80,100}, {-80,101}, {-80,104}, {-80,105}, {-80,106}, {-80,107}, {-80,108}, {-80,109}, {-80,110}, {-80,111}, {-80,112}, {-79,39}, {-79,40}, {-79,97}, {-79,98}, {-79,99}, {-79,100}, {-79,101}, {-79,104}, {-79,105}, {-79,106}, {-79,107}, {-79,108}, {-79,109}, {-79,110}, {-79,111}, {-79,112}, {-78,39}, {-78,40}, {-78,97}, {-78,98}, {-78,99}, {-78,100}, {-78,101}, {-78,104}, {-78,105}, {-78,106}, {-78,107}, {-78,108}, {-78,109}, {-78,110}, {-78,111}, {-78,112}, {-77,25}, {-77,39}, {-77,40}, {-77,97}, {-77,98}, {-77,99}, {-77,100}, {-77,101}, {-77,104}, {-77,108}, {-77,109}, {-77,110}, {-77,111}, {-77,112}, {-77,113}, {-76,39}, {-76,40}, {-76,51}, {-76,52}, {-76,55}, {-76,63}, {-76,97}, {-76,98}, {-76,99}, {-76,100}, {-76,101}, {-76,102}, {-76,103}, {-76,104}, {-76,105}, {-76,107}, {-76,108}, {-76,109}, {-76,110}, {-76,111}, {-76,112}, {-75,39}, {-75,40}, {-75,51}, {-75,52}, {-75,53}, {-75,54}, {-75,55}, {-75,56}, {-75,57}, {-75,58}, {-75,59}, {-75,62}, {-75,63}, {-75,64}, {-75,65}, {-75,66}, {-75,97}, {-75,98}, {-75,99}, {-75,100}, {-75,101}, {-75,104}, {-75,108}, {-75,109}, {-75,110}, {-75,111}, {-75,112}, {-74,-22}, {-74,-16}, {-74,39}, {-74,40}, {-74,51}, {-74,52}, {-74,53}, {-74,54}, {-74,55}, {-74,56}, {-74,57}, {-74,58}, {-74,59}, {-74,62}, {-74,64}, {-74,66}, {-74,97}, {-74,98}, {-74,99}, {-74,100}, {-74,101}, {-74,104}, {-74,105}, {-74,106}, {-74,107}, {-74,108}, {-74,109}, {-74,110}, {-74,111}, {-74,112}, {-73,5}, {-73,6}, {-73,7}, {-73,38}, {-73,39}, {-73,40}, {-73,51}, {-73,52}, {-73,53}, {-73,54}, {-73,55}, {-73,56}, {-73,57}, {-73,58}, {-73,59}, {-73,62}, {-73,63}, {-73,64}, {-73,65}, {-73,66}, {-73,97}, {-73,98}, {-73,99}, {-73,100}, {-73,101}, {-73,104}, {-73,105}, {-73,106}, {-73,107}, {-73,108}, {-73,109}, {-72,-11}, {-72,-10}, {-72,-9}, {-72,-8}, {-72,-7}, {-72,-6}, {-72,-5}, {-72,-4}, {-72,-3}, {-72,-2}, {-72,-1}, {-72,0}, {-72,1}, {-72,2}, {-72,3}, {-72,4}, {-72,5}, {-72,6}, {-72,7}, {-72,8}, {-72,9}, {-72,10}, {-72,11}, {-72,12}, {-72,13}, {-72,14}, {-72,15}, {-72,16}, {-72,17}, {-72,18}, {-72,19}, {-72,20}, {-72,21}, {-72,22}, {-72,23}, {-72,38}, {-72,39}, {-72,40}, {-72,51}, {-72,52}, {-72,53}, {-72,54}, {-72,55}, {-72,56}, {-72,57}, {-72,58}, {-72,59}, {-72,62}, {-72,63}, {-72,64}, {-72,65}, {-72,66}, {-72,97}, {-72,98}, {-72,99}, {-72,100}, {-72,101}, {-72,109}, {-71,-70}, {-71,-69}, {-71,-11}, {-71,-10}, {-71,-9}, {-71,-8}, {-71,-7}, {-71,-6}, {-71,-5}, {-71,-4}, {-71,-3}, {-71,-2}, {-71,-1}, {-71,0}, {-71,1}, {-71,2}, {-71,3}, {-71,4}, {-71,5}, {-71,6}, {-71,7}, {-71,8}, {-71,9}, {-71,10}, {-71,11}, {-71,12}, {-71,13}, {-71,14}, {-71,15}, {-71,16}, {-71,17}, {-71,18}, {-71,19}, {-71,20}, {-71,21}, {-71,22}, {-71,23}, {-71,38}, {-71,39}, {-71,40}, {-71,51}, {-71,52}, {-71,53}, {-71,54}, {-71,55}, {-71,56}, {-71,57}, {-71,58}, {-71,59}, {-71,60}, {-71,61}, {-71,62}, {-71,63}, {-71,64}, {-71,65}, {-71,66}, {-71,97}, {-71,98}, {-71,99}, {-71,100}, {-71,101}, {-71,107}, {-71,108}, {-71,109}, {-71,110}, {-71,111}, {-71,112}, {-70,-11}, {-70,-10}, {-70,-9}, {-70,-8}, {-70,-7}, {-70,-6}, {-70,-5}, {-70,-4}, {-70,-3}, {-70,-2}, {-70,-1}, {-70,0}, {-70,1}, {-70,2}, {-70,3}, {-70,4}, {-70,5}, {-70,6}, {-70,7}, {-70,8}, {-70,9}, {-70,10}, {-70,11}, {-70,12}, {-70,13}, {-70,14}, {-70,15}, {-70,16}, {-70,17}, {-70,18}, {-70,19}, {-70,20}, {-70,21}, {-70,22}, {-70,23}, {-70,38}, {-70,39}, {-70,40}, {-70,51}, {-70,52}, {-70,53}, {-70,54}, {-70,55}, {-70,56}, {-70,57}, {-70,58}, {-70,59}, {-70,62}, {-70,63}, {-70,64}, {-70,65}, {-70,66}, {-70,97}, {-70,98}, {-70,99}, {-70,100}, {-70,101}, {-70,107}, {-70,108}, {-70,109}, {-70,110}, {-70,111}, {-70,112}, {-69,-11}, {-69,-10}, {-69,-9}, {-69,-8}, {-69,-7}, {-69,-6}, {-69,-5}, {-69,-4}, {-69,-3}, {-69,-2}, {-69,-1}, {-69,0}, {-69,1}, {-69,2}, {-69,3}, {-69,4}, {-69,5}, {-69,6}, {-69,7}, {-69,8}, {-69,9}, {-69,10}, {-69,11}, {-69,12}, {-69,13}, {-69,14}, {-69,15}, {-69,16}, {-69,17}, {-69,18}, {-69,19}, {-69,20}, {-69,21}, {-69,22}, {-69,23}, {-69,38}, {-69,39}, {-69,40}, {-69,51}, {-69,52}, {-69,53}, {-69,54}, {-69,55}, {-69,56}, {-69,57}, {-69,58}, {-69,59}, {-69,62}, {-69,63}, {-69,64}, {-69,65}, {-69,66}, {-69,100}, {-69,107}, {-69,108}, {-69,109}, {-69,110}, {-69,111}, {-69,112}, {-68,-11}, {-68,-10}, {-68,-9}, {-68,-8}, {-68,-7}, {-68,-6}, {-68,-5}, {-68,-4}, {-68,-3}, {-68,-2}, {-68,-1}, {-68,0}, {-68,1}, {-68,2}, {-68,3}, {-68,4}, {-68,5}, {-68,6}, {-68,7}, {-68,8}, {-68,9}, {-68,10}, {-68,11}, {-68,12}, {-68,13}, {-68,14}, {-68,15}, {-68,16}, {-68,17}, {-68,18}, {-68,19}, {-68,20}, {-68,21}, {-68,22}, {-68,23}, {-68,38}, {-68,39}, {-68,40}, {-68,51}, {-68,52}, {-68,53}, {-68,54}, {-68,55}, {-68,56}, {-68,57}, {-68,58}, {-68,59}, {-68,62}, {-68,63}, {-68,64}, {-68,65}, {-68,66}, {-68,107}, {-68,108}, {-68,109}, {-68,110}, {-68,111}, {-68,112}, {-67,-75}, {-67,-72}, {-67,-67}, {-67,-64}, {-67,-11}, {-67,-10}, {-67,-9}, {-67,-8}, {-67,-7}, {-67,-6}, {-67,-5}, {-67,-4}, {-67,-3}, {-67,-2}, {-67,-1}, {-67,0}, {-67,1}, {-67,2}, {-67,3}, {-67,4}, {-67,5}, {-67,6}, {-67,7}, {-67,8}, {-67,9}, {-67,10}, {-67,11}, {-67,12}, {-67,13}, {-67,14}, {-67,15}, {-67,16}, {-67,17}, {-67,18}, {-67,19}, {-67,20}, {-67,21}, {-67,22}, {-67,23}, {-67,38}, {-67,39}, {-67,40}, {-67,51}, {-67,52}, {-67,53}, {-67,54}, {-67,55}, {-67,56}, {-67,57}, {-67,58}, {-67,59}, {-67,62}, {-67,63}, {-67,64}, {-67,65}, {-67,66}, {-67,107}, {-67,108}, {-67,109}, {-67,110}, {-67,111}, {-67,112}, {-66,-11}, {-66,-10}, {-66,-9}, {-66,-8}, {-66,-7}, {-66,-6}, {-66,-5}, {-66,-4}, {-66,-3}, {-66,-2}, {-66,-1}, {-66,0}, {-66,1}, {-66,2}, {-66,3}, {-66,4}, {-66,5}, {-66,6}, {-66,7}, {-66,8}, {-66,9}, {-66,10}, {-66,11}, {-66,12}, {-66,13}, {-66,14}, {-66,15}, {-66,16}, {-66,17}, {-66,18}, {-66,19}, {-66,20}, {-66,21}, {-66,22}, {-66,23}, {-66,38}, {-66,39}, {-66,40}, {-66,55}, {-66,63}, {-66,106}, {-66,107}, {-66,108}, {-66,109}, {-66,110}, {-66,111}, {-66,112}, {-65,-11}, {-65,-10}, {-65,-9}, {-65,-8}, {-65,-7}, {-65,-6}, {-65,-5}, {-65,-4}, {-65,-3}, {-65,-2}, {-65,-1}, {-65,0}, {-65,1}, {-65,2}, {-65,3}, {-65,4}, {-65,5}, {-65,6}, {-65,7}, {-65,8}, {-65,9}, {-65,10}, {-65,11}, {-65,12}, {-65,13}, {-65,14}, {-65,15}, {-65,16}, {-65,17}, {-65,18}, {-65,19}, {-65,20}, {-65,21}, {-65,22}, {-65,23}, {-65,38}, {-65,39}, {-65,40}, {-64,-75}, {-64,-64}, {-64,-11}, {-64,-10}, {-64,-9}, {-64,-8}, {-64,-7}, {-64,-6}, {-64,-5}, {-64,-4}, {-64,-3}, {-64,-2}, {-64,-1}, {-64,0}, {-64,1}, {-64,2}, {-64,3}, {-64,4}, {-64,5}, {-64,6}, {-64,7}, {-64,8}, {-64,9}, {-64,10}, {-64,11}, {-64,12}, {-64,13}, {-64,14}, {-64,15}, {-64,16}, {-64,17}, {-64,18}, {-64,19}, {-64,20}, {-64,21}, {-64,22}, {-64,23}, {-64,38}, {-64,39}, {-64,40}, {-64,116}, {-64,135}, {-64,136}, {-63,-11}, {-63,-10}, {-63,-9}, {-63,-8}, {-63,-7}, {-63,-6}, {-63,-5}, {-63,-4}, {-63,-3}, {-63,-2}, {-63,-1}, {-63,0}, {-63,1}, {-63,2}, {-63,3}, {-63,4}, {-63,5}, {-63,6}, {-63,7}, {-63,8}, {-63,9}, {-63,10}, {-63,11}, {-63,12}, {-63,13}, {-63,14}, {-63,15}, {-63,16}, {-63,17}, {-63,18}, {-63,19}, {-63,20}, {-63,21}, {-63,22}, {-63,23}, {-63,38}, {-63,39}, {-63,40}, {-62,-60}, {-62,-11}, {-62,-10}, {-62,-9}, {-62,-8}, {-62,-7}, {-62,-6}, {-62,-5}, {-62,-4}, {-62,-3}, {-62,-2}, {-62,-1}, {-62,0}, {-62,1}, {-62,2}, {-62,3}, {-62,4}, {-62,5}, {-62,6}, {-62,7}, {-62,8}, {-62,9}, {-62,10}, {-62,11}, {-62,12}, {-62,13}, {-62,14}, {-62,15}, {-62,16}, {-62,17}, {-62,18}, {-62,19}, {-62,20}, {-62,21}, {-62,22}, {-62,23}, {-62,38}, {-62,39}, {-62,40}, {-61,-60}, {-61,-12}, {-61,-11}, {-61,-10}, {-61,-9}, {-61,-8}, {-61,-7}, {-61,-6}, {-61,-5}, {-61,-4}, {-61,-3}, {-61,-2}, {-61,-1}, {-61,0}, {-61,1}, {-61,2}, {-61,3}, {-61,4}, {-61,5}, {-61,6}, {-61,7}, {-61,8}, {-61,9}, {-61,10}, {-61,11}, {-61,12}, {-61,13}, {-61,14}, {-61,15}, {-61,16}, {-61,17}, {-61,18}, {-61,19}, {-61,20}, {-61,21}, {-61,22}, {-61,23}, {-61,38}, {-61,39}, {-61,40}, {-61,41}, {-61,81}, {-61,82}, {-60,-12}, {-60,-11}, {-60,-10}, {-60,-9}, {-60,-8}, {-60,-7}, {-60,-6}, {-60,-5}, {-60,-4}, {-60,-3}, {-60,-2}, {-60,-1}, {-60,0}, {-60,1}, {-60,2}, {-60,3}, {-60,4}, {-60,5}, {-60,6}, {-60,7}, {-60,8}, {-60,9}, {-60,10}, {-60,11}, {-60,12}, {-60,13}, {-60,14}, {-60,15}, {-60,16}, {-60,17}, {-60,18}, {-60,19}, {-60,20}, {-60,21}, {-60,22}, {-60,23}, {-60,24}, {-60,38}, {-60,39}, {-60,40}, {-60,41}, {-60,81}, {-60,82}, {-60,120}, {-60,121}, {-60,122}, {-60,123}, {-60,124}, {-60,129}, {-60,130}, {-60,131}, {-60,132}, {-60,133}, {-59,-75}, {-59,-64}, {-59,-12}, {-59,-11}, {-59,-10}, {-59,-9}, {-59,-8}, {-59,-7}, {-59,-6}, {-59,-5}, {-59,-4}, {-59,-3}, {-59,-2}, {-59,-1}, {-59,0}, {-59,1}, {-59,2}, {-59,3}, {-59,4}, {-59,5}, {-59,6}, {-59,7}, {-59,8}, {-59,9}, {-59,10}, {-59,11}, {-59,12}, {-59,13}, {-59,14}, {-59,15}, {-59,16}, {-59,17}, {-59,18}, {-59,19}, {-59,20}, {-59,21}, {-59,22}, {-59,23}, {-59,38}, {-59,39}, {-59,40}, {-59,41}, {-59,80}, {-59,81}, {-59,82}, {-59,120}, {-59,121}, {-59,122}, {-59,123}, {-59,124}, {-59,129}, {-59,130}, {-59,131}, {-59,132}, {-59,133}, {-58,-11}, {-58,-10}, {-58,-9}, {-58,-8}, {-58,-7}, {-58,-6}, {-58,-5}, {-58,-4}, {-58,-3}, {-58,-2}, {-58,-1}, {-58,0}, {-58,1}, {-58,2}, {-58,3}, {-58,4}, {-58,5}, {-58,6}, {-58,7}, {-58,8}, {-58,9}, {-58,10}, {-58,11}, {-58,12}, {-58,13}, {-58,14}, {-58,15}, {-58,16}, {-58,17}, {-58,18}, {-58,19}, {-58,20}, {-58,21}, {-58,22}, {-58,23}, {-58,38}, {-58,39}, {-58,40}, {-58,41}, {-58,80}, {-58,81}, {-58,82}, {-58,120}, {-58,121}, {-58,122}, {-58,123}, {-58,124}, {-58,129}, {-58,130}, {-58,131}, {-58,132}, {-58,133}, {-58,134}, {-57,-11}, {-57,-10}, {-57,-9}, {-57,-8}, {-57,-7}, {-57,-6}, {-57,-5}, {-57,-4}, {-57,-3}, {-57,-2}, {-57,-1}, {-57,0}, {-57,1}, {-57,2}, {-57,3}, {-57,4}, {-57,5}, {-57,6}, {-57,7}, {-57,8}, {-57,9}, {-57,10}, {-57,11}, {-57,12}, {-57,13}, {-57,14}, {-57,15}, {-57,16}, {-57,17}, {-57,18}, {-57,19}, {-57,20}, {-57,21}, {-57,22}, {-57,23}, {-57,38}, {-57,39}, {-57,40}, {-57,41}, {-57,80}, {-57,81}, {-57,82}, {-57,83}, {-57,120}, {-57,121}, {-57,122}, {-57,123}, {-57,124}, {-57,129}, {-57,130}, {-57,131}, {-57,132}, {-57,133}, {-56,-75}, {-56,-72}, {-56,-67}, {-56,-64}, {-56,-11}, {-56,-10}, {-56,-9}, {-56,-8}, {-56,-7}, {-56,-6}, {-56,-5}, {-56,-4}, {-56,-3}, {-56,-2}, {-56,-1}, {-56,0}, {-56,1}, {-56,2}, {-56,3}, {-56,4}, {-56,5}, {-56,6}, {-56,7}, {-56,8}, {-56,9}, {-56,10}, {-56,11}, {-56,12}, {-56,13}, {-56,14}, {-56,15}, {-56,16}, {-56,17}, {-56,18}, {-56,19}, {-56,20}, {-56,21}, {-56,22}, {-56,23}, {-56,38}, {-56,39}, {-56,40}, {-56,41}, {-56,80}, {-56,81}, {-56,82}, {-56,120}, {-56,121}, {-56,122}, {-56,123}, {-56,124}, {-56,125}, {-56,129}, {-56,130}, {-56,131}, {-56,132}, {-56,133}, {-55,-11}, {-55,-10}, {-55,-9}, {-55,-8}, {-55,-7}, {-55,-6}, {-55,-5}, {-55,-4}, {-55,-3}, {-55,-2}, {-55,-1}, {-55,0}, {-55,1}, {-55,2}, {-55,3}, {-55,4}, {-55,5}, {-55,6}, {-55,7}, {-55,8}, {-55,9}, {-55,10}, {-55,11}, {-55,12}, {-55,13}, {-55,14}, {-55,15}, {-55,16}, {-55,17}, {-55,18}, {-55,19}, {-55,20}, {-55,21}, {-55,22}, {-55,23}, {-55,38}, {-55,39}, {-55,40}, {-55,41}, {-55,80}, {-55,81}, {-55,82}, {-55,120}, {-55,121}, {-55,122}, {-55,123}, {-55,124}, {-55,130}, {-54,-11}, {-54,-10}, {-54,-9}, {-54,-8}, {-54,-7}, {-54,-6}, {-54,-5}, {-54,-4}, {-54,-3}, {-54,-2}, {-54,-1}, {-54,0}, {-54,1}, {-54,2}, {-54,3}, {-54,4}, {-54,5}, {-54,6}, {-54,7}, {-54,8}, {-54,9}, {-54,10}, {-54,11}, {-54,12}, {-54,13}, {-54,14}, {-54,15}, {-54,16}, {-54,17}, {-54,18}, {-54,19}, {-54,20}, {-54,21}, {-54,22}, {-54,23}, {-54,38}, {-54,39}, {-54,40}, {-54,41}, {-54,81}, {-54,82}, {-54,120}, {-54,121}, {-54,122}, {-54,123}, {-54,124}, {-53,-11}, {-53,-10}, {-53,-9}, {-53,-8}, {-53,-7}, {-53,-6}, {-53,-5}, {-53,-4}, {-53,-3}, {-53,-2}, {-53,-1}, {-53,0}, {-53,1}, {-53,2}, {-53,3}, {-53,4}, {-53,5}, {-53,6}, {-53,7}, {-53,8}, {-53,9}, {-53,10}, {-53,11}, {-53,12}, {-53,13}, {-53,14}, {-53,15}, {-53,16}, {-53,17}, {-53,18}, {-53,19}, {-53,20}, {-53,21}, {-53,22}, {-53,23}, {-53,38}, {-53,39}, {-53,40}, {-53,41}, {-53,75}, {-53,81}, {-53,82}, {-53,121}, {-52,-70}, {-52,-69}, {-52,-11}, {-52,-10}, {-52,-9}, {-52,-8}, {-52,-7}, {-52,-6}, {-52,-5}, {-52,-4}, {-52,-3}, {-52,-2}, {-52,-1}, {-52,0}, {-52,1}, {-52,2}, {-52,3}, {-52,4}, {-52,5}, {-52,6}, {-52,7}, {-52,8}, {-52,9}, {-52,10}, {-52,11}, {-52,12}, {-52,13}, {-52,14}, {-52,15}, {-52,16}, {-52,17}, {-52,18}, {-52,19}, {-52,20}, {-52,21}, {-52,22}, {-52,23}, {-52,38}, {-52,39}, {-52,40}, {-52,41}, {-52,129}, {-52,130}, {-52,131}, {-52,132}, {-52,133}, {-51,-12}, {-51,-11}, {-51,-10}, {-51,-9}, {-51,-8}, {-51,-7}, {-51,-6}, {-51,-5}, {-51,-4}, {-51,-3}, {-51,-2}, {-51,-1}, {-51,0}, {-51,1}, {-51,2}, {-51,3}, {-51,4}, {-51,5}, {-51,6}, {-51,7}, {-51,8}, {-51,9}, {-51,10}, {-51,11}, {-51,12}, {-51,13}, {-51,14}, {-51,15}, {-51,16}, {-51,17}, {-51,18}, {-51,19}, {-51,20}, {-51,21}, {-51,22}, {-51,23}, {-51,38}, {-51,39}, {-51,40}, {-51,41}, {-51,94}, {-51,95}, {-51,96}, {-51,97}, {-51,100}, {-51,101}, {-51,102}, {-51,103}, {-51,104}, {-51,105}, {-51,106}, {-51,107}, {-51,108}, {-51,109}, {-51,110}, {-51,111}, {-51,112}, {-51,129}, {-51,130}, {-51,131}, {-51,132}, {-51,133}, {-50,-12}, {-50,-11}, {-50,-10}, {-50,-9}, {-50,-8}, {-50,-7}, {-50,-6}, {-50,-5}, {-50,-4}, {-50,-3}, {-50,-2}, {-50,-1}, {-50,0}, {-50,1}, {-50,2}, {-50,3}, {-50,4}, {-50,5}, {-50,6}, {-50,7}, {-50,8}, {-50,9}, {-50,10}, {-50,11}, {-50,12}, {-50,13}, {-50,14}, {-50,15}, {-50,16}, {-50,17}, {-50,18}, {-50,19}, {-50,20}, {-50,21}, {-50,22}, {-50,23}, {-50,24}, {-50,38}, {-50,39}, {-50,40}, {-50,41}, {-50,94}, {-50,95}, {-50,96}, {-50,97}, {-50,100}, {-50,101}, {-50,102}, {-50,103}, {-50,104}, {-50,105}, {-50,106}, {-50,107}, {-50,108}, {-50,109}, {-50,110}, {-50,111}, {-50,112}, {-50,129}, {-50,130}, {-50,131}, {-50,132}, {-50,133}, {-50,134}, {-49,-12}, {-49,-11}, {-49,-10}, {-49,-9}, {-49,-8}, {-49,-7}, {-49,-6}, {-49,-5}, {-49,-4}, {-49,-3}, {-49,-2}, {-49,-1}, {-49,0}, {-49,1}, {-49,2}, {-49,3}, {-49,4}, {-49,5}, {-49,6}, {-49,7}, {-49,8}, {-49,9}, {-49,10}, {-49,11}, {-49,12}, {-49,13}, {-49,14}, {-49,15}, {-49,16}, {-49,17}, {-49,18}, {-49,19}, {-49,20}, {-49,21}, {-49,22}, {-49,23}, {-49,38}, {-49,39}, {-49,40}, {-49,41}, {-49,94}, {-49,95}, {-49,96}, {-49,97}, {-49,98}, {-49,99}, {-49,100}, {-49,101}, {-49,102}, {-49,103}, {-49,104}, {-49,105}, {-49,106}, {-49,107}, {-49,108}, {-49,109}, {-49,110}, {-49,111}, {-49,112}, {-49,120}, {-49,121}, {-49,122}, {-49,123}, {-49,124}, {-49,129}, {-49,130}, {-49,131}, {-49,132}, {-49,133}, {-48,-11}, {-48,-10}, {-48,-9}, {-48,-8}, {-48,-7}, {-48,-6}, {-48,-5}, {-48,-4}, {-48,-3}, {-48,-2}, {-48,-1}, {-48,0}, {-48,1}, {-48,2}, {-48,3}, {-48,4}, {-48,5}, {-48,6}, {-48,7}, {-48,8}, {-48,9}, {-48,10}, {-48,11}, {-48,12}, {-48,13}, {-48,14}, {-48,15}, {-48,16}, {-48,17}, {-48,18}, {-48,19}, {-48,20}, {-48,21}, {-48,22}, {-48,23}, {-48,38}, {-48,39}, {-48,40}, {-48,41}, {-48,94}, {-48,95}, {-48,96}, {-48,97}, {-48,100}, {-48,101}, {-48,102}, {-48,103}, {-48,104}, {-48,105}, {-48,106}, {-48,107}, {-48,108}, {-48,109}, {-48,110}, {-48,111}, {-48,112}, {-48,120}, {-48,121}, {-48,122}, {-48,123}, {-48,124}, {-48,129}, {-48,130}, {-48,131}, {-48,132}, {-48,133}, {-47,-64}, {-47,-63}, {-47,-62}, {-47,-11}, {-47,-10}, {-47,-9}, {-47,-8}, {-47,-7}, {-47,-6}, {-47,-5}, {-47,-4}, {-47,-3}, {-47,-2}, {-47,-1}, {-47,0}, {-47,1}, {-47,2}, {-47,3}, {-47,4}, {-47,5}, {-47,6}, {-47,7}, {-47,8}, {-47,9}, {-47,10}, {-47,11}, {-47,12}, {-47,13}, {-47,14}, {-47,15}, {-47,16}, {-47,17}, {-47,18}, {-47,19}, {-47,20}, {-47,21}, {-47,22}, {-47,23}, {-47,38}, {-47,39}, {-47,40}, {-47,41}, {-47,70}, {-47,71}, {-47,72}, {-47,94}, {-47,95}, {-47,96}, {-47,97}, {-47,100}, {-47,101}, {-47,102}, {-47,103}, {-47,104}, {-47,105}, {-47,106}, {-47,107}, {-47,108}, {-47,109}, {-47,110}, {-47,111}, {-47,112}, {-47,120}, {-47,121}, {-47,122}, {-47,123}, {-47,124}, {-47,130}, {-46,-64}, {-46,-63}, {-46,-62}, {-46,-11}, {-46,-10}, {-46,-9}, {-46,-8}, {-46,-7}, {-46,-6}, {-46,-5}, {-46,-4}, {-46,-3}, {-46,-2}, {-46,-1}, {-46,0}, {-46,1}, {-46,2}, {-46,3}, {-46,4}, {-46,5}, {-46,6}, {-46,7}, {-46,8}, {-46,9}, {-46,10}, {-46,11}, {-46,12}, {-46,13}, {-46,14}, {-46,15}, {-46,16}, {-46,17}, {-46,18}, {-46,19}, {-46,20}, {-46,21}, {-46,22}, {-46,23}, {-46,38}, {-46,39}, {-46,40}, {-46,41}, {-46,69}, {-46,70}, {-46,71}, {-46,72}, {-46,73}, {-46,94}, {-46,95}, {-46,96}, {-46,97}, {-46,100}, {-46,101}, {-46,102}, {-46,103}, {-46,104}, {-46,105}, {-46,106}, {-46,107}, {-46,108}, {-46,109}, {-46,110}, {-46,111}, {-46,112}, {-46,120}, {-46,121}, {-46,122}, {-46,123}, {-46,124}, {-45,-11}, {-45,-10}, {-45,-9}, {-45,-8}, {-45,-7}, {-45,-6}, {-45,-5}, {-45,-4}, {-45,-3}, {-45,-2}, {-45,-1}, {-45,0}, {-45,1}, {-45,2}, {-45,3}, {-45,4}, {-45,5}, {-45,6}, {-45,7}, {-45,8}, {-45,9}, {-45,10}, {-45,11}, {-45,12}, {-45,13}, {-45,14}, {-45,15}, {-45,16}, {-45,17}, {-45,18}, {-45,19}, {-45,20}, {-45,21}, {-45,22}, {-45,23}, {-45,38}, {-45,39}, {-45,40}, {-45,41}, {-45,69}, {-45,70}, {-45,71}, {-45,72}, {-45,73}, {-45,94}, {-45,95}, {-45,96}, {-45,97}, {-45,100}, {-45,101}, {-45,102}, {-45,103}, {-45,104}, {-45,105}, {-45,106}, {-45,107}, {-45,108}, {-45,109}, {-45,110}, {-45,111}, {-45,112}, {-45,113}, {-45,119}, {-45,120}, {-45,121}, {-45,122}, {-45,123}, {-45,124}, {-45,125}, {-44,-11}, {-44,-10}, {-44,-9}, {-44,-8}, {-44,-7}, {-44,-6}, {-44,-5}, {-44,-4}, {-44,-3}, {-44,-2}, {-44,-1}, {-44,0}, {-44,1}, {-44,2}, {-44,3}, {-44,4}, {-44,5}, {-44,6}, {-44,7}, {-44,8}, {-44,9}, {-44,10}, {-44,11}, {-44,12}, {-44,13}, {-44,14}, {-44,15}, {-44,16}, {-44,17}, {-44,18}, {-44,19}, {-44,20}, {-44,21}, {-44,22}, {-44,23}, {-44,38}, {-44,39}, {-44,40}, {-44,41}, {-44,69}, {-44,70}, {-44,71}, {-44,72}, {-44,73}, {-44,94}, {-44,95}, {-44,96}, {-44,97}, {-44,100}, {-44,101}, {-44,102}, {-44,103}, {-44,104}, {-44,105}, {-44,106}, {-44,107}, {-44,108}, {-44,109}, {-44,110}, {-44,111}, {-44,112}, {-44,120}, {-44,121}, {-44,122}, {-44,123}, {-44,124}, {-44,129}, {-44,130}, {-44,131}, {-44,132}, {-44,133}, {-43,-11}, {-43,-10}, {-43,-9}, {-43,-8}, {-43,-7}, {-43,-6}, {-43,-5}, {-43,-4}, {-43,-3}, {-43,-2}, {-43,-1}, {-43,0}, {-43,1}, {-43,2}, {-43,3}, {-43,4}, {-43,5}, {-43,6}, {-43,7}, {-43,8}, {-43,9}, {-43,10}, {-43,11}, {-43,12}, {-43,13}, {-43,14}, {-43,15}, {-43,16}, {-43,17}, {-43,18}, {-43,19}, {-43,20}, {-43,21}, {-43,22}, {-43,23}, {-43,38}, {-43,39}, {-43,40}, {-43,41}, {-43,70}, {-43,71}, {-43,72}, {-43,94}, {-43,95}, {-43,96}, {-43,97}, {-43,100}, {-43,101}, {-43,102}, {-43,103}, {-43,104}, {-43,105}, {-43,106}, {-43,107}, {-43,108}, {-43,109}, {-43,110}, {-43,111}, {-43,112}, {-43,120}, {-43,121}, {-43,122}, {-43,123}, {-43,124}, {-43,129}, {-43,130}, {-43,131}, {-43,132}, {-43,133}, {-42,-11}, {-42,-10}, {-42,-9}, {-42,-8}, {-42,-7}, {-42,-6}, {-42,-5}, {-42,-4}, {-42,-3}, {-42,-2}, {-42,-1}, {-42,0}, {-42,1}, {-42,2}, {-42,3}, {-42,4}, {-42,5}, {-42,6}, {-42,7}, {-42,8}, {-42,9}, {-42,10}, {-42,11}, {-42,12}, {-42,13}, {-42,14}, {-42,15}, {-42,16}, {-42,17}, {-42,18}, {-42,19}, {-42,20}, {-42,21}, {-42,22}, {-42,23}, {-42,38}, {-42,39}, {-42,40}, {-42,41}, {-42,94}, {-42,95}, {-42,96}, {-42,97}, {-42,100}, {-42,101}, {-42,102}, {-42,103}, {-42,104}, {-42,105}, {-42,106}, {-42,107}, {-42,108}, {-42,109}, {-42,110}, {-42,111}, {-42,112}, {-42,121}, {-42,129}, {-42,130}, {-42,131}, {-42,132}, {-42,133}, {-42,134}, {-41,-11}, {-41,-10}, {-41,-9}, {-41,-8}, {-41,-7}, {-41,-6}, {-41,-5}, {-41,-4}, {-41,-3}, {-41,-2}, {-41,-1}, {-41,0}, {-41,1}, {-41,2}, {-41,3}, {-41,4}, {-41,5}, {-41,6}, {-41,7}, {-41,8}, {-41,9}, {-41,10}, {-41,11}, {-41,12}, {-41,13}, {-41,14}, {-41,15}, {-41,16}, {-41,17}, {-41,18}, {-41,19}, {-41,20}, {-41,21}, {-41,22}, {-41,23}, {-41,38}, {-41,39}, {-41,40}, {-41,41}, {-41,94}, {-41,95}, {-41,96}, {-41,97}, {-41,98}, {-41,99}, {-41,100}, {-41,101}, {-41,102}, {-41,103}, {-41,104}, {-41,105}, {-41,106}, {-41,107}, {-41,108}, {-41,109}, {-41,110}, {-41,111}, {-41,112}, {-41,129}, {-41,130}, {-41,131}, {-41,132}, {-41,133}, {-40,-61}, {-40,-11}, {-40,-10}, {-40,-9}, {-40,-8}, {-40,-7}, {-40,-6}, {-40,-5}, {-40,-4}, {-40,-3}, {-40,-2}, {-40,-1}, {-40,0}, {-40,1}, {-40,2}, {-40,3}, {-40,4}, {-40,5}, {-40,6}, {-40,7}, {-40,8}, {-40,9}, {-40,10}, {-40,11}, {-40,12}, {-40,13}, {-40,14}, {-40,15}, {-40,16}, {-40,17}, {-40,18}, {-40,19}, {-40,20}, {-40,21}, {-40,22}, {-40,23}, {-40,38}, {-40,39}, {-40,40}, {-40,41}, {-40,94}, {-40,95}, {-40,96}, {-40,97}, {-40,100}, {-40,101}, {-40,102}, {-40,103}, {-40,104}, {-40,105}, {-40,106}, {-40,107}, {-40,108}, {-40,109}, {-40,110}, {-40,111}, {-40,112}, {-40,129}, {-40,130}, {-40,131}, {-40,132}, {-40,133}, {-39,-11}, {-39,-10}, {-39,-9}, {-39,-8}, {-39,-7}, {-39,-6}, {-39,-5}, {-39,-4}, {-39,-3}, {-39,-2}, {-39,-1}, {-39,0}, {-39,1}, {-39,2}, {-39,3}, {-39,4}, {-39,5}, {-39,6}, {-39,7}, {-39,8}, {-39,9}, {-39,10}, {-39,11}, {-39,12}, {-39,13}, {-39,14}, {-39,15}, {-39,16}, {-39,17}, {-39,18}, {-39,19}, {-39,20}, {-39,21}, {-39,22}, {-39,23}, {-39,38}, {-39,39}, {-39,40}, {-39,94}, {-39,95}, {-39,96}, {-39,97}, {-39,100}, {-39,101}, {-39,102}, {-39,103}, {-39,104}, {-39,105}, {-39,106}, {-39,107}, {-39,108}, {-39,109}, {-39,110}, {-39,111}, {-39,112}, {-39,130}, {-38,-11}, {-38,-10}, {-38,-9}, {-38,-8}, {-38,-7}, {-38,-6}, {-38,-5}, {-38,-4}, {-38,-3}, {-38,-2}, {-38,-1}, {-38,0}, {-38,1}, {-38,2}, {-38,3}, {-38,4}, {-38,5}, {-38,6}, {-38,7}, {-38,8}, {-38,9}, {-38,10}, {-38,11}, {-38,12}, {-38,13}, {-38,14}, {-38,15}, {-38,16}, {-38,17}, {-38,18}, {-38,19}, {-38,20}, {-38,21}, {-38,22}, {-38,23}, {-38,38}, {-38,39}, {-38,40}, {-38,41}, {-38,42}, {-38,43}, {-38,44}, {-38,45}, {-38,120}, {-38,121}, {-38,122}, {-38,123}, {-38,124}, {-37,5}, {-37,6}, {-37,7}, {-37,8}, {-37,9}, {-37,10}, {-37,11}, {-37,12}, {-37,13}, {-37,14}, {-37,15}, {-37,16}, {-37,17}, {-37,18}, {-37,19}, {-37,20}, {-37,21}, {-37,22}, {-37,23}, {-37,38}, {-37,39}, {-37,40}, {-37,41}, {-37,42}, {-37,43}, {-37,44}, {-37,45}, {-37,120}, {-37,121}, {-37,122}, {-37,123}, {-37,124}, {-36,-22}, {-36,-16}, {-36,10}, {-36,11}, {-36,12}, {-36,13}, {-36,14}, {-36,15}, {-36,16}, {-36,17}, {-36,18}, {-36,19}, {-36,20}, {-36,21}, {-36,22}, {-36,23}, {-36,38}, {-36,39}, {-36,40}, {-36,81}, {-36,82}, {-36,120}, {-36,121}, {-36,122}, {-36,123}, {-36,124}, {-36,125}, {-36,129}, {-36,130}, {-36,131}, {-36,132}, {-36,133}, {-35,38}, {-35,39}, {-35,40}, {-35,78}, {-35,79}, {-35,80}, {-35,81}, {-35,82}, {-35,83}, {-35,84}, {-35,85}, {-35,120}, {-35,121}, {-35,122}, {-35,123}, {-35,124}, {-35,129}, {-35,130}, {-35,131}, {-35,132}, {-35,133}, {-34,38}, {-34,39}, {-34,40}, {-34,78}, {-34,79}, {-34,80}, {-34,81}, {-34,82}, {-34,83}, {-34,84}, {-34,85}, {-34,86}, {-34,120}, {-34,121}, {-34,122}, {-34,123}, {-34,124}, {-34,129}, {-34,130}, {-34,131}, {-34,132}, {-34,133}, {-34,134}, {-33,-61}, {-33,25}, {-33,38}, {-33,39}, {-33,40}, {-33,78}, {-33,79}, {-33,80}, {-33,81}, {-33,82}, {-33,83}, {-33,84}, {-33,85}, {-33,121}, {-33,129}, {-33,130}, {-33,131}, {-33,132}, {-33,133}, {-32,38}, {-32,39}, {-32,40}, {-32,78}, {-32,79}, {-32,80}, {-32,81}, {-32,82}, {-32,83}, {-32,84}, {-32,85}, {-32,129}, {-32,130}, {-32,131}, {-32,132}, {-32,133}, {-31,38}, {-31,39}, {-31,40}, {-31,78}, {-31,79}, {-31,80}, {-31,81}, {-31,82}, {-31,83}, {-31,84}, {-31,85}, {-31,130}, {-30,38}, {-30,39}, {-30,40}, {-30,78}, {-30,79}, {-30,80}, {-30,81}, {-30,82}, {-30,83}, {-30,84}, {-30,85}, {-30,116}, {-29,38}, {-29,39}, {-29,40}, {-29,78}, {-29,79}, {-29,80}, {-29,81}, {-29,82}, {-29,83}, {-29,84}, {-29,85}, {-28,38}, {-28,39}, {-28,40}, {-28,78}, {-28,79}, {-28,80}, {-28,81}, {-28,82}, {-28,83}, {-28,84}, {-28,85}, {-28,119}, {-27,-61}, {-27,25}, {-27,38}, {-27,39}, {-27,40}, {-27,81}, {-27,82}, {-27,119}, {-26,38}, {-26,39}, {-26,40}, {-25,38}, {-25,39}, {-25,40}, {-25,120}, {-25,121}, {-25,122}, {-25,123}, {-25,124}, {-25,129}, {-25,130}, {-25,131}, {-25,132}, {-25,133}, {-24,38}, {-24,39}, {-24,40}, {-24,120}, {-24,121}, {-24,122}, {-24,123}, {-24,124}, {-24,129}, {-24,130}, {-24,131}, {-24,132}, {-24,133}, {-23,38}, {-23,39}, {-23,40}, {-23,120}, {-23,121}, {-23,122}, {-23,123}, {-23,124}, {-23,125}, {-23,129}, {-23,130}, {-23,131}, {-23,132}, {-23,133}, {-23,134}, {-22,38}, {-22,39}, {-22,40}, {-22,120}, {-22,121}, {-22,122}, {-22,123}, {-22,124}, {-22,129}, {-22,130}, {-22,131}, {-22,132}, {-22,133}, {-21,120}, {-21,121}, {-21,122}, {-21,123}, {-21,124}, {-21,129}, {-21,130}, {-21,131}, {-21,132}, {-21,133}, {-20,65}, {-20,120}, {-20,129}, {-19,62}, {-19,63}, {-19,64}, {-19,65}, {-19,66}, {-19,67}, {-18,61}, {-18,62}, {-18,63}, {-18,64}, {-18,65}, {-18,66}, {-18,67}, {-17,62}, {-17,63}, {-17,64}, {-17,65}, {-17,66}, {-17,67}, {-16,62}, {-16,63}, {-16,64}, {-16,65}, {-16,66}, {-16,67}, {-16,120}, {-16,121}, {-16,122}, {-16,123}, {-16,124}, {-16,129}, {-16,130}, {-16,131}, {-16,132}, {-16,133}, {-15,32}, {-15,34}, {-15,35}, {-15,39}, {-15,63}, {-15,66}, {-15,120}, {-15,121}, {-15,122}, {-15,123}, {-15,124}, {-15,129}, {-15,130}, {-15,131}, {-15,132}, {-15,133}, {-14,32}, {-14,33}, {-14,34}, {-14,35}, {-14,36}, {-14,37}, {-14,38}, {-14,39}, {-14,40}, {-14,43}, {-14,44}, {-14,45}, {-14,46}, {-14,47}, {-14,48}, {-14,49}, {-14,50}, {-14,51}, {-14,52}, {-14,53}, {-14,54}, {-14,57}, {-14,58}, {-14,59}, {-14,60}, {-14,61}, {-14,62}, {-14,63}, {-14,64}, {-14,65}, {-14,66}, {-14,67}, {-14,120}, {-14,121}, {-14,122}, {-14,123}, {-14,124}, {-14,125}, {-14,129}, {-14,130}, {-14,131}, {-14,132}, {-14,133}, {-14,134}, {-13,32}, {-13,34}, {-13,35}, {-13,36}, {-13,37}, {-13,38}, {-13,39}, {-13,40}, {-13,43}, {-13,44}, {-13,45}, {-13,46}, {-13,47}, {-13,48}, {-13,49}, {-13,50}, {-13,51}, {-13,52}, {-13,53}, {-13,54}, {-13,57}, {-13,58}, {-13,59}, {-13,60}, {-13,61}, {-13,62}, {-13,63}, {-13,64}, {-13,65}, {-13,66}, {-13,67}, {-13,120}, {-13,121}, {-13,122}, {-13,123}, {-13,124}, {-13,129}, {-13,130}, {-13,131}, {-13,132}, {-13,133}, {-12,32}, {-12,34}, {-12,35}, {-12,36}, {-12,39}, {-12,40}, {-12,43}, {-12,44}, {-12,47}, {-12,48}, {-12,49}, {-12,50}, {-12,53}, {-12,54}, {-12,57}, {-12,58}, {-12,61}, {-12,62}, {-12,63}, {-12,64}, {-12,65}, {-12,66}, {-12,67}, {-12,120}, {-12,121}, {-12,122}, {-12,123}, {-12,124}, {-12,129}, {-12,130}, {-12,131}, {-12,132}, {-12,133}, {-11,34}, {-11,35}, {-11,36}, {-11,39}, {-11,40}, {-11,43}, {-11,44}, {-11,47}, {-11,48}, {-11,49}, {-11,50}, {-11,53}, {-11,54}, {-11,57}, {-11,58}, {-11,61}, {-11,62}, {-11,63}, {-11,64}, {-11,65}, {-11,66}, {-11,67}, {-10,33}, {-10,34}, {-10,35}, {-10,36}, {-10,37}, {-10,38}, {-10,39}, {-10,40}, {-10,43}, {-10,44}, {-10,45}, {-10,46}, {-10,47}, {-10,48}, {-10,49}, {-10,50}, {-10,51}, {-10,52}, {-10,53}, {-10,54}, {-10,57}, {-10,58}, {-10,59}, {-10,60}, {-10,61}, {-10,62}, {-10,63}, {-10,64}, {-10,65}, {-10,66}, {-10,67}, {-10,69}, {-10,70}, {-9,33}, {-9,34}, {-9,35}, {-9,36}, {-9,37}, {-9,38}, {-9,39}, {-9,40}, {-9,41}, {-9,43}, {-9,44}, {-9,45}, {-9,46}, {-9,47}, {-9,48}, {-9,49}, {-9,50}, {-9,51}, {-9,52}, {-9,53}, {-9,54}, {-9,55}, {-9,57}, {-9,58}, {-9,59}, {-9,60}, {-9,61}, {-9,62}, {-9,63}, {-9,64}, {-9,65}, {-9,66}, {-9,67}, {-9,69}, {-9,70}, {-8,33}, {-8,34}, {-8,35}, {-8,36}, {-8,37}, {-8,38}, {-8,39}, {-8,40}, {-8,41}, {-8,43}, {-8,44}, {-8,45}, {-8,46}, {-8,47}, {-8,48}, {-8,49}, {-8,50}, {-8,51}, {-8,52}, {-8,53}, {-8,54}, {-8,55}, {-8,57}, {-8,58}, {-8,59}, {-8,60}, {-8,61}, {-8,62}, {-8,63}, {-8,64}, {-8,65}, {-8,66}, {-8,67}, {-8,69}, {-8,70}, {-8,120}, {-8,121}, {-8,122}, {-8,123}, {-8,124}, {-8,129}, {-8,130}, {-8,131}, {-8,132}, {-8,133}, {-7,33}, {-7,34}, {-7,35}, {-7,36}, {-7,37}, {-7,38}, {-7,39}, {-7,40}, {-7,43}, {-7,44}, {-7,45}, {-7,46}, {-7,47}, {-7,48}, {-7,49}, {-7,50}, {-7,51}, {-7,52}, {-7,53}, {-7,54}, {-7,57}, {-7,58}, {-7,59}, {-7,60}, {-7,61}, {-7,62}, {-7,63}, {-7,64}, {-7,65}, {-7,66}, {-7,67}, {-7,69}, {-7,70}, {-7,120}, {-7,121}, {-7,122}, {-7,123}, {-7,124}, {-7,125}, {-7,129}, {-7,130}, {-7,131}, {-7,132}, {-7,133}, {-6,34}, {-6,35}, {-6,36}, {-6,39}, {-6,40}, {-6,43}, {-6,44}, {-6,47}, {-6,48}, {-6,49}, {-6,50}, {-6,53}, {-6,54}, {-6,57}, {-6,58}, {-6,61}, {-6,62}, {-6,63}, {-6,64}, {-6,65}, {-6,66}, {-6,67}, {-6,120}, {-6,121}, {-6,122}, {-6,123}, {-6,124}, {-6,129}, {-6,130}, {-6,131}, {-6,132}, {-6,133}, {-5,32}, {-5,34}, {-5,35}, {-5,36}, {-5,39}, {-5,40}, {-5,43}, {-5,44}, {-5,47}, {-5,48}, {-5,49}, {-5,50}, {-5,53}, {-5,54}, {-5,57}, {-5,58}, {-5,61}, {-5,62}, {-5,63}, {-5,64}, {-5,65}, {-5,66}, {-5,67}, {-5,120}, {-5,121}, {-5,122}, {-5,123}, {-5,124}, {-5,129}, {-5,130}, {-5,131}, {-5,132}, {-5,133}, {-4,32}, {-4,34}, {-4,35}, {-4,36}, {-4,37}, {-4,38}, {-4,39}, {-4,40}, {-4,43}, {-4,44}, {-4,45}, {-4,46}, {-4,47}, {-4,48}, {-4,49}, {-4,50}, {-4,51}, {-4,52}, {-4,53}, {-4,54}, {-4,57}, {-4,58}, {-4,59}, {-4,60}, {-4,61}, {-4,62}, {-4,63}, {-4,64}, {-4,65}, {-4,66}, {-4,67}, {-4,72}, {-4,73}, {-4,74}, {-4,75}, {-4,76}, {-4,120}, {-4,121}, {-4,122}, {-4,123}, {-4,124}, {-4,129}, {-4,130}, {-4,131}, {-4,132}, {-4,133}, {-3,32}, {-3,33}, {-3,34}, {-3,35}, {-3,36}, {-3,37}, {-3,38}, {-3,39}, {-3,40}, {-3,43}, {-3,44}, {-3,45}, {-3,46}, {-3,47}, {-3,48}, {-3,49}, {-3,50}, {-3,51}, {-3,52}, {-3,53}, {-3,54}, {-3,57}, {-3,58}, {-3,59}, {-3,60}, {-3,61}, {-3,62}, {-3,63}, {-3,64}, {-3,65}, {-3,66}, {-3,67}, {-3,71}, {-3,72}, {-3,73}, {-3,74}, {-3,75}, {-3,76}, {-3,130}, {-2,32}, {-2,34}, {-2,35}, {-2,63}, {-2,66}, {-2,72}, {-2,73}, {-2,74}, {-2,75}, {-2,76}, {-1,62}, {-1,63}, {-1,64}, {-1,65}, {-1,66}, {-1,67}, {-1,74}, {0,62}, {0,63}, {0,64}, {0,65}, {0,66}, {0,67}, {0,72}, {0,73}, {0,74}, {0,75}, {0,76}, {1,62}, {1,63}, {1,64}, {1,65}, {1,66}, {1,67}, {1,72}, {1,73}, {1,74}, {1,75}, {1,76}, {2,62}, {2,63}, {2,64}, {2,65}, {2,66}, {2,67}, {2,72}, {2,73}, {2,74}, {2,75}, {2,76}, {4,-61}, {8,113}, {8,121}, {8,129}, {9,111}, {9,112}, {9,113}, {9,114}, {9,115}, {9,119}, {9,120}, {9,121}, {9,122}, {9,123}, {9,127}, {9,128}, {9,129}, {9,130}, {9,131}, {10,111}, {10,112}, {10,113}, {10,114}, {10,115}, {10,119}, {10,120}, {10,121}, {10,122}, {10,123}, {10,127}, {10,128}, {10,129}, {10,130}, {10,131}, {11,-51}, {11,-42}, {11,73}, {11,89}, {11,95}, {11,111}, {11,112}, {11,113}, {11,114}, {11,115}, {11,119}, {11,120}, {11,121}, {11,122}, {11,123}, {11,127}, {11,128}, {11,129}, {11,130}, {11,131}, {12,72}, {12,73}, {12,74}, {12,86}, {12,87}, {12,88}, {12,89}, {12,90}, {12,92}, {12,93}, {12,94}, {12,95}, {12,96}, {12,97}, {12,98}, {12,99}, {12,100}, {12,111}, {12,112}, {12,113}, {12,114}, {12,115}, {12,116}, {12,119}, {12,120}, {12,121}, {12,122}, {12,123}, {12,124}, {12,127}, {12,128}, {12,129}, {12,130}, {12,131}, {12,132}, {13,72}, {13,73}, {13,74}, {13,86}, {13,87}, {13,88}, {13,89}, {13,90}, {13,92}, {13,93}, {13,94}, {13,95}, {13,96}, {13,97}, {13,98}, {13,99}, {13,100}, {13,111}, {13,112}, {13,113}, {13,114}, {13,115}, {13,119}, {13,120}, {13,121}, {13,122}, {13,123}, {13,127}, {13,128}, {13,129}, {13,130}, {13,131}, {14,72}, {14,73}, {14,74}, {14,86}, {14,87}, {14,88}, {14,89}, {14,90}, {14,92}, {14,93}, {14,94}, {14,95}, {14,96}, {14,97}, {14,98}, {14,99}, {14,100}, {14,101}, {15,-51}, {15,-23}, {15,-15}, {15,-14}, {15,-1}, {15,56}, {15,57}, {15,58}, {15,59}, {15,60}, {15,61}, {15,62}, {15,72}, {15,73}, {15,74}, {15,86}, {15,87}, {15,88}, {15,89}, {15,90}, {15,92}, {15,93}, {15,94}, {15,95}, {15,96}, {15,97}, {15,98}, {15,99}, {15,100}, {16,56}, {16,62}, {16,63}, {16,72}, {16,73}, {16,74}, {16,86}, {16,87}, {16,88}, {16,89}, {16,90}, {16,92}, {16,93}, {16,94}, {16,95}, {16,96}, {16,97}, {16,98}, {16,99}, {16,100}, {17,3}, {17,4}, {17,5}, {17,6}, {17,7}, {17,8}, {17,9}, {17,10}, {17,11}, {17,12}, {17,13}, {17,14}, {17,15}, {17,16}, {17,17}, {17,18}, {17,19}, {17,20}, {17,21}, {17,22}, {17,23}, {17,24}, {17,25}, {17,26}, {17,27}, {17,28}, {17,29}, {17,30}, {17,31}, {17,32}, {17,33}, {17,34}, {17,35}, {17,36}, {17,37}, {17,38}, {17,39}, {17,40}, {17,41}, {17,42}, {17,43}, {17,44}, {17,56}, {17,62}, {17,72}, {17,73}, {17,74}, {17,86}, {17,87}, {17,88}, {17,89}, {17,90}, {17,92}, {17,93}, {17,94}, {17,95}, {17,96}, {17,97}, {17,98}, {17,99}, {17,100}, {18,3}, {18,4}, {18,5}, {18,6}, {18,7}, {18,8}, {18,9}, {18,10}, {18,11}, {18,12}, {18,13}, {18,14}, {18,15}, {18,16}, {18,17}, {18,18}, {18,19}, {18,20}, {18,21}, {18,22}, {18,23}, {18,24}, {18,25}, {18,26}, {18,27}, {18,28}, {18,29}, {18,30}, {18,31}, {18,32}, {18,33}, {18,34}, {18,35}, {18,36}, {18,37}, {18,38}, {18,39}, {18,40}, {18,41}, {18,42}, {18,43}, {18,44}, {18,56}, {18,62}, {18,72}, {18,73}, {18,74}, {18,86}, {18,87}, {18,88}, {18,89}, {18,90}, {18,92}, {18,93}, {18,94}, {18,95}, {18,96}, {18,97}, {18,98}, {18,99}, {18,100}, {18,113}, {18,121}, {18,129}, {19,3}, {19,4}, {19,7}, {19,8}, {19,11}, {19,12}, {19,15}, {19,16}, {19,19}, {19,20}, {19,23}, {19,24}, {19,27}, {19,28}, {19,31}, {19,32}, {19,35}, {19,36}, {19,39}, {19,40}, {19,43}, {19,44}, {19,56}, {19,62}, {19,72}, {19,73}, {19,74}, {19,86}, {19,87}, {19,88}, {19,89}, {19,90}, {19,92}, {19,93}, {19,94}, {19,95}, {19,96}, {19,97}, {19,98}, {19,99}, {19,100}, {19,111}, {19,112}, {19,113}, {19,114}, {19,115}, {19,119}, {19,120}, {19,121}, {19,122}, {19,123}, {19,127}, {19,128}, {19,129}, {19,130}, {19,131}, {20,-1}, {20,3}, {20,4}, {20,7}, {20,8}, {20,11}, {20,12}, {20,15}, {20,16}, {20,19}, {20,20}, {20,23}, {20,24}, {20,27}, {20,28}, {20,31}, {20,32}, {20,35}, {20,36}, {20,39}, {20,40}, {20,43}, {20,44}, {20,56}, {20,62}, {20,72}, {20,73}, {20,74}, {20,86}, {20,87}, {20,88}, {20,89}, {20,90}, {20,92}, {20,93}, {20,94}, {20,95}, {20,96}, {20,97}, {20,98}, {20,99}, {20,100}, {20,111}, {20,112}, {20,113}, {20,114}, {20,115}, {20,119}, {20,120}, {20,121}, {20,122}, {20,123}, {20,127}, {20,128}, {20,129}, {20,130}, {20,131}, {21,-6}, {21,-5}, {21,-4}, {21,-3}, {21,-2}, {21,-1}, {21,0}, {21,3}, {21,4}, {21,5}, {21,6}, {21,7}, {21,8}, {21,9}, {21,10}, {21,11}, {21,12}, {21,13}, {21,14}, {21,15}, {21,16}, {21,17}, {21,18}, {21,19}, {21,20}, {21,21}, {21,22}, {21,23}, {21,24}, {21,25}, {21,26}, {21,27}, {21,28}, {21,29}, {21,30}, {21,31}, {21,32}, {21,33}, {21,34}, {21,35}, {21,36}, {21,37}, {21,38}, {21,39}, {21,40}, {21,41}, {21,42}, {21,43}, {21,44}, {21,56}, {21,57}, {21,58}, {21,59}, {21,60}, {21,61}, {21,62}, {21,73}, {21,89}, {21,92}, {21,93}, {21,94}, {21,95}, {21,111}, {21,112}, {21,113}, {21,114}, {21,115}, {21,119}, {21,120}, {21,121}, {21,122}, {21,123}, {21,127}, {21,128}, {21,129}, {21,130}, {21,131}, {22,-6}, {22,-5}, {22,-4}, {22,-3}, {22,-2}, {22,-1}, {22,0}, {22,3}, {22,4}, {22,5}, {22,6}, {22,7}, {22,8}, {22,9}, {22,10}, {22,11}, {22,12}, {22,13}, {22,14}, {22,15}, {22,16}, {22,17}, {22,18}, {22,19}, {22,20}, {22,21}, {22,22}, {22,23}, {22,24}, {22,25}, {22,26}, {22,27}, {22,28}, {22,29}, {22,30}, {22,31}, {22,32}, {22,33}, {22,34}, {22,35}, {22,36}, {22,37}, {22,38}, {22,39}, {22,40}, {22,41}, {22,42}, {22,43}, {22,44}, {22,72}, {22,73}, {22,74}, {22,111}, {22,112}, {22,113}, {22,114}, {22,115}, {22,116}, {22,119}, {22,120}, {22,121}, {22,122}, {22,123}, {22,124}, {22,127}, {22,128}, {22,129}, {22,130}, {22,131}, {22,132}, {23,-5}, {23,-4}, {23,-1}, {23,0}, {23,3}, {23,4}, {23,7}, {23,8}, {23,11}, {23,12}, {23,15}, {23,16}, {23,19}, {23,20}, {23,23}, {23,24}, {23,27}, {23,28}, {23,31}, {23,32}, {23,35}, {23,36}, {23,39}, {23,40}, {23,43}, {23,44}, {23,72}, {23,73}, {23,74}, {23,111}, {23,112}, {23,113}, {23,114}, {23,115}, {23,119}, {23,120}, {23,121}, {23,122}, {23,123}, {23,127}, {23,128}, {23,129}, {23,130}, {23,131}, {24,-5}, {24,-4}, {24,-1}, {24,0}, {24,3}, {24,4}, {24,7}, {24,8}, {24,11}, {24,12}, {24,15}, {24,16}, {24,19}, {24,20}, {24,23}, {24,24}, {24,27}, {24,28}, {24,31}, {24,32}, {24,35}, {24,36}, {24,39}, {24,40}, {24,43}, {24,44}, {24,114}, {24,122}, {24,130}, {25,-6}, {25,-5}, {25,-4}, {25,-3}, {25,-2}, {25,-1}, {25,0}, {25,3}, {25,4}, {25,5}, {25,6}, {25,7}, {25,8}, {25,9}, {25,10}, {25,11}, {25,12}, {25,13}, {25,14}, {25,15}, {25,16}, {25,17}, {25,18}, {25,19}, {25,20}, {25,21}, {25,22}, {25,23}, {25,24}, {25,25}, {25,26}, {25,27}, {25,28}, {25,29}, {25,30}, {25,31}, {25,32}, {25,33}, {25,34}, {25,35}, {25,36}, {25,37}, {25,38}, {25,39}, {25,40}, {25,41}, {25,42}, {25,43}, {25,44}, {26,-6}, {26,-5}, {26,-4}, {26,-3}, {26,-2}, {26,-1}, {26,0}, {26,3}, {26,4}, {26,5}, {26,6}, {26,7}, {26,8}, {26,9}, {26,10}, {26,11}, {26,12}, {26,13}, {26,14}, {26,15}, {26,16}, {26,17}, {26,18}, {26,19}, {26,20}, {26,21}, {26,22}, {26,23}, {26,24}, {26,25}, {26,26}, {26,27}, {26,28}, {26,29}, {26,30}, {26,31}, {26,32}, {26,33}, {26,34}, {26,35}, {26,36}, {26,37}, {26,38}, {26,39}, {26,40}, {26,41}, {26,42}, {26,43}, {26,44}, {27,-5}, {27,-4}, {27,-1}, {27,0}, {27,3}, {27,4}, {27,7}, {27,8}, {27,11}, {27,12}, {27,15}, {27,16}, {27,19}, {27,20}, {27,23}, {27,24}, {27,27}, {27,28}, {27,31}, {27,32}, {27,35}, {27,36}, {27,39}, {27,40}, {27,43}, {27,44}, {28,-5}, {28,-4}, {28,-1}, {28,0}, {28,3}, {28,4}, {28,7}, {28,8}, {28,11}, {28,12}, {28,15}, {28,16}, {28,19}, {28,20}, {28,23}, {28,24}, {28,27}, {28,28}, {28,31}, {28,32}, {28,35}, {28,36}, {28,39}, {28,40}, {28,43}, {28,44}, {29,-62}, {29,-61}, {29,-60}, {29,-59}, {29,-58}, {29,-57}, {29,-56}, {29,-55}, {29,-54}, {29,-53}, {29,-52}, {29,-51}, {29,-50}, {29,-49}, {29,-48}, {29,-47}, {29,-6}, {29,-5}, {29,-4}, {29,-3}, {29,-2}, {29,-1}, {29,0}, {29,1}, {29,3}, {29,4}, {29,5}, {29,6}, {29,7}, {29,8}, {29,9}, {29,10}, {29,11}, {29,12}, {29,13}, {29,14}, {29,15}, {29,16}, {29,17}, {29,18}, {29,19}, {29,20}, {29,21}, {29,22}, {29,23}, {29,24}, {29,25}, {29,26}, {29,27}, {29,28}, {29,29}, {29,30}, {29,31}, {29,32}, {29,33}, {29,34}, {29,35}, {29,36}, {29,37}, {29,38}, {29,39}, {29,40}, {29,41}, {29,42}, {29,43}, {29,44}, {29,45}, {30,-62}, {30,-61}, {30,-60}, {30,-59}, {30,-58}, {30,-57}, {30,-56}, {30,-55}, {30,-54}, {30,-53}, {30,-52}, {30,-51}, {30,-50}, {30,-49}, {30,-48}, {30,-47}, {30,-6}, {30,-5}, {30,-4}, {30,-3}, {30,-2}, {30,-1}, {30,0}, {30,1}, {30,3}, {30,4}, {30,5}, {30,6}, {30,7}, {30,8}, {30,9}, {30,10}, {30,11}, {30,12}, {30,13}, {30,14}, {30,15}, {30,16}, {30,17}, {30,18}, {30,19}, {30,20}, {30,21}, {30,22}, {30,23}, {30,24}, {30,25}, {30,26}, {30,27}, {30,28}, {30,29}, {30,30}, {30,31}, {30,32}, {30,33}, {30,34}, {30,35}, {30,36}, {30,37}, {30,38}, {30,39}, {30,40}, {30,41}, {30,42}, {30,43}, {30,44}, {30,45}, {31,-62}, {31,-61}, {31,-60}, {31,-59}, {31,-58}, {31,-57}, {31,-56}, {31,-55}, {31,-54}, {31,-53}, {31,-52}, {31,-51}, {31,-50}, {31,-49}, {31,-48}, {31,-47}, {31,-5}, {31,-4}, {31,-1}, {31,0}, {31,3}, {31,4}, {31,7}, {31,8}, {31,11}, {31,12}, {31,15}, {31,16}, {31,19}, {31,20}, {31,23}, {31,24}, {31,27}, {31,28}, {31,31}, {31,32}, {31,35}, {31,36}, {31,39}, {31,40}, {31,43}, {31,44}, {32,-62}, {32,-61}, {32,-60}, {32,-59}, {32,-58}, {32,-57}, {32,-56}, {32,-55}, {32,-54}, {32,-53}, {32,-52}, {32,-51}, {32,-50}, {32,-49}, {32,-48}, {32,-47}, {32,-5}, {32,-4}, {32,-1}, {32,0}, {32,3}, {32,4}, {32,7}, {32,8}, {32,11}, {32,12}, {32,15}, {32,16}, {32,19}, {32,20}, {32,23}, {32,24}, {32,27}, {32,28}, {32,31}, {32,32}, {32,35}, {32,36}, {32,39}, {32,40}, {32,43}, {32,44}, {33,-62}, {33,-61}, {33,-60}, {33,-56}, {33,-55}, {33,-54}, {33,-53}, {33,-49}, {33,-48}, {33,-47}, {33,-6}, {33,-5}, {33,-4}, {33,-3}, {33,-2}, {33,-1}, {33,0}, {33,3}, {33,4}, {33,5}, {33,6}, {33,7}, {33,8}, {33,9}, {33,10}, {33,11}, {33,12}, {33,13}, {33,14}, {33,15}, {33,16}, {33,17}, {33,18}, {33,19}, {33,20}, {33,21}, {33,22}, {33,23}, {33,24}, {33,25}, {33,26}, {33,27}, {33,28}, {33,29}, {33,30}, {33,31}, {33,32}, {33,33}, {33,34}, {33,35}, {33,36}, {33,37}, {33,38}, {33,39}, {33,40}, {33,41}, {33,42}, {33,43}, {33,44}, {34,-62}, {34,-61}, {34,-60}, {34,-56}, {34,-55}, {34,-54}, {34,-53}, {34,-49}, {34,-48}, {34,-47}, {34,-6}, {34,-5}, {34,-4}, {34,-3}, {34,-2}, {34,-1}, {34,0}, {34,3}, {34,4}, {34,5}, {34,6}, {34,7}, {34,8}, {34,9}, {34,10}, {34,11}, {34,12}, {34,13}, {34,14}, {34,15}, {34,16}, {34,17}, {34,18}, {34,19}, {34,20}, {34,21}, {34,22}, {34,23}, {34,24}, {34,25}, {34,26}, {34,27}, {34,28}, {34,29}, {34,30}, {34,31}, {34,32}, {34,33}, {34,34}, {34,35}, {34,36}, {34,37}, {34,38}, {34,39}, {34,40}, {34,41}, {34,42}, {34,43}, {34,44}, {35,-62}, {35,-61}, {35,-60}, {35,-56}, {35,-55}, {35,-54}, {35,-53}, {35,-49}, {35,-48}, {35,-47}, {35,-5}, {35,-4}, {35,-1}, {35,0}, {35,3}, {35,4}, {35,7}, {35,8}, {35,11}, {35,12}, {35,15}, {35,16}, {35,19}, {35,20}, {35,23}, {35,24}, {35,27}, {35,28}, {35,31}, {35,32}, {35,35}, {35,36}, {35,39}, {35,40}, {35,43}, {35,44}, {36,-65}, {36,-64}, {36,-63}, {36,-62}, {36,-61}, {36,-60}, {36,-59}, {36,-58}, {36,-57}, {36,-56}, {36,-55}, {36,-54}, {36,-53}, {36,-52}, {36,-51}, {36,-50}, {36,-49}, {36,-48}, {36,-47}, {36,-46}, {36,-45}, {36,-44}, {36,-5}, {36,-4}, {36,-1}, {36,0}, {36,3}, {36,4}, {36,7}, {36,8}, {36,11}, {36,12}, {36,15}, {36,16}, {36,19}, {36,20}, {36,23}, {36,24}, {36,27}, {36,28}, {36,31}, {36,32}, {36,35}, {36,36}, {36,39}, {36,40}, {36,43}, {36,44}, {37,-65}, {37,-64}, {37,-63}, {37,-62}, {37,-61}, {37,-60}, {37,-59}, {37,-58}, {37,-57}, {37,-56}, {37,-55}, {37,-54}, {37,-53}, {37,-52}, {37,-51}, {37,-50}, {37,-49}, {37,-48}, {37,-47}, {37,-46}, {37,-45}, {37,-44}, {37,-6}, {37,-5}, {37,-4}, {37,-3}, {37,-2}, {37,-1}, {37,0}, {37,3}, {37,4}, {37,5}, {37,6}, {37,7}, {37,8}, {37,9}, {37,10}, {37,11}, {37,12}, {37,13}, {37,14}, {37,15}, {37,16}, {37,17}, {37,18}, {37,19}, {37,20}, {37,21}, {37,22}, {37,23}, {37,24}, {37,25}, {37,26}, {37,27}, {37,28}, {37,29}, {37,30}, {37,31}, {37,32}, {37,33}, {37,34}, {37,35}, {37,36}, {37,37}, {37,38}, {37,39}, {37,40}, {37,41}, {37,42}, {37,43}, {37,44}, {38,-65}, {38,-64}, {38,-63}, {38,-62}, {38,-61}, {38,-60}, {38,-59}, {38,-58}, {38,-57}, {38,-56}, {38,-55}, {38,-54}, {38,-53}, {38,-52}, {38,-51}, {38,-50}, {38,-49}, {38,-48}, {38,-47}, {38,-46}, {38,-45}, {38,-44}, {38,-6}, {38,-5}, {38,-4}, {38,-3}, {38,-2}, {38,-1}, {38,0}, {38,3}, {38,4}, {38,5}, {38,6}, {38,7}, {38,8}, {38,9}, {38,10}, {38,11}, {38,12}, {38,13}, {38,14}, {38,15}, {38,16}, {38,17}, {38,18}, {38,19}, {38,20}, {38,21}, {38,22}, {38,23}, {38,24}, {38,25}, {38,26}, {38,27}, {38,28}, {38,29}, {38,30}, {38,31}, {38,32}, {38,33}, {38,34}, {38,35}, {38,36}, {38,37}, {38,38}, {38,39}, {38,40}, {38,41}, {38,42}, {38,43}, {38,44}, {39,-65}, {39,-64}, {39,-63}, {39,-62}, {39,-61}, {39,-60}, {39,-59}, {39,-58}, {39,-57}, {39,-56}, {39,-55}, {39,-54}, {39,-53}, {39,-52}, {39,-51}, {39,-50}, {39,-49}, {39,-48}, {39,-47}, {39,-46}, {39,-45}, {39,-44}, {39,-5}, {39,-4}, {39,-1}, {39,0}, {39,3}, {39,4}, {39,7}, {39,8}, {39,11}, {39,12}, {39,15}, {39,16}, {39,19}, {39,20}, {39,23}, {39,24}, {39,27}, {39,28}, {39,31}, {39,32}, {39,35}, {39,36}, {39,39}, {39,40}, {39,43}, {39,44}, {39,64}, {39,72}, {39,73}, {39,91}, {39,116}, {39,136}, {40,-62}, {40,-61}, {40,-60}, {40,-56}, {40,-55}, {40,-54}, {40,-53}, {40,-49}, {40,-48}, {40,-47}, {40,-5}, {40,-4}, {40,-1}, {40,0}, {40,3}, {40,4}, {40,7}, {40,8}, {40,11}, {40,12}, {40,15}, {40,16}, {40,19}, {40,20}, {40,23}, {40,24}, {40,27}, {40,28}, {40,31}, {40,32}, {40,35}, {40,36}, {40,39}, {40,40}, {40,43}, {40,44}, {40,63}, {40,64}, {40,65}, {40,66}, {40,67}, {40,68}, {40,69}, {40,70}, {40,71}, {40,72}, {40,73}, {40,81}, {40,82}, {40,83}, {40,84}, {40,85}, {40,86}, {40,87}, {40,88}, {40,89}, {40,90}, {40,91}, {40,92}, {40,93}, {40,94}, {40,95}, {40,96}, {40,97}, {40,98}, {40,99}, {40,100}, {40,101}, {40,102}, {40,103}, {40,110}, {40,111}, {40,112}, {40,113}, {40,114}, {40,115}, {40,116}, {40,117}, {40,118}, {40,119}, {40,120}, {40,121}, {40,122}, {40,128}, {40,129}, {40,130}, {40,131}, {40,132}, {40,133}, {40,134}, {40,135}, {40,136}, {40,137}, {40,138}, {41,-62}, {41,-61}, {41,-60}, {41,-56}, {41,-55}, {41,-54}, {41,-53}, {41,-49}, {41,-48}, {41,-47}, {41,-6}, {41,-5}, {41,-4}, {41,-3}, {41,-2}, {41,-1}, {41,0}, {41,3}, {41,4}, {41,5}, {41,6}, {41,7}, {41,8}, {41,9}, {41,10}, {41,11}, {41,12}, {41,13}, {41,14}, {41,15}, {41,16}, {41,17}, {41,18}, {41,19}, {41,20}, {41,21}, {41,22}, {41,23}, {41,24}, {41,25}, {41,26}, {41,27}, {41,28}, {41,29}, {41,30}, {41,31}, {41,32}, {41,33}, {41,34}, {41,35}, {41,36}, {41,37}, {41,38}, {41,39}, {41,40}, {41,41}, {41,42}, {41,43}, {41,44}, {41,63}, {41,64}, {41,65}, {41,66}, {41,67}, {41,68}, {41,69}, {41,70}, {41,71}, {41,72}, {41,73}, {41,81}, {41,82}, {41,83}, {41,84}, {41,85}, {41,86}, {41,87}, {41,88}, {41,89}, {41,90}, {41,91}, {41,92}, {41,93}, {41,94}, {41,95}, {41,96}, {41,97}, {41,98}, {41,99}, {41,100}, {41,101}, {41,102}, {41,103}, {41,110}, {41,111}, {41,112}, {41,113}, {41,114}, {41,115}, {41,116}, {41,117}, {41,118}, {41,119}, {41,120}, {41,121}, {41,122}, {41,128}, {41,129}, {41,130}, {41,131}, {41,132}, {41,133}, {41,134}, {41,135}, {41,136}, {42,-62}, {42,-61}, {42,-60}, {42,-56}, {42,-55}, {42,-54}, {42,-53}, {42,-49}, {42,-48}, {42,-47}, {42,-6}, {42,-5}, {42,-4}, {42,-3}, {42,-2}, {42,-1}, {42,0}, {42,3}, {42,4}, {42,5}, {42,6}, {42,7}, {42,8}, {42,9}, {42,10}, {42,11}, {42,12}, {42,13}, {42,14}, {42,15}, {42,16}, {42,17}, {42,18}, {42,19}, {42,20}, {42,21}, {42,22}, {42,23}, {42,24}, {42,25}, {42,26}, {42,27}, {42,28}, {42,29}, {42,30}, {42,31}, {42,32}, {42,33}, {42,34}, {42,35}, {42,36}, {42,37}, {42,38}, {42,39}, {42,40}, {42,41}, {42,42}, {42,43}, {42,44}, {42,63}, {42,64}, {42,65}, {42,66}, {42,67}, {42,68}, {42,69}, {42,70}, {42,71}, {42,72}, {42,73}, {42,80}, {42,81}, {42,82}, {42,83}, {42,84}, {42,85}, {42,86}, {42,87}, {42,88}, {42,89}, {42,90}, {42,91}, {42,92}, {42,93}, {42,94}, {42,95}, {42,96}, {42,97}, {42,98}, {42,99}, {42,100}, {42,101}, {42,102}, {42,103}, {42,104}, {42,109}, {42,110}, {42,111}, {42,112}, {42,113}, {42,114}, {42,115}, {42,116}, {42,117}, {42,118}, {42,119}, {42,120}, {42,121}, {42,122}, {42,128}, {42,129}, {42,130}, {42,131}, {42,132}, {42,133}, {42,134}, {42,135}, {42,136}, {42,137}, {42,138}, {43,-62}, {43,-61}, {43,-60}, {43,-59}, {43,-58}, {43,-57}, {43,-56}, {43,-55}, {43,-54}, {43,-53}, {43,-52}, {43,-51}, {43,-50}, {43,-49}, {43,-48}, {43,-47}, {43,-5}, {43,-4}, {43,-1}, {43,0}, {43,3}, {43,4}, {43,7}, {43,8}, {43,11}, {43,12}, {43,15}, {43,16}, {43,19}, {43,20}, {43,23}, {43,24}, {43,27}, {43,28}, {43,31}, {43,32}, {43,35}, {43,36}, {43,39}, {43,40}, {43,43}, {43,44}, {43,63}, {43,64}, {43,65}, {43,66}, {43,67}, {43,68}, {43,69}, {43,70}, {43,71}, {43,72}, {43,73}, {43,81}, {43,82}, {43,83}, {43,84}, {43,85}, {43,86}, {43,87}, {43,88}, {43,89}, {43,90}, {43,91}, {43,92}, {43,93}, {43,94}, {43,95}, {43,96}, {43,97}, {43,98}, {43,99}, {43,100}, {43,101}, {43,102}, {43,103}, {43,110}, {43,111}, {43,112}, {43,113}, {43,114}, {43,115}, {43,116}, {43,117}, {43,118}, {43,119}, {43,120}, {43,121}, {43,122}, {43,128}, {43,129}, {43,130}, {43,131}, {43,132}, {43,133}, {43,134}, {43,135}, {43,136}, {44,-62}, {44,-61}, {44,-60}, {44,-59}, {44,-58}, {44,-57}, {44,-56}, {44,-55}, {44,-54}, {44,-53}, {44,-52}, {44,-51}, {44,-50}, {44,-49}, {44,-48}, {44,-47}, {44,-5}, {44,-4}, {44,-1}, {44,0}, {44,3}, {44,4}, {44,7}, {44,8}, {44,11}, {44,12}, {44,15}, {44,16}, {44,19}, {44,20}, {44,23}, {44,24}, {44,27}, {44,28}, {44,31}, {44,32}, {44,35}, {44,36}, {44,39}, {44,40}, {44,43}, {44,44}, {44,62}, {44,63}, {44,64}, {44,65}, {44,66}, {44,67}, {44,68}, {44,69}, {44,70}, {44,71}, {44,72}, {44,73}, {44,81}, {44,82}, {44,83}, {44,84}, {44,85}, {44,86}, {44,87}, {44,88}, {44,89}, {44,90}, {44,91}, {44,92}, {44,93}, {44,94}, {44,95}, {44,96}, {44,97}, {44,98}, {44,99}, {44,100}, {44,101}, {44,102}, {44,103}, {44,110}, {44,111}, {44,112}, {44,113}, {44,114}, {44,115}, {44,116}, {44,117}, {44,118}, {44,119}, {44,120}, {44,121}, {44,122}, {44,128}, {44,129}, {44,130}, {44,131}, {44,132}, {44,133}, {44,134}, {44,135}, {44,136}, {44,137}, {44,138}, {45,-62}, {45,-61}, {45,-60}, {45,-59}, {45,-58}, {45,-57}, {45,-56}, {45,-55}, {45,-54}, {45,-53}, {45,-52}, {45,-51}, {45,-50}, {45,-49}, {45,-48}, {45,-47}, {45,-6}, {45,-5}, {45,-4}, {45,-3}, {45,-2}, {45,-1}, {45,0}, {45,1}, {45,3}, {45,4}, {45,5}, {45,6}, {45,7}, {45,8}, {45,9}, {45,10}, {45,11}, {45,12}, {45,13}, {45,14}, {45,15}, {45,16}, {45,17}, {45,18}, {45,19}, {45,20}, {45,21}, {45,22}, {45,23}, {45,24}, {45,25}, {45,26}, {45,27}, {45,28}, {45,29}, {45,30}, {45,31}, {45,32}, {45,33}, {45,34}, {45,35}, {45,36}, {45,37}, {45,38}, {45,39}, {45,40}, {45,41}, {45,42}, {45,43}, {45,44}, {45,45}, {45,63}, {45,64}, {45,65}, {45,66}, {45,67}, {45,68}, {45,69}, {45,70}, {45,71}, {45,72}, {45,73}, {45,81}, {45,82}, {45,83}, {45,84}, {45,85}, {45,86}, {45,87}, {45,88}, {45,89}, {45,90}, {45,91}, {45,92}, {45,93}, {45,94}, {45,95}, {45,96}, {45,97}, {45,98}, {45,99}, {45,100}, {45,101}, {45,102}, {45,103}, {45,110}, {45,111}, {45,112}, {45,113}, {45,114}, {45,115}, {45,116}, {45,117}, {45,118}, {45,119}, {45,120}, {45,121}, {45,122}, {45,128}, {45,129}, {45,130}, {45,131}, {45,132}, {45,133}, {45,134}, {45,135}, {45,136}, {46,-62}, {46,-61}, {46,-60}, {46,-59}, {46,-58}, {46,-57}, {46,-56}, {46,-55}, {46,-54}, {46,-53}, {46,-52}, {46,-51}, {46,-50}, {46,-49}, {46,-48}, {46,-47}, {46,-6}, {46,-5}, {46,-4}, {46,-3}, {46,-2}, {46,-1}, {46,0}, {46,1}, {46,3}, {46,4}, {46,5}, {46,6}, {46,7}, {46,8}, {46,9}, {46,10}, {46,11}, {46,12}, {46,13}, {46,14}, {46,15}, {46,16}, {46,17}, {46,18}, {46,19}, {46,20}, {46,21}, {46,22}, {46,23}, {46,24}, {46,25}, {46,26}, {46,27}, {46,28}, {46,29}, {46,30}, {46,31}, {46,32}, {46,33}, {46,34}, {46,35}, {46,36}, {46,37}, {46,38}, {46,39}, {46,40}, {46,41}, {46,42}, {46,43}, {46,44}, {46,45}, {46,63}, {46,64}, {46,65}, {46,66}, {46,67}, {46,68}, {46,69}, {46,70}, {46,71}, {46,72}, {46,73}, {46,81}, {46,82}, {46,83}, {46,84}, {46,85}, {46,86}, {46,87}, {46,88}, {46,89}, {46,90}, {46,91}, {46,92}, {46,93}, {46,94}, {46,95}, {46,96}, {46,97}, {46,98}, {46,99}, {46,100}, {46,101}, {46,102}, {46,103}, {46,110}, {46,111}, {46,112}, {46,113}, {46,114}, {46,115}, {46,116}, {46,117}, {46,118}, {46,119}, {46,120}, {46,121}, {46,122}, {46,128}, {46,129}, {46,130}, {46,131}, {46,132}, {46,133}, {46,134}, {46,135}, {46,136}, {46,137}, {46,138}, {47,-60}, {47,-5}, {47,-4}, {47,-1}, {47,0}, {47,3}, {47,4}, {47,7}, {47,8}, {47,11}, {47,12}, {47,15}, {47,16}, {47,19}, {47,20}, {47,23}, {47,24}, {47,27}, {47,28}, {47,31}, {47,32}, {47,35}, {47,36}, {47,39}, {47,40}, {47,43}, {47,44}, {47,63}, {47,64}, {47,65}, {47,66}, {47,67}, {47,68}, {47,69}, {47,70}, {47,71}, {47,72}, {47,73}, {47,81}, {47,82}, {47,83}, {47,84}, {47,85}, {47,86}, {47,87}, {47,88}, {47,89}, {47,90}, {47,91}, {47,92}, {47,93}, {47,94}, {47,95}, {47,96}, {47,97}, {47,98}, {47,99}, {47,100}, {47,101}, {47,102}, {47,103}, {47,110}, {47,111}, {47,112}, {47,113}, {47,114}, {47,115}, {47,116}, {47,117}, {47,118}, {47,119}, {47,120}, {47,121}, {47,122}, {47,128}, {47,129}, {47,130}, {47,131}, {47,132}, {47,133}, {47,134}, {47,135}, {47,136}, {48,-60}, {48,-5}, {48,-4}, {48,-1}, {48,0}, {48,3}, {48,4}, {48,7}, {48,8}, {48,11}, {48,12}, {48,15}, {48,16}, {48,19}, {48,20}, {48,23}, {48,24}, {48,27}, {48,28}, {48,31}, {48,32}, {48,35}, {48,36}, {48,39}, {48,40}, {48,43}, {48,44}, {48,63}, {48,64}, {48,65}, {48,66}, {48,67}, {48,68}, {48,69}, {48,70}, {48,71}, {48,72}, {48,73}, {48,81}, {48,82}, {48,83}, {48,84}, {48,85}, {48,86}, {48,87}, {48,88}, {48,89}, {48,90}, {48,91}, {48,92}, {48,93}, {48,94}, {48,95}, {48,96}, {48,97}, {48,98}, {48,99}, {48,100}, {48,101}, {48,102}, {48,103}, {48,110}, {48,111}, {48,112}, {48,113}, {48,114}, {48,115}, {48,116}, {48,117}, {48,118}, {48,119}, {48,120}, {48,121}, {48,122}, {48,128}, {48,129}, {48,130}, {48,131}, {48,132}, {48,133}, {48,134}, {48,135}, {48,136}, {48,137}, {48,138}, {49,-6}, {49,-5}, {49,-4}, {49,-3}, {49,-2}, {49,-1}, {49,0}, {49,3}, {49,4}, {49,5}, {49,6}, {49,7}, {49,8}, {49,9}, {49,10}, {49,11}, {49,12}, {49,13}, {49,14}, {49,15}, {49,16}, {49,17}, {49,18}, {49,19}, {49,20}, {49,21}, {49,22}, {49,23}, {49,24}, {49,25}, {49,26}, {49,27}, {49,28}, {49,29}, {49,30}, {49,31}, {49,32}, {49,33}, {49,34}, {49,35}, {49,36}, {49,37}, {49,38}, {49,39}, {49,40}, {49,41}, {49,42}, {49,43}, {49,44}, {49,63}, {49,64}, {49,65}, {49,66}, {49,67}, {49,68}, {49,69}, {49,70}, {49,71}, {49,72}, {49,73}, {49,81}, {49,82}, {49,83}, {49,84}, {49,85}, {49,86}, {49,87}, {49,88}, {49,89}, {49,90}, {49,91}, {49,92}, {49,93}, {49,94}, {49,95}, {49,96}, {49,97}, {49,98}, {49,99}, {49,100}, {49,101}, {49,102}, {49,103}, {49,110}, {49,111}, {49,112}, {49,113}, {49,114}, {49,115}, {49,116}, {49,117}, {49,118}, {49,119}, {49,120}, {49,121}, {49,122}, {49,128}, {49,129}, {49,130}, {49,131}, {49,132}, {49,133}, {49,134}, {49,135}, {49,136}, {50,-6}, {50,-5}, {50,-4}, {50,-3}, {50,-2}, {50,-1}, {50,0}, {50,3}, {50,4}, {50,5}, {50,6}, {50,7}, {50,8}, {50,9}, {50,10}, {50,11}, {50,12}, {50,13}, {50,14}, {50,15}, {50,16}, {50,17}, {50,18}, {50,19}, {50,20}, {50,21}, {50,22}, {50,23}, {50,24}, {50,25}, {50,26}, {50,27}, {50,28}, {50,29}, {50,30}, {50,31}, {50,32}, {50,33}, {50,34}, {50,35}, {50,36}, {50,37}, {50,38}, {50,39}, {50,40}, {50,41}, {50,42}, {50,43}, {50,44}, {50,63}, {50,64}, {50,65}, {50,66}, {50,67}, {50,68}, {50,69}, {50,70}, {50,71}, {50,72}, {50,73}, {50,81}, {50,82}, {50,83}, {50,84}, {50,85}, {50,86}, {50,87}, {50,88}, {50,89}, {50,90}, {50,91}, {50,92}, {50,93}, {50,94}, {50,95}, {50,96}, {50,97}, {50,98}, {50,99}, {50,100}, {50,101}, {50,102}, {50,103}, {50,110}, {50,111}, {50,112}, {50,113}, {50,114}, {50,115}, {50,116}, {50,117}, {50,118}, {50,119}, {50,120}, {50,121}, {50,122}, {50,128}, {50,129}, {50,130}, {50,131}, {50,132}, {50,133}, {50,134}, {50,135}, {50,136}, {50,137}, {50,138}, {51,-5}, {51,-4}, {51,-1}, {51,0}, {51,3}, {51,4}, {51,7}, {51,8}, {51,11}, {51,12}, {51,15}, {51,16}, {51,19}, {51,20}, {51,23}, {51,24}, {51,27}, {51,28}, {51,31}, {51,32}, {51,35}, {51,36}, {51,39}, {51,40}, {51,43}, {51,44}, {51,63}, {51,64}, {51,65}, {51,66}, {51,67}, {51,68}, {51,69}, {51,70}, {51,71}, {51,72}, {51,73}, {51,81}, {51,82}, {51,83}, {51,84}, {51,85}, {51,86}, {51,87}, {51,88}, {51,89}, {51,90}, {51,91}, {51,92}, {51,93}, {51,94}, {51,95}, {51,96}, {51,97}, {51,98}, {51,99}, {51,100}, {51,101}, {51,102}, {51,103}, {51,111}, {52,-5}, {52,-4}, {52,-1}, {52,0}, {52,3}, {52,4}, {52,7}, {52,8}, {52,11}, {52,12}, {52,15}, {52,16}, {52,19}, {52,20}, {52,23}, {52,24}, {52,27}, {52,28}, {52,31}, {52,32}, {52,35}, {52,36}, {52,39}, {52,40}, {52,43}, {52,44}, {52,63}, {52,64}, {52,65}, {52,66}, {52,67}, {52,68}, {52,69}, {52,70}, {52,71}, {52,72}, {52,73}, {52,81}, {52,82}, {52,83}, {52,84}, {52,85}, {52,86}, {52,87}, {52,88}, {52,89}, {52,90}, {52,91}, {52,92}, {52,93}, {52,94}, {52,95}, {52,96}, {52,97}, {52,98}, {52,99}, {52,100}, {52,101}, {52,102}, {52,103}, {53,-6}, {53,-5}, {53,-4}, {53,-3}, {53,-2}, {53,-1}, {53,0}, {53,3}, {53,4}, {53,5}, {53,6}, {53,7}, {53,8}, {53,9}, {53,10}, {53,11}, {53,12}, {53,13}, {53,14}, {53,15}, {53,16}, {53,17}, {53,18}, {53,19}, {53,20}, {53,21}, {53,22}, {53,23}, {53,24}, {53,25}, {53,26}, {53,27}, {53,28}, {53,29}, {53,30}, {53,31}, {53,32}, {53,33}, {53,34}, {53,35}, {53,36}, {53,37}, {53,38}, {53,39}, {53,40}, {53,41}, {53,42}, {53,43}, {53,44}, {53,63}, {53,64}, {53,65}, {53,66}, {53,67}, {53,68}, {53,69}, {53,70}, {53,71}, {53,72}, {53,73}, {53,81}, {53,82}, {53,83}, {53,84}, {53,85}, {53,86}, {53,87}, {53,88}, {53,89}, {53,90}, {53,91}, {53,92}, {53,93}, {53,94}, {53,95}, {53,96}, {53,97}, {53,98}, {53,99}, {53,100}, {53,101}, {53,102}, {53,103}, {54,-6}, {54,-5}, {54,-4}, {54,-3}, {54,-2}, {54,-1}, {54,0}, {54,3}, {54,4}, {54,5}, {54,6}, {54,7}, {54,8}, {54,9}, {54,10}, {54,11}, {54,12}, {54,13}, {54,14}, {54,15}, {54,16}, {54,17}, {54,18}, {54,19}, {54,20}, {54,21}, {54,22}, {54,23}, {54,24}, {54,25}, {54,26}, {54,27}, {54,28}, {54,29}, {54,30}, {54,31}, {54,32}, {54,33}, {54,34}, {54,35}, {54,36}, {54,37}, {54,38}, {54,39}, {54,40}, {54,41}, {54,42}, {54,43}, {54,44}, {54,62}, {54,63}, {54,64}, {54,65}, {54,66}, {54,67}, {54,68}, {54,69}, {54,70}, {54,71}, {54,72}, {54,73}, {54,81}, {54,82}, {54,83}, {54,84}, {54,85}, {54,86}, {54,87}, {54,88}, {54,89}, {54,90}, {54,91}, {54,92}, {54,93}, {54,94}, {54,95}, {54,96}, {54,97}, {54,98}, {54,99}, {54,100}, {54,101}, {54,102}, {54,103}, {55,-1}, {55,3}, {55,4}, {55,7}, {55,8}, {55,11}, {55,12}, {55,15}, {55,16}, {55,19}, {55,20}, {55,23}, {55,24}, {55,27}, {55,28}, {55,31}, {55,32}, {55,35}, {55,36}, {55,39}, {55,40}, {55,43}, {55,44}, {55,63}, {55,64}, {55,65}, {55,66}, {55,67}, {55,68}, {55,69}, {55,70}, {55,71}, {55,72}, {55,73}, {55,81}, {55,82}, {55,83}, {55,84}, {55,85}, {55,86}, {55,87}, {55,88}, {55,89}, {55,90}, {55,91}, {55,92}, {55,93}, {55,94}, {55,95}, {55,96}, {55,97}, {55,98}, {55,99}, {55,100}, {55,101}, {55,102}, {55,103}, {55,125}, {55,131}, {56,-97}, {56,-96}, {56,-95}, {56,3}, {56,4}, {56,7}, {56,8}, {56,11}, {56,12}, {56,15}, {56,16}, {56,19}, {56,20}, {56,23}, {56,24}, {56,27}, {56,28}, {56,31}, {56,32}, {56,35}, {56,36}, {56,39}, {56,40}, {56,43}, {56,44}, {56,63}, {56,64}, {56,65}, {56,66}, {56,67}, {56,68}, {56,69}, {56,70}, {56,71}, {56,72}, {56,73}, {56,81}, {56,82}, {56,83}, {56,84}, {56,85}, {56,86}, {56,87}, {56,88}, {56,89}, {56,90}, {56,91}, {56,92}, {56,93}, {56,94}, {56,95}, {56,96}, {56,97}, {56,98}, {56,99}, {56,100}, {56,101}, {56,102}, {56,103}, {56,110}, {56,111}, {56,112}, {56,113}, {56,114}, {56,115}, {56,116}, {56,117}, {56,118}, {56,119}, {56,120}, {56,121}, {56,122}, {56,123}, {56,124}, {56,125}, {56,126}, {56,127}, {56,128}, {56,129}, {56,130}, {56,131}, {56,132}, {56,133}, {56,134}, {57,-97}, {57,-96}, {57,-95}, {57,-94}, {57,3}, {57,4}, {57,5}, {57,6}, {57,7}, {57,8}, {57,9}, {57,10}, {57,11}, {57,12}, {57,13}, {57,14}, {57,15}, {57,16}, {57,17}, {57,18}, {57,19}, {57,20}, {57,21}, {57,22}, {57,23}, {57,24}, {57,25}, {57,26}, {57,27}, {57,28}, {57,29}, {57,30}, {57,31}, {57,32}, {57,33}, {57,34}, {57,35}, {57,36}, {57,37}, {57,38}, {57,39}, {57,40}, {57,41}, {57,42}, {57,43}, {57,44}, {57,63}, {57,64}, {57,65}, {57,66}, {57,67}, {57,68}, {57,69}, {57,70}, {57,71}, {57,72}, {57,73}, {57,81}, {57,82}, {57,83}, {57,84}, {57,85}, {57,86}, {57,87}, {57,88}, {57,89}, {57,90}, {57,91}, {57,92}, {57,93}, {57,94}, {57,95}, {57,96}, {57,97}, {57,98}, {57,99}, {57,100}, {57,101}, {57,102}, {57,103}, {57,110}, {57,111}, {57,112}, {57,113}, {57,114}, {57,115}, {57,116}, {57,117}, {57,118}, {57,119}, {57,120}, {57,121}, {57,122}, {57,123}, {57,124}, {57,125}, {57,126}, {57,127}, {57,128}, {57,129}, {57,130}, {57,131}, {57,132}, {57,133}, {57,134}, {58,-97}, {58,-96}, {58,-95}, {58,3}, {58,4}, {58,5}, {58,6}, {58,7}, {58,8}, {58,9}, {58,10}, {58,11}, {58,12}, {58,13}, {58,14}, {58,15}, {58,16}, {58,17}, {58,18}, {58,19}, {58,20}, {58,21}, {58,22}, {58,23}, {58,24}, {58,25}, {58,26}, {58,27}, {58,28}, {58,29}, {58,30}, {58,31}, {58,32}, {58,33}, {58,34}, {58,35}, {58,36}, {58,37}, {58,38}, {58,39}, {58,40}, {58,41}, {58,42}, {58,43}, {58,44}, {58,63}, {58,64}, {58,65}, {58,66}, {58,67}, {58,68}, {58,69}, {58,70}, {58,71}, {58,72}, {58,73}, {58,81}, {58,82}, {58,83}, {58,84}, {58,85}, {58,86}, {58,87}, {58,88}, {58,89}, {58,90}, {58,91}, {58,92}, {58,93}, {58,94}, {58,95}, {58,96}, {58,97}, {58,98}, {58,99}, {58,100}, {58,101}, {58,102}, {58,103}, {58,110}, {58,111}, {58,112}, {58,113}, {58,114}, {59,-95}, {59,63}, {59,64}, {59,65}, {59,66}, {59,67}, {59,68}, {59,69}, {59,70}, {59,71}, {59,72}, {59,73}, {59,91}, {59,109}, {59,110}, {59,111}, {59,112}, {59,113}, {59,114}, {60,-96}, {60,-95}, {60,-94}, {60,-60}, {60,-34}, {60,-33}, {60,-32}, {60,-31}, {60,-30}, {60,-29}, {60,-28}, {60,-27}, {60,-26}, {60,-25}, {60,-24}, {60,-23}, {60,-22}, {60,-21}, {60,-20}, {60,-19}, {60,-18}, {60,-10}, {60,-9}, {60,63}, {60,64}, {60,65}, {60,66}, {60,67}, {60,68}, {60,69}, {60,70}, {60,71}, {60,72}, {60,73}, {60,110}, {60,111}, {60,112}, {60,113}, {60,114}, {61,-96}, {61,-95}, {61,-94}, {61,-93}, {61,-34}, {61,-33}, {61,-32}, {61,-31}, {61,-30}, {61,-29}, {61,-28}, {61,-27}, {61,-26}, {61,-25}, {61,-24}, {61,-23}, {61,-22}, {61,-21}, {61,-20}, {61,-19}, {61,-18}, {61,63}, {61,64}, {61,65}, {61,66}, {61,67}, {61,68}, {61,69}, {61,70}, {61,71}, {61,72}, {61,73}, {61,74}, {61,110}, {61,111}, {61,112}, {61,113}, {61,114}, {62,-96}, {62,-95}, {62,-94}, {62,-34}, {62,-33}, {62,-32}, {62,-31}, {62,-30}, {62,-29}, {62,-28}, {62,-27}, {62,-26}, {62,-25}, {62,-24}, {62,-23}, {62,-22}, {62,-21}, {62,-20}, {62,-19}, {62,-18}, {62,63}, {62,64}, {62,65}, {62,66}, {62,67}, {62,68}, {62,69}, {62,70}, {62,71}, {62,72}, {62,73}, {62,110}, {62,111}, {62,112}, {62,113}, {62,114}, {63,-94}, {63,-34}, {63,-33}, {63,-32}, {63,-31}, {63,-30}, {63,-29}, {63,-28}, {63,-27}, {63,-26}, {63,-25}, {63,-24}, {63,-23}, {63,-22}, {63,-21}, {63,-20}, {63,-19}, {63,-18}, {63,63}, {63,64}, {63,65}, {63,66}, {63,67}, {63,68}, {63,69}, {63,70}, {63,71}, {63,72}, {63,73}, {63,96}, {63,97}, {63,110}, {63,111}, {63,112}, {63,113}, {63,114}, {64,-95}, {64,-94}, {64,-93}, {64,-30}, {64,-22}, {64,62}, {64,63}, {64,64}, {64,65}, {64,66}, {64,67}, {64,68}, {64,69}, {64,70}, {64,71}, {64,72}, {64,73}, {64,81}, {64,82}, {64,83}, {64,84}, {64,85}, {64,91}, {64,92}, {64,93}, {64,94}, {64,95}, {64,96}, {64,97}, {64,98}, {64,99}, {64,110}, {64,111}, {64,112}, {64,113}, {64,114}, {65,-95}, {65,-94}, {65,-93}, {65,-92}, {65,-30}, {65,-22}, {65,63}, {65,64}, {65,65}, {65,66}, {65,67}, {65,68}, {65,69}, {65,70}, {65,71}, {65,72}, {65,73}, {65,80}, {65,81}, {65,82}, {65,83}, {65,84}, {65,85}, {65,86}, {65,91}, {65,92}, {65,93}, {65,94}, {65,95}, {65,96}, {65,97}, {65,98}, {65,99}, {65,110}, {65,111}, {65,112}, {65,113}, {65,114}, {66,-95}, {66,-94}, {66,-93}, {66,-34}, {66,-33}, {66,-32}, {66,-31}, {66,-30}, {66,-29}, {66,-28}, {66,-27}, {66,-26}, {66,-25}, {66,-24}, {66,-23}, {66,-22}, {66,-21}, {66,-20}, {66,-19}, {66,-18}, {66,63}, {66,64}, {66,65}, {66,66}, {66,67}, {66,68}, {66,69}, {66,70}, {66,71}, {66,72}, {66,73}, {66,81}, {66,82}, {66,83}, {66,84}, {66,85}, {66,91}, {66,92}, {66,93}, {66,94}, {66,95}, {66,96}, {66,97}, {66,98}, {66,99}, {66,110}, {66,111}, {66,112}, {66,113}, {66,114}, {67,-93}, {67,-81}, {67,-34}, {67,-33}, {67,-32}, {67,-31}, {67,-30}, {67,-29}, {67,-28}, {67,-27}, {67,-26}, {67,-25}, {67,-24}, {67,-23}, {67,-22}, {67,-21}, {67,-20}, {67,-19}, {67,-18}, {67,63}, {67,64}, {67,65}, {67,66}, {67,67}, {67,68}, {67,69}, {67,70}, {67,71}, {67,72}, {67,73}, {67,81}, {67,82}, {67,83}, {67,84}, {67,85}, {67,91}, {67,92}, {67,93}, {67,94}, {67,95}, {67,96}, {67,97}, {67,98}, {67,99}, {67,110}, {67,111}, {67,112}, {67,113}, {67,114}, {68,-94}, {68,-93}, {68,-92}, {68,-63}, {68,-58}, {68,-52}, {68,-45}, {68,-34}, {68,-33}, {68,-32}, {68,-31}, {68,-30}, {68,-29}, {68,-28}, {68,-27}, {68,-26}, {68,-25}, {68,-24}, {68,-23}, {68,-22}, {68,-21}, {68,-20}, {68,-19}, {68,-18}, {68,63}, {68,64}, {68,65}, {68,66}, {68,67}, {68,68}, {68,69}, {68,70}, {68,71}, {68,72}, {68,73}, {68,81}, {68,82}, {68,83}, {68,84}, {68,85}, {68,87}, {68,88}, {68,89}, {68,90}, {68,91}, {68,99}, {68,100}, {68,101}, {68,102}, {68,103}, {68,110}, {68,111}, {68,112}, {68,113}, {68,114}, {69,-94}, {69,-93}, {69,-92}, {69,-64}, {69,-63}, {69,-62}, {69,-61}, {69,-60}, {69,-59}, {69,-58}, {69,-57}, {69,-56}, {69,-55}, {69,-54}, {69,-53}, {69,-52}, {69,-51}, {69,-50}, {69,-49}, {69,-48}, {69,-47}, {69,-46}, {69,-45}, {69,-44}, {69,-43}, {69,-42}, {69,-41}, {69,-34}, {69,-33}, {69,-32}, {69,-31}, {69,-30}, {69,-29}, {69,-28}, {69,-27}, {69,-26}, {69,-25}, {69,-24}, {69,-23}, {69,-22}, {69,-21}, {69,-20}, {69,-19}, {69,-18}, {69,63}, {69,64}, {69,65}, {69,66}, {69,67}, {69,68}, {69,69}, {69,70}, {69,71}, {69,72}, {69,73}, {69,81}, {69,82}, {69,83}, {69,84}, {69,85}, {69,87}, {69,88}, {69,89}, {69,90}, {69,100}, {69,101}, {69,102}, {69,103}, {70,-94}, {70,-93}, {70,-92}, {70,-64}, {70,-63}, {70,-62}, {70,-61}, {70,-60}, {70,-59}, {70,-58}, {70,-57}, {70,-56}, {70,-55}, {70,-54}, {70,-53}, {70,-52}, {70,-51}, {70,-50}, {70,-49}, {70,-48}, {70,-47}, {70,-46}, {70,-45}, {70,-44}, {70,-43}, {70,-42}, {70,-41}, {70,-34}, {70,-33}, {70,-32}, {70,-31}, {70,-30}, {70,-29}, {70,-28}, {70,-27}, {70,-26}, {70,-25}, {70,-24}, {70,-23}, {70,-22}, {70,-21}, {70,-20}, {70,-19}, {70,-18}, {70,-1}, {70,0}, {70,1}, {70,9}, {70,10}, {70,20}, {70,21}, {70,22}, {70,37}, {70,38}, {70,39}, {70,63}, {70,64}, {70,65}, {70,66}, {70,67}, {70,68}, {70,69}, {70,70}, {70,71}, {70,72}, {70,73}, {70,81}, {70,82}, {70,83}, {70,84}, {70,85}, {70,87}, {70,88}, {70,89}, {70,90}, {70,100}, {70,101}, {70,102}, {70,103}, {70,104}, {71,-94}, {71,-93}, {71,-92}, {71,-64}, {71,-63}, {71,-62}, {71,-61}, {71,-60}, {71,-59}, {71,-53}, {71,-52}, {71,-47}, {71,-46}, {71,-45}, {71,-44}, {71,-43}, {71,-42}, {71,-41}, {71,-40}, {71,-34}, {71,-33}, {71,-32}, {71,-31}, {71,-30}, {71,-29}, {71,-28}, {71,-27}, {71,-26}, {71,-25}, {71,-24}, {71,-23}, {71,-22}, {71,-21}, {71,-20}, {71,-19}, {71,-18}, {71,9}, {71,10}, {71,63}, {71,64}, {71,65}, {71,66}, {71,67}, {71,68}, {71,69}, {71,70}, {71,71}, {71,72}, {71,73}, {71,81}, {71,82}, {71,83}, {71,84}, {71,85}, {71,87}, {71,88}, {71,89}, {71,90}, {71,100}, {71,101}, {71,102}, {71,103}, {72,-92}, {72,-64}, {72,-63}, {72,-62}, {72,-61}, {72,-60}, {72,-59}, {72,-50}, {72,-49}, {72,-48}, {72,-47}, {72,-46}, {72,-45}, {72,-44}, {72,-43}, {72,-42}, {72,-41}, {72,-34}, {72,-33}, {72,-32}, {72,-31}, {72,-30}, {72,-29}, {72,-28}, {72,-27}, {72,-26}, {72,-25}, {72,-24}, {72,-23}, {72,-22}, {72,-21}, {72,-20}, {72,-19}, {72,-18}, {72,-1}, {72,0}, {72,1}, {72,9}, {72,10}, {72,20}, {72,21}, {72,22}, {72,37}, {72,38}, {72,39}, {72,63}, {72,64}, {72,65}, {72,66}, {72,67}, {72,68}, {72,69}, {72,70}, {72,71}, {72,72}, {72,73}, {72,81}, {72,82}, {72,83}, {72,84}, {72,85}, {72,87}, {72,88}, {72,89}, {72,90}, {72,100}, {72,101}, {72,102}, {72,103}, {73,-93}, {73,-92}, {73,-91}, {73,-90}, {73,-64}, {73,-63}, {73,-62}, {73,-61}, {73,-60}, {73,-59}, {73,-50}, {73,-49}, {73,-48}, {73,-47}, {73,-46}, {73,-45}, {73,-44}, {73,-43}, {73,-42}, {73,-41}, {73,-34}, {73,-33}, {73,-32}, {73,-31}, {73,-30}, {73,-29}, {73,-28}, {73,-27}, {73,-26}, {73,-25}, {73,-24}, {73,-23}, {73,-22}, {73,-21}, {73,-20}, {73,-19}, {73,-18}, {73,-1}, {73,0}, {73,1}, {73,9}, {73,10}, {73,20}, {73,21}, {73,22}, {73,37}, {73,38}, {73,39}, {73,63}, {73,64}, {73,65}, {73,66}, {73,67}, {73,68}, {73,69}, {73,70}, {73,71}, {73,72}, {73,73}, {73,81}, {73,82}, {73,83}, {73,84}, {73,85}, {73,87}, {73,88}, {73,89}, {73,90}, {73,100}, {73,101}, {73,102}, {73,103}, {74,-93}, {74,-92}, {74,-91}, {74,-90}, {74,-64}, {74,-63}, {74,-62}, {74,-61}, {74,-60}, {74,-59}, {74,-50}, {74,-49}, {74,-48}, {74,-47}, {74,-46}, {74,-45}, {74,-44}, {74,-43}, {74,-42}, {74,-41}, {74,-34}, {74,-33}, {74,-32}, {74,-31}, {74,-30}, {74,-29}, {74,-28}, {74,-27}, {74,-26}, {74,-25}, {74,-24}, {74,-23}, {74,-22}, {74,-21}, {74,-20}, {74,-19}, {74,-18}, {74,-1}, {74,0}, {74,1}, {74,9}, {74,10}, {74,19}, {74,20}, {74,21}, {74,22}, {74,37}, {74,38}, {74,39}, {74,62}, {74,63}, {74,64}, {74,65}, {74,66}, {74,67}, {74,68}, {74,69}, {74,70}, {74,71}, {74,72}, {74,73}, {74,81}, {74,82}, {74,83}, {74,84}, {74,85}, {74,87}, {74,88}, {74,89}, {74,90}, {74,100}, {74,101}, {74,102}, {74,103}, {74,110}, {74,111}, {74,112}, {74,113}, {74,114}, {74,115}, {74,116}, {74,117}, {74,118}, {74,120}, {74,121}, {74,122}, {74,123}, {74,124}, {74,125}, {74,126}, {74,127}, {74,128}, {74,129}, {74,130}, {74,131}, {74,132}, {74,133}, {74,134}, {74,135}, {74,136}, {74,137}, {74,138}, {75,-93}, {75,-92}, {75,-91}, {75,-90}, {75,-34}, {75,-33}, {75,-32}, {75,-31}, {75,-30}, {75,-29}, {75,-28}, {75,-27}, {75,-26}, {75,-25}, {75,-24}, {75,-23}, {75,-22}, {75,-21}, {75,-20}, {75,-19}, {75,-18}, {75,-1}, {75,0}, {75,1}, {75,9}, {75,10}, {75,20}, {75,21}, {75,22}, {75,37}, {75,38}, {75,39}, {75,63}, {75,64}, {75,65}, {75,66}, {75,67}, {75,68}, {75,69}, {75,70}, {75,71}, {75,72}, {75,73}, {75,81}, {75,82}, {75,83}, {75,84}, {75,85}, {75,87}, {75,88}, {75,89}, {75,90}, {75,100}, {75,101}, {75,102}, {75,103}, {75,110}, {75,111}, {75,112}, {75,113}, {75,114}, {75,115}, {75,116}, {75,117}, {75,118}, {75,119}, {75,120}, {75,121}, {75,122}, {75,123}, {75,124}, {75,125}, {75,126}, {75,127}, {75,128}, {75,129}, {75,130}, {75,131}, {75,132}, {75,133}, {75,134}, {75,135}, {75,136}, {75,137}, {75,138}, {75,139}, {76,-93}, {76,-92}, {76,-91}, {76,-90}, {76,-34}, {76,-33}, {76,-32}, {76,-31}, {76,-30}, {76,-29}, {76,-28}, {76,-27}, {76,-26}, {76,-25}, {76,-24}, {76,-23}, {76,-22}, {76,-21}, {76,-20}, {76,-19}, {76,-18}, {76,-1}, {76,0}, {76,1}, {76,9}, {76,10}, {76,20}, {76,21}, {76,22}, {76,37}, {76,38}, {76,39}, {76,63}, {76,64}, {76,65}, {76,66}, {76,67}, {76,68}, {76,69}, {76,70}, {76,71}, {76,72}, {76,73}, {76,81}, {76,82}, {76,83}, {76,84}, {76,85}, {76,87}, {76,88}, {76,89}, {76,90}, {76,91}, {76,99}, {76,100}, {76,101}, {76,102}, {76,103}, {76,110}, {76,111}, {76,112}, {76,113}, {76,114}, {76,115}, {76,116}, {76,117}, {76,118}, {76,120}, {76,121}, {76,122}, {76,123}, {76,124}, {76,125}, {76,126}, {76,127}, {76,128}, {76,129}, {76,130}, {76,131}, {76,132}, {76,133}, {76,134}, {76,135}, {76,136}, {76,137}, {76,138}, {77,-91}, {77,-90}, {77,-30}, {77,-22}, {77,-1}, {77,0}, {77,1}, {77,9}, {77,10}, {77,20}, {77,21}, {77,22}, {77,37}, {77,38}, {77,39}, {77,63}, {77,64}, {77,65}, {77,66}, {77,67}, {77,68}, {77,69}, {77,70}, {77,71}, {77,72}, {77,73}, {77,91}, {77,92}, {77,93}, {77,94}, {77,95}, {77,96}, {77,97}, {77,98}, {77,99}, {77,110}, {77,111}, {77,112}, {77,113}, {77,114}, {77,115}, {77,116}, {77,117}, {77,118}, {77,120}, {77,132}, {77,133}, {77,134}, {77,135}, {77,136}, {77,137}, {77,138}, {78,-91}, {78,-90}, {78,-1}, {78,0}, {78,1}, {78,9}, {78,10}, {78,20}, {78,21}, {78,22}, {78,37}, {78,38}, {78,39}, {78,63}, {78,64}, {78,65}, {78,66}, {78,67}, {78,68}, {78,69}, {78,70}, {78,71}, {78,72}, {78,73}, {78,91}, {78,92}, {78,93}, {78,94}, {78,95}, {78,96}, {78,97}, {78,98}, {78,99}, {78,110}, {78,111}, {78,112}, {78,113}, {78,114}, {78,115}, {78,116}, {78,117}, {78,118}, {78,132}, {78,133}, {78,134}, {78,135}, {78,136}, {78,137}, {78,138}, {79,63}, {79,64}, {79,65}, {79,66}, {79,67}, {79,68}, {79,69}, {79,70}, {79,71}, {79,72}, {79,73}, {79,91}, {79,92}, {79,93}, {79,94}, {79,95}, {79,96}, {79,97}, {79,98}, {79,99}, {79,110}, {79,111}, {79,112}, {79,113}, {79,114}, {79,115}, {79,116}, {79,117}, {79,118}, {79,132}, {79,133}, {79,134}, {79,135}, {79,136}, {79,137}, {79,138}, {80,63}, {80,64}, {80,65}, {80,66}, {80,67}, {80,68}, {80,69}, {80,70}, {80,71}, {80,72}, {80,73}, {80,91}, {80,92}, {80,93}, {80,94}, {80,95}, {80,96}, {80,97}, {80,98}, {80,99}, {80,110}, {80,111}, {80,112}, {80,113}, {80,114}, {80,115}, {80,116}, {80,117}, {80,118}, {80,132}, {80,133}, {80,134}, {80,135}, {80,136}, {80,137}, {80,138}, {81,98}, {81,111}, {81,137}, {82,-30}, {82,-14}, {85,93}, {85,94}, }, + ["vegetation-green-grass-4"] = {{-81,-103}, {-81,-102}, {-80,-102}, {-80,-101}, {-80,-100}, {-80,-99}, {-79,-106}, {-79,-99}, {-79,-98}, {-78,-114}, {-78,-112}, {-78,-104}, {-78,-97}, {-77,-113}, {-77,-110}, {-77,-109}, {-77,-95}, {-77,87}, {-76,-111}, {-76,-102}, {-76,-101}, {-76,-100}, {-76,-92}, {-76,87}, {-75,-116}, {-75,-108}, {-75,-106}, {-75,-101}, {-75,-100}, {-75,-99}, {-75,-98}, {-75,-91}, {-74,-116}, {-74,-115}, {-74,-114}, {-74,-113}, {-74,-105}, {-74,-100}, {-74,-98}, {-74,-97}, {-74,88}, {-74,119}, {-73,-116}, {-73,-115}, {-73,-114}, {-73,-113}, {-73,-112}, {-73,-111}, {-73,-105}, {-73,-104}, {-73,-95}, {-72,-113}, {-72,-112}, {-72,-111}, {-72,-110}, {-72,-103}, {-72,-102}, {-72,-93}, {-71,-111}, {-71,-110}, {-71,-109}, {-71,-108}, {-71,-101}, {-71,-100}, {-71,-92}, {-70,-110}, {-70,-109}, {-70,-108}, {-70,-107}, {-70,-99}, {-69,-116}, {-69,-115}, {-69,-107}, {-69,-106}, {-69,-98}, {-69,-97}, {-69,-96}, {-69,-91}, {-69,-90}, {-69,-89}, {-69,85}, {-69,129}, {-68,-116}, {-68,-115}, {-68,-114}, {-68,-113}, {-68,-107}, {-68,-106}, {-68,-105}, {-68,-104}, {-68,-95}, {-68,-89}, {-68,73}, {-67,-114}, {-67,-113}, {-67,-112}, {-67,-105}, {-67,-104}, {-67,-103}, {-67,-94}, {-67,76}, {-67,80}, {-67,136}, {-66,-114}, {-66,-111}, {-66,-110}, {-66,-104}, {-66,-103}, {-66,-102}, {-66,-94}, {-66,-93}, {-66,-92}, {-66,76}, {-66,77}, {-66,81}, {-65,-109}, {-65,-108}, {-65,-103}, {-65,-102}, {-65,-93}, {-65,-92}, {-65,-91}, {-65,-90}, {-64,-110}, {-64,-107}, {-64,-99}, {-64,-91}, {-64,-90}, {-63,-108}, {-63,-107}, {-63,-106}, {-63,-105}, {-63,-100}, {-63,-99}, {-63,-98}, {-63,-97}, {-63,-96}, {-62,-107}, {-62,-106}, {-62,-103}, {-62,-98}, {-62,-97}, {-62,-96}, {-62,-95}, {-62,-94}, {-61,-114}, {-61,-113}, {-61,-106}, {-61,-103}, {-61,-102}, {-61,-97}, {-61,-96}, {-61,-95}, {-61,-94}, {-61,-93}, {-60,-114}, {-60,-113}, {-60,-112}, {-60,-104}, {-60,-103}, {-60,-102}, {-60,-101}, {-60,-93}, {-60,-92}, {-60,-91}, {-59,-112}, {-59,-111}, {-59,-102}, {-59,-101}, {-59,-100}, {-59,-99}, {-59,-93}, {-59,-92}, {-59,-91}, {-59,-90}, {-58,-111}, {-58,-110}, {-58,-109}, {-58,-101}, {-58,-100}, {-58,-99}, {-58,-97}, {-58,-91}, {-58,-90}, {-58,-89}, {-57,-109}, {-57,-100}, {-57,-99}, {-57,-96}, {-57,-95}, {-57,-90}, {-57,-89}, {-56,-108}, {-56,-105}, {-56,-95}, {-56,-94}, {-55,-114}, {-55,-107}, {-55,-106}, {-55,-103}, {-55,-97}, {-55,-96}, {-55,-92}, {-54,-114}, {-54,-113}, {-54,-112}, {-54,-106}, {-54,-105}, {-54,-103}, {-54,-102}, {-54,-96}, {-54,-95}, {-54,-92}, {-54,-91}, {-53,-114}, {-53,-113}, {-53,-112}, {-53,-111}, {-53,-105}, {-53,-102}, {-53,-101}, {-53,-93}, {-53,-92}, {-53,-91}, {-53,-90}, {-52,-112}, {-52,-109}, {-52,-101}, {-52,-100}, {-52,-92}, {-52,-91}, {-52,-90}, {-51,-112}, {-51,-111}, {-51,-99}, {-51,-98}, {-51,-90}, {-50,-109}, {-50,-108}, {-50,-107}, {-50,-101}, {-50,-97}, {-49,-108}, {-49,-107}, {-49,-105}, {-49,-99}, {-49,-94}, {-49,-93}, {-48,-103}, {-48,-97}, {-48,-96}, {-48,-91}, {-47,-102}, {-46,-112}, {-46,-111}, {-46,-102}, {-46,-101}, {-46,-100}, {-46,-93}, {-46,-92}, {-46,-90}, {-45,-111}, {-45,-110}, {-45,-109}, {-45,-101}, {-45,-100}, {-45,-99}, {-45,-90}, {-44,-109}, {-44,-108}, {-44,-107}, {-44,-90}, {-43,-107}, {-42,-103}, {-42,-97}, {-42,-94}, {-41,-110}, {-41,-104}, {-41,-101}, {-41,-96}, {-40,-110}, {-40,-109}, {-40,-108}, {-40,-103}, {-40,-100}, {-40,-94}, {-40,-93}, {-40,-92}, {-40,-91}, {-39,-109}, {-39,-108}, {-39,-107}, {-39,-102}, {-39,-101}, {-39,-100}, {-39,-99}, {-38,-108}, {-38,-105}, {-38,-100}, {-38,-97}, {-38,-96}, {-37,-105}, {-37,-104}, {-37,-96}, {-36,-105}, {-36,-104}, {-36,-103}, {-36,-97}, {-36,-92}, {-35,-110}, {-35,-109}, {-35,-103}, {-35,-79}, {-35,-78}, {-34,-110}, {-34,-109}, {-34,-108}, {-34,-101}, {-34,-92}, {-33,-110}, {-33,-109}, {-33,-108}, {-33,-107}, {-33,-100}, {-33,-98}, {-33,-97}, {-32,-109}, {-32,-108}, {-32,-96}, {-31,-107}, {-31,-106}, {-31,-95}, {-31,-94}, {-31,-80}, {-31,-77}, {-30,-104}, {-30,-95}, {-30,-94}, {-30,-93}, {-30,-92}, {-30,-80}, {-30,-77}, {-29,-102}, {-29,-100}, {-29,-93}, {-28,-109}, {-28,-108}, {-28,-101}, {-28,-100}, {-28,-99}, {-27,-109}, {-27,-108}, {-27,-107}, {-27,-106}, {-27,-99}, {-26,-104}, {-26,-97}, {-26,-94}, {-26,-93}, {-26,-80}, {-26,97}, {-26,98}, {-25,-105}, {-25,-102}, {-25,-96}, {-25,-95}, {-25,-94}, {-25,-93}, {-25,-81}, {-25,-80}, {-25,93}, {-25,98}, {-25,108}, {-24,-100}, {-24,-93}, {-23,-109}, {-23,-98}, {-22,-109}, {-22,-108}, {-22,-107}, {-21,-108}, {-21,-107}, {-21,-106}, {-21,-105}, {-21,-96}, {-20,-103}, {-20,-95}, {-20,-94}, {-20,-82}, {-20,-79}, {-20,-78}, {-20,34}, {-19,-105}, {-19,-102}, {-19,34}, {-18,-104}, {-18,-103}, {-18,110}, {-18,111}, {-17,-108}, {-17,-102}, {-16,-107}, {-16,-106}, {-16,-98}, {-16,-97}, {-16,-96}, {-16,-82}, {-16,-81}, {-15,-106}, {-15,-99}, {-15,-98}, {-15,-82}, {-15,-81}, {-15,113}, {-14,-105}, {-14,-104}, {-14,-103}, {-14,114}, {-13,-104}, {-13,-101}, {-13,-95}, {-12,-103}, {-12,-100}, {-12,-99}, {-11,-101}, {-11,-100}, {-11,-99}, {-11,-98}, {-11,-76}, {-10,-100}, {-10,-99}, {-10,-98}, {-10,-97}, {-10,-76}, {-6,-84}, {-6,-83}, {-6,-82}, {-6,-81}, {-6,-78}, {-5,-84}, {-5,-82}, {-5,-81}, {-5,-78}, {-3,86}, {-1,-84}, {-1,-81}, {-1,-80}, {0,-84}, {0,-81}, {0,-80}, {0,-75}, {1,-105}, {1,-104}, {2,-104}, {3,-103}, {3,-102}, {4,-104}, {4,-103}, {4,-102}, {4,-101}, {4,-100}, {4,-99}, {4,-81}, {4,-77}, {4,-76}, {5,-99}, {5,-98}, {5,-85}, {5,-84}, {5,-81}, {5,-77}, {5,-76}, {5,33}, {6,-97}, {6,31}, {6,32}, {6,33}, {7,-98}, {7,-97}, {7,-96}, {7,31}, {8,-97}, {8,-96}, {8,-18}, {8,23}, {8,24}, {8,29}, {9,-96}, {9,-95}, {9,-84}, {9,-83}, {9,-82}, {9,-81}, {9,-78}, {9,-77}, {9,-76}, {9,12}, {9,25}, {10,-95}, {10,-84}, {10,-83}, {10,-82}, {10,-81}, {10,-78}, {10,-77}, {10,141}, {11,-95}, {12,-95}, {12,-94}, {17,-80}, {18,140}, {23,-83}, {24,-83}, {26,-82}, {26,-42}, {27,-82}, {27,-42}, {29,-42}, {30,-42}, {31,-81}, {31,52}, {32,-42}, {33,-42}, {42,-42}, {43,-42}, {45,-42}, {46,-42}, {48,-42}, {49,-42}, {62,131}, {63,131}, {67,131}, {70,129}, }, + ["vegetation-green-grass-1"] = {{-79,73}, {-79,74}, {-78,72}, {-78,73}, {-69,91}, {-68,90}, {-68,91}, {-67,89}, {-67,90}, {-67,91}, {-66,87}, {-66,88}, {-66,89}, {-66,90}, {-66,91}, {-65,83}, {-65,84}, {-65,85}, {-65,86}, {-65,87}, {-65,88}, {-65,89}, {-65,90}, {-65,91}, {-59,72}, {-59,73}, {-59,75}, {-59,76}, {-59,77}, {-58,72}, {-58,73}, {-58,75}, {-58,76}, {-58,77}, {-57,77}, {-56,76}, {-56,77}, {-55,76}, {-55,77}, {-36,73}, {-35,73}, {-35,74}, {-35,75}, {-34,74}, {-34,75}, {-33,74}, {-33,75}, {-32,74}, {-32,75}, {-31,74}, {-31,75}, {-30,88}, {-30,89}, {-30,90}, {-29,88}, {-29,89}, {-29,90}, {-28,88}, {-28,89}, {-28,90}, {-28,91}, {-28,92}, {-28,93}, {-28,94}, {-28,95}, {-28,96}, {-28,97}, {-28,98}, {-28,99}, {-28,100}, {-28,101}, {-28,102}, {-28,103}, {-28,104}, {-28,111}, {-28,112}, {-28,113}, {-28,114}, {-27,88}, {-27,89}, {-27,90}, {-27,91}, {-27,92}, {-27,93}, {-27,94}, {-27,95}, {-27,96}, {-27,97}, {-27,98}, {-27,100}, {-27,101}, {-27,102}, {-27,103}, {-27,104}, {-27,111}, {-27,112}, {-27,113}, {-27,114}, {-26,88}, {-26,89}, {-26,90}, {-26,93}, {-26,94}, {-26,95}, {-26,96}, {-26,100}, {-26,101}, {-26,102}, {-26,103}, {-25,87}, {-25,88}, {-25,89}, {-25,90}, {-24,87}, {-24,88}, {-24,89}, {-24,90}, {-22,33}, {-22,34}, {-22,35}, {-21,34}, {-21,35}, {-20,83}, {-20,84}, {-20,85}, {-20,86}, {-20,87}, {-20,88}, {-19,83}, {-19,84}, {-19,97}, {-19,98}, {-19,99}, {-19,100}, {-19,101}, {-18,76}, {-18,77}, {-18,78}, {-18,79}, {-18,83}, {-18,84}, {-18,85}, {-18,95}, {-18,96}, {-18,97}, {-18,98}, {-18,99}, {-18,102}, {-18,103}, {-17,76}, {-17,77}, {-17,78}, {-17,79}, {-17,83}, {-17,84}, {-17,90}, {-17,98}, {-17,102}, {-17,103}, {-16,76}, {-16,77}, {-16,78}, {-16,79}, {-16,83}, {-16,84}, {-16,97}, {-16,99}, {-16,100}, {-16,117}, {-15,76}, {-15,77}, {-15,78}, {-15,79}, {-15,83}, {-15,117}, {-14,76}, {-14,77}, {-14,78}, {-14,79}, {-14,87}, {-14,116}, {-14,117}, {-13,76}, {-13,77}, {-13,78}, {-13,79}, {-13,87}, {-13,111}, {-13,116}, {-13,117}, {-12,77}, {-12,78}, {-12,87}, {-12,88}, {-12,110}, {-12,111}, {-12,112}, {-12,116}, {-12,117}, {-11,77}, {-11,78}, {-11,110}, {-11,111}, {-11,112}, {-11,113}, {-11,117}, {-10,110}, {-10,111}, {-10,112}, {-10,113}, {-10,117}, {-9,87}, {-9,88}, {-9,110}, {-9,111}, {-9,112}, {-9,113}, {-9,116}, {-9,117}, {-8,75}, {-8,76}, {-8,86}, {-8,89}, {-8,99}, {-8,100}, {-8,110}, {-8,111}, {-8,112}, {-8,113}, {-8,114}, {-8,115}, {-8,116}, {-8,117}, {-7,75}, {-7,76}, {-7,77}, {-7,88}, {-7,97}, {-7,98}, {-7,99}, {-7,100}, {-7,101}, {-7,111}, {-7,112}, {-7,113}, {-7,114}, {-7,115}, {-7,116}, {-7,117}, {-6,75}, {-6,76}, {-6,77}, {-6,78}, {-6,95}, {-6,96}, {-6,97}, {-6,98}, {-6,99}, {-6,100}, {-6,101}, {-6,102}, {-6,109}, {-6,110}, {-6,111}, {-6,112}, {-6,113}, {-6,114}, {-6,115}, {-6,116}, {-6,117}, {-5,78}, {-5,79}, {-5,93}, {-5,94}, {-5,95}, {-5,96}, {-5,97}, {-5,98}, {-5,99}, {-5,100}, {-5,101}, {-5,102}, {-5,103}, {-5,104}, {-5,105}, {-5,106}, {-5,107}, {-5,108}, {-5,109}, {-5,110}, {-5,111}, {-5,112}, {-5,113}, {-5,114}, {-5,115}, {-5,116}, {-5,117}, {-4,78}, {-4,79}, {-1,86}, {-1,87}, {-1,88}, {-1,89}, {0,78}, {0,86}, {0,87}, {0,88}, {0,89}, {1,35}, {1,78}, {1,85}, {1,86}, {1,87}, {1,88}, {1,89}, {2,35}, {2,78}, {2,79}, {2,80}, {2,81}, {2,82}, {2,86}, {2,87}, {2,88}, {2,89}, {3,35}, {4,35}, {7,32}, {7,33}, {7,34}, {7,35}, {8,31}, {8,32}, {8,33}, {8,34}, {8,35}, {9,-59}, {9,-58}, {9,27}, {9,32}, {9,33}, {9,34}, {9,35}, {17,-84}, {17,-83}, {18,-84}, {59,125}, {59,126}, {59,127}, {59,128}, {59,129}, {59,130}, {60,131}, {61,131}, {68,131}, {69,131}, {70,128}, {70,130}, {70,131}, {71,128}, {71,129}, {71,130}, {71,131}, {72,120}, {72,126}, {72,127}, {72,128}, {72,129}, {72,130}, {72,131}, }, + ["water-mud"] = {{-74,81}, {-73,80}, {-73,81}, {-73,82}, {-73,83}, {-72,80}, {-72,81}, {-72,82}, {-72,83}, {-71,79}, {-71,80}, {-71,82}, {-14,92}, {-14,93}, {-13,91}, {-13,92}, {-13,93}, {-13,94}, {-12,92}, {-12,93}, {-12,94}, {-11,92}, {-11,93}, {-11,94}, {-10,94}, {-10,95}, {-10,96}, {62,124}, {62,125}, {63,124}, {63,125}, {63,126}, {63,128}, {64,124}, {64,125}, {64,126}, {64,127}, {65,125}, {65,126}, {66,124}, {66,125}, {67,124}, {68,123}, {68,124}, }, + ["water"] = {{-58,56}, {-58,64}, {-57,57}, {-57,58}, {-57,59}, {-57,60}, {-57,61}, {-57,62}, {-57,63}, {-57,64}, {-57,65}, {-56,57}, {-56,58}, {-56,60}, {-56,61}, {-56,62}, {-56,63}, {-56,64}, {-56,65}, {-56,66}, {-55,59}, {-55,60}, {-55,61}, {-55,63}, {-55,64}, {-55,65}, {-55,66}, {-55,67}, {-54,59}, {-54,60}, {-54,61}, {-54,62}, {-54,63}, {-54,64}, {-54,65}, {-54,66}, {-54,67}, {-54,68}, {-53,62}, {-53,63}, {-53,64}, {-53,65}, {-53,66}, {-53,67}, {-53,68}, {-53,69}, {-52,62}, {-52,64}, {-52,65}, {-52,66}, {-52,67}, {-52,68}, {-52,69}, {-52,70}, {-52,76}, {-52,77}, {-52,78}, {-52,79}, {-52,80}, {-52,83}, {-52,84}, {-52,85}, {-52,86}, {-52,87}, {-52,88}, {-52,89}, {-52,90}, {-52,91}, {-51,49}, {-51,62}, {-51,65}, {-51,66}, {-51,67}, {-51,68}, {-51,69}, {-51,70}, {-51,76}, {-51,77}, {-51,78}, {-51,79}, {-51,80}, {-51,83}, {-51,84}, {-51,85}, {-51,86}, {-51,87}, {-51,88}, {-51,89}, {-51,90}, {-51,91}, {-50,62}, {-50,63}, {-50,64}, {-50,65}, {-50,66}, {-50,67}, {-50,68}, {-50,69}, {-50,70}, {-50,76}, {-50,77}, {-50,78}, {-50,79}, {-50,80}, {-50,83}, {-50,84}, {-50,85}, {-50,86}, {-50,87}, {-50,88}, {-50,89}, {-50,90}, {-50,91}, {-49,62}, {-49,64}, {-49,66}, {-49,67}, {-49,68}, {-49,69}, {-49,70}, {-49,76}, {-49,77}, {-49,78}, {-49,79}, {-49,80}, {-49,83}, {-49,84}, {-49,85}, {-49,86}, {-49,87}, {-49,88}, {-49,89}, {-49,90}, {-49,91}, {-48,64}, {-48,67}, {-48,68}, {-48,69}, {-48,70}, {-48,71}, {-48,76}, {-48,77}, {-48,78}, {-48,79}, {-48,80}, {-48,83}, {-48,84}, {-48,85}, {-48,86}, {-48,87}, {-48,88}, {-48,89}, {-48,90}, {-48,91}, {-47,64}, {-47,65}, {-47,66}, {-47,67}, {-47,75}, {-47,76}, {-47,77}, {-47,78}, {-47,79}, {-47,84}, {-47,85}, {-47,86}, {-47,87}, {-47,88}, {-47,89}, {-47,90}, {-47,91}, {-46,62}, {-46,66}, {-45,64}, {-45,66}, {-44,64}, {-44,65}, {-44,66}, {-43,65}, {-43,66}, {-43,67}, {-43,75}, {-43,76}, {-43,77}, {-43,78}, {-43,79}, {-43,84}, {-43,85}, {-43,86}, {-43,87}, {-43,88}, {-43,89}, {-43,90}, {-43,91}, {-42,63}, {-42,64}, {-42,66}, {-42,68}, {-42,69}, {-42,70}, {-42,71}, {-42,76}, {-42,77}, {-42,78}, {-42,79}, {-42,80}, {-42,83}, {-42,84}, {-42,85}, {-42,86}, {-42,87}, {-42,88}, {-42,89}, {-42,90}, {-42,91}, {-41,64}, {-41,66}, {-41,67}, {-41,68}, {-41,69}, {-41,70}, {-41,76}, {-41,77}, {-41,78}, {-41,79}, {-41,80}, {-41,83}, {-41,84}, {-41,85}, {-41,86}, {-41,87}, {-41,88}, {-41,89}, {-41,90}, {-41,91}, {-40,63}, {-40,64}, {-40,65}, {-40,66}, {-40,67}, {-40,68}, {-40,69}, {-40,70}, {-40,76}, {-40,77}, {-40,78}, {-40,79}, {-40,80}, {-40,83}, {-40,84}, {-40,85}, {-40,86}, {-40,87}, {-40,88}, {-40,89}, {-40,90}, {-40,91}, {-39,49}, {-39,62}, {-39,63}, {-39,65}, {-39,66}, {-39,67}, {-39,68}, {-39,69}, {-39,70}, {-39,76}, {-39,77}, {-39,78}, {-39,79}, {-39,80}, {-39,83}, {-39,84}, {-39,85}, {-39,86}, {-39,87}, {-39,88}, {-39,89}, {-39,90}, {-39,91}, {-38,62}, {-38,63}, {-38,64}, {-38,65}, {-38,66}, {-38,67}, {-38,68}, {-38,69}, {-38,70}, {-38,76}, {-38,77}, {-38,78}, {-38,79}, {-38,80}, {-38,83}, {-38,84}, {-38,85}, {-38,86}, {-38,87}, {-38,88}, {-38,89}, {-38,90}, {-38,91}, {-37,62}, {-37,64}, {-37,65}, {-37,66}, {-37,67}, {-37,68}, {-37,69}, {-36,61}, {-36,62}, {-36,63}, {-36,64}, {-36,65}, {-36,66}, {-36,67}, {-36,68}, {-35,59}, {-35,60}, {-35,64}, {-35,65}, {-35,66}, {-35,67}, {-34,57}, {-34,58}, {-34,61}, {-34,62}, {-34,63}, {-34,64}, {-34,65}, {-34,66}, {-33,56}, {-33,57}, {-33,58}, {-33,59}, {-33,60}, {-33,61}, {-33,62}, {-33,63}, {-33,64}, {-33,65}, {-32,56}, {-32,64}, {9,77}, {9,78}, {9,79}, {9,80}, {9,81}, {9,82}, {9,83}, {10,77}, {10,78}, {10,79}, {10,80}, {10,81}, {10,82}, {10,83}, {11,77}, {11,78}, {11,79}, {11,80}, {11,81}, {11,82}, {11,83}, {12,78}, {12,79}, {12,80}, {12,81}, {12,82}, {13,78}, {13,79}, {13,80}, {13,81}, {13,82}, {14,78}, {14,79}, {14,80}, {14,81}, {14,82}, {15,75}, {15,76}, {15,77}, {15,78}, {15,79}, {15,80}, {15,81}, {15,82}, {15,83}, {15,84}, {15,85}, {17,75}, {17,76}, {17,77}, {17,78}, {17,79}, {17,80}, {17,81}, {17,82}, {17,83}, {17,84}, {17,85}, {18,78}, {18,79}, {18,80}, {18,81}, {18,82}, {19,78}, {19,79}, {19,80}, {19,81}, {19,82}, {20,78}, {20,79}, {20,80}, {20,81}, {20,82}, {21,77}, {21,78}, {21,79}, {21,80}, {21,81}, {21,82}, {21,83}, {22,77}, {22,78}, {22,79}, {22,80}, {22,81}, {22,82}, {22,83}, {23,77}, {23,78}, {23,79}, {23,80}, {23,81}, {23,82}, {23,83}, {69,94}, {69,95}, {69,96}, {70,93}, {70,94}, {70,95}, {70,96}, {70,97}, {71,92}, {71,93}, {71,94}, {71,95}, {71,96}, {71,97}, {71,98}, {72,92}, {72,93}, {72,94}, {72,95}, {72,96}, {72,97}, {72,98}, {73,92}, {73,93}, {73,94}, {73,95}, {73,96}, {73,97}, {73,98}, {74,93}, {74,94}, {74,95}, {74,96}, {74,97}, {75,94}, {75,95}, {75,96}, }, + ["deepwater"] = {{-57,55}, {-57,56}, {-56,54}, {-56,55}, {-56,56}, {-56,59}, {-55,53}, {-55,54}, {-55,55}, {-55,56}, {-55,57}, {-55,58}, {-55,62}, {-54,52}, {-54,53}, {-54,54}, {-54,55}, {-54,56}, {-54,57}, {-54,58}, {-53,51}, {-53,52}, {-53,53}, {-53,54}, {-53,55}, {-53,56}, {-53,57}, {-53,58}, {-53,59}, {-53,60}, {-53,61}, {-52,50}, {-52,51}, {-52,52}, {-52,53}, {-52,54}, {-52,55}, {-52,56}, {-52,57}, {-52,58}, {-52,59}, {-52,60}, {-52,61}, {-52,63}, {-51,50}, {-51,51}, {-51,52}, {-51,53}, {-51,54}, {-51,55}, {-51,56}, {-51,57}, {-51,58}, {-51,59}, {-51,60}, {-51,61}, {-51,63}, {-51,64}, {-50,50}, {-50,51}, {-50,52}, {-50,53}, {-50,54}, {-50,55}, {-50,56}, {-50,57}, {-50,58}, {-50,59}, {-50,60}, {-50,61}, {-49,50}, {-49,51}, {-49,52}, {-49,53}, {-49,54}, {-49,55}, {-49,56}, {-49,57}, {-49,58}, {-49,59}, {-49,60}, {-49,61}, {-49,63}, {-49,65}, {-48,50}, {-48,51}, {-48,52}, {-48,53}, {-48,54}, {-48,55}, {-48,56}, {-48,57}, {-48,58}, {-48,59}, {-48,60}, {-48,61}, {-48,62}, {-48,63}, {-48,65}, {-48,66}, {-47,50}, {-47,51}, {-47,52}, {-47,53}, {-47,54}, {-47,55}, {-47,56}, {-47,57}, {-47,58}, {-47,59}, {-47,60}, {-47,61}, {-47,62}, {-47,63}, {-46,50}, {-46,51}, {-46,52}, {-46,53}, {-46,54}, {-46,55}, {-46,56}, {-46,57}, {-46,58}, {-46,59}, {-46,60}, {-46,61}, {-46,63}, {-46,64}, {-46,65}, {-45,50}, {-45,51}, {-45,52}, {-45,53}, {-45,54}, {-45,55}, {-45,56}, {-45,57}, {-45,58}, {-45,59}, {-45,60}, {-45,61}, {-45,62}, {-45,63}, {-45,65}, {-44,50}, {-44,51}, {-44,52}, {-44,53}, {-44,54}, {-44,55}, {-44,56}, {-44,57}, {-44,58}, {-44,59}, {-44,60}, {-44,61}, {-44,62}, {-44,63}, {-43,50}, {-43,51}, {-43,52}, {-43,53}, {-43,54}, {-43,55}, {-43,56}, {-43,57}, {-43,58}, {-43,59}, {-43,60}, {-43,61}, {-43,62}, {-43,63}, {-43,64}, {-42,50}, {-42,51}, {-42,52}, {-42,53}, {-42,54}, {-42,55}, {-42,56}, {-42,57}, {-42,58}, {-42,59}, {-42,60}, {-42,61}, {-42,62}, {-42,65}, {-42,67}, {-41,50}, {-41,51}, {-41,52}, {-41,53}, {-41,54}, {-41,55}, {-41,56}, {-41,57}, {-41,58}, {-41,59}, {-41,60}, {-41,61}, {-41,62}, {-41,63}, {-41,65}, {-40,50}, {-40,51}, {-40,52}, {-40,53}, {-40,54}, {-40,55}, {-40,56}, {-40,57}, {-40,58}, {-40,59}, {-40,60}, {-40,61}, {-40,62}, {-39,50}, {-39,51}, {-39,52}, {-39,53}, {-39,54}, {-39,55}, {-39,56}, {-39,57}, {-39,58}, {-39,59}, {-39,60}, {-39,61}, {-39,64}, {-38,50}, {-38,51}, {-38,52}, {-38,53}, {-38,54}, {-38,55}, {-38,56}, {-38,57}, {-38,58}, {-38,59}, {-38,60}, {-38,61}, {-37,51}, {-37,52}, {-37,53}, {-37,54}, {-37,55}, {-37,56}, {-37,57}, {-37,58}, {-37,59}, {-37,60}, {-37,61}, {-37,63}, {-36,52}, {-36,53}, {-36,54}, {-36,55}, {-36,56}, {-36,57}, {-36,58}, {-36,59}, {-36,60}, {-35,53}, {-35,54}, {-35,55}, {-35,56}, {-35,57}, {-35,58}, {-35,61}, {-35,62}, {-35,63}, {-34,54}, {-34,55}, {-34,56}, {-34,59}, {-34,60}, {-33,55}, }, + ["water-shallow"] = {{12,77}, {12,83}, {13,77}, {13,83}, {14,76}, {14,77}, {14,83}, {14,84}, {18,76}, {18,77}, {18,83}, {18,84}, {19,77}, {19,83}, {20,77}, {20,83}, {68,94}, {68,95}, {68,96}, {69,93}, {69,97}, {70,92}, {70,98}, {71,91}, {71,99}, {72,91}, {72,99}, {73,91}, {73,99}, {74,92}, {74,98}, {75,93}, {75,97}, {76,94}, {76,95}, {76,96}, }, + }, + blueprint_strings = { + { xadj = -2, yadj = 14, force_override = "ignore", + string = "0eNqcvdvOLcl1ZvcudS02Vmac9SqGYagl2iKgZjVICnKjoXc32Qb4L9ocEfGNy71Re9Q3V2ZEZMzj//zlv/7bv//2v//hd7//0y//+D9/+d0///r7P/7yj//b//zlj7/7v37/T//2l7/70//477/95R9/+d2ffvvffvmHX37/T//tL3/6459+/f1vf/Mf//Rv//bLf/7DL7/7/b/89v/+5R+f//zf/+GX3/7+T7/70+9++/9S/tcf/sf/8ft//2//9bd/+PN/8Hf+/W/+8O+/+/2fwf/91z/++d/9+vu//C//wvp81n9p//DL//jlH3/zvP2/tP/8z3/4//HehPc8R16JeJ8jr0a8cuS1iPceeT3i1SNvRM93/PDq3+fNiDePvGXfv/b3ec/HCiRgtEKedga+9hETMFsj4wzMFkk/A7NVcvGUs2Vy8ZSjdfI+x/f6iRbK+zkDlwWCyW+0Ut5yVPhGK+V9z8BopbztDIxWylvPwGilvP0MjFbK58vkF4DRSvn0M1CfKAWA0yokYLZSzgrLxz5lAmYrZZ2B2UqZZ2C0UspzBkYrpXzOwGillHJ8sUu0Usp7Bg4LJJOjlVLOm0OJVkqpR2CNVkoZZ2C0Usp5+6rRSinzDIxWyufrPfwAMFopn3oG6jPlAWC3CgmYrZR1Bk77lAkYrZT6HIEtWin1cwZGK6WWMzBaKfU9A6OVUtvxxW7RSqnnldKaBZLJ0Uqp46wwWim1n4HRSqnrDMxWyjwCe7RS2ucMzHxeP2v5L/fIvwuMVsrnPQPtmfKXq/PfBVarkIDRSmnPGdjlU0ZgtFLaxW8YrZR28RtGK6W1I3BkK6WegdFKaeP4Yo9opbR+BhYLJJOjldLWWWG2UuYZGK2Uft6+RrRS+ucMjFZKP++HI/MSfykEr/j82CNgAPCxCgkYrZRezsBiHwoBo5XS2xkYrZRez8BspYwzMFsp/QzMVso6v9jRSunzCFwfCwSTV7RSxnNWGK2Ucd4cVrRSRjkDo5Uy3jMwWimjnoHd7ocU1hsWCNGKNe0GS8BlP4kpQPOJlspoR4nP57HPGYnZYhkXxGy19AtitlzWBTFbL/OCGC2Y+Vy8PdGKmZ8L4rREtDpaM7OcNWbh+nmxCrN4/WwXxGjNzHpBjNbM7BfEaj0GLxGbJRYidrvjIjFbM+OCOO2TQWK2ZtaZmAXu57wgRmtmPRfEaM2szwUxWjPr4g3PgvfrvSA2S0SrozWz2oXGaM2sekGM1swaF8Rozax+JmYh/LUuiNmamRfE1+64HyJqP/JDxGp/R9TYLBE1dmn1ZxJxWOIi4pS7GWtclkgas2D+196DGrNo/tfew8TXakSri9WIxCp3M7a6WSJq7HIVssZhiagxWDPrG9gJuCRwUJqrdSsz0fqVmWhPGSYW+V3PxCrvcPios8j+1x2OiV3ePZg45N2DifqUwSez7H5LGrPw/rp4Mll8/1sjWZ0F+L81IrHYHRyJ9suMf0f7ZcYakzXzfO+PqHFExM8FcUbEckFcEfE9E6NA//O5WIVRpP/5XKzCKNT/tItnHcX6/4ZI72MU7H/axbOOov1Pu3nW3WpEq4fViMRozbSb9zFaM+3ifYxC/k+7OK+jmP/TLs7rJOj/Nx+kWIRUJJAiAFN/mSFRf5khUX+Z4c+ov8yQOK1GtHpZjUTMQv/z4nXMYv9fnmsmvlYjWl2sRiRW6V1nq5v0rjOxW41o9bAakahvM2j1kv56Ir4f7TNDovaZIVH7zLCSVPvMkFjtFy4Soy+zz7ggZreZfkHMbjPrgpjdZuYFMfoye8672RvlAPwNkTRGOQDP87kgRreZp1xYHd1mnou9J8oBeJ6LvSfKAXiei70nygF4nnFBjNbM0y+I094zkZjdZs7n9ft+rEZ6w9/H3jNR42vvmUgsViNaXa1GJDZ7F0aru70LI3FYjWj1tBqRuOx9HZs/fOx9HYmP1UhWl9dqRGK2ZtaF1dmamRfEZjWi1d1qRGK0ZvrFqRDlADz94lSIcgD+RiNZHeUA/I1GJEZrpl+cM1EOwNMvzpkoB+DpF3t4lAPw9Is9PMkB+BvXHvV1SVIA/gZIbVjCDIDngjitTwGJOmuGfsYsB+CbSBqzHIBvLwUSdTwTrS7Wp4Aaq9WIxGbvHkjMbjMXa6Zlt5l5QYxOmfdiFUY5AM97sQqjHIDnvViFUQ7A3xBRY3TKvBerMMoBeL7am7HV0SnzXqzrKAfg+eqlxcRozXw102JitGbei6MwywH4aqfFxGXv69iG7WN9Ckh8rEZ6w8McgIudYmgPAFqtPQBIbFYjWt2tRiT+f9fM//nvf/j9P/3zb//+/f+vFv99lo7+ozod/ccegzr6T0/ZR/+R+FqNaHWxGpFY7U0drW72po7EbjWi1cNqROK0N3W0etmbOhHXx2rExpyP1YjE13oT0OpivQlIrFYjWt2sRiR26/FAq4f1eCBxWo1o9bIasVNstmbO50z5ZGumXxBfqxGtLlYjErM1sy6sztbMvCB2qxGtHlYjEqM1M54Lq6M1M87nTMni/+O9ID7SlfkhoE3MfAhoq5lZoq1mZmKzGtHqbn16qNFWM7PGab0JSIxWzFcvbSRm0f+vZtpMjE6ZcvGss+j/V/drJkanzFf7a3x7suj/NxE1RqdMuXgfs+j/V0tttjo6Zb56ajMxWjPlYsPNov9fDZyRmEX/vzo4MzFaM18tnJkYrZl68TsWXTODxGp9ekhsViOtmTD6f7E/ZtH/dnFeZ9H/dnFeZ9H/drGHZ9H/drGH//+i/zu/4/or7e+zXuufQHXF+ieQqO/+9JRrs0TU2K03AYnD3tTR6mlv6khcViNZ3T5WIxIfe1Mnq9trb+pILFYjWl2tRiQ2e1NHq7u9qSNxWI1o9bQakbisN4GsziL/4+JrIov8j4tTIYv8j4tTIYv8j4uzP4v8j4s9vLv8sjWJ59LL1iLecN4JFjidA4WBMrcMTc76+38pRKCsLWPg6y5ZDIxWSj0/5SzcX89POYv214un3KVCBEYny8/cHTY5Olh+xuQwcEkgmZyF+3/m7qDCLNr/M3eHgfKqz8BspcwzsEqF+FDkPZ8Vyms+A4dUiCZPqRCB8o6PJi95xWegrCNDk5csI2Pgz0r53R9+/f1v/vlff/vHP+0Ti9haeb9ncc1dpxgoo5RssryosEJ5T2GgvKaQyfUjbykMlJcUMrl+5B2FgfKKwibLGworlBeUTjx5QRnEk+UvLFD2v2CgbH+BwEfWvuBv+MjSFwa+8msdTS7yax2BVSpEk5tUiMAu7xNo8pCf/wicUiGabC8oBHztBYVMfu0FBYGvVIgmF6kQgfaCgiY3eYVCYJcK0eQhFSJQ9rpgk2WrCwQW2ekCTQ6L9j9n4CtvPGhykTceBMo+l2yybHPJwO5qSNjk4UpIGCirXNhkWeSCwCprXNDkKktcGCgrXNhkWeDCQFnfwibL8hYG9lvvxXn3/4rT/y/Wf/z6678wsJ93/ypbWjBwSf8KAcMg/XkrDGP05zcmDNGfPxqyCP04P+UsQD/OTzmLz4/zGZ+F58f5jE+i89/OgUa86SZFMFCOSEZg1pf/pw/6qgR8JBAVvm7uBAOL9NigybLzKyuUKfmssEsHCwJtWB5NtmF5BMoRFmjykBMsGPi44RAMtF4v+g2H9XohsEoHCwLtXR5/Q3uXR4X2Lo9Ae5dHoL3LEzCswj9vX2ER/nn7mvYujybbuzwCq7yHoslN3kMRaO/yaLK9yyNwynsomrzkPZSAy97lyeRl7/IIfOVNGU0u8qaMQHuXR5PtXR6B3VUwsMlD3r8RKPtUsMmyTQUB28de6CsBH1cOwUDZo4JNli0qGFhdLQSb3FwpBAO7qwlgoM1iQaDNYkHgkgrpKYd19sfdpmVt9sfnDHylQjS5SIUIrNKJ8RKwSWAhoJzkwkB7o0egvdEj0N7o6aG8cooLKnxtoj0CXzdznU2WAykZWKVCNFkOPWagnHnMJg83Ep6BUypEk5dUSMAsOv/lxyaTs+j8lx8bga8EosnFDQhlhdXNB2Vgc8M8Gdil/xCBQ/oPETilQnzKSyokYBadr+dDKovO1/NTzqLz9XxIZdH5ej6ksuh8PW+w1eaxoMldullQ4ZCOIFQ4pUIELulmIWAWom/nQyoM0Z8PqSY7T7BC2XiCgbYuBU2WLScZ2KVCNHlIhQiU/SbZZNluEoFZ9Xw/31Oy4vl+PgK67DfBJstWk6xQdppkhbLRJANtBReaLNtMMnBKNwuaLJtMosJhs1k+BLTZLA8BX3nXQ2CRVzMEVnmTQmCTNyl8KF0CUeGQVzMETjfXlk1e8q5HwCxG/6WQTM5i9F8KEfi6Sb5scnGDfBlYpUI0uUmFCOxu0jCbPNygYQbKycVsshxcjAqzGP3PlGEGPrJ7CgJt3hcCbd4XAm21Iz3lZasdEdilVwRNttWOqHBKrwgqXDLVDRT2LEZf5xkoRxUx0OZ9fQho874QKOcUsclyUDErtL4vBMqRq2zylJdHVLgkkBRmMfp+PJd7FqPv8wy05SlocpEKEWjLU9DkJoGosLvL45wEHBK4CDjdFywDl/vgRGBWQf/zfcjAx30fMvB134cMLO77EF+bsIL+cwY2qRBNlpFHVigjjwyUkUc2WUYeEVhkrwk0OWx8f94cwr7357Vs296zyfLri4Ey8sgmdxcoZIXDfc4xUGbds8ky6x6BYQX9OpocVtDPM1Bm3bPJMuuegdV9tLPJzcVGGSiz7tlkmXXPwOm+sdnk5b6xEdjkPQVNbvKewsBXfhJ3AhYJHATMconbWWGWS1zPwOyeMs7A7J7Sz0A5eYiBS37BEjCL0X99YyNQeonxPcxi9F8KESi9xGyybNrNCpv8gkWF3TU3Y+CQCtFkWR3MCuVIe1QYTrQ/74fhQPt2VvjKD04EFvkpgiZX+SmCwCYVosldKkTgcIlkbPJ0iWQMlE2M0OQsRt/P+2EWo+/npZfF6Pv5UySL0ffzWs5i9F8KESg7d7PJsuaRgUMqRJNlPIWBsuYRTQ5n2M8zULb7QpPDCfbzDCzyo70SsEpgI2BzKUassLsUIwYOqRBNnlIhApcM0IDJI4vRf13NEPjIiA8CXxnxQWCRARoEVnkbRWBzY3AZ2KXCRsAhFSJwyustmrzk9ZaAj5wkjCY/cpAwA9+kr+dXTApNtjd6BNobPZrc5AUcFdobPSocrpsWK7Q3elQo+30h8LU3ejI5i9G3ega+UiGaXGSABhXKLkas0N7oUaG90SNQ5n2xybItMQPtjZ5MLrKLESossosRA195AUeTi7yAI1B2MWKTZRcjBtp4ykvAIYGFgLI+hRXK+hQEVlmfgiZXWZ/CQFmfwkBZn8LAKq9m+FCaBKLCLu96CBwyuw9NnvLyiEBZn4ImN1mfwsAsQ7IcTc7q6J/3DCxSIZpcpUIERivlOW+wWR39c95gszr657wfZjH653zqZTH6px+BWYz+mWfgI90s9Bt2OVibFdpcYlRoc4kRKAdrs8lysDYDh1SIJk+pEIHLNR1Ck7MYfT3vNlmMvp4/54bsYsTAEjnTzp9zYa/78344rO8Lgdb3hSYPV1HICmXNIwOt74uAYa/78344re8LgTaXGE22ucQItL4vNNn6vlCh9X0h0Pq+0GTr+0Lgkj4HKK8b6yOBDwEf6SJAha90ESCwSIVocpUKEdjkTQqBXV58EGjvKQi09xR8yksCQeHMYvRfFx8EZjf6dTJ5ZjH6r5sUAotUiCZXqRCB0Up5n7PJ0Up5P2fgkArR5CkVIjBaKW85mpzF6N/3DHwkkEzO6ujfdlYYrZS3noHRSnn7GdjkXQ9/Q9mbhYE26x5NnhKICpe8mhEwnER/PgLCSfTnIyCcRH8+AsI6+vMREMboz0dAFqNv5yMgi9G38xHw2mwWBE7XgYdNXrLCmoBFTq9Dk4ucXsdAm82CJhfpc0BglUA0uUkXASrs0omBwCEVoslTKkSgnMmFJmcx+n7ebbIYfT/vNvV1PocxCSiz7sciYJR1/1wojKqDf25SDIyyWX5uUgyMsll+7ikMjOan/Hy0MzDyff18tCMwitF/fj7aGRj1JX7Pr01WR/+en3JWR1/OTzmroy+fMzBaKaWcgdFKKRdPOVop5eIpRyul9DMwWinl/Npk8+jr2eRsHn09m5zNo6/nIyCbR/+lEIHVuZ3ZZDlpiIFdKkSTh1SIwOmcaQyUvi8EDun7YuDjXFX4lIf0fbFC6ftiYOb7Ou82WYz+Pe82WYz+Pe82WYz+Pe82WYz+PX9wZjH6i0+RLEb/pZBMzmL0XwoRGK2Ui4+lLEZ/8bGUxei/gGhyVvN4/vrKYvTlfAvIYvQXn3NTVnLxbyizWRC4pO+LgdL3xUDp+8KHsqTvi4FVKkSTm1SIQNlDkk2W0+tY4XTONFa4nDONgOsje0iSyesje0gyUE6vY5Pl9DoGyi5GbLKcXscKZSXXGATMKrnWGRjd6H8qaBgY3eh/6lMQGMXoPz/1KQyMbvQ/OUsMjG70P9UfDIxu9D9JUAzMvMT1DGzS7dwJ2CUQFUYr5ScJioFTOsbR5CUd4wTM5tE/580hm0f/nDeHbB79l1cETY5Wyk+KEQOrVIgmN6kQgdFK+XIEoclDhj8QOKVCNHlJhQQsHxmgIZPLIwM0CHylQjS5SIUIrDKEhCZnK6WfgV0qRJOHVIjAbKWcz5SyZBiOgPUjFZLJ9ZEKEfjKQCGaXGSgEIFVKkSTm1SIwC5DmWhyFnk8nylZjL6cz5QsRl/OZ0oWoy/nMyWL0ZfzmZLF6Mv5TAlj9OczJYzRn8+UMEZ/PlPCGP35TAlj9OczJYzRn48AHaMnhTpGTwp1jB6BNkaPJtsYPQKjlVLPXw5RjP5Tz69NFKP/BqLJ0Upp53M5i9F/zqdeFqP/nA+pIbsYocIhuxgx8JUK0eQiFSKwyugtApsMtiKwy9goAoeMjeJTnhKICpcMthIwi9FffH1lMfqLr68wRn9eKWGM/rxSwhj9+VwOY/TnczmM0Z/P5TBGfz6Xp5w0xCYv1zkZgVmM/uJzzs6jZ4Vy0hADZV9iBlYZsMbfUNanMFDWpzBQdpzg31B2nGDgkgrB5OeTBen754L4uAauZPSfia+MWTOxSI1sdZUamdhcE9eN1d11cd0QhySy1dNNZtlolJPpmRiG6380ViQ+MqzJxFfGNZlYpMaGxCo1MrFJ1xVb3aXviom2YoWttiUrTLT+MLT6tQ4x1PhajxgTX+lwYquLJLLGKl1OTGzS58RWd0lkjUN6nVijdYyxxiXdRKgxK7P/8hMxUfYDY6uLbAi2IRZ5AWaiHEa0IcppRBtilzdMftZDElnjlJdWJi7XN5atzgruv+7BTHykRrQ6a4v/pZGJxfUT2lhdXUOhDVH2PNpYLZsebYiy69HG6um6FG2Isu8RW91k4yPW2GTnow3xlXU8TLQ+AP4d5diVDVHOXdkQu7xf8+845P2aidYHwFZbHwASs0b5/WLNZJ3y+8WayVrl94vvnqxXfr/47skK8cfFd09WiT8udoqsFH9cfPdktfjj4rsnC/SPi++evqSXqxBx2OT9F4k2e5+Jr9TIVhepkYk2hYyttjlkTLRJZGy1zSJjok0jY+KS/h78HedHElFjFPX/fJVYs8ZX+nuYWKRGtrpKjUxs0oPEVndJZI1yevdGoxzfvSFavxlavazfjIlyNsuG+MqbJhOLvBcyscp7IT7rLAfgZjfLkgDqxR4eVupf7I9hqf7F/hjW6p/3x+cjh7RsiI9slPEi8ZWdMphYpEa2ukqNTGyyWQZb3WW3DCYOSWSrp0w/Yo3Zmjl/4z6P9QGg1Vlv/XGxrrPm+uNiXWfd9cfFus7a64+LdZ311x8X6zprsD8u1nXWYX9crOusxf64WNdZj/1x/u55sib742KnCCv4f3aKDxJfSXyQaHNnWKPNnWGi7YrMVtu2yEwcsmScrZ6yZpyJtjMyWl1sa2QmPrJcF63Oivm/CjyYaLsjs9W2PTITbb4ZW23zzZho883YaptvxkSbb4ZWZ0X95WLvyar668UeXm2+GWu0fjPWaP1mTGxSI1tt882YmNVhlgurozXzdS9k4pIa0eqsvP9LIxMzX/PFeZ0V+LeL8zqr8G8X53VW4t8uzuusxr9dnDNZkX+7OGeyKv92cc5kZf7t4pzJ6vzbxR6eFfq3i5Mrq/RvF6dCVurfLs7CrNa/X5wzWbF/vzhnsmr/fnHOZOX+/eKcyer9+8U5E+UBfPrFOZPlAfSLcybLA+gX50yWB9AvzpksD6BfnDNZHkC/OGeyPIB+cc5keQD94pzJ8gD6xTmT5QH0i3MmywPoF+dMlgfQL86ZLA+gX5wzWR5AvzhnsjyAfnHOZHkA4+KcyfIAxsU5E+UBfGtkq7vUyMRozYyLcybKA/iMi3MmygP41ohWR3kA3xqZGK2ZcXHORHkAn3FxzqwiNbLVVWpkYrZmLs6Zla2Zi3NmDamRrZ5SIxOzNXM+Z95PtmbmBfGRGh8kvlIjE6M1M58Lq6M1Mz8XxCY1stVdamRitGZmubA6WjPzvSAuqRGtzvoBzPeCGK2ZeT5n3qwfwKwXxCI1stVVamRitmbGhdXZmukXxCE1stVTamRitmYuzpmsH8C8OGeyPIB5cc5keQDz4pzJ8gDWxTmT5QGsi3MmywNYF+dMlgewLs6ZLA9gXZwzWR7AujhnsjyAdXHOZHkA6+KcyfIA1sU5k+UBrItzJssDWBfnTJYHsC7OmSwPYF2cM1kewLo4Z7I8gHVxzmR5AOvinMnyANbFOZPlAayLcybLA1gX50yWB7AuzpmsH8Dn4pzJ+gF8Ls6ZrB/A5+KcyfoBfC7OmWr7zrDVWf3MxTlTbUdmtDrrB/C5OGea7TuDVjfbd4aJRWpkq6vUyMQm6xWY2GW9AhOHrFdg4pTVBUxcsroAiVk/gItchbfbaZdMfGU2N66ZrB/Ahff6DfsBXLw9YT+Ai7eny0F+fSFRTvLbEOUovw1RzvJjYpYH8DM3bkN83PiXDfF12bMbYnHZsxtiltd88azDfgA3z7q7dd0nEodb1xvilBrZ6iU1InHK3rO9I/GRew8TZQ+NDVH20NgQq9x7mNjk3sNE2UNjQ5Q9NDbEKfceJspaACZm/QDGxZPJ+gF8rWsmym+zPpAov802xCr3nopEOWO5NyR2ufewxiH3HibabzO22n6bEbF85PhYtLp85PzYDVEOkN1YLSfIbohyMObGajkZc0PsUiNbPaRGJk55FrLVS56FSMzyAMp5NytZHsCXRia+8nRlq4skssasx/nFmsnyAH56+G6I2ei/94IYrZl6seNmeQD1YsfN8gDqxSoM5wJcrMJX1mluiK/rub8hyjrNDVHWaW6IzdUXbojd1RduiMPV7m2I09XubYjL1cUxMcsDaBdrpsiasw1R1pxtiLLmbEOUNWcbYnO1Uhtid7VSG+JwdUgb4nR1SBvicjU+TMzyAPrFmqmyfmZDlPUzG6Ksn9kQZf3Mhthc3ceG2F3dx4Y4XE3FhjhdTcWGuFy9AhOzfgDjYs00WQuwIcpagA1R1gJsiLIWYENsLod9Q+wuh31DHC4/fEOcLj98Q1wu95qJWT+AebFmusxr3hBlXvOGKPOaN0SZ17whNpePuyF2l4+7IQ6X67ohTpfruiEul0fKxCwPYF2smSFzNDdEmaO5IcoczQ1R5mhuiLLH+YbYXW7hhih7nG+Issf5hhjlATwXzzrKA/izyAtiFNN8Lp51lAfwPBfPOsoDeJ6LZx3lATzPxbPO5gI8FzGkbC7ARdy1ZHMBnosdN5sLcBHJLdlcgItIbsnyAC4iuSXLA3gv1nWWB/BerOssD+C9iMVlcwHei50imwvwXuwU2VyAL41sdbRmbuLX2VyAm2hzNhfgPa+Zms0FeM+5CjWbC3AREa/ZXICLiHjN5gJcxK9rNheglAuN2Qza94LYpUa2OlozpV1ojNZMqRfE5eYNMzGbC3CRWVCzuQAXeQA1mwtQLnaKbC7ARWZBfeTc5o3Vzc1E3mjsbibyhjjcvOENcbp5wxvicnN8mJjNBbiIsdf3cTNyNkQ5g3ZDlPNnNkQ5f2ZDlPNnNkQ5f2ZDHK6ea0Ocrp5rQ1yunouJJZs/c/GGl2wG7cUbXl43ZXlDzGbQXrzhRc5t3hDl3OYNUc5t3hDl3OYN0dbPMNHWzyCx2loA/KaothaAiXL+TH+RKOfPbIhy/syGKOfP9IJEOX9mQ5SzNDZWy1kaG+KSGtHqLA/gSyMTH5kzjFZneQBfX/asscicYSZWmTPMxCZzhvl37DJnmIk2r5mttnnNTLR5zUjsNq+ZiTavmYk2r5mJNq+ZiTavmYk/a+Z3f/j197/5j19//Zff/PO//vaPfzpkIeMbnuUBfN3imCjnz2yslvNnNsQlc6+RmOUBtIt1neUBtIt1neUBtIt1nfUDaBffZlk/gHaxU2T9ANrFThHOBbjYKcK5ABc7RTgX4GIVhnMBLlZhOBfgYhWGcwEuVmE4F+BiFWb9APrFKsz6AfSLNZP1A+gXayacC/Ccd4pwLsDFKgznAlyswq88gIvzelyc1+FcgIt1Hc4FuFjX4VyAi3UdzgW4WNfhXICLdR3OBbhY1+FcgIt1Hc4FuFjXWT+AebEKs34A87wKW9YPYJYL4iMzzpn4yoxzJhaZcc7EKjPOmdhkxjkTu8wPf5E4ZA47a5xSIxOXzGFHYtYPYF2swqwfwLpYhVk/gHWxCh/Zr3lDlP2aN0TZr3lDlP2aN8Qhc9hxFWb9ANbFKsz6AayLVZjlAXzlsKPVWR7A52JdZ3kAn4t1/ZUHcP7G/c6KZ6urzNxnjU1m7jOxy8x9tnrIzH0mTqmRrV5SIxKzPIDnfC9sWR7Ac7EKszyA52IVZnkAz8UqzPIAnnJhdZMVEEzsUiNbPaRGJk5ZpcFWL1lTgcQsD+C5WNdZHsBzsa7rK2sq2Ooi6z6YWKVGtrpJjUzsspKErR6ykoSJU2pkq5fUiMRsLsB7cc5kcwHei3MmmwvwXpwzzdbPMNHWz7DVtn6GibZ+hq0eUiMTbf0MW70kETV2Wz+DGrO5AO/FTpHNBSgX67rb+hkmVqmRrW5SIxNt/QxbPWSNDxOn1MhWL6kRieMjq4bQ6vHIqiEmvlIjW12kRiZWWdnEVjdZh8TELjWy1UNqZOKUdUhs9ZK1UkjM+gGUi1Mh6wdQLr4fs34A9eKcyfoB1ItzJusHcJFH2rJ+APXinMn6AdSLcybrB1AvzpmsH8BF9mzL+gFcZM+2rB9AvVjXWT+AerGus34AF1mfLesHcJH12bJ+ABdZny3rB3CR9dmWnHO2eTJD1u6xxik1MnHJ2j0i9qwfwEWOZs/6AbTzV0rP+gFcZH32rB/ARdZnz/oBXGRU9qwfwEVGZc/6AVxkVPasH8BFRmXP+gFcZFT2rB/ARUZlz/oBXGRU9qwfwDjfkHrWD2DUC2KRGtnqKjUy0c6feZBo5898kGjnzzDRzp9hq+38GSRmcwHefrY6mwvwXjyZ184GZKKdDcjEKjXyk2lSIxO7rAZkoq0549/R1pwxcUmNaHU2F+BLIxMfWYeEVodzAcqFRls/wxpt/QxrbDLPnjXaWgDWOGSePROnJLLVS2Z9IjGbC7Au3p5qe8/i71htvhlrLJLIGqvMk2KNTeZJMdHmm7HVNt+MiVPmSbHVS+ZJIbHZfDO0utl8Mya+Mk+KrS4yT4qJNt+Mrbb5ZkzsMk+KrR4yT4qJNt+Mrbb5ZkjM8gCei7tClgfwXNwVus03Y6ttvhkTq8yTYmKTeVJM7DIHiYlD5iAxccr8HiYumd+DxCwP4L1YhcPmzjDR5s4w0ebOMNH2nmWi7T3LxC7zKZg4ZD4FE6fMVcAdN8wDuNjDwzyAiz182t6zTHxlZgFbXWT2A2usUiMTbe9ZtrpLImscMleBiTYPgK22eQBIDPMALvbHMA/gYn/UeQBstc0DYGKVGtnqJjUyscuoPVs9ZNSeiVNG7Zm4ZNSeiCPMAxgXxEfG2Jn4yggkE4uMQDKxSo0PEpvUyMTI1/z567P+S9YCEKP4zGddEKP4zGdeELOY5nMmZv0AfrxcG2Lka/7xIG2IWe/Z94KY9Z5tF8Ss92y9IMo8gA0xywPoF8QhNS4kyjyAjUaZB8DELA/gSyNaneUBfGlkYrRm3oudIssDeC92iiwP4EsjW92kRiZGa+a92M2yPID3YjfL8gC+NLLVS2pEYpYH8F7suFkewHux42Z5AF8a2eoiNTKxuhykjdVNElljd1lNG41DEllj1uP8Yn/M8gDKxf6Y5QGUi/0xywMoF/tjNhegXOyP2VyAcrE/ZnMBysX+mM0FKBf7YzYXoFzsj+FcgIv9MZwLcLE/hnMBLvbHcC7AxVdzOBfgYsdtMkdzY7XM0dwQq8t/3FjdJJE1djdfYaNxSCJrnG5iw0bjchMbmBjOBbjYH8O5ABf7YzgX4GJ/zOYC1Iv9MZsLUC/2x96kRiZ2N1ViY/VwUyU2xCk1stVLakRiNhegXuyP2VyAerE/hnMBLvbHcC7AxTduOBfgYscN5wJcfOMOOUtjY/Vwky82xCk1stVLakRiNhegXezh2VyAdrGHZ3MB2sUens0FaBd7eDYXoF3s4dlcgHax42ZzAdqFDyCbC9AudtxsLkC78CrMJTUiMZsL0C/28GwuQL/Yw7O5AP1iD8/mAvSLPTybC9Av9vBsLkC/2HGzuQD9Yn/M5gL0i/0xmwvQL/bHbC5AP++PM5sL0M/748zmAvR+QZTzZzZWy/kzG6KcP7OxWs6f2RC71MhWD6mRidPVxW2sXm6iDROzPIBx3sNnlgcwPhfE183I2Vhd3IycDbFKjWx1kxqZ2N0cn43Vw83x2RCn1MhWL6kRiVkewLg4Z7I8gHFxzmR5AOPinMnyAMbFOZPlAYyLcybLAxgX58wrZzZtrJYzmzZEObNpY7Wc2cTELA9gXpwzWR7AvDhnsjyAeXHOZHkA8+KcyfIA5sU5k+UBzItzJssDmBfnTJYHMC/OmSwPYF6cM2E/gItzJssDmBfnTJYHMC/OmSwPYF6cM1kewLw4Z7I8gHlxzmR5APPinMnyAObFOZPlAcyLcybLA1gX50yWB7AuzpksD2BdnDNZHsC6OGeanHO2sbpIImusbnLaRmNzk9M2xC41stVDamTidNPdNlYvN92NiVkewLrYw7M8gHWxh2d5AOtiD8/yANbFHp7lAayLPTzLA1gXe3jWD+BzseNm/QA+F/tjl3PONhrlnDMmZv0APhd7T9YP4HOx9ww552xjtZxztiFWqZGtblIjE+Wcs43Vcs7ZhjilRrZ6SY1InHLOGVs95ZyzDfGVGtnqIjUyUc4521gt55xtiF1qZKuH1MhE2UNjQ5Q9NJiY9QO4yJ6dYT+Ai1NhyVkaG43FdUHYaKyuC8KG2KRGtrpLjUwcrgvChjhdF4QNcbmeBfhkVtgP4Pw7LjsXYKNRzgXYaCyus/tGo+wHsCHKfgAbYpca+XccUiMTp+xZ0JG4JHEQMewHcEN8ZLU0E19ZLc3EIiuRmVhlBS0Tm6xOZWKX1alMHLKWFN/wLA/gi8gal6wlRY3hXICLNzzLAygX72M4F+BzQSyyqpKJVVYDMrHJSjsmdllpx8Qh6+KYOKX/kd/wJYmosXyktxA1lkcSWeMrfXussUjfHhNlj/ON1bLH+YbYpW+PrR7St8dE2eN8Y7Xscc7E+pG+PbS6PtK3x0TZ43xjtexxviFW6dtjq5v07TFR9jjfWC17nG+IU/r22OolfXtIbLLHOVvdZI/zDfF1fa83VhfX93pDrFIjW92kRiZ215t7Y/WQRNY4XbfvjcYliagxmwtQLs7rbC5AuTivu+xxvrFa9jjfEOWs843Vctb5hihnnW+slrPON8QpYx9stZx1zhqzPIB6sWaGjc+wxldGKlhjkZEKJlapka1uUiMTu4ymsNVDRlOYOKVGtnpJjUicNj6DVmd5AO3iWU8bn2FicTORN1ZXNxN5Q2xuJvKG2N1M5A1xuJnIG+KUkTMmLknEtyfLA+gX3xRZHkC/+KbI8gD6xf6Y5QH0i/0xywMYF6swywMYF6swywMYF6swywMYF6swywMYF6swywMYx1X4frI8gHH0pfyZ+EiNTHxlJLcisUhiQ6LNa2aNTRJZo81rZo02r5k12rxm1mjzmpH42LxmtPqxec1MtHnNbLXNa2aizWtmq21eMxNtXjNbbfOamWjzmtlqm9eMxNfmNaPVr81rZqLNa2arbV4zE21eM1tt85qZaPOa2Wqb18xEOU9zQ5TzNJlY5DzNDVHO09wQra+ZidbXzETra8Y3vFhfMxOtr5mttr5mJlpfM1ttfc2osVpfM2qs1tfMGq2vmTVaXzMTra+Zrba+ZiZaXzNbbX3NTLS+Zrba+pqR2KyvGa1u1tfMGq2vmTUWSWSN1tfMGpskssYuva6scUgia5zSR8oal/QWIjHLAxgXaybLAxgXO26WBzAuVmGX8zQ3Vtv6GdZo62eYaOdpvkgckliQaPOaWaPNa0aNw+Y1o8Zh85pZo81rZo02r5mJNq+ZrbZ5zUy0ec1stc1rZqLNa2arbV4zEqfNa0arp81rZqLNa2arbV4zE21eM1tt85qZaPOa2Wqb18xEm9fMVtu8ZiQum9eMVi+b18zEV/p72Ooi/T1MtH4zttr6zZjYpQeJrR6SyBqn9CCxxiWJpPHJ8gDq+Zx5sjyA+l4Qrd+MrbZ+MyZW6e9hq5v09zDR+s3Yaus3Y2K0ZtpzYXXWQ+P8/fh85QH87g+//v43//Hrr//ym3/+19/+8U9/l3jxPmZ5AO1iFWZ5AO1iFWZ5AO1izWR5AK1daIzWTKsXxC69hUyM1kzrF8QpNfKTWdL/iBqzPIB+viE9WR5ArxdEm6PJVhdJZI1VZlQyscmsT7a6S41MHFIjWz2l15U1Lul1RWKWBzAuzpksD2Bc7OFZHsC4WIXF5mh+kFgl8UGizdFkjV0SWWOWo/lcaJzS68rEJYlodZYH8ClnjVkewJfXlYmv9LoysUiN/DtWqZGJTXpd2eouva5MHFIjWz2lRiYu6XVFq8N+AO8F8ZEa0eosD+BLIxOL9Lqy1VV6XZnYpEa2ukuNTBzS68pWT+l1ZeKSGtHqLA/gSyMTH5mZilZneQDvxbrO8gDeizc8ywN4L76kwn4AF+dM2A/g4pwJ+wFcrJmwH8DFmgn7AVysmSwPoFysmSwP4Mtnj1ZneQBfRNZYpM+eNVZJZI22XzNrtP2amTikRrZ6So1MXNLDjlZneQD14g3P8gDqxU0zywOoF2vmKw/gxsN+8dX8lQdwQ7xYM1keQLt4w7M8gHbxPmZ5AO1iDw/7Adw8mSV7FuDvGPYDuPhKCfsBXHyHh/0ALr7Dw34AF98UWR5Av/imyPIA+sX7mOUB9ItviiwPoF/s4VkeQL/Yw7M8gH7ew98sD6DPC+IjowAfJL4yCsAai9TIxCo97EyMfM0/Hs06kdglcSExy2tuF8RsLkC9IMq5AEzM5gJ8+gXxcVEAftZZHsBPFGBDLM5nvyFW57PfELO85veC2J2HfUMczsO+Icq85g1R5jUzMewH8JzXTNgP4HNBlHnNG6tlXvOGWKVGtrpJjUyUec0bq2Ve84Y4pUa2ekmNSCwyr5mtLjKveUN8pUa2ukiNTJT9mjdWy37NG2KXGtnqITUycboowMbqJYmoMcsDeC++pKrsobHRKHtobDTKHhobYpUa2eomNTJR9tDYWC17aGyIcp7mxmo5T5OJTc7TZKubjM9sNMp5mhuNMj6z0Sh7aGw0yh4aG2KXGtnqITUyUfbQ2Fgte2gwMcsDqBenQpYHUC/WTJYH0C6edZe1ABuirAXYEGUtwIYoawE2b4+Mz2w0TlddsCHKWgC2OssD6Bc7bpYH0C++KbI8gH6xZrI8gH6xZrI8gH5xv87yAPrFl32WB9Av1vWQfWc2xCn94R2JSxKpF/Ib5QF8e4ZR47S+Ztb4Ss8wa7S+ZtYoe2hsNMoeGhui9TWz1dbXzETra2arra8Zicv6mtHqZX3NTLS+Zrba+pqZaH3NbLX1NTPR+prZautrZqL1NbPV1tdMxPKxvuaOROtrZqL1NbPV1tfMRNlDY2O17KGxIVq/GVtt/WZMlL1nN1bL3rOs8ZG9Z1njI3vPbjTKHhobjbKHxoZo/WZstfWbMVH20NhYLXtobIjWb8ZWW78ZEl/Ze5atfmUPjY1G2UNjQ5S9ZzdWV0lkjU16kJjYpXeGrR6SyBqn9FOwRjnnjIlZHkA/fz+WIntobIiv9HxUJBZJbEiUM5s2GmU/gI1GObNpo1HObNpolDObNhrlzCYmVjmzia2ucmbThihnNm2sljObNkQ5s2ljtZzZtCHKmU0bq+XMpg1RzmzaWC1nNjGxyZlNbHWTM5s2RDmzaWO1nNm0IcqZTRur5cymDVHObNpYLWc2bYjZmrk4r8N+APNMzPIA3os9POwHcLGHh/0ALvbHsB/Axf4Y9gO42CmyPID34u0J+wHcPOshc+KYmPnNbp515je7eNZhP4CLcybsB3Dx9gzZr3lDlP2aN0Tra8Ydd1hfMxN7Un9dLm5IWR5AuVjXw/qamWh9zWj1jHrP1ouv5ml9zWh12A/gYjebNkeTrba+ZtZofc1MtDmabLXN0WSi9TWz1dbXjMRlczTR6mVzNJlofc1stc3RZI3W18wamySyRptvxhptvhkTra+Zrba+ZiLWz0d6XV8kPpJYkPhKrytrLJLIGqv0urLGJoms0eabsUabb8ZE62tmq62vGYmPzTdDqx+bb8ZE62tmq62vmYk234yttvlmTLS+Zrba+pqZaPPN2Gqbb4bE1/qa0erX+pqZaPPN2Gqbb8ZE62tmq62vmYld+nHZ6iH9uEy0vma22vqakVisrxmtLtbXzMRXamSri9TIRNsPgK22/QCYaPsBsNW2HwATbT8Attr2A0CNuh8AatT9AFij7QfAGm0/ACbafgBste0HwMQuYx9s9ZCxDyba+AxbbeMzSGw2PoNWNxufYeIrNbLVRWpkoo3PsNU2PsNEWwvAVttaACZOGfFhq218BolZHkC5OBW67aHBRNtDg60uMuLDRNnjfGN1kxqZaOMzbLWNzzBxSo1s9ZIakThsfAatHjY+w8RXamSri9TIxCojPmy17HG+0Wh7aLDGIaMpTJwymsJE2eOcf8cpe5xviMGaWV+hjw8Cs1KA54KYlQJ8LohVBqWYmLVrfi+Itl3zg8Qhw1xMlKMBN8QlAz74O2ZpAF8BHybK0YBs9ZKjATfEIgM+TKwy4MPEJoMpTOwymMJE2w6A3x4bnmGNNjxDxKbbAXyQ+Egia3xloIKJRQYBmFhlEICJTbrD+cl06bJnjUNqZOKU7nC2ekkiaszSAN73gvhIdzhanaUBvBc7RZYG8K4LjXI04EajdTWzRlsKwBptKQATrauZrV6SiBqzNIBysWayNIDSLoivdAwz0ZYC4JN5rauZNVpXMxO7dJGy1bYUgDXaUgAmLunQRGKWBlAvdoosDaBerOssDaBerOssDaBevD1ZGsCXI46JTWpkq7vUyMQhXXts9ZRE1riksxA1ZmkA7WJ/rHI04EajHA24IRapka2uUiMTm3I/lonA7oALgdJrtpE4JZE1LueHY41ZEsAXETU26TXbaJResw2xSI1sdZUamShPmY3V8pTZEIfUyFZPqZGJKxoNXM7ELAngi4i/Y5YE8HO2boiy4GxjdXEt/Dcaq2vhvyHKgrMNsbt2aRuiHAqweTLZl9nFTpElAbSLncIOBdgQH9fCf0N8XQv/DVF+mW2I8stsQ2xSI76P4VCAi7MwSQL4/tjrCJwOOBC45LceSrQjAVhj1grg61uPNcqRABuN9suMNdovMyY2qZGt7lIjE+2XGVttv8yYuKRGtDpsBTAviPbLDK1eclzTRqNsBbAhynFNG6Ic17QhylSzDXHIbz0m2i8zfnuWJJLGnuUAtHlBfOS3HhPluKYNUY5r2hDluCZ81v0jxzVtiLJ9xsZq2T5jQ8zSM8eF1Vl6Zj8TsxyAft57epYD0PsFMVsz68LqbM3MC2J1n+EVgdLN3BDY5Vc4S7R+ZtYoszM3Gq2fGTW+slEza3xlo+YN8ZUa2eoiNTKxym9mtrrJb2YmyiEaG6vlEI0NMfsyey6szr7MLlZhsX5mJtrbDBNfeVNgYpE3BSbKxmYbohyisSF2+V3PxCG/65k45Xc9E+XwWSZmGQD9Ys2EGQAXaybMALhYM2EGwMWaqfY2gztutbcZJnb5Fc5WD/kVzkR7m2Gr7W0GiVkOQL/Ye7IcgH6x9zR7m2Gr7W2GidGaGRf7Y5YDMC72xywH4EsjWz2kRiZGa2Zc7OFZI4BxsYcnOQDfF80Xga4+sxQEyvaZG4myfeZGo2yfudEo22duNMr2mRuNsn3mhijbZ26slu0zmWjbAGyIsg3AhvjKWyETi7wVMrHKWyG+PWEbgHKhsct7JhOHvBWy1VPeXFnjkhqROGU+84b4yJsrE195c2VikTdXJlZ5c2VikzdXJnZ5c2XikDdXJsrW5huibG3OxGVjM7hTLBubYeIrNbLVRWpkYpU3LiY2eeNior3N8JMZksgap7wfMdHeZsjqkeUAjPPeM7IcgPFeEKM1M9qF1UUSWWPmAagXxMwDMC6sztZMvyDK7MwPAmV25oNAm52JEh+bnYkaH5udyRptdiZrtNmZrNFmZzLRZmey1TY7k4k2nsnEKe+ZTFzyVohP5rXxTNSY5QC0i7cnywFoF886ywH4usMxscobFxObvB8x0d5mmDjkNzM/6ym/mZm4pEa0OssB+NLIxEd+4aLVWQ7AuHh7shyAr69H1lglkTXaLzPW2CWRNUZfZn9dhO9EYPRl9l4AVwJsZ2CNAjP1AhgFZsYF8E2A/QJY1OfyBhilZc4LoEvLfBcCZVrmRqJMy9xozIIyz4VGmZbJRFv+z1Z/hf4vyq1/GqRuiNk15mIXC8v/L7axsPz/Yh/LQv+fi42syUDm5snIQOaGKIvMNkSZlslEW/6/IcprzIb4ukvHhljcpWNDlEGZDbG5S8eGKFPMNkSZYrYhTvf5vSFKBzMTs+D/uPiKyoL/4+LJjNd923YEFgccCKzyG4UlNklkjV1+UbDGIb+jWKMsmNkQl/zqQauz0P/XVw9qDMv/L97HKQtmNlbLgpkN0X6ZsdX2y4yJsjHThjjkVw8Tp/zq4ScjHcysMQv9t4u3Z9kvM9Zov8yYaL/MmGi/zJhov8yYaL/M+FnbLzMmyuT/jdUy+R+JMwz9P0er50c6mDcaX/k9yhqlg3mjscrvUdYoHcwbjd19kFYEDgdsCJzO2crA5TyPCMwC/1/fZfgjRoH/r5FCG2I2mqldELPRTPWCmI1mGhfEbDRTvyBmo5nWBTHyMn/mBTFqMvszAGhDjJJlfgYAMTEK/H+eizUTBf4/z8WaiQL/n+dizUSB/89zsWaiwP/nuXjDo8D/p908mWjNtJsnE62ZdvNkojXTbp5MtGbaxW4WBf4/7eJZR4H/T7vYzaLA/6dd7GZR4P/TL3azKPD/6Re7WRT4//SLNRMF/j/9Ys1Exf+ffrFmouL/T79YM1Hx/6dfvOFVJmVuiI8k4vdjlUmZG41FElmj9ZmxRuszY6KNZrLVNprJRBvNZKKNZiKx2WgmPpms+P+LyBplUuZGo2wys9Eom8xsiE369ZjYpV+PiUP69ZhofWb8rK3PDIldlpix1V2WmG2IsmHGxmrZMGNDlA0zNkTZMGNDlCVmmyczpO+RNU5JZI1L+h5Ro84AQI3jcc7HF4EyAaAgsDhvJgNdv8wNsElvJv+IXXozmTikRrZ6So1MXNLjisSs/f/X1ygTH+kfxSczX+nDZY1FamRilT5ctrpJImvs0ivMxCG9wkyc0ivMxCV9uPhklvUzo8Zl/cxMtH5mtrpIImus0nPNxCY912x1l0TWGK2ZnwHpG41TElljtGbe85pZUfz/m1iQGK2Zd1xojNbM2y+IRWpkq6vUyMRozZTnwuouiawxWjPl5n2cksgaozVTLt7HLAegXLyPWQ5AuXgfsxyAcvE+ZjkA9eJ9zHIA6sX7mOUA1Iv3McsBqBfvY5YDUG/ex2jN1Jv3cUmNaHWWA1Av3scsB6Cd764rywFoF29PlgPQyoXVVWpkYpPxdSZ2GV9n4pDRcH4yU0bsWeOSGpEY5gCc765L5wCwRpsDwESbA8BEmwPAxCYj9vxkuswqYI1DamTilFkFbPWSRNSY5QD0i70nywHoF3tPlAPwTWSNsjXzRqOtNWONsjXzRqOtNWONQ2YVsMYpswqYuKRGtDrsAnCxZppszbwhvjLzgYlF5ingk2myNfNGoxybudHYJZE1yoHmG6Icm7khLpn5gMQuB81siI/MKsBnHeYAXJxcYQ7AxbMOuwBcnIVhDsCFn0LnALBGmwPAGm0OAGu0OQCoUecAoEabA/BBoMwBeBAocwAYKHMAGGhzAPhHtDkATLQ5AGy1zQFg4pKxa7Q6zAFYF0Qbz2TiK4n4O04bz2SirZthoq2bYaKtm2Gi9Znxs56SyBqX9EehxiwHoF+84VkOwJePgomvJOLvmOUA9ItnneUA9ItnvWyvGdZouwCyRttrhjXaXjNMtF0Awery+dheMx8k2l4zTLS9Zphoe80wsUqvBz+ZJr0eTOzSR8FEOZppQ5zSo8DEJT0KSHw+0qPAxEd6FJgox8xsiHLMzIZoawBwFT72/s8au7xbs0Z7/2eNU96tWaO9/6PG96Mu189EoLv+PwuBr7tnbiQWd8/cEKvUyFY3qZGJ3d2FN1YPSWSN092uNxqXJKLGLAPguXh7ivQAbDTKjOaNRukB2GiUHoCNRpnRvNHYXbbwRuNwub0b4nR5sxvicnmzTMwyAMrF75hlAJSL3zHLACgXv2OWAVBufkeZnbkhyuzMDbG7PMUNcbg8xQ1xOl/hhricr5CJ7SM14m7WHqmRia/zPm6sLpLIGqvzZ240NklkjbLbzEajzDTbaJSZZhuNMtOMNfaP85Cyxi4zzTYaX+ch3WiUmWYbjdX5Mzcam/PibjTKTLMNcbiO4Rurp/PibjQu58VlYpYB8LlY19kcgB8v7oYoPc0bq6WneUOUnuYNUXqaN0Tpad48mSGJrHE63/VG45JE1JhNAvjxhm+Ij/OGb4iv84ZviMV5wzfE6rzh/KyzSQA3XwBTdjXfWC27mm+Ict7MxuoliagxmwQwLk7XJQeabzS+zr++0VgkkTVW52DvCGwOOBDYVX7dBuimmW+AU/rr+Udc0l9PxOcju5qj1c9HdjXfEF8ZAWCrZbeZjUbZbWajUXab2WjsrkvKRuOQMQUmTklkq5eMKaDGrAvAT5eUDfGRGtHqrAvAc7Fmsi4Az8WayboAfMU9mNhk3IOJXcY9mDhk3IOJU8Y9mLhk3AOJWReAcvE7Zl0AysXvmOUA1IvfMcsBqDe/Y5VxDyY2GfdgYpcxBdx7wi4AF+fMa2MzbLWNzSAx7AJwcXKFXQAuTq5iYzNMtLEZ/h1tbIY12tgMa7SxGdZoYzOs0cZmWKONzaDGamMzqNF2AdhotLEZ1mhjM6zRxmZYo+wCsNEoJwFsNMpJABvilBrZ6iU1IjHrAvAVU2DiI2MKTHxlBACfjO0CsNFYZQSANcouABuNXcYUmDhkTIGJU8YUmLhkTAGJdhIAP2s7CWBDlFUAG6tlFcCGWJNo+Lg4Z2wXgA1RdgHYWC2rADYaZReAjUZZBcAabRcA1ii7ADwVga4LwNMQWKR/nSVW6V9nouwDsLFa9gHYEJOsma+O8xvidD3sN7+j7APAxLAPQD9bHc4CWBcaX9fDfkMsUiNbnZwyXz3sN8Tm+uxvrO6uz/6GaKMzTLTRGf4dbXQGieEsgIs1s2S/2Q1R9pvdEIvrasrPOusD0C52s6wPQLt5Mj1Z1z89SDfEIT17bPV0fVI3RNk7A61+v7IALn7HrxsXEx/XyxWtfrMsgP65IBbpIWVilUT+HZv0kLLGLomscUgPKWucksgal/SQosZHzpxljVkfgM/FG/7ImbMbjUX6M1ljlf5MJjapka3uUiMTIw9AvXkf5czZDXFJjWj1az3NTMw8zRfnzCv7zW6IRWpkq6vUyMQmveFsdeZpvjhdX1sFwFZPqZGJWRXAxf5YPjIGwMRHakSri5zTvCEWGadgq7M1c/GVUprUyFZ3qZGJNjrDVmdr5uKcKbJHE1tdP1IjEx8Zk0KraxaduThnapEa2eoqNTKxyUgcW51VzlycM1XONt9YPaVGJmYRzYtzJssC6BfnTJYFcHPTzLIA+sU502Rf843Vsq/5htikRra6S41MHG7q/Mbq6abOb4hLakSrwyyAi3MmywIYF+dMlgUwLs6ZLAtgXJwzWSeAcXHOhFkAF6dCl70ANxqHjIezRtkLcKNxuYD4S8AhWwEWBD4yes0SXxm9ZqLNAmCrbRYAE5uMxLHVXRJZYxbRHBcap4wWMnFJIlqdZQE866wxnAYwL4ivrOViYjap+XNBzOrNLnaKaevNmJjVm12swiwL4K0XRNsLkIm2FyASl+0FyMSs3uzi7cmyAMrF25NlAZSLtyfLAigXb0+WBVAu3p5sGkC5eXuGrARkYjap+ebtWbK2kIgl6wVQ2wUxWjO1XhBfWf/IxCLrH5mY1WiuC2JWozkviFmN5nNBzDJnPhdEW6PJRFujicTH9s8sSLT9M5kop85srC6SyBrl1JmNxiaJrFFOndloHJLIGuXUmY1GOXWGNb62FyATbS9AJr4y9wF/xywL4GYPz7IA6sXbk2UBfGlkYpceUiYO6X1koq2dYaKtncFnXWztDGossnbmg0BZO/Mg0HrNWKL1mjHR1s6w1bZ2honZBI12YXVWO1MviEtqRKuzTgBfGpn4yIohtLrazmZMLFIjW12lRibazmZsdZc1SEwcUiNbPaVGJi5Zg4RWZ9MAvmqQmPhIjWh1Ng3gSyMTi+yLx1ZXWSfFxCY1stVdamTikPEetnrKTntMtPVmaHW33QCZ+MgoF1rdbTdAJhapka22k5qY2GTcjK3uMm7GxCE1stVTamTikrE9tDrqBPAd22PiIzWi1VkWwHtxzmRZAO/FOZNlAbwX50yWBfBenDNZFsB7cc5kWQDvxTmTZQG8F+dMlgXwXpwzWRbAe3HOZFkA78U5E2YBXJwzYRbAxTkTZgFcnDNZFkC52B+zLIBysZtlWQDlYu/JsgDKxd6TZQGUi70nzAK42HvCLICLvSfMArjYe3QWAFttswCYaLMA2GqbBcDEITWy1VNqZOKSmQpkdQ2zAM57Tw2zAMqFxlfmPjCxSI1sdZUamdhkfgZb3WV+BhOH1MhWT6mRiUvmkKDVWRZA7RfER2pEq7MsgNoviEXmubDVVea5MLFJjWx1lxqZOGQuDls9ZS4OE5fUiFZnEwHa54Jo+zSh1a/t08TEIjWy1VVqZGKTfefZ6i77zjNxSI1s9ZQambhkTy60OpwIcHHOhBMBLs4ZPRGAiUX2u2Krq+zJxUQ7EYCt7lIjE4fsycVWT9mTi4lLakSrw4kAF+dMOBHg4pzJ8gD6xTmT5QH0i3Om2t5mTLS9zdjqrLfZxTmT5QH0i3MmywPoF+dMlgfQL06FZqdooMYsD2Bd7OHNTtFgjUVmurJGO0WDNdreZqzR9jZj4pAa2eopNTLR9jZDq7vtbcbER2pEq7NeADd3126naLDVVXanYqKdosFEO0WDiUN2fmLilF2VmLhkVyUkZhMBbr5IxyM7FjHxld2AmFhkNyAmVtlph4lNdtphop1wzkQ74ZyJU3aIYeKS9Q9InLbnDO7h0/acYY225wwTbc8ZtrrKqg/WaHvOsMYuqz5Yo+05wxqnKvuYyHMdZ2iSfQ3nAbSjwCwF4Cfhk4GvU8gmF6eQgTI3k01uDsgK5cxZVihHzjJQVjOzybKYmYAti/y344vdPnLcLCuUd35WKAdnskJ542eFcmwmK5RTM1mhHJrJQDkzk02WIzMR+HzczZyBj7uYM1DOy8SH8siLPiuU93wGyms+A+Utn3/D4YCscDqvAQNlK2YEvrITMwNlI2YGyj7MDCzOYcDA6vwFDGzOXcDA7rwFDBzOWcDA6XwFDFzJ4NJ+/hQp8l7PwMc5M9DkrMt/P6/lr8B+NPyVTa7OS8BAOUyWTe7OM8JAOUqWTZbdMFihbIaBCqvshYEKq2uF0ZHnOmEM5BXnIGCB1TkIGCibx7LJ3Slk4HAeBzZZdo5lhcs5CFBhFsVv5/e6yQRLNLnJ/EoGFudxYJOrA7LC5jwOrFB2JWOFw3kcWKHsScYKl3MQoMIsdv85vzZZ6P5z3g+zyP3n/B5mgfvP+T3M4vY//U0YmDUju3jK0bdXvXjKcogfA+UMPwYu57VBYBaxvzhTsoD9j0+Ega/zODCwuGsPA6sD4loe8pbCCrsDskJ5S2GF8pbCCuUtBRVOeUtBhdPdUiry3C2lIU+262OB1QFZYXMt4Vhhd0BWKNuOsULZdYyByylEk7P4/I9CBj7uLoomh/H582uz5H2eTZb3eQbK+Dyb3B2QFQ7X8IcVTgdkhcs1viGFPYvPv8cdu39kAxhWKPu/MFC2f2GTZfcXBsrmL2yy7P3CCodrgsIKZecXVrhcow1UmNXjl/N7mJXjl/N7mFXjl/N7GBbjn9/DsBb//B6Gpfjn9zCsxD+/h1khfr14D6frucBA2boCTX5l5woGSh8xmmxr8BkoS/DZZFmBz8DmnM5ssqy/Z4XDlTuzwumArHC5sl9UWGQdMSrMSu97Oyt8XWUpA+WYFza5OoUMlNEUNllGU1hhFk05n8tFRlMYuJxCNDmLz3/OK6Vm0ZTzmVKzaMr5TKnFKWSTq1PIQFk4zCbLumEGyrJhNllWDTMwWynn78OWrZTz92F7nEI0ub1OIQNl3JFNlnFHBjankE3uTiEDo5XynPfDLEL/nPfDLEL/nPfDLEL/nPfDLEL/nNdyFqE/u0x7FqF/zms5i9CffbA9i9CffbA9i9C/52+bLEJ/dur2LEL/nr9tsgj9ez6Xswj9ez6Xswj9ez6Xswj9ez6Xswj9ez5Tsgj9ez5Tsgj9ez5Tsgj9ez5Tsgh9OZ8pWYT+wu2cRejL+UzJIvQXfuyskP7Cj53V0V/4sbMy+gs/dlZFf+HHzoroL/zYWQ19PZ8pWQn9hWN8TqeQgctlzqHJ6+My5xj4OIVo8nqdQgZm41rPa3ll01rPa3k1p5BN7k4hA2V+JJss8yMZKNuAkcnjI7uAMTDLjzzuh+OT5Ud+zsDiFLLJ1SlkYHNZsGxyd1mwDBxOIZs8nUIGLleujSZnNfTnINfIaujb8UwZYQ19PQOLy3Vmk6ur/2ZgcwrZ5O4UMnC4CnU2ebp8cQbKGno02dbQM/BxFepoclhDf94PbQ09myxr6Bkoa+jZZFlDz8DhFLLJ0ylk4HJV/mhyWEN/3g/DGvrzfhjW0J/3wyKrU9hkWZ3CCmV1CiuU1SmsUFansEJZncIKZXUKKrQ19KhQ1tC/yHPVKQV5MueeBcqcewbKGno2WdbQM1DW0LPJsoaeFcoaelRoa+gZKPMj0WRbQ89AWUPPJssaelYos75Yocz6YoWyhp4VyqwvVhj1L/qcX5uwhv68wYY19Of3MKyhP2+wYQ39+cUOa+jPL3YWof9JPWFgdwrZ5OEUMnC60AKbvFxoAYFZhL6e38MsQl/P72EWoa/n9zCL0Nfze5hF6Ov5Pcwi9PX8HmYR+otPkSxCf/EpkkXoLz5Fsgj9xafIV4T+4pBq55UyZbcJ/A2zCP0PkBUW5+xjhdUBWWFzDgIGyvs8mzwckBXK+zwrXA6ICpe8z6PCLEI/zi/2chf6D/KK4j3Ik90mWKDsNsHA7lovMHC41gsMnM6FwcDlXBgEnB85DeJBoJwGwcDX+UTY5OKArLC6TgmssLnGBgzsrm0AA4drG8DA6ar8GbhcUT4Cwxr6828Y1tCff8Nwov35Nwxr6C9+w+rKtRnYXLk2A+XcFAbKuSkMlHNTcPt65NwUBL5ybgqa/Mq5KazwddXVrLC4YmgGVldqzMDmSo0ZKH3EDBxygC0CpY+YFS45vpaARfqIUWGRPmIGSh8xmyx9xAyUPmI2WfqIGSh9xGyy9BEzcLryRDZ5ufJEBGbx+ed86mU19M/51Mtq6J/zt01WQ39x8clq6H8UssnNKWRgd+WJbPJw5YkMnE4hm7ycQgRmNfTv+UzJaujf85mS1dC/5zMlq6F/z2dKVkP/ns+UrIb+PZ8pWQ39ez5Tsgj9ez5Tsgh9OZ8pWQ39xY0+i9CX85mSRejL+UzJIvQXPocsQn/hc8gi9OV8pmQR+nI+U8Iu9+czJexyfz5Twgj9+UwJI/TnM8VG6NFkG6Fn4OsUssnFKWSgjNCzyTJCz8DuFLLJwylkoIzQs8kyQo/ArIb+wjsXRujPZ4qN0LPJsoqLFVZXMMQKmwv5M7A7IJs83BRPVjjdFE8GLleBhMAsQt/PSy+L0F+4TLMa+guXaVZD389LL6uh7+fPuSVzWRjYHRBXypK5LKxwOiArlLkspHBlNfTjeASsj8xlYYWvA7JClczCuGpwbG5TqTHMc2NTmOempjDPDU1h3lJJJ/h4s9D8X3NOmOcmpqC9jxuYwjyXwcL2VsVjfU0lxDCvq3wY5g2VDsO8qbJhmLdUMgzysoB8Of5+r5v+wDw3/IF5bvYD86rKg2FeU2kwzOsqC4Z5Q6WY4P4SNrM/Huevq2pEe4sramSey1dBe7NG9u14fmR97Nvx+yBsY/858ppKfmFeV7kvzHOZKvx8p+KxPpengvpkA3vUV900YNbnhgEzz/XkZp5ryc08NwmYeW4QMPNcnzvmuTZ3zHNTgJHX3BBg5rmqLOa5EcDMK8q5yLyqeLi/NOfFYn3OicX6nA+L9TkXFutzHizU150DC/V1579ifc59xfqU96ogTnmvXsS5viosz7VVYd5Q+tjeqfQxbylvCdo7PoqH+obrqML6XEMV5rl5c2yvGzfHPDdtju11w+ZYn7t9sD53+2B9bn4W6pvu9sG8R+lDe7OA+l/1Mc/NzmJ73egs5jWlj+3tSh/z3NwstteNzWLeUvrQ3iyQ/jnuL8vNzEJ7lxuZxbyi9LG9VeljnpuXxfa6cVnMG0of2zuVPuZltSOH86N+svD58znyHqXvRd6r9DGvqFIZtreqShnmNaWP7e1KH/OyaXLtaG9WXFWPvKX0ob1Z4/nT/ejPPDdJDu193CA55rk5cmyvGyPHPDdFju11Q+SY52bIsb1uhBzzsoqq4/6XtZt/j/tf1m3+Pe5/WbP597j/Zb3m3+P+l7Waf4/7X9Zp/j3uf1mj+fe4/2V95t/j/peVsb/H/S+rYn+P+19WxP4e97+shv1dJ3uzEvZ3HnluuiLb64YrMi+roDqeH1n5ejmeH1n1ejmeH1nxejmeH8XNVUR7qxuryLxH6UN7s+h5OZ4f1c1UZHvdSEXmNaWP7e1KH/Oy9XHc/7LoeTnuf1n0vBz3vyx6Xo77XxY9r8f9L4ue1+P+l0XP63H/y6Ln9bj/ZdHzetz/suh5Pe5/WfS8Hve/LHpej/tfc9NG0d7uho0yz80aRXu7GzXKPDdplO11g0aZ5+aMsr1uzCjzXPYV2+uyr5jnZoyivcONGGWemzCK9g43YJR5br4o2+vGizLPTRdle91wUea52aJsrxstyrylsv/Q3rAk/bhfhRXpx/1guuxE1ueyE5nnRiUyr6myYuZ1VQTMvKGyHfn5ZqXox/0+rEQ/vi9hq/jjfh92ij/uz1n8fBzf5yx+Po77aRY/H8f1kcXPx3H/y+Ln47j/JfHzn3TMhrhpcBVxS9Umk7wnaxD/V15F3qNqnVnfq3isr6jaadZXVe0085rSx/Z2pY95LnuX7XXZu8xztedor6w9Z96jsoHR3seNT2B9RdV2sz43PIH1udkJrM/VnrM+V3vO+lztOfOW0of2ZrXn7/H9C2vPj+9fWHt+fP+y2vNyfP+y2vNyfP+y2vNyfP+y2vNyfP+y2vNyfv+m0se8pXoLoL1Z7Xk9vn9Z7Xk9vn9Z7Xk9vn9Z7Xk9vn9Z7Xk9vn/F9WZge11vBua53gxsr+vNwDzXmwHtra43A/Ncbwa0t7reDKzP9WZgfVXxWF9TvR5YX1c81jdU7wjWN1XvCOYtpQ/tzQay9+P7l81jX8f3LxvHvo7vXxY9/xzfvyx6/jm+f1/R82SOOPO6qhZie4eqFmLeVPrY3qX0IS+Mnh/f5zB6fvTndDdamu11k6WZV6ORw8f10aP10Y7fu92Nlebn4aZKM8+1rGZ7Xcdq5A0XHUR7h+tdwvpcdJD1uXnSrK+qaBTrc71LWJ8bJs36XO8S1udGSbM+17sE9U03SBr1Tde7hPWpMdIDcap1SUdcVV9/LK8pHuvr6uuP9Q3FY33u64r1ua8r5C03wBDtXW5+IfNeVevM9hZV68w8N7yQ7XWzC5nXVa0u2ztUrS7z3OBCttfNLSTeG9aej4O9b1h73o88N7SQ7XUzC5lXVa0p29tUrSnz3MBCttfNK2TeVLWSbO9StZLIe9ywQrT3cbMKmfeqWj+2t6haP+a5QYVsr5tTyLyuatXY3qFq1ZjnhhSyvW5GIfKy2vNyPD+y2vNyPD9eN6CQ7XXzCZlXVa0V29tUrRXz3HBCttfNJmTeVLVCbO9StULIK24wIdpb3FxC5jnvLtvrvLvMc0MJ2V43k5B5zrvL9jrvLvOcd5ftdd5d5FXn3UV7q/Pusj7n3WV9zrvL+px3l/U15T1lnvPusr1DeU9Zn/Pusr6lvKeorznvLupLouc/7tOFOOXcnYgrKpef5VWVe888l9vOPJfbzjyX2848l9vOPNeZGnn9o3KzmfeoXGrmvSpXmXlF5Sozr6rcYuY1lQvMvK5ybZk3VK4t86bKjWXeUrmsyMs6t9fj75d1bq/H3y/s3H7c78PO7effr6rcSeY1levIPJebyDyXm8g8l5vIvKWiq8iLYuc/PPx+CTu3H5+H7NzO+oqKhrK+qqKhzGtKH9vblT7muc4lbK/rXMI817kE7V2ucwnzHuWNQHuz6Pl5v8+i53/Vx/ZWpY95TXk32N6ueKxvKO8G65uKx/pcZwbSV7LoeT/pK1/R84vc0/E56nuV94V5RfHYXteZgfU1xWN9rjMD6xuKx/pUa4bnQd5SvA/xHtebYQN0zRk2wFd5dDbAolw6G2B1s+jxIWcF6D/D6BnYnUI2eTiFDJxuHj2b7BxZrPB1nqwN0LmyNkDny9oAnTNrA3TerA3QubM2QOfP2gCdQ2sDdB6tDdC5tBhYnE9rA3ROrQ3QebV4tynOrbUBVqeQTW5OIQPdTMKNycMBWeFUvrwNcClnHgOzyvR+Ppez0vR+/g2rq73lp5wVp6/zQ6mu+najsDkgK3T1txuFrgB3A3Q1IhuTXZEIA7Mo++f8HmYt3n9uAQx0dSIbk12hyAZYVaXDxuSmSh02QFcrsjHZFYtsgFNVO2xMXqrcgYHd1Yuwyd0VjGyAr6p42JhcVMnDBuhqRjYmu6KRDbCrqoeNyUOVPWyArm5kY7IrHGFgVrf+ns+UrHD9PZ8pw9WObEx2xSMbYFXVDxuTmyp/2ABd/cjGZFdAsgFOVQGxMXmpEggGTldDwiZPV0SyAb6qCmJjclFlEBugqyPZmOwKSTbAriohNiYPVQqxAbpako3JrpiEgcv1CmKTl2sWtAG6epKNya6gZAOsKsa/MbmpIP8G6GpKNia7opINcKq8gY3JbqQIKqxZZL4dX+z6cUNFNgpfNQVkAyxqDMgGWNUckA2wqUEgG2BX+RebpzzUKJCNwukUMnCpFBE2+XHTRTZAN16ETX7cfJEN0A0Y2Zjs8lg2Ct2IkY1Cl8myUaiGjDwFeS6V5UWeG6PAAl83R2EDfJxCNDmL0P8oZGBxWQ5scnVAVthcIJMVdhfIZKBrh70x2fXD3gCXi4yiyVmEvp3fw+Ja/m4UyrgjK3RNfzcKZdyRFbrU+o1Cl1u/AQ6nkE2eTiEDXXo9m1xdfv0G+DiFaHJW//6jkIEuxX5jssux3wDdeNCNyW4+6AY43G2ZTZb3eVa43G0ZFWYR+nZ+sZu8zzMwu88/Z6AbE7oBZvf584udRej7+cXOIvT9fARkEfp+PgKyCH0/r5QsQt/Pn8Td1aTw0ssi9P28UrqrStkodGUpG4XyPs8KXWHKRqG8z7NCV5qyUegu9A15rjaF+lLXIWtTUGBWHP8DZIVucuhGYXFAVlhd9QwrbK56hoHdKWSTh1PIwOncQGzycm4gBGZV8j8K0eT5OIUMdDNENyZLzxcrdFNENwqbA7JCN0d0o3A4ICucrgKJFS5XgYTA9XEK0eT1OIUMdNNENyYXB2SFbp7oRqGs4mKFsoqLFcoqLgZOp5BNXk4hAdvHTRVFk1s2tr0+Z4VuruhGYXFAVlhdJRwrbK4SjoHdKWSTh1PIwOnCM2zycuEZBGY19O14rWhZDX07v4ePmzC6Mbk4ICt0M0Y3Cl0jr41C18lro3A4ICucrpqQFS5XTYjAV9Y7osmvrHdkoIw7ssmy3pEVyrgjK5T1jqxQ1juyQlnvyEBZ78gmy3pHBBZZ74gmF1nvyEBZ78gmy3pHBsp6RzZZ1jsyUNY7ssmy3pGBst6RTZb1jgisst4RTa6y3pGBst6RTZb1jgyU9Y5ssqx3ZKCsd2STZb0jA2W9I5ss6x0R2GS9I5rcZL0jA2W9I5ss6x0ZKOsd2WRZ78hAWe/IJst6RwbKekc2WdY7IrDLekc0uct6RwbKekc2WdY7MlDWO7LJst6RgbLekU2W9Y4MlPWObLKsd0TgkPWOaPKQ9Y4MlPWObLKsd2SgrHdkk2W9IwNlvSObLOsdGSjzI9lkWe+ICqesd0SFU+ZHskJZ78hAWe/IQFnvyEBZ78hAWe/IwOEy5/i1mQ7ICpfLnEOFWQ39OL82WQ39OG8OWQ39OG8OSYz+K3VuIK8qXkdecwlGLLC7BCMGusFaG5PdZK0NUHYkJpN7FqH/AXYEPi6QyQpfF8hkYHEK2eTqFDKwucgomyz7rLLC4SJSrHA6ICtcLiKFCrMK+h8gKnzcmJSNQjcnZQOUVVxssqziYqAblbIx2c1K2Sh0w1I2CqerkWKFsooLgdm0+J8aKQY+7lLBwNddKhhYXEkTA+UthYHNlTQxsLtrDwNlVxYGyq4sDFzu2oNruciuLKgwi9CP80rJIvTjfKYU2ZWFFVZ3j2KFsisLK+zqIrWQ55qyTORNV9LEAperQEJg1uP+J0+EgY+r72Hg666ODCzu6shAOWEIX5sqJwwxsLu7KJs8HJAVTleOwwqXq55BYJO1KQyUtSkMlLUpDCyu8oOB1dVVMLC5ugoGdlcGwcDhqhYYOF1NAAOXqwlAYJcZ9wyUGfcMlBOGcPvqcsIQA93k7I3J0vPFCrtL4WeFMuOegTLjnoEy4x6Bw83P3gBlpy98ysNN0N4olJ2+WGF12eKssLlscQbKjHs2WWbcM3C6bHE2eblscQROmXGPJk+Zcc/A12WLs8nFZYszUGbcs8ky456B3WWLs8nDZYszUGbcs8ky4x6BWXz+4iaVxeff8xGwZMY9mywz7hlYXbY4m9xctjgDZcY9mywz7hk4XbY4m7xctjgBx0dm3E8Eyox7Br4uW5xNLi5bnIEy455Nlhn3DOwuW5xNHi5bnIEy455Nlhn3CMwi9GevyMgi9PVzBsqMezZZZtwzsLpscTa5uWxxBsqMezZZZtwzcLpscTZ5uWxxBL4y4x5NfmXGPQNfl3rCJheXesJAmXHPJsuMewbKXBY2WXYkZoXTpZ6wQpnLggqzCH0/b7BZhL6fn3IWoe/n7SuL0PfzuZxF6Pv5KWcR+n7xlLvLw2CFMuOeFU6XNsEKZcY9Ksxq6Md5t6ky454VviZv4n2QpxLu3w/yqsrD2ACbysPYAF2f1Q3Q9VndAF2f1c1Ddn1WGdhcn1U2ubk+qxug67O6Mdn1Wd0odH1WN8Cm8jA2wK7yMDbAofIwNsCp8jA2wKXyMBiYRejL+TfMIvTl/BtmEfp6/g276x65AbrukRug6x65AXaV5cC7TRahb+dzvrvukRuTXfdIBg43i4tNziL07XymZF3u2/nLIety/9eL2QZYVR7GBthUHsYG2FXaxOYpuyqujcKp0iY2Cl0VFysMI/Tn78MwQn9eelmE/nN+D7MI/cUtIJxCf34Pwyn08wzsTiGbPJxCBk7lPdyYvJT3kIFZhP7i1Msi9BenXhahb+dvmyxCf3FIhVPoz69NFqHv5w02i9D38xdsFqG/OJezCH2/eG2WqtVD4Mwi9OeDfmYR+j7OwFe5dDfAojyw+B7Oj/MRbxQ25YHdKHQ+4o3CoTywG4XOR7xRuJQHlhU+zkfMCpMI/ZcLtiDPuYhf5BXn7GOB1Tn7GOi6smxMdl1ZNkBXxbUxeTogK1zOQYAKsx737fxev64rC5v8uq4sG6CbBrEx2dWmbBQ2d1tmhfI+zwqHuy2zQnmfZ4XLXW5RYdjj/vzahD3uz/th2OP+/B6GPe7P72E4hX6egc0pZJO7U8jAoYoMNiZPVWSwAS6nEE0Oe9yfd+ywx/04mpz1uL846LMe9z8K2eTqFDKwqSKDjcldFRlsgMMpZJOnU8jApYoM2OSwx/35TAl73J/PlLDH/flMCXvcn8+UrMf9ez5Tsh737/lMyXrcv+czJexxfz5Twh735zMl7HF/PlPCHvfnMyXscX8+U7Ie9+V8pmQ97sv5TMl63JfzmRL2uD+fKWGP+/OZEva4P58pYY/785kS9rg/nylhj/vzmRL2uD+fKWGP+/OZEva4P58pWQ19PZ8pWQ19PZ8pWQ19PZ8pYY/785kS9rg/nylhj/vzmRL2uD+fKWGP+/OZMmXckRUWFyZkhTLuyApl3JEVdgdkhcOFCVnhdFE9Bi4XhENgFqHv5w02i9D383uYRej7+T38itD/7g+//v43//Hrr//ym3/+19/+8U/b/pYbYHVRPTa5qQ6cG6CMO7LJMu7ICmXckRXKuCMpXB8Zd3wR6OKODXku7liRV1wpCQvMalMuLM5qU9oZ2F2xCwOz2pRxBk5XPcPA5apnEJhNoX+eMzCrTfmcgVltyvnFthF6BsoIPQNlhB43BxuhZ2AWoT+vFBuhZ6Cbm8ImZxH657yWswj9c17LWYT+Pa/lLEL/ntdyFqF/z2v5lVVcDMyquM6bw5tVcZ03h3e6OjMGLldnhsCSdSQ+v9jlcYVrDMw6Ep9f7JJ1JD6/2KW60joGZh2Jzy92FKH/lPOLHUXov4r/GDhd8R8Ds3rH84uddbmv5xc763Jfzy921uW+nl/sKusdGZjVO55f7KyGvp5f7KyGvp5f7KyGvp5f7KyGvp6/bbIa+npeKVkNfTuvlKyGvp1XSnO9uzdA17t7A6xOIX4SZzX07ezEyGro23ktZzX07byWsxr6dr5JZTX07bw5hF3uz2s57HJ/XstZDX0/r+UuK4MZmFUGn9dyVkPfzy92VkPfzy922OX+fKZ0N99xA1wOiEsvi9B/zu9hFqH/nN/DsMv9czbZdbnfALNM4vNKCbvcn0+9sMv9+dQLu9yfT72whv68OYQ19OfNwdbQo8m2hp6Br0vsYJOLS+xgoKyhZ5NlDT0Ds+6R5/0wi9BffGOHNfTn/TCsoT/vh7aGHk22NfQMdH1WNya7PqsbYHXZNmyymxm8Udhdtg0rdDODNwrdJNSNwuWAoLB9Pm4SKin8M/BxQFboJqFuFLpJqBuFbhLqRqGbhLpRqCahvgN5ahLq25HnJqFuBC6XNoHALEL/oxBNziL0n/NvmEXof74OGVhcYgcDq0vsYGBziR38lGWfVVYo+6wycLpMEQYulymCwDBCf14pYYS+HZ9yFqH/ycNgoMxlYZNlLgsDm8sUYZPdzOANUOaysMkyl4WBy6WeoMlZhP4n9YSBj1OIJmcR+ue8fWUR+p/kGDa5uuQYBjankE3uTiEDh0vfYZOnS99h4HIK0eQsQv+eP5ayCP17PlOyCP17PlOyCP17PlOyCP17PlOyCP17PlOyCP17PlOyCP17PlPCOfTnMyWcQ3/eYLMIfTlvsE1mfbFCmfXFQJn1xSbLrC8GNqeQTe5OIQOHy0tjk6fLS2PgcgrR5LDL/Xk/DLvcn/fDLEJfzvthFqEv5/0wi9CX836YRejLeT/MIvT1vB9mEfp63g+zCH0974dZhL6e98Osy30974dZl/t63g+zLvf1vB9mXe7reT/MutzX836Ydbmv5/0w63Jfz/th1uW+nvfDMV3CJQOXU4gmz49TyMDHpYSiyfN1KaEMLE4hm1ydQgY2l7TKJneXtMrA4RSyydMpZKDstIomL9lplYGy0yqavGSnVQbKTqtscnV5uqywOYUM7C6tloHDpdXybzgdkBUul6dLwCeK0H/l6TLwcXm6DHxdni4Di8vTHQiUM4ZYoZwxxMDuEn/ZZJlJzAplJjErlJnEqDDrcv85nsvPIzOJWaGcMcQK5YwhBlankE1uTiEDu2tyzCYP1+SYgdMpZJOXU4jAbA79c/yce7I59M97Br5OIZtcnEIGVtfkmE1urskxA7tTyCYPp5CB0zU5ZpOXa3KMwKzP/Tkc/GR97s/h4Cfrc38OZT5Zn/tzKPPJ+tyfQ5lP1uf+HMp8sj737/lMyfrcv+czJetz/57PlKzP/Tny+GR97s9huCfrc38Owz1Zn/tzGO7J+tyfw3BP1uf+HEJ6sj735xDSk/W5P4eQnqzP/TmE9GR97s8Rnyfrc1/PZ0rW5/4cQnqyPvfnENKT9bk/hz+erM/9OfzxZH3uz+GPJ+tzfw5/PE3OQmWT5SxUBk6nkE1eTiECu6zjQpO7rONioKzjYpNlHRcDZR0XmyzruFihrONihbKOixXKOi4GLlclhSYPWceFCrMq+nFeKUPWcbHC4qqkWKGs42KFTZVJLeS5Mq6JvOGKmljgdEVNDFxOIZqcReg/598wi9D/OEzR5CxC/+MwZWBxZVcMzOq4+hko67gYKOu4+CkPV3bFCqcru2LgcjVICMwi9M/5PVyyjgsfypJ1XAwsLl+cTZa9vhjYHJBN7i7kzwplry9WOF0OAStcLuRPwDeL0P98bjLwcQonAl8X8meFxYX8GZhF6N8zUPb6YqDs9cXA4RTyU54u5M8KlwOiwqyKfp2XXlZFv84r5StCfzHo5POcFcpeXwysDsgmNxfyZ4XdhfwZOJxCNnk6hQxczpWGJmcR+no+U7IIfT2vlCxC/6OQgcW50tjk6lxpDGxOIZvcnUIGDuebY5OnA7LC5XxzqDCL0Lfze1jkNC5WKKdxscLinH2sUE7jYoXNOftYYXdAVjics48VTgdkhct4+/5Sgfv3eUmA/ov3Qd6jfHMbga/yzW2AbhrXxmQ3jWsDdNO4Nia7aVwboJvGtQFO5T3cAJdy9jEwq6H/a7rlBvgo7+EG+DogvofNdTDaKHQdjDZAN41rY7KbxrUBug5GG5NdB6MNcDmFaHJWQ/+jkIGugxGb3F0How2wOIVscnUKGeg6GG1Mdh2MNsDhFLLJ0ylkoOtgxCYP18FoA3ycQjQ5q6F/z982WQ39ez4ChutgtFHoOhhtFLoORhug62C0Mdl1MNoAs5Vy3rGn62C0AT6q4dAG+Kp2PhtgUe18NsCqmuVsgE11jtkAu+ocswFmHYwu3sOpWtFsgEt1jmFgFqGv5/cwi9DX82uTRejr+QjIIvT1/B5mEfp6fg+zCH09v4dZhL6e38Pluk1sgK7bxAbouk0gsHxct4kN0HWbwGO0ZBH6Vs8KXbeJjcKqshw2CpsDssKuOiVsFA6VNrEBTpU2sQEulTbBwCxC39sZ+Ki0iQ3wdQrxtcn63Pd+VlgdkBU2leWwUdgdkBUOlZSwUTgdkBUulUPACrMI/dnTXrII/ef8YmcR+s/5CMgi9GdPe8ki9GdPe8ki9J/zi51F6D/nQyqsoT8fAVmE/jkfAVmE/jl/22QR+uc9Ax/V2IBNziL0Z097ySL0Z097ySL0Z097CWvozx9LYQ39+QgIa+ifs8nTKWTgUo0N2OSshv7sMi1ZDf17PlOyGvqzD7ZkNfRn/2HJaujf85mS1dC/5zMlq6F/z2dKWEN/PlOyGvqzQ7JkNfTlfKZkNfTlfKZkNfRnD2fJaujPHs6S1dCX85mS1dCX85kS1tCfz5Swhv58poQ19OczJayhP58pYQ39+UzJaujPPtiS1dDX85mS1dDX85mS1dCffbAlq6E/+2BLVkNfz2dKVkNfz2dKWEN/PlOyGvoLH2xWQ3/hg81q6Nv5TMlq6Nv5TMlq6Nv5CMhq6Nt5pWQ19Bde4mwS/YWXOJtEf+ElzibRX3iJs0n0F07dbBL9hVM3m0R/4dTNJtH380rJJtFfOHWzSfT9vFKySfT9vFKySfT9vFKySfTjvFKySfTjvFKySfTj/DmXTaIf56WXTaIf5zMlm0Q/zislm0Q/zmdKEqP/qjMoyKuK9yIv6srSz7yoK8s881xXls0P6LqybICuKwuaXD+uK8sG+ARlvF9lEAx007XxN6wfN117A3TTtTfA5go1GOi6smyAbrr2Buima2+AywHxPczi88/5Pczi88/5Pczi8z8K2eTiFDJQZtyzyTLjnoHdZTozUOYRM3A6ID8UmUeMCrM59KWcgY8DosnZHPpyXsuvm++4AVaXVMvA5oD8G7r5jhuFbr7jRuF0ObCs0E2tY2A2h/4nf5OBMjuSga8D4kMpMjuSFVYHZIUyO5IVdgdkhcOlW7LC6dItGbhcuiUCszn0/T0Do3tKP782VWZHssLi8jcZ6GZxbUxuLt2SFbpZXBuF0UoZF+/hdEBWGK2UcX4oWQ39OL/YWQ39OH9wZjX04/yUsxr6cd6xsxr6cd6xsxr6eX4Psxr6eX4Psxr6efEeRitlXryH0UqZ5/cwq6Gf5/cwq6Gf5/cwq6Gf5/cwq6Ff52tFVkO/zteKLD7/OX+KZPH5HyArlPF5Vijj8wyU8Xk02cbnGSjj82iyjc+zwuKi36xQxudZoYw6MlBGHdnk4YCscLqYHiuUUUdUmMXnx/nFnjLqyApfFdRryHNBx4q86kJcLLC5EBcDu1PIJg+nkIHTBeEYuFwQDn/DrIL+RyEDHxeEY+DrgnAMLC4Ix8DqgnAMbC5mxsCuZi1sgG4aBL/YWYT+uXixl4uZEbB9ZNyxIlDGHRkoO32xycUBWWF1YUJWKOOOrFDGHVnhcEBWKOOOrHA5ICrMIvQ/gUwGPq4hEgNf1xCJgcVFRvGhZBH6Us4Km+uwxMDuYrds8nBAVjhdMJgVLgdEhWGE/vgp0sII/XnpZRH6et6xswh9Pa/lLEJfzzt2FqGv5x07jNCf38MwQn/xHsr+RaxwOSAqDCP05w3WRuhZoexfxAplhJ4Vyv5FrFBG6Fmh7F/ECmX/IgbK/kUMlP2LEPgVoY8C6vhQsi73/XzQhxH680oJI/TnL4cq+xexQhmhZ4Xdxb9ZoYzQs8Lp4t8MXC7+jcAwQn9+KGGE/rwfZhH6eX4oWYR+nldKFqGf56ccRugvnnJ3sVtcKWGE/uIpTxe7ZYXLAVFhVkH/OR+jWQX95/x9mFXQnx3jLaugPzvGW1ZB/zkvvTBCf156YYT+/B5mEfqzY7xlEfrPxYu9nEIEZhH653wuZxH65/x9mEXon/OZkkXon7NnKYvQP+f7chahf86fc1mE/jkfUlmE/jl/imQR+gtPexahf89HQBahv3DdZxH693ymZBX07/lMySroL4ILWQX9ez5Tsgr6i2hFVkH/ns+UrIL+PZ8pWQX9RbQiq6B/z2dKVkF/EVzIKujL+UzJKugvohWrOIUMrK51GJvcXOswBnankE0eTiEDp2sdxiYv1zqMgP3zcQorAh+nkIGvax3GJhfXOoyB1Slkk5tTyMDuWoexycO1DmPgdArZ5OUUIvD5uNRkNPl5XGoyA1+nkE0uTiEDq8t1ZpObA7LC7nKdWeFwQFY4XfI0K1wOiAqzLvfjeOr1rMv9OB9SWZf7cV56WZf7cV4pWZf7cV4pWZf7cyygv11lTw/kDcXryJuqZRPzlmrZhLwsPv+Ti40/YBaf/5yfSBaf/1HIJhenkIHVZYuzyc0BWWF3ObCscLgcWAbKPGI2WeYRIzCroP/xHaLJWXz+x3fIwNcN+GWgzCNmoOxfxA9F5hGzQjkxmIFyYjCbPN34XFa43PhcBGbx+fe822Tx+fe822Tx+fe8OWTx+fe8OWTx+fe8OTQ5MZhN7i5bnBUOB2SF06Wfs8Ll0s8R2GWnLwY+LlucgXJiMD6Ur/j8xbdNOS+9LicGs8lZxv15t+ky455NHtFveL5VdJlxzyYvNyQZgdkU+nLevkbUv6icP0WyKfTlvB9mU+jL+etryJ54bHJzNQGsUPbEY4XDDZpmhVlPvPMGm02hr+ftK5tCX8/bVzaFvp537GwKfT3vNtkU+nrebbIa+nrebaacrc0K5WxtBsrZ2gyUtSkMlLUp+FCWrE1BhVkNfTtvDkt2j2STs9qU826zZPdIBjYHZJN7ctC388dSOIX+vH2FU+jP21c4hf6424xwCv08Ax8H7Ah8XQUSKyyuAomB1VUgMbC5CiQGdleBxA9luPoeVjhdBRIDl1OIJodT6I+bwwin0Pcz8HVANjlbKefdJpxCf95tshr6cd4cshr6cd4cHlnFxcCsiuu8OWQ19OP4KTJe2WcVFWY19PO89LIa+nl+sbMa+nl+sbMa+nk+RrMa+nVeKVkN/TqvlKyGfp1XSlZDf04hGFkN/TqfelmMfp1XShajX+eVksXo1/mQKrLPKgOzPqvnpZfV0K+jM20U2WeVFQ4HZIXTVcKxwuUq4RCYTaH/nD/nsin050yMkU2hPzuCRjaF/uwIGtkU+np+sbMp9PV8SGVT6M9+m5FNoT/7bUY2hf7stxnZFPp2zFka2RT6sxNjNNmRmBW+bsAvK5QdiRkoOxKzyc0N+GWF3Q34ZeBwA34ZON2AXwYuN+AXgVkN/cWNPquhv7jRZzX0F/flrIa+n1/srIb+4gKe1dCP56ywu9RpVjgckBVOlzrNCpcDosIkRv+VO72Q9yjeRN6rcrGZV1QuNvNk527+AWXnbgbKzt1ssuzczcDpGm2zycs12kZgFp//UYgmZ/H5H4UMfF0rcDa5uFbgDJQTg9lkOTGYgXJiMJssJwYzcDqFbPJyChGYxed/mpWjyVl8/qedOgNfp5BNLk4hA7OM+/OZEva4P58pYY/785kS9rg/nym2xz2bLGtTCDhtj/uJQNnjnoGvq55hYHHVMwysrnqGgc0VuzCwu1ISBg5X7MJAWZvCQFmbgsBH1qb8P5y9Xa7FSo9cOaIGlP+Zwykb9pNRDwXU/LuuDXxno9tBMtYEFoJbSukcMRjUQDibooGdDWpo4GCjJBo42aCGBi42qKGBmw1qaOBhYxAaeNmghgY+NmQggWbGfX5jmxn3+Y1tbqHPb2xzC31+Y5tb6PNXQIeOew3czCCvgYcZ5DXwMoO8Bj7mZ5dArz8/8xvb68/P/Mb2+vMzv7G9/vzMb2wz4z6/sc2M+/wVYG6hz0+KN0O/8pPizdCv/KR4M/QrPyneDP3KT4o3Q7/yk+LN0K/8pHgz9Cs/KWbGfX5SzIz7/KSYW+jzk+LN0O/8pHgz9Ds/Kd4M/c5PyoI+Yg2EPmIN7Mz2Kz9ieDP0++bAyRTqkhdTqIGbGZM18DBjsgZeZvvVFwX6iKVCb4b+5A8Hb4b+5F/nvBn6kz8cvC305+QKJwNqhYtt1NAKNwNqhYet6NAKLwNqhY+t6JAKvRn6m9+HBzrutcLOgFohdNxrhZPNBGiFiynUQGuK6315yYfNBGiFl80EaOBjMwGyZK9Hn1tZrtejf/nDwevR5+aY6/XoX/608Xr0L/8b2+vRv/zxdb2TsvOSrVyWlz8PvR79y5+HXo8+90Bdr0f/8v8CvB79yx+wXo8+t2ldL+P+yx+wXsb9lz8PvYz73AR1vYz73AR1vYz73AR1vYz73AR1vYz73MDzvIz73MDzvIz73MDzvIz73MDzvIz73HzyvIz73HzyvIz73HzyvIz73HzyvIz7dvKSL1tZpIGPKZQlexn3ubXjeRn3PTWSPS/jvn85cDCFuuTJFGrgYiuLdMmbrSzSwMMU6pIvU6iBj60skiV7Gfc9f6d4Gfe5teN5Gfc9f6d4Gfcjf6d4Gfcjf6d4Gfe5V+T1zRRq4GEri3TJl60s0sDHFMqSx8cUamBjK4tkyaOzlUUaOJhCXfJkCjVwsZVFuuTNVhZp4GEKdcmXKdTAx8a1ZcneDP3M3yneDH1uPnnmDH3+TvFm6Ff+TvFm6Ff+TvFm6HPzyTNn6PN3ijlDn79TzBn6wn342DC0BHoz9Llx4nkz9HkH/C04GawVOund7RR+QzgZrIFwMliXDCeDtUI4GawVwslgrRBOBkuFG00G//MnieChyeB//iIRPDQZHPDQZHDAm8i/GfyALI84ULiR1yZQeJDXJgBeplCX/JhCCfzpzxfaR/96uAbAhrw2+jc8zMkSAAdq+AfAyYD6N2T9+UDhZkCtkCXiBQpZIl4AZP15XTLszwfAhnrLumSzPz9zhSwRL1A4GVArXKiNGShkiXiBQtZ1DBSyrmMAfEyhLNnbQf/l9+Fj/83rkh/7bz4ADqZQlzyZQg1k/80HJbP/5gPgYQp1yZcp1MCHvjeokvf3sUQ8pfC/gA19wAgUdgbUCgf6gBEAJ4qHC4ALpbkFwI3C1wLgQZ9YgqvsJeK9XCHbrK2BjW3W1iU3tlk7UOht1s5v7MY2awclTwbUCtlm7UDhZkCt0Fqt/a9XypC8iz4Cad5DvK543frotVJ93froNXMe++ileQOFcgVAlvIVXJGFIq8ChRtFXgXAwxTqki9TqIEPRV7pkr3p+X9FXgXAxhTKkr3p+T+FGjhQQlVQ8mRArXChQKlA4UaBUgHwMIW65MsUauBDkVe6ZHMDff7ENjfQ5w9YcwP9zoFsA31QMkv5ChSylK8AyDbQB8CDQrkC4EWhXAHwoVAufZXNDfT508bcQJ8/beAG+gDINtAHJbMN9AGQbaAPSt5MoQayDfQBkG2gD4AP5ZBpoLmBPr+xN0v5CoBsr3YAHChDKwBOlKEVABeKvAqAGyVUBcDD/AMayLYF66fNZtuCtcLDtgVrhV53fuW3jdedX/lt43XnV/6S8rrzK78Pve78yl8BXnd+5Z8IvO78yk+K151f+R+cXnd+589Drzu/86Pnded3/v+y153f+dHzuvM7/5PY687v/Cx70/M7P8tewv3Oz7KXcL/zs3yh40vfNtDxJYHe9PzOHw7e9PzOHw7e9PzJP/d5Cfcnf9F7Cfcnf3x5Cfcnf3x5Cfcn/8vBS7g/+fPwsZSvoOTHFCpg8xLuT/qJoH0s5SsAdqZQlzyYQg1kKV9Byd5J2TlwM4W65MMUaqB3Ul5e8kPBZhroJdyf9J3SvIT7c3NgR0lpQcmei7jnwMkU6pIXU6iBnos4fx56Cfc3fx56Cfc3fx42loengV7C/c2fh+YG+vx52FkeXlDyYAo1kOXhBSVDv70GbqZQl3yYQg28KGAvKPkxoFRobqDPn9jmBvr8iW1uoM+f2OYG+vyJbW6gzx+wg+XhBQo3mwjQCg8DaoWXTQRohY8BpUK4gV4rhBvoA2BnCnXJgynUwImCzYKSFwo2C4CbKdQlH6ZQAy8KNgtKfijYTAO96fmWP7G96fncBNW86fncwNO8DfS5gad50/O5gad50/O5gad50/M9/9vGm57v+SvAm57v+R9L3vR8buBp3gb63B7TvA30uT2meRvoc3tM8zbQ5/aY5m2g7/k7xdtA3/N3ireBPjefNG8Dfc/fKd4G+pG/U7wN9CN/p5yPKZQlWz36H4Ua2FGwWVDyQMFmAXAyhbrkxRRq4EbBZkHJBwWbBcDLFOqSH1MogfdDwWa65NtQsFkA7EyhLnkwhRo42aCxLnmxQWMN3EyhLvkwhRp42aCxLvmxQWMJ9Cboc5tW8yboV/5O8SboV/5O8Sboc5tW8yboV35jmxP0+X3oTdDvgkI4F6wVXjYkqxU+BlQKuzdBn9sSujdBn7sIujdBn3fAuzdBnzesu9Oj/xnKXJK3EG9K3mYzmVrgYUCt8DopWn/f5jTwsRFKWbLXof8DSoVeh/5vQFErhBOPWiGceNQKJ5vW08Dl3DYtvw+9Dn3Lj7LXoW/5WfY69K1wYz8GlAq9Dn3Pb2yvQ9/z+/CnQ1+4bf6+fOmSBxsM0wonA2qFcI5LK4RzXBp4mEJd8mUKNRBOp8iSvQ79yp/YA06naIWdAbXCwcZdNHA6Z3nlV9ncQZ/fhwNOp2gg26wdAK2/vnbhorDN2hroTdHv/Cp7U/R/Jn55Urwp+p2/l70p+p3fNuYO+vxFP62/vv7+F9VA6LnXv+FhQK3wMnu3VvgYUCpc0B8pFS62LzhQ2JkVTytk+4IDhZP50rTCxXxpGriZQl3yYQo18DKjmy75MaBUuNkWVK1wsy2ogcLOjG5aIduCGiiczJemFS7mS9PAzRTqkg9TqIGX9Xt0yY/1eyTQ69DP/Mb2OvQzf2If5z/6VvjX7Fg7U1bLgZN1pDRwsY6UBm6mUF+UwxRq4GUtLl0yzCOWCr0O/cqP3oV5xFoh2y4UKBwMqBWy7UKBQrZdKFDItgsFCtl2oUAh2y4UKGTbhbTC96Ee15G8hnhb8qz/Uv7+btACYdKqBnpJq4WfcDGF+jeESata4WFArfCy2FGt8LEmnAKODyatbglsrKunFXYW6qmBg7UJNXCyJpwGLgbUF2WzJpxWeBhQK7ysq6cVPtbVk8AG8yM1sDGg/A29Dn0/ucLBWlwaOJlCXfJiCjVws56ZLvkwoFZ4Wc9MK3wMKBV6HfqVP7G9Dv3Kj16HqXi6ZJiKp4EwFU+XDFPxNHAzhbrkwxRq4GWdUV3yYzF7Emh26F9astmhz9/LXod+56/RAVPxtMLJustaIUzF08DNcvt0yYcp1MDLcvs08LGGugROmIonL8qEqXga2JlCXfJgCjVwsna1LnkxoFa4WbtaKzwMqBVelkamFT4GlAq9Dv3Jb+wFs760Qpj1pRUOBtQKJ4uV0goXA2qFm9kmtMLDgFrhZbYJrfAxoFS4YYKRVLhhgpEGwgQjXTJMMNJAmGCkS4YJRlohTDDSCmGCkVboJRi1XCFMMJJAr0P/5R8xvA79lx+9AxOMNBAmGGkg9LLo3xB6WTTQ87Lk7xSvQ5+3kIbXoc9bSMPr0H/5/yleh/7LnzZehz5vcg2vQ//ljy+vQ593zYbXoc+7ZsPr0Be6Zl6H/k+hLvkwhRoIs750yTDrSwIfzPqSJT+Y9aWBXtZX/k7xZugLnUdvhr7l7xRvhr7l7xRvhr7l7xRvhr7QbPVm6Fv+TvFm6PPu7fRm6Hv6PJzeDH3ebJ3eDH1vecmDKdRAL+tr5CV7WV89B26mUJd8mEINvCzRTZf8WKKbBDaYiidLbjAVTwO9k3Lykr2TsnPgZAp1yYsp1ECYiqdLhql4GniZQl3yYwolsHupePk7pXupePk7pXemUJc8mEINnCxZUJe8WLKgBm6mUJd8mEINvCxZUJf8WLKgBI6PKZQlj8YUaqB3UvLn4fBOSv48HJMp1CUvplADYX6kLhnmR2ogzI/UJcP8SAn0cu5n/jz0cu5n/jz0cu5n/jz0cu5n/jz0cu5n/je2l3M/87+xvZz7mf+N7eXcz/xvbC/nfubvFC/nfubvFC/nfubvFC/nfubvFC/nfubvFC/nfubvlAWTVnXJMGlVA72Jx/yd4uXc5+bk6eXcr/yd4uXc527nuWHSqix5w6RVDexMoS55MIUa6M0G568Ab4o+NydPb4o+NydPb4o+NydPr0efe4mn16PPvcTzwNlgWbLXo9/548vr0e/8LHs9+tycPL0efW79nV6PfucnxevR7/ykeD363Fg7vR79LtzYMJNYAr0e/clfo16P/uSvUa9Hf/Ib2+vRn/ydYk7R5ze2OUWfP7GdHv3PxPaTvIN4V/IumwDXwMfmq2XF3ib6P6BU6G2i/3OKaIWdAbXCwSZvtUI4G6wVLjZ5q4GbjaFqIExa1b8hTFrVwMcUqpKXN0Xfdw5sbDDsSWBnQK0QznFphZMBtUI4x6UVbgbUCg8bGdLAy0aGNPCxCR/5G5qb6Eeq0NxEn19lb4r+5FfZ3ESfP23MTfT5Vfam6F/hKm82ZqCBhynUJV+mUANhfqQs2Zuif/l92GF+pFbYGVArhPmRWuFkQK1wsdw+rXCzj30aCFPxdMnwy5dW+BhQKvQ69Dt/fHkd+p0/bbwO/clvG69D/wfUCif7QKAVLgbUCjf7QKAVHgbUCi/5QvDPQ0LwHuJ9iufN0P/ri4MW6M3Q/wG1wo6+OAQKBwqxC4CTKdQle6l4L1fIUvEC4GEKdcmXKdTAh2L2dMmLpeIFwMYUypIX28YVAL0vXyMveaIgwAC4mEJd8mYKNfCgqMKg5IuiCgPgYwplyd4M/Z9CDfROSv4K8GboW/4K8GboW/4K2OwbcQD0Tkr+TtksPzIAHqZQl8z21gVA7xtx/k45bG9dAGxMoSz5dKZQA738yPydciYK9QyAiynUJW+mUAO9bkr+TjkX9XsC4GMKZcmXJa0GwIb6Pbrk21G/JwAOplCXPJlCDVyogRSUzPbWBQrZ3rpA4WVArZDtrdMKvQ79zk/KY3vrAoVsb10AHKiBFABZKl7wGy7UQAoUslS8QCHL+goUsqyvAPhQv0cCt9ehfz0HNqbwk8DOFGqgl/W18pJZ1lcAZFlfQcks6ytQ6PUdbw68TKEu+aHwMK2wsayvANgYUJbszdB/+cPBm6H/8odDY1lfAZBlfQVAlvUVAFnWVwC8KKcqAD6UU6WB3gx9/tl5ezP0+Wfn7c3Q5x91t9ehzz/qbq9Dn3/h3N4Mff79cHsd+vz74fY69PnXue116Fvhxn4ozkcDvQ59/u1rex36/MvS9jr0+Zel7XXo8+822+vQ599tttehz7+KbK9Dn38V2V6HvucnxZuh7/lJ8WboR35SvBn6kZ8Ub4Z+5CfFm6Ef+UnxZuhHflK8GfqRnxRvhn7kJ8WboR/5SfFm6Ed+UrwZ+pGfFHOGPj8p5gx9flLMGfr8pJgz9PlJMWfo85NiztDnJ8Wcoc9PijdDP/OT4s3Qz/ykeDP0Mz8p5gx9flLMGfr8pJgz9PlJMWfo85MCZ+j1Nwdzhj4/euYMfX70zBn6/OiZM/T50fvp0VfM0ze/KMxJrBXCGfoA2JhCWbI5Q58/HMwZ+vzhYM7Q5w8Hc4Y+fziYM/T5p3tzhj5/OJgz9PnDwZuh3/nDwZuh3/nDwZuhzzuPG26iD4DDeXyd/Ds23EQfKFwo2CAAbqZQl8w20QcKLwNqhWwTvVbo5dyf1Nqx2Sr6f/4KE7yOeF3yPM99ywV6nvsvBy6mUJe8mUIN9Dz3Iy/Z89z3HPiYQlXy8Tr0fwo1sLG5BQ2EnnsNhJ57DZzM3j0kcDGvswZuZvzVwMNcsBp4mSVUAx8DyqtsbqLPL4q5iX7nQLaJPiiZbaIPgJO5D3XJ0B+pFW7mPtQKoT9SK7zMfagVQn+kVNjZ1mCtsLOtwQGQbQ0OSmZbgwMg9EfqktnW4EAh9EdqhWxrcKCQbQ0OFLKtwVrhYFuDtcLBtgYHCtnW4EAh2xocKGRbgwOFbGtwoJBtDQ4UQiexVgidxFoh2xqsFU62NVgrnGxrcABkW4ODktnW4AAIncS65MW8zlrhZgo1kG0NDkqGTmKt8DGvswQu6CSWJXsd+vy7zfE69Pl3m+N16PPvNsfr0Bc+s3gd+sJnFq9D/+VHz+vQf/nRW2xrcABkW4M1cLOtwQGQbQ0OgJ15nTVwMK+zBk6nPdPy16jXoW/5WfY69IXPfV6HvuVn2Uu5b/nR8zr0he+HXoe+5WfZ69C3/Cx7HfqWn2WvQ9/ys+x16Ht+lr0Ofc/P8mG7UAMg24UaANku1ADIdqFqoNehL3yD9Tr0hW+wXoe+5yfFS7nv+UnxOvQjPyleh37kJ+WyDY8BkG14DICX2bs18DF7twQ+tuExALINjwGQbXgMgGzDYwCczN6tgYvZuzVwM3u3Bh5m79bAy+zdGviYvVsB78f21gVAtrcuALK9dQGQ7a0LgJPZuzVwMXu3Bm5m79ZAlkkcAC9zY2vgY25sCfSm6Fd+Urwp+pWfFG+KPm9YX2+KfuUnxZui3/lJ8abod35SGnQSa+BhXmcNvMyarIGPWZMl0Jui3/lJ8abod35SvCn6vEd/vSn6vEd/O3QSayB0EmvgZj5dDWTp3QHQcxIXrrLnJM6vsjdFf1Or2/Wm6G9+23hT9De/bZwe/Y83eUneRLwpedBJrAVuBtQKD7PVaoXQSawVPpYiLxXSnHup8P/Xof+f//kf//5v//1//N/jyv8PbAsUTLjX2mDCvQZOZpvWlwMm3GuFMOFeAw8zduuSL4t71wofUyiBZsL9SEs2E+5HrrCzdHYNHMwcr0uezByvgTC3WwM3M8dr4GFedg2Ebnt9lR8LD5bADd32suQN3fYaCN32umTottdA6LbXJUO3vVYI3fZaIXTba4We2z7/q2ZDt70Eegn3O78PvYT7nd+HB7rt5VU+0G2vgZMp1CUvplADN7Pv65IPA2qFl9n3tcLHgFKhl3B/83eKl3B/86PnJdzf/Mb2Eu5vfh96Cfcvvw+9hPuXvwIu9BBrIPQQa+Bl/lcNfMyuKoE/vXnL1SdvG683X/jH58GMVa1wMIubVjgZUCtc7LuhVrgZUCs86DvfkTy22nFL3mOf+ZTAZ07Pt0zhM6fne66wM6BWONhnPq0Q7nbUwMW+zWngZp/SNPCwT2kaeJlCfZXhly+psMHdjlJhg1++tMLOPlRpINxYp4GTfajSwMU+VGngZt+VNPCwjywaeNlHFg18TKG8sb3p+b5zYGNfbWTJ3vT8yp825vR8/tbzpud3/tazNtD/fAbSwM0+A2ngYV9tNPCybyL6ojz2TUQCB8yZkCUPmDOhgdZJOflr1JueP/lrdMCcCa3Qy5nIz/KAX750yYcp1EDvy1f+l8OAX74k0OvNn/zx5U3Pn/zx5XXoT/6i9zr0J3/Rex36k7/ovQ79yZ/YXof+5E9sr0N/8ie216E/+RPb69Cf/Intdehv/jz0OvQ3fx4umMiiSx5MoQZ6iSz583DBRBYN3EyhLvkwhRp4WWtBl+wlsuTPww27KbJkr0N/8+eh16G/+fNww26KBk6mUJe8mEIN9Lop+ScCr0P/8k+mXof+5U9sr0P/8if2gdlFsuQDs4s0sLOemS4ZbkHVCmF2kQYu1tXTJcMtqFoh3IKqgbDvqEt+DCgVetPzX36Wven5Lz963vT8l9/Y3vT8l9/Y3vT8l7+Xven5L38ve9PzhW6FNz3/5SfF69C3/K3ndehb/tbzpucL/RTaodfAzmJyNHCwmBwNhB16eZUf3IKqFcItqBp4WMtfl3wZUCt8qOf//u+88zkt+h/elbzGWv5aYGdbDDQQboLQJU+2dEArXMyUoIGbAXXJh7kctELYodfAx4CyZNqhlwrNDv2XK+ys5a8Vwk0QWuFk0zMauJgpQZe8mSlBAw8zJWjgZaYEDYSbICTQ7NDnt43Xof+bntFAOJuiS4azKRo4mUJd8mIKNXAzl4Mu+TCgVniZy0Er9Dr0+Y1tdujz5+FPh97yYciSvQ79H1ArHMzYoYGTzfdo4GJOEQ3czIehL8phPgwNhF4WXTL0skig2aHPX1Jmhz4/y2aHfuYKBwNqhZN1pLTCxYBa4WbtGa3wMKBWCLspWiHspkjggt0UWfKC3RQNhN0UXfJgQK1wsl6FVgi7KVrhZq0FrfAwoFZ4WWtBK4RTXFLhT4f+v/3nf/z7//iP/+d//dt/C5sA+5Osxj5gy2rNaPv8kGw4wKWB8POwvh6L5WtrhTCwWys8LF9bK7wsX1sDH1MoS/ai7Qv/e3vR9oX/vb1o+8L/3l60feF/bzPaPv+Pwoy2z99PZrR9/oeXGW2fv/DMaPv8LzmvOT/yJ7bXnB/5K9lrzo+8UeE150f+jvea8yN/YpvR9vlfw2a0ff4KMKPt87+GzWj7/J1iRtvn7xQz2j5/p5jR9vk7xYy2z98pZrR9/k4xo+3zd4rXnB/5O8Vrzo/8neI150f+TvGa8yN/p3jN+ZG/U8xo+/Sd0sxo+y8HNqbwSmBnCjVwsI0IuuTJNiJo4GIKdcmbKdTAw3Y26JIv29mggY8plCV70fZz5sDGtkrIkr1o+7lz4GAKdcmTKdTAxfZe6JI323uhgYcp1CVfplADH9vMIUv2ou1X/k7xou1X/k7xou1X/k7xou1X/k7xou1X/k7xou1X/k7xou1X/k7xou1X/k7xou1X/k7xou1X/k7xou1X/k7xou1X/k7xou1X/k4ZgynUJU+mUAMX2xCjS95sQ4wGHqZQl3yZQg18bIeNLHl+bIeNBjamUJY8O1OogYNt2dElT7ZlRwMXU6hL3kyhBh62B0iXfNkeIA18TKEs2Vs/n/uf2oKLhWTJ3vr53P/UvPXzuf+peevnc/9T89bP5/6n5rXnc/9T89rzJ39ie+35kz+xvfb8yZ/Y3vr5kz+xvR597iFrXo/+5E9sr0efm9Ka16M/+RPb69Gf/Int9ehz21zzevQnf2J7Pfrch9e8Hv3Nz/KBK7ikQqdH/zcU9s9fYYLXEe+TPDbCFQAnGjILgAvNhAVANsIVANkIVwC8KKg2AD4UVKuBXsD9v2bC9H3tBdz/AbXCjpJvA+BAO5+CkieaWguAiwF1yduZgWj5SfEC7v81BheUfNEYXAB8TKEs+X1ork4rfN6w48yBHQ3qBUDvpOQvvcfiiAMgiyMOgF4ccX6WH1vEFQC9Ycf8pDw27ChPSv+cVRB/s4kB0Bt2TI9e9wbo+8yBA80mBsCJZhMD4GIK9UXZTKEGsmHHoOTLgFrhQ7OJWmFjw45aoTdAv/Pf0Bug/9dXmwA4mEJd8mQKNXChwOSgZBZHHABZHHEAvEyh/g1ZHLFW6A3Qn/yd4g3Qn/yJ3VkccaBwoKDaQOFkQK1woVzZQOFmQK2QhawGCi8DaoUPDYxqhYOFrGqFXsT9zd8pg62sC4AsZDUoeTp/wb4vBy4UYRqU7EVH5i8pb4D+5WfZG6B/+UvKG6B/+cPBG6B/+V9f3gD9y/9PmWwsOACyseCgZO+k5E+baa1NyT+Md2+A/uUPWG+APm8FdHOAPn/AmgP0+QPWHKDP/2j3OvRf/vjyOvR5t6J7Hfovfx56Hfq8/dG9Dn3+Hbt7HfrWcoUHDWwHCi+arw6AjwFlyV6HPv/c170OfeHrnNehL3z78jr0hc99Xoe+548vc4o+//vQ69CP/D70OvSjcB8yz32g8DGgVOh16Feu0JuiXwWFHRndAuBA9p0AOJGxI/gNFzJ2BMDNFOqSD1OogSyOOCiZeVm0wovyiP8xrwoes7J0yeus5a8FDgbUCmGHXitczEOgFW6mUANhh16XfBlQK3ys5S+BtEOvgbBDr4GwQ6+BsEOvgbBDr4GwQ6+BsEOvgbBDL0+K2aHPT4rZoU9PyvCW0PeVA1kccQBkccTyooyPxREHQBZHHJTM4ogDIIsjDkqGHXqt8KL04EAh7NBLoNmhT8/yMDv0+Vk2O/QzL5nFEQcKWRxxoJDFEQfAzRTqktlq7QDI4oiDklkcsQZ2tlpbl9zZau0AyFZrB8DBbBMaOJmxQwMXs01o4GbdZQ08rLusgZc1gzXwsd6tBHod+pffh16H/uWvUa9D//LXqNehf/lJ8SLuX35SzA59/iex2aHPj57Zoc+Pntmhz19SPx36Su82f0lN2HeUCs0Off5wmLDvqEseDKgVwr6jVrgYUCuEfUet8DCgVgj7jloh7DtKhQv2HaXCBfuOWmFHMcyBQth31MDJgLrkhVKTA4UbRQgHwMM6oxrIMomD35BlEmuFm2USB8CG4m8DYEfhsgFwoHDZADhZu1oDF4puDYCwQy/vw82SVgOFLGk1ALKkVQ08LGk1ADYU6hkAO4rMDIADRWYGwIkCKQPgQoGUAXCjuMcAeJhTRAOhl0We5cPyI7XCy/IjA2BDUYUBsKMgwAA4UBBgAJwoZi8ALhSzFwA3CrELgIc5ljSQpeLpk3JZKp5W+FgqXgBsKIAtAELXlwYOFG8WACdTKK+yl3NfaNB4OfeFBo2Xc19of3g594X2x2NZXxI4P5b1FQAbA3YJ7CiaK1A4mFlQAyczC2ogy/oKfkOW9RUAD3Mf6pKhP1IrfMh+uBSvMXvklDyYYKQFQn+kVjiYWVArhP5IrXAxs6BWuJm3Tys8zIqngZc55zTwMeecBMIl9PqimEvoTw7szAKlgTCXRf+GMJdFAxfzVOmSoetLKzzMsaQVsiX0gcLHHEtSobmEPr8PB8xl0UCYy6KBMJdFXpQBc1k0EHpZNBB6WTQQztDriwJn6DUQztDLkukMvQbCyWBZMu3Qa4VwMlgrhB16rdDr0OcnxevQf/lJ8Tr0X/4a9Tr0hT/avQ594Y92r0P/5c/DxfZrB0Bvv3Z+UrwOfeG/AK9D3/KTYs7Q548vc4Y+/z+FztBrIPSy6IsCvSxSodehb/nDgc7Qy5LNGfr8PqQz9Foh9LJohXCGXgM382Hokg/zYWgg2xocAB9zOUig16Ef+X8BZoc+vyhmhz6/KLRDr4Fsw2MAXKxdrYGbdZc18LDusgayvXUB8LHerQRemDahgY01MjWws0amBsK+owZO1tXTwMWacBq4WYtLAw8Dyree16H/ayBphY81kCTQ69Cf/C9Yr0Nf+G7jdej/OlK65MGAWuFELakjeQvxtuRttpdECzysxaWBlwF1ydZsyt9/y0rh8mbo//5b1sDGgFsCO2vCaYWDAbXCybp6GrhYV08DN+vqaeBhXT0NhGkT+irDfRBSYfP2QaxUYYN9Rw2EfUcNhH1H/RvCvqMGwr6jLhn2HbVC2HfUCmHfUSuEfUepsMO+owbCvqMGwr6jBg7W1dPAybp6GrhYz0wDN+uZaSDsO8obu8O+owY+NgwtSzZn6POrbM7Q50fPnKHPj545Q58fPW8P/Zf/Bevtof/yv2C9PfRffvS8PfRf4aLAvqMu2fk/pRX+C/D20Bf+C/A69C0/el6HvvBHu9ehL/xJ7HXoC38Sex36nj8PvQ79H1ArhJPBWiGcDNYKH2sgSYVeh37k72WvQz/yq+x16Ef+kvI69CO/yl6HfhYuymINJA3crIGkgYc1kDQQzjtq4GMNJAn0OvQrvyheh37lF8Xr0K/8ongd+pVfFK9DvwsXZbEGkgZu1kDSwMMaSBoIp7g08LF+jwQeOMUl33peh/7kH9O8Dn3hH/ADp7h0yXCKSwMX6/fokjcDaoUHNXye5F3Eu5L3WANJCjT30OcVm3voT1qymXKf/4Y05V6XPBlQK4R76LXCzWLztcLDFGogTLnXJcM99FKhmXLfc2BjTTgN7Cw2XwMH6+pp4GSx+Rq4WJtQA72TcnMg7Dtq4GU5/BoI+47q6O0PzjteCWwsh18DO8vh18DBcvg1EKbc64sCU+41cDOFuuTDFGog3EOvS34MKBWaKfctVWim3Odn2Uy57zlwMKD+Db15x5UrXKy7rIEw5V4DYcq9BsKUew2EKfcSSFPu5W1DU+410Eu5z8+y2aH/cuBksfkauFhsvgZaJ+XkZ9nr0J/8LHsd+pOfZa9Df/Kz7HXoT36WvQ79yc+yuYc+vw/NPfT5fejN0N/8PvRm6G9+H9IZeg309kEU7sPLFkxo4GMLJiTQnKHPn9hmyn3+xDb30OcnxdxDn5+UOZlC+RqdiynUQLiHXpcM90FohZfZd7TCx+w7EmjO0OdX2dxDn/8Dbu6hz/8BN/fQ51fZ3EOf/3vrdejzz87b69B/+Z/EC+6D0MDLkhI00HN95c/DDV1fGtgYUJbsdejz79jb69C3/AHrdejzz87bnKEvXJTNgFrhYUs6tMLLfGka+BhQlux16AtfOL0OfeELp9eh7/kfnF6HvucPWK9DP/K/HLwO/cifh16HfuT3oTdDPwpXGe6D0MDHrHgS6M3Qz/yieDP0M78o3gz9zC+KN0M/84tiptwXLspiVjwN3MyKp4GHWfE0EKbca+BjVjwJNFPu84tiptznF8VMuc8viplyn18UL+W+8NnZS7k/+R/tXsp94Suxl3Jf+Er8YNqELhmmTSjg8VLub/rt63gp97flCjuxzv3TVxG8gXif5E1kdAsELmR0C4AsbSIo+TCFGniRhyAomXXoNdDr0P8BZcleh/5fnYBAYWdArZDtDA4Usp3BAZBNBgcls8ngAMi+EQclXwbUCh/66KwV9o8BpcLe0EfnQGFnQK2Q5awGClnOaqBwoU9pgcLNgFrhQZ/SAoWXAbVC9uVLKxwfA0qFo6HvSoFC9uUrUDjQh6pA4UQfqgLgQh+qAuBGH6oC4EEfqgLgRR+qAuBDH6o00Juhn/lF8WboZ35RvBn6mV8Ub4Z+5RfFm6FfhYuy0IeqALjRh6oAyPY7BsCLPlQFwIc+VGmg16Hf+UXxOvQ7vyheh37nF8Xr0J/8oiz25Uu/9RbbWhcoZFvrAuBhCnXJlynUwIe+K+mSN/vypRU6HfqfD0tD8tiHry55g30G0gIn+wykgYsp1CVvplADD/tQpUuGX760Qm+K66UKjzfFdXNgY5/SZMmno+mZAOjNpnw5cKJxnAC40PRMANxoeiYAHjQ9EwAvmp4JgA9Nz2jgZbMpAZDNpgRANpsSANlsSgBksykBkM2mBEA2mxIA2WxKAGSzKQGQzaZo4GOzKQGQzaYEQDabEgDZbEoAnKzfI9/L3gz9zW9sb4b+5je2N0N/8xvbm6G/+d823gz9TW/s683Q35sDGxp2CYAdDbsEQNh3HBII+44aCPuOumTYd9RA2HfUJbPZlADo9R3z+7DBvqMGwr6jBnp9x/wqt4GGXQLgRMMuAXChYZcAuNGwSwA8aNglALLZFH1SvA59y0+K16Fv+UnpbDZFl+x16Ft+9MwOfX70OptNCUqGHXqtkM2mBAphh14rZLMpgULYoZcKzQ59/nDwOvQjfzh4HfqR/21jdujzi2J26HcOXKz/rYGb9b818LD+twZe1v/WwMf63xJodujzi+J16Fd+UbwO/covitmhzy+K2aEvXJTF+t8auFn/WwMP639r4GX9bw18rP8tgWaHPr8oXof+5BfF69DnH3XvYonEgUKWSBwAYYdelww79Bp4WLtal3wZUCt8qF+ttoJep0H/w5uSxxKJA4EskTgAwg69Lhl26DVwsXa1LpmlRwYKD+t/a4WX9b81EHboZcm0Q6+B1kkZKy3Z69CP/LbxOvQjP3peh37k96HXoR/50fM69CO/D70O/SjcNl7OassVelNcXwr0OvR/CmXJXof+T6EGWidljbxk66T8/dujgZMBdcksEy8AbtYz00C23zH4Ddl+xwD4mEJZstehf/lV9jr0L38FeB36lz+xvQn6L3/aeBP0X36VvQn6v36PBm7WntFA2E3RQNhN0cDHWgsK+D6W9CXvw/ex/Y6BQrbfMVDI9jsGCtl+x0DhQjlagUK23zEAHgbUJV+UoxUofChHSwO9Dn3+r9lrcN5RA+G8o7woXod+tFwhS/oKgF43JT/LXod+9BzozTvmZ9nr0I/8LHsd+vzf2+d16PN/b5/XoR/50fM69Pl/o8/r0M/8pHS2CTUAeptQ85PidehnflK8Dv3MT0qHfUcN9PqO+UnxOvQzPyleh37mJ2XAyWAN9PqO+UnxOvT5N4c3WCZeAPQmg/Mb2+vQr/zG9jr0q3BjP9YMlkCvQ7/yG9vs0Oc3tteh3/mN7XXod/4K8Dr0Oz8pk+0MDoBehz4/KWaHPj8pZoc+Pym0Qy+BZoc+PynmDH1+UswOfX5S6Ay9BsIZevmflNmhz4/eYumRAZClRwZAlh4Z/IYsPVID6Qy9LHmz9MhAIRuiP5LH0iO35MH0SC0QpkdqIEyP1CXD9EgNhDP0uuTHgFKh2aF/qUKvQ//3oUoDO1OoSx5MoQZOZkrQJS8G1Ao3a/lrhYeZErTCyxRq4GMNdQk0O/Qj/Q3NDn3PgbBDr0uGHXoN9Dr0+UnxOvR//y1roHVSVv7E9jr0Kz96l+0MDoDeScmf2I/tDA6AjaWeaGBnqScayHYGB0A4Q6+B0Msiz/KDXhat8DCgVniZ9UQrfMx6IoD382boX/bE/i9gYwo1sBvrx7638pIHM8do4GRAXbI3Q/9yoDdDf3PgYX4gDbxskFcDHzPHSGCDXhZ52zQ4GawVsq11AdCbDJ45EE4G698QTgZrhV52986BcDJYlwyzu7VCOBksFXod+r5ShV6Hvuf3odeh7/lt43Xoe37beB36nr8CvA59z18BXod+5E9sr0M/8ie216Ef+UnxOvQjf8B6HfqRnxRzhj4/KeYMfX5SzBn6/KSYM/Q3fXyZM/T50TNT7vOjZ87Q50ePptxr4GN+IAmcbL9jAGzMD6SBnfmBNHAwP5AGTuYH0sDF/EAauJkfSAMP8wNp4GX2Hfm08Tr0Kz8pXod+5SfF69Cv/KR4HfqVnxSvQ7/yk7Jg2oQGLmYw0sDNDEYaeJjBSAPhPggNtPbQ7/w/qc02oQbAxixQsmRvD/3Oz7K3h37nZ9nbQ7/zs+ztod/5Wfb20O/8LHt76Hd+lr099Ds/y94e+vOlN7a3h/7kZ9nbQ3/yj7reHvqTf8Q4MJdFlwxzWTRwMT+QLnkzoFZ4kCHoSd5FvCt5j9l3pECvQ//lFV+YyyJLvjCXRQMH8wPpkicDaoWL2Xe0ws3sOxoIc1l0yTCXRQOtk/L3sU+W7HXo/z72aaCXyzJyoJfL0nPgYJ4qDfRcXzMHQteXvG0edH1phYcBtcLLHEta4WOOJQVsH3R9XQmEri8N7MxTpYGDeao0cDJPlQYu5qnSwM08VRp4mKdKAy/zVGngY54qCfT20O/0LDdvD/3Oz3KDri9dMnR9aeBku650yYvtutLAzVZTaeBhu130b3iZ0U0DH9vtIoH9Y6tYNLAx55wGdraKRQMHW8WigZM55+R92BdzzmngZgp1yYcp1EDPH5kfve75I/OjNz7m7ZMXZcCsL63QOyn5nyJeh77lN7bXoW/5fTig60sr3AyoFULXl1YIXV9aodVN6fmL3uvQ9/xFP6HrS5Y8HSfxj7FDAwczduiSoZdFK4RpE1rhZkCt8FhdvfxFb87QF0qGe+ilwgW7KVIhTbnXCjtrfmiFgzU/NHAyhbrkxRRqIOym6JJhyr1WiNopt0keCrm/n+LtDzU/tEAz5T6v2Ey5P3nJgynUQNZNCUpmKfeBwo2aH4HCg5ofAfAyhbrkxxRKoDdD/6/2TABsqD0TADtqzwTAgdozAZDN0OvbBs7QBwo36vcEQNZNCUpmM/SBwoeaH1qhOUPfc2BjCmXJ5gx9fmObM/T5VTZn6PMntteh34WrvNFn8QB4mEJ9US5TqIEPfRbXwMcmg/Vv+NhkcADsTKEueTCFGsgmg4OSFwNqhRt9mwsUHgbUCr3J4Py9bKbczwzYzZT7kwMbGkINgCzlXl6UDlPuA4Us5T5QyFLuA4Us5T4AHqZQl8x2BgfAh8Zkdclmyn1+Y5sp9/mNbabc7xw40CBvUPJEg7wBcDGFuuTNFGogmwwOSr4MqBU+NGqsFZop9z0HNqZQltzZdu0AONAwdFDyRMPQAXAxhbrkzRRq4EHj2kHJF41rB0C2D0KXPNg+iADI9kHokgfbBxEAB1OoS2Z9xwC40IR6UDLbQx8A2Qx9UDKboQ+AbIZelwxn6ANgYwplyeYMff5OMWfo83eKOUOfv1PMGfr8nWLO0OfvFG+GfubvFK9DP/N3ymSbU3TJi21OCYBsc4ouebHNKQFwMIW65MkUauBCWQ5ByZsBtcKDshwChSxtIgCytAld8mZpEwGQpU3okr0Z+pU/YDdLmwgUsrSJALiYQl3yZgo18KA8jKDki/IwAuBjCmXJ3gz9yp+H3gz9zp+H3gz9zv/G9mbod/6A9Wbod/43tjdDn3ceuzdDn3ce+zlMoS6Z+SMD4EOZIrrk+6FMkQDYmEJZ8u1MoQYOlHoSlDxR6kkAZLksQckslyUAslyWoOTLgFohy2XRCh9zEmuFj+WyBApZLksAZLksQckslyUAslyWoGTmJA4UolyWOySPGYm75LFcFilwfCyXJQCyXBZZ8vhYLksAHMwco0uezByjgYsp1CVvplADD3Pb6JIvA2qFj7ltpEKYcq8V/nToC/M9f/YdDYReFl3yYECtEHpZtMLFgFoh9LJohYcBtcJrjSfmz0Mz5f6mJZsp9zdVaHbov1wh7NBr4GDtag2crHergYs1MjUQ9h018LAWlwayPfQB8LHmhwSae+jzi2Luoc+PntehX/lFMffQ53+KmHvoV64QfiPWwM0+mGogSyQOgJd9StNAtl1bA70O/c7fepNNBgcKOwNqhfD/ea0Q/j+vgYsp1CVvplAD2WRwUPJlQK2QjQYvxXMa9D+8KXnw/3ktEP4/r4GDKdQlT6ZQA+FksC55M6BWyHJWA4UsZzUAPqZQluzN0P8p1MDGRo1lyd4M/d+/PRo4mEJd8mQKNXCxYWhd8mZArfCw2WWt8LLZZQ18TKEs2ZyhnzmwsWFoWbI5Q58/sb0Z+pXfh94M/d+/PRq4mEJd8mYKNZBt1w6AbLt2AHxsdlleFG+GfudX2Zuh3/lV9mbod36VvRn6nZ/ly9IjAyBLjwyALD0y+A1ZemQAhN0UXfJjQKnwwW6KVPjYzuBAIeymaIWwm6IVwm6KVgi7KVoh7KZohbCbohVe1qvQCmE3RSmc3gx9/l/A9GboR8+BnTU/NJBtQg2AcIpLAxdrfmjgZs0PDTys+aGBcDZFAx/rVUhgg90UefS8Gfr8j/bZYDdFKxys+aEVTtb80EC23zEAbtb80EDoI9bAy3oVGgi7KfK26dAdKRV22E3RClnOaqCQ5awGQJazGpTMclYDIHRH6pJhN0UrZPbII3msmaLW9M0Bc1alwAFzVjUQ5qzqkmHOqgbCnFVdMuymaIUwZ1UrhDmrGghzVnXJMGdVAufHPjrLkmdjQK0QfiPWCgcDaoWTfdLVChf7pKuBmynUJR+mUAMvWpAWlPzQgjQNXB/7LK6BjX0W18COFqQFwIEWpAXAiRakBUCYs6qBMGdVA2HOqjwpC+asauBDC9I00OvQ/80SamBjvQoNhDmr8ipvmLOqgbCbokuG3RQN3GgxVQCEsyn6N4TdFK3wocVUGvjToc9nAr6XP7G9Dv3L/+D0OvQv/4PTm6D/8leAN0H/B9QKrf/nv/wsexP0X/63jTdBX/hv1Jug/wr3oTfFlV9lb4K+tfQqexP0Lb9tvAn6lr9TLttaFyj0ttblrwBvgr7lr4DLttYFv+FhQK3wsiBrDXysdytL9jr0Pb9tHttaFyjsDKgVDta71QphIrFWuFgzWCvcrBmsgYc1gzUQ5qxq4GPNYAVcXod+fjmwsWawBnbWDNbAwZrBGggz8TRwMeCWwM0C4rTCw5rBGggz8XTJj3WXpUKvQ59/TFtmhz6/D80O/cuBg4WbaeBk/W8NXCw6TAM3a6hr4GHBXBp4WeyVBj4WeyWBXod+5yfF69Dv/KR4Hfr8Y9ryOvQ7P3pmhz6/sc0O/ZeXvJmHQCs8zEOggZcp1CU/plACvRn6mz8PvRn623KFHbkSnuQNxLuSN5mHQAtczEOggZsp1CUfplADLzMl6JIfA0qFXof+z0MgFXod+r9/bjWwM4W65MEUaiDchKpLhptQtcLNTAlaIdyEqhVe5iHQCh/zEEig2aEfaclmh77nwM5cDho4mMtB/4aTAbXCxWwTGriZy0GXfJgPQyu8TKEGPubDkECzQ//lQDjvqIFw3lEDYXqkvG02TI/UQJgeqUuG6ZEaCDv0umTYodcKH2sGS4Vexv2XnxQv4/7Lbxsv4/6vu6yBg3WXNXCy7rIGLta71cDNgPoqw53BWuFlQK3wsc6oVHjhzmCp0OvQ9/w39Dr0Pf8NvQ59z/+t8Dr0PT/LXoe+539weh36wv/LXoe+8N/ohZPBuuTHerdS4YObUDWwsd6tBnbWu9XAwXq3GjhZ71YDF+vdaiDcWqeBh/VuNfCyVqsGwslgdfT2B3dxPQmEk8FaYWeNTA0crD2jS4Z7U7RCr5vScoWbtWc00OumjBzodVMK9+Fj7RkJ9Dr0Z+ZAuDdF3jYN7k3RwMH6PbrkyYBa4SINn9ckbyPeJ3kHtWcCgRe1ZwIg25uiS+5sb0oAbKjfo0vunQG1woHaM4HCidozAXAxhbrkzRRqIEuPDEq+DKgVPtTv0Qq9GfqRnxRvhv5f7ZlAYUftmQDI0iODkll6ZABcqD0TlLwZUCs8qPkRKGTdlEChdVJufpa9Dv3NL4rXob/5WfY69Dd/BXgd+ptfZa9D/1oO9LopXw5k6ZEBkKVHBsDLFMqT4nXoX/748jr0Lz8pXof+5Y8vbwv9l9823hb6VgBO1AkIgAt9uA+AbIoruCgHfbgPFF4G1Aof+s6uFXpb6P+AUqG3hb7wR7u3hb7wN7a3hX7kJ8XbQj/yB6y3hX4UrvJG39kD4EHf2QPgRd/ZA+BD39k10OvQz/yieB36mV8Ur0M/84videhnfvS8Dn3hXzOvQ1/418zr0Bf+k/I69Cv/L8Dr0K/CffhQa0EDvQ79yv+j9zr0hf/1zC30+dPG3EKf34fmFvr8KsMt9AGQbaEPgIcB9W3DttAHCtkWeg2EW+h1yXALfaCQdVMCINtaF5TMttYFQLaFPiiZ5awGCtEW+jckD8Wsvi55sJuiBB64hT4Asq11suQDt9AHwMHaM7pklrMaKITdFK0QdlM0kG2tC0pmW+sC4EMb13TJ7UMb1wKgs4X++/vnVpbcOtq4Fij0clZ7Dpxon1kAZFNcAXAzoL4oXt8xf9p4HfqRP7Eb7DvKkr0O/cqPXod9Rw2EfUcNhH1H/RvCvqMGen3H/KR4HfqVn2WvQ7/yk+J16Fd+UjpLJNYXxevQr/xFb3bo8xe92aHPX/Rmhz5/0Q+WSByUvBhQK9ysXa0VHgbUCi9rV2uFjzXUpUKzQ5+/pMwOfX5jmx36/Mb2OvR/DXUNnKyhroFs3jEAsnnHAHhQxHEAZPOO+qRMtt9RKzQ79PlJWSyROACyROIAyBKJ9UXxOvRffvS8Dv2XHz2vQ//lR8/r0H/50fM69F9+9LwOfeHLktehL3xZ8jr0X35SvA79l5+UDb0s8qR4HfqWn5TNJoMD4GZuG10ymwwOFF6U6hwA2WSwLvmwyWCt8LDJ4EAhmwwOFA5m39EK2WRwoHAx+45WuJl9RwMPs+9o4GX2HQ18zL4jgV6HfuQXxevQz/yieB36mV8Ur0M/84videhn4aKwROIACL0sGsgSifXDwevQF759XbYJVQNph14D2SZU/Rs+tgk1UMg2oQZAtgk1KJltQg2AsEOvS2abUAOFrEW/JA9tQn1qU+s1O/QjE3jNDv3IFf5/z8n//M//+Pd/++//4//en/8/sC1Q3g7UmRfrJayuvNjFFGogS1gNgCxhNQCyhNUA+Jh7QF5lrzf/96ewBjamUJbs9eb/FGrgYP4GDZzM36CBi9kR9EXZDKgVHuZv0EA4E6yBjxkmJNDrzf/ZEeRF8XrzY+fAzhTqktm24ADonZT88eX15mfLgdZJmfnR83rzc+VA66TMwn1onZSZX5QBXSwa2BhQ3oc/vfmCgWzlV9nszfccyPZqByWzvdoBcFu/YX5jm9Pz+V+w5vR8/k7xevMrf6dMawfqys+y15tf+TvF682v/J3i9eZX/k4xN9Dnjy9zA33+F+xkqd0B8DCfjS75MqBWCHMmpEKvN3/zs+z15m9+9Lze/M2Pnpdvf/OT4uXb3/ykePn2N//n0cu3f/lfDl6+/ctPyoI5ExoIcyYkcMOcCQ1szIGhgTBnQt7YXm/+K/yGkzkwNHAxw4QGbuZv0MDD3AMaeBlQX+XH3ANSodmbz//GPs5cyt+C5EBhZ+4BDRwMqEuezD2gFS4G1Ao3cw9ohYcBtUKW2h0ofAwoFZq9+fzh4PXmR/7E9nrzI7/KXm++8HXO682P/CqbvfnCRdnM36CBh/kbNPAyf4MGstRuDfR68zM/eo+ldgcKOwNqhYMZJrRCltodANkO1ADIUruD3xD25rXCy4BaIWvOq42lz2nO//C25Hm9+ZYL7KzZr4Feh77nwMkU6t9wsZa/VrhZy18DDwPqkmFqt1bodejz+9Ds0H850OvQ5ze22aHPb2yvQ9/z+9Dr0Pf8PvQ69H/GDg30ciby+7DBnAkNhDkTGgi9LPIsd+hl0cDGnCKyZLND33KFgxk7tMLJgFrhYqYErZBtCw6AMGdClwxzJjTwMduELNnr0M/8xvY69DO/D73p+Zm/ArwO/czvQ69DPwsXZTGXgwZuBpT3odmhz1/0Zoe+5wphh14q9KbnV/4HJ+3Qa4WdAbXCwfrfWiHs0GuFMGdCK9wMqBXCnAmt8DKgVvhYd1kqXDBnQipcMGdCK+ysd6uBbK92UPJkvVutcDGgVrhZ71YrhNPzGgin5zXwsd6tBJrT8/l/Ul6HvuUXxevQt/ykmNPz+Ukxp+fz56E5PZ+/6DfcBKF/w8OAWqHXoc+f2F6HvvBlyevQ9/y2Mafn8/eyOT2fP23o9LwueaKt1YFCOD2vgZsBdcmHtau1wsva1Rr4WLtaAs0Off6SMjv0+VU2p+fzi2JOz+cXxZyeL1yUxdrVGrhZd1kDDwPKo2dOzxcuymNAqfDBTRBSodeh3wVgR0umA+Bg7WoNnAyoL8pCW6sDhZvN92vgYfP9GniZQv0bPqZQAN/nbaC/2X34X8DGgFphRyaCJ3kD8a7kTWZK0AIXA2qFm5kStMLDTAla4WUKNfAxl4Ms2evQ/wGlQq9D//cJQwPhJghd8mBArdA7KTcHWifl75uIBlonpeX3odehb4WrbJ2UVrgo1klp+UUxO/T589DcQP/lwM4U6pIHU6iBk9l3NHAx+44Gbmbf0RflMPuOBl6mUJf8mEIJ9Dr0f19tNLAxg5EGdmbfkRfF69D/fQbSwMkU6pIXU6iBm/mBdMmHAbXCy1btaOBjBiNZstehH/lfsF6HfuQPWK9DP/LnodehH/nz0OvQ/1mgNHAxC5QGbmaB0kDvpORPG69DP/Oz7HXoZ35SvA79zE+K16Gf+Y3tdehnfmMv6PrSQM/1ld/YXod+5jf2gq4vDfRcX/nf2N4M/Src2I/ZyCTQm6Ff+Y29G7ORaSDMZdFAmMuigZMB5Wt0w1wWrXAzoFYIc1m0QpjLohXCXBap8MBcFqnwNGYj0wphLotWOJgvTSuEuSxaIdwupBVuBtQKD/OlaYVwu5BW+JjRTSr0OvRffpa9Dn3h073Xof/yl5TXoS98dvY69F/+R/uFO1M0cDOgvspwZ4pWeBlQK4Q7U6TCB3emSIUP7kzRCuHOFK0Qur60QrgzRSuEri+tELq+tELo+tIKoetLA6HrSwHbB11fGghdXxoIXV8aCF1fGghdXxoIXV8aCF1fGghdX1cCoetLK3zMpCWBVo/+x6SlgXBnivwNG9yZohXCnSkaCHem6JLhzhQNhDtTdMkwl0UrRDtT/veiTAF8DPgpoNej/5fFKJDYGyRqjR15giKNAxK1RrY/JSIuZLqJiBu5biLiQbabiHiR7yYiPmS8CYhet74VrozXrm+FKzOYsyUiMmtLRJzIlxERFzJmRMSNXAXBs8dr2vdbIF6oUVf9oEZJNPv2hfsRNu4jYkfegog4kBcgIk5kBoiILLIluB8ny2yJiAdq1FVfqFETWWxLQPQ6+KNwCs0WfuEUmj38wik0m/iFU2h28Qun0GzjF06h18efhTvca+TPwh3udfJn5Q5/yL0QPCn2B4lSo9nML/zdY3bzC//PmO38wik0+/mFU2g29Feh6g2JWiNbShQRLUflKrwLvab+Kryvva7+Kjx7Dos9iogduTeiqgckao0T+TcijQsStcaNHByRxgOJWuNFHo5I44NEqfF+yMURaLwNErXGjtbhREQWgRRVPSFRa1xoxU5E3MhtElV9IFFrvMhvEml8kCg1mp3+gsbXIFFrZFlIkcYBiVrjRI6JSOOCRK1xI89EpPFAotZ4kWsi0vggUWnsXs+/8LWwe03/wre97nX9x1fQOJAXIyJOZMaIiAu5MSLiRnaMiHiQHyMiXmTIiIgPOTICotf9n4Ur47X/Z+HKeP3/WTiFngFgjYLGiXweEXFBoq7aOjOFrwrdMwGsyt3j+WUqd491Zgr/afbuOWYK17p7QUmFc235ANo+BeJAPqGI6G0zegUiW2cUETckylPYD/IKRRovMgtFxAc1yqotH8CvRk1kkUlB1ZYP4JeoNQ5mQRoSOBmwS+CCDiQtcUOi1nic78LfKBAvimKKqn7QJSWJngvghyir9lwAP74rrbGjOKaIOKBGXbXnNjsFjdRtpokbEnXVXtjYK2i80BGniZ7brPDs8VwAP9+4NLFBj50mWmemFU6h5wJohVPouQBa4cx4LoBWODOeC6AV7nDPBdAKd7jnAuiVO/xBZ6Ek7g9qlM+e3aBGTewo2SuqeqBor4hIHZqaSB2amrihRn1lDtSoidShqaumDk1J9FwAPxpl1Z4L4EejJnboItVVD0jUGifK0IqICzpdddUbOl018UCNuuoLvbNa44PeWUn0XACj8DeF5wIYhb8pPBfAj0Z5ZTwXwCj8Ze+5AEbh2eO5AGbhXHsugFm4wz0XwCy8ue6FLlJNfNDzKYmPOjTlHf4aJGqNHfoptcYB/ZSaSB2aumrq0NQaN/RTauKBXkVNvNCrqIkPOgsVcXwfJHZJbNBZqDV2SNQaB3QWao0TErXGBZ2FWuOGRK3xQGeh1nghUWu0zszL3wrDy+l/hTv8xwVQ+Mv+5U/c0Tp0P2qNA7ofNZE6NHXVC7oftUbq0NQaPYdm4Q738vrfLRCpQ1P+jp4LoNDnGp4L4Cu8FTwXQKGHNDwXQKE/MzwXwDcLRMsF8BXucM8FUOjPDM8F8BXOjOcC+ApnxnMBFLopw3MBtMKZGdTVrInU1ayrpq5mrdFzNRfO9aCuZl31hkStkbqatcYLiVojdTVLjfODRKlxUlez1tghUWsc0CetNU7ok9bEBX3SmrihT1oTD/RJa+KFPmlNfNAnLYnrgz5pTWzQJ62J1NWsiQMS5Slc1NWsNVJXs9a4oQdZa6SuZq3xQu+s1vggUWrcH3S6So27QaLW2KEvVWsc0JeqiRNq1FUvqFETN3S66qoPJGqNMA9wSSDMA5wKeGgeoCY26EvVRJoHqInUoSkvzKF5gFrjgr5UTaQOTV31gb5UrfFCjZr4oItUEj0XwM9XCk1s0EWqiR26SDVxQBepJk7oItXEBV2kmrihi1SeGc8F0Apn5l7oS9XEB32pkui5AFrhzHgugF44M54LoBfOjOcC6IV3oecC6IVT6LkAeuFd6LkAfr72aOKBGnXVF2rUxAf9lKrq6bkAfr5IaWKDGqckdqhRE6lDU1dNMzQ1kWZoaiLN0NREmqGprwzN0NREmqEpiZ4LYLYCsUEfoCZ26APUxAF9gJo4oQ9QExd07ck7vG1I1BoP9NhpjRcStcYHPXZSY6d5gJrYoH9NE2keoPwdvZ0AP/41rZHmAWqNC/rXtEaaB6g1Huhf0xppHqDW+KB/TWr0dgL8uKQ0sUGirNrbCfAK59rbCfAK7xnPBfAVTuFY0E2hiRt6HzTxQKL+HS90KmiNDxKlRtMFUPgdZ4NErdFzARSeuHNA74MmTkjUVS/D6dp64YnruQB64X70XAC98J7xXACV/9g9F0DlP/ZF8wDllfFcAKPwfPRcAKNwrhfNA9REzzlTONeLOmc00XPOFM6M5wKofFXwXACjcGY8F8AonBnPBTAL/2l6LoBZODOeC2AWzswe0IGkid7uzMKZ8VwAs3BmPBfALJwZzwUwC2dme26zwpnZD7qkJPF8kCjfM5YPoFW+91g+gN/ES00c0MmlidRtpn/HBRMvtUbPbVY4hcdzmxVO4bnQv6aJDxLllbF8AL85n1Lj9TI0C2fmdpgcqolehmbhFN4Js0g10Tozu3BmLB/Ab7qpJh6YbqqJ1KGpidShKc+MtxNgF96F3k6AXTiF3k6AUziF3k6AUziF3k6AU/jW7O0EOIVz7e0EOIVT6O0EOIVT6O0EOIXv4d5OgJN/nVneToCb34/ro7mzWmNnxtQjgTB2dksgdWhqiQsStUbq0NQaDyRqjTRDUxMf9CpKoucC+Pm+Ln/HRjM0NbFDoq6aZmhqjRMStcYF3Y9aI3Voao1WVnMr3OGeC+DHT6mrftBPKYmeC+BHo6y6U4em1kgdmpo4oEZdNXVoao3UoamJ1KGpidShqX9H6tDUROrQlFUP6tDUROrQlFUP6tDUxAGdhZo4obNQExd0Fmrihs5CTTzQWaiJFzoLNfFBZ6EkejsBZuHKTJoHqIl0Y7Mm0u2z8knh7QRYld+Rbp/VGjckao10+6zWeCFRa6TbZ6VGbyfALTwfF90+qzV2SNQa6fZZrZFmm2mNNNtMa6TZZlojzTbTGmm2mSY+mEQmiZ4L4Cs8zTbNNpNXxnMBfIU73HMBfIX/PjwXQOW7mecC+Ar/fXgugK9wCj0XQOVLnOcC+Aqn0HMBfIVT+OMCKPgAW+EvKc8F0Arn2nMBtMK59lwAle+P1k6AVvm257kAKl80PRdA5Yvmoa5mXbXnai48KQ51NUui5wJohSeF5wKofNH0XAC9cPd4LoBeuNaXupq1xgW93Frjhho18UCftCZe6JPWxAd90pL4qKtZE6mrWROpq1kTqatZE6mrWROpq1kTqatZE6mrWROpq1kTqatZEfdHXc2aSF3NmkhdzZpIXc2aOKEH+Ujigj5prXFDjZp4oE9aEy/0SWvigz5pSWzU1ayJ1NWsidTVrInU1ayJE3qQNXFBD7ImbuhB1kSaoamJFzqG5bPH2wmwCne4txNgF+5wbydAoQuwvZ0Au3BmvJ0Au3BmvJ0Au3BmvJ0Au3BmvJ0Au3BmvJ0Au3BmvJ0Au/BW8HYC7MKZ8XYCnMKZGTR3VhM79Pdq4oDeWfk089IATuFvMy8N4BROoZcGcAqncNDcWV31hUSt0Qqe/XtQPAV0bAC//l4NbAx4JdCyNL+CQsvSfAtAz9L8FYjU0qyJGxL1daGWZq2Rhs5qjQ+apCXRswD8NCk0kVqaNbFDu7AmDmjuldfaswD8ELXGBY2zWuOGFlJNpPZMTaT2TE18UKO8MvuDGjWR2jNl1ZvaMzVxQI266gk1auKCIZ+auGHIpybSAE19ZWiApiY+qFFW7S0EGIV3obcQYBTuR28hwCzcPd5CgJ8P15o4oRVXExe04mrihlZcTTzQiivvcG8hwKpc6wfNvVKjtxBgFf6S8hYCrMLTzFsIsAp3z6WWZv07Ukuz1kgtzVojtTRrjdTSrDVSS7PWSC3NUuOjlmap8VFLs9ZILc1a44BLqrVGamnWxAVXSmvihhr173igSVoTaYCmrppazZTG89EAzSeJNEBTa+zQIqU10gBNrZFaALRGK0BzVa71ho09rfFAotZIwzO0RhqeIYmeBeDk78LjWQBO4X70LAC3FaoekKg1wm/N/1i6BXFB4ieJ8FtzoPFAotYIvzUHGh8kSo0dLjgLiI19vQ6IMD4jIML4jIAIvzXra+1FAbTC3WNGARTOjBkFMAvECzXqK/OgRkk0owBeXrUZBXALxA416qoH1KiJk30ZDqqG35oDjdsJiPkzcgcavW/No0C8kKir9r41F564XhTAKJxrLwpgFM61FwUwCs9wLwpgFJ7hng/gR6OuekGNmrhZFyAgHtYFCIiXdQEC4mNdAE30fACzcK09H8AsXBnPB7AKz3DPB7AK19rzAazCM9zzAazC3eP5AFbhiev5AFbhrz3PB7AqdzhccKaJ2xlr/lbhiev5AFbhrbBhfyao2jszhWf4hv2ZoOoFiVoj7M8EGg8kao2wPxNofJAoNR7Yn9EaPR/ALdyPB/ZnAo0DErVGJwrgp+MTaFysmxIQYX8mqBr2ZwKNFxK1xsdicbRGzwfwCv+xe1EAX+EvKS8KoPId14sC+Ar3oxcF8BX+NvOiAL7C/ehFAXyVu+ewOJeAeFn4SkB8LCpFE70ogFa4e7wogFa4e7wogFZ4X3tRAK3wjdSLAqh8a/aiACrfmr0ogFZ4hntRAL1y91xI1Bof619Ljdf0AeR/7V3TBzALxM6CTQLiYKEhwe84WbBJoHFBjZq4WbBJQDws2CQgXhZsEhAfCzbRRM8HUPgyfD0fQOGr6/V8AIWvrtfzARS+ul4vCmAU7nAvCmDmf1NcLwqg8GX4elEAs3AKvSiAwrfm60UBzMJ7xosCKHy9vl4UwCycQi8KoPA9/HpRALNwCr0ogMIX9utFARS+h18vCmAV7nAvCqDwPfx6UQCF7+HXiwIofL2+XhRA4ev19aIACl+GrxcFUPgyfL0ogFX428yLAih8Gb5eFMAqvLm8KIBdOIVeFMDuhd/xsqiUQOODGiVxfiwqJSA2FpUSEDuLSgmIg0WlBMTJolIC4mJRKQFxs2ATfYfPw8JXAo0XatTEx8JXNHF5vubCKVyNOaX1lVmdOaUDIoycCaqGkTMBcTHvdVD1hkSt8UDv9ZDEC4ldEh/0XkuNXh7AD1Fq9HwAP95rrbFDotY4oJtbEyd0c2vigm5uTdzQza2JB7q59bW+0M2tiQ9qlFV7PoBWuB89H8BfXkpA7CwvJSAO6DiXV8bLA/j5wq6JcC1gUDVcCxgQD3Sc66ovdJxrIlwLqKu+cC1gQGzQw66JHfrDNRGuBdRX5sK1gAFxQY266g01auKBTmlNvNAprYkPOqUl0csDmIWnmZcHMAvX2ssDmIUr86ivWd7hXh7AKlxrLw/g56ur1kh9zVoj9TVrjRf6cTXxQa+rIr7vg8QuiQ16XbXGDola44BeV61xQqLWuKDXVWvckKg1Huh11UTPo9kKxMfyUjSxfdDrKq+M5QP4JWqNnSWwBMQB3bO66gmJWuOCflytcUP3rCYe6HXVxAuJ+nd80OsqNXo+gK9wrT0fwFe41p4PoBWutecDaIVr7fkAWuFaez6AVrnW1KOpNVKPptZIPZpaI/VoSo2eD6DwLeV5PoDCl4/n+QAK3yme5wMYhfe15wMYhXfhgCvOAuKGvj1NPNBlp4kXOtj03UP9ZpLo+QBm4cp4PoBZeD56PoBV+B09H8AqPB89H8Aq/PcxqXdGE2G+WXCtqXdGa7yQqDU+6HSRGj0fwC7c4QuungmIHXbtNXHArr0mTqhRXmvPB3AKTzPsA9BVw9UzgUbqA1iS+CBxKiL2AUiNpg9gFTR6PoBT0Digs0ATJ9Soq15QoyZ6mYCvUPWBfgpNvFCjrhrun9FE0wfQ8qoPzQTUxA416qoH1KiJnndmFKpekKg1et6ZwvPR8wH8uHE08UKNuuoHNUqi5wNohWe45wNohWe45wNohWe45wNohWe45wNohWe45wNohWe45wNohWe45wNohWe45wPohWe45wPohWe45wPohWe45wPohWe45wPohWe45wP4cbBp4oQaddULatREmj2rq6bZs5pIs2d11TR7VhD/+Z+Hhs8ujaTpswGSxs8GhdP82QBJA2iDwj3X2VdBbqgyKPxAlQGShtAGhdMUWo30LAFjFAr3PAGjV5AdhuUGhQ+YlhsgJ1QZFL6gygC5oQ00KPxAH2iAvFBlUPiDKjXSWxYwKu8eb1vAqLx7vHUBo/Lu8fYFjMq7x1sYMCvvHm9jwKy8e7yVAbPy7vF2BszKu6fTMOegcM/1XHn3eGsDZuXd4+0NmJV3j7c4YFbePd7mgFl5UXirA2blqe7tDpiVp/rYUGVQ+IEqA+SFVvegcO/0VJ7q3gKBWXmqexsEZuWpPmkcelC4NzdQeapPOjgQFL6gygC5Ych6UPiB0wgB8kKVQeFwa22A9FYJrMpTfcG9tRGyQ5VB4QOqDJATjosEhS+Y3x4gN1QZFH6gygB54VhLULh3eirvnk2Hb3Th5laByrtn0/GboPABkYFKOoATqFwQGaikIziBygORgcoLx3oClQ8itcpDx3C0ykPncAKVHQ65BCoHnHIJkBOOuQTIBadSAuSGyODyHDiXEqi8cDAlQD44maKRl4am69/S2zTQKr+lt2qgVf7a8HYN9Mp96S0b6KXfcsHZj0DlhshA5YHTH4HKC5GBygcnSjTSWzlQas54OwdKPYpHw6AD5IBTJQFywqhlfRM9mgcdIDdEBoUfmN8cqPRGdCofIh6d0ZHI9tEhnamRDc6CBCo7RAYqB5wGCVROiAxULjhhEqjccMQkQB44YxIgaWhn8Fs+OBOiVXprCE7lQDaa26kLbzS4M0AOOGkSFD4hMlC54KzJ0cgNkVsjD/SkBcgLTWkBkubdaKTnNdiV39LzGvx8J9JX3PMa3Mrl8bwGP9+JApUTIgOVC34nClRuiAxUHphSE6i8MKYmQD74NUsjPa/BT6xMgKTf3PTlGfSbW6CSpt8EKif8jBeoXHB7ZIDccNljgKQJOAHywnWPAfJBlfqKTxqCo1V66QRf5b704gm+yn3p5RN8lfvSCyholfvSSyholfvSiyholfvSyyhopfvywq+sgcoHkVqlF1PQK5fHyynold/SCyr4+Ss4UDkgMlA54VfWALngV9YAueFX1gB54FfWAHnhV9YA+eBXVo3cH/x+qe/L3SAyUNmNVee/3y8D5IAfG4PCJ0QGKhdMGQpUbogMVB64hS5Ael+sS7f6g5vtNPJ8MLIpQDaY2RQgO1xuFyAH3G4XICdcbxcgF0yr0qfH8xqsyunxvAar8qLwvAarcnoO3c2mf0vPa7Ar96XnNdiVb26XrmcLkAM2FALkhKvKgt9yQZUBcsNlZQHywB5F8Fte2KMIkLTfowt/tN8TIBtse+jCPa/BrdyXXqLBjyntaeSEnZQASfs9VyO9fs+oqPQSp3oFeWFgWYD0MqdmjuxersHPB7IASTe2BcgO47sCJN3ZFiAnDMcKkAumYwXIDcOsAuSBSVEB8sKoqABJN7dpZKOr2wIk3d0WIDuMOQqQA2YIBcgJQ4QC5IIJPQFyw4ieAEm9BgGSeg0C5IMq5Xu8e16DH5UBssEAHF245zXoldNj5hpUTo/nNRiV0+N5DUbl9Hheg1E5PZ7XYFROj+c1GJXT43kNRuXd43kNRuXd43kNRuX0eF6DUTk9Zq5B5fSYuQaV02PmGlROj5lrUDk9Zq5B5fSYuQalW/3B9AWNxLkGAZLmGgRImmsQIGmuQYCccBY/QNKNiAFywyn3AHnglHuApEsRA+SD8+MauehkdoCkk9kBskOV+u/LRSezA5UTIgOV1unZlQPp5Rrsyunxcg125fR4uQa7cnq8XINdOT1ersGunB4v12BXTo+Xa3Aq7x4v1+BUTo+Xa3Aqt7qXa3Aq7x4v1+BUTo+Xa3Aqp8fLNTiV0+PlGpzK6fFyDU7l9Hi5Bqdyerxcg1s5PV6uwa2cHm9Vwq2cHm9Xwq2cHm9Zwq2cHm9bwq2cHm9dwq18IPP2JdzK6fEWJvwgtUpvY8KrPDYunVAIVA7DOvfr/Q+QdEIhKJxOKARIuqI3QB449BAg6ZLeAPng0INGel6DH5X6Jnp0QiFQ2SEyUDng0EOgcsKhhwC5YA5MgNxwjiJA0gmFAHnhHEWAfFClvImGl2tQaRMPL9eg0iYen+WxbrtS+IDTHoFKb75nV5B003VQ+IYDJIFKuus6UHnhAEmgkm671iq9XINKH3I0uu86UNnhmEuAHHDMJUBOOOYSIBcccwmQG465BMgDw4SCm4iuvQ6QDyJ14f2DYUJaZW9wzCVAdogMCh9wzCVQOSEyULngmEugcsMxlwB54JhLgLxwzCVAPjjmopHjg2MuAbLBMZcA2eFMSoAccCYlQNLV8fr0DG++51VUeolUldPj5RpUemdj0PXxAZLO9+jL4+UaVNoeY9IN8oFK6/+eSttjeLkGlbbH8HINKm2P4eUanFX5LTdUGSDpHvmg8AuRgUq4Ffsfh7BAel6DH+SnkY1Z4COVnTnBI+RgTvAIOZl7OUIu5guOkJv5giMk9FhHNxH0WEfIx6zGQeEb7i0NVG64tzRCdmaIjpCDGaIj5GSG6Ai5mCE6Qm5miI6QhxmiI+Rl7uXoVoce60DlgR7rCNmcPuSonPEDNy9GyAGRQeGTOcEj5GJO8Ai5mRM8Qh5m246QcPNihHzMCR4gPa/B33ei4L70vAazcsY9r8GsnHHPazArB9LzGszKgfS8BrNyIO9m5vKo8MMs8JHKC1UGyMcs8AHyfcwCHyEbs8BHyM4s8BFyML96cBM9uDsuUgl3x0XIzfzqEfIwV32EvMyvHl2eB5FS5fRyDXbhX/zp5RrsUVHZmas+Qg7mqo+Qk7nqI+RirvoIuZmrPkIe5qqPkJe56iPkY676AOnlGpzCd6Lp5Rqcyunxcg1OryAHM+pHyMmM+hFyMaN+hNzMqB8hD3PVRzfRZd7/SOWDKjXSyzW4hTfkNHcoVB4b5g6FymPD3KFQOePmDoXKGe9wb2mE3GycIELCvaXRTeRNKFQeGx1OKARIL9fgVs64uUOhciDNHQqVA2nuUKgcSHOHQuWvYHOHQuWMe7kGr3LGvVyDdyqFX4gMVD42QBKoNHcotAqysaGHCNkhUv+W5g6FyhX3vAZf5Yp7XoOvdMU3G3qIkHBCIUJeiAx+y8eM+gHS26HQKjfRglt/I5WdWeAjlXDrb6RyMgt8pBJu/Y1UbmaBj1TCrb+Rystc9RHyMVd9gPR2KFTaxNPboVBpwM7dmas+Qg7mVw9uInOHQuWKmzsUKgfS3KFQuuKH+S8jlZ5LtPJw29AlGiC9HQqlb8HeDoXSh1tvh0Lpw623Q6H04dbboVD6cHtgCnxwX3o7FErfgg/c+hshL8uqj5BeCnzl9Hg7FE7Bhji9HQqn8rz0diiUPi+bOxQqj+ALt/5GhS+IDFRulgn+zx+vCnkgsmvkhe7lAPmge1kX/mCOdYSEOdYRskP3coAc0BccICf0BQdI6rHWN9GjHusAeaAvOCj8QmSg8kFfsEQuz2vw869UgGzQcRsgO/SyDo2kLtEAOSEyKJy6RAPkhv7LAAmTeCMkTOKNLs+D1jmN9LwGq3IgPa/BqhzIRn1uAZL63ILfEmaJRsgFkUHhGxqpApUHIgOVF3qzAuSDRiqN7DBLNPgtPa/BrjyCO8wSjVTCLNEIOaGfKEDCLNHot9zQTxQgDzT/BMgLbTXBb0mdOlrloE4drdLzGtzKFfe8BrdyxT2vwa1ccc9rcCuvM9NrULo8G9oXAuSByOC3pF6DQCX1Gmgk9hoESOo1CJDUa6AvD/YaBConNAYESJiGGCE37OIHv+WB/fFA5YXIQOWD/XGt0vMa9Mpv6XkNKp+eluk1qLx7TK9B5U8D02tQ+dPA8xqUvhN5XoPSdyLPa1D6TmR6DSp/Gpheg8rl8bwGs/Kngec1mJUrvmGeW6RyQGSgcsJmdoBcsE0cFL4hMlB5YJs4QF7YgA0KhzuzA+SBO7MjZIMq9W/peQ1K/+l6XoNb+Zvo0G5poHLBPuTUyM0WCf/TTFLIA5GBygtbm4HKB1ubGunlGvy0NgNkg63NANlh0zBADtg0DJATqtQ3kZdr8KMyQG7YhwwKp93SQOWFrc0A+WBrUyM9r8GoXB7PazAqZ/zRbmmgknZLA5W0WxqopN3SAEm7pQGSdksDJO2WBpfnQaRUuT/aLV0a2SAyUNlhAzZADtiADZATNmCD35KmggQqtxMmtF5F5YE93QBJU0GCwh/s6WqVjaaCaJWe12CvCrLDNnGAHLCnG/yWEyIDlbRbGiBptzRA0m5pgLzOGT+ly0O7pRrpeQ1O4U/WbeYaVJ5EONcgUDlgTzdATtjTDZALNmCD33JDZKDywJ5uoPJCZKDyWdsCC/+Pb89r8CqvMzPXoPI6G3DzYqRyQGSgEm5ejFTCzYsRcrM1iRHywGZ2gLxsTWKEfFClvuKm16ByX064eTFS2WEXP1A52JrECDnZTsMIuaAxIEButtMwQtJcg+CKU69BoPJBpFaJvQZapek1qPyW2GsQqBwQGaikXoNApZdrUPlXCucaBEjPa9AqSJprECA9r0HlvjRzDSp//pu5BpWvBmauQeVW97wGo/Ik8rwGle/q2/MaVD6C7w03L0bIA90l+rGx4ebFSOWD7hKt0vMazMp9aeYaVA4kzjUICh8QGaikuQYBkuYaBIVviAxUHuguCVRe6C4JkNSpowu/1KkTIBs0rOjCvVyDW/nTwPMa/LiXj0ZOiNwauaAHJkBu6IgICj/QEREgL1QZFP6gSo18dPtVgKTbrwIk3X4VIOn2qwA5oRUkQC64qipAbuguCZAH7pUKkHT7VYB80AoikcfMNbgVZIPukgDZ4camADmgYSVATrgEKkAu6IEJkBsaVgLkgeuVAuSFu5AC5IO7kDTSzDWo3OqNOnUCJHXqBMgBtwwFyAnNPwFywZVAAXJD80+APHAlUIC8cCVQgKT7ezSyU6dOgKROnQDZ4bKdADmg+SdAUqdOgFxwM06A3DAjIkAemBERIC9cYxMgH3Q9aaTnNTiV+9LzGpzKfel5DU7leel5DU7lVve8Bqdyq3teg1u51b1cg1u51b1cg1u51b1cg1t5BHu5Brdyq88P7kkJkA0aqQJkh3tSAqTnc6vc6nPCPSkBkqaCBEiaChIgD1xqEiBpKsjRyAeRWuWP16BinavcRKtBu5cufHVo9wqQA8ahBMgJHWQBckFvVoDc0EEWIKnPLbiJLrR7BSofRGqVntfgq9zqntfgq9zqnteg0pw5ntegVW51z2vQKre65zVolVt900yd4CbyfG6rotLzuc0KkvrcNNLzGvwMewdIur9HX55D9/cEKun+nkAl3d8TqKT7ewKV1OcWqKROnQB5oQcmQNINJPq39LwGu3J6PK/Brvzf43kNSp+ezB0KldeZt0PhVG6iS506QeHObGkrfc26B64LCQq/cF1IgKROHY181KkTIGmmjr48j2bqBEiaqRMUTjN1ApULmn+uRm6YVhMgvUydXkF6mTp/N9HTyAeRUuX1vAY/f18GSLqB5Glkh8hAJd1AEqikG0gCJN1AEhRON5AEyAPtXkHhdANJgHzQ7qWRntfgx+4VIL1MnVFBduggC5ADOsgC5IQOsgC5oIMsQG7oIAuQBzrIAuSFDrIA+aCDTCM9r8GsnB7PazArp8fzGszK6fG8BrNyejyvwaycHs9rMCunx/MazMrp8bwGs3J6PK/BrJwez2uwKqdn0ESqAOn53CqnZ1CfW4CkPrcASX1uAZL63AIk9bkFSOpzC5DU5xYgqc9NIyf1uQVI6nMLkNTnFiCpzy1Aej63yn3peQ125b70vAa7cl96XoNTeap7XoNTutUftM5p5PqgdS5Aej63yunxvAancnrWgG68ADmhGy9ALujGC5AbuvEC5IFuvAB5oRsvQD7oxtPI/cFYswDZoMEvQNLtVwFyQINfgKTbrwLkgga/ALmhGy9A0jy3AHmhGy9APujG08jzQetcgGwQqT+Jng6tc4FK6nMLkBPavQIk9bkFv+WGdq9A5YHIQOWFDrJA5YN2L430vAatcsU9r0GlHXd/vAaF/viPnyhADugnCgqfEBmoXNBPFKjcEBmoPNBPFKi0Tk+p0eV5DUqNrud4rP93Vzwt3PMa9MpN5HkNeuX0PLo7Lih8wvC1QOWCKgPkhuFrAfLA8LUAeWH4WoB8MHxNIt/3wfC1ANlg+FqA7DB8LUAOGL4WICcMXwuQC4avBcgNLZ1PI6lLNFBJXaKBSprnplW2DxpPAyR1ierCG81zC1QOaDwNkNQlGhROXaKBSuoSDZA0zy0onOa5BUjqEtWFd+oSDZA0z00X3mmeW6ByMM/gP3/KKOSEyE8jFzP4RSo3RAYqPZ/bV1EJ89wiJMxzC5Ce16BXrrjnNfhRGSA78wxGhQ+IDFRO5hmMVC5m8IuQMM8tKvww61ykEua5RSofs84FKif0uUXIxkxpQeGe12BWHhue12BWbiLPazArN5HnNZilK76ZNysq/DAjVaTyQmSg8jEjVaDS8xqsyhX3vAar8lT3vAa7csY9r8Gu3ESe1+DP9RSpXBAZqNzMSBWpPMz1FCEvsyhFSJhIFSA3dOoEl8fzGpzKGd8wkSpCDmZYiZAwkSr6LRczrETIzdwlUeGHWUEi5GW+jajwxxwRgUrTa1C5PD9eA2vDXYTszLcRFT4gMlA5mckiUrmYySJCbmayiJAwUydCXogMLg/M1AlUXpipEyEbc0REyM7sC8FvSb0GkUroNYhUQq9BpBJ6DSKV0GsQqbwQGah8rPMcqPRyDUqfnjyvwai8zjyvwai8zjyvQenT04PbryIk7JZGSK9bWnm4PdgtjZBw+1VUuLP1txW+ZrXP8xrM/OH2X0jr9MxeQXbWJo6QAyKD33KyznOEXKxNHBW+ITJQeVjnOUJe1iaOkLBbGvyWDXZLIyTM1AkKbzBTJ0LCTJ2ocJipE6lcsAHbNdLrlv6dnqGRByIDlRc2YAOVDyK1yk67pVplp93SANmhyqDwAVUGyAkbsEHhCyIDlRv2dAOVB/Z0A+SFPd0A+SBS/5ae12BUnkSe12BUnkSe12BU7kvPazArN9GA268i5ILI4LfcsE0cqDwQGai8sPMcqITbrwLkhKkgERJuvwp+ywlTQSKVAyIDlTAVJFK5YDM7QG7YzA6QByKD3/LCZnagEqaCBCoXTAUJVHpegx9koLLD/nigEqaCREi4/SpCwlSQ6Ld0PNY/eRuRSpgKEqmEqSARknoNdOHYa6BVYq9BoJJ6DQIk9RoESOo1CH5L6jUIVMLtV5HKA+0LgcoL7QsB8kH7gkZ6XoNb+SfFzDWoXHHTa1C54thrEKicEBmoXNC+EKjcEBmoPNAREai8bGNThHxsvVKANL0GlZvI8xp8lSeR5zX4Kvel5zX4Kvel5zX4Kvel5zX4Kvel5zX4Kvel5zVopfvyQndJgHxsF1KAfDAVJLjiD+7viVR2iAxUwv09kcoJkYFKuL8nUrkhMlB5oGElUHkhMlD5oAdGIpuZa9ArSJhrECE79MAEyAE9MAFyQnfJ0MgFkYHKDU0WgUrPqXMqSM+p8ypIL9egcMab5zX4i8aOkNbpqXwEb57XYI0K0jo9lY/gzfMarFVBWqen8hG8WV6Dtiq3updrUPmu3rxcg1U5PV6uQeVTffNyDXbl9Hi5BpVP9c3LNdiVW70PiNRP9e753E4FSX1uAdLzub0KkvrcAiT1uQVX/LFtgYHK8UGVAbKxPXwRskPrnP4tx4DWuQA5ocqg8AVVBsgN3XhB4QciA5UXWueWRj6InBLpeQ16K6j0vAY/brwA2SEyKBzujotUwt1xERLujosKh7vjIiTcHRcVDnfHRcgHkbrwBXfHBSoX3B0XIeHuuAg5nJb7qNyXntdgVA6k5zUYlQO5aKZOUPhhG+4ilTRTJ0A+iNSFe16DUTnjntdgVl5nntdgVs74tk7Pz2BT8FtOtjQvUkldogFyQ2RQ+GF7+CKVFxpPA+SDSF245zWYlTPueQ1m5T3ueQ1m5Ywf6/T8fGwMfsvJVvtFKhd03AZImkgVFH7YtsBIJU2kCpAPInXh94O+YK3yNrYtMEJ2aDUOkN7peZXfcrIFhJHKBd3LAZJ6rIPCD3QvByqpxzpQ+aB7Wat81GOtVT64eTFSCTcvRkjqsQ6Q1GMdIBdbkxghN1QZXHHqsQ5UUo91gISbFzWyf9RjHSCpxzpAdrYmMUIOaNsOkNPy/hfuy/7BzYuRSrh5MUIeiAwKv2yZY6TyQXO5RrYPInXhrbH9kJHKDi3wAXKw/ZARckJXfYBcbD9khNzQVR8gD0QGN9FlKycjld7pqTw2vFyDVznjnU4oBEg6oaAvT6cTCoFKOqEQqPQmFCoHstMJhQDpTShUDqSXa/CjMvgtn5XSWXlDerkGr3LGvVyDVznjntfgq5xxz2vwVc74gHtLI+SC0x4BckOVwU0E95ZGKi9EBiofnPbQKucHpz0CJM0SDZAdDpAEyAFHMwLkhAMkAXJBlfomsrwGrVX+ZJ3efE/lDTkvnEkJkN58T+UNuT6oUl+e1eCYS6CyQ2SgcsAxl0DlhMhAJdxbGqncEBmohHtLI+SFkzMB8sHJGY3cH5ycCZANTs4EyA7HXPRNtGmWaICcEBkUvuDkTKByQ2Sg8lgZt5Uz/uM18JCBygdd9VrlgXtLA5XHm1Co3ESnQwt8gBzQXB78lnBvaaRysSWjkcoNneAB8kAneIC8UGXwWz6oUiO9XIPSd/UL95ZGKq1vbj9/Xx6NHBC5NXJCC3yAXNACHxS+ITJQeeDHxkDlhchA5YOf8TTyx2tQeLj9XHFdOM41CJA01yAonOYaBCpprkGgkuYaBCpprkGgkuYaBMgL/5UKkA/+KyWRw8w1mBVkg/9KBcgO/5UKkAP+K3U0csLdHoFKmmsQIDfcmhEgD/yHL/gtvVyDVVH5oEqN9HIN5qkgGwx0CJAdBjoEyAEDHQLkhIEOAXLBQIcAuWGgQ4A8MNAhQF4Y6BAgHwx00Egv12BVXhRersGPiVc/ibxcg1U5PTjXIFBJ9/cEKhf8EBGo3HC8P1B5oMoAeeF4f4D0vhpULo+Za7AKl8fMNai8x3GuQVA4zTUIkHR/T1D4gshA5YafS55GHoi8Gnnht40A6U1mjwLSzDXoFWSDs/j68pi5BrOCpLkGQeE01yBAet/cKre6mWuwK0iaaxAgaa5BgPQms1sBiXMNAiTNNQiQNNcgQA4YQhAgJ0wMCJALJgYEyA3H+wOkl2tQOT1mrkHl9Hi5BrNyerxcg1k5PWauQeX0mLkGldPj7VCYldNj5hpUTo+Za1A5PWauQeX0mLkGldNj5hpUTo+Xa7Aqp+fQ7VcBssEp9wBJt18FSG/7VeX0HLr9KkAuOOUeIDeccg+QB46kB8gL58cDpDeZXTk9Xq7BrpyeS7dfBUhvMrtyejyvwa6cHs9rsCunx/Ma7Mrp8bwGu3J6zFyDyukxcw0qp8fzGpzK6fFyDU7l9Hi5Bqdyerxcg1M5PV6uwamcHi/X4FROj5drcCqnx8s1OJXTY+YaVE6PmWtQOT1ersEtnJ750cnsANngGHWA7HCMOkAOOPMcICccUA6QCw4oB8gNB5QD5IEDygHywmniAPmgdU4jvVyDV7nVvVyDV/iuPr1cg1c5PV6uwZsV5IQ2xAC54MxzgKST2cHlobvjApV0d1yAfHBAWSM9r8FXOeOe1+CrnHHPa/BVzrjnNfgqB9LzGnyVA+l5Db7KgfS8Bl/lQHpeg69yejyvwVc5PZ7XoFVOj+c1aJXT43kNWuX0eF6DVjk9ntegVU6P5zVoldPjeQ0qxoDp5Rq0yunxcg0qXoPp5Rr00k30IFKr9HINKl386eUaVFru08s1qHSep5dr8IMMVE7oqg9ULogMVG5o1A9UHogMVF7o/Q9U0slsrXLRyWytctEJhUAlnVAIVNLNi4FKunkxUEknFAKVdPNioJJOKAQqrcnsVXmdLbo7Thfu5Rqsyk3k5RpUmjNz091xgcoB58cD5ITz4wGSeqyD35JOZgdIOpkdIOlkdvBb0slsjTx0MlsXfuhkdqASTmb/8zBWSG8y+1+3+j/+J4WcEBmohNuvIiTcfhUhD/OyRsjLvKwR8jEva4D0vAa9csU9r8GflzVCduZljZCDeVkj5GRe1gi5mJc1QsLtVxESbr+KkHD7VYR8zMsaIB/cfhUh4farCAm3X0XIwbysEXIyL2uEXMzLGiE387JGyMO8rBHyMi9rhHzMy6qRy/MazFtBNuZljZCdeVkj5GBe1gg5mZc1Qi7mZY2Qm3lZI+RhXtYIeZmXNUI+5mUNkJ7XYFVOj+c12JXT43kNduX0eF6DXTk9ntdgV06P5zXYldPjeQ125fR4XoM/L6v+H3J5XoNdOZDeDoVdOZDdSaT68bIGhXs7FHbljHs7FHbljHs7FE7ljHs7FE7ljHs7FE7ljHs7FE7ljHs7FE7ljHs7FE7ljPfHHLcB0tuhcCoH0tuhcCqnZ3TmuI2QgzluI+RkjtsIuZjjNkJu5riNkIc5biPkZY7bCPmY4zZAerkGt3JferkGr3JfTri/J0LC/T0RcjLHbYRczB4bITezx0bIw4ynwR8wE+7viVQ+5rgNkAvu74mQcH9PhIT7eyIk3N8TIeH+nggJ9/dEyM3ssRHyMHtshIT7eyLkY/bYAOl5Db7K6fG8Bl/l9Hheg1Y5PZ7XoFVOj+c1aJXT43kNWuX0bLi/J0LC/T0REu7viZBwf0+A9LwGf8bT4KV74P6eSGVnxtNIpecSrdxEB+7viZBejnXlJvJ2KFRa7uvAHOsI6blEK89Lb4dCpeW+vB0KlZb78nYoVFru63ou0cqtfgdz3EZIz2NdudXvYo7bCOl5rCun5x7muI2Ql9ljg+flfSxmPFD5PqgyQDYWMx4hOzPxBr+lt0Oh0sVfD26/ipBw+1WE3CxmPEIeFjMeIS+LGY+Qj8WMa+T2dihUWu7b26FQablvb4dCpeW+vR0KlZb79nYoVFru29uhUGm5b2+Hwip0+La3Q6HSct/eDoWfznOg0tsdV7nVG9wdFyG9CYXKre7tUKh0nre3Q6HSed7eDoVKm3h7OxQqbeLt7VA4hb+JtrdDodJ53t4OhUrneXu5BpXO8/ZyDSqd5+3lGvx0nvXl8XINzqwgB1QZFD6hygAJU+CjwjdEBioPHM0YGnn/387OHdduIwiie3HsgOT8F+PEgAIBtmHIn0x7t+TkEQK6UKcWoIMevVu3yb7VNSHyqZEn9GbVSOY1eDWK+uDMa/BCiiqf0PUkqmwhUlTZQ4uSQI7QoiSQM7QoCeQKLUoCuUOLkkCe0E9Uf4iY12A5H3XmNXh9BQvkE1qUBLKFFiWB7KFFSSBHaFESyBlalASSOXWa87ncIVJUeULXU41kXoPtqId5DbajHnaHwnbUw+5Q2M5Hnd2hsJ2POrtD4eV6qj+X7A6F46iH3aFwnN6Dcg3eridx8DANUSDZHQrH0Ti7Q+E4Gmd3KBxHkOwOheM8DM4wDVFVGaYhKuQMf8wWB18hUlS5w1+eRZUnRNZVLnRndnO+gpnX4PUTUn1w5jXozpfby2tgHLw7X24r/b1HIEeIFAefWVqNQqYTa3HwHSJFlSccL9dVMq/Bcj7qL6+B8eexXvh2ePOiqjK8eVEhe1ilOPgIqxTIdOYmDr5CpKiSzdw+vtVHjTwhspdIlmvwmgwKZHgDiUI+4Riv/r884Q0kqsoejvFEleENJKrKGU4GBXKFYzyBTGduApnO3Mo/z7rSmVuvkXc4IBPIJ5xmCWS6HSeQPZwTiT/PCJGiynQ7TiDT7TiB3OFQRyBPOC6p/zzwDgXnQ5TeoaCqfEKkqDKdGogq06mBqHKE7+OiynRqIKpcoV9dVJlODQTyhFXWB3/CHGuFvENXfX1w5jV4ZeMJZAurFAfvYZUCOcJ1AnHwGa4TCOQKqxQH32GVAnnCpYf64OwOhdfSg0DeYZX1wdkdCq8qBbKFqxni4D1czRDIEVYpDh6mwCvkChdIxMHDFHiFPGGV9cHZHQrN6T3sDoXm9B52h0Jzeg+7Q6E5vQfeoeD0HniHgtN74B0KTu+Bdyg4vQfeoeD0np7u99QHH+l+j0DeYZX1wUf6e49AtnALSRyc/d7j9B54h4LTe+AdCk7vgXcoOL2H5Rp0p/ewXIPu9B6Wa9Cd3sNyDbrTe1iuQXd6D8s16E7vYbkG3ek9LNegO72HeQ2603uY16A7vYd5DbrTe5jXYDi9h+UaDKf3MK/BcHoP8xoMp/ewXIPh9B7mNRhO72Feg+H0HpZrMJzeA70GTu+BXgOn9zCvwXB6D/MaDKf3sFyD4fQe5jUYTu9hXoPh9B7mNRhO72Feg+H0np3ulgrkCqsUB0+dOgLJnDpO72G5BtPpPSzXYDq9h+UaTKf3sFyD6fQelmswnd7Dcg0c38ZiuQbT6T0s18CxgiyWazCd3sNyDRx3yWa5BrM7yDtcox418gnXqAWyhVWKg/ewSoEc4bK3OPgMl70FcoVVioPvsEqBPOH+eH3wO3WJCuQdVlkfnOUarMtBtnDLXRy8h1vuAjnCKsXBZ1ilQK7QHisOvkN7rECesMr64DDXwOk9T3jzojg48xo4prTN7lB4OW5XjewhctbIEV5qIqqcoYlXVLnCKgVyhyZegTzh1Ss1EuYaLAeZ3kAikE9o4hXIFpp4BbKHjtv6o85yDZbzIYK5BtZffIUmXoHc4Uq6QJ7QF1wj4R0Kl4Mk+z3v/fH6Q8RyDV5WY4FsIVIcvIeL8wI5QkO0QM7QEC2QKzREC+QO3csCmW5m1x+ikW5m11UOpJ7jfAWzXIOXe1kgU4+1OHgPny9FlWkilahyhs+Xu0ayO7M/voJPjdwhUlSZJlLVSJZr8HpkFcg0kUogn/CRVSDTRCqB7OHVfgI5wqdggZxhyJVApttxArnDkCuBPOGzeo1cV3gPn0De4bO6QD5hyJVAtvDxXyB7GHIlkCN8oxDIGb5RCOQK3ygEcodvFAJ5wmf1Grmv8FldIO/wWV0gnzDkSiBb+PgvkD28LVAgR/hGIZAzzM0SyBW+pAjkDkOuBDJ976mRLNfgOOphuQbHUc9JE6kEMn3vEcgexkcJZPreU79RnDQVRFQZvveMu0aG7z3jqpEnO3hd5WFegxfyqpFIPc8HstXIJ/y/FMgWIp8aidTzsfOsqkS953kcJOo9HwvKCsnU0x0kU89ykKj3fKz+CiTLNfhYqlVIpp7tIJF6miNIlmvQHEGyXIPmqAd5Da7mqAd5Da7mqAd5Da7mqAd5Da7mqAd5Da7mqAd5Da7mqAd5Da7mqAd5Da7uqId5DbqjHuY16I56mNegO+phXoPuqId5DbqjHuY16I56mNegO+phXoPuqId5DbqjHuY1GI56mNdgOOphXoPhqId5DYajHuY1GI56mNdgOOphXoPhqId5DYajHuY1GM5Hnd2hcJyDM6/BcTTOvAbHOji7cd7ROMs1uByNs1yDy9E4yzW4HI2zXIPL0TjLNbgcjbNcg8v5qLNcg8vROMs1uBz1sFyDy1EP8xrcjnqY1+B21MNyDW5HPSzX4HbUw3INbkc9LNfgdtTDcg1uRz0s1+B21MNyDW5HPSzX4HbUw3INrGEjyzWwho3pHQoKyfLcHPXAOxQc9aR3KAgkyzWwJoMs18CaDLJcA2syyHINrMkgyzWwJoMs18CaDLJcA2syyHINrMkgyzWwJoMs18CaDLJcA2syyHINrMkgyzWwJoMs18CaDLJcA2syyHINrMkgyzWwJoMs18CaDLJcA2syyHINrMkgyzWwJoMs18CaDLJcA2syyHINrMkgyzWwJoPMa2BNBpnXwJoMslwDazLIcg2sySDzGhiTwediXgNjMvgNeWfRMgr5ZKEtCtmy0BaF7FkcikKOLA5FIWcWNKKQKwsaUcidRXgo5MkiPASS5RpMRz0s12A66mG5BtNRD8s1mI56YK6Box6Ya+CoB+YaOOqBuQaOemCugaMemGvgqAfmGjjqYbkGy1EPyzVYjnrYHQrLUc8TbscpJHOJOup5QpdoafD7hlzhj4ajRu4Q2WvkCX+HrKtkXoMXsq6SeQ1ej1mzRj7h/6VAsu2420Gy7bjLQY5sH1IhZ7YPqZAr24dUyJ3tQyrkyfYhBZJ5DV6PWQIZpoIo5JPtQypky/YhFbJn+5AKObJ9SIWc2T6kQq5sH1Ihd7YPqZAn24cUSJZrsBz1jDvbh1TIJ9uHVMjw5kWF7Nk+pEKGNy8q5Mz2IRVyZfuQCrmzfUiFPNk+pECyXIPtqIflGmxHPSzXYDvqYbkGx1EPyzU4jnpYrsFx1MNyDY6jHpZrcBz1sFyD46hnpu89NZLlGpwf1PPLzz99/vvT79/+8a+//fPpzy+f//iem/Pvpy9//f+vnn331c+a6/vT7vz69T+s29Lr" + } + } +} +return persepolis diff --git a/space-exploration_0.5.58/space-exploration/scripts/ruins/satellite.lua b/space-exploration_0.5.58/space-exploration/scripts/ruins/satellite.lua new file mode 100644 index 0000000..0ed08d3 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/ruins/satellite.lua @@ -0,0 +1,92 @@ +-- Note: Default entity force will be 'capture', if a player character get near and there are no enemies the player will capture the entity. +local satellite = { + center = {x = 0, y = 0}, + landing_offset = {1,5}, -- only used in the satelliet blueprint, not normal ruins + force_name = "friendly", + insert_list = { + {x=4, y=2, items={{name = "se-space-science-lab", min = 1, max = 1}, + {name = "automation-science-pack", min = 1000, max = 1000}, + {name = "logistic-science-pack", min = 1000, max = 1000}, + {name = "chemical-science-pack", min = 1000, max = 1000}, + {name = mod_prefix.."rocket-science-pack", min = 500, max = 500}, + }}, + {x=4, y=4, items={{name = "se-space-manufactory", min = 1, max = 1}, + {name = "iron-plate", min = 1000, max = 1000}, + {name = "copper-plate", min = 1000, max = 1000}, + {name = mod_prefix.."beryllium-plate", min = 1000, max = 1000}, + {name = mod_prefix.."vulcanite-block", min = 100, max = 100}, + }}, + {x=4, y=6, items={{name = mod_prefix.."space-platform-plating", min = 200, max = 200}, + {name = mod_prefix.."space-platform-scaffold", min = 200, max = 200}, + {name = mod_prefix.."deep-space-transport-belt-yellow", min = 200, max = 200}, + {name = mod_prefix.."deep-space-splitter-yellow", min = 10, max = 10}, + {name = mod_prefix.."deep-space-underground-belt-yellow", min = 20, max = 20}, + {name = mod_prefix.."space-rail", min = 100, max = 100}, + }}, + {x=-3, y=2, items={{name = "solar-panel", min = 10, max = 10}, + {name = mod_prefix.."pylon", min = 1, max = 1}, + {name = mod_prefix.."pylon-substation", min = 1, max = 1}, + {name = mod_prefix.."pylon-construction", min = 1, max = 1}, + {name = mod_prefix.."space-capsule"}, + {name = mod_prefix.."rocket-landing-pad"}, + {name = mod_prefix.."delivery-cannon-chest"}, + }}, + {x=-3, y=4, items={ + {name = "water-barrel", min = 200, max = 200}, + {name = "lubricant-barrel", min = 10, max = 10}, + {name = "heavy-oil-barrel", min = 100, max = 100}, + }}, + {x=-3, y=6, items={ -- weapons added here + {name = "raw-fish", min = 10, max = 10}, + {name = mod_prefix.."medpack-4"}, + }}, + }, + prebuild = function(surface, ruin_position, ruin) -- surface, position, self (DO NOT MODFY SELF) + -- function that runs before tiles and entities are added + end, + postbuild = function(surface, ruin_position, ruin) + local ruin_position_center_offset = Util.vectors_delta(ruin.center, ruin_position) + local pos = Util.vectors_add(ruin_position_center_offset, {x=-3+0.5, y=6+0.5}) + local weapons_chest = surface.find_entity("steel-chest", pos) + + if weapons_chest then + local r = math.random(1,2) + if r == 1 then + weapons_chest.insert({name=mod_prefix.."tesla-gun", count=1}) + weapons_chest.insert({name=mod_prefix.."tesla-ammo", count=200}) + weapons_chest.insert({name=mod_prefix.."cryogun", count=1}) + weapons_chest.insert({name=mod_prefix.."cryogun-ammo", count=200}) + elseif r == 2 then + weapons_chest.insert({name=mod_prefix.."cryogun", count=1}) + weapons_chest.insert({name=mod_prefix.."cryogun-ammo", count=200}) + weapons_chest.insert({name=mod_prefix.."biogun", count=1}) + weapons_chest.insert({name=mod_prefix.."bloater-ammo", count=200}) + end + end + --surface.create_entity({name="iron-chest",position={x=ruin_position.x - ruin.center.x, y=ruin_position.y - ruin.center.y}}) + -- surface, position, self (maybe modified) + -- function that runs after tiles and entities are added + -- maybe required to set conditions + --[[local accumulator = surface.find_entity("accumulator", + { + x = 10.5 + ruin_position.x - ruin.center.x, + y = 8.5 + ruin_position.y - ruin.center.y + } + ) + local control = accumulator.get_or_create_control_behavior() -- https://lua-api.factorio.com/latest/LuaControlBehavior.html#LuaAccumulatorControlBehavior + control.output_signal = {type = "virtual", name = "signal-B"} + game.print("test end") + ]] + end, + blueprint_strings = { + { -- tiles + xadj = 1, yadj = 2, + string = "0eNqt2stu2lAUheF3OWMinYsvwKtUGVBiIktgUEyqRoh3bwgMOiml/jrKTXuDf7ZPlvdap/B9+94d3vrhGJan0K/3wxiW305h7F+H1fbyu+PHoQvL0B+7XZiFYbW7/DR2T+Nhte6eDtvVcbN/23190w+v4TwL/fDS/QzLdH6ehWO/7a4dD/uxP/b74dLz869PaTELH59fm/NDXf/coJ7cYH5t0GqDRhvwJVSTG7TKoFUGrTJolUGjDBpl0CiDRhnUyqBWBrUyqJVBpQwqZVApg0oZFGVQlEFRBkUZZGWQlUFWBlkZJGWQlEFSBkkZRGUQlUFUBhEZLBCBijzVeAu8fpWIqhBVIKo+VHmo6lDFoWpDVXYq7B5RVeN6tdnsty/3GtSTG6imUUlzq09Wj+VlarmqIRVD5QF6dz/+8nd8D9SXyfVZb4CsN8CtQZ76EWQc4Gt9tHJ8dbz4YuXTFZzqL5VfD/z3uTt7twYF30DG+mT10crx1fHikT3O7tTRwycPfO6IOPfRxj7a1Ecb+kgzH2nkI018pIGPNO+Rxj2hSkgoEvCcxWPWTlk7ZO2MtSPWTlhc0uGKLqMwz6bLs8lyfKzBp5pit0uhgS80shUeVBUeVOjSoEeDRhsuY5r/8uanHje4ScNFGu7RcI2GW1RcouIOFVeouEHHBTruz3F9rg6KGijqn6h9oi6ammjqoamFpk6qGqnqo6qNqm66munqpauVrokKDVRonkLjFJqq0VCNZmo0UqPJKg1Waa5KY1WartNwnWbrNFqnAcl/y0c+z64p1eVvodZZ+NG9jV8d8zxV7SK3ad5WdZPO51+3bUmJ" + }, + { -- entities + xadj = 1, yadj = 1, + string = "0eNqV1N1qwyAUB/B3OddaYr6bVyljmPSwCVZFzVgIvvtMerFCGzdvFMXz4y9+rDDKGY0VysOwgpi0cjBcVnDiQ3G5zfnFIAwgPN6AgOK3beSQOsOn2GrJLTVcoYRAQKgrfsPAwhsBVF54gXdvHyzvar6NaOOCtETAaBeLtdoSRJCylsAS+yYE8qSV2VqZ0KpcrU9gdSaWsppMK7nLNhdLHUD3iJlFakW3m+TtPG0EtfwaZatHbbT1z3iRsPtf2yNKOn2ie0HQ6tTcleL00jn/z/mLYUVmHnbgsLw8R0yZGac6cKq8ODsTH/n+LQwPvwiBL7RuLyh7VnfnsmN9VzctC+EH8v50bA==" + }} +} + +return satellite diff --git a/space-exploration_0.5.58/space-exploration/scripts/sha2.lua b/space-exploration_0.5.58/space-exploration/scripts/sha2.lua new file mode 100644 index 0000000..be3c15b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/sha2.lua @@ -0,0 +1,241 @@ +-- SHA-256 code in Lua 5.2; based on the pseudo-code from +-- Wikipedia (http://en.wikipedia.org/wiki/SHA-2) + + +local band, rrotate, bxor, rshift, bnot = + bit32.band, bit32.rrotate, bit32.bxor, bit32.rshift, bit32.bnot + +local string, setmetatable, assert = string, setmetatable, assert + +_ENV = nil + +-- Initialize table of round constants +-- (first 32 bits of the fractional parts of the cube roots of the first +-- 64 primes 2..311): +local k = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +} + + +-- transform a string of bytes in a string of hexadecimal digits +local function str2hexa (s) + local h = string.gsub(s, ".", function(c) + return string.format("%02x", string.byte(c)) + end) + return h +end + + +-- transform number 'l' in a big-endian sequence of 'n' bytes +-- (coded as a string) +local function num2s (l, n) + local s = "" + for i = 1, n do + local rem = l % 256 + s = string.char(rem) .. s + l = (l - rem) / 256 + end + return s +end + +-- transform the big-endian sequence of four bytes starting at +-- index 'i' in 's' into a number +local function s232num (s, i) + local n = 0 + for i = i, i + 3 do + n = n*256 + string.byte(s, i) + end + return n +end + + +-- append the bit '1' to the message +-- append k bits '0', where k is the minimum number >= 0 such that the +-- resulting message length (in bits) is congruent to 448 (mod 512) +-- append length of message (before pre-processing), in bits, as 64-bit +-- big-endian integer +local function preproc (msg, len) + local extra = -(len + 1 + 8) % 64 + len = num2s(8 * len, 8) -- original len in bits, coded + msg = msg .. "\128" .. string.rep("\0", extra) .. len + assert(#msg % 64 == 0) + return msg +end + + +local function initH224 (H) + -- (second 32 bits of the fractional parts of the square roots of the + -- 9th through 16th primes 23..53) + H[1] = 0xc1059ed8 + H[2] = 0x367cd507 + H[3] = 0x3070dd17 + H[4] = 0xf70e5939 + H[5] = 0xffc00b31 + H[6] = 0x68581511 + H[7] = 0x64f98fa7 + H[8] = 0xbefa4fa4 + return H +end + + +local function initH256 (H) + -- (first 32 bits of the fractional parts of the square roots of the + -- first 8 primes 2..19): + H[1] = 0x6a09e667 + H[2] = 0xbb67ae85 + H[3] = 0x3c6ef372 + H[4] = 0xa54ff53a + H[5] = 0x510e527f + H[6] = 0x9b05688c + H[7] = 0x1f83d9ab + H[8] = 0x5be0cd19 + return H +end + + +local function digestblock (msg, i, H) + + -- break chunk into sixteen 32-bit big-endian words w[1..16] + local w = {} + for j = 1, 16 do + w[j] = s232num(msg, i + (j - 1)*4) + end + + -- Extend the sixteen 32-bit words into sixty-four 32-bit words: + for j = 17, 64 do + local v = w[j - 15] + local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3)) + v = w[j - 2] + local s1 = bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10)) + w[j] = w[j - 16] + s0 + w[j - 7] + s1 + end + + -- Initialize hash value for this chunk: + local a, b, c, d, e, f, g, h = + H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] + + -- Main loop: + for i = 1, 64 do + local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22)) + local maj = bxor(band(a, b), band(a, c), band(b, c)) + local t2 = s0 + maj + local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25)) + local ch = bxor (band(e, f), band(bnot(e), g)) + local t1 = h + s1 + ch + k[i] + w[i] + + h = g + g = f + f = e + e = d + t1 + d = c + c = b + b = a + a = t1 + t2 + end + + -- Add (mod 2^32) this chunk's hash to result so far: + H[1] = band(H[1] + a) + H[2] = band(H[2] + b) + H[3] = band(H[3] + c) + H[4] = band(H[4] + d) + H[5] = band(H[5] + e) + H[6] = band(H[6] + f) + H[7] = band(H[7] + g) + H[8] = band(H[8] + h) + +end + + +local function finalresult224 (H) + -- Produce the final hash value (big-endian): + return + str2hexa(num2s(H[1], 4)..num2s(H[2], 4)..num2s(H[3], 4)..num2s(H[4], 4).. + num2s(H[5], 4)..num2s(H[6], 4)..num2s(H[7], 4)) +end + + +local function finalresult256 (H) + -- Produce the final hash value (big-endian): + return + str2hexa(num2s(H[1], 4)..num2s(H[2], 4)..num2s(H[3], 4)..num2s(H[4], 4).. + num2s(H[5], 4)..num2s(H[6], 4)..num2s(H[7], 4)..num2s(H[8], 4)) +end + + +---------------------------------------------------------------------- +local HH = {} -- to reuse + +local function hash224 (msg) + msg = preproc(msg, #msg) + local H = initH224(HH) + + -- Process the message in successive 512-bit (64 bytes) chunks: + for i = 1, #msg, 64 do + digestblock(msg, i, H) + end + + return finalresult224(H) +end + + +local function hash256 (msg) + msg = preproc(msg, #msg) + local H = initH256(HH) + + -- Process the message in successive 512-bit (64 bytes) chunks: + for i = 1, #msg, 64 do + digestblock(msg, i, H) + end + + return finalresult256(H) +end +---------------------------------------------------------------------- +local mt = {} + +local function new256 () + local o = {H = initH256({}), msg = "", len = 0} + setmetatable(o, mt) + return o +end + +mt.__index = mt + +function mt:add (m) + self.msg = self.msg .. m + self.len = self.len + #m + local t = 0 + while #self.msg - t >= 64 do + digestblock(self.msg, t + 1, self.H) + t = t + 64 + end + self.msg = self.msg:sub(t + 1, -1) +end + + +function mt:close () + self.msg = preproc(self.msg, self.len) + self:add("") + return finalresult256(self.H) +end +---------------------------------------------------------------------- + +return { + hash224 = hash224, + hash256 = hash256, + new256 = new256, +} diff --git a/space-exploration_0.5.58/space-exploration/scripts/solar-flare.lua b/space-exploration_0.5.58/space-exploration/scripts/solar-flare.lua new file mode 100644 index 0000000..7a770cd --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/solar-flare.lua @@ -0,0 +1,394 @@ +local SolarFlare = {} + +SolarFlare.name_glaive_beam = mod_prefix.."energy-glaive-beam" -- projectile +SolarFlare.name_glaive_beam_sprite = mod_prefix.."energy-glaive-beam-sprite" -- sprite +SolarFlare.name_glaive_path_fx = mod_prefix.."energy-glaive-path-fx" +SolarFlare.name_glaive_damage_projectile = mod_prefix.."energy-glaive-damage-projectile" +SolarFlare.name_glaive_damage_aoe = mod_prefix.."energy-glaive-damage-aoe" +SolarFlare.name_glaive_damage_aoe_large = mod_prefix.."energy-glaive-damage-aoe-large" +SolarFlare.name_fire = mod_prefix .. "fire-flame-on-tree-no-pollution" + +SolarFlare.max_age = 60*60*2 -- 5 minutes +SolarFlare.speed = 0.10 +SolarFlare.damage_interval = 20 +SolarFlare.warning_time = 60*60*60*24 -- 24 hours +SolarFlare.base_power = 2000000000 + +function SolarFlare.default_flare_power(zone) + local power_multiplier = Zone.get_solar(zone) + if zone.radius then + power_multiplier = power_multiplier * zone.radius / 5000 + else + power_multiplier = 0.2 * power_multiplier + end + return power_multiplier +end + +function SolarFlare.begin_flare(zone, targeting, power_multiplier, delay, max_age) + if not power_multiplier then + power_multiplier = SolarFlare.default_flare_power(zone) + end + delay = delay or 0 + local tick_task = new_tick_task("solar-flare") + tick_task.zone = zone + tick_task.start_tick = game.tick + delay + tick_task.beams = {} + tick_task.power_multiplier = power_multiplier + tick_task.targeting = targeting + tick_task.max_age = max_age or SolarFlare.max_age + Log.trace("SolarFlare on zone: " .. zone.name.." power: "..power_multiplier) +end + +function SolarFlare.tick_flare(tick_task) + if game.tick < tick_task.start_tick then return end + + if not tick_task.pressure_applied then + tick_task.pressure_applied = true + EnergyBeamDefence.zone_add_pressure(tick_task.zone, tick_task) + tick_task.defended = EnergyBeamDefence.zone_is_defended(tick_task.zone) + end + + if not tick_task.start_warning_sent then + tick_task.start_warning_sent = true + for _, force in pairs(game.forces) do + if Zone.is_visible_to_force(tick_task.zone, force.name) then + force.print({"space-exploration.alert-cme-arrived", tick_task.zone.name}) + end + end + end + + if game.tick > tick_task.start_tick + (tick_task.max_age or SolarFlare.max_age) or settings.global["se-cmes-max-frequency"].value == 0 then + for _, beam in pairs(tick_task.beams) do + if beam.beam and beam.beam.valid then + beam.beam.destroy() + end + if beam.markers then + for _, marker in pairs(beam.markers) do + if marker and marker.valid then + marker.destroy() + end + end + end + end + tick_task.valid = false + Log.trace("SolarFlare end") + local surface = Zone.get_surface(tick_task.zone) + surface.print({"space-exploration.alert-cme-passed"}) + return + end + + local age = game.tick - tick_task.start_tick + local age_p = age / (tick_task.max_age or SolarFlare.max_age) + --tick_task.age_peak = math.min(age_p, 1-age_p) * 2 + tick_task.age_peak = math.sin(age_p*math.pi) + + if game.tick % 60 == 0 then + tick_task.defended = EnergyBeamDefence.zone_is_defended(tick_task.zone) + end + + if tick_task.defended then + while #tick_task.beams > 0 do + local beam = tick_task.beams[#tick_task.beams] + if beam.beam and beam.beam.valid then + beam.beam.destroy() + end + if beam.markers then + for _, marker in pairs(beam.markers) do + if marker and marker.valid then + marker.destroy() + end + end + end + table.remove(tick_task.beams, #tick_task.beams) + end + return + end + + local surface = Zone.get_surface(tick_task.zone) + if not surface then + Log.trace("SolarFlare.begin_flare: No surface") + tick_task.valid = false + return + end + + if not tick_task.chunk_count then + tick_task.chunk_count = 0 + for chunk in surface.get_chunks() do + tick_task.chunk_count = tick_task.chunk_count + 1 + end + end + -- tiny -> 2 + -- 5k small = 1.9 -> 4 + -- 50k medium = 11.18 -> 14 + local target_beams = math.min(20, math.ceil(tick_task.age_peak * (2 + math.pow(tick_task.chunk_count / 2000, 0.75)))) + + while #tick_task.beams < target_beams do + local chunk = surface.get_random_chunk() + local position = {x = (chunk.x+math.random())*32, y = (chunk.y+math.random())*32} + chunk = surface.get_random_chunk() + local target_position = {x = (chunk.x+math.random())*32, y = (chunk.y+math.random())*32} + if #tick_task.beams == 0 then + if tick_task.targeting == "basic" then + local entities = surface.find_entities_filtered{type={"furnace","electric-pole","roboport","reactor"}} + if entities and #entities > 0 then + position = entities[math.random(#entities)].position + end + elseif tick_task.targeting == "crash" then + position = Util.vector_set_length(position, 80) + target_position = {x = 0, y = 0} + end + end + local beam = { + position = position, + target_position = target_position + } + beam.beam = surface.create_entity{ + name = SolarFlare.name_glaive_beam, + position = position, + target = {0,0}, + speed = 0, + force = "neutral" + } + if not (beam.beam_sprite_id and rendering.is_valid(beam.beam_sprite_id)) then + beam.beam_sprite_id = rendering.draw_sprite{ + target = beam.beam, + sprite = SolarFlare.name_glaive_beam_sprite, + surface = surface, + } + end + rendering.set_y_scale(beam.beam_sprite_id, 1.5) + rendering.set_x_scale(beam.beam_sprite_id, 2) + rendering.set_color(beam.beam_sprite_id, { + r = 1, + g = 0.7, + b = 0.7 + }) + surface.create_entity{ + name = SolarFlare.name_fire, + position = position, + } + table.insert(tick_task.beams, beam) + Log.trace("SolarFlare "..#tick_task.beams.." for tick_task " .. tick_task.id) + surface.print({"space-exploration.alert-cme-stream", "[gps="..math.floor(position.x)..","..math.floor(position.y)..","..surface.name.."]"}) + end + + while #tick_task.beams > target_beams do + local beam = tick_task.beams[#tick_task.beams] + if beam.beam and beam.beam.valid then + beam.beam.destroy() + end + if beam.markers then + for _, marker in pairs(beam.markers) do + if marker and marker.valid then + marker.destroy() + end + end + end + table.remove(tick_task.beams, #tick_task.beams) + end + + if game.tick % 60 == 0 then + for i, beam in pairs(tick_task.beams) do + if beam.markers then + for _, marker in pairs(beam.markers) do + if marker and marker.valid then + marker.destroy() + end + end + end + beam.markers = {} + for force_name, forcedata in pairs(global.forces) do + if game.forces[force_name] and force_name ~= "friendly" and force_name ~= "ignore" and force_name ~= "capture" then + beam.markers[force_name] = game.forces[force_name].add_chart_tag(surface, { + icon = {type = "virtual", name = mod_prefix.."heat"}, + position = beam.position, + text = "CME" + }) + end + end + if (tick_task.targeting == "basic" or tick_task.targeting == "crash") and (i == 1 or i == 3) then + local chunk = surface.get_random_chunk() + beam.target_position = {x = (chunk.x+math.random())*32, y = (chunk.y+math.random())*32} + if math.random() < 0.1 then + local entities = surface.find_entities_filtered{type={"character", "furnace","electric-pole","roboport","reactor"}} + if entities and #entities > 0 and math.random() < 0.1 then + beam.target_position = entities[math.random(#entities)].position + end + end + else + if math.random() < 0.4 then + beam.target_position = Util.vectors_add(beam.beam.position, {x = (math.random()-0.5)*64, y = (math.random()-0.5)*64}) + else + local chunk = surface.get_random_chunk() + beam.target_position = {x = (chunk.x+math.random())*32, y = (chunk.y+math.random())*32} + end + end + end + end + + for _, beam in pairs(tick_task.beams) do + if not(beam.beam and beam.beam.valid) then + beam.beam = surface.create_entity{ + name = SolarFlare.name_glaive_beam, + position = beam.position, + target = {0,0}, + speed = 0, + force = "neutral" + } + end + if not (beam.beam_sprite_id and rendering.is_valid(beam.beam_sprite_id)) then + beam.beam_sprite_id = rendering.draw_sprite{ + target = beam.beam, + sprite = SolarFlare.name_glaive_beam_sprite, + surface = surface, + } + end + rendering.set_y_scale(beam.beam_sprite_id, 1.5) + rendering.set_x_scale(beam.beam_sprite_id, 2) + rendering.set_color(beam.beam_sprite_id, { + r = 1, + g = 0.7, + b = 0.7 + }) + local new_position = util.move_to(beam.position, beam.target_position, SolarFlare.speed, false) + beam.position = new_position + beam.beam.teleport(new_position) + if math.random() < 0.1 then + surface.create_entity{ + name = SolarFlare.name_fire, + position = new_position, + } + surface.create_entity{ + name = SolarFlare.name_glaive_path_fx, + position = new_position, + force = "neutral" + } + end + if game.tick % math.ceil(SolarFlare.damage_interval / math.min(tick_task.power_multiplier or 1, 2)) == 0 then + surface.create_entity{ + name = SolarFlare.name_glaive_damage_aoe_large, + position = new_position, + force = "neutral" + } + end + end + +end + +function SolarFlare.arrival_snap(zone, arrival_tick) + + if Zone.is_solid(zone) then + local targeted_time_of_day = (arrival_tick / zone.ticks_per_day) % 1 + -- target morning (0.75), snapped to the next minute + arrival_tick = arrival_tick + (0.75 - targeted_time_of_day) * zone.ticks_per_day + end + -- snap to minute so timer does not have a random delay + arrival_tick = math.ceil(arrival_tick / 3600) * 3600 + + return arrival_tick +end + +function SolarFlare.on_nth_tick_3600() + if settings.global["se-cmes-max-frequency"].value == 0 then + if global.forces then + for force_name, forcedata in pairs(global.forces) do + if forcedata.solar_flare then + forcedata.solar_flare = nil + end + end + end + else + if game.tick == 0 then + local entities = game.surfaces[1].find_entities_filtered{ + area = {{-64,-64},{64,64}} + } + for _, entity in pairs(entities) do + if string.find(entity.name, "wreck", 1, true) or string.find(entity.name, "crash", 1, true)then + entity.destructible = false + end + end + SolarFlare.begin_flare(Zone.from_name("Nauvis"), "crash", 0.25, 60*13, 45*60) -- 13s delay + end + if global.forces then + for force_name, forcedata in pairs(global.forces) do + local force = game.forces[force_name] + if force and forcedata.has_players and forcedata.homeworld_index + and force_name ~= "friendly" and force_name ~= "ignore" and force_name ~= "capture" then + --Log.trace("SolarFlare.on_nth_tick_3600 "..force_name) + + if not forcedata.solar_flare then + -- first one, on homeworld, has a 48 hour delay + 1 hour warning + local arrival_tick = math.max( + 48*60*60*60 + math.random()*60*60*60, -- 48 hours + up to 1 hour + game.tick + settings.global["se-cmes-max-frequency"].value * (0.5 + 0.5 * math.random()) * 60*60*60 ) -- 12 to 24 hours normally + local zone = Zone.from_zone_index(forcedata.homeworld_index) + arrival_tick = SolarFlare.arrival_snap(zone, arrival_tick) + forcedata.solar_flare = { + type = "solar-flare", + zone = zone, + tick = arrival_tick + } + end + if forcedata.solar_flare then + if SolarFlare.warning_time + game.tick >= forcedata.solar_flare.tick + and forcedata.solar_flare.tick - game.tick >= 0 + and (forcedata.solar_flare.last_warned == nil or game.tick - forcedata.solar_flare.last_warned >= forcedata.solar_flare.tick - game.tick) then + for force_name, force in pairs(game.forces) do + if Zone.is_visible_to_force(forcedata.solar_flare.zone, force.name) then + force.print({"space-exploration.alert-cme-eta", forcedata.solar_flare.zone.name, Util.seconds_to_clock((forcedata.solar_flare.tick - game.tick)/60, true)}) + end + end + forcedata.solar_flare.last_warned = game.tick + end + if game.tick >= forcedata.solar_flare.tick then + -- do the solar flare tick task setup + SolarFlare.begin_flare(forcedata.solar_flare.zone, forcedata.solar_flare.targeting) + -- set the next one + local zone_options = {forcedata.homeworld_index} + if forcedata.zone_assets then + for zone_index, force_zone_assets in pairs(forcedata.zone_assets) do + if (force_zone_assets.rocket_launch_pad_names and table_size(force_zone_assets.rocket_launch_pad_names) > 0) or + (force_zone_assets.rocket_landing_pad_names and table_size(force_zone_assets.rocket_landing_pad_names) > 0) then + local try_zone = Zone.from_zone_index(zone_index) + if try_zone.type ~= "asteroid-field" and try_zone.type ~= "anomaly" and try_zone.type ~= "spaceship" then + table.insert(zone_options, zone_index) + end + end + end + end + if (#zone_options <= 1 and math.random() < 0.6) or math.random() < 0.3 then + for zone_index, discovered_data in pairs(forcedata.zones_discovered) do + local try_zone = Zone.from_zone_index(zone_index) + if try_zone.type ~= "asteroid-field" and try_zone.type ~= "anomaly" and try_zone.type ~= "spaceship" then + table.insert(zone_options, zone_index) + end + end + end + local zone = Zone.from_zone_index(zone_options[math.random(#zone_options)]) + + -- other solar flares have 12-24 hour interval + local arrival_tick = game.tick + settings.global["se-cmes-max-frequency"].value * (0.5 + 0.5 * math.random()) * 60*60*60 -- 12-24 hours + arrival_tick = SolarFlare.arrival_snap(zone, arrival_tick) + + forcedata.solar_flare = { + type = "solar-flare", + zone = Zone.from_zone_index(zone_options[math.random(#zone_options)]), + tick = arrival_tick + } + if forcedata.solar_flare.zone.type == "star" then forcedata.solar_flare.zone = forcedata.solar_flare.zone.orbit end + if forcedata.solar_flare.zone.index == forcedata.homeworld_index then + forcedata.solar_flare.targeting = "basic" + end + end + end + else + forcedata.solar_flare = nil + end + + end + end + end +end +Event.addListener("on_nth_tick_3600", SolarFlare.on_nth_tick_3600) -- 1 minute + +return SolarFlare diff --git a/space-exploration_0.5.58/space-exploration/scripts/spaceship.lua b/space-exploration_0.5.58/space-exploration/scripts/spaceship.lua new file mode 100644 index 0000000..d7a9f32 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/spaceship.lua @@ -0,0 +1,3719 @@ +local Spaceship = {} + +Spaceship.names_tech_integrity = { + {name = mod_prefix.."spaceship-integrity", bonus_per_level = 100, infinite = false}, + {name = mod_prefix.."factory-spaceship", bonus_per_level = 500, infinite = true} +} +Spaceship.integrity_base = 300 + +Spaceship.name_spaceship_console = mod_prefix .. "spaceship-console" +Spaceship.name_spaceship_console_output = mod_prefix .. "spaceship-console-output" +Spaceship.console_output_offset = {x = 1.5, y = -1} + +Spaceship.name_spaceship_clamp_keep = mod_prefix .. "spaceship-clamp" +Spaceship.name_spaceship_clamp_place = mod_prefix .. "spaceship-clamp-place" + +Spaceship.engines = { + [mod_prefix .. "spaceship-rocket-engine"] = { name = mod_prefix .. "spaceship-rocket-engine", thrust = 100 / 5, max_energy = 1837 }, + [mod_prefix .. "spaceship-antimatter-engine"]= { name = mod_prefix .. "spaceship-antimatter-engine", thrust = 500 / 5, max_energy = 18370 } +} +Spaceship.names_engines = {} + +Spaceship.names_booster_tanks = { + mod_prefix .. "spaceship-rocket-booster-tank", + mod_prefix .. "spaceship-antimatter-booster-tank" +} + +--[[ +Spaceship.name_spaceship_rocket_engine = mod_prefix .. "spaceship-rocket-engine" +Spaceship.name_spaceship_rocket_booster_tank = mod_prefix .. "spaceship-rocket-booster-tank" +Spaceship.rocket_engine_thrust = 100 +Spaceship.rocket_engine_thrust_full_energy = 1837 -- the energy the furnaces contains when fully powered + +Spaceship.name_spaceship_antimatter_engine = mod_prefix .. "spaceship-antimatter-engine" +Spaceship.name_spaceship_antimatter_booster_tank = mod_prefix .. "spaceship-antimatter-booster-tank" +Spaceship.antimatter_engine_thrust = 200 +Spaceship.antimatter_engine_thrust_full_energy = 18370 -- the energy the furnaces contains when fully powered +]]-- + +Spaceship.names_spaceship_floors = {mod_prefix .. "spaceship-floor"} +Spaceship.names_spaceship_walls = {mod_prefix .. "spaceship-wall"} +Spaceship.names_spaceship_gates = {mod_prefix .. "spaceship-gate"} +Spaceship.names_spaceship_bulkheads = { + mod_prefix .. "spaceship-wall", + mod_prefix .. "spaceship-gate", + Spaceship.name_spaceship_clamp_keep, +} +for _, engine in pairs(Spaceship.engines) do + table.insert(Spaceship.names_engines, engine.name) + table.insert(Spaceship.names_spaceship_bulkheads, engine.name) +end + +Spaceship.signal_for_own_spaceship_id = {type = "item", name = Spaceship.name_spaceship_console} +Spaceship.signal_for_destination_spaceship = {type = "virtual", name = mod_prefix.."spaceship"} +Spaceship.signal_for_speed = {type = "virtual", name = "signal-speed"} +Spaceship.signal_for_distance = {type = "virtual", name = "signal-distance"} +Spaceship.signal_for_launch = {type = "virtual", name = mod_prefix.."spaceship-launch"} +Spaceship.signal_for_anchor_using_left = {type = "virtual", name = mod_prefix.."anchor-using-left-clamp"} +Spaceship.signal_for_anchor_using_right = {type = "virtual", name = mod_prefix.."anchor-using-right-clamp"} +Spaceship.signal_for_anchor_to_left = {type = "virtual", name = mod_prefix.."anchor-to-left-clamp"} +Spaceship.signal_for_anchor_to_right = {type = "virtual", name = mod_prefix.."anchor-to-right-clamp"} + +Spaceship.energy_per_launch_integrity_delta_v = 150 * 1000 + +Spaceship.name_spaceship_gui_root = mod_prefix.."spaceship-gui" +Spaceship.name_window_close = "spaceship_close_button" + +Spaceship.types_to_restore = {-- after surface change/area clone + "inserter", + "pump", + --"transport-belt" -- entity.active does not work on belts +} +-- Note: production machines should NOT be included as some are supposed to be disabled on specific surfaces. +Spaceship.time_to_restore = 1 + +Spaceship.particle_spawn_range = 24 -- same as laser turret range +Spaceship.ice_particle = { speed = 1/300 } +Spaceship.particles = { + ["speck"] = { multiplier = 1/1000, speed = 1/100, min_speed = 0, + sprite_name = mod_prefix.."spaceship-speck-graphic" + }, + ["rock-small"] = { multiplier = 1/3000, speed = 1/300, min_speed = 5, + projectile_name = mod_prefix.."spaceship-obstacle-rock-small-projectile", + graphic_name = mod_prefix.."spaceship-obstacle-rock-small-graphic", + targetable_name = mod_prefix.."spaceship-obstacle-rock-small-targetable", + }, + ["rock-medium"] = { multiplier = 1/20000, speed = 1/400, min_speed = 15, destroys_floor = true, + projectile_name = mod_prefix.."spaceship-obstacle-rock-medium-projectile", + graphic_name = mod_prefix.."spaceship-obstacle-rock-medium-graphic", + targetable_name = mod_prefix.."spaceship-obstacle-rock-medium-targetable", + }, + ["rock-large"] = { multiplier = 1/2000000, speed = 1/1000, min_speed = 50, min_size = 1000, destroys_floor = true, + projectile_name = mod_prefix.."spaceship-obstacle-rock-large-projectile", + graphic_name = mod_prefix.."spaceship-obstacle-rock-large-graphic", + targetable_name = mod_prefix.."spaceship-obstacle-rock-large-targetable", + }, +} +Spaceship.all_targetables = {} +for _, particle in pairs(Spaceship.particles) do + if particle.targetable_name then + table.insert(Spaceship.all_targetables, particle.targetable_name) + end +end +Spaceship.obstacle_damage_multipliers = { + ["electric-turret"] = 20, + ["ammo-turret"] = 3 +} + +Spaceship.particle_speed_power = 0.75 -- 0.5 would be sqrt, 0 is static, 1 is linear with speed. + +Spaceship.space_drag = 1/100 / 5 +Spaceship.minimum_impulse = 1/100 +Spaceship.minimum_mass = 1 +Spaceship.speed_taper = 200 +Spaceship.travel_speed_multiplier = 1/200 + +Spaceship.integrity_pulse_interval = 60 * 60 * 10 + +Spaceship.tile_status = {} + +--[[ +change to: +{ + outer = 0 or 1. outer skin of tiles including diagonals + floor = 0 or 1, has floor otherwise exterior + exposed = 0 for contained, or higher for any tile exposed to space + wall = 0 or 1, walls only + bulkhead = 0 or 1, any bulkhead + connection nil or distance to console. +} + +]]-- + +Spaceship.tile_status.exterior = 1 -- any tile not with flooring (without bulkhead) +Spaceship.tile_status.wall_exterior = 2 -- bulkeahd outside of flooring +Spaceship.tile_status.bulkhead_exterior = 3 -- bulkeahd outside of flooring +Spaceship.tile_status.floor = 4 -- unknown floor +Spaceship.tile_status.wall = 5 -- unknown bulkhead +Spaceship.tile_status.bulkhead = 6 -- unknown bulkhead +Spaceship.tile_status.floor_exterior = 7 -- outside floor +Spaceship.tile_status.floor_interior = 8 -- contained floor +Spaceship.tile_status.floor_console_disconnected = 9 -- disconnected floor +Spaceship.tile_status.wall_console_disconnected = 10 -- disconnected bulkhead +Spaceship.tile_status.bulkhead_console_disconnected = 11 -- disconnected bulkhead +Spaceship.tile_status.floor_console_connected = 12 -- connected floor +Spaceship.tile_status.wall_console_connected = 13 -- connected bulkhead +Spaceship.tile_status.bulkhead_console_connected = 14 -- connected bulkhead + + + + --[[ tile statuses + 1 = exterior + 2 = floor_pending (on the edge of checking, used for next tick) + 3 = unknown floor (exists but unknown containment statis) + 4 = exterior floor + 5 = bulkhead (floor with wall or gate) + 6 = interior (contained) floor + ]]-- + +--[[ +console sends out a pule over all connected spaceship tiles (with a max based on tech) +then consider all tiles with wall or gate. +divide tiles into groups, ones that touch the outside are not part of the ship. +]]-- + +Spaceship.names = { + "Abaddon", "Ackbar", "Aegis", "Albatross", "Alchemist", "Albion", "Alexander", + "Angler", "Apparition", "ArchAngel", "Assassin", "Avenger", "Axe", + "Bade", "Bardiche", "Battleth", "Blackbird", "Bounty Hunter", "Breaker", + "Brigandine","Bullfinch", "Buzzard", + "Cartographer", "Catface", "Calamari", "Canary", "Caravel", "Carrak", "Citadel", "Clockwerk", + "Chimera", "Coot", "Cormorant", "Crane", "Crossbill", "Crow", "Cuckoo", + "Darkstar", "Dauntless", "Desby", "Dragon", "Drake", "Dream", "Doombringer", + "Dolphin", "Devourer", "Dunn", + "Eagle", "Earthshaker", "Earl Grey", "Egret", "Eider", "Ember", "Enigma", "Eris", "Excalibur", + "Falcon", "Falx", "Feral Pigeon", "Firecrest", "Firefly", "Flying Duckman", + "Fountain", "Fulmar", + "Gadwall", "Gannet", "Garganey", "Gigantosaurus", "Ghast", "Ghoul", "Ghost", + "Glaive", "Goldcrest", "Goldeneye", "Goldfinch", "Goosander", "Goose", + "Goshawk", "Grasshopper", "Greenfinch", "Griffon", "Grouse", "Guillemot", + "Halberd", "Hammer", "Hammerhead", "Harrier", "Hawk", "Harking", "Heron", "Hippogryph", "Honeybadger", "Honeybear", + "Iron Cordon", "Ingot", "Intrepid", "Invoker", "Isabella", + "Jack Snipe", "Jackdaw", "Jay", + "Kamsta", "Katherine", "Kestrel", "Kingfisher", "Kite", "Knight", "Kraken", + "Lapwing", "Lance", "Lancer", "Lick", "Linnet", "Lucas", + "Magi", "Magpie", "Mallard", "Mangonel", "Medusa", "Memento", "Merlin", + "Mistress", "Mocking Jay", "Monstrosity", "Moorhen", "Musk", + "Naga", "Narwhal", "Nebulon", "Nemesis", "Newton", "Nexela", "Nial", "Nicholas", + "Nightjar", "Nissa", "Nightingale", "Night Stalker", + "Oracle", "Orca", "Ostricth", "Outrider", "Owl", + "Partridge", "Pangolin", "Penguin", "Peregrine", "Petrel", "Phantom", + "Pheasant", "Phoenix", "Piccard", "Pintail", "Pioneer", + "Pipit", "Plover", "Prophet", "Prowler", "Pochard", "Puffin", + "Quail", + "Radiance", "Raptor", "Raven", "Razor", "Razorbill", "Red Kite", "Redshank", + "Redstart", "Redwing", "Requiem", + "Riccardo", "Robin", "Roc", "Rook", "Rossi", "Rogue", "Ruff", + "Sanderling", "Sawfish", "Scythe", "Seraph", "Serenity", "Sickle", "Shadow", + "Shag", "Sharknado", "Shelduck", "Sherrif", "Shoveler", "Sin Eater", "Siren", + "Siskin", "Skylark", "Skyshark", "Skywalker", "Skywrath", "Smew", "Snek", + "Snipe", "Sparrowhawk", "Spear", "Spectre", "Spinosaur", "Spynx", + "Starchaser", "Starling", "Stonechat", "Swallow", "Swan", "Swift", "Swordfish", + "Tachyon", "Tali", "Tantive", "Teal", "Templar", "Terrorblade", "Tesla", "Thanatos", + "Throne", "Thrush", "Tigress", "Tin Can", "Titan", "Trebuchet", + "Trimaran", "Turnstone", "Turing", "Tusk", "Twite", + "Ursa", "Undertaker", "Undying Dodo", "Underlord", + "Vengeance", "Viper", "Virtue", "Visage", "Void Hunter", "Volt", "Vulture", + "Wagtail", "Warbird", "Warbler", "Warcry", "Warden", "Warlock", "Warlord", "Warrunner", + "Waxwing", "Weaver", "Wheatear", "Whimbrel", "Whinchat", "Whitestar", + "Wigeon", "Windranger", "Woodcock", "Wraith", "Wrath", "Wren", "Wyvern", "Wyrm", + "Xena", "Xenon", "Xylem", + "Yacht", "Yellowhammer", "Yettie", + "Zenith", "Zilla", "Zombie", "Zweihander" +} + + + +function Spaceship.is_floor(tile_name) + return Util.table_contains(Spaceship.names_spaceship_floors, tile_name) +end + +function Spaceship.is_wall(entity_name) + return Util.table_contains(Spaceship.names_spaceship_walls, entity_name) +end + +function Spaceship.is_gate(entity_name) + return Util.table_contains(Spaceship.names_spaceship_gates, entity_name) +end + +function Spaceship.is_wall_or_gate(entity_name) + return Spaceship.is_wall(entity_name) or Spaceship.is_gate(entity_name) +end + +function Spaceship.from_index(spaceship_index) + if global.spaceships then return global.spaceships[tonumber(spaceship_index)] end +end + +function Spaceship.from_entity(entity) + for _, spaceship in pairs(global.spaceships) do + if spaceship.console and spaceship.console.valid and spaceship.console.unit_number == entity.unit_number then + return spaceship + end + end +end + +function Spaceship.from_surface_position(surface, position) + local x = math.floor(position.x or position[1]) + local y = math.floor(position.y or position[2]) + -- TODO allow multiple spaceships per surface + for _, spaceship in pairs(global.spaceships) do + if spaceship.own_surface_index then + if spaceship.own_surface_index == surface.index then + return spaceship + end + elseif spaceship.console and spaceship.console.valid and spaceship.console.surface == surface then + -- check tiles + if spaceship.known_tiles and spaceship.known_tiles[x] and spaceship.known_tiles[x][y] and + (spaceship.known_tiles[x][y] == Spaceship.tile_status.floor_console_connected + or spaceship.known_tiles[x][y] == Spaceship.tile_status.bulkhead_console_connected) then + return spaceship + end + end + end +end + + +function Spaceship.from_name(name) + for _, spaceship in pairs(global.spaceships) do + if spaceship.name == name then + return spaceship + end + end +end + +function Spaceship.from_own_surface_index(surface_index) -- can't be a zone + if global.spaceships then + for _, spaceship in pairs(global.spaceships) do + if spaceship.own_surface_index == surface_index then + return spaceship + end + end + end +end + +function Spaceship.get_own_surface(spaceship) + return game.surfaces["spaceship-"..spaceship.index] +end + +function Spaceship.get_current_surface(spaceship) + if spaceship.zone_index then + local zone = Zone.from_zone_index(spaceship.zone_index) + if zone then + return Zone.get_make_surface(zone) + end + end + return Spaceship.get_own_surface(spaceship) +end + + +function Spaceship.get_integrity_limit(force) + local integrity = Spaceship.integrity_base + for _, tech_branch in pairs(Spaceship.names_tech_integrity) do + local i = 1 + while i > 0 do + local tech = force.technologies[tech_branch.name.."-"..i] + if (not tech) and i == 1 then + tech = force.technologies[tech_branch.name] + end + if not tech then + i = -1 + else + local levels = tech.level - tech.prototype.level + (tech.researched and 1 or 0) + integrity = integrity + levels * tech_branch.bonus_per_level + i = i + 1 + end + end + end + return integrity +end + +function Spaceship.get_launch_energy_cost(spaceship) + if spaceship.zone_index and spaceship.integrity_stress then + local zone = Zone.from_zone_index(spaceship.zone_index) + if zone then + local delta_v = Zone.get_launch_delta_v(zone) + local energy_cost = delta_v * spaceship.integrity_stress * Spaceship.energy_per_launch_integrity_delta_v + return energy_cost + end + end +end + +function Spaceship.get_launch_energy(spaceship) + --spaceship.launch_energy = nil + spaceship.launch_energy = nil + if spaceship.zone_index and spaceship.console and spaceship.console.valid and spaceship.known_tiles then + spaceship.launch_energy = 0 + local surface = spaceship.console.surface + local tanks = surface.find_entities_filtered{name = Spaceship.names_booster_tanks } + for _, tank in pairs(tanks) do + local tank_x = math.floor(tank.position.x) + local tank_y = math.floor(tank.position.y) + + if spaceship.known_tiles[tank_x] and spaceship.known_tiles[tank_x][tank_y] + and spaceship.known_tiles[tank_x][tank_y] == Spaceship.tile_status.floor_console_connected + and #tank.fluidbox > 0 then + local fluidbox = tank.fluidbox[1] or {amount = 0} + if fluidbox.amount > 0 then + spaceship.launch_energy = spaceship.launch_energy + fluidbox.amount * game.fluid_prototypes[fluidbox.name].fuel_value + end + end + end + end + return spaceship.launch_energy +end + +function Spaceship.get_console_or_middle_position(spaceship) + if spaceship.console and spaceship.console.valid then + return spaceship.console.position + end + if spaceship.known_tiles_average_x and spaceship.known_tiles_average_y then + return {x = known_tiles_average_x, y = known_tiles_average_y} + end +end + +function Spaceship.get_boarding_position(spaceship) + if spaceship.known_tiles_average_x and spaceship.known_bounds then + return { + x = spaceship.known_bounds.left_top.x + math.random() * (spaceship.known_bounds.right_bottom.x - spaceship.known_bounds.left_top.x), + y = spaceship.known_bounds.right_bottom.y + 32 + } + end + if spaceship.console and spaceship.console.valid then + return Util.vectors_add(spaceship.console.position, {x = 64 * ( math.random() - 0.5), y = 64}) + end +end + +function Spaceship.gui_close(player) + if player.gui.left[Spaceship.name_spaceship_gui_root] then + player.gui.left[Spaceship.name_spaceship_gui_root].destroy() + end + Spaceship.stop_anchor_scouting(player) +end + + +function Spaceship.destroy(spaceship) + if spaceship.zone_index or not spaceship.own_surface_index then -- don't remove the whole surface if in space + global.spaceships[spaceship.index] = nil + spaceship.valid = false + + -- if a player has this gui open then close it + local gui_name = Spaceship.name_spaceship_gui_root + for _, player in pairs(game.connected_players) do + if player.gui.left[gui_name] and player.gui.left[gui_name].spaceship_index.children_names[1] == (""..spaceship.index) then + player.gui.left[gui_name].destroy() + end + end + if spaceship.own_surface_index then + game.delete_surface(spaceship.own_surface_index) + spaceship.own_surface_index = nil + end + + -- make sure that history references to this spaceship are cleaned up + for _, player in pairs(game.players) do + RemoteView.make_history_valid(player) + end + end +end + +function Spaceship.get_destination_zone(spaceship) + if spaceship.destination then + if spaceship.destination.type == "spaceship" then + return Spaceship.from_index(spaceship.destination.index) + else + return Zone.from_zone_index(spaceship.destination.index) + end + end +end + +function Spaceship.is_near_destination(spaceship) + if spaceship.near then + if not spaceship.destination then + return true + elseif spaceship.near.type == spaceship.destination.type + and spaceship.near.index == spaceship.destination.index then + return true + end + end + return false +end + +function Spaceship.is_at_destination(spaceship) + if spaceship.destination and spaceship.destination.type ~= "spaceship" and spaceship.zone_index and spaceship.zone_index == spaceship.destination.index then + return true + end + return false +end + +function Spaceship.compute_extent(spaceship) + local min_x = nil + local max_x = nil + local min_y = nil + local max_y = nil + for x, x_tiles in pairs(spaceship.known_tiles) do + if min_x == nil or x < min_x then min_x = x end + if max_x == nil or x > max_x then max_x = x end + for y, status in pairs(x_tiles) do + if status == Spaceship.tile_status.floor_console_connected + or status == Spaceship.tile_status.bulkhead_console_connected then + if min_y == nil or y < min_y then min_y = y end + if max_y == nil or y > max_y then max_y = y end + end + end + end + max_x = max_x + 1 -- whole tile + max_y = max_y + 1 -- whole tile + return {min_x=min_x,max_x=max_x,min_y=min_y,max_y=max_y} +end + +function Spaceship.launch(spaceship) + if not spaceship.is_launching then Log.trace("Abort launch not is_launching") return end + + spaceship.is_launching = false + + if not spaceship.zone_index then Log.trace("Abort launch no zone_index") return end + if not spaceship.integrity_valid then Log.trace("Abort launch not integrity_valid") return end + if not spaceship.known_tiles then Log.trace("Abort launch not known_tiles") return end + if not spaceship.console and spaceship.console.valid then Log.trace("Abort launch not known_tiles") return end + + local current_surface = spaceship.console.surface + local current_zone = Zone.from_surface(current_surface) + + local required_energy = Spaceship.get_launch_energy_cost(spaceship) + + --Spaceship.get_launch_energy(spaceship) + -- same code but keep tanks references + spaceship.launch_energy = 0 + local tanks = current_surface.find_entities_filtered{name = Spaceship.names_booster_tanks } + for _, tank in pairs(tanks) do + local tank_x = math.floor(tank.position.x) + local tank_y = math.floor(tank.position.y) + + if spaceship.known_tiles[tank_x] and spaceship.known_tiles[tank_x][tank_y] + and spaceship.known_tiles[tank_x][tank_y] == Spaceship.tile_status.floor_console_connected + and #tank.fluidbox > 0 then + local fluidbox = tank.fluidbox[1] or {amount = 0} + if fluidbox.amount > 0 then + spaceship.launch_energy = spaceship.launch_energy + fluidbox.amount * game.fluid_prototypes[fluidbox.name].fuel_value + end + end + end + + if not (required_energy and spaceship.launch_energy and spaceship.launch_energy >= required_energy) then return end + + local ship_surface + if spaceship.own_surface_index then + ship_surface = game.surfaces["spaceship-" .. spaceship.index] + end + if not ship_surface then + local map_gen_settings = { + autoplace_controls = { + ["planet-size"] = { frequency = 1/1000, size = 1 } + } + } + map_gen_settings.autoplace_settings={ + ["decorative"]={ + treat_missing_as_default=false, + settings={ + } + }, + ["entity"]={ + treat_missing_as_default=false, + settings={ + } + }, + ["tile"]={ + treat_missing_as_default=false, + settings={ + ["se-space"]={} + } + }, + } + ship_surface = game.create_surface("spaceship-"..spaceship.index, map_gen_settings) + + ship_surface.freeze_daytime = true + ship_surface.daytime = 0.4 -- dark but not midnight + spaceship.own_surface_index = ship_surface.index + end + if not ship_surface then + game.print("Error creating ship surface") + return + end + if current_surface == ship_surface then + game.print("Same surface") + return + end + + -- point of no return + log("spaceship launch start") + + local linked_containers = current_surface.find_entities_filtered{type="linked-container"} + for _, linked_container in pairs(linked_containers) do + linked_container.link_id = 0 + end + + local valid_tanks = {} + local valid_tank_fuel = {} + local valid_tank_energy_per_fuel = {} + local total_energy = 0 + for _, tank in pairs(tanks) do + local tank_x = math.floor(tank.position.x) + local tank_y = math.floor(tank.position.y) + + if spaceship.known_tiles[tank_x] and spaceship.known_tiles[tank_x][tank_y] + and spaceship.known_tiles[tank_x][tank_y] == Spaceship.tile_status.floor_console_connected + and #tank.fluidbox > 0 then + local fluidbox = tank.fluidbox[1] or {amount = 0} + if fluidbox.amount > 0 and required_energy > 0 then + local amount = fluidbox.amount + local energy_per_fuel = game.fluid_prototypes[fluidbox.name].fuel_value + table.insert(valid_tanks, tank) + table.insert(valid_tank_fuel, fluidbox.amount) + table.insert(valid_tank_energy_per_fuel, energy_per_fuel) + total_energy = total_energy + amount * energy_per_fuel + end + end + end + + for i, tank in pairs(valid_tanks) do + local consume = math.ceil(math.min(valid_tank_fuel[i], required_energy / total_energy * valid_tank_fuel[i])) + required_energy = required_energy - consume * valid_tank_energy_per_fuel[i] + total_energy = total_energy - consume * valid_tank_energy_per_fuel[i] + local fluidbox = tank.fluidbox[1] or {amount = 0} + fluidbox.amount = fluidbox.amount - consume + if fluidbox.amount > 0 then + tank.fluidbox[1] = fluidbox + else + tank.fluidbox[1] = nil + end + end + + -- copy ship to surface + local extent = Spaceship.compute_extent(spaceship) + local max_extent = math.max(extent.max_x - extent.min_x, extent.max_y, extent.min_y) + ship_surface.request_to_generate_chunks({x = (extent.min_x + extent.max_x / 2), y = (extent.min_y + extent.max_y / 2)} ) + ship_surface.force_generate_chunk_requests() + local area = { + left_top = {x = extent.min_x, y = extent.min_y}, + right_bottom = {x = extent.max_x, y = extent.max_y}, + } + -- get characters out of vehicles + local vehicle_drivers = {} + local vehicle_passengers = {} + local vehicles = current_surface.find_entities_filtered{ + type = {"car", "spider-vehicle", "locomotive", "cargo-wagon"}, + area = area + } + for _, vehicle in pairs(vehicles) do + local vehicle_x = math.floor(vehicle.position.x) + local vehicle_y = math.floor(vehicle.position.y) + if spaceship.known_tiles[vehicle_x] and spaceship.known_tiles[vehicle_x][vehicle_y] + and spaceship.known_tiles[vehicle_x][vehicle_y] == Spaceship.tile_status.floor_console_connected then + local driver = vehicle.get_driver() + vehicle.set_driver(nil) + if driver then + if driver.is_player()then driver = driver.character end -- sets to nil if required + end + if driver and driver.valid then + table.insert(vehicle_drivers, { + vehicle_name = vehicle.name, + vehicle_position = vehicle.position, + driver_name = driver.name, + driver_position = driver.position + }) + end + if vehicle.type == "car" then + local passenger = vehicle.get_passenger() + vehicle.set_passenger(nil) + if passenger then + if passenger.is_player()then passenger = passenger.character end -- sets to nil if required + end + if passenger and passenger.valid then + table.insert(vehicle_drivers, { + vehicle_name = vehicle.name, + vehicle_position = vehicle.position, + passenger_name = passenger.name, + passenger_position = passenger.position + }) + end + end + end + end + + local locomotive_settings = {} + for _, locomotive in pairs(current_surface.find_entities_filtered{type = "locomotive", area = area}) do + local locomotive_x = math.floor(locomotive.position.x) + local locomotive_y = math.floor(locomotive.position.y) + if spaceship.known_tiles[locomotive_x] and spaceship.known_tiles[locomotive_x][locomotive_y] + and spaceship.known_tiles[locomotive_x][locomotive_y] == Spaceship.tile_status.floor_console_connected then + table.insert(locomotive_settings, {name = locomotive.name, position = locomotive.position, manual_mode = locomotive.train.manual_mode}) + end + end + + current_surface.clone_area{ + destination_surface = ship_surface, + source_area = area, + destination_area = table.deepcopy(area), + clone_tiles = true, + clone_entities = true, + clone_decoratives = false, + clear_destination = true, + expand_map = true + } + + -- Pause inserters, workaround for https://forums.factorio.com/viewtopic.php?f=58&t=89035 + local condition_entities = ship_surface.find_entities_filtered{type = Spaceship.types_to_restore, area = area} + spaceship.entities_to_restore = spaceship.entities_to_restore or {} + spaceship.entities_to_restore_tick = game.tick + Spaceship.time_to_restore + for _, entity in pairs(condition_entities) do + table.insert(spaceship.entities_to_restore, {entity = entity, active=entity.active}) + entity.active = false + end + + local bad_tiles = ship_surface.find_tiles_filtered{ name = {name_out_of_map_tile} } + local set_tiles = {} + for _, tile in pairs(bad_tiles) do + table.insert(set_tiles, {position = tile.position, name=name_space_tile}) + ship_surface.set_hidden_tile(tile.position, name_space_tile) + end + ship_surface.set_tiles(set_tiles) + + local change_tiles_zone = {} -- surface set_tiles specification + local change_tiles_ship = {} + -- transfer the console + local old_console = spaceship.console + local console_clone = ship_surface.find_entity(Spaceship.name_spaceship_console, spaceship.console.position) + spaceship.console = console_clone + spaceship.console_output = nil + old_console.destroy() + + for x = extent.min_x, extent.max_x do + for y = extent.min_y, extent.max_y do + if spaceship.known_tiles[x] and spaceship.known_tiles[x][y] and + (spaceship.known_tiles[x][y] == Spaceship.tile_status.floor_console_connected + or spaceship.known_tiles[x][y] == Spaceship.tile_status.bulkhead_console_connected) then + -- valid tile remove from zone + local under_tile = current_surface.get_hidden_tile({x=x,y=y}) + if under_tile == nil or Spaceship.is_floor(under_tile) then + under_tile = "landfill" -- fallback + end + table.insert(change_tiles_zone, {name = under_tile, position = {x=x,y=y}}) + local entities = current_surface.find_entities_filtered{ + area = {left_top={x=x,y=y}, right_bottom={x=x+1,y=y+1}} + } + for _, entity in pairs(entities) do + if entity.valid and entity.type == "character" then + local clone = ship_surface.find_entity(entity.name, entity.position) + if clone and entity.player then + entity.player.teleport(clone.position, ship_surface) + util.safe_destroy(clone) + else + for _, playerdata in pairs(global.playerdata) do + if playerdata.character == entity then + playerdata.character = clone + end + end + util.safe_destroy(entity) + end + else + util.safe_destroy(entity) + end + end + else + -- invalid tile remove from ship + table.insert(change_tiles_ship, {name = name_space_tile, position = {x=x,y=y}}) + local entities = ship_surface.find_entities_filtered{ + area = {left_top={x=x,y=y}, right_bottom={x=x+1,y=y+1}} + } + for _, entity in pairs(entities) do + if entity.valid then + if entity.type == "straight-rail" + or entity.name == Spaceship.name_spaceship_clamp_keep then + -- only remove if it is not overlapping valid tiles. + local valid = false + for x2 = math.floor(entity.position.x)-1, math.floor(entity.position.x) do + if not valid then + for y2 = math.floor(entity.position.y)-1, math.floor(entity.position.y) do + if spaceship.known_tiles[x2] and spaceship.known_tiles[x2][y2] and + (spaceship.known_tiles[x2][y2] == Spaceship.tile_status.floor_console_connected + or spaceship.known_tiles[x2][y2] == Spaceship.tile_status.bulkhead_console_connected) then + valid = true break + end + end + end + end + if not valid then + util.safe_destroy(entity) + end + else + util.safe_destroy(entity) + end + end + end + end + ship_surface.set_hidden_tile({x=x,y=y}, name_space_tile) + end + end + current_surface.set_tiles(change_tiles_zone, true) + ship_surface.set_tiles(change_tiles_ship, true) + + local cars = ship_surface.find_entities_filtered{type = {"car"}} + for _, car in pairs(cars) do + if not string.find(car.name, mod_prefix.."space") then + car.active = false + end + end + + spaceship.near = {type="zone", index= spaceship.zone_index} + spaceship.stopped = true + spaceship.zone_index = nil + + spaceship.near_star = Zone.get_star_from_child(current_zone) or Zone.get_star_from_position(spaceship) + Spaceship.set_light(spaceship, ship_surface) + + Spaceship.deactivate_engines(spaceship) + + CondenserTurbine.reset_surface(ship_surface) + Nexus.reset_surface(ship_surface) + LinkedContainer.update() + + if not Zone.is_space(current_zone) then -- started from land, space zome entities + -- space the ground entities + -- unground the space entities + local names_for_spaced = {} + local names_grounded = {} + for name, prototype in pairs(game.entity_prototypes) do + if string.find(name, name_suffix_spaced, 1, true) then + table.insert(names_for_spaced, util.replace(name, name_suffix_spaced, "")) + end + if string.find(name, name_suffix_grounded, 1, true) then + table.insert(names_grounded, name) + end + end + local entities_for_spaced = ship_surface.find_entities_filtered{name = names_for_spaced} + for _, entity in pairs(entities_for_spaced) do + swap_structure(entity, entity.name..name_suffix_spaced) + end + local entities_grounded = ship_surface.find_entities_filtered{name = names_grounded} + for _, entity in pairs(entities_grounded) do + swap_structure(entity, util.replace(entity.name, name_suffix_grounded, "")) + end + end + + local destroy_names = {} + for _, name in pairs(remote.call("shield-projector", "get_sub_entity_names", event)) do + table.insert(destroy_names, name) + end + local destroy_entities = ship_surface.find_entities_filtered{name = destroy_names} + for _, entity in pairs(destroy_entities) do + util.safe_destroy(entity) + end + + -- put characters back in vehicles + for _, vehicle_driver in pairs(vehicle_drivers) do + local vehicle = ship_surface.find_entity(vehicle_driver.vehicle_name, vehicle_driver.vehicle_position) + local driver = ship_surface.find_entity(vehicle_driver.driver_name, vehicle_driver.driver_position) + if vehicle and driver then + vehicle.set_driver(driver) + end + end + for _, vehicle_passenger in pairs(vehicle_passengers) do + local vehicle = ship_surface.find_entity(vehicle_passenger.vehicle_name, vehicle_passenger.vehicle_position) + local passenger = ship_surface.find_entity(vehicle_passenger.passenger_name, vehicle_passenger.passenger_position) + if vehicle and passenger then + vehicle.set_passenger(passenger) + end + end + + -- switch on trains + for _, locomotive_setting in pairs(locomotive_settings) do + local locomotive = ship_surface.find_entity(locomotive_setting.name, locomotive_setting.position) + if locomotive then + locomotive.train.manual_mode = locomotive_setting.manual_mode + end + end + + remote.call("shield-projector", "find_on_surface", {surface = ship_surface}) + + for _, player in pairs(game.connected_players) do + if player.surface.index == current_surface.index or player.surface.index == ship_surface.index then + player.play_sound{path = "se-spaceship-woosh", volume = 1} + end + end + + + Spaceship.update_output_combinator(spaceship) + + Spaceship.start_integrity_check(spaceship) + + log("spaceship launch end") + +end + +function Spaceship.land_at_position(spaceship, position, ignore_average) + if spaceship.own_surface_index and spaceship.near and spaceship.near.type == "zone" and spaceship.known_tiles then + local destination_zone = Zone.from_zone_index(spaceship.near.index) + if not destination_zone then return end + + local ship_surface = game.surfaces["spaceship-" .. spaceship.index] + local target_surface = Zone.get_make_surface(destination_zone) + + local offset_x = util.to_rail_grid(position.x - spaceship.known_tiles_average_x) + local offset_y = util.to_rail_grid(position.y - spaceship.known_tiles_average_y) + if ignore_average then + offset_x = util.to_rail_grid(position.x) + offset_y = util.to_rail_grid(position.y) + end + + local extent = Spaceship.compute_extent(spaceship) + local source_area = { + left_top = { + x = extent.min_x, + y = extent.min_y + }, + right_bottom = { + x = extent.max_x, + y = extent.max_y + }, + } + local destination_area = { + left_top = { + x = extent.min_x + offset_x, + y = extent.min_y + offset_y + }, + right_bottom = { + x = extent.max_x + offset_x, + y = extent.max_y + offset_y + }, + } + local dont_land_on = table.deepcopy(Ancient.vault_entrance_structures) + table.insert(dont_land_on, Ancient.name_gate_blocker) + table.insert(dont_land_on, Ancient.name_gate_blocker_void) + for name, stuff in pairs(Ancient.gate_fragments) do + table.insert(dont_land_on, name) + end + if target_surface.count_entities_filtered{name = dont_land_on, area = destination_area} > 0 then + return + end + + local landing_area_entities = {} + for x = extent.min_x, extent.max_x do + for y = extent.min_y, extent.max_y do + if spaceship.known_tiles[x] and spaceship.known_tiles[x][y] and + (spaceship.known_tiles[x][y] == Spaceship.tile_status.floor_console_connected + or spaceship.known_tiles[x][y] == Spaceship.tile_status.bulkhead_console_connected) then + local area = { + left_top={ + x=x + offset_x, + y=y + offset_y}, + right_bottom={ + x=x+31/32 + offset_x, + y=y+31/32 + offset_y}} + local entities = target_surface.find_entities_filtered{ area = area } + for _, entity in pairs(entities) do + if entity.force.name ~= "neutral" and entity.type ~= "entity-ghost" and entity.type ~= "tile-ghost" + and entity.type ~= "logistic-robot" and entity.type ~= "construction-robot" and entity.type ~= "deconstructible-tile-proxy" then + ship_surface.print({"cant-build-reason.entity-in-the-way", {"entity-name."..entity.name}}) + return + end + table.insert(landing_area_entities, entity) + end + end + end + end + + -- point of no return + + local linked_containers = ship_surface.find_entities_filtered{type="linked-container"} + for _, linked_container in pairs(linked_containers) do + linked_container.link_id = 0 + end + + if spaceship.particle_object_ids then + for _, ids in pairs(spaceship.particle_object_ids) do + for _, id in pairs(ids) do + rendering.destroy(id) + end + end + spaceship.particle_object_ids = nil + end + + local destroy_names = {} + table.insert(destroy_names, mod_prefix.."spaceship-travel-anchor") + for _, particle in pairs(Spaceship.particles) do + if particle.graphic_name then + table.insert(destroy_names, particle.graphic_name) + end + if particle.projectile_name then + table.insert(destroy_names, particle.projectile_name) + end + if particle.targetable_name then + table.insert(destroy_names, particle.targetable_name) + end + end + + for _, name in pairs(remote.call("shield-projector", "get_sub_entity_names", event)) do + table.insert(destroy_names, name) + end + local destroy_entities = ship_surface.find_entities_filtered{name = destroy_names} + for _, entity in pairs(destroy_entities) do + util.safe_destroy(entity) + end + + Zone.apply_markers(destination_zone) -- in case the surface exists + + -- get characters out of vehicles + local vehicle_drivers = {} + local vehicle_passengers = {} + local vehicles = ship_surface.find_entities_filtered{ + type = {"car", "spider-vehicle", "locomotive", "cargo-wagon"}, + area = source_area + } + for _, vehicle in pairs(vehicles) do + local vehicle_x = math.floor(vehicle.position.x) + local vehicle_y = math.floor(vehicle.position.y) + if spaceship.known_tiles[vehicle_x] and spaceship.known_tiles[vehicle_x][vehicle_y] + and spaceship.known_tiles[vehicle_x][vehicle_y] == Spaceship.tile_status.floor_console_connected then + local driver = vehicle.get_driver() + vehicle.set_driver(nil) + if driver then + if driver.is_player()then driver = driver.character end -- sets to nil if required + end + if driver and driver.valid then + table.insert(vehicle_drivers, { + vehicle_name = vehicle.name, + vehicle_position = vehicle.position, + driver_name = driver.name, + driver_position = driver.position + }) + end + if vehicle.type == "car" then + local passenger = vehicle.get_passenger() + vehicle.set_passenger(nil) + if passenger then + if passenger.is_player()then passenger = passenger.character end -- sets to nil if required + end + if passenger and passenger.valid then + table.insert(vehicle_drivers, { + vehicle_name = vehicle.name, + vehicle_position = vehicle.position, + passenger_name = passenger.name, + passenger_position = passenger.position + }) + end + end + end + end + + local locomotive_settings = {} + for _, locomotive in pairs(ship_surface.find_entities_filtered{type = "locomotive"}) do + table.insert(locomotive_settings, {name = locomotive.name, position = locomotive.position, manual_mode = locomotive.train.manual_mode}) + end + + -- copy ship to surface + local change_tiles_zone = {} + for x, x_tiles in pairs(spaceship.known_tiles) do + for y, status in pairs(x_tiles) do + if status == Spaceship.tile_status.floor_console_connected + or status == Spaceship.tile_status.bulkhead_console_connected then + local tile = ship_surface.get_tile({x,y}) + if Spaceship.is_floor(tile.name) then + table.insert(change_tiles_zone, {name = tile.name, position = { + x = x + offset_x, + y = y + offset_y}}) + end + end + end + end + target_surface.set_tiles(change_tiles_zone, true) + + -- clear the target area + for _, entity in pairs(landing_area_entities) do + if entity.valid then + if entity.type == "character" then + entity.health = entity.health * 0.1 + else + util.safe_destroy(entity)-- maybe use die? + end + end + end + + -- do this before cloning + if not Zone.is_space(destination_zone) then -- started from space (spacehsip), ending on land + -- un-space the ground entities + -- ground the space entities + local names_for_grounded = {} + local names_spaced = {} + for name, prototype in pairs(game.entity_prototypes) do + if string.find(name, name_suffix_grounded, 1, true) then + table.insert(names_for_grounded, util.replace(name, name_suffix_grounded, "")) + end + if string.find(name, name_suffix_spaced, 1, true) then + table.insert(names_spaced, name) + end + end + local entities_for_grounded = ship_surface.find_entities_filtered{name = names_for_grounded} + for _, entity in pairs(entities_for_grounded) do + swap_structure(entity, entity.name..name_suffix_grounded) + end + local entities_spaced = ship_surface.find_entities_filtered{name = names_spaced} + for _, entity in pairs(entities_spaced) do + swap_structure(entity, util.replace(entity.name, name_suffix_spaced, "")) + end + end + + ship_surface.clone_area{ + destination_surface = target_surface, + source_area = source_area, + destination_area = destination_area, + clone_tiles = false, + clone_entities = true, + clone_decoratives = false, + clear_destination_entities = false, + clear_destination_decoratives = false, + expand_map = true + } + + -- Pause inserters, workaround for https://forums.factorio.com/viewtopic.php?f=58&t=89035 + local condition_entities = target_surface.find_entities_filtered{type = Spaceship.types_to_restore, area = destination_area} + spaceship.entities_to_restore = spaceship.entities_to_restore or {} + spaceship.entities_to_restore_tick = game.tick + Spaceship.time_to_restore + for _, entity in pairs(condition_entities) do + table.insert(spaceship.entities_to_restore, {entity = entity, active=entity.active}) + entity.active = false + end + + local characters = ship_surface.find_entities_filtered{type = "character"} + for _, character in pairs(characters) do + local target_position = { + x = character.position.x + offset_x, + y = character.position.y + offset_y, + } + local clone = target_surface.find_entity( character.name, target_position ) -- find equivalent character on target surface + if character.player then -- player is attached + local player = character.player + if clone then + --test clone destruction method instead of swap (swap causes some issues) + --player.set_controller{type = defines.controllers.ghost} -- detatch from character + --player.teleport(character.position, target_surface) + --player.set_controller{type = defines.controllers.character, character = clone} -- attach clone + --remote.call("jetpack", "stop_jetpack_immediate", {character = clone}) + player.teleport(target_position, target_surface) + remote.call("jetpack", "stop_jetpack_immediate", {character = character}) + util.safe_destroy(clone) + else + player.teleport(target_position, target_surface) + remote.call("jetpack", "stop_jetpack_immediate", {character = character}) + end + else -- no player attached, try to preserve detatched connection + if clone then + for player_index, playerdata in pairs(global.playerdata) do + local player = game.players[player_index] + if playerdata.character and playerdata.character == character then + playerdata.character = clone + end + end + remote.call("jetpack", "stop_jetpack_immediate", {character = clone}) + end + end + end + + -- transfer the console + local old_console = spaceship.console + local console_clone = target_surface.find_entity(Spaceship.name_spaceship_console, { + x = spaceship.console.position.x + offset_x, + y = spaceship.console.position.y + offset_y, + }) + if not console_clone then + Log.trace("Error finding console clone") + end + spaceship.console = console_clone + spaceship.console_output = nil + old_console.destroy() + + for x = extent.min_x, extent.max_x do + for y = extent.min_y, extent.max_y do + if spaceship.known_tiles[x] and spaceship.known_tiles[x][y] and + (spaceship.known_tiles[x][y] == Spaceship.tile_status.floor_console_connected + or spaceship.known_tiles[x][y] == Spaceship.tile_status.bulkhead_console_connected) then + local entities = ship_surface.find_entities_filtered{ + area = { + left_top={ + x=x + offset_x, + y=y + offset_y}, + right_bottom={ + x=x+1 + offset_x, + y=y+1 + offset_y}} + } + for _, entity in pairs(entities) do + util.safe_destroy(entity) + end + end + end + end + -- move non-character players + for _, player in pairs(game.connected_players) do + if player.surface == ship_surface then + player.teleport({x = player.position.x + offset_x, y = player.position.y + offset_y}, target_surface) + RemoteView.gui_update(player) + end + end + game.delete_surface(ship_surface) + spaceship.own_surface_index = nil + spaceship.particles = {} + spaceship.zone_index = spaceship.near.index + spaceship.near = nil + spaceship.stopped = true + spaceship.is_moving = false + spaceship.speed = 0 + local engines = target_surface.find_entities_filtered{name = Spaceship.names_engines} + for _, engine in pairs(engines) do + engine.active = false + end + + -- put characters back in vehicles + for _, vehicle_driver in pairs(vehicle_drivers) do + local vehicle = target_surface.find_entity(vehicle_driver.vehicle_name, { + x = vehicle_driver.vehicle_position.x + offset_x, + y = vehicle_driver.vehicle_position.y + offset_y, + }) + local driver = target_surface.find_entity(vehicle_driver.driver_name, { + x = vehicle_driver.driver_position.x + offset_x, + y = vehicle_driver.driver_position.y + offset_y, + }) + if vehicle and driver then + vehicle.set_driver(driver) + end + end + for _, vehicle_passenger in pairs(vehicle_passengers) do + local vehicle = target_surface.find_entity(vehicle_passenger.vehicle_name, { + x = vehicle_passenger.vehicle_position.x + offset_x, + y = vehicle_passenger.vehicle_position.y + offset_y, + }) + local passenger = target_surface.find_entity(vehicle_passenger.passenger_name, { + x = vehicle_passenger.passenger_position.x + offset_x, + y = vehicle_passenger.passenger_position.y + offset_y, + }) + if vehicle and passenger then + vehicle.set_passenger(passenger) + end + end + + -- switch on trains + for _, locomotive_setting in pairs(locomotive_settings) do + local locomotive = target_surface.find_entity(locomotive_setting.name, { + x = locomotive_setting.position.x + offset_x, + y = locomotive_setting.position.y + offset_y, + }) + if locomotive then + locomotive.train.manual_mode = locomotive_setting.manual_mode + end + end + + CondenserTurbine.reset_surface(target_surface) + Nexus.reset_surface(target_surface) + LinkedContainer.update() + + remote.call("shield-projector", "find_on_surface", {surface = target_surface}) + + local cars = target_surface.find_entities_filtered{type = {"car"}} + for _, car in pairs(cars) do + if Zone.is_space(destination_zone) then + if not string.find(car.name, mod_prefix.."space") then + car.active = false + end + else + car.active = true + end + end + + Spaceship.start_integrity_check(spaceship) + + for _, player in pairs(game.connected_players) do + if player.surface.index == target_surface.index or player.surface.index == ship_surface.index then + player.play_sound{path = "se-spaceship-woosh", volume = 1} + end + end + + Spaceship.update_output_combinator(spaceship) + + end +end + +function Spaceship.anchor_scouting_tick(player, spaceship) + local playerdata = get_make_playerdata(player) + if not playerdata.anchor_scouting_cache then + playerdata.anchor_scouting_cache = {} + + if spaceship.known_tiles then + local extent = Spaceship.compute_extent(spaceship) + local aabb + for x = extent.min_x, extent.max_x do + for y = extent.min_y, extent.max_y do + local value = spaceship.known_tiles[x] and spaceship.known_tiles[x][y] + if value == Spaceship.tile_status.floor_console_connected + or value == Spaceship.tile_status.bulkhead_console_connected then + if not aabb then + aabb = {min_x=x,max_x=x+1,min_y=y,max_y=y+1} + else + aabb.max_y = aabb.max_y + 1 + end + else + if aabb then + table.insert(playerdata.anchor_scouting_cache, aabb) + aabb = nil + end + end + end + if aabb then + table.insert(playerdata.anchor_scouting_cache, aabb) + aabb = nil + end + end + end + end + + if playerdata.anchor_scouting_cache then + local offset_x = util.to_rail_grid(player.position.x - spaceship.known_tiles_average_x) + local offset_y = util.to_rail_grid(player.position.y - spaceship.known_tiles_average_y) + for _, aabb in pairs(playerdata.anchor_scouting_cache) do + rendering.draw_rectangle{ + color = {r = 0.125, g = 0.125, b = 0, a = 0.01}, + filled = true, + left_top = {x=aabb.min_x+offset_x,y=aabb.min_y+offset_y}, + right_bottom = {x=aabb.max_x+offset_x,y=aabb.max_y+offset_y}, + surface = player.surface, + time_to_live = 2 + } + end + end +end + +function Spaceship.start_anchor_scouting(spaceship, player) + if not spaceship.near and spaceship.near.type == "zone" then return end + local zone = Zone.from_zone_index(spaceship.near.index) + if not zone then return end + + local playerdata = get_make_playerdata(player) + -- enter remote view + playerdata.anchor_scouting_for_spaceship_index = spaceship.index + + local character = player.character + if character then + playerdata.character = character + end + player.set_controller{type = defines.controllers.ghost} + --player.set_controller{type = defines.controllers.spectator} + + if character then + -- stop the character from continuing input action (running to doom) + character.walking_state = {walking = false, direction = defines.direction.south} + character.riding_state = {acceleration = defines.riding.acceleration.braking, direction = defines.riding.direction.straight} + character.shooting_state = {state = defines.shooting.not_shooting, position=character.position} + end + + local surface = Zone.get_make_surface(zone) + local position = {x=0,y=0} + if playerdata.surface_positions and playerdata.surface_positions[surface.index] then + position = playerdata.surface_positions[surface.index] + end + + player.teleport(position, surface) + +end + +function Spaceship.stop_anchor_scouting(player) + local playerdata = get_make_playerdata(player) + if playerdata.anchor_scouting_for_spaceship_index then + playerdata.anchor_scouting_for_spaceship_index = nil + if playerdata.remote_view_active then + local surface = player.surface + local position = player.position + RemoteView.stop(player) + RemoteView.start(player) + player.teleport(position, surface) + else + if playerdata.character and playerdata.character.valid then + player.teleport(playerdata.character.position, playerdata.character.surface) + player.set_controller{type = defines.controllers.character, character = playerdata.character} + elseif not player.character then + Respawn.die(player) + end + end + end + playerdata.anchor_scouting_cache = nil +end + + +function Spaceship.on_gui_click(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + root = gui_element_or_parent(element, Spaceship.name_spaceship_gui_root) + if not root then return end + local playerdata = get_make_playerdata(player) + local spaceship = Spaceship.from_index(root.spaceship_index.children_names[1]) + if not spaceship then + if playerdata.anchor_scouting_for_spaceship_index then + Spaceship.stop_anchor_scouting(player) + end + return + end + + if element.name == "launch" then + + if spaceship.zone_index then + spaceship.is_launching = true + spaceship.is_landing = false + Spaceship.start_integrity_check(spaceship) + end + + elseif element.name == "button_anchor" then + + if spaceship.near and spaceship.near.type == "zone" then + if playerdata.anchor_scouting_for_spaceship_index then + local position = table.deepcopy(player.position) + Spaceship.stop_anchor_scouting(player) + Spaceship.land_at_position(spaceship, position) + else + spaceship.is_launching = false + spaceship.is_landing = true + Spaceship.start_anchor_scouting(spaceship, player) + Spaceship.start_integrity_check(spaceship) + end + elseif playerdata.anchor_scouting_for_spaceship_index then + Spaceship.stop_anchor_scouting(player) + end + + elseif element.name == "board" then + + if spaceship.near and spaceship.near.type == "spaceship" then + local othership = Spaceship.from_index(spaceship.near.index) + if othership and Zone.get_travel_delta_v_sub(spaceship, othership) < 1 then + if not othership.own_surface_index then + player.print({"space-exploration.fail-board-target-anchored"}) + else + local character = player.character + if not character then + local playerdata = get_make_playerdata(player) + character = playerdata.character + end + if not character then + player.print({"space-exploration.fail-board-no-character"}) + else + if character.surface.index ~= spaceship.own_surface_index then + player.print({"space-exploration.fail-board-remote-character"}) + else + local surface = Spaceship.get_current_surface(othership) + local boarding_position = Spaceship.get_boarding_position(othership) + --teleport_non_colliding_player(player, boarding_position, surface) + teleport_character_to_surface(character, surface, boarding_position) + Spaceship.gui_close(player) + end + end + end + end + end + + elseif element.name == "stop" then + + spaceship.stopped = true + spaceship.target_speed = nil + + elseif element.name == "start" then + + spaceship.stopped = false + spaceship.target_speed = nil + Spaceship.start_integrity_check(spaceship) + + elseif element.name == "cancel_anchor_scouting" then + + Spaceship.stop_anchor_scouting(player) + + elseif element.name == "start-integrity-check" then + + spaceship.max_speed = 0 + Spaceship.start_integrity_check(spaceship, 0.1) + + elseif element.name == "rename" then + + local name_flow = element.parent + element.destroy() + name_flow["show-name"].destroy() + local name_label = name_flow.add{ type = "textfield", name="write-name", text=spaceship.name, style="space_platform_textfield_short"} + local rename_button = name_flow.add{ type = "sprite-button", name="rename-confirm", sprite="utility/enter", + tooltip={"space-exploration.rename-something", {"space-exploration.spaceship"}}, style="space_platform_sprite_button_small"} + + elseif element.name == "rename-confirm" then + + local name_flow = element.parent + element.destroy() + local new_name = string.trim(name_flow["write-name"].text) + if newname ~= "" and new_name ~= spaceship.name then + --do change name stuff + spaceship.name = new_name + end + name_flow["write-name"].destroy() + local name_label = name_flow.add{ type = "label", name="show-name", caption="The " ..spaceship.name, style="space_platform_title_short"} + local rename_button = name_flow.add{ type = "sprite-button", name="rename", sprite="utility/rename_icon_normal", + tooltip={"space-exploration.rename-something", {"space-exploration.spaceship"}}, style="space_platform_sprite_button_small"} + + elseif element.name == "spaceship-list-zones" then + + local value = player_get_dropdown_value(player, element.name, element.selected_index) + if type(value) == "table" then + if value.type == "zone" then + local zone_index = value.index + local zone = Zone.from_zone_index(zone_index) + if zone then + spaceship.destination = {type = "zone", index = zone_index} + spaceship.travel_message = {"space-exploration.spaceship-travel-message-new-course-plotted"} + --spaceship.destination_zone_index = zone_index + Log.trace("set destination to location: " .. zone.name ) + end + + elseif value.type == "spaceship" then + local spaceship_index = value.index + local destination_spaceship = Spaceship.from_index(spaceship_index) + if destination_spaceship == spaceship then + player.print({"space-exploration.spaceship-cannot-set-destination-to-self"}) + else + spaceship.destination = {type = "spaceship", index = spaceship_index} + spaceship.travel_message = {"space-exploration.spaceship-travel-message-new-course-plotted"} + Log.trace("set destination to spaceship : " .. spaceship.name ) + end + end + Spaceship.update_output_combinator(spaceship) + else + Spaceship.gui_close(player) + Log.trace("Error: Non-table value ") + end + + elseif element.name == "clear_filter" then + element.parent.filter_list.text = "" + Spaceship.gui_update_destinations_list(player) + elseif element.name == Spaceship.name_window_close then + Spaceship.gui_close(player) + end +end +Event.addListener(defines.events.on_gui_click, Spaceship.on_gui_click) +Event.addListener(defines.events.on_gui_selection_state_changed, Spaceship.on_gui_click) + + +function Spaceship.on_gui_checked_state_changed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + root = gui_element_or_parent(element, Spaceship.name_spaceship_gui_root) + if not root then return end + local spaceship = Spaceship.from_index(root.spaceship_index.children_names[1]) + if not spaceship then return end + if element.name == "list-zones-alphabetical" then + local playerdata = get_make_playerdata(player) + playerdata.zones_alphabetical = element.state + Spaceship.gui_update_destinations_list(player) + end +end +Event.addListener(defines.events.on_gui_checked_state_changed, Spaceship.on_gui_checked_state_changed) + +function Spaceship.gui_update_destinations_list(player) + + local playerdata = get_make_playerdata(player) + local root = player.gui.left[Spaceship.name_spaceship_gui_root] + if not root then return end + local spaceship = Spaceship.from_index(root.spaceship_index.children_names[1]) + if not spaceship then return end + if root then + + local filter = nil + if root.filter_flow and root.filter_flow.filter_list then + filter = string.trim(root.filter_flow.filter_list.text) + if filter == "" then + filter = nil + end + end + + -- update the list + local destination_zone = Spaceship.get_destination_zone(spaceship) + if not destination_zone then destination_zone = Zone.from_zone_index(spaceship.zone_index) end + + local list, selected_index, values = Zone.dropdown_list_zone_destinations(spaceship.force_name, destination_zone, playerdata.zones_alphabetical, filter) + root["spaceship-list-zones"].items = list + root["spaceship-list-zones"].selected_index = selected_index or 1 + player_set_dropdown_values(player, "spaceship-list-zones", values) + end +end + +function Spaceship.on_gui_text_changed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + local root = gui_element_or_parent(element, Spaceship.name_spaceship_gui_root) + if root then -- remote view + if element.name == "filter_list" then + Spaceship.gui_update_destinations_list(player) + end + end +end +Event.addListener(defines.events.on_gui_text_changed, Spaceship.on_gui_text_changed) + +function Spaceship.gui_update(player) + local root = player.gui.left[Spaceship.name_spaceship_gui_root] + if root then + local spaceship = Spaceship.from_index(root.spaceship_index.children_names[1]) + + if spaceship then + local playerdata = get_make_playerdata(player) + + --local inv = spaceship.container.get_inventory(defines.inventory.chest) + --local inv_used = count_inventory_slots_used(inv) + + --root["cargo_capacity"].caption="Cargo: " .. math.min(inv_used, #inv) .. " / " .. #inv + --root["cargo_capacity_progress"].value=math.min(inv_used, #inv) / #inv + + local energy_required = Spaceship.get_launch_energy_cost(spaceship) + + if root["launch_energy"] then + if spaceship.zone_index then + if energy_required and spaceship.launch_energy then + --root["launch_energy"].caption="Launch energy: " .. Util.format_energy(spaceship.launch_energy) .. " / " .. Util.format_energy(energy_required, true) + root["launch_energy"].caption={"space-exploration.spaceship-launch-energy", Util.format_energy(spaceship.launch_energy) .. " / " .. Util.format_energy(energy_required, true)} + root["launch_energy_progress"].value = math.min(1, spaceship.launch_energy / energy_required) + else + --root["launch_energy"].caption="Launch energy: Requires valid integrity check." + root["launch_energy"].caption={"space-exploration.spaceship-launch-energy-invalid"} + root["launch_energy_progress"].value = 0 + end + else + -- repurpose for speed + if spaceship.speed > 0 then + --root["launch_energy"].caption="Speed: " .. string.format("%.2f", spaceship.speed or 0) .. " / " .. string.format("%.2f", spaceship.max_speed or 0) + root["launch_energy"].caption={"space-exploration.spaceship-speed", string.format("%.2f", spaceship.speed or 0) .. " / " .. string.format("%.2f", spaceship.max_speed or 0)} + root["launch_energy_progress"].value = math.min(1, spaceship.speed / (spaceship.max_speed or spaceship.speed)) + else + --root["launch_energy"].caption="Speed: 0 / ".. string.format("%.2f", spaceship.max_speed or 0) + root["launch_energy"].caption={"space-exploration.spaceship-speed", " 0 / " .. string.format("%.2f", spaceship.max_speed or 0)} + root["launch_energy_progress"].value = 0 + end + end + end + + if root["streamline"] and root["streamline_progress"] then + if spaceship.streamline then + root["streamline"].caption={"space-exploration.spaceship-streamline", string.format("%.2f",(spaceship.streamline or 0) * 100).."%"} + root["streamline_progress"].value = spaceship.streamline or 0 + end + end + + if root["structural_integrity"] and root["structural_integrity_progress"] then + if spaceship.integrity_stress_structure and spaceship.integrity_limit then + --root["structural_integrity"].caption="Structural Stress (Hull): " .. spaceship.integrity_stress_structure .. " / " .. spaceship.integrity_limit + root["structural_integrity"].caption={"space-exploration.spaceship-structural-stress-hull", spaceship.integrity_stress_structure .. " / " .. spaceship.integrity_limit} + root["structural_integrity_progress"].value = math.min(1, spaceship.integrity_stress_structure / spaceship.integrity_limit) + else + --root["structural_integrity"].caption="Structural Stress (Hull): NA (Invalid containment)." + root["structural_integrity"].caption={"space-exploration.spaceship-structural-stress-hull-invalid"} + root["structural_integrity_progress"].value = 0 + end + end + + if root["container_integrity"] and root["container_integrity_progress"] then + if spaceship.integrity_stress_container and spaceship.integrity_limit then + --root["container_integrity"].caption="Structural Stress (Containers): " .. spaceship.integrity_stress_container .. " / " .. spaceship.integrity_limit + root["container_integrity"].caption={"space-exploration.spaceship-structural-stress-container", spaceship.integrity_stress_container .. " / " .. spaceship.integrity_limit} + root["container_integrity_progress"].value = math.min(1, spaceship.integrity_stress_container / spaceship.integrity_limit) + else + --root["container_integrity"].caption="Structural Stress (Containers): NA (Invalid containment)." + root["container_integrity"].caption={"space-exploration.spaceship-structural-stress-container-invalid"} + root["container_integrity_progress"].value = 0 + end + end + + if game.tick % 60 == 0 then + spaceship.distance_to_destination = Spaceship.get_distance_to_destination(spaceship) + spaceship.distance_to_destination_tick = game.tick + end + if spaceship.distance_to_destination and spaceship.speed then + if spaceship.speed == 0 then + if not spaceship.max_speed or spaceship.max_speed == 0 then + --root["travel-time"].caption = "Travel time: Unknown. Test max speed for estimate." + root["travel-time"].caption = {"space-exploration.spaceship-travel-time-unknown"} + else + --root["travel-time"].caption = "Travel time: ".. + -- Util.seconds_to_clock(spaceship.distance_to_destination / ((spaceship.max_speed or 1) * Spaceship.travel_speed_multiplier) / 60) + -- .. "s at max speed" + root["travel-time"].caption = {"space-exploration.spaceship-travel-time-max", Util.seconds_to_clock(spaceship.distance_to_destination / ((spaceship.max_speed or 1) * Spaceship.travel_speed_multiplier) / 60)} + end + else + root["travel-time"].caption = {"space-exploration.spaceship-travel-time-current", Util.seconds_to_clock(spaceship.distance_to_destination / ((spaceship.speed or 1) * Spaceship.travel_speed_multiplier) / 60)} + end + else + root["travel-time"].caption = {"space-exploration.spaceship-travel-time-current", 0} + end + + if (game.tick + 30) % 60 == 0 and root["closest-location"] then + local closest = Zone.find_nearest_zone( + spaceship.space_distortion, + spaceship.stellar_position, + spaceship.star_gravity_well, + spaceship.planet_gravity_well) + --root["closest-location"].caption="Closest Location: "..closest.name + root["closest-location"].caption = {"space-exploration.spaceship-closest-location", closest.name} + end + + + if spaceship.space_distortion > 0 then + --root["anomaly-distance"].caption = "Spacial Distortion: " .. string.format("%.2f", spaceship.space_distortion * Zone.travel_cost_space_distortion) + root["anomaly-distance"].caption = {"space-exploration.spaceship-location-spatial-distortion", string.format("%.2f", spaceship.space_distortion * Zone.travel_cost_space_distortion)} + else + root["anomaly-distance"].caption = "" + end + if spaceship.space_distortion > 0.05 then + root["stellar-x"].caption = "" + root["stellar-y"].caption = "" + root["star-gravity"].caption = "" + root["planet-gravity"].caption = "" + else + --root["stellar-x"].caption = "Quadrant X: " .. string.format("%.2f", spaceship.stellar_position.x * Zone.travel_cost_interstellar) + --root["stellar-y"].caption = "Quadrant Y: " .. string.format("%.2f", spaceship.stellar_position.y * Zone.travel_cost_interstellar) + root["stellar-x"].caption = {"space-exploration.spaceship-location-stellar-x", string.format("%.2f", spaceship.stellar_position.x * Zone.travel_cost_interstellar)} + root["stellar-y"].caption = {"space-exploration.spaceship-location-stellar-y", string.format("%.2f", spaceship.stellar_position.y * Zone.travel_cost_interstellar)} + if spaceship.star_gravity_well > 0 then + --root["star-gravity"].caption = "Star gravity well: " .. string.format("%.2f", spaceship.star_gravity_well * Zone.travel_cost_star_gravity) + root["star-gravity"].caption = {"space-exploration.spaceship-location-star-gravity-well", string.format("%.2f", spaceship.star_gravity_well * Zone.travel_cost_star_gravity)} + else + root["star-gravity"].caption = "" + end + if spaceship.planet_gravity_well > 0 then + --root["planet-gravity"].caption = "Planet gravity well: " .. string.format("%.2f", spaceship.planet_gravity_well * Zone.travel_cost_planet_gravity) + root["planet-gravity"].caption = {"space-exploration.spaceship-location-planet-gravity-well", string.format("%.2f", spaceship.planet_gravity_well * Zone.travel_cost_planet_gravity)} + else + root["planet-gravity"].caption = "" + end + end + + --if root["current-speed"] then + -- root["current-speed"].caption="Speed: " .. string.format("%.2f", spaceship.speed or 0) + --end + + if root["travel-status"] then + --root["travel-status"].caption="Travel Status: " .. (spaceship.travel_message or "") + root["travel-status"].caption={"space-exploration.spaceship-travel-status", (spaceship.travel_message or "")} + end + + if root["integrity-status"] then + --root["integrity-status"].caption="Integrity Status: " + -- .. (spaceship.integrity_valid and "Valid: " or "Invalid: ") + -- .. (spaceship.check_message or "") + if spaceship.integrity_valid then + root["integrity-status"].caption = {"space-exploration.spaceship-integrity-status-valid", (spaceship.check_message or "")} + else + root["integrity-status"].caption = {"space-exploration.spaceship-integrity-status-invalid", (spaceship.check_message or "")} + end + end + + -- button modes: + --[[ + launch when on a surface + Anchor when near a surface the is the destination + Stop when moving. + Engage when in space and: + a destination is selected + or not near a surface + ]]-- + + local button + if spaceship.zone_index then + -- launch + if not root["action-flow"]["launch"] then + root["action-flow"].clear() + root["action-flow"].add{ type="button", name="launch", caption={"space-exploration.spaceship-button-launch"}, style="confirm_button"} + end + button = root["action-flow"]["launch"] + if spaceship.integrity_valid then + if energy_required and spaceship.launch_energy and spaceship.launch_energy >= energy_required then + --button.caption = "Launch" + button.caption = {"space-exploration.spaceship-button-launch"} + --button.tooltip = "Ready to launch" + button.tooltip = {"space-exploration.spaceship-button-launch-tooltip"} + button.style = "confirm_button" + else + --button.caption = "Launch (disabled)" + button.caption = {"space-exploration.spaceship-button-launch-disabled"} + --button.tooltip = "Requires fuel in booster tanks" + button.tooltip = {"space-exploration.spaceship-button-launch-disabled-fuel-tooltip"} + button.style = "red_confirm_button" + end + else + --button.caption = "Launch (disabled)" + button.caption = {"space-exploration.spaceship-button-launch-disabled"} + --button.tooltip = "Requires valid integrity check" + button.tooltip = {"space-exploration.spaceship-button-launch-disabled-integrity-tooltip"} + button.style = "red_confirm_button" + end + + elseif spaceship.near and + (spaceship.destination == nil + or (spaceship.near.type == "zone" and spaceship.destination.index == spaceship.near.index)) then + -- anchor + local zone = Zone.from_zone_index(spaceship.near.index) + if not root["action-flow"]["button_anchor"] then + root["action-flow"].clear() + root["action-flow"].add{ type="button", name="button_anchor", caption={"space-exploration.spaceship-button-anchor"}, style="confirm_button"} + end + button = root["action-flow"]["button_anchor"] + if playerdata.anchor_scouting_for_spaceship_index then + --button.caption = "Confirm Anchor" + button.caption = {"space-exploration.spaceship-button-confirm-anchor"} + button.style = "confirm_button" + else + --local context = Zone.is_solid(zone) and "on" or "to" + --button.caption = "Anchor "..context.." "..zone.name + if Zone.is_solid(zone) then + button.caption = {"space-exploration.spaceship-button-anchor-on", zone.name} + else + button.caption = {"space-exploration.spaceship-button-anchor-to", zone.name} + end + button.style = "confirm_button" + end + + elseif spaceship.near and spaceship.near.type == "spaceship" and spaceship.destination + and spaceship.destination.type == "spaceship" and spaceship.destination.index == spaceship.near.index then + + -- board + local othership = Spaceship.from_index(spaceship.near.index) + if not othership then + spaceship.destination = nil + end + local name = othership and othership.name or "MISSING" + if not root["action-flow"]["board"] then + root["action-flow"].clear() + root["action-flow"].add{ type="button", name="board", caption={"space-exploration.spaceship-button-board", name}, style="confirm_button"} + end + button = root["action-flow"]["board"] + + + elseif spaceship.destination and not spaceship.stopped then + + if not root["action-flow"]["stop"] then + root["action-flow"].clear() + root["action-flow"].add{ type="button", name="stop", caption={"space-exploration.spaceship-button-stop"}, style="confirm_button"} + end + button = root["action-flow"]["stop"] + + else + + if not root["action-flow"]["start"] then + root["action-flow"].clear() + root["action-flow"].add{ type="button", name="start", caption={"space-exploration.spaceship-button-start"}, style="confirm_button"} + end + button = root["action-flow"]["start"] + + end + + button.style.top_margin = 10 + button.style.horizontally_stretchable = true + button.style.horizontal_align = "left" + + if playerdata.anchor_scouting_for_spaceship_index then + if not root["back-flow"]["cancel_anchor_scouting"] then + local back = root["back-flow"].add{type = "button", name = "cancel_anchor_scouting", + caption = {"space-exploration.spaceship-button-scouting-back"}, style="back_button", tooltip={"space-exploration.spaceship-button-scouting-back-tooltip"}} + back.style.top_margin = 10 + end + elseif root["back-flow"]["cancel_anchor_scouting"] then + root["back-flow"]["cancel_anchor_scouting"].destroy() + end + + end + end +end + + +function Spaceship.gui_open(player, spaceship) + if not spaceship then + player.print('Spaceship not found. Try replacing the console') + return + end + local gui = player.gui.left + close_own_guis(player) + local playerdata = get_make_playerdata(player) + + local container = gui.add{ type = "frame", name = Spaceship.name_spaceship_gui_root, style="space_platform_container", direction="vertical"} + + + local title_table = container.add{type="table", name="spaceship_index", column_count=2, draw_horizontal_lines=false} + title_table.style.horizontally_stretchable = true + title_table.style.column_alignments[1] = "left" + title_table.style.column_alignments[2] = "right" + + -- NOTE: [Spaceship.name_spaceship_gui_root].spaceship_index.child_names()[1] gets spaceship index + local title_frame = title_table.add{type="frame", name=spaceship.index, + caption = {"space-exploration.simple-a-b", "[img=virtual-signal/se-spaceship] ", {"space-exploration.simple-a-b", {"space-exploration.spaceship"}, " "..spaceship.index}}, + style="informatron_title_frame"} + title_frame.style.right_padding = -5 + + local right_flow = title_table.add{type="flow", name="title_flow_right"} + --local close = right_flow.add{type="button", name=Lifesupport.name_window_close, caption="✖", style="informatron_close_button"} + local close = right_flow.add{type="sprite-button", name=Spaceship.name_window_close, sprite = "utility/close_white", style="informatron_close_button"} + close.style.width = 28 + close.style.height = 28 + + + --[[local title_flow = container.add{ type="flow", name="spaceship_index", direction="horizontal"} + -- NOTE: [Spaceship.name_spaceship_gui_root].spaceship_index.child_names()[1] gets spaceship index + local title = title_flow.add{ type="label", name=spaceship.index, caption={"space-exploration.spaceship"}, style="space_platform_title"} + ]] + + local name_flow = container.add{ type="flow", name="name-flow", direction="horizontal"} + local name_label = name_flow.add{ type = "label", name="show-name", caption={"space-exploration.spaceship-name-the", spaceship.name}, style="space_platform_title_short"} + local rename_button = name_flow.add{ type = "sprite-button", name="rename", sprite="utility/rename_icon_normal", + tooltip={"space-exploration.rename-something", {"entity-name.se-spaceship-console"}}, style="space_platform_sprite_button_small"} + + + local bar = container.add{ type="progressbar", name="launch_energy_progress", size = 300, value=0, style="spaceship_progressbar_energy"} + bar.style.horizontally_stretchable = true + local label = container.add{ type="label", name="launch_energy", caption={"space-exploration.spaceship-launch-energy", ""}} + label.style.top_margin = -26 + label.style.left_margin = 5 + label.style.font = "default-bold" + label.style.font_color = {} + + local bar = container.add{ type="progressbar", name="streamline_progress", size = 300, value=0, style="spaceship_progressbar_streamline"} + bar.style.horizontally_stretchable = true + local label = container.add{ type="label", name="streamline", caption={"space-exploration.spaceship-streamline", ""}} + label.style.top_margin = -26 + label.style.left_margin = 5 + label.style.font = "default-bold" + label.style.font_color = {} + + local bar = container.add{ type="progressbar", name="structural_integrity_progress", size = 300, value=0, style="spaceship_progressbar_integrity"} + bar.style.horizontally_stretchable = true + local label = container.add{ type="label", name="structural_integrity", caption={"space-exploration.spaceship-structural-stress-hull", ""}} + label.style.top_margin = -26 + label.style.left_margin = 5 + label.style.font = "default-bold" + label.style.font_color = {} + + local bar = container.add{ type="progressbar", name="container_integrity_progress", size = 300, value=0, style="spaceship_progressbar_integrity"} + bar.style.horizontally_stretchable = true + local label = container.add{ type="label", name="container_integrity", caption={"space-exploration.spaceship-structural-stress-container"}} + label.style.top_margin = -26 + label.style.left_margin = 5 + label.style.font = "default-bold" + label.style.font_color = {} + + + container.add{ type="button", name="start-integrity-check", caption={"space-exploration.spaceship-button-start-integrity-check"}} + + local integrity_status = container.add{ type="label", name="integrity-status", caption=""} + integrity_status.style.width = 300 + integrity_status.style.single_line = false + + local space_distortion = container.add{ type="label", name="anomaly-distance", caption=""} + space_distortion.style.width = 300 + space_distortion.style.single_line = false + + local stellar_x = container.add{ type="label", name="stellar-x", caption=""} + stellar_x.style.width = 300 + stellar_x.style.single_line = false + + local stellar_y = container.add{ type="label", name="stellar-y", caption=""} + stellar_y.style.width = 300 + stellar_y.style.single_line = false + + local star_gravity = container.add{ type="label", name="star-gravity", caption=""} + star_gravity.style.width = 300 + star_gravity.style.single_line = false + + local planet_gravity = container.add{ type="label", name="planet-gravity", caption=""} + planet_gravity.style.width = 300 + planet_gravity.style.single_line = false + + --local current_speed = container.add{ type="label", name="current-speed", caption="Speed: "} + --current_speed.style.width = 300 + --current_speed.style.single_line = false + + local closest_location = container.add{ type="label", name="closest-location", caption=""} + closest_location.style.width = 300 + closest_location.style.single_line = false + + container.add{ type="label", name="destination-label", caption={"space-exploration.spaceship-heading-destination"}, style="space_platform_title"} + + container.add{type="checkbox", name="list-zones-alphabetical", caption={"space-exploration.list-destinations-alphabetically"}, state=playerdata.zones_alphabetical and true or false} + + local filter_container = container.add{ type="flow", name="filter_flow", direction="horizontal"} + local filter_field = filter_container.add{ type="textfield", name="filter_list"} + filter_field.style.width = 275 + local filter_button = filter_container.add{ type = "sprite-button", name="clear_filter", sprite="utility/search_icon", tooltip={"space-exploration.clear-filter"},} + filter_button.style.left_margin = 5 + filter_button.style.width = 28 + filter_button.style.height = 28 + + local destination_zone = Spaceship.get_destination_zone(spaceship) + if not destination_zone then destination_zone = Zone.from_zone_index(spaceship.zone_index) end + if not destination_zone then destination_zone = Zone.find_nearest_zone( + spaceship.space_distortion, + spaceship.stellar_position, + spaceship.star_gravity_well, + spaceship.planet_gravity_well) + end + local list, selected_index, values = Zone.dropdown_list_zone_destinations(spaceship.force_name, destination_zone, playerdata.zones_alphabetical) + local zones_dropdown = container.add{ type="drop-down", name="spaceship-list-zones", items=list, selected_index=selected_index} + zones_dropdown.style.horizontally_stretchable = true + player_set_dropdown_values(player, "spaceship-list-zones", values) + + container.add{ type="label", name="travel-time", caption=""} + + local travel_status = container.add{ type="label", name="travel-status", caption=""} + travel_status.style.width = 300 + travel_status.style.single_line = false + + spaceship.distance_to_destination = Spaceship.get_distance_to_destination(spaceship) + + container.add{ type="flow", name="action-flow", direction="horizontal"} + + container.add{ type="flow", name="back-flow", direction="horizontal"} + + Spaceship.gui_update(player) + +end + +function Spaceship.on_gui_opened(event) + local player = game.players[event.player_index] + if event.entity and event.entity.valid and event.entity.name == Spaceship.name_spaceship_console then + Spaceship.gui_open(player, Spaceship.from_entity(event.entity)) + player.opened = nil + else + -- the trick here is opeining the craft menu to cancel the other menu, then exiting the craft menu + -- means that pressing e exits the custom gui + if player.opened_gui_type and player.opened_gui_type ~= defines.gui_type.none then + if player.gui.left[Spaceship.name_spaceship_gui_root] then + if player.opened_self then + player.opened = nil + end + Spaceship.gui_close(player) + end + end + end +end +Event.addListener(defines.events.on_gui_opened, Spaceship.on_gui_opened) + + +function Spaceship.get_make_console_output(console) + if not (console and console.valid) then return end + local output_position = util.vectors_add(console.position, Spaceship.console_output_offset) + local output = console.surface.find_entity(Spaceship.name_spaceship_console_output, output_position) + if output then + return output + end + local output_ghosts = console.surface.find_entities_filtered{ + ghost_name = Spaceship.name_spaceship_console_output, + position = output_position} + if output_ghosts[1] and output_ghosts[1].valid then + local collisions, output = output_ghosts[1].revive({}) + if output then + return output + end + end + output = console.surface.create_entity{ + name = Spaceship.name_spaceship_console_output, + position = util.vectors_add(console.position, Spaceship.console_output_offset), + force = console.force + } + return output +end + +function Spaceship.on_entity_created(event) + local entity + if event.entity and event.entity.valid then + entity = event.entity + end + if event.created_entity and event.created_entity.valid then + entity = event.created_entity + end + if not entity then return end + if entity.type == "entity-ghost" or entity.type == "tile-ghost" then return end + + local surface = entity.surface + + local spaceship = Spaceship.from_own_surface_index(entity.surface.index) + for _, name in pairs(Spaceship.names_engines) do + if entity.name == name then + if spaceship and spaceship.is_moving then + entity.active = true + Spaceship.find_own_surface_engines(spaceship) + else + entity.active = false + end + end + end + if entity.name == Spaceship.name_spaceship_console then + global.spaceships = global.spaceships or {} + local console = entity + + if spaceship then + if not (spaceship.console and spaceship.console.valid) then + spaceship.console = entity + spaceship.console_output = nil + + if event.player_index and game.players[event.player_index] then + Spaceship.gui_open(game.players[event.player_index], spaceship) + end + + Spaceship.start_integrity_check(spaceship, 0.1) + end + else + local zone = Zone.from_surface(entity.surface) + if not zone then + entity.surface.create_entity{ + name = "item-on-ground", + position = entity.position, + ["item-entity"] = {name = Spaceship.name_spaceship_console, count = 1} + } + entity.destroy() + game.print({"space-exploration.construction-denied-se-surface"}) + return + end + local fn = entity.force.name + + local spaceship_index = global.next_spaceship_index or 1 + global.next_spaceship_index = spaceship_index + 1 + + local available_names = {} + for _, name in pairs(Spaceship.names) do + local found = false + for _, spaceship in pairs(global.spaceships) do + if name == spaceship.name then + found = true + break + end + end + if not found then + table.insert(available_names, name) + end + end + + local name = "Spaceship " .. spaceship_index + if #available_names > 0 then + name = available_names[math.random(#available_names)] + end + + local spaceship = { + type = "spaceship", + index = spaceship_index, + valid = true, + force_name = fn, + unit_number = entity.unit_number, + console = entity, + name = name, + zone_index = zone.index, -- this is dynamic and can be nil + speed = 1, + destination_zone_index = zone.index, + space_distortion = Zone.get_space_distortion(zone), + stellar_position = Zone.get_stellar_position(zone), + star_gravity_well = Zone.get_star_gravity_well(zone), + planet_gravity_well = Zone.get_planet_gravity_well(zone), + near_stellar_object = Zone.get_stellar_object_from_child(zone), + } + global.spaceships[spaceship_index] = spaceship + + Spaceship.start_integrity_check(spaceship, 0.1) + + if event.player_index and game.players[event.player_index] then + Spaceship.gui_open(game.players[event.player_index], spaceship) + end + end + end + if entity.name == Spaceship.name_spaceship_clamp_place then + -- find spaceship at tile + + local direction = (entity.direction == defines.direction.east or entity.direction == defines.direction.west ) and defines.direction.west or defines.direction.east + + local check_positions = {} + if direction == defines.direction.west then + table.insert(check_positions, util.vectors_add(entity.position, {x=0, y=-1})) -- top right over + table.insert(check_positions, util.vectors_add(entity.position, {x=0, y=0})) -- bottom right behind + else + table.insert(check_positions, util.vectors_add(entity.position, {x=-1, y=-1})) -- top left over + table.insert(check_positions, util.vectors_add(entity.position, {x=-1, y=0})) -- bottom left behind + end + + local space_tiles = 0 + for _, pos in pairs(check_positions) do + if tile_is_space(surface.get_tile(pos)) then + space_tiles = space_tiles + 1 + Spaceship.flash_tile(surface, pos, {r=255,g=0,b=0, a = 0.25}, 10) + end + end + if space_tiles >= 1 then + cancel_entity_creation(entity, event.player_index, "Back cannot be on Empty space") + return + end + + local keep = entity.surface.create_entity{ + name = Spaceship.name_spaceship_clamp_keep, + position = entity.position, + force = entity.force, + direction = direction + } + entity.destroy() + keep.rotatable = false + + local id = Spaceship.find_unique_clamp_id(direction, keep.surface, keep) + local comb = keep.get_or_create_control_behavior() + if direction == defines.direction.west then + comb.set_signal(1, {signal={type="virtual", name=mod_prefix.."anchor-using-left-clamp"}, count=id}) + else + comb.set_signal(1, {signal={type="virtual", name=mod_prefix.."anchor-using-right-clamp"}, count=id}) + end + end + if spaceship then + Spaceship.check_integrity_stress(spaceship) + end +end +Event.addListener(defines.events.on_built_entity, Spaceship.on_entity_created) +Event.addListener(defines.events.on_robot_built_entity, Spaceship.on_entity_created) +Event.addListener(defines.events.script_raised_built, Spaceship.on_entity_created) +Event.addListener(defines.events.script_raised_revive, Spaceship.on_entity_created) + +function Spaceship.find_unique_clamp_id(direction, surface, exclude) + local entities = surface.find_entities_filtered{name=Spaceship.name_spaceship_clamp_keep} + local used_ids = {} + for _, entity in pairs(entities) do + if entity ~= exclude then + if entity.direction == direction then + local value = 0 + local comb = entity.get_or_create_control_behavior() + local signal = comb.get_signal(1) + if signal then value = signal.count end + used_ids[value] = value + end + end + end + local i = 1 + while used_ids[i] do + i = i + 1 + end + return i +end + +function Spaceship.validate_clamp_signal(entity) + -- make sure it still has the correct signal. + local value = 1 + local comb = entity.get_or_create_control_behavior() + local signal = comb.get_signal(1) + if signal then value = signal.count end + if entity.direction == defines.direction.west then + comb.set_signal(1, {signal={type="virtual", name=mod_prefix.."anchor-using-left-clamp"}, count=value}) + else + comb.set_signal(1, {signal={type="virtual", name=mod_prefix.."anchor-using-right-clamp"}, count=value}) + end +end + +function Spaceship.on_gui_closed(event) + if event.entity and event.entity.valid and event.entity.name == Spaceship.name_spaceship_clamp_keep then + Spaceship.validate_clamp_signal(event.entity) + end +end +Event.addListener(defines.events.on_gui_closed, Spaceship.on_gui_closed) + +function Spaceship.on_entity_settings_pasted(event) + if event.destination and event.destination .valid and event.destination .name == Spaceship.name_spaceship_clamp_keep then + Spaceship.validate_clamp_signal(event.destination) + end +end +Event.addListener(defines.events.on_entity_settings_pasted, Spaceship.on_entity_settings_pasted) + +function Spaceship.on_entity_damaged(event) + if event.cause and event.cause.valid and event.entity and event.entity.valid then + if Util.table_contains(Spaceship.all_targetables, event.entity.name) then + if Spaceship.obstacle_damage_multipliers[event.cause.type] then + event.entity.health = event.entity.health - event.final_damage_amount * (Spaceship.obstacle_damage_multipliers[event.cause.type] - 1) + end + end + end +end +Event.addListener(defines.events.on_entity_damaged, Spaceship.on_entity_damaged) + +function Spaceship.on_built_tile(event) + local surface = game.surfaces[event.surface_index] + if surface and string.find(surface.name, "spaceship-") then + local spaceship = Spaceship.from_own_surface_index(surface.index) + Spaceship.check_integrity_stress(spaceship) + Spaceship.start_integrity_check(spaceship) + end +end +Event.addListener(defines.events.on_player_built_tile, Spaceship.on_built_tile) +Event.addListener(defines.events.on_robot_built_tile, Spaceship.on_built_tile) + +function Spaceship.on_removed_tile(event) + local surface + if event.player_index and game.players[event.player_index] and game.players[event.player_index].connected then + surface = game.players[event.player_index].surface + end + if event.robot and event.robot.valid then + surface = event.robot.surface + end + if surface and string.find(surface.name, "spaceship-") then + local spaceship = Spaceship.from_own_surface_index(surface.index) + Spaceship.check_integrity_stress(spaceship) + Spaceship.start_integrity_check(spaceship) + end +end +Event.addListener(defines.events.on_robot_mined_tile, Spaceship.on_removed_tile) +Event.addListener(defines.events.on_player_mined_tile, Spaceship.on_removed_tile) + +function Spaceship.on_removed_entity(event) + if event.entity and event.entity.valid then + if event.entity.name == Spaceship.name_spaceship_console then + local outputs = event.entity.surface.find_entities_filtered{name = Spaceship.name_spaceship_console_output, area = util.position_to_area(event.entity.position, 2)} + for _, output in pairs(outputs) do + output.destroy() + end + elseif event.entity.surface and Util.table_contains(Spaceship.names_spaceship_bulkheads, event.entity.name) then + if string.find(event.entity.surface.name, "spaceship-") then + local spaceship = Spaceship.from_own_surface_index(event.entity.surface.index) + spaceship.speed = spaceship.speed * 0.9 + Spaceship.check_integrity_stress(spaceship) + Spaceship.start_integrity_check(spaceship) + end + end + end +end +Event.addListener(defines.events.on_entity_died, Spaceship.on_removed_entity) +Event.addListener(defines.events.on_robot_mined_entity, Spaceship.on_removed_entity) +Event.addListener(defines.events.on_player_mined_entity, Spaceship.on_removed_entity) +Event.addListener(defines.events.script_raised_destroy, Spaceship.on_removed_entity) + +function Spaceship.get_distance_to_destination(spaceship) + if (not spaceship.destination) or Spaceship.is_near_destination(spaceship) then + return 0 + end + + local target_zone = Spaceship.get_destination_zone(spaceship) + if target_zone then + + local destination_space_distorion = Zone.get_space_distortion(target_zone) + local destination_stellar_position = Zone.get_stellar_position(target_zone) + local destination_star_gravity_well = Zone.get_star_gravity_well(target_zone) + local destination_planet_gravity_well = Zone.get_planet_gravity_well(target_zone) + + local distortion_distance = 0 + local interstellar_distance = 0 + local star_gravity_distance = 0 + local planet_gravity_distance = 0 + + distortion_distance = math.abs(spaceship.space_distortion - destination_space_distorion) + + interstellar_distance = Util.vectors_delta_length(spaceship.stellar_position, destination_stellar_position) + --if distortion_distance == 1 then + if distortion_distance >= 1 or (spaceship.space_distortion == 1 and destination_space_distorion == 1) then + interstellar_distance = 0 + end + if interstellar_distance == 0 then + -- same solar system + star_gravity_distance = math.abs(spaceship.star_gravity_well - destination_star_gravity_well) + else + star_gravity_distance = spaceship.star_gravity_well + destination_star_gravity_well + end + + if star_gravity_distance == 0 then + -- same solar system + planet_gravity_distance = math.abs(spaceship.planet_gravity_well - destination_planet_gravity_well) + else + planet_gravity_distance = spaceship.planet_gravity_well + destination_planet_gravity_well + end + + return distortion_distance * Zone.travel_cost_space_distortion + + interstellar_distance * Zone.travel_cost_interstellar + + star_gravity_distance * Zone.travel_cost_star_gravity + + planet_gravity_distance * Zone.travel_cost_planet_gravity + + end + +end + +function Spaceship.find_own_surface_engines(spaceship) + spaceship.engines = nil + local surface = Spaceship.get_own_surface(spaceship) + if surface and spaceship.known_tiles and spaceship.known_bounds then + spaceship.engines = {} + local engines = surface.find_entities_filtered{name = Spaceship.names_engines} + for _, entity in pairs(engines) do + local efficiency = 0.95 + local box = entity.bounding_box + local x = math.floor((box.left_top.x + box.right_bottom.x)/2) + local y = math.floor(box.right_bottom.y) + local first_y = nil + if spaceship.known_tiles[x] then + for y = spaceship.known_bounds.right_bottom.y, spaceship.known_bounds.left_top.y, -1 do + if spaceship.known_tiles[x][y] + and (spaceship.known_tiles[x][y] == Spaceship.tile_status.floor_console_connected + or spaceship.known_tiles[x][y] == Spaceship.tile_status.bulkhead_console_connected) then + first_y = y + break + end + end + end + --if first_y then + -- Log.trace(y .. " vs " .. first_y) + --end + if first_y and first_y <= y then + efficiency = 1.2 + end + --Log.trace(efficiency) + table.insert(spaceship.engines, {entity = entity, efficiency = efficiency}) + end + end +end + + +function Spaceship.activate_engines(spaceship, probability) + if not spaceship.engines then + Spaceship.find_own_surface_engines(spaceship) + end + if spaceship.engines then + for _, engine in pairs(spaceship.engines) do + if engine.entity and engine.entity.valid then + engine.entity.active = true + else + spaceship.engines = nil + Spaceship.activate_engines(spaceship, probability) + return + end + end + end +end + +function Spaceship.deactivate_engines(spaceship, probability) + if not spaceship.engines then + Spaceship.find_own_surface_engines(spaceship) + end + if spaceship.engines then + for _, engine in pairs(spaceship.engines) do + if engine.entity and engine.entity.valid then + engine.entity.active = false + else + spaceship.engines = nil + Spaceship.deactivate_engines(spaceship, probability) + return + end + end + end +end + + +function Spaceship.add_as_particle(spaceship, entity, particle_template) + if spaceship and entity then + if not particle_template then particle_template = Spaceship.particles["rock-small"] end + spaceship.particles = spaceship.particles or {} + + local particle = table.deepcopy(particle_template) + particle.valid = true + particle.graphic = entity + table.insert(spaceship.particles, particle) + end +end + +function Spaceship.on_trigger_created_entity(event) + if event.entity and event.entity.valid and event.entity.name == mod_prefix.."trigger-movable-debris" then + local surface = event.entity.surface + local spaceship = Spaceship.from_own_surface_index(surface.index) + if spaceship then + local entities = surface.find_entities_filtered{type = "simple-entity", area = Util.position_to_area(event.entity.position, 0.5)} + for _, entity in pairs(entities) do + if string.find(entity.name, "meteor") then + Spaceship.add_as_particle(spaceship, entity, Spaceship.particles["rock-large"]) + else + Spaceship.add_as_particle(spaceship, entity, Spaceship.particles["rock-small"]) + end + end + end + end +end +Event.addListener(defines.events.on_trigger_created_entity, Spaceship.on_trigger_created_entity) + +function Spaceship.surface_tick(spaceship) + -- actions that apply to maintaining a spaceship surface + spaceship.speed = spaceship.speed or 0 + local surface = Spaceship.get_own_surface(spaceship) + if spaceship.speed > 1 then + surface.wind_orientation = 0.5 + end + + local speed_factor = spaceship.speed > 0 and math.pow(spaceship.speed / Spaceship.speed_taper, Spaceship.particle_speed_power) * Spaceship.speed_taper or 0 + surface.wind_speed = 0.01 + 0.005 * speed_factor + + if spaceship.particles then + for _, particle in pairs(spaceship.particles) do + if not (particle.graphic and particle.graphic.valid) then -- killed or mined + particle.valid = false + elseif particle.graphic.position.y > spaceship.known_bounds.right_bottom.y + Spaceship.particle_spawn_range + 32 then -- out of range + particle.valid = false + elseif particle.projectile and particle.projectile.valid == false then -- projectile was there but detonated + particle.valid = false + elseif particle.targetable and particle.targetable.valid == false then -- projectile detonated + particle.valid = false + end + + if not particle.valid then + if particle.graphic and particle.graphic.valid then + if particle.graphic.unit_number + and spaceship.particle_object_ids + and spaceship.particle_object_ids[particle.graphic.unit_number] + then + for _, id in pairs(spaceship.particle_object_ids[particle.graphic.unit_number]) do + rendering.destroy(id) + end + spaceship.particle_object_ids[particle.graphic.unit_number] = nil + end + particle.graphic.destroy() + particle.graphic = nil + end + if particle.projectile and particle.projectile.valid then + particle.projectile.destroy() + particle.projectile = nil + end + if particle.targetable and particle.targetable.valid then + particle.targetable.destroy() + particle.targetable = nil + end + spaceship.particles[_] = nil + + else -- particle is still valid + + local position = particle.graphic.position + position.y = position.y + particle.speed * speed_factor + + if spaceship.speed > 0.001 then + + particle.graphic.teleport(position) + + if particle.projectile then + --particle.projectile.teleport(position) + particle.projectile.speed = particle.speed * speed_factor + elseif particle.projectile_name then + particle.projectile = surface.create_entity{ + name = particle.projectile_name, + -- particle would overtake the rest if we didn't subtract the current vector + position = util.vectors_add(position, {x = 0, y = -particle.speed * speed_factor}), + speed = particle.speed * speed_factor, + target = {x = position.x, y = position.y + 100}, + force="enemy" + } + end + + if particle.targetable then + particle.targetable.teleport(position) + elseif particle.targetable_name then + particle.targetable = surface.create_entity{ + name = particle.targetable_name, + position = position, + target = {x = position.x, y = position.y + 100}, + force="enemy" + } + end + + if particle.targetable and particle.destroys_floor then + -- destroy floor + local x = math.floor(position.x) + local y = math.floor(position.y) + if spaceship.known_tiles[x] and spaceship.known_tiles[x][y] then + + spaceship.known_tiles[x][y] = nil + + local tile = surface.get_tile(x, y) + local tile_name = tile.name + if tile_name ~= name_space_tile then + + particle.targetable.damage(50, "neutral", "explosion") -- damage the particle + + local entities = surface.find_entities_filtered{ -- destroy entities on the floor + area = util.tile_to_area({x=x,y=y}, margin), + collision_mask = { + global.named_collision_masks.space_collision_layer, + "object-layer", + "resource-layer" + } + } + for _, entity in pairs(entities) do + if entity and entity.valid then entity.die() end + end + + surface.set_tiles( + {{name=name_space_tile, position = {x,y}}}, + false, -- corect tiles + true, -- remove_colliding_entities + true, -- remove_colliding_decoratives + true -- raise_event + ) + + if Util.table_contains(Spaceship.names_spaceship_floors, tile_name) then + -- make blueprint for the tile. + surface.create_entity{name = "tile-ghost", inner_name = tile_name, force = spaceship.force_name, position = {x=x,y=y}} + end + + Spaceship.start_integrity_check(spaceship) + + end + end + end + + else + if particle.projectile and particle.projectile.valid then + particle.projectile.destroy() + particle.projectile = nil + end + if particle.targetable and particle.targetable.valid then + particle.targetable.destroy() + particle.targetable = nil + end + end + + end + + end + end + +end + + +function Spaceship.set_light(spaceship, surface) + + -- expect 15 is the max, 10 + 5 planets but reduced start position + local light_percent = Zone.get_solar(spaceship) + + surface.freeze_daytime = true + + if light_percent >= 0.5 then + surface.daytime = 0.35 -- half light + surface.solar_power_multiplier = Zone.solar_multiplier * light_percent * 2 -- x2 compensate for half light + else + surface.daytime = 0.45 - 0.2 * light_percent + surface.solar_power_multiplier = Zone.solar_multiplier -- x2 compensate for half light max + -- light_percent of 1 would be 0.35 (half-light), + -- light_percent of 0 would be 0.45 (dark) + end + +end + +function Spaceship.move_to_destination(spaceship) + if not spaceship.destination then return end + + --Log.trace(game.tick .. " moving to destination.") + -- move away from current zone + if spaceship.near and not Spaceship.is_near_destination(spaceship) then + --Log.trace(game.tick .. "Leaving zone.") + spaceship.near = nil + -- close any scouting views + for _, player in pairs(game.connected_players) do + local playerdata = get_make_playerdata(player) + if playerdata.anchor_scouting_for_spaceship_index == spaceship.index then + Spaceship.stop_anchor_scouting(player) + player.print("Cannot anchor, spaceship has departed for a different destination.") + end + end + end + + local target_zone = Spaceship.get_destination_zone(spaceship) + if not target_zone then + spaceship.destination = nil + spaceship.travel_message = "No destination." + Log.trace("Spaceship destination invalid") + return + end + + local ship_surface = Spaceship.get_own_surface(spaceship) + + -- mid-flight validation + if not spaceship.tile_count or (game.tick % 60 == 0) then + spaceship.tile_count = ship_surface.count_tiles_filtered{name = Spaceship.names_spaceship_floors} + end + + if not spaceship.bulkhead_count or ((game.tick + 30) % 60 == 0) then + spaceship.bulkhead_count = ship_surface.count_entities_filtered{name = Spaceship.names_spaceship_bulkheads} + end + + local target_size = spaceship.tile_count - spaceship.bulkhead_count / 2 + local mass_estimate = Spaceship.minimum_mass + target_size + if spaceship.integrity_stress then + -- not using container stress was a bug, but now that it is being fixed... + -- mostly use integrity stress, but do allow 25% benefit for a compact container ship + mass_estimate = Util.lerp(mass_estimate, Spaceship.minimum_mass + spaceship.integrity_stress, 0.75) + end + + if spaceship.engines then + for _, engine_table in pairs(spaceship.engines) do + local engine = engine_table.entity + if engine and engine.valid then + if engine.active and engine.is_crafting() then + for _, engine_proto in pairs(Spaceship.engines) do + if engine.name == engine_proto.name then + spaceship.speed = spaceship.speed + + (spaceship.speed_multiplier or 1) * engine_table.efficiency * engine_proto.thrust + * math.min(1, engine.energy / engine_proto.max_energy) / mass_estimate + * (Spaceship.speed_taper / (Spaceship.speed_taper + spaceship.speed)) + end + end + end + else + spaceship.engines[_] = nil + end + end + end + + -- space_drag from imperfect vacuum + -- streamline 0 = 110.45 + -- streamline 1 = 181.25 + local drag = Spaceship.space_drag * (2 - (spaceship.streamline or 0)) + spaceship.speed = spaceship.speed * (1 - drag) + Spaceship.minimum_impulse + spaceship.max_speed = math.max(spaceship.speed, spaceship.max_speed or 0) + + -- floating characters + if remote.interfaces["jetpack"] and remote.interfaces["jetpack"]["get_jetpacks"] then + local jetpacks = remote.call("jetpack", "get_jetpacks", {surface_index = spaceship.own_surface_index}) + for _, jetpack in pairs(jetpacks) do + jetpack.velocity.y = jetpack.velocity.y + + 0.000005 * math.pow(spaceship.speed / Spaceship.speed_taper, Spaceship.particle_speed_power) * Spaceship.speed_taper + if remote.interfaces["jetpack"]["set_velocity"] then + remote.call("jetpack", "set_velocity", {unit_number = jetpack.unit_number, velocity = jetpack.velocity}) + end + end + end + + -- spawn particles based on speed. + spaceship.particles = spaceship.particles or {} + + local function get_make_travel_anchor_particle( y, particle_template ) + local speed = particle_template.speed + if not (spaceship.travel_anchor_particles + and spaceship.travel_anchor_particles[speed] + and spaceship.travel_anchor_particles[speed].valid + and y + 10 > spaceship.travel_anchor_particles[speed].position.y) then + spaceship.travel_anchor_particles = spaceship.travel_anchor_particles or {} + spaceship.travel_anchor_particles[speed] = ship_surface.create_entity({ + name = mod_prefix .. "spaceship-travel-anchor", + position = { + x = spaceship.known_bounds.left_top.x - Spaceship.particle_spawn_range, + y = spaceship.known_bounds.left_top.y - Spaceship.particle_spawn_range - 10 - 10 + } + }) + Spaceship.add_as_particle(spaceship, spaceship.travel_anchor_particles[speed], + { speed = speed }) + end + return spaceship.travel_anchor_particles[speed] + end + local function spawn_particles_speed_size(particle_template) + if spaceship.speed > (particle_template.min_speed or 0) + and spaceship.integrity_stress > (particle_template.min_size or 0) then + + local spawn_particles_quota = target_size * spaceship.speed / 60 * particle_template.multiplier + local spawn_particles_whole = math.floor(spawn_particles_quota) + local spawn_particles_chance = spawn_particles_quota - spawn_particles_whole + if math.random() <= spawn_particles_chance then + spawn_particles_whole = spawn_particles_whole + 1 + end + + if spawn_particles_whole > 0 then + local x_min = spaceship.known_bounds.left_top.x - Spaceship.particle_spawn_range + local x_max = spaceship.known_bounds.right_bottom.x + Spaceship.particle_spawn_range + local spawn_y = spaceship.known_bounds.left_top.y - Spaceship.particle_spawn_range - 10 + + for i = 1, spawn_particles_whole do + local spawn_x = x_min + math.random() * (x_max - x_min) + if particle_template.sprite_name then + local travel_anchor_particle = get_make_travel_anchor_particle(spawn_y, particle_template) + local object_id = rendering.draw_sprite({ + surface = ship_surface, + sprite = particle_template.sprite_name, + target = travel_anchor_particle, + target_offset = { + x = spawn_x - travel_anchor_particle.position.x, + y = spawn_y - travel_anchor_particle.position.y + } + }) + spaceship.particle_object_ids = spaceship.particle_object_ids or {} + spaceship.particle_object_ids[travel_anchor_particle.unit_number] = spaceship.particle_object_ids[travel_anchor_particle.unit_number] or {} + table.insert(spaceship.particle_object_ids[travel_anchor_particle.unit_number], object_id) + else + local particle = table.deepcopy(particle_template) + particle.valid = true + particle.graphic = ship_surface.create_entity{ + name = particle_template.graphic_name, + position = {x = spawn_x, y = spawn_y}, + } + table.insert(spaceship.particles, particle) + end + end + end + end + end + for _, particle_template in pairs(Spaceship.particles) do + spawn_particles_speed_size(particle_template) + end + + -- step towards destination + local travel_speed = spaceship.speed * Spaceship.travel_speed_multiplier + local destination_space_distorion = Zone.get_space_distortion(target_zone) + local destination_stellar_position = Zone.get_stellar_position(target_zone) + local destination_star_gravity_well = Zone.get_star_gravity_well(target_zone) + local destination_planet_gravity_well = Zone.get_planet_gravity_well(target_zone) + + if destination_space_distorion > 0 then -- target is anomaly (or spaceship) + if spaceship.planet_gravity_well > 0 then + spaceship.planet_gravity_well = math.max(0, spaceship.planet_gravity_well - travel_speed / Zone.travel_cost_planet_gravity) + spaceship.travel_message = {"space-exploration.spaceship-travel-message-exiting-planet-gravity"} + elseif spaceship.star_gravity_well > 0 then + spaceship.star_gravity_well = math.max(0, spaceship.star_gravity_well - travel_speed / Zone.travel_cost_star_gravity) + spaceship.travel_message = {"space-exploration.spaceship-travel-message-exiting-star-gravity"} + else -- can enter distortion + spaceship.near_stellar_object = nil + local delta_space_distortion = destination_space_distorion - spaceship.space_distortion + if delta_space_distortion == 0 then + spaceship.near = table.deepcopy(spaceship.destination) + spaceship.stopped = true + else + local space_distortion_travel = travel_speed / Zone.travel_cost_space_distortion + -- step towards destination + spaceship.space_distortion = spaceship.space_distortion + + math.min(math.max(delta_space_distortion, -space_distortion_travel), space_distortion_travel) + spaceship.travel_message = {"space-exploration.spaceship-travel-message-spatial-distortions"} + end + end + elseif spaceship.space_distortion == 1 then + spaceship.stellar_position = table.deepcopy(destination_stellar_position) + spaceship.space_distortion = 1 - travel_speed / Zone.travel_cost_space_distortion + spaceship.travel_message = {"space-exploration.spaceship-travel-message-spatial-distortions"} + elseif spaceship.space_distortion > 0 then + spaceship.space_distortion = spaceship.space_distortion - travel_speed / Zone.travel_cost_space_distortion + spaceship.travel_message = {"space-exploration.spaceship-travel-message-spatial-distortions"} + else -- conventional travel + local interstellar_distance = Util.vectors_delta_length(spaceship.stellar_position, destination_stellar_position) + if interstellar_distance == 0 then -- same system + spaceship.near_star = Zone.get_star_from_child(target_zone) or Zone.get_star_from_position(target_zone) + spaceship.near_stellar_object = Zone.get_stellar_object_from_child(target_zone) or Zone.get_stellar_object_from_position(target_zone) + if spaceship.star_gravity_well == destination_star_gravity_well then -- same planet system + if spaceship.planet_gravity_well == destination_planet_gravity_well then -- we're here + spaceship.near = table.deepcopy(spaceship.destination) + spaceship.stopped = true + else + local delta_planet_gravity = destination_planet_gravity_well - spaceship.planet_gravity_well + local planet_gravity_travel = travel_speed / Zone.travel_cost_planet_gravity + spaceship.planet_gravity_well = spaceship.planet_gravity_well + + math.min(math.max(delta_planet_gravity, -planet_gravity_travel), planet_gravity_travel) + spaceship.travel_message = {"space-exploration.spaceship-travel-message-navigating-planet-gravity"} + end + else + if spaceship.planet_gravity_well > 0 then + spaceship.planet_gravity_well = math.max(0, spaceship.planet_gravity_well - travel_speed / Zone.travel_cost_planet_gravity) + spaceship.travel_message = {"space-exploration.spaceship-travel-message-exiting-planet-gravity"} + else + local delta_star_gravity = destination_star_gravity_well - spaceship.star_gravity_well + local star_gravity_travel = travel_speed / Zone.travel_cost_star_gravity + spaceship.star_gravity_well = spaceship.star_gravity_well + + math.min(math.max(delta_star_gravity, -star_gravity_travel), star_gravity_travel) + spaceship.travel_message = {"space-exploration.spaceship-travel-message-navigating-star-gravity"} + end + end + else -- different systems + if spaceship.planet_gravity_well > 0 then + spaceship.planet_gravity_well = math.max(0, spaceship.planet_gravity_well - travel_speed / Zone.travel_cost_planet_gravity) + spaceship.travel_message = {"space-exploration.spaceship-travel-message-exiting-planet-gravity"} + elseif spaceship.star_gravity_well > 0 then + spaceship.star_gravity_well = math.max(0, spaceship.star_gravity_well - travel_speed / Zone.travel_cost_star_gravity) + spaceship.travel_message = {"space-exploration.spaceship-travel-message-exiting-star-gravity"} + else + spaceship.near_stellar_object = nil + spaceship.stellar_position = Util.move_to(spaceship.stellar_position, destination_stellar_position, + travel_speed / Zone.travel_cost_interstellar) + spaceship.travel_message = {"space-exploration.spaceship-travel-message-navigating-interstellar"} + end + end + end + + Spaceship.set_light(spaceship, ship_surface) + +end + + +function Spaceship.spaceship_tick(spaceship) + if not spaceship.console and spaceship.console.valid then + spaceship.check_message= {"space-exploration.spaceship-check-message-no-console"} + spaceship.integrity_valid = false + end + -- Pause inserters, workaround for https://forums.factorio.com/viewtopic.php?f=58&t=89035 + -- Note: production machines should NOT be included as some are supposed to be disabled on specific surfaces. + if spaceship.entities_to_restore and spaceship.entities_to_restore_tick < game.tick then + for _, storedState in pairs(spaceship.entities_to_restore) do + if storedState.entity and storedState.entity.valid then + storedState.entity.active = storedState.active + end + end + spaceship.entities_to_restore = nil + end + + if spaceship.own_surface_index or (spaceship.console and spaceship.console.valid) then + -- integrity check + if spaceship.is_doing_check then + if spaceship.own_surface_index and spaceship.known_floor_tiles then + -- need to tick faster on bigger ships + for i = 0, math.ceil(spaceship.known_floor_tiles / 1000) do + -- tick once for each 1000 tiles + if spaceship.is_doing_check then + Spaceship.integrity_check_tick(spaceship) + end + end + else + Spaceship.integrity_check_tick(spaceship) + end + elseif game.tick % (Spaceship.integrity_pulse_interval) == 0 and spaceship.console and spaceship.console.valid and spaceship.console.energy > 0 then + Spaceship.start_integrity_check(spaceship) + end + + if spaceship.console and spaceship.console.valid and (game.tick % 60) == 0 then + -- read signals + local red = spaceship.console.get_circuit_network(defines.wire_type.red) + local green = spaceship.console.get_circuit_network(defines.wire_type.green) + + -- set speed + spaceship.target_speed = nil + local signal_target_speed = util.signal_from_wires(red, green, Spaceship.signal_for_speed) + if signal_target_speed > 0 then + spaceship.target_speed = signal_target_speed + 0.5 + elseif signal_target_speed < 0 then + spaceship.stopped = true + spaceship.target_speed = nil + end + -- 0 means no change + + -- set destination + for signal_name, type in pairs(Zone.signal_to_zone_type) do + local value = util.signal_from_wires(red, green, {type = "virtual", name = signal_name}) + if value > 0 then + local zone = Zone.from_zone_index(value) + if zone and zone.type == type then + if Zone.is_visible_to_force(zone, spaceship.force_name) or global.debug_view_all_zones then + if (not spaceship.destination) or (spaceship.destination.type == "zone" and spaceship.destination.index ~= value) then + spaceship.destination = { type = "zone", index = value } + Spaceship.update_output_combinator(spaceship) + end + break + end + end + end + end + -- TODO: allow spacwhip as destination + + -- launch + if not spaceship.own_surface_index then + if (red and red.get_signal(Spaceship.signal_for_launch) > 0) + or (green and green.get_signal(Spaceship.signal_for_launch) > 0) then + spaceship.is_launching = true + spaceship.is_landing = false + Spaceship.start_integrity_check(spaceship) + end + end + + if spaceship.own_surface_index + and spaceship.destination + and spaceship.destination.type == "zone" + and Spaceship.is_near_destination(spaceship) then + local using_left = util.signal_from_wires(red, green, Spaceship.signal_for_anchor_using_left) + local to_right = util.signal_from_wires(red, green, Spaceship.signal_for_anchor_to_right) + local using_right = util.signal_from_wires(red, green, Spaceship.signal_for_anchor_using_right) + local to_left = util.signal_from_wires(red, green, Spaceship.signal_for_anchor_to_left) + + if (using_left ~= 0 and to_right ~= 0) or (using_right ~= 0 and to_left ~= 0) then + local spaceship_surface = spaceship.console.surface + local destination_surface = Zone.get_surface(Zone.from_zone_index(spaceship.destination.index)) + if destination_surface then + local spaceship_clamps = spaceship_surface.find_entities_filtered{name=Spaceship.name_spaceship_clamp_keep} + local destination_clamps = destination_surface.find_entities_filtered{name=Spaceship.name_spaceship_clamp_keep} + if using_left ~= 0 and to_right ~= 0 then + local spaceship_clamp + for _, s_clamp in pairs(spaceship_clamps) do + if s_clamp.direction == defines.direction.west then + local comb = s_clamp.get_or_create_control_behavior() + local signal = comb.get_signal(1) + if signal and signal.count == using_left then + spaceship_clamp = s_clamp + break + end + end + end + local destination_clamp + if spaceship_clamp then + for _, d_clamp in pairs(destination_clamps) do + if d_clamp.direction == defines.direction.east then + local comb = d_clamp.get_or_create_control_behavior() + local signal = comb.get_signal(1) + if signal and signal.count == to_right then + destination_clamp = d_clamp + break + end + end + end + end + if destination_clamp and spaceship_clamp then + -- try to land based on the relative offsets + local position = { + x = -1 * spaceship_clamp.position.x + 2, + y = -1 * spaceship_clamp.position.y + } + position = util.vectors_add(position, destination_clamp.position) + + Spaceship.land_at_position(spaceship, position, true) + return --? + end + end + if using_right ~= 0 and to_left ~= 0 then + local spaceship_clamp + for _, s_clamp in pairs(spaceship_clamps) do + if s_clamp.direction == defines.direction.east then + local comb = s_clamp.get_or_create_control_behavior() + local signal = comb.get_signal(1) + if signal and signal.count == using_right then + spaceship_clamp = s_clamp + break + end + end + end + local destination_clamp + if spaceship_clamp then + for _, d_clamp in pairs(destination_clamps) do + if d_clamp.direction == defines.direction.west then + local comb = d_clamp.get_or_create_control_behavior() + local signal = comb.get_signal(1) + if signal and signal.count == to_left then + destination_clamp = d_clamp + break + end + end + end + end + if destination_clamp and spaceship_clamp then + -- try to land based on the relative offsets + local position = { + x = -1 * spaceship_clamp.position.x - 2, + y = -1 * spaceship_clamp.position.y + } + position = util.vectors_add(position, destination_clamp.position) + + Spaceship.land_at_position(spaceship, position, true) + return --? + end + end + end + end + end + + end + + if spaceship.own_surface_index then + -- space upkeep + Spaceship.surface_tick(spaceship) + + if spaceship.target_speed and spaceship.is_moving == false and spaceship.stopped then + spaceship.stopped = false + end + + -- navigation + if spaceship.integrity_valid + and spaceship.destination + and not spaceship.stopped + and not Spaceship.is_near_destination(spaceship) then + -- wants to move and can move + if not spaceship.is_moving then + spaceship.is_moving = true + Spaceship.activate_engines(spaceship) + Spaceship.start_integrity_check(spaceship) + end + + if (game.tick % 6) == 0 then + if spaceship.target_speed and spaceship.is_moving and spaceship.engines then + if spaceship.speed > spaceship.target_speed then + for _, engine in pairs(spaceship.engines) do + if engine.entity.valid and math.random() < 1/table_size(spaceship.engines) then + Log.trace("slow") + engine.entity.active = false + end + end + else + for _, engine in pairs(spaceship.engines) do + if engine.entity.valid and math.random() < 1/table_size(spaceship.engines) then + engine.entity.active = true + end + end + end + end + end + + Spaceship.move_to_destination(spaceship) + else + -- can't move + if spaceship.is_moving then + spaceship.is_moving = false + Spaceship.deactivate_engines(spaceship) + end + if Spaceship.is_near_destination(spaceship) then + spaceship.speed = 0 + spaceship.travel_message = {"space-exploration.spaceship-travel-message-at-destination"} + end + if spaceship.speed > 1 then + spaceship.speed = spaceship.speed * (1 - Spaceship.space_drag) + elseif spaceship.speed > 0 then + spaceship.speed = 0 + end + end + end + + + else + Spaceship.destroy(spaceship) + return + end + + if game.tick % 60 == 0 then + Spaceship.update_output_combinator(spaceship) + end + +end + +function Spaceship.update_output_combinator(spaceship) + + if not spaceship.console and spaceship.console.valid then return end + if not (spaceship.console_output and spaceship.console_output.valid) then + spaceship.console_output = Spaceship.get_make_console_output(spaceship.console) + end + if spaceship.console_output and spaceship.console_output.valid then + local ctrl = spaceship.console_output.get_or_create_control_behavior() + + local slot = 1 + -- Spaceship ID + ctrl.set_signal(slot, {signal=Spaceship.signal_for_own_spaceship_id, count=spaceship.index}) + slot = slot + 1 + -- Speed + if spaceship.is_moving and spaceship.speed > 0 then + ctrl.set_signal(slot, {signal=Spaceship.signal_for_speed, count=math.max(1, spaceship.speed)}) + elseif spaceship.own_surface_index then + ctrl.set_signal(slot, {signal=Spaceship.signal_for_speed, count=-1}) -- stopped + else + ctrl.set_signal(slot, {signal=Spaceship.signal_for_speed, count=-2}) -- anchored + end + slot = slot + 1 + + -- Distance + if (not spaceship.distance_to_destination_tick) or spaceship.distance_to_destination_tick + 60 < game.tick then + spaceship.distance_to_destination = Spaceship.get_distance_to_destination(spaceship) + spaceship.distance_to_destination_tick = game.tick + end + + if spaceship.destination and Spaceship.is_near_destination(spaceship) then + ctrl.set_signal(slot, {signal=Spaceship.signal_for_distance, count=-1}) + elseif spaceship.destination and Spaceship.is_at_destination(spaceship) then + ctrl.set_signal(slot, {signal=Spaceship.signal_for_distance, count=-2}) + elseif spaceship.distance_to_destination and spaceship.distance_to_destination > 0 then + ctrl.set_signal(slot, {signal=Spaceship.signal_for_distance, count=math.max(1, spaceship.distance_to_destination)}) + else --no destination + ctrl.set_signal(slot, {signal=Spaceship.signal_for_distance, count=-3}) + end + slot = slot + 1 + + -- Destination + if spaceship.destination then + if spaceship.destination.type == "spaceship" then + ctrl.set_signal(slot, {signal=Spaceship.signal_for_destination_spaceship, count=spaceship.destination.index}) + elseif spaceship.destination.type == "zone" then + local zone = Spaceship.get_destination_zone(spaceship) + local signal_name = Zone.get_signal_name(zone) + ctrl.set_signal(slot, {signal={type="virtual", name=signal_name}, count=zone.index}) + else + ctrl.set_signal(slot, {signal=Spaceship.signal_for_destination_spaceship, count=0}) + end + else + ctrl.set_signal(slot, {signal=Spaceship.signal_for_destination_spaceship, count=0}) + end + slot = slot + 1 + + -- Anchor + if spaceship.zone_index then + ctrl.set_signal(slot, {signal={type = "virtual", name = "signal-A"}, count=spaceship.zone_index}) + else + ctrl.set_signal(slot, {signal={type = "virtual", name = "signal-A"}, count=0}) + end + slot = slot + 1 + + end + +end + + +function Spaceship.on_tick(event) + if global.spaceships then + for _, spaceship in pairs(global.spaceships) do + Spaceship.spaceship_tick(spaceship) + end + end + for _, player in pairs(game.connected_players) do + local playerdata = get_make_playerdata(player) + if playerdata and playerdata.anchor_scouting_for_spaceship_index then + Spaceship.anchor_scouting_tick(player, Spaceship.from_index(playerdata.anchor_scouting_for_spaceship_index)) + end + Spaceship.gui_update(player) + end +end +Event.addListener(defines.events.on_tick, Spaceship.on_tick) + +--[[ +function Spaceship.on_chunk_generated(event) + local area = event.area + local surface = event.surface + local spaceship = Spaceship.from_own_surface_index(surface.index) + if spaceship then + area.right_bottom.x = area.right_bottom.x + 0.99 + area.right_bottom.y = area.right_bottom.y + 0.99 + entities = surface.find_entities_filtered{ + area = area + } + for _, entity in pairs(entities) do -- rocks + entity.destroy() + end + local bad_tiles = surface.find_tiles_filtered{name={name_asteroid_tile, "out-of-map"}} + local set_tiles = {} + for _, tile in pairs(bad_tiles) do + table.insert(set_tiles, {position = tile.position, name=name_space_tile}) + surface.set_hidden_tile(tile.position, name_space_tile) + end + surface.set_tiles(set_tiles) + end +end +Event.addListener(defines.events.on_chunk_generated, Spaceship.on_chunk_generated) +]]-- + +function Spaceship.flash_tile(surface, position, color, time) + local a = (color.a or 1) + rendering.draw_rectangle{ + color = {r = color.r * a, g = color.g * a, b = color.b * a, a = a}, + filled = true, + left_top = position, + right_bottom = {(position.x or position[1])+1, (position.y or position[2])+1}, + surface = surface, + time_to_live = time + } +end + +function Spaceship.calculate_integrity_stress(spaceship, area) + + -- use all tiles + local surface = Spaceship.get_own_surface(spaceship) + if not surface then surface = spaceship.console.surface end + + if not area then --- whole surface + spaceship.tile_count = surface.count_tiles_filtered{name = Spaceship.names_spaceship_floors} + spaceship.wall_count = surface.count_entities_filtered{name = Spaceship.names_spaceship_walls} + else + spaceship.tile_count = spaceship.known_floor_tiles + spaceship.known_bulkhead_tiles + spaceship.wall_count = 0 + local walls = surface.find_entities_filtered{name = Spaceship.names_spaceship_walls} + for _, wall in pairs(walls) do + local tile_pos = Util.position_to_tile(wall.position) + if spaceship.known_tiles[tile_pos.x] and spaceship.known_tiles[tile_pos.x][tile_pos.y] == Spaceship.tile_status.bulkhead_console_connected then + spaceship.wall_count = spaceship.wall_count + 1 + end + end + end + + spaceship.container_slot_count = 0 + + local containers = surface.find_entities_filtered{ type = {"container", "logistic-container", "car", "spider-vehicle"}, area = area} + + for _, container in pairs(containers) do + local tile_pos = Util.position_to_tile(container.position) + if area == nil or (spaceship.known_tiles[tile_pos.x] and spaceship.known_tiles[tile_pos.x][tile_pos.y] == Spaceship.tile_status.floor_console_connected) then + if container.type == "car" or container.type == "spider-vehicle" then + spaceship.container_slot_count = spaceship.container_slot_count + container.prototype.get_inventory_size(defines.inventory.car_trunk) + else + spaceship.container_slot_count = spaceship.container_slot_count + container.prototype.get_inventory_size(defines.inventory.chest) + end + end + end + + spaceship.container_fluid_capacity = 0 + + local containers = surface.find_entities_filtered{type = {"storage-tank"}} + for _, container in pairs(containers) do + local mult = string.find(container.name, "booster", 1, true) and 0.5 or 1 + local tile_pos = Util.position_to_tile(container.position) + if area == nil or (spaceship.known_tiles[tile_pos.x] and spaceship.known_tiles[tile_pos.x][tile_pos.y] == Spaceship.tile_status.floor_console_connected) then + if container.fluidbox and #container.fluidbox > 0 then + local i = 1 + for i = 1, #container.fluidbox do + spaceship.container_fluid_capacity = spaceship.container_fluid_capacity + mult * container.fluidbox.get_capacity(i) + end + end + end + end + -- container slot is 0.5 or 24 for a normal container 4800 ish items. Cost is 24 + -- container can caryy 48 * 10 barrels = 24k fluid + -- storage tank is 5, 25k fluids = 250 effective items. Cost is 12.5 (50% discount) + -- booster tanks cost50% less + spaceship.integrity_stress_structure = spaceship.tile_count - spaceship.wall_count / 2 + spaceship.integrity_stress_container = spaceship.container_slot_count/2 + spaceship.container_fluid_capacity / 2000 + spaceship.speed_multiplier = 1 + + if game.active_mods["Krastorio2"] then + local reactors = 0 + local entities = surface.find_entities_filtered{name = {"kr-antimatter-reactor"}} + for _, entity in pairs(entities) do + local tile_pos = Util.position_to_tile(entity.position) + if area == nil or (spaceship.known_tiles[tile_pos.x] and spaceship.known_tiles[tile_pos.x][tile_pos.y] == Spaceship.tile_status.floor_console_connected) then + reactors = reactors + 1 + spaceship.integrity_stress_structure = spaceship.integrity_stress_structure + 100 + spaceship.integrity_stress_container = spaceship.integrity_stress_container + 100 + end + end + if reactors > 0 then + spaceship.speed_multiplier = 0.5 + end + end + + -- linked-containers + local entities = surface.find_entities_filtered{type = {"linked-container"}} + for _, entity in pairs(entities) do + local tile_pos = Util.position_to_tile(entity.position) + if area == nil or (spaceship.known_tiles[tile_pos.x] and spaceship.known_tiles[tile_pos.x][tile_pos.y] == Spaceship.tile_status.floor_console_connected) then + spaceship.integrity_stress_container = spaceship.integrity_stress_container + 1000 + end + end + + spaceship.integrity_stress = math.max(spaceship.integrity_stress_structure, spaceship.integrity_stress_container) + if spaceship.integrity_stress > spaceship.integrity_limit then + spaceship.integrity_valid = false + spaceship.check_message = {"space-exploration.spaceship-check-message-failed-stress"} + end + +end + +function Spaceship.check_integrity_stress(spaceship) + spaceship.integrity_limit = Spaceship.get_integrity_limit(game.forces[spaceship.force_name]) + if spaceship.own_surface_index then + -- use all tiles + Spaceship.calculate_integrity_stress(spaceship, nil) -- whole area + elseif not (spaceship.console and spaceship.console.valid) then + spaceship.integrity_valid = false + spaceship.check_message= {"space-exploration.spaceship-check-message-no-console"} + elseif not spaceship.integrity_valid then + -- already invalid + elseif not spaceship.known_bounds then + spaceship.integrity_valid = false + spaceship.check_message= {"space-exploration.spaceship-check-message-failed-unknown-bounds"} + elseif spaceship.integrity_valid and spaceship.known_bounds and spaceship.known_tiles then + Spaceship.calculate_integrity_stress(spaceship, spaceship.known_bounds) -- limited area + + --[[ TODO: use improved know tiles approach + and spaceship.known_tile_count and spaceship.known_wall_count then + spaceship.integrity_stress = spaceship.known_tile_count - spaceship.known_wall_count / 2 + if spaceship.integrity_stress > spaceship.integrity_limit then + spaceship.integrity_valid = false + spaceship.check_message = "Fail: Structural integrity stress exceeds technology limit." + end + ]]-- + end + +end + +function Spaceship.start_integrity_check(spaceship, alpha) + if alpha then + spaceship.check_flash_alpha = alpha + end + spaceship.is_doing_check = true +end + +function Spaceship.stop_integrity_check(spaceship) + spaceship.check_flash_alpha = nil + spaceship.is_doing_check = nil + spaceship.check_stage = nil + spaceship.pending_tiles = nil + spaceship.streamline = nil + if spaceship.integrity_valid and spaceship.check_tiles then + -- success + spaceship.known_tiles = table.deepcopy(spaceship.check_tiles) + spaceship.check_tiles = nil + + -- get the average for surface transfer + local min_x = nil + local max_x = nil + local min_y = nil + local max_y = nil + local floor_tiles = 0 + local bulkhead_tiles = 0 + local front_tiles = {} -- x:y + for x, x_tiles in pairs(spaceship.known_tiles) do + if min_x == nil or x < min_x then min_x = x end + if max_x == nil or x > max_x then max_x = x end + for y, status in pairs(x_tiles) do + if status == Spaceship.tile_status.floor_console_connected + or status == Spaceship.tile_status.bulkhead_console_connected then + if min_y == nil or y < min_y then min_y = y end + if max_y == nil or y > max_y then max_y = y end + if status == Spaceship.tile_status.floor_console_connected then + floor_tiles = floor_tiles + 1 + else + bulkhead_tiles = bulkhead_tiles + 1 + end + if (not front_tiles[x]) or y < front_tiles[x] then + front_tiles[x] = y + end + end + end + end + max_x = max_x + 1 -- whole tile + max_y = max_y + 1 -- whole tile + spaceship.known_floor_tiles = floor_tiles + spaceship.known_bulkhead_tiles = bulkhead_tiles + spaceship.known_bounds = {left_top = {x = min_x, y = min_y}, right_bottom={x = max_x, y = max_y}} + spaceship.known_tiles_average_x = math.floor((min_x + max_x)/2) + spaceship.known_tiles_average_y = math.floor((min_y + max_y)/2) + local front_tiles_by_y = {} -- y:count + local front_tiles_by_y_left = {} -- y:count + local front_tiles_by_y_right = {} -- y:count + local max_flat = 0 + for x, y in pairs(front_tiles) do + front_tiles_by_y[y] = (front_tiles_by_y[y] or 0) + 1 + if front_tiles_by_y[y] > max_flat then + max_flat = front_tiles_by_y[y] + end + if x < spaceship.known_tiles_average_x then + front_tiles_by_y_left[y] = (front_tiles_by_y_left[y] or 0) + 1 + else + front_tiles_by_y_right[y] = (front_tiles_by_y_right[y] or 0) + 1 + end + end + local width = max_x - min_x + -- max_flat == width = 0 + -- max_flat == width / 3 = 1 + local streamline_flatness = math.min(1, (1 - (max_flat-2) / (width-2)) * 1.5) + local streamline_left = math.min(1, 2 * (table_size(front_tiles_by_y_left)-1) / (math.max(0.5, (width-1) / 2))) + local streamline_right = math.min(1, 2 * (table_size(front_tiles_by_y_right)-1) / (math.max(0.5, (width-1) / 2))) + spaceship.streamline = (streamline_flatness + streamline_left + streamline_right + + 3 * math.min(streamline_flatness, math.min(streamline_left, streamline_right))) / 6 + --spaceship.streamline = math.min(1, 3.5 * (table_size(front_tiles_by_y)-1) / width) + -- if it is symetrical then 1/2 would be max (excluding the -1) + -- use 1/3.5 as max so there can be a few flat areas + Log.trace("streamline flat "..streamline_flatness.." left "..streamline_left.." right "..streamline_right) + --Log.trace("streamline "..spaceship.streamline ) + if spaceship.own_surface_index then + Spaceship.find_own_surface_engines(spaceship) + end + else + spaceship.integrity_valid = false + spaceship.check_tiles = nil + spaceship.check_message = {"space-exploration.spaceship-check-message-failed-empty"} + end + + --spaceship.check_message = nil + if spaceship.console and spaceship.console.valid then + --spaceship.console.force.print("Spaceship integrity check complete.") + end + + Spaceship.check_integrity_stress(spaceship) + + if spaceship.is_launching then + Spaceship.launch(spaceship) + end +end + +function Spaceship.integrity_check_tick(spaceship) + if not(spaceship.console and spaceship.console.valid) then + spaceship.check_message= {"space-exploration.spaceship-check-message-no-console"} + spaceship.integrity_valid = false + Spaceship.stop_integrity_check(spaceship) + return + end + + local surface = spaceship.console.surface + if not (spaceship.check_stage and spaceship.check_tiles and spaceship.pending_tiles) then + local start_tile = surface.get_tile(spaceship.console.position) + if Spaceship.is_floor(start_tile.name) then + Spaceship.check_message = nil + Spaceship.is_doing_check = true + -- floor tiles is a 2d array x then y + spaceship.check_tiles = {} + spaceship.check_tiles[start_tile.position.x] = {} + spaceship.check_tiles[start_tile.position.x][start_tile.position.y] = Spaceship.tile_status.floor + spaceship.pending_tiles = {} + spaceship.pending_tiles[start_tile.position.x] = {} + spaceship.pending_tiles[start_tile.position.x][start_tile.position.y] = true + spaceship.check_stage = "floor-connectivity" + spaceship.check_message= {"space-exploration.spaceship-check-message-checking-console-floor"} + else + spaceship.check_message= {"space-exploration.spaceship-check-message-failed-console-floor"} + spaceship.integrity_valid = false + Spaceship.stop_integrity_check(spaceship) + return + end + end + if not (spaceship.check_tiles and spaceship.pending_tiles) then return end + + local alpha = spaceship.check_flash_alpha or 0.05 + + -- do a round of checking + -- check_tiles. List of tiles to check this tick. + + -- pending_tiles should always exists in check_tiles + -- it basically justs keeps a lst of which ones to search + + local next_pending_tiles = {} + local changed = false + + if spaceship.check_stage == "floor-connectivity" then + for x, x_tiles in pairs(spaceship.pending_tiles) do + for y, yes in pairs(x_tiles) do + if spaceship.check_tiles[x][y] == Spaceship.tile_status.floor + or spaceship.check_tiles[x][y] == Spaceship.tile_status.bulkhead then + for d = 1, 4 do -- 4 way direction + local cx = x + (d == 2 and 1 or (d == 4 and -1 or 0)) + local cy = y + (d == 1 and -1 or (d == 3 and 1 or 0)) + if not (spaceship.check_tiles[cx] and spaceship.check_tiles[cx][cy]) then -- unknown tile + changed = true + local tile = surface.get_tile({cx, cy}) + local wall_count = surface.count_entities_filtered{ + area = Util.position_to_area({x = cx + 0.5, y = cy + 0.5}, 0.4), + name = Spaceship.names_spaceship_bulkheads + } + if tile.valid and Spaceship.is_floor(tile.name) then + spaceship.check_tiles[cx] = spaceship.check_tiles[cx] or {} + if wall_count > 0 then + spaceship.check_tiles[cx][cy] = Spaceship.tile_status.bulkhead + Spaceship.flash_tile(surface, {cx, cy}, {r = 0, g = 0, b = 1, a = alpha}, 5) + else + spaceship.check_tiles[cx][cy] = Spaceship.tile_status.floor + Spaceship.flash_tile(surface, {cx, cy}, {r = 0, g = 1, b = 0, a = alpha}, 5) + end + next_pending_tiles[cx] = next_pending_tiles[cx] or {} + next_pending_tiles[cx][cy] = true + else + spaceship.check_tiles[cx] = spaceship.check_tiles[cx] or {} + if wall_count > 0 then + local clamps = surface.count_entities_filtered{ + area = Util.position_to_area({x = cx + 0.5, y = cy + 0.5}, 0.4), + name = Spaceship.name_spaceship_clamp_keep + } + if clamps > 0 then + -- if it is a clamp sticking out of the craft treat it as exterior, + -- otherwise it is treated as unstaeble bulkhead and takes damage + spaceship.check_tiles[cx][cy] = Spaceship.tile_status.exterior + Spaceship.flash_tile(surface, {cx, cy}, {r = 1, g = 0, b = 1, a = alpha}, 5) + else + spaceship.check_tiles[cx][cy] = Spaceship.tile_status.bulkhead_exterior + Spaceship.flash_tile(surface, {cx, cy}, {r = 1, g = 0, b = 0, a = alpha}, 5) + end + else + spaceship.check_tiles[cx][cy] = Spaceship.tile_status.exterior + Spaceship.flash_tile(surface, {cx, cy}, {r = 1, g = 0, b = 1, a = alpha}, 5) + end + end + end + end + end + end + end + if changed == false then + -- all connected tiles have been found + -- if in space and if moving detach disconnected tiles + if spaceship.is_moving then + local surface = Spaceship.get_own_surface(spaceship) + if surface then + local set_tiles = {} + local all_tiles = surface.find_tiles_filtered{name=Spaceship.names_spaceship_floors} + for _, tile in pairs(all_tiles) do + if not (spaceship.check_tiles[tile.position.x] and spaceship.check_tiles[tile.position.x][tile.position.y]) then + local stack = tile.prototype.items_to_place_this[1] + table.insert(set_tiles, {name = name_space_tile, position = tile.position, ghost_name = tile.name, stack = stack}) + Spaceship.flash_tile(surface, tile.position, {r = 1, g = 0, b = 0, a = alpha}, 120) + end + end + if #set_tiles > 0 then + surface.set_tiles(set_tiles) + for _, tile in pairs(set_tiles) do + if Util.table_contains(Spaceship.names_spaceship_floors, tile.ghost_name) then + surface.create_entity{name = "tile-ghost", inner_name = tile.ghost_name, force = spaceship.force_name, position=tile.position} + end + end + end + end + end + + changed = true + spaceship.check_stage = "containment" + spaceship.check_message = {"space-exploration.spaceship-check-message-checking-containment"} + for x, x_tiles in pairs(spaceship.check_tiles) do + for y, status in pairs(x_tiles) do + if status == Spaceship.tile_status.exterior + or status == Spaceship.tile_status.bulkhead_exterior then + next_pending_tiles[x] = next_pending_tiles[x] or {} + next_pending_tiles[x][y] = true + end + end + end + + end + elseif spaceship.check_stage == "containment" then + for x, x_tiles in pairs(spaceship.pending_tiles) do + for y, yes in pairs(x_tiles) do + if spaceship.check_tiles[x][y] == Spaceship.tile_status.exterior + or spaceship.check_tiles[x][y] == Spaceship.tile_status.bulkhead_exterior + or spaceship.check_tiles[x][y] == Spaceship.tile_status.floor_exterior then + for cx = x-1, x+1 do + for cy = y-1, y+1 do + if spaceship.check_tiles[cx] and spaceship.check_tiles[cx][cy] + and spaceship.check_tiles[cx][cy] == Spaceship.tile_status.floor then + spaceship.check_tiles[cx][cy] = Spaceship.tile_status.floor_exterior + changed = true + next_pending_tiles[cx] = next_pending_tiles[cx] or {} + next_pending_tiles[cx][cy] = true + Spaceship.flash_tile(surface, {cx, cy}, {r = 1, g = 1, b = 0, a = alpha}, 30) + end + end + end + end + end + end + if changed == false then + changed = true + -- convert non-exterior floor to interior + for x, x_tiles in pairs(spaceship.check_tiles) do + for y, status in pairs(x_tiles) do + if status == Spaceship.tile_status.floor then + spaceship.check_tiles[x][y] = Spaceship.tile_status.floor_interior + Spaceship.flash_tile(surface, {x, y}, {r = 0, g = 0, b = 1, a = alpha}, 5) + end + end + end + local console_tile_x = math.floor(spaceship.console.position.x) + local console_tile_y = math.floor(spaceship.console.position.y) + if spaceship.check_tiles and spaceship.check_tiles[console_tile_x] and spaceship.check_tiles[console_tile_x][console_tile_y] == Spaceship.tile_status.floor_interior then + spaceship.check_tiles[console_tile_x][console_tile_y] = Spaceship.tile_status.floor_console_connected + next_pending_tiles[console_tile_x] = {} + next_pending_tiles[console_tile_x][console_tile_y] = true + spaceship.check_stage = "console-connectivity" + spaceship.check_message = {"space-exploration.spaceship-check-message-checking-connectivity"} + else + for x, x_tiles in pairs(spaceship.check_tiles) do + for y, status in pairs(x_tiles) do + if status == Spaceship.tile_status.exterior + or status == Spaceship.tile_status.bulkhead_exterior then + Spaceship.flash_tile(surface, {x, y}, {r = 1, g = 0, b = 0, a = alpha}, 120) + end + end + end + spaceship.integrity_valid = false + spaceship.check_message = {"space-exploration.spaceship-check-message-failed-containment"} + return Spaceship.stop_integrity_check(spaceship) + end + end + elseif spaceship.check_stage == "console-connectivity" then + for x, x_tiles in pairs(spaceship.pending_tiles) do + for y, yes in pairs(x_tiles) do + if spaceship.check_tiles[x][y] == Spaceship.tile_status.floor_console_connected + or spaceship.check_tiles[x][y] == Spaceship.tile_status.bulkhead_console_connected then + + for d = 1, 4 do -- 4 way direction + local cx = x + (d == 2 and 1 or (d == 4 and -1 or 0)) + local cy = y + (d == 1 and -1 or (d == 3 and 1 or 0)) + if spaceship.check_tiles[cx] and spaceship.check_tiles[cx][cy] and + (spaceship.check_tiles[cx][cy] == Spaceship.tile_status.floor_interior + or spaceship.check_tiles[cx][cy] == Spaceship.tile_status.bulkhead) then + if spaceship.check_tiles[cx][cy] == Spaceship.tile_status.floor_interior then + spaceship.check_tiles[cx][cy] = Spaceship.tile_status.floor_console_connected + else + spaceship.check_tiles[cx][cy] = Spaceship.tile_status.bulkhead_console_connected + end + Spaceship.flash_tile(surface, {cx, cy}, {r = 0, g = 1, b = 1, a = alpha}, 5) + changed = true + next_pending_tiles[cx] = next_pending_tiles[cx] or {} + next_pending_tiles[cx][cy] = true + end + end + end + end + end + if changed == false then + -- completed the check + + spaceship.check_message = {"space-exploration.spaceship-check-message-passed"} + spaceship.integrity_valid = true + local set_tiles = {} + local reset = false + for x, x_tiles in pairs(spaceship.check_tiles) do + for y, status in pairs(x_tiles) do + if not (status == Spaceship.tile_status.floor_console_connected + or status == Spaceship.tile_status.bulkhead_console_connected + or status == Spaceship.tile_status.exterior) then + spaceship.check_message = {"space-exploration.spaceship-check-message-unstable"} + Spaceship.flash_tile(surface, {x, y}, {r = 1, g = 0, b = 0, a = alpha}, 120) + -- detatch + if spaceship.own_surface_index and spaceship.is_moving then + local support = 1 -- it will count self + for cx = x-1, x+1 do + for cy = y-1, y+1 do + if spaceship.check_tiles[cx] and spaceship.check_tiles[cx][cy] then + if spaceship.check_tiles[cx][cy] ~= Spaceship.tile_status.exterior then + support = support + 1 + if spaceship.check_tiles[cx][cy] == Spaceship.bulkhead_console_connected then + support = support + 2 + end + end + end + end + end + if support <= 6 then -- has a chance to be removed + reset = true + if support - math.random(2) <= 4 then + local entities = surface.find_entities({{x,y}, {x+1,y+1}}) + local remove = true + for _, entity in pairs(entities) do + if entity and entity.valid and entity.type ~= "character" and entity.health then + entity.damage(150, "neutral", "explosion") + remove = false + end + end + if remove then + local tile = surface.get_tile(x,y) + table.insert(set_tiles, {name = name_space_tile, ghost_name=tile.name, position = {x,y}}) + end + end + end + end + end + end + end + if #set_tiles > 0 then + spaceship.check_message = {"space-exploration.spaceship-check-message-valid-but-disconnecting"} + surface.print({"space-exploration.spaceship-warning-sections-disconnecting"}) + surface.set_tiles(set_tiles) + for _, tile in pairs(set_tiles) do + if Util.table_contains(Spaceship.names_spaceship_floors, tile.ghost_name) then + surface.create_entity{name = "tile-ghost", inner_name = tile.ghost_name, force = spaceship.force_name, position=tile.position} + end + end + end + + Spaceship.stop_integrity_check(spaceship) + + if reset then + Spaceship.start_integrity_check(spaceship) + return + else + Spaceship.get_launch_energy(spaceship) + return + end + end + + end + + if changed then + spaceship.pending_tiles = next_pending_tiles + else + spaceship.integrity_valid = false + spaceship.check_message = {"space-exploration.spaceship-check-message-did-not-complete"} + return Spaceship.stop_integrity_check(spaceship) + end +end + +function Spaceship.on_init(event) + global.spaceships = {} +end +Event.addListener("on_init", Spaceship.on_init, true) + +return Spaceship diff --git a/space-exploration_0.5.58/space-exploration/scripts/universe-raw.lua b/space-exploration_0.5.58/space-exploration/scripts/universe-raw.lua new file mode 100644 index 0000000..39f43b3 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/universe-raw.lua @@ -0,0 +1,931 @@ +--[[ +zone.controls = { + water = {frequency, size}, -- size is 0 to 6 + moisture = {frequency, bias},-- bias is +/- 0.5 + aux = {frequency, bias}, -- bias is +/- 0.5 + hot = {frequency, size}, -- size is 0 to 6 + cold = {frequency, size}, -- size is 0 to 6 + -other_controls = {frequency, size, richness}, -- size is 0 to 6, for resources and stuff +} +zone.climate_tags = {} +]]-- +-- climate presets + + + +-- raw universe data +local UniverseRaw = {} + +UniverseRaw.universe = { + stars = { + { + name = "Calidus", -- means hot, warm, brisk, prompt, impetuous, new + children = { + { name = "Nauvis", radius_multiplier = 0.5, children = {}} -- this is overwritten by map gen settings anyway + } + }, + {name="Astermore"}, + {name="Statarius"}, -- (Septem Statarius) Septem = seven. Statarius = stationary, standing, steady, calm, even-minded, sedate + {name="Nalara"}, + {name="Errioni"}, + {name="Kalmaia"}, + {name="Merlime"}, + {name="Halsian"}, + {name="Cordova"}, + {name="Alacrity"}, + {name="Auriel"}, + {name="Penthus"}, + {name="Angelus"}, + {name="Basilius"}, + {name="Auphorus"}, + {name="Pontus"}, + {name="Sargus"}, + {name="Rigelus"}, + {name="Tanius"}, + {name="Terebellus"}, + {name="Capellus"}, + {name="Hankorus"}, + {name="Brunnus"}, + {name="Vozanus"}, + {name="Teamagus"}, + {name="Wexovis"}, + {name="Electra"}, + {name="Sephi"}, + {name="Assimius"}, + {name="Argus"}, + {name="Calamity"}, + }, + anomaly = { -- only 1 of these, not in the 2d layer, equal disance in 3rd layer + type = "anomaly", + name = "Foenestra" -- window, loophole, Hole, breach, opening + }, + space_zones = { -- other places in the same 2d layer as stars, mostly asteroid fields: 44 + { name = "Asteroidia" }, + { name = "Astral Snow", primary_resource="se-water-ice"}, + { name = "Breadcrumbs" }, + { name = "Broken Mirror"}, + { name = "Black Mirror", primary_resource="se-naquium-ore" }, + { name = "Bumperfield"}, + { name = "Caltrops" }, + { name = "Crystal Collective"}, + { name = "Creepy Hollow" }, + { name = "Cosmic Dustlands"}, + { name = "Dark Assemblage", primary_resource="se-naquium-ore" }, + { name = "Darkflare", primary_resource="se-naquium-ore" }, + { name = "Deadspace", primary_resource="uranium-ore" }, + { name = "Dusty Voids"}, + { name = "Ephemeral Expanse", primary_resource="se-methane-ice"}, + { name = "Felleim"}, + { name = "Galactic Gravel"}, + { name = "Godash"}, + { name = "Grapeshot" }, + { name = "Galactic Graveyard" }, + { name = "Haunted Hollows" }, + { name = "Hailstorm", primary_resource="se-water-ice" }, + { name = "Interstellar Grotto" }, + { name = "Interstellar Barrens" }, + { name = "Ice Field", primary_resource="se-water-ice" }, + { name = "Kaleidoscope" }, + { name = "Meloncholia", primary_resource="se-naquium-ore" }, + { name = "Oblongglobulata", primary_resource="se-methane-ice" }, + { name = "Poltergeist" }, + { name = "Pebbles" }, + { name = "Rocky Ridge" }, + { name = "Razor Field", primary_resource="iron-ore" }, + { name = "Realm of Shadows", primary_resource="se-naquium-ore" }, + { name = "Sands of Time", primary_resource="se-naquium-ore" }, + { name = "Shadeland" }, + { name = "Sea of Sorrows" }, + { name = "Shattered Skies"}, + { name = "Stardew", primary_resource="se-water-ice" }, + { name = "Stardust", primary_resource="se-naquium-ore"}, + { name = "Stone Circles" }, + { name = "Solar Entrails", primary_resource="se-methane-ice" }, + { name = "Slumberland" }, + { name = "Starcorpse" }, + { name = "Sky Fragments" }, + { name = "Specter"}, + } +} +-- red +-- violet +-- purple +-- mauve +-- blue +-- turquoise +-- green +-- olive +-- yellow +-- orange +-- white +-- black +-- grey +-- snow + +-- these planets are shuffled in as homeworlds +UniverseRaw.multiplayer_homeworlds = { + { name="Ekida"}, --2 + { name="Dosam" }, --3 + { name="Nacar" }, --4 + { name="Panji" }, --5 + { name="Jitah" }, --6 + { name="Sathex" }, --7 + { name="Waxak" }, --8 + { name="Bolon" }, --9 + { name="Lahuna" }, --10 + { name="Matalac" }, --11 + { name="Eeldo" }, --12 +} + +UniverseRaw.haven_moons = { + { name="Greyhaven", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --1 + { name="Solsolace", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --2 + { name="Respitia", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --3 + { name="Dusku", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --4 + { name="Sanctunimo", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --5 + { name="Gradshiem", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --6 + { name="Ismet", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --7 + { name="Meditato", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --8 + { name="Remedy", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --9 + { name="Curaga", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --10 + { name="Medjed", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --11 + { name="Aesseilia", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --12 + { name="Seren", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --13 + { name="Serapis", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --14 + { name="Eshu", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --15 + { name="Molli", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --16 + { name="Veles", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --17 + { name="Erio", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --18 + { name="Arawn", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --19 + { name="Cichol", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --20 + { name="Donn", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --21 + { name="Mannanan", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --22 + { name="Morrigan", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --23 + { name="Ran", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --24 + { name="Culga", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --25 + { name="Mantus", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --26 + { name="Orcus", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --27 + { name="Vanth", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --28 + { name="Erebus", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --29 + { name="Mors", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --30 + { name="Mara", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --31 + { name="Degei", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --32 + { name="Pana", radius_multiplier = 0.3, primary_resource="crude-oil", tags={"enemy_none", "temperature_cool", "water_high", "trees_med", "moisture_high", "aux_very_low"} }, --33 +} +UniverseRaw.cryonite_moons = { + { name="Shakok", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --1 + { name="Vionette", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --2 + { name="Snowdrop", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --3 + { name="Glacier", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --4 + { name="Hagen", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --5 + { name="Hothier", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --6 + { name="Calippo", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --7 + { name="Pastille", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --8 + { name="Cornetto", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --9 + { name="Frost", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --10 + { name="Cryonia", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --11 + { name="Beira", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --12 + { name="Khione", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --13 + { name="Marzanna", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --14 + { name="Morozko", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --15 + { name="Boreas", radius_multiplier = 0.8, primary_resource="se-cryonite", tags={"enemy_none", "temperature_frozen", "water_low", "trees_none", "moisture_med", "aux_med"} }, --16 +} +UniverseRaw.vulcanite_planets = { + { name="Aine", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --1 + { name="Theros", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --2 + { name="Aestas", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --3 + { name="Damia", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --4 + { name="Ruamati", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --5 + { name="Miochin", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --6 + { name="Hephaestus", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --7 + { name="Ogun", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --8 + { name="Shennong", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --9 + { name="Agni", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --10 + { name="Agneya", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --11 + { name="Fuji", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --12 + { name="Odqan", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --13 + { name="Turgmam", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --14 + { name="Alaz", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --15 + { name="Kamar", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --16 + { name="Grannus", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --17 + { name="Mariel", radius_multiplier = 0.2, primary_resource="se-vulcanite", tags={"enemy_none", "temperature_volcanic", "water_none", "moisture_none", "trees_none", "aux_very_low"} }, --18 +} +UniverseRaw.iridium_moons = { + { name="Kothar", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --1 + { name="Ptah", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --2 + { name="Goibniu", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --3 + { name="Anvil", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --4 + { name="Sethlans", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --5 + { name="Svarog", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --6 + { name="Gibil", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --7 + { name="Fornax", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --8 + { name="Forgehammer", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --9 + { name="Wayland", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --10 + { name="Ilmarinen", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --11 + { name="Lugh", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --12 + { name="Seker", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --13 + { name="Cyclops", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --14 + { name="Hadur", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --15 + { name="Ikenga", radius_multiplier = 0.8, primary_resource="se-iridium-ore", tags={"enemy_none", "temperature_wild", "aux_low", "moisture_low", "trees_none", "water_low"} }, --16 +} +UniverseRaw.holmium_moons = { + { name="Enlil", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"}}, --1 + { name="Amun", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --2 + { name="Henkhisesui", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --3 + { name="Shu", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --4 + { name="Ninlil", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --5 + { name="Holmera", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --6 + { name="Pazu", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --7 + { name="Tazer", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --8 + { name="Verbti", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --9 + { name="Shurdhi", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --10 + { name="Varpulis", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --11 + { name="Egoi", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --12 + { name="Borroum", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --13 + { name="Sidhe", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --14 + { name="Njord", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --15 + { name="Kari", radius_multiplier = 0.8, primary_resource="se-holmium-ore", tags={"enemy_none", "temperature_bland", "aux_very_high", "moisture_high", "trees_med", "water_med"} }, --16 +} +UniverseRaw.vitamelange_moons = { + { name="Freyr", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --1 + { name="Bigrid", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --2 + { name="Eostre", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --3 + { name="Daisy", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --4 + { name="Ver", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --5 + { name="Jura", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --6 + { name="Buttercup", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --7 + { name="Eiar", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --8 + { name="Morityema", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --9 + { name="Gardinia", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --10 + { name="Shire", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --11 + { name="Mossgarden", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --12 + { name="Fern", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --13 + { name="Lilly", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --14 + { name="Rose", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --15 + { name="Tulip", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --16 + { name="Everglade", radius_multiplier = 0.8, primary_resource="se-vitamelange", tags={"enemy_none", "temperature_bland", "aux_very_low", "moisture_high", "trees_high", "water_med"} }, --17 +} + +UniverseRaw.unassigned_planets = { + {name="Arendel", radius_multiplier = 1, tags={"water_high", "aux_low", "trees_high", "moisture_high", "temperature_bland"}, primary_resource="uranium-ore"}, + {name="Orchid", tags={"water_low", "aux_high", "trees_high", "moisture_high", "temperature_balanced"}, primary_resource="copper-ore", + biome_replacements={ -- blue, turquoise, white + {replace={ "vegetation-purple", }, with="vegetation-violet"}, + {replace={"vegetation-mauve", "vegetation-blue", "vegetation-olive", "vegetation-yellow", "vegetation-orange",}, with="vegetation-red"}, + {replace={"all-dirt"}, with="dirt-white"}, + {replace={"all-sand"}, with="sand-white"}, + {replace={"all-volcanic"}, with="volcanic-purple"} } + }, -- : Red Forestmin_aux = 0.7, min_water = 0.7, min_tempeature = 50, max_temperature = 100 + {name="Anathema", tags={"water_low", "aux_high", "trees_none", "moisture_med", "temperature_vhot"}, primary_resource="iron-ore", + biome_replacements={ --: Blue Volcanic + {replace={"all-vegetation"}, with="vegetation-blue"}, + {replace={"all-dirt"}, with="dirt-black"}, + {replace={"all-sand"}, with="sand-black"}, + {replace={"all-volcanic"}, with="volcanic-blue"} } }, + {name="Tigris", tags={"water_low", "aux_low", "trees_low", "moisture_low", "temperature_warm"}, primary_resource="stone", + biome_replacements={ -- Endless Stone: Yellow deserts and plains + {replace={"vegetation-red", "vegetation-violet", "vegetation-turquoise", }, with="vegetation-orange"}, + {replace={"vegetation-blue", "vegetation-mauve", "vegetation-purple", "vegetation-olive", "vegetation-green",}, with="vegetation-yellow"}, + {replace={"dirt-purple", "dirt-violet", "dirt-red", "dirt-aubergine", "dirt-dustyrose", "dirt-black", "dirt-grey", "dirt-white"}, with="dirt-tan"}, + {replace={"sand-purple", "sand-violet", "sand-red", "sand-aubergine", "sand-dustyrose", "sand-black", "sand-grey", "sand-white"}, with="sand-tan"}, + {replace={"all-volcanic"}, with="volcanic-orange"} } }, + {name="Bellerophon"}, + {name="Theseus"}, + {name="Snek", radius_multiplier = 0.9, tags={"water_low", "aux_low", "trees_none", "moisture_none", "temperature_hot"}}, -- either a super-earth or a gas dwarf? ^^ + {name="Maelstrom", primary_resource="iron-ore", tags={"water_med", "aux_med", "trees_med", "moisture_med", "temperature_balanced"}, + biome_replacements={ -- blue, turquoise, white + {replace={"vegetation-green", "vegetation-olive", "vegetation-yellow", "vegetation-orange"}, with="vegetation-turquoise"}, + {replace={"vegetation-red", "vegetation-violet", "vegetation-purple", "vegetation-mauve"}, with="vegetation-blue"}, + {replace={"all-dirt"}, with="dirt-white"}, + {replace={"all-sand"}, with="sand-white"}, + {replace={"all-volcanic"}, with="volcanic-blue"} } }, + {name="Crystalys", tags={"water_med", "aux_high", "trees_med", "moisture_med", "temperature_vcold"}}, + {name="Nostos", tags={"water_low", "aux_low", "trees_none", "moisture_low", "temperature_balanced"}, primary_resource="uranium-ore", + biome_replacements={ -- : Endless concrete and ruins. If you explore you find nuclear bombs. You might also find a unique artefact: power armour with a huge equipment grid. Always planet 55? + {replace={"all-vegetation"}, with="vegetation-turquoise"}, + {replace={"sand-purple", "sand-violet", "sand-red", "sand-brown", "sand-tan", "sand-aubergine", "sand-dustyrose", "sand-cream", "sand-white"}, with="sand-black"}, + {replace={"dirt-purple", "dirt-violet", "dirt-red", "dirt-brown", "dirt-tan", "dirt-aubergine", "dirt-dustyrose", "dirt-cream", "dirt-white"}, with="dirt-black"}, + {replace={"sand-white"}, with="sand-grey"}, + {replace={"dirt-white"}, with="dirt-grey"}, + {replace={"all-volcanic"}, with="volcanic-green"} } }, + {name="Raegis", tags={"water_none", "aux_low", "trees_low", "moisture_med", "temperature_hot"}, primary_resource="copper-ore", + biome_replacements={ + {replace={"dirt-purple", "dirt-violet", "dirt-aubergine", "dirt-dustyrose", "dirt-cream", "dirt-grey", "dirt-white"}, with="dirt-red"}, + {replace={"dirt-tan", "dirt-beige", "dirt-black", }, with="dirt-brown"}, + {replace={"sand-purple", "sand-violet", "sand-aubergine", "sand-dustyrose", "sand-cream", "sand-grey", "sand-white"}, with="sand-red"}, + {replace={"sand-tan", "sand-beige", }, with="sand-brown"}, + {replace={"all-frozen"}, with="sand-black"}, + {replace={"vegetation-green", "vegetation-olive", "vegetation-violet", "vegetation-purple", "vegetation-mauve", "vegetation-blue", "vegetation-turquoise"}, with="vegetation-red"}, + {replace={"vegetation-yellow"}, with="vegetation-orange"}, + {replace={"all-volcanic"}, with="volcanic-orange"} } }, -- Endless copper. Red deserts and forests. + {name="Poseidon", radius_multiplier = 0.9, tags={"water_max", "moisture_max", "temperature_bland"}, primary_resource="crude-oil"}, + {name="Wilde", radius_multiplier = 0.9, tags={"water_max", "temperature_wild"}}, -- : Huge planet + {name="Zegul", tags={"temperature_balanced", "water_med", "trees_high", "aux_med", "moisture_high", "enemy_max"}, primary_resource="coal", + biome_replacements={ -- red, orange, + {replace={"vegetation-green", "vegetation-olive", "vegetation-yellow", -- not orange + "vegetation-violet", "vegetation-purple", "vegetation-mauve", "vegetation-blue", "vegetation-turquoise" }, with="vegetation-red"}, + {replace={"dirt-purple", "dirt-violet", "dirt-brown", "dirt-tan"}, with="dirt-red"}, + {replace={"dirt-aubergine", "dirt-beige", "dirt-cream", "dirt-black", "dirt-grey", "dirt-white"}, with="dirt-dustyrose"}, + {replace={"sand-purple", "sand-violet", "sand-brown", "sand-tan"}, with="sand-red"}, + {replace={"sand-aubergine", "sand-beige", "sand-cream", "sand-black", "sand-grey", "sand-white"}, with="sand-dustyrose"}, + {replace={"all-volcanic"}, with="volcanic-orange"} } }, -- is a biter death world with rich resources near the middle + {name="Charon", tags={"temperature_volcanic", "water_low"}, primary_resource="copper-ore"}, -- a lava planet with rich copper deposit near the landing site. + {name="Titan", radius_multiplier = 0.9}, -- : Big +} + +UniverseRaw.unassigned_moons = { + {name="Feluna", tags={"water_none", "moisture_none", "aux_low", "temperature_cool"}, primary_resource="iron-ore", + biome_replacements={ + {replace={"all-vegetation", "all-dirt"}, with="sand-white"}, + {replace={"all-sand"}, with="sand-grey"}, + {replace={"all-volcanic", "water"}, with="sand-black"} } }, -- has a rich iron depoit near the landing site but is otherwise like the moon. + {name="Eris"}, + {name="Segel"}, + {name="Leto"}, + {name="Mixin"}, + {name="Albion"}, + {name="Husky", tags={"temperature_vcold"}},-- : Ice World + {name="Butterfly", tags={"trees_max", "enemy_none"}}, + {name="Bluna", tags={"aux_high", "water_none", "moisture_none", "temperature_hot"}}, -- : Blue moon + {name="Auberge", tags={"aux_high", "water_none", "moisture_none", "temperature_bland"}}, -- Aubergine Moon + {name="Harbistaz", tags={"water_none", "moisture_none"}}, -- : moon + {name="Minkey", tags={"water_high", "enemy_high"}}, + {name="Pengwing", tags={"water_high", "temperature_cold", "aux_low", "moisture_high"}}, + {name="Jackneevle", tags={"water_low", "moisture_low"}}, -- : Moon + {name="Yetermoon", tags={"water_none", "moisture_none"}}, +} + +UniverseRaw.unassigned_planets_or_moons = { + {name="Mirage ", tags={"temperature_wild", "enemy_low", "water_med", "moisture_med", "aux_very_high", "trees_med"}, + primary_resource="iron-ore", + preset_resource_bias={["uranium-ore"] = 0.03, ["crude-oil"] = 0.02, ["coal"] = 0.01}, + biome_replacements={ -- yellow, purple, green, + {replace={"all-vegetation", "dirt-purple", "dirt-violet", "dirt-red", "dirt-brown", "dirt-tan", "dirt-dustyrose", "dirt-beige", "dirt-cream", "dirt-black", "dirt-grey", "dirt-white", "dirt-aubergine"}, with="vegetation-blue"}, + {replace={"sand-purple", "sand-violet", "sand-red", "sand-brown"}, with="sand-black"}, + {replace={"sand-tan", "sand-dustyrose", "sand-beige", "sand-cream", "sand-grey", "sand-aubergine"}, with="sand-white"}, + {replace={"all-volcanic"}, with="volcanic-blue"} + } + }, -- Shylo132 + {name="Noveria", tags={"temperature_frozen", "enemy_high", "water_high", "moisture_high", "aux_very_high", "trees_low"}, primary_resource="se-beryllium-ore", preset_resource_bias={["crude-oil"] = 0.99}}, -- Luckay + {name="Vorlon", tags={"temperature_midrange", "enemy_none", "water_med", "moisture_med", "aux_med", "trees_low"}, primary_resource="se-iridium-ore", + biome_replacements={ -- yellow, purple, green, + {replace={"vegetation-blue", "dirt-cream" }, with="vegetation-yellow"}, + {replace={"vegetation-red" }, with="vegetation-olive"}, + {replace={"vegetation-orange", "all-frozen"}, with="vegetation-violet"}, + {replace={"vegetation-turquoise", }, with="vegetation-purple"}, + {replace={"dirt-violet", "dirt-brown", "dirt-red"}, with="dirt-purple"}, + {replace={"dirt-beige", "dirt-black", "dirt-grey", "dirt-white", "dirt-dustyrose"}, with="dirt-tan"}, + {replace={"sand-brown"}, with="sand-aubergine"}, + {replace={"sand-violet", "sand-black", "sand-red"}, with="sand-purple"}, + {replace={"sand-beige", "sand-grey", "sand-white", "sand-dustyrose"}, with="sand-tan"}, + {replace={"all-volcanic"}, with="volcanic-purple"} } + }, -- SirVorlon + {name="Marquardt", tags={"temperature_frozen", "enemy_med", "water_med", "moisture_low", "aux_very_low", "trees_none"}, primary_resource="stone"}, -- Andree + {name="Tarn", tags={"temperature_cold", "enemy_low", "water_med", "moisture_low", "aux_high", "trees_low"}, primary_resource="se-cryonite"}, -- Tarn + {name="Ketobar", tags={"temperature_temperate", "enemy_none", "water_none", "moisture_high", "aux_low", "trees_low"}, primary_resource="se-iridium-ore"}, -- Valanna + {name="Horaerratum", tags={"temperature_extreme", "enemy_low", "water_low", "moisture_max", "aux_very_high", "trees_max"}, + primary_resource="se-vitamelange", preset_resource_bias={["se-cryonite"] = 0.99, ["se-vulcanite"] = 0.98}}, -- slipsec + {name="Katalos", tags={"temperature_extreme", "enemy_max", "water_med", "moisture_max", "aux_low", "moisture_high", "cliff_low", "trees_med"}, + primary_resource="se-beryllium-ore", preset_resource_bias={["se-cryonite"] = 0.99, ["se-vulcanite"] = 0.98, ["iron-ore"] = 0.02, ["stone"] = 0.01}, + biome_replacements={ -- yellow, purple, green, + {replace={"vegetation-violet", "vegetation-purple", "vegetation-mauve", "vegetation-blue"}, with="vegetation-green"}, + {replace={"dirt-violet", "dirt-purple", "dirt-aubergine"}, with="dirt-brown"}, + {replace={"sand-violet", "sand-purple", "sand-aubergine"}, with="sand-brown"}, + {replace={"volcanic-purple", "volcanic-blue"}, with="volcanic-orange"} } + }, -- PeterHan5 + {name="Drakkett", tags={"temperature_frozen", "enemy_low", "water_low", "aux_very_high", "trees_low"}, primary_resource="se-cryonite"}, + {name="Xiada", tags={"temperature_cold", "enemy_med", "water_med", "moisture_high", "aux_med", "trees_high"}, primary_resource="se-vitamelange", preset_resource_bias={["crude-oil"] = 0.99}, + biome_replacements={ + {replace={"all-dirt"}, with="volcanic-blue"}, + {replace={"all-sand"}, with="sand-black"}, + {replace={"all-vegetation"}, with="vegetation-blue"}, + {replace={"all-volcanic"}, with="volcanic-blue"} } }, -- CrushedIce + {name="Sparky", tags={"temperature_temperate", "enemy_very_low", "water_high", "moisture_max", "aux_very_low", "trees_high"}, primary_resource="se-holmium-ore", preset_resource_bias={["uranium-ore"] = 0.99}}, -- sparky + --radiation/wind: very very high + --secondary resource: uranium + --weather: perpetual thunderstorm (or as close as possible) + {name="Trelos", tags={"temperature_frozen", "enemy_med", "water_med", "moisture_high", "aux_very_low", "trees_med"}, primary_resource="crude-oil"}, -- madman + {name="Sandro", tags={"temperature_hot", "water_none", "moisture_none", "aux_high", "trees_none"}, primary_resource="iron-ore", + biome_replacements={-- red black orange + {replace={"all-dirt"}, with="dirt-red"}, + {replace={"all-sand"}, with="sand-red"}, + {replace={"all-frozen"}, with="sand-black"}, + {replace={"all-vegetation"}, with="vegetation-red"}, + {replace={"all-volcanic"}, with="volcanic-orange"} } }, + {name="Neenuvar", tags={"temperature_cool", "water_high", "moisture_max", "aux_high", "trees_max"}}, + {name="Kamsta", tags={"temperature_cool", "water_med", "moisture_high", "aux_high", "trees_high"}, primary_resource="iron-ore", + biome_replacements={ + {replace={"all-dirt"}, with="dirt-purple"}, + {replace={"all-sand"}, with="sand-purple"}, + {replace={"all-vegetation"}, with="vegetation-purple"}, + {replace={"all-volcanic"}, with="volcanic-purple"} } }, + {name="Jasbury"}, + {name="Atropos"}, + {name="Mormo"}, + {name="Viken"}, + {name="Katar"}, + {name="Liko"}, + {name="Plato"}, + {name="Talos"}, + {name="Capritos"}, + {name="Yaegner"}, + {name="Gigei"}, + {name="Kujaku"}, + {name="Aciszar"}, + {name="Toxinora", tags={"temperature_vhot", "aux_high", "water_high"}, primary_resource="crude-oil"}, + {name="Hestia"}, + {name="Avorion"}, + {name="Mercutio"}, + {name="Elolis"}, + {name="Horkos"}, + {name="Riven", tags={"enemy_none"}}, + {name="Techne"}, + {name="Bomore"}, + {name="Prabhava"}, + {name="Anemoi"}, + {name="Ismene"}, + {name="Owleye", tags={"enemy_none"}}, + {name="Theia"}, + {name="Isabella"}, + {name="Thanatos"}, + {name="Nechrophos"}, + {name="Morpheus"}, + {name="Eleusis"}, + {name="Nike"}, + {name="Pollus"}, + {name="Hadrian"}, + {name="Meleager"}, + {name="Sapperious"}, + {name="Arkazious"}, + {name="Hyratel"}, + {name="Atonoy"}, + {name="Dafdee"}, + {name="Bordoli"}, + {name="Dinotress"}, + {name="Helburn"}, + {name="Horae"}, + {name="Hybris"}, + {name="Fodius"}, + {name="Petra"}, + {name="Zafis"}, + {name="Kerel"}, + {name="Claustry"}, + {name="Anson"}, + {name="Reaver", tags={"enemy_max"}}, + {name="Arae"}, + {name="Magaera"}, + {name="Dagon", tags={"enemy_high"}}, + {name="Glasties"}, + {name="Phoebe"}, + {name="Vestrian"}, + {name="Rovecutio"}, + {name="Hexagee"}, + {name="Unilix"}, + {name="Eirene", tags={"enemy_none"}}, + {name="Rouk"}, + {name="Rupel"}, + {name="Dyton"}, + {name="Miranda"}, + {name="Aghanim"}, + {name="Octarine"}, + {name="Veden"}, + {name="Mireska"}, + {name="Tarrasque"}, + {name="Parth"}, + {name="Jenova"}, + {name="Lich", tags={"temperature_frozen"}}, + {name="Farangis", tags={"temperature_cool", "moisture_high", "aux_low", "trees_med"}}, + {name="Pelorum"}, + {name="Hera"}, + {name="Vyse"}, + {name="Argenta"}, + {name="Rooftrellen", tags={"temperature_warm", "moisture_high", "aux_low", "trees_med"}}, -- : Forest + {name="Avez"}, + {name="Theoden"}, + {name="Nookryme"}, + {name="Lyralei"}, + {name="Agon"}, + {name="Eshone"}, + {name="Rolium"}, + {name="Exorrion"}, + {name="Sage"}, + {name="Persophone"}, + {name="Hemera"}, + {name="Shashi"}, + {name="Skadi", tags={"temperature_frozen", "enemy_high"}},-- : Ice World + {name="Geryon"}, + {name="Juliette"}, + {name="Dolos"}, + {name="Druanga"}, + {name="Aquila", tags={"water_max", "temperature_warm", "aux_low", "moisture_max", "trees_max"}}, -- : Water world + {name="Krobelus", tags={"temperature_extreme", "aux_high", "trees_low"}}, + {name="Neuranto"}, + {name="Trostaurus", tags={"temperature_extreme", "aux_high", "trees_low"}}, -- : Hot and cold + {name="Lothar"}, + {name="Styx", tags={"water_high", "temperature_cool"}}, -- : Water + {name="Sooten", tags={"water_low", "temperature_vhot", "trees_high", "aux_low", "moisture_med"}, primary_resource="iron-ore"}, + {name="Karura"}, + {name="Magi"}, + {name="Momus"}, + {name="Chronos"}, + {name="Ganymede", tags={"enemy_none"}}, + {name="Gerhaift"}, + {name="Heinlein"}, + {name="Chrodon"}, + {name="Ettenor", tags={"water_low", "moisture_high", "trees_max", "aux_low", "temperature_bland"}}, -- has a rich oil near the landing site. and is a forest planet + {name="Numrah"}, + {name="Snagle"}, + {name="Noventede"}, + {name="Minos"}, + {name="Amebris"}, + {name="Lath"}, + {name="Haka"}, + {name="Adul"}, + {name="Lethe"}, + {name="Furion", tags={"temperature_hot"}}, -- : Hot + {name="Alfonso"}, + {name="Bandoch"}, + {name="Daedelus"}, + {name="Acheron"}, + {name="Minoa"}, + {name="Angelos"}, + {name="Tartarus"}, + {name="Whittier"}, + {name="Ethoria"}, + {name="Acisrind"}, + {name="Rokenharr"}, + {name="Haze"}, + {name="Vekars"}, + {name="Kitsune", tags={"water_low", "moisture_high", "trees_max", "aux_high", "temperature_bland"}}, + {name="Pentto"}, + {name="Enigma"}, + {name="Tycho"}, + {name="Aporia"}, + {name="Orphne"}, + {name="Gearofen"}, + {name="Akasha"}, + {name="Sofurna"}, + {name="Hermes"}, + {name="Swoxter"}, + {name="Manta"}, + {name="Zion"}, + {name="Oneiros"}, + {name="Nexus"}, + {name="Jelt"}, + {name="Kratos", tags={"temperature_volcanic"}, primary_resource="iron-ore"}, + {name="Claymore"}, + {name="Avakis", tags={"temperature_warm", "water_none", "moisture_none", "trees_low", "enemy_med"}, primary_resource="coal"}, -- : Dune + {name="Shara"}, + {name="Oeris"}, + {name="Tresdin"}, + {name="Hedone"}, + {name="Lilac"}, + {name="Tango", tags={"temperature_warm", "water_high", "moisture_high", "trees_high"}, primary_resource="crude-oil"}, + {name="Dolentea"}, + {name="Apate"}, + {name="Warrus"}, + {name="Esenudreus"}, + {name="Joenus"}, + {name="Narsus"}, + {name="Weylop"}, + {name="Warlock"}, + {name="Tieneo"}, + {name="Znok"}, + {name="Rinoto"}, + {name="Azure", tags={"temperature_hot", "aux_high"}, primary_resource="crude-oil"}, + {name="Zakhol"}, + {name="Ashura"}, + {name="Krubidium"}, + {name="Silverhorn"}, + {name="Alecto"}, + {name="Osis", tags={"water_high", "moisture_low", "temperature_warm"}}, -- Endless water (and fish): Land is very rare. + {name="Morus"}, + {name="Selemaenae"}, + {name="Empha"}, + {name="Midas"}, + {name="Akerty"}, + {name="Lotuslana", tags={"aux_high", "water_max", "temperature_cool", "moisture_max", "trees_max"}}, -- : Water + {name="Spiriso"}, + {name="Imbrium"}, + {name="Quillion"}, + {name="Alba"}, + {name="Zendia"}, + {name="Linken"}, + {name="Konan"}, + {name="Tolubai"}, + {name="Magmin"}, + {name="Sange", tags={"water_low", "temperature_hot", "aux_med", "trees_low", "moisture_none"}, primary_resource="copper-ore"}, + {name="Dionysus"}, + {name="Bishamonten"}, + {name="Bunkle"}, + {name="Memnon"}, + {name="Nomos"}, + {name="Kokytos"}, + {name="Crixalis"}, -- : Dune + {name="Andragora"}, + {name="Ryuo"}, + {name="Rivos"}, -- : River planet + {name="Constance"}, + {name="Stromhurst"}, + {name="Feaora"}, + {name="Paquin"}, + {name="Heechgata"}, + {name="Mercurial"}, + {name="Hyperion"}, + {name="Xandra"}, + {name="Delune"}, + {name="Adalind"}, + {name="Vioress"}, + {name="Crean"}, + {name="Alban"}, + {name="Lamia"}, + {name="Melancholia"}, + {name="Kaya"}, + {name="Heliolyte"}, + {name="Tanzan", tags={"aux_high", "temperature_cool", "trees_high", "moisture_high"}, primary_resource="crude-oil"}, -- Endless Oil: Purple forests. losts of water + {name="Jakiro", tags={"temperature_extreme", "aux_low"}}, -- : Fire and Ice + {name="Juno", tags={"aux_high"}}, + {name="Vobis"}, + {name="Corsol"}, + {name="Elezar"}, + {name="Lamplika", tags={"aux_high"}}, -- : Red + {name="Taras"}, + {name="Atengam"}, + {name="Tentei"}, + {name="Shellabby"}, + {name="Ezra"}, + {name="Persephone", tags={"aux_high", "water_high", "moisture_high", "trees_med"}}, + {name="Chiron"}, + {name="Neevus"}, + {name="Rampart"}, + {name="Hades", tags={"moisture_low", "trees_low", "aux_low"}, primary_resource="coal"}, + {name="Santo"}, + {name="Abyssal"}, + {name="Deurus"}, + {name="Koskomino"}, + {name="Hypnos"}, + {name="Moirai"}, + {name="Selene", tags={"enemy_none"}}, + {name="Zed"}, + {name="Tisiphone"}, + {name="Thrasos"}, + {name="Beaumont"}, + {name="Indarl"}, + {name="Kerkon"}, + {name="Rhadaman"}, + {name="Verbena"}, + {name="Benthai"}, + {name="Boros"}, + {name="Aizen"}, + {name="Galvania"}, + {name="Prism"}, + {name="Berky"}, + {name="Tenou"}, + {name="Aeolus"}, + {name="Faerie", tags={"water_high", "temperature_cool", "moisture_high", "aux_high", "trees_max"}, primary_resource="crude-oil"}, -- : Forest + {name="Ophion"}, + {name="Mobius"}, + {name="Peitho"}, + {name="Greenleaf", tags={"water_low", "temperature_cool", "moisture_high", "aux_low", "trees_max"}, primary_resource="coal"}, -- : Forest + {name="Vesper", tags={"trees_med", "moisture_med", "temperature_hot"}, primary_resource="crude-oil"}, + {name="Rubik"}, + {name="Riza"}, + {name="Geive"}, + {name="Palto"}, + {name="Alke"}, + {name="Elysium"}, + {name="Eaglesong", tags={"water_med", "temperature_temperate", "moisture_high", "aux_low", "trees_high"}, primary_resource="coal"}, -- : Forest + {name="Daryun"}, + {name="Achilles"}, + {name="Brion"}, + {name="Grilla"}, + {name="Ermintrude"}, + {name="Naden"}, + {name="Evadome"}, + {name="Amechania"}, + {name="Antaeus"}, + {name="Ender"}, + {name="Demeter", tags={"enemy_none"}}, + {name="Athina"}, + {name="Caerus"}, + {name="Witfalla"}, + {name="Starfury"}, + {name="Muir"}, + {name="Jeroen"}, + {name="Ourea"}, + {name="Jespur"}, + {name="Jetenury"}, + {name="Manelscot"}, + {name="Marmo", tags={"temperature_cold", "moisture_none", "water_none", "aux_med"}, + biome_replacements={-- Has red deserts and snow (mars) and a small deserted mining base. + {replace={"all-dirt"}, with="dirt-dustyrose"}, + {replace={"all-sand"}, with="sand-dustyrose"}, + {replace={"all-vegetation"}, with="sand-dustyrose"}, + {replace={"all-volcanic"}, with="volcanic-orange"} } }, + {name="Emiir", tags={"water_med", "temperature_cold", "moisture_high", "aux_low", "trees_high"}, primary_resource="crude-oil"}, -- : Forest + {name="Castor"}, + {name="Petussia"}, + {name="Androgun"}, + {name="Chimera"}, + {name="Semiele"}, + {name="Lyssa"}, + {name="Jetnova"}, + {name="Soma"}, + {name="Beylix"}, + {name="Rylai"}, + {name="Eulstave"}, + {name="Liono"}, + {name="Infernox"}, + {name="Paulara"}, + {name="Algea"}, + {name="Gapleon"}, + {name="Tetracat"}, + {name="Alastor"}, + {name="Bolina"}, + {name="Penium"}, + {name="Shiva", tags={"temperature_frozen"}, primary_resource="iron-ore"}, -- : Ice World + {name="Arturius"}, + {name="Traxex", tags={"temperature_cold", "moisture_none", "water_low", "trees_none"}}, -- black + {name="Itnora"}, + {name="Luxitania"}, + {name="Taishakuten"}, + {name="Bloodthorn", tags={"aux_high"}}, -- : Red + {name="Amadeo"}, + {name="Plenai"}, + {name="Koma"}, + {name="Ishmere"}, + {name="Criopta"}, + {name="Thalassa"}, + {name="Thoon"}, + {name="Ozwulf"}, + {name="Thule"}, + {name="Vietera"}, + {name="Kunkri"}, + {name="Aion"}, + {name="Kael"}, + {name="Ixion"}, + {name="Metapilla"}, + {name="Mavarix"}, + {name="Voxnova"}, + {name="Karik"}, + {name="Sturata"}, + {name="Bernadette"}, + {name="Legogene"}, + {name="Ecludies"}, + {name="Abaddon"}, + {name="Miturion"}, + {name="Gorgyra"}, + {name="Cinrad"}, + {name="Orion"}, + {name="Kendapoa", tags={"enemy_none"}}, + {name="Spatha"}, + {name="Indigo", tags={"temperature_cold", "aux_high"}, primary_resource="iron-ore"}, -- : Endless iron, Blue forest, snow, grey desert + {name="Corus"}, + {name="Harmonia"}, + {name="Arkoth", tags={"temperature_cold", "aux_low"}, primary_resource="coal"}, -- is a snow wasteland with rich coal near the landing site + {name="Bromwinkle"}, + {name="Nikara"}, + {name="Ajax"}, + {name="Kaliphos"}, + {name="Mordiggian"}, + {name="Kuyou"}, + {name="Exavier"}, + {name="Zauber"}, + {name="Cerberus"}, + {name="Manearth"}, + {name="Umbra"}, + {name="Ranolin"}, + {name="Slithice", tags={"water_high", "temperature_vcold"}},-- : water and Ice World + {name="Cadmus"}, + {name="Adikia"}, + {name="Perodome"}, + {name="Geras"}, + {name="Typhon"}, + {name="Termina"}, + {name="Oliran"}, + {name="Deadrim"}, + {name="Hyrean", tags={"water_max", "temperature_warm", "moisture_med"}}, -- is 100% ocean + {name="Gorgon", tags={"water_low", "temperature_balanced", "trees_med"}, primary_resource="uranium-ore", + biome_replacements={-- : Endless uranium, and black landscape yellow and green forest and plains + {replace={"all-dirt"}, with="dirt-black"}, + {replace={"all-sand"}, with="sand-black"}, + {replace={"vegetation-mauve", "vegetation-blue", "vegetation-turquoise"}, with="vegetation-green"}, + {replace={"vegetation-violet", "vegetation-purple"}, with="vegetation-olive"}, + {replace={"vegetation-orange", "vegetation-red"}, with="vegetation-yellow"}, + {replace={"all-volcanic"}, with="volcanic-green"} } }, + {name="Chrothurn"}, + {name="Sladeshon"}, + {name="Nonagaz"}, + {name="Sihnon"}, + {name="Bombato"}, + {name="Mordred"}, + {name="Jiangyin"}, + {name="Akkolon"}, + {name="Alfrind"}, + {name="Sworn"}, + {name="Hexen"}, + {name="Falconsabre"}, + {name="Roma"}, + {name="Ganus"}, + {name="Aiakos"}, + {name="Ourus"}, + {name="Deadwood", tags={"water_med", "temperature_wild", "moisture_med", "aux_low", "trees_med"}, primary_resource="coal"}, + {name="Windlace", tags={"temperature_cold", "aux_med", "enemy_none"}}, + {name="Aberdon", tags={"water_high"}},-- : water + {name="Kara"}, + {name="Koolimon"}, + {name="Rutadam"}, + {name="Pandion"}, + {name="Shinzo"}, + {name="Anax"}, + {name="Hecate"}, + {name="Rumba"}, + {name="Zomble", tags={"water_med", "temperature_hot", "moisture_med", "aux_med", "trees_low"}, + biome_replacements={-- orange and purple + {replace={"dirt-red", "dirt-dustyrose", "dirt-beige"}, with="dirt-brown"}, + {replace={"dirt-violet", "dirt-cream", "dirt-grey", "dirt-white"}, with="dirt-aubergine"}, + {replace={"sand-red", "sand-dustyrose", "sand-beige"}, with="sand-brown"}, + {replace={"sand-violet", "sand-cream", "sand-grey", "sand-white"}, with="sand-aubergine"}, + {replace={"vegetation-yellow", "vegetation-red", "vegetation-olive", "vegetation-green" }, with="vegetation-orange"}, + {replace={"vegetation-violet", "vegetation-mauve", "vegetation-blue", "vegetation-turquoise" }, with="vegetation-purple"}, + {replace={"volcanic-green"}, with="volcanic-orange"}, + {replace={"volcanic-blue"}, with="volcanic-purple"} } }, + {name="Atos"}, + {name="Throix", tags={"temperature_volcanic"}}, -- : Green lava + {name="Zelos", tags={"aux_high"}}, + {name="Razor", primary_resource="iron-ore"}, + {name="Mythulu"}, + {name="Katski"}, + {name="Morgana"}, + {name="Ester"}, + {name="Vares"}, + {name="Balanar"}, + {name="Impetus"}, + {name="Soteria"}, + {name="Arislan", tags={"temperature_temperate", "moisture_high", "aux_low"}}, + {name="Tintavis"}, + {name="Melione"}, + {name="Clotho"}, + {name="Aidos"}, + {name="Vexo"}, + {name="Sakimi"}, + {name="Stijio", tags={"temperature_wild", "aux_low"}}, + {name="Regina"}, + {name="Erinyes"}, + {name="Lynx"}, + {name="Wyvern"}, + {name="Nestor"}, + {name="Noctis", tags={"temperature_cool", "moisture_none"}}, -- : black + {name="Osiris"}, + {name="Ariel"}, + {name="Erebos"}, + {name="Alessandro"}, + {name="Gelos"}, + {name="Yasha"}, + {name="Empusa"}, + {name="Esluna"}, + {name="Hermione"}, + {name="Orpheus"}, + {name="Limos"}, + {name="Karas"}, + {name="Nissaria"}, + {name="Harmonette"}, + {name="Piccard", tags={"aux_low", "trees_low"}}, + {name="Redril", tags={"aux_high"}}, -- red + {name="Avernus", tags={"temperature_vcold", "aux_high"}}, + {name="Infamani"}, + {name="Perseus"}, + {name="Loliento"}, + {name="Elpis"}, + {name="Tyche"}, + {name="Whinstone"}, + {name="Budkai"}, + {name="Phanto"}, + {name="Toucan"}, + {name="Demios"}, +} + +UniverseRaw.prototypes_by_name = {} +for _, proto_zone_group in pairs({ + UniverseRaw.universe.stars, + UniverseRaw.universe.space_zones, + {UniverseRaw.universe.anomaly}, + UniverseRaw.unassigned_planets, + UniverseRaw.unassigned_moons, + UniverseRaw.unassigned_planets_or_moons, + UniverseRaw.haven_moons, + UniverseRaw.vulcanite_planets, + UniverseRaw.cryonite_moons, + UniverseRaw.iridium_moons, + UniverseRaw.holmium_moons, + UniverseRaw.vitamelange_moons, +}) do + for _, proto_zone in pairs(proto_zone_group) do + if UniverseRaw.prototypes_by_name[proto_zone.name] then + error(proto_zone.name.." is defined twice") + end + UniverseRaw.prototypes_by_name[proto_zone.name] = proto_zone + end +end + +return UniverseRaw diff --git a/space-exploration_0.5.58/space-exploration/scripts/universe.lua b/space-exploration_0.5.58/space-exploration/scripts/universe.lua new file mode 100644 index 0000000..0280d75 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/universe.lua @@ -0,0 +1,2073 @@ +local Universe = {} + +-- stellar cluster inflation code +-- universe-data.lua has base stellar cluster model and unassigned data +-- the model gets inflated by assigning the unassigned data in a deterministic-pseudo-random pattern based on nauvis's map gen seed + +-- the list is used in control.lua for space mechanics +-- resource picker selects which core fragments the planet generates +-- the data gets saved to global on init + +-- A group of close in a stellar cluster, each with many planets, each with many moons + +-- 30 ish stars + -- 120-150 planets, min of 3 per star + -- the rest are moons (350-380) + +-- Nauvis is a planet +-- Nauvis orbits the star called... Calidus + +-- general concepts: +--[[ +star (inaccessable) + star orbit + asteroid belt + planet + planet orbit + moon + moon orbit +asteroid field +deep space + +leaving a planet is hard +leaving a moon is less hard +leaving orbit is easy +leaving an asteroid belt is easy +leaving deep space / asteroid fields is free + +travel from within a planetary system (planet-moon, moon-moon) is easy +travel from between a planetary systems (or to the star) is difficult +travel between solar systems is very hard +travel to-from deep space difficult + +Of just have a generic asteroid field that is the deep space option and is the bridge between all. + +it is easier to go from star to deep space to star than star to star +]]-- + + +Universe.planet_max_radius = 10000 +-- average is 4000 +-- moon max_radius is 50% of it's own planet's actual radius +-- average is 1600 + +-- NOTE: there are limited numbers of names so more moons means less planets +Universe.average_moons_per_planet = 3 +Universe.max_asteroid_belts = 2 +Universe.stellar_average_separation = 50 +Universe.stellar_min_separation = 25 + +Universe.temperature_tags = {"temperature_bland", "temperature_temperate", "temperature_midrange", "temperature_balanced", "temperature_wild", "temperature_extreme", + "temperature_cool", "temperature_cold", "temperature_vcold", "temperature_frozen", + "temperature_warm", "temperature_hot", "temperature_vhot", "temperature_volcanic"} +Universe.water_tags = {"water_none", "water_low", "water_med", "water_high", "water_max"} +Universe.moisture_tags = {"moisture_none", "moisture_low", "moisture_med", "moisture_high", "moisture_max"} +Universe.trees_tags = {"trees_none", "trees_low", "trees_med", "trees_high", "trees_max"} +Universe.aux_tags = {"aux_very_low", "aux_low", "aux_med", "aux_high", "aux_very_high"} +Universe.cliff_tags = {"cliff_none", "cliff_low", "cliff_med", "cliff_high", "cliff_max"} +Universe.enemy_tags = {"enemy_none", "enemy_very_low", "enemy_low", "enemy_med", "enemy_high", "enemy_very_high", "enemy_max"} + +Universe.default_resource_order = { + "iron-ore", "copper-ore", "uranium-ore", + "coal", "crude-oil", "stone", + mod_prefix.."vulcanite", mod_prefix.."cryonite", mod_prefix.."vitamelange", + mod_prefix.."naquium-ore", mod_prefix.."methane-ice", mod_prefix.."water-ice", + mod_prefix.."beryllium-ore", mod_prefix.."iridium-ore", mod_prefix.."holmium-ore" +} + +Universe.resource_word_rules = { + not_space = { + "oil", "coal", "bio", "wood", "petro", -- anything biological + "gas", "vent", "water", "liquid", "hydro", "thermal", -- anything liquid, gas, or hot + "imersite", "menarite", -- krastorio + "vitamelange", "vulcanite", "cryonite", "iridium", "holmium" + }, + not_orbit = { + "naquium", "beryllium" + }, + not_asteroid_belt = { + "naquium" + }, + not_asteroid_field = { + "beryllium" + }, + not_planet = { + "helium", "space", "asteroid", + mod_prefix.."water-ice", mod_prefix.."methane-ice", mod_prefix.."naquium-ore" + }, + not_homeworld = { + "vitamelange", "vulcanite", "cryonite", "beryllium", "iridium", "holmium", "naquium", + "imersite" + } +} + +Universe.resource_setting_overrides = { + [mod_prefix.."water-ice"] = { -- becuase water keyword gets excluded from space + allowed_for_zone = { + ["asteroid-orbit"] = true, + ["asteroid-belt"] = true, + ["asteroid-field"] = true, + } + }, + [mod_prefix.."vulcanite"] = { + tags_required_for_presence = {"temperature_extreme", "temperature_warm", "temperature_hot", "temperature_vhot", "temperature_volcanic"}, + tags_required_for_primary = {"temperature_vhot", "temperature_volcanic"}, + yeild_affected_by = {temperature = 1} + }, + [mod_prefix.."cryonite"] = { + tags_required_for_presence = {"temperature_extreme", "temperature_cool", "temperature_cold", "temperature_vcold", "temperature_frozen"}, + tags_required_for_primary = {"temperature_vcold", "temperature_frozen"}, + yeild_affected_by = {temperature = -1} + }, + [mod_prefix.."vitamelange"] = { + tags_required_for_presence = {"moisture_med", "moisture_high", "moisture_max"}, + tags_required_for_primary = {"moisture_high", "moisture_max"}, + yeild_affected_by = {moisture = 1}, + excludes = {mod_prefix .. "beryllium-ore", mod_prefix .. "iridium-ore", mod_prefix .. "holmium-ore"}, -- excludes should mutually agree exclusion + }, + [mod_prefix.."beryllium-ore"] = { + excludes = {mod_prefix .. "iridium-ore", mod_prefix .. "holmium-ore", mod_prefix .. "vitamelange"}, -- excludes should mutually agree exclusion + }, + [mod_prefix.."iridium-ore"] = { + excludes = {mod_prefix .. "beryllium-ore", mod_prefix .. "holmium-ore", mod_prefix .. "vitamelange"}, -- excludes should mutually agree exclusion + }, + [mod_prefix.."holmium-ore"] = { + excludes = {mod_prefix .. "beryllium-ore", mod_prefix .. "iridium-ore", mod_prefix .. "vitamelange"}, -- excludes should mutually agree exclusion + }, +} + +Universe.special_type_to_resource = { + beryllium = mod_prefix.."beryllium-ore", + holmium = mod_prefix.."holmium-ore", + iridium = mod_prefix.."iridium-ore", + vitamelange = mod_prefix.."vitamelange", + cryonite = mod_prefix.."cryonite", + vulcanite = mod_prefix.."vulcanite", + haven = "crude-oil", +} + +Universe.resource_min_change_to_regenerate = 0.1 +Universe.resource_max_change_to_regenerate = 10 + +Universe.resource_primary_boost = 0.5 -- added to the base bias of 100%. Applied before resource power. +Universe.resource_secondary_irregularity = 0.75 +Universe.resource_power = 1.5 -- the curve of resource bias. the resource value is put to this power. + +-- Note: These ranges apply based on 0% being the first value, 100% being the second value +-- The primary resource is oevr 100%, based on Universe.resource_primary_boost +Universe.category_resource_properties = { + homeworld = { + primary_boost = Universe.resource_primary_boost, + secondary_irregularity = Universe.resource_secondary_irregularity, + power = Universe.resource_power, + frequency = {0.2, 1}, + size = {0, 2}, + richness = {0.1, 2}, + }, + planet = { + primary_boost = Universe.resource_primary_boost, + secondary_irregularity = Universe.resource_secondary_irregularity, + power = Universe.resource_power, + frequency = {0.2, 1}, + size = {0, 2}, + richness = {0.1, 2}, + }, + ["asteroid-belt"] = { + primary_boost = Universe.resource_primary_boost, + secondary_irregularity = Universe.resource_secondary_irregularity, + power = Universe.resource_power, + frequency = {1, 10}, + size = {0, 10}, + richness = {0.2, 10}, + }, + anomaly = { + primary_boost = Universe.resource_primary_boost, + secondary_irregularity = Universe.resource_secondary_irregularity, + power = Universe.resource_power, + frequency = {1, 4}, + size = {0, 4}, + richness = {0.2, 2}, + }, + ["asteroid-field"] = { + primary_boost = Universe.resource_primary_boost, + secondary_irregularity = Universe.resource_secondary_irregularity, + power = Universe.resource_power, + frequency = {1, 4}, + size = {0, 4}, + richness = {0.2, 2}, + }, + orbit = { + primary_boost = Universe.resource_primary_boost, + secondary_irregularity = Universe.resource_secondary_irregularity, + power = Universe.resource_power, + frequency = {1, 4}, + size = {0, 4}, + richness = {0.2, 2}, + }, +} + +function Universe.rebuild_resource_assignments() + global.resources_and_controls_compare_string = nil + Universe.load_resource_data() +end + +function Universe.build () + log("Building Universe.") + + global.rng = game.create_random_generator() + -- Creates a deterministic standalone random generator with the given seed or if a seed is not provided the initial map seed is used. + -- rng() + -- If no parameters are given a number in the [0, 1) range is returned. + -- If a single parameter is given a floored number in the [0, N] range is returned. + -- If 2 parameters are given a floored number in the [N1, N2] range is returned. + + ------------------------------------------------------------------------------ + -- structure variables + + local protouniverse = table.deepcopy(UniverseRaw.universe) + local unassigned_planets = table.deepcopy(UniverseRaw.unassigned_planets) + local unassigned_moons = table.deepcopy(UniverseRaw.unassigned_moons) + local unassigned_planets_or_moons = table.deepcopy(UniverseRaw.unassigned_planets_or_moons) + + local n_stars = #protouniverse.stars + local npm_names = #unassigned_planets + #unassigned_moons + #unassigned_planets_or_moons + + local average_planets_per_star = npm_names / (Universe.average_moons_per_planet + 1) / n_stars + + local requested_planets = global.rng(math.floor(average_planets_per_star * 0.9 * n_stars), math.ceil(average_planets_per_star * 1.1 * n_stars)) + local requested_moons = #unassigned_moons + #unassigned_planets_or_moons - requested_planets + + local min_planets_per_star = math.max(2, math.floor(average_planets_per_star / 2)) + local high_planets_per_star = average_planets_per_star * 1.5 -- less likely to be above this + local high_moons_per_planet = Universe.average_moons_per_planet * 1.5 -- less likely to be above this + + ------------------------------------------------------------------------------ + -- build srtucture + + local all_planets = {} + table.insert(all_planets, protouniverse.stars[1].children[1]) -- nauvis + protouniverse.stars[1].children[1].is_homeworld = true + Log.debug_log("Universe.build protouniverse.stars[1].children[1].name=" .. protouniverse.stars[1].children[1].name, "universe") + + local all_moons = {} + + Universe.shuffle(unassigned_moons) + Universe.shuffle(protouniverse.stars) + Universe.shuffle(unassigned_planets) + Universe.shuffle(unassigned_planets_or_moons) + + for _, star in pairs(protouniverse.stars) do + star.children = star.children or {} + end + + -- add the unassigned planets to random stars + for _, proto_planet in pairs(unassigned_planets) do + local planet = {name = proto_planet.name} + table.insert(protouniverse.stars[global.rng(1, #protouniverse.stars)].children, planet) + table.insert(all_planets, planet) + end + unassigned_planets = {} + + -- fill minimum of # planets per star + for _, star in pairs(protouniverse.stars) do + while #star.children < min_planets_per_star and #unassigned_planets_or_moons > 0 do + local proto_planet = unassigned_planets_or_moons[#unassigned_planets_or_moons] + unassigned_planets_or_moons[#unassigned_planets_or_moons] = nil + local planet = {name = proto_planet.name} + table.insert(star.children, planet) + table.insert(all_planets, planet) + end + end + + -- build remaining planets + while #all_planets < requested_planets and #unassigned_planets_or_moons > 0 do + local star = protouniverse.stars[global.rng(1, #protouniverse.stars)] + if #star.children < high_planets_per_star or global.rng() < 0.25 then -- 25% to ignore limit + local proto_planet = unassigned_planets_or_moons[#unassigned_planets_or_moons] + unassigned_planets_or_moons[#unassigned_planets_or_moons] = nil + local planet = {name = proto_planet.name} + table.insert(star.children, planet) + table.insert(all_planets, planet) + end + end + + -- add the unassigned moons to random planets + for _, proto_moon in pairs(unassigned_moons) do + local planet = all_planets[global.rng(1, #all_planets)] + planet.children = planet.children or {} + local moon = {name = proto_moon.name} + table.insert(planet.children, moon) + table.insert(all_moons, moon) + end + unassigned_moons = {} + + -- min 1 moon per planet + for _, planet in pairs(all_planets) do + planet.children = planet.children or {} + if #planet.children < high_moons_per_planet then + local proto_moon = unassigned_planets_or_moons[#unassigned_planets_or_moons] + unassigned_planets_or_moons[#unassigned_planets_or_moons] = nil + local moon = {name = proto_moon.name} + table.insert(planet.children, moon) + table.insert(all_moons, moon) + end + end + + -- build remaining moons + while #all_moons < requested_moons and #unassigned_planets_or_moons > 0 do + local planet = all_planets[global.rng(1, #all_planets)] + planet.children = planet.children or {} + if #planet.children < high_moons_per_planet or global.rng() < 0.25 then -- 25% to ignore limit + local proto_moon = unassigned_planets_or_moons[#unassigned_planets_or_moons] + unassigned_planets_or_moons[#unassigned_planets_or_moons] = nil + local moon = {name = proto_moon.name} + table.insert(planet.children, moon) + table.insert(all_moons, moon) + end + end + + -- position the stars + -- global.universe_scale is effectivly the width of the universe + global.universe_scale = math.sqrt(#protouniverse.stars + #protouniverse.space_zones) * Universe.stellar_average_separation + + local function random_stellar_position(zone, distance_multiplier) + distance_multiplier = distance_multiplier or 1 + local orientation = global.rng() + local distance = global.rng() * global.universe_scale * distance_multiplier + local position = Util.orientation_to_vector(orientation, distance) + zone.stellar_position = Util.orientation_to_vector(orientation, distance) + end + + local zone_index = {} + local zones_by_name = {} + + table.insert(zone_index, protouniverse.anomaly) + protouniverse.anomaly.index = #zone_index + zones_by_name[protouniverse.anomaly.name] = protouniverse.anomaly + + -- stellar cluster seeded, now shuffle and build: + for s, star in pairs(protouniverse.stars) do + + star.type = "star" + if star.name == "Calidus" then + random_stellar_position(star, 0.1) + else + random_stellar_position(star) + end + star.orbit = { + type = "orbit", + name = star.name .. " Orbit", + parent = star + } + + table.insert(zone_index, star) + star.index = #zone_index + zones_by_name[star.name] = star + + table.insert(zone_index, star.orbit) + star.orbit.index = #zone_index + zones_by_name[star.orbit.name] = star.orbit + + -- Insert asteroid belts + local add_asteroid_belts = global.rng(1, Universe.max_asteroid_belts) + star.star_gravity_well = 10 + #star.children + add_asteroid_belts + + Universe.shuffle(star.children) + + for i = 1, add_asteroid_belts do + table.insert(star.children, math.floor(0.4 + global.rng() + #star.children * i / add_asteroid_belts), + { + type = "asteroid-belt", + name = star.name .. " Asteroid Belt " .. i -- Warning, must be updated after shuffle + }) + end + + for p, planet in pairs(star.children) do -- make Nauvis the first planet + if planet.name == "Nauvis" and p > 1 then -- swap positions + local was_index = p + local other = star.children[1] + star.children[1] = planet + star.children[was_index] = other + end + end + + local asteroid_belts = 0 + for p, planet in pairs(star.children) do + planet.star_gravity_well = star.star_gravity_well * (0.5 + 0.8 * (#star.children - p) / #star.children) + if planet.name == "Nauvis" then + Log.debug_log("Nauvis is homeworld","universe") + planet.is_homeworld = true + planet.surface_index = 1 + end + + table.insert(zone_index, planet) + planet.index = #zone_index + zones_by_name[planet.name] = planet + + if planet.type == "asteroid-belt" then + asteroid_belts = asteroid_belts + 1 + planet.name = star.name .. " Asteroid Belt " .. asteroid_belts + planet.parent = star + else + local planet_prototype = Universe.get_zone_prototype(planet.name) + planet.children = planet.children or {} + planet.type = "planet" + planet.radius_multiplier = 0.4 + 0.6 * math.pow(global.rng(), 2) -- need to consistently call rng even if prototype.radius_multiplier is defined + if planet_prototype and planet_prototype.radius_multiplier then + planet.radius_multiplier = planet_prototype.radius_multiplier + end + planet.radius = Universe.planet_max_radius * planet.radius_multiplier + planet.planet_gravity_well = 10 * (1 + planet.radius_multiplier) + #planet.children -- 12-20 + n_children = 13 to 26 + planet.climate = planet.climate or {} + planet.parent = star + planet.orbit = { + type = "orbit", + name = planet.name .. " Orbit", + parent = planet + } + + table.insert(zone_index, planet.orbit) + planet.orbit.index = #zone_index + zones_by_name[planet.orbit.name] = planet.orbit + + Universe.shuffle(planet.children) + Universe.planet_gravity_well_distribute(planet) + for m, moon in pairs(planet.children) do + local moon_prototype = Universe.get_zone_prototype(moon.name) + moon.type = "moon" + --moon.star_gravity_well = planet.star_gravity_well + --moon.planet_gravity_well = planet.planet_gravity_well * (0.1 + 0.5 * (#planet.children - m) / #planet.children) + moon.radius_multiplier = 0.2 + 0.8 * math.pow(global.rng(), 2) + if moon_prototype and moon_prototype.radius_multiplier then + moon.radius_multiplier = moon_prototype.radius_multiplier + end + moon.radius = planet.radius / 2 * moon.radius_multiplier + moon.climate = moon.climate or {} + moon.parent = planet + moon.orbit = { + type = "orbit", + name = moon.name .. " Orbit", + parent = moon + } + + table.insert(zone_index, moon) + moon.index = #zone_index + zones_by_name[moon.name] = moon + + table.insert(zone_index, moon.orbit) + moon.orbit.index = #zone_index + zones_by_name[moon.orbit.name] = moon.orbit + end + end + end + end + + Universe.shuffle(protouniverse.space_zones) + for z, zone in pairs(protouniverse.space_zones) do + zone.type = zone.type or "asteroid-field" + table.insert(zone_index, zone) + zone.index = #zone_index + zones_by_name[zone.name] = zone + random_stellar_position(zone) + end + + -- Assign seeds and climates + for _, zone in pairs(zone_index) do + zone.seed = global.rng(4294967295) + Universe.inflate_climate_controls(zone) + end + + --log("Compiled universe Data: " .. serpent.block( protouniverse, {comment = false, numformat = '%1.8g' } )) + + -- enforce separation + if protouniverse then + global.universe = protouniverse + global.zone_index = zone_index + global.zones_by_name = zones_by_name + global.zones_by_surface = {} + end + + Universe.separate_stellar_position() + -- once the above is done do the remaining home system validation. This is so the same code can be used for multipleyer home system initialisation. + Universe.make_validate_homesystem(global.zones_by_name["Nauvis"]) + + -- resource assignment + global.resources_and_controls_compare_string = nil -- force udpate + Universe.load_resource_data() + + for _, star in pairs(global.universe.stars) do + Universe.star_gravity_well_distribute(star) + end + + + log("Building Universe complete.") +end + +function Universe.separate_stellar_position() + + local stellar_positions = {} + for _, zone in pairs(global.zone_index) do + if zone.type == "star" or zone.type == "asteroid-field" then + table.insert(stellar_positions, zone.stellar_position) + end + end + stellar_positions = Util.separate_points(stellar_positions, Universe.stellar_min_separation) + local i = 0 + for _, zone in pairs(global.zone_index) do + if zone.type == "star" or zone.type == "asteroid-field" then + i = i + 1 + if zone.stellar_position.x ~= stellar_positions[i].x or zone.stellar_position.y ~= stellar_positions[i].y then + if global.spaceships then -- if spaceship positions are not also changed they end up in a virtual gravity well. + for _, spaceship in pairs(global.spaceships) do + if spaceship.stellar_position and spaceship.stellar_position.x == zone.stellar_position.x and spaceship.stellar_position.y == zone.stellar_position.y then + spaceship.stellar_position = table.deepcopy(stellar_positions[i]) + end + end + end + log(zone.name .." moved from "..zone.stellar_position.x..", "..zone.stellar_position.y.." to "..stellar_positions[i].x..", "..stellar_positions[i].y) + zone.stellar_position = stellar_positions[i] + end + end + end +end + +function Universe.build_resources() + Log.debug_log("build_resources: start.", "universe") + + -- Don't affect zone.controls, zone.resource_controls, or zone.primary_resource, zone.fragment_name + -- use zone.new_controls, zone.new_resource_controls zone.new_primary_resource, zone.new_fragment_name + -- need to separate controls and resource controls. + + local resource_settings = global.resources_and_controls.resource_settings + + -- Define a set resource processing order for less variablity on data changes. + -- Order is the secondary sorting order. + -- resources have selection priority if they have criteria, they will choose zones first. + --The resource rolling order should start with all vanilla and SE resources first so their values are most consistent. + local resource_order = table.deepcopy(Universe.default_resource_order) + for resource_name, resource_setting in pairs(resource_settings) do + if not util.table_contains(resource_order, resource_name) then + table.insert(resource_order, resource_name) + end + end + Log.debug_log("build_resources: resource_order is:", "universe") + Log.debug_log(serpent.block(resource_order), "universe") + + -- get the seed + if not global.seed then + global.seed = game.surfaces[1].map_gen_settings.seed + end + + -- make a rng for any missing zone seeds + -- all zones need seeds + -- can't be consecutive do to similar map gen seeds having nearly identical results. + local zone_seed_rng = game.create_random_generator(global.seed) + for _, zone in pairs(global.zone_index) do + Zone.validate_controls(zone.controls) -- somehow non-string keys ended up in previos versions, they cause errors later + if not zone.seed then + zone.seed = zone_seed_rng(4294967295) + end + Zone.delete_surface(zone) -- try + Universe.inflate_climate_controls(zone) + zone.new_primary_resource = nil + zone.new_fragment_name = nil + zone.strong_claims = {} + end + + -- Calculate random resource bias (0-1) values for each resource type on each zone. Still roll even for invalid resources so if settings change it wont skew everything. + -- Make an ordered bias value set whwere the resources are ordered based on base bias and the divided evenly over the 1-0 range, then add the original bias at 1/100 as a minor factor. + for _, zone in pairs(global.zone_index) do + local zone_resource_bias_nrg = game.create_random_generator(zone.seed) + zone.ordered_resource_bias = {} -- indexed + zone.resource_bias = {} -- named + -- DO NOT skip resources that aren't needed otherwise turning on/off a resource changes the results of others. + -- DO NOT check if vanilla/SE resource are still valid is that will also affect other rolls. + for _, resource_name in pairs(resource_order) do + local bias = { + resource_name = resource_name, + base_bias = zone_resource_bias_nrg(), + } + table.insert(zone.ordered_resource_bias, bias) + zone.resource_bias[resource_name] = bias + local prototype = Universe.get_zone_prototype(zone.name) + if prototype and prototype.preset_resource_bias and prototype.preset_resource_bias[resource_name] then + Log.debug_log("build_resources: "..zone.name.." has preset bias for "..resource_name.." " ..prototype.preset_resource_bias[resource_name], "universe") + bias.base_bias = prototype.preset_resource_bias[resource_name] + end + end + table.sort(zone.ordered_resource_bias, function(a,b) return a.base_bias > b.base_bias end) + -- zone.resource_bias sorted highest first + for i = 1, #zone.ordered_resource_bias do + zone.ordered_resource_bias[i].ordered_bias = (#zone.ordered_resource_bias-i)/#zone.ordered_resource_bias + zone.ordered_resource_bias[i].base_bias / #zone.ordered_resource_bias + -- ordered_bias means less variablity during later selection step + -- ordered_bias is the minor basis for resource claiming zone + -- major basis is whether it qualifies based on tags. + end + end + Log.debug_log("build_resources: example of zone.ordered_resource_bias:", "universe") + Log.debug_log(serpent.block(global.zone_index[1].ordered_resource_bias), "universe") + -- Mark each resource's claim. The major part is if it is part of resource requirements, the minor part is the random fsr. + + + -- build the list of resource categories + global.zones_by_resource_balance_categories = { + homeworld = {}, + planet = {}, -- and moons, not homeworlds + anomaly = {}, + ["asteroid-belt"] = {}, + ["asteroid-field"] = {}, + orbit = {}, -- any orbit type or star + } + Log.debug_log("build_resources: resource_balance_categories are:", "universe") + Log.debug_log(serpent.block(global.zones_by_resource_balance_categories), "universe") + for category_name, zrbc in pairs(global.zones_by_resource_balance_categories) do + zrbc.quota = {} -- zone count targets per resource are added here + zrbc.assigned = {} -- zones qith valid primay resources get put here in a subtable of the resource + zrbc.assigned_special = {} -- special assignement is ignored by the whole assigment system. + zrbc.unassigned = {} -- zones needing a primary resource go here + zrbc.zones_normal_total = 0 + zrbc.primary_resource_options = {} + if category_name == "homeworld" or category_name == "anomaly" then + zrbc.primary_resource_options = {"stone"} + zrbc.assigned["stone"] = {} + zrbc.assigned_special["stone"] = {} + else + for resource_name, resource_setting in pairs(resource_settings) do + if resource_setting.can_be_primary and resource_setting.allowed_for_zone[category_name] and (resource_setting.core_fragment or category_name ~= "planet") then + table.insert(zrbc.primary_resource_options, resource_name) + zrbc.quota[resource_name] = 0 + zrbc.assigned[resource_name] = {} + zrbc.assigned_special[resource_name] = {} + end + end + end + end + + -- split all zones into their resource_balance_categories + -- if a zone has a fixed primary resource, set that and put into an assigned pile. + for _, zone in pairs(global.zone_index) do + local resource_balance_category = Universe.get_zone_resource_balance_category(zone) + local zrbc = global.zones_by_resource_balance_categories[resource_balance_category] + local assigned_by_special = false + if resource_balance_category == "anomaly" then + zone.new_primary_resource = "stone" + Log.debug_log("build_resources: zone "..zone.name.." ("..resource_balance_category..") is locked to primary: "..zone.new_primary_resource , "universe") + elseif resource_balance_category == "homeworld" then + zone.new_primary_resource = "stone" + Log.debug_log("build_resources: zone "..zone.name.." ("..resource_balance_category..") is locked to primary: "..zone.new_primary_resource , "universe") + else + if zone.special_type then -- note: this is mainly for the beryllium asteroid belt, the moons already have the resource in the prototype + local resource = Universe.special_type_to_resource[zone.special_type] + if resource then + if util.table_contains(zrbc.primary_resource_options, resource) then + assigned_by_special = true + zone.new_primary_resource = resource + Log.debug_log("build_resources: zone "..zone.name.." ("..resource_balance_category..") has special link to primary: "..zone.new_primary_resource , "universe") + else + Log.debug_log("build_resources: zone "..zone.name.." ("..resource_balance_category..") has special link to primary ("..resource..") but the resource is not valid", "universe") + end + end + end + if not assigned_by_special then + local prototype = Universe.get_zone_prototype(zone.name) + if prototype and prototype.primary_resource then + if util.table_contains(zrbc.primary_resource_options, prototype.primary_resource) then + zone.new_primary_resource = prototype.primary_resource + Log.debug_log("build_resources: zone "..zone.name.." ("..resource_balance_category..") is prototyped to primary: "..zone.new_primary_resource , "universe") + else + Log.debug_log("build_resources: zone "..zone.name.." ("..resource_balance_category..") is prototyped to primary ("..prototype.primary_resource ..") but the resource is not valid", "universe") + end + end + end + end + if resource_balance_category == "homeworld" then + zone.new_fragment_name = util.mod_prefix .. "core-fragment-omni" + Log.debug_log("build_resources: zone "..zone.name.." ("..resource_balance_category..") is locked to fragment: "..zone.new_fragment_name , "universe") + end + if not assigned_by_special then + zrbc.zones_normal_total = zrbc.zones_normal_total + 1 -- exclude special + end + -- either add to the an assigned pool or the unassigned pool + if zone.new_primary_resource then + if not assigned_by_special then + table.insert(zrbc.assigned[zone.new_primary_resource], zone) + else + table.insert(zrbc.assigned_special[zone.new_primary_resource], zone) + end + else + table.insert(zrbc.unassigned, zone) + end + end + + -- Zone-Resource assignement + for resource_balance_category, zrbc in pairs(global.zones_by_resource_balance_categories) do + + Log.debug_log( "build_resources: begin for zone resource_balance_category (zrbc): " .. resource_balance_category, "universe") + Log.debug_log( "build_resources: " .. resource_balance_category.." total zones in category: ("..zrbc.zones_normal_total..")", "universe") + --Log.debug_log( "build_resources: " .. resource_balance_category.." list of unassigned zones: ("..#zrbc.unassigned..")", "universe") + --for _, zone in pairs(zrbc.unassigned) do + -- Log.debug_log( "build_resources: " .. resource_balance_category.." unassigned zone "..zone.name, "universe") + --end + + -- anomaly and homeworld already should have all zones assigned + if resource_balance_category ~= "anomaly" and resource_balance_category ~= "homeworld" then + + -- Next decide how many zones get each resource type. + local zones_per_resource_min = math.floor(zrbc.zones_normal_total / #zrbc.primary_resource_options) + Log.debug_log( "build_resources: " .. resource_balance_category.." min zones per resource : "..zones_per_resource_min, "universe") + local remainder = zrbc.zones_normal_total % #zrbc.primary_resource_options + Log.debug_log( "build_resources: " .. resource_balance_category.." remainder : "..remainder, "universe") + + local quotas_total = 0 + local quota_index = 0 + for i, resource_name in pairs(resource_order) do + if zrbc.quota[resource_name] then + quota_index = quota_index + 1 + zrbc.quota[resource_name] = zones_per_resource_min + (quota_index <= remainder and 1 or 0) + quotas_total = quotas_total + zrbc.quota[resource_name] + Log.debug_log( "build_resources: "..resource_balance_category.." quota for " .. resource_name.." = " .. zrbc.quota[resource_name], "universe") + + -- First, if any resource is above quota, drop resources. + if #zrbc.assigned[resource_name] > zrbc.quota[resource_name] then + Log.debug_log( "build_resources: "..resource_balance_category.." has " .. resource_name.." assigned: " .. #zrbc.assigned[resource_name], "universe") + local resource_assigned = zrbc.assigned[resource_name] + table.sort(resource_assigned, function(a,b) return a.resource_bias[resource_name].ordered_bias > b.resource_bias[resource_name].ordered_bias end) -- lowest bias is last + while #zrbc.assigned[resource_name] > zrbc.quota[resource_name] do + local last_zone = resource_assigned[#resource_assigned] + Log.debug_log( "build_resources: "..resource_balance_category.." unassign " .. resource_name.." from: " .. last_zone.name, "universe") + table.remove(resource_assigned, #resource_assigned) + table.insert(zrbc.unassigned, last_zone) + end + end + end + end + + + Log.debug_log( "build_resources: " .. resource_balance_category.." quotas total : "..quotas_total, "universe") + if quotas_total ~= zrbc.zones_normal_total then + error("build_resources: " .. resource_balance_category.." quotas total : "..quotas_total.." does not equal "..zrbc.zones_normal_total) + end + + Log.debug_log( "build_resources: " .. resource_balance_category.." currently unassigned: "..#zrbc.unassigned, "universe") + for resource_name, quota in pairs(zrbc.quota) do + Log.debug_log( "build_resources: " .. resource_balance_category.." "..resource_name.." "..#zrbc.assigned[resource_name].." / "..quota, "universe") + end + + Log.debug_log( "build_resources: begin assign uncontested strong claims", "universe") + --On the first pass. do only resources with strict requirements. Only assign based on uncontested major claims. + local has_strong_claims = false + local uncontested_claimed_zones = {} -- split by resource name + local all_strong_claims = {} -- single list of zones + + for _, zone in pairs(zrbc.unassigned) do + -- make strong claims + for _, resource_name in pairs(resource_order) do + local resource_setting = resource_settings[resource_name] + if zrbc.assigned[resource_name] and #zrbc.assigned[resource_name] < zrbc.quota[resource_name] then -- validates resource_name + -- don't bother with resources already at quota + local tags_required = resource_setting.tags_required_for_primary or resource_setting.tags_required_for_presence + if tags_required then + local has_required_tag = false + for _, tag in pairs(tags_required) do + if Util.table_contains(zone.tags, tag) then + has_required_tag = true + break + end + end + if has_required_tag then + zone.strong_claims = zone.strong_claims or {} + zone.strong_claims[resource_name] = 1 -- TODO maybe can weight this more, + has_strong_claims = true + Log.debug_log( "build_resources: "..resource_balance_category.." has strong claim " .. resource_name.." for: " .. zone.name, "universe") + end + end + end + end + if zone.strong_claims then + if table_size(zone.strong_claims) == 1 then + for resource_name, weight in pairs(zone.strong_claims) do + uncontested_claimed_zones[resource_name] = uncontested_claimed_zones[resource_name] or {} + table.insert(uncontested_claimed_zones[resource_name], zone) + Log.debug_log( "build_resources: "..resource_balance_category.." has uncontested claim " .. resource_name.." for: " .. zone.name, "universe") + end + end + if table_size(zone.strong_claims) > 0 then + table.insert(all_strong_claims, zone) + end + end + end + + if has_strong_claims then + Log.debug_log( "build_resources: "..resource_balance_category.." # strong claims: "..#all_strong_claims, "universe") + for resource_name, zones in pairs(uncontested_claimed_zones) do + table.sort(zones, function(a,b) return a.resource_bias[resource_name].ordered_bias > b.resource_bias[resource_name].ordered_bias end) -- highest first + while #zones > 0 and #zrbc.assigned[resource_name] < zrbc.quota[resource_name] do + local zone = zones[1] + zone.new_primary_resource = resource_name + if resource_balance_category == "planet" then + zone.new_fragment_name = resource_settings[resource_name].core_fragment + end + table.remove(zones, 1) + util.remove_from_table(zrbc.unassigned, zone) + util.remove_from_table(all_strong_claims, zone) + table.insert(zrbc.assigned[resource_name], zone) + Log.debug_log( "build_resources: "..resource_balance_category.." assign " .. resource_name.." to: " .. zone.name .. " (uncontested)", "universe") + end + end + + end + + Log.debug_log( "build_resources: end assign uncontested strong claims", "universe") + + Log.debug_log( "build_resources: " .. resource_balance_category.." currently unassigned: "..#zrbc.unassigned, "universe") + for resource_name, quota in pairs(zrbc.quota) do + Log.debug_log( "build_resources: " .. resource_balance_category.." "..resource_name.." "..#zrbc.assigned[resource_name].." / "..quota, "universe") + end + --On the 2nd pass. do only resources with strict requirements. Do the contested major claims. + -- loop repeatedly beased on whichever resource has the fewest assigned zones so far. Go with yout highest claim. + Log.debug_log( "build_resources: begin assign strong claims", "universe") + + if has_strong_claims then + if #all_strong_claims > 0 then + local max_zones = 0 + local resource_pointer = 1 + while #all_strong_claims > 0 and max_zones <= zones_per_resource_min do + local resource_name = resource_order[resource_pointer] + local resource_setting = resource_settings[resource_name] + if resource_setting and (resource_setting.tags_required_for_primary or resource_setting.tags_required_for_presence) + and zrbc.assigned[resource_name] and #zrbc.assigned[resource_name] < zrbc.quota[resource_name] and #zrbc.assigned[resource_name] <= max_zones then + table.sort(all_strong_claims, function(a,b) return a.resource_bias[resource_name].ordered_bias > b.resource_bias[resource_name].ordered_bias end) -- highest bias is first + local zone = all_strong_claims[1] + zone.new_primary_resource = resource_name + if resource_balance_category == "planet" then + zone.new_fragment_name = resource_settings[resource_name].core_fragment + end + table.remove(all_strong_claims, 1) + util.remove_from_table(zrbc.unassigned, zone) + table.insert(zrbc.assigned[resource_name], zone) + Log.debug_log( "build_resources: "..resource_balance_category.." assign " .. resource_name.." to: " .. zone.name .. " (contested strong claim)", "universe") + end + resource_pointer = resource_pointer + 1 + if resource_pointer > #resource_order then + resource_pointer = 1 + max_zones = max_zones + 1 + end + end + else + Log.debug_log( "build_resources: "..resource_balance_category.." have no remaining strong claims.", "universe") + end + + end + + Log.debug_log( "build_resources: end assign strong claims", "universe") + + Log.debug_log( "build_resources: " .. resource_balance_category.." currently unassigned: "..#zrbc.unassigned, "universe") + for resource_name, quota in pairs(zrbc.quota) do + Log.debug_log( "build_resources: " .. resource_balance_category.." "..resource_name.." "..#zrbc.assigned[resource_name].." / "..quota, "universe") + end + + Log.debug_log( "build_resources: begin assign resources with strict requirement", "universe") + --On the 3rd pass, if there are resources with strict requirements that still need to meet a quota, climate needs to be changed. + -- Make a pool of all the zones with no fixed climate tags. + -- Find the zone with the highest rolled bias. Change that ones climate to fill the quota. + local max_zones = zones_per_resource_min + 1 + local criteria_resources_lacking_zones = {} -- resource_names + for _, resource_name in pairs(resource_order) do + local resource_setting = resource_settings[resource_name] + if resource_setting and (resource_setting.tags_required_for_primary or resource_setting.tags_required_for_presence) + and zrbc.assigned[resource_name] and #zrbc.assigned[resource_name] < zrbc.quota[resource_name] then + table.insert(criteria_resources_lacking_zones, resource_name) + max_zones = math.min(max_zones, #zrbc.assigned[resource_name]) + end + end + + local resource_pointer = 1 + while #all_strong_claims > 0 and max_zones <= zones_per_resource_min do + local resource_name = criteria_resources_lacking_zones[resource_pointer] + if #zrbc.assigned[resource_name] <= max_zones and #zrbc.assigned[resource_name] < zrbc.quota[resource_name] then + -- try to add + table.sort(zrbc.unassigned, function(a,b) return a.resource_bias[resource_name].ordered_bias > b.resource_bias[resource_name].ordered_bias end) -- highest bias is first + local zone = zrbc.unassigned[1] + zone.new_primary_resource = resource_name + if resource_balance_category == "planet" then + zone.new_fragment_name = resource_settings[resource_name].core_fragment + end + util.remove_from_table(zrbc.unassigned, zone) + table.insert(zrbc.assigned[resource_name], zone) + Log.debug_log( "build_resources: "..resource_balance_category.." assign " .. resource_name.." to: " .. zone.name .. " (forced climate change)", "universe") + Universe.fit_climate_to_primary_resource(zone) + end + resource_pointer = resource_pointer + 1 + if resource_pointer > #criteria_resources_lacking_zones then + resource_pointer = 1 + max_zones = max_zones + 1 + end + end + + local resources_below_quota = {} + for _, resource_name in pairs(resource_order) do + if zrbc.assigned[resource_name] and #zrbc.assigned[resource_name] < zrbc.quota[resource_name] then + table.insert(resources_below_quota, resource_name) + end + end + + Log.debug_log( "build_resources: end assign resources with strict requirement", "universe") + + Log.debug_log( "build_resources: " .. resource_balance_category.." currently unassigned: "..#zrbc.unassigned, "universe") + for resource_name, quota in pairs(zrbc.quota) do + Log.debug_log( "build_resources: " .. resource_balance_category.." "..resource_name.." "..#zrbc.assigned[resource_name].." / "..quota, "universe") + end + + Log.debug_log( "build_resources: begin assign resources based on bias winners", "universe") + --On the 4th pass, for each resource, get all the zones where the bias wins over all other. Sort them based on bias value. Assign up to quota as the limit. + for _, resource_name in pairs(resource_order) do + if zrbc.assigned[resource_name] and #zrbc.assigned[resource_name] < zrbc.quota[resource_name] then + local zones_where_resource_won = {} + for _, zone in pairs(zrbc.unassigned) do + if zone.ordered_resource_bias[1].resource_name == resource_name then + table.insert(zones_where_resource_won, zone) + end + end + table.sort(zones_where_resource_won, function(a,b) return a.resource_bias[resource_name].ordered_bias > b.resource_bias[resource_name].ordered_bias end) -- highest bias is first + while #zones_where_resource_won > 0 and #zrbc.assigned[resource_name] < zrbc.quota[resource_name] do + local zone = zones_where_resource_won[1] + zone.new_primary_resource = resource_name + if resource_balance_category == "planet" then + zone.new_fragment_name = resource_settings[resource_name].core_fragment + end + table.remove(zones_where_resource_won, 1) + util.remove_from_table(zrbc.unassigned, zone) + table.insert(zrbc.assigned[resource_name], zone) + Log.debug_log( "build_resources: "..resource_balance_category.." assign " .. resource_name.." to: " .. zone.name .. " (bias won)", "universe") + end + end + end + Log.debug_log( "build_resources: end assign resources based on bias winners", "universe") + + Log.debug_log( "build_resources: " .. resource_balance_category.." currently unassigned: "..#zrbc.unassigned, "universe") + for resource_name, quota in pairs(zrbc.quota) do + Log.debug_log( "build_resources: " .. resource_balance_category.." "..resource_name.." "..#zrbc.assigned[resource_name].." / "..quota, "universe") + end + + Log.debug_log( "build_resources: begin assign resources in turns by highest remaining bias", "universe") + --On the 5th pass, loop through resources based on the fewest assigned zones. Choose the available zone with the highest bias. + local max_zones = zones_per_resource_min + 1 + local resources_lacking_zones = {} -- resource_names + for _, resource_name in pairs(resource_order) do + if zrbc.assigned[resource_name] and #zrbc.assigned[resource_name] < zrbc.quota[resource_name] then + table.insert(resources_lacking_zones, resource_name) + max_zones = math.min(max_zones, #zrbc.assigned[resource_name]) + Log.debug_log( "build_resources: " .. resource_balance_category.." "..resource_name.." still needs "..(zrbc.quota[resource_name]-#zrbc.assigned[resource_name]).." zones", "universe") + end + end + + local resource_pointer = 1 + while #zrbc.unassigned > 0 and max_zones <= zones_per_resource_min + 1 do + local resource_name = resources_lacking_zones[resource_pointer] + if resource_name and #zrbc.assigned[resource_name] <= max_zones and #zrbc.assigned[resource_name] < zrbc.quota[resource_name] then + -- try to add + table.sort(zrbc.unassigned, function(a,b) return a.resource_bias[resource_name].ordered_bias > b.resource_bias[resource_name].ordered_bias end) -- highest bias is first + local zone = zrbc.unassigned[1] + zone.new_primary_resource = resource_name + if resource_balance_category == "planet" then + zone.new_fragment_name = resource_settings[resource_name].core_fragment + end + util.remove_from_table(zrbc.unassigned, zone) + table.insert(zrbc.assigned[resource_name], zone) + Log.debug_log( "build_resources: "..resource_balance_category.." assign " .. resource_name.." to: " .. zone.name .. " (highest remaining bias)", "universe") + end + resource_pointer = resource_pointer + 1 + if resource_pointer > #resources_lacking_zones then + resource_pointer = 1 + max_zones = max_zones + 1 + end + end + Log.debug_log( "build_resources: end assign resources in turns by highest remaining bias", "universe") + + Log.debug_log( "build_resources: " .. resource_balance_category.." currently unassigned: "..#zrbc.unassigned, "universe") + for resource_name, quota in pairs(zrbc.quota) do + Log.debug_log( "build_resources: " .. resource_balance_category.." "..resource_name.." "..#zrbc.assigned[resource_name].." / "..quota, "universe") + end + + -- Primary resource assignment complete + if #zrbc.unassigned > 0 then + error("build_resources: "..resource_balance_category.." assign resources failed: "..#zrbc.unassigned.." are unassigned") + end + Log.debug_log( "build_resources: "..resource_balance_category.." assign resources complete: "..#zrbc.unassigned.." are unassigned", "universe") + end + + end + + Log.debug_log( "build_resources: update zones based on assignments", "universe") + + for _, zone in pairs(global.zone_index) do + local resource_balance_category = Universe.get_zone_resource_balance_category(zone) + Log.debug_log( "build_resources: update zone based on assignments: "..zone.name.."("..resource_balance_category..")", "universe") + if zone.new_fragment_name then + if zone.fragment_name ~= zone.new_fragment_name then + Log.debug_log( "build_resources: zone fragment changed from "..(zone.fragment_name or "nil").. " to ".. zone.new_fragment_name, "universe") + end + zone.fragment_name = zone.new_fragment_name + Coreminer.update_zone_fragment_resources(zone) + end + + local resource_to_regenerate = {} -- list of resource_name + local resource_to_rescale = {} -- dictionary of resource_name = multiplier + if zone.new_primary_resource ~= zone.primary_resource then + Log.debug_log( "build_resources: zone primary_resource changed from "..(zone.primary_resource or "nil").. " to ".. zone.new_primary_resource, "universe resource_changed") + zone.primary_resource = zone.new_primary_resource + end + + -- Recalculate the biases list using the new primary and excluded resourecs information. + -- Get the list of all excluded resources, including excluded by type. + -- specify 0 controls for excluded. + -- update controls for others. + -- compare with existng fsr if any. + zone.ordered_resource_bias = {} + local invalid_resources = {} + + for _, resource_bias in pairs(zone.resource_bias) do + local resource_name = resource_bias.resource_name + local resource_setting = resource_settings[resource_name] + -- check if it is valid + if resource_setting and resource_setting.allowed_for_zone[resource_balance_category] then + local allowed = true + if resource_name ~= zone.new_primary_resource then + -- Apply strict resources restrictions + if resource_setting.tags_required_for_presence then + local has_required_tag = false + local tags_required = resource_setting.tags_required_for_presence + for _, tag in pairs(tags_required) do + if Util.table_contains(zone.tags, tag) then + has_required_tag = true + break + end + end + if not has_required_tag then + allowed = false + table.insert(invalid_resources, resource_name) + Log.debug_log( "build_resources: secondary resource "..resource_name.." excluded by tag requirements from "..zone.name, "universe") + end + end + end + if allowed then + table.insert(zone.ordered_resource_bias, resource_bias) -- important that this is only valid ones now + resource_bias.ordered_bias = resource_bias.base_bias + if resource_name == zone.primary_resource then + resource_bias.ordered_bias = resource_bias.ordered_bias + 1 -- puts at the top + end + end + else + table.insert(invalid_resources, resource_name) + end + end + table.sort(zone.ordered_resource_bias, function(a,b) return a.ordered_bias > b.ordered_bias end) + + -- Apply incompatible resources exclusions + for i = 1, #zone.ordered_resource_bias do + if zone.ordered_resource_bias[i] then + local resource_name = zone.ordered_resource_bias[i].resource_name + local resource_setting = resource_settings[resource_name] + if resource_setting.excludes then + for _, exclude in pairs(resource_setting.excludes) do + for j = i+1, #zone.ordered_resource_bias do + if zone.ordered_resource_bias[j] then + if zone.ordered_resource_bias[j].resource_name == exclude then + Log.debug_log( "build_resources: secondary resource "..exclude.." excluded by higher resource "..resource_name.." from "..zone.name, "universe") + table.insert(invalid_resources, exclude) + table.remove(zone.ordered_resource_bias, j) + j = j - 1 + end + end + end + end + end + end + end + + + local surface = Zone.get_surface(zone) + + if resource_balance_category ~= "homeworld" then + for i = 1, #zone.ordered_resource_bias do + local category_resource_properties = Universe.category_resource_properties[resource_balance_category] + local resource_name = zone.ordered_resource_bias[i].resource_name + local base_bias = zone.ordered_resource_bias[i].base_bias + if i == 1 then + base_bias = 1 + end + local ordered_bias = (#zone.ordered_resource_bias-i)/#zone.ordered_resource_bias + local resource_value = category_resource_properties.secondary_irregularity * base_bias + (1 - category_resource_properties.secondary_irregularity) * ordered_bias + if i == 1 then + resource_value = 1 + category_resource_properties.primary_boost + end + resource_value = math.pow(resource_value, category_resource_properties.power) + zone.ordered_resource_bias[i].resource_value = resource_value + local old_fsr + if surface and zone.controls[resource_name] then + old_fsr = zone.controls[resource_name].frequency * zone.controls[resource_name].size * zone.controls[resource_name].richness + end + zone.controls[resource_name] = { + frequency = category_resource_properties.frequency[1] + resource_value * (category_resource_properties.frequency[2] - category_resource_properties.frequency[1]), + size = category_resource_properties.size[1] + resource_value * (category_resource_properties.size[2] - category_resource_properties.size[1]), + richness = category_resource_properties.richness[1] + resource_value * (category_resource_properties.richness[2] - category_resource_properties.richness[1]) + } + if surface then + if old_fsr == nil then + table.insert(resource_to_regenerate, resource_name) + else + local new_fsr = zone.controls[resource_name].frequency * zone.controls[resource_name].size * zone.controls[resource_name].richness + local fsr_multiplier = new_fsr / old_fsr + Log.debug_log( "build_resources: resource changed "..zone.name .." ("..resource_balance_category..") "..resource_name.." multiplier = "..fsr_multiplier, "universe") + if fsr_multiplier > Universe.resource_max_change_to_regenerate or fsr_multiplier < Universe.resource_min_change_to_regenerate then + table.insert(resource_to_regenerate, resource_name) + else + -- close enough to rescale + resource_to_rescale[resource_name] = fsr_multiplier + end + end + end + end + else -- homeworlds only + -- Save the mapgen settings to controls for quick reading + zone.controls = {} + if surface then + local mapgen = surface.map_gen_settings + for _, resource_name in pairs(resource_order) do + local resource_setting = resource_settings[resource_name] + if resource_setting and resource_setting.allowed_for_zone[resource_balance_category] then + if mapgen.autoplace_controls and mapgen.autoplace_controls[resource_name] then + zone.controls[resource_name] = mapgen.autoplace_controls[resource_name] + end + else + if not util.table_contains(invalid_resources, resource_name) then + error("Homeworld ("..zone.name..") has invalid resource: " .. resource_name) + end + end + end + else + error("Homeworld ("..zone.name..") has no surface") + end + end + Log.debug_log( "build_resources: resource values for: "..zone.name, "universe") + Log.debug_log( serpent.block(zone.ordered_resource_bias), "universe") + + -- remove all invalid + for _, resource_name in pairs(invalid_resources) do + zone.controls = zone.controls or {} + zone.controls[resource_name] = {frequency = 0, size = 0, richness = -1} + Log.debug_log( "build_resources: invalid resource " .. resource_name.." on "..resource_balance_category.." "..zone.name, "universe") + Universe.remove_resource_from_zone_surface(zone, resource_name) + end + + -- if there's still a surface, regenerate those that need it (found earlier) + if surface then + local mapgen = surface.map_gen_settings + Log.debug_log( "build_resources: apply controls to " ..zone.name.." mapgen", "universe") + Log.debug_log( serpent.block(zone.controls), "universe") + Zone.apply_controls_to_mapgen(zone, zone.controls, mapgen) + --Log.debug_log( serpent.block(mapgen), "universe") + surface.map_gen_settings = mapgen + if game.tick < 2 then + for _, resource in pairs(resource_order) do + Universe.remove_resource_from_zone_surface(zone, resource_name) + surface.regenerate_entity(resource_name) + end + else + for resource_name, fsr_multiplier in pairs(resource_to_rescale) do + Log.debug_log( "build_resourcess: rescale resource " .. resource_name.." on "..resource_balance_category.." "..zone.name, "universe") + Universe.rescale_or_regenerate_resource(zone, resource_name, fsr_multiplier) + end + for _, resource_name in pairs(resource_to_regenerate) do + Log.debug_log( "build_resourcess: regenerate resource " .. resource_name.." on "..resource_balance_category.." "..zone.name, "universe") + for _, resource in pairs(surface.find_entities_filtered{name = resource_name}) do + resource.destroy() + end + surface.regenerate_entity(resource_name) + end + end + end + + zone.new_primary_resource = nil + zone.new_fragment_name = nil + zone.resource_bias = nil + zone.ordered_resource_bias = nil + zone.strong_claims = nil + + end + Log.debug_log("build_resources: end.", "universe") +end + + +function Universe.load_resource_data() + -- called during Universe.build() as part of initial setup + -- calles as part of on_configuration_changed to see if resource settings have changed. + -- load data and save to global for reuse and tracking changes + + local resources_and_controls = { + resource_controls = Universe.list_resource_controls(), + core_fragments = Universe.list_core_fragments(), + resource_settings = Universe.load_resource_settings(), + category_resource_properties = table.deepcopy(Universe.category_resource_properties) + } + local compare_string = util.table_to_string(resources_and_controls) + + if global.resources_and_controls_compare_string ~= compare_string then + if global.resources_and_controls -- if there are no old settings don't display the message + --or (global.resources_and_controls and global.resources_and_controls.planet_resources) -- change is expected, old settings are legacy + then + game.print({"space-exploration.universe-resources-changed-warning"}) + end + log( "Resource settings mismatch: Resource rebuild required. (Destructive)") + Log.debug_log( "Old settings: " .. (global.resources_and_controls_compare_string or "nil"),"universe") + Log.debug_log( "New settings: " .. compare_string,"universe") + + --game.write_file("space-exploration.old_resources_and_controls_compare_string.lua", serpent.dump(global.resources_and_controls_compare_string, {comment=false, sparse=true, indent = "\t", nocode=true, name="old_resources_and_controls_compare_string"}), false) + + --game.write_file("space-exploration.new_resources_and_controls.lua", serpent.dump(resources_and_controls, {comment=false, sparse=true, indent = "\t", nocode=true, name="global"}), false) + + -- keep a record of old value for comparison + local old_resources_and_controls = global.resources_and_controls + local old_resources_and_controls_compare_string = global.compare_string + global.resources_and_controls = resources_and_controls + global.resources_and_controls_compare_string = compare_string + + Universe.build_resources() + + else + global.resources_and_controls = resources_and_controls + global.resources_and_controls_compare_string = compare_string + end + +end + +function Universe.estimate_resource_fsr(zone_control) + -- estimate the resource yeild. + local f = zone_control.frequency or 1 + local s = zone_control.size or 1 + local r = zone_control.richness or 1 + return f * s * r +end + +function Universe.add_tag(zone_tags, new_tag, override) + local u = string.find(new_tag, "_") + local tag_domain = string.sub(new_tag, 1, u-1) + if override or not zone_tags[tag_domain] then + zone_tags[tag_domain] = new_tag + end +end + +function Universe.apply_control_tags(controls, tags) + if not tags then return controls end + for _, tag in pairs(tags) do + + if tag == "water_none" then + controls.water = {size = 0} + elseif tag == "water_low" then + controls.water = {frequency=0.5, size = 0.3} + elseif tag == "water_med" then + controls.water = {frequency=1, size = 1} + elseif tag == "water_high" then + controls.water = {frequency=1, size = 4} + elseif tag == "water_max" then + controls.water = {frequency=0.5, size = 10} + + elseif tag == "moisture_none" then + controls.moisture={frequency=2, bias=-1} + elseif tag == "moisture_low" then + controls.moisture={frequency=1, bias=-0.15} + elseif tag == "moisture_med" then + controls.moisture={frequency=1, bias=0} + elseif tag == "moisture_high" then + controls.moisture={frequency=1, bias=0.15} + elseif tag == "moisture_max" then + controls.moisture={frequency=2, bias=0.5} + + elseif tag == "aux_very_low" then + controls.aux={frequency=1, bias=-0.5} + elseif tag == "aux_low" then + controls.aux={frequency=1, bias=-0.3} + elseif tag == "aux_med" then + controls.aux={frequency=1, bias=-0.1} + elseif tag == "aux_high" then + controls.aux={frequency=1, bias=0.2} + elseif tag == "aux_very_high" then + controls.aux={frequency=1, bias=0.5} + + elseif tag == "temperature_bland" then + controls.hot={frequency=0.5, size=0} + controls.cold={frequency=0.5, size=0} + elseif tag == "temperature_temperate" then + controls.hot={frequency=1, size=0.25} + controls.cold={frequency=1, size=0.25} + elseif tag == "temperature_midrange" then + controls.hot={frequency=1, size=0.65} + controls.cold={frequency=1, size=0.65} + elseif tag == "temperature_balanced" then + controls.hot={frequency=1, size=1} + controls.cold={frequency=1, size=1} + elseif tag == "temperature_wild" then + controls.hot={frequency=1, size=3} + controls.cold={frequency=1, size=3} + elseif tag == "temperature_extreme" then + controls.hot={frequency=1, size=6} + controls.cold={frequency=1, size=6} + + elseif tag == "temperature_cool" then + controls.hot={frequency=0.75, size=0} + controls.cold={frequency=0.75, size=0.5} + elseif tag == "temperature_cold" then + controls.hot={frequency=0.5, size=0} + controls.cold={frequency=0.5, size=1} + elseif tag == "temperature_vcold" then + controls.hot={frequency=0.5, size=0} + controls.cold={frequency=0.5, size=3} + elseif tag == "temperature_frozen" then + controls.hot={frequency=0.5, size=0} + controls.cold={frequency=0.5, size=6} + + elseif tag == "temperature_warm" then + controls.hot={frequency=0.75, size=0.5} + controls.cold={frequency=0.75, size=0} + elseif tag == "temperature_hot" then + controls.hot={frequency=0.5, size=1} + controls.cold={frequency=0.5, size=0} + elseif tag == "temperature_vhot" then + controls.hot={frequency=0.5, size=3} + controls.cold={frequency=0.5, size=0} + elseif tag == "temperature_volcanic" then + controls.hot={frequency=0.5, size=6} + controls.cold={frequency=0.5, size=0} + + elseif tag == "trees_none" then + controls.trees={frequency=0.25, size=0, richness = 0} + elseif tag == "trees_low" then + controls.trees={frequency=0.6, size=0.35, richness = 0.8} + elseif tag == "trees_med" then + controls.trees={frequency=0.8, size=0.66, richness = 1} + elseif tag == "trees_high" then + controls.trees={frequency=1, size=1, richness = 1} + elseif tag == "trees_max" then + controls.trees={frequency=3, size=1, richness = 1} + + elseif tag == "cliff_none" then + controls.cliff={frequency=0.01, richness = 0} + elseif tag == "cliff_low" then + controls.cliff={frequency=0.3, richness = 0.3} + elseif tag == "cliff_med" then + controls.cliff={frequency=1, richness = 1} + elseif tag == "cliff_high" then + controls.cliff={frequency=2, richness = 2} + elseif tag == "cliff_max" then + controls.cliffs={frequency=6, richness = 2} + + elseif tag == "enemy_none" then + controls["enemy-base"]={frequency=0.000001, size=-1, richness = -1} + elseif tag == "enemy_very_low" then + controls["enemy-base"]={frequency=0.1, size=0.1, richness = 0.1} + elseif tag == "enemy_low" then + controls["enemy-base"]={frequency=0.2, size=0.2, richness = 0.2} + elseif tag == "enemy_med" then + controls["enemy-base"]={frequency=0.5, size=0.5, richness = 0.5} + elseif tag == "enemy_high" then + controls["enemy-base"]={frequency=1, size=1, richness = 1} + elseif tag == "enemy_very_high" then + controls["enemy-base"]={frequency=1.5, size=2, richness = 1.5} + elseif tag == "enemy_max" then + controls["enemy-base"]={frequency=2, size=6, richness = 2} + else + log("invalid climate tag: " .. tag) + end + end + return controls +end + +function Universe.process_unordered_tags(unorded_tags) + local ordered_tags = {} + for _, tag in pairs(unorded_tags) do + local u = string.find(tag, "_") + local tag_domain = string.sub(tag, 1, u-1) + ordered_tags[tag_domain] = tag + end + return ordered_tags +end + +function Universe.multiply_sfr(control, fsr_multiplier) + local split_mult = math.sqrt(fsr_multiplier) + control.size = control.size * split_mult + control.richness = control.richness * split_mult +end + +function Universe.get_zone_resource_balance_category(zone) -- used to balance resource specilisations within zones that can support them + if zone.is_homeworld then return "homeworld" end + if Zone.is_solid(zone) then return "planet" end + if zone.type == "orbit" or zone.type == "star" then return "orbit" end + if zone.type == "anomaly" then return "anomaly" end + if zone.type == "asteroid-belt" then return "asteroid-belt" end + if zone.type == "asteroid-field" then return "asteroid-field" end + error("unknown zone_resource_balance_category for zone.type: " .. zone.type) +end + +function Universe.get_zone_prototype(name) + return UniverseRaw.prototypes_by_name[name] or {} +end + +function Universe.inflate_climate_controls(zone) + -- avoid resource stuff here. + if not global.rng then global.rng = game.create_random_generator() end + if not zone.seed then zone.seed = global.rng(4294967295) end + local crng = game.create_random_generator(zone.seed) + + if zone.is_homeworld then return end + + if zone.type == "planet" or zone.type == "moon" then + + local prototype = Universe.get_zone_prototype(zone.name) + + -- nauvis is 25000 + if not zone.ticks_per_day then + zone.ticks_per_day = 25000 -- nauvis + if (zone.name ~= "Nauvis" and zone.is_homeworld ~= true) then + if crng() < 0.5 then + zone.ticks_per_day = 60*60 + crng(60*60*59) -- 1 - 60 minutes + else + zone.ticks_per_day = 60*60 + crng(60*60*19) -- 1 - 20 minutes + end + end + end + + if not zone.biome_replacements then + zone.biome_replacements = prototype.biome_replacements and table.deepcopy(prototype.biome_replacements) or {} + end + if zone.biome_replacements and not zone.tile_replacements then + Zone.build_tile_replacements(zone) + end + + + -- apply prototype settings + if not (zone.tags and zone.tags.temperature) then -- not new format + if zone.tags and zone.tags[0] then -- has tags in new format + zone.tags = Universe.process_unordered_tags(zone.tags) + elseif prototype.tags then + zone.tags = Universe.process_unordered_tags(table.deepcopy(prototype.tags)) + else + zone.tags = {} + end + end + + if not zone.tags.temperature then + zone.tags.temperature = Universe.temperature_tags[crng(#Universe.temperature_tags)] + end + if not (zone.tags.water and zone.tags.moisture and zone.tags.trees) then + + -- water, moisture and trees are usually linked but not always + local rng_water = 1 + local rng_moisture = 1 + local rng_trees = 1 + if crng() < 0.75 then + rng_water = crng(1, 5) + rng_moisture = rng_water + if crng() < 0.5 then + rng_moisture = crng(1, 5) + end + rng_trees = rng_moisture + if crng() < 0.5 then + rng_trees = crng(1, 5) + end + end + rng_trees = math.min(rng_trees, crng(1, 5)) + + if not zone.tags.water then + zone.tags.water = Universe.water_tags[rng_water] + end + if not zone.tags.moisture then + zone.tags.moisture = Universe.moisture_tags[rng_moisture] + end + if not zone.tags.trees then + zone.tags.trees = Universe.trees_tags[rng_trees] + end + end + if not zone.tags.enemy then + zone.tags.enemy = Universe.enemy_tags[crng(#Universe.enemy_tags)] + end + if not zone.tags.aux then + zone.tags.aux = Universe.aux_tags[crng(#Universe.aux_tags)] + end + if not zone.tags.cliff then + zone.tags.cliff = Universe.cliff_tags[crng(#Universe.cliff_tags)] + end + + if not zone.controls then + zone.controls = {} + end + local tag_controls = Universe.apply_control_tags({}, zone.tags) + zone.controls = util.overwrite_table(zone.controls, tag_controls) -- climate controls win + if prototype.controls then + util.overwrite_table(zone.controls, table.deepcopy(prototype.controls)) -- prototype controls win + end + + -- fallback + for _, control in pairs(game.autoplace_control_prototypes) do + if control.category == "resource" and not zone.controls[control] then + zone.controls[control] = {frequency = 1, size = 0, richness = 0} + end + end + + else -- some sort of space place + ------------------------------------------------------------------------------ + local prototype = Universe.get_zone_prototype(zone.name) + if zone.type == "orbit" then + prototype = Universe.get_zone_prototype(zone.parent.name) + end + + if not zone.controls then + zone.controls = prototype.controls and table.deepcopy(prototype.controls) or {} + end + local tag_controls = Universe.apply_control_tags({}, zone.tags) + zone.controls = util.overwrite_table(tag_controls, zone.controls) -- exisitng controls win + zone.controls.tree = {frequency = 1, size = 0, richness = 0} + + -- fallback + for _, control in pairs(game.autoplace_control_prototypes) do + if control.category == "resource" and not zone.controls[control] then + zone.controls[control] = {frequency = 1, size = 0, richness = 0} + end + end + + end + +end + +function Universe.list_resource_controls() + local resource_controls = {} + for _, control in pairs(game.autoplace_control_prototypes) do + if control.category == "resource" then + table.insert(resource_controls, control.name) + end + end + return resource_controls +end + +function Universe.list_core_fragments() + local core_fragments = {} + for _, item_proto in pairs(game.item_prototypes ) do + if item_proto.localised_name and item_proto.localised_name[1] and item_proto.localised_name[1] == "item-name.core-fragment" then + table.insert(core_fragments, item_proto.name) + end + end + return core_fragments +end + +function Universe.load_resource_settings() + local resource_settings = {} + for _, resource_proto in pairs(game.entity_prototypes) do + if resource_proto.type == "resource" then + if resource_proto.autoplace_specification + and not Util.table_contains(Shared.resources_with_shared_controls, resource_proto.name) -- pretend it is not here if based on something else + then -- not disabled + + if not game.autoplace_control_prototypes[resource_proto.name] then + error("Error: autoplace_control not found for " .. resource_proto.name .. ".") + end + + local resource_setting = { + name = resource_proto.name, + allowed_for_zone = { + ["homeworld"] = true, + ["planet"] = true, -- includes moons + ["orbit"] = true, + ["asteroid-belt"] = true, + ["asteroid-field"] = true + }, + core_fragment = nil, -- fragment name if matches pattern + can_be_primary = true, --provided by override. -- only false for things like water pools + tags_required_for_presence = nil, --provided by override. + tags_required_for_primary = nil, --provided by override. + yeild_affected_by = nil --provided by override. if climate affects yeild (eg. only appears on snow) + } + + for _, word in pairs(Universe.resource_word_rules.not_space) do + if string.find(resource_proto.name, word, 1, true) then + resource_setting.allowed_for_zone["orbit"] = false + resource_setting.allowed_for_zone["asteroid-belt"] = false + resource_setting.allowed_for_zone["asteroid-field"] = false + end + end + if resource_setting.allowed_for_zone["orbit"] then + for _, word in pairs(Universe.resource_word_rules.not_orbit) do + if string.find(resource_proto.name, word, 1, true) then + resource_setting.allowed_for_zone["orbit"] = false + end + end + end + if resource_setting.allowed_for_zone["asteroid-belt"] then + for _, word in pairs(Universe.resource_word_rules.not_asteroid_belt) do + if string.find(resource_proto.name, word, 1, true) then + resource_setting.allowed_for_zone["asteroid-belt"] = false + end + end + end + if resource_setting.allowed_for_zone["asteroid-field"] then + for _, word in pairs(Universe.resource_word_rules.not_asteroid_field) do + if string.find(resource_proto.name, word, 1, true) then + resource_setting.allowed_for_zone["asteroid-field"] = false + end + end + end + + for _, word in pairs(Universe.resource_word_rules.not_planet) do + if string.find(resource_proto.name, word, 1, true) then + resource_setting.allowed_for_zone["planet"] = false + resource_setting.allowed_for_zone["homeworld"] = false + end + end + if resource_setting.allowed_for_zone["homeworld"] then + for _, word in pairs(Universe.resource_word_rules.not_homeworld) do + if string.find(resource_proto.name, word, 1, true) then + resource_setting.allowed_for_zone["homeworld"] = false + end + end + end + + if game.item_prototypes[util.mod_prefix .. "core-fragment-" .. resource_setting.name] then + resource_setting.core_fragment = util.mod_prefix .. "core-fragment-" .. resource_setting.name + end + + if Universe.resource_setting_overrides[resource_setting.name] then + for key, override in pairs(Universe.resource_setting_overrides[resource_setting.name]) do + if key == "allowed_for_zone" then -- don't overwite table with partial table + for key2, override2 in pairs(override) do + resource_setting[key][key2] = override2 + end + else + resource_setting[key] = override + end + end + end + + resource_settings[resource_setting.name] = resource_setting + end + end + end + return resource_settings +end + +function Universe.remove_resource_from_zone_surface(zone, resource) + if resource and game.entity_prototypes[resource] then + local surface = Zone.get_surface(zone) + if surface then + Log.debug_log("remove_resource_from_zone_surface: " .. zone.name .. " (" .. zone.type .. ") ".. resource,"universe") + for _, resource in pairs(surface.find_entities_filtered{name = resource}) do + resource.destroy() + end + end + end +end + +function Universe.rescale_or_regenerate_resource(zone, resource_name, fsr_multiplier) + local surface = Zone.get_surface(zone) + if not surface and resource_name then + Log.debug_log("rescale_or_regenerate_resource: " .. zone.name .. " (" .. zone.type .. ") " .. resource_name .. " (no surface to update)","universe") + return + end + + local entities = surface.find_entities_filtered{type = "resource", name=resource_name} + if #entities > 0 then + Log.debug_log("rescale_or_regenerate_resource: ".. zone.name .. " (" .. zone.type .. ") " .. resource_name .. " * " .. fsr_multiplier,"universe") + for _, entity in pairs(entities) do + local amount = math.ceil(entity.amount * fsr_multiplier) + if amount > 0 then + entity.amount = amount + else + entity.destroy() + end + end + else + Log.debug_log("rescale_or_regenerate_resource: " .. zone.name .. " (" .. zone.type .. ") " .. resource_name .. " (regenerate)","universe") + surface.regenerate_entity(resource_name) + end +end + +function Universe.shuffle(tbl) + -- global.rng should always be re-assigned at the start of Universe.build + size = #tbl + for i = size, 1, -1 do + local rand = global.rng(1, size) + tbl[i], tbl[rand] = tbl[rand], tbl[i] + end + return tbl +end + +function Universe.fit_climate_to_primary_resource(zone) + local crng = game.create_random_generator(zone.seed) + local resource_setting = global.resources_and_controls.resource_settings[zone.primary_resource] + local tags_required = resource_setting.tags_required_for_primary or resource_setting.tags_required_for_presence + local new_tag = tags_required[crng(#tags_required)] + Universe.add_tag(zone.tags, new_tag, true) + local override_climate_tags = {} + Universe.add_tag(override_climate_tags, new_tag, true) + local tag_controls = Universe.apply_control_tags({}, override_climate_tags) + zone.controls = util.overwrite_table(zone.controls, tag_controls) -- climate controls win + local surface = Zone.get_surface(zone) + if surface then + Zone.delete_surface(zone) + surface = Zone.get_surface(zone) + if surface then -- can't delete + local mapgen = surface.map_gen_settings + Zone.apply_controls_to_mapgen(zone, tag_controls, mapgen) + surface.map_gen_settings = mapgen + game.print(zone.name.." primary resource changed and the climate has been affected. If hard edges appear in the terrain generation use the Regenerate Terrain mod on the surface.") + end + end +end + +function Universe.make_validate_homesystem(planet) + Log.debug_log("make_validate_homesystem - Planet: ".. planet.name, "universe") + + -- make sure planet is marked as homeworld + planet.is_homeworld = true + planet.special_type = "homeworld" + + -- make sure system is marked as home system + local star = planet.parent + star.special_type = "homesystem" + Log.debug_log("make_validate_homesystem - Star: ".. star.name, "universe") + + -- make sure there are at least 6 planets in the solar systems. + -- first is small volcanic planet with no moons + -- second is homeworld + -- third has vitamelange moon + -- beryllium asteroid belt + -- fourth has iridium moon + -- fifth has holmium moon + -- RANDOM EXCESS + -- last (6th?) has a cryonite moon + -- random asteroid belt 2 + + local beryllium_asteroid_belt = nil + local other_asteroid_belts = {} + local vulcanite_planet = nil + local vitamelange_parent_planet = nil + local holmium_parent_planet = nil + local iridium_parent_planet = nil + local cryonite_parent_planet = nil + local other_planets = {} + local homeworld_index = nil + for i, child in pairs(star.children) do + if child.type == "asteroid-belt" then + if child.special_type == "beryllium" then + beryllium_asteroid_belt = child + Log.debug_log("make_validate_homesystem - already has beryllium belt ".. child.name, "universe") + else + table.insert(other_asteroid_belts, child) + Log.debug_log("make_validate_homesystem - generic asteroid belt located ".. child.name, "universe") + end + else + if child.special_type == "vulcanite" then + vulcanite_planet = child + Log.debug_log("make_validate_homesystem - already has vulcanite planet ".. child.name, "universe") + elseif child.children and child.children[1] and child.children[1].special_type == "vitamelange" then + vitamelange_parent_planet = child + Log.debug_log("make_validate_homesystem - already has vitamelange moon ".. child.name .. " > " .. child.children[1].name, "universe") + elseif child.children and child.children[1] and child.children[1].special_type == "iridium" then + iridium_parent_planet = child + Log.debug_log("make_validate_homesystem - already has iridium moon ".. child.name .. " > " .. child.children[1].name, "universe") + elseif child.children and child.children[1] and child.children[1].special_type == "holmium" then + holmium_parent_planet = child + Log.debug_log("make_validate_homesystem - already has holmium moon ".. child.name .. " > " .. child.children[1].name, "universe") + elseif child.children and child.children[1] and child.children[1].special_type == "cryonite" then + cryonite_parent_planet = child + Log.debug_log("make_validate_homesystem - already has cryonite moon ".. child.name .. " > " .. child.children[1].name, "universe") + elseif child.is_homeworld then + Log.debug_log("make_validate_homesystem - homeworld located ".. child.name, "universe") + else + table.insert(other_planets, child) + Log.debug_log("make_validate_homesystem - generic planet located ".. child.name, "universe") + end + end + end + + -- make sure the planet has a safe haven moon to escape to + local first_moon = planet.children[1] + if first_moon.special_type == "haven" then + Log.debug_log("make_validate_homesystem - homeworld has a haven moon.", "universe") + else + -- add a haven moon + Log.debug_log("make_validate_homesystem - homeworld does not have a haven moon.", "universe") + Universe.add_special_moon(planet, "haven", UniverseRaw.haven_moons) + end + + if not vulcanite_planet then + -- make a new planet 1. + Log.debug_log("make_validate_homesystem - homesystem does not have a vulcanite planet", "universe") + local protoplanets = table.deepcopy(UniverseRaw.vulcanite_planets) + Universe.shuffle(protoplanets) + local new_planet = nil + for i = 1, #protoplanets do + if protoplanets[i] and not global.zones_by_name[protoplanets[i].name] then + new_planet = protoplanets[i] + end + end + if new_planet then + Log.debug_log("make_validate_homesystem - Making new planet for vulcanite", "universe") + vulcanite_planet = new_planet + table.insert(star.children, 1, new_planet) + new_planet.type = "planet" + new_planet.special_type = "vulcanite" + new_planet.parent = star + new_planet.radius_multiplier = new_planet.radius_multiplier or 0.3 + new_planet.radius = Universe.planet_max_radius * new_planet.radius_multiplier + new_planet.index = #global.zone_index + 1 + new_planet.climate = new_planet.climate or {} + new_planet.seed = global.rng(4294967295) + new_planet.children = {} + global.zone_index[new_planet.index] = new_planet + global.zones_by_name[new_planet.name] = new_planet + + new_planet.orbit = { + type = "orbit", + name = new_planet.name .. " Orbit", + parent = new_planet, + seed = global.rng(4294967295), + index = #global.zone_index + 1 + } + global.zone_index[new_planet.orbit.index] = new_planet.orbit + global.zones_by_name[new_planet.orbit.name] = new_planet.orbit + end + end + + if not vitamelange_parent_planet then + Log.debug_log("make_validate_homesystem - homesystem does not have a vitamelange moon", "universe") + if #other_planets > 0 then + vitamelange_parent_planet = other_planets[1] + table.remove(other_planets, 1) + Log.debug_log("make_validate_homesystem - Selecting existing planet for vitamelange moon: "..vitamelange_parent_planet.name, "universe") + else + Log.debug_log("make_validate_homesystem - No existing planet available for vitamelange moon, creating new one.", "universe") + vitamelange_parent_planet = Universe.make_generic_planet(star, index) + end + Universe.add_special_moon(vitamelange_parent_planet, "vitamelange", UniverseRaw.vitamelange_moons) + end + + if not iridium_parent_planet then + Log.debug_log("make_validate_homesystem - homesystem does not have a iridium moon", "universe") + if #other_planets > 0 then + iridium_parent_planet = other_planets[1] + table.remove(other_planets, 1) + Log.debug_log("make_validate_homesystem - Selecting existing planet for iridium moon: "..iridium_parent_planet.name, "universe") + else + Log.debug_log("make_validate_homesystem - No existing planet available for iridium moon, creating new one.", "universe") + iridium_parent_planet = Universe.make_generic_planet(star, index) + end + Universe.add_special_moon(iridium_parent_planet, "iridium", UniverseRaw.iridium_moons) + end + + if not holmium_parent_planet then + Log.debug_log("make_validate_homesystem - homesystem does not have a holmium moon", "universe") + if #other_planets > 0 then + holmium_parent_planet = other_planets[1] + table.remove(other_planets, 1) + Log.debug_log("make_validate_homesystem - Selecting existing planet for holmium moon: "..holmium_parent_planet.name, "universe") + else + Log.debug_log("make_validate_homesystem - No existing planet available for holmium moon, creating new one.", "universe") + holmium_parent_planet = Universe.make_generic_planet(star, index) + end + Universe.add_special_moon(holmium_parent_planet, "holmium", UniverseRaw.holmium_moons) + end + + if not cryonite_parent_planet then + Log.debug_log("make_validate_homesystem - homesystem does not have a cryonite moon", "universe") + if #other_planets > 0 then + cryonite_parent_planet = other_planets[1] + table.remove(other_planets, 1) + Log.debug_log("make_validate_homesystem - Selecting existing planet for cryonite moon: "..cryonite_parent_planet.name, "universe") + else + Log.debug_log("make_validate_homesystem - No existing planet available for cryonite moon, creating new one.", "universe") + cryonite_parent_planet = Universe.make_generic_planet(star, index) + end + Universe.add_special_moon(cryonite_parent_planet, "cryonite", UniverseRaw.cryonite_moons) + end + + while #other_asteroid_belts < (beryllium_asteroid_belt and 1 or 2) do + Log.debug_log("make_validate_homesystem - Not enough asteroid belts, creating new one.", "universe") + local new_belt = { + type = "asteroid-belt", + name = star.name .. " Asteroid Belt ".. (#other_asteroid_belts + (beryllium_asteroid_belt and 0 or 1)), + seed = global.rng(4294967295), + index = #global.zone_index + 1, + parent = star + } + global.zone_index[new_belt.index] = new_belt + global.zones_by_name[new_belt.name] = new_belt + table.insert(other_asteroid_belts, new_belt) + end + if not beryllium_asteroid_belt then + Log.debug_log("make_validate_homesystem - homesystem does not have a beryllium belt", "universe") + beryllium_asteroid_belt = other_asteroid_belts[1] + beryllium_asteroid_belt.special_type = "beryllium" + table.remove(other_asteroid_belts, 1) + end + + -- put the solar system back together + star.children = {} + table.insert(star.children, vulcanite_planet) + table.insert(star.children, planet) + table.insert(star.children, vitamelange_parent_planet) + table.insert(star.children, beryllium_asteroid_belt) + table.insert(star.children, iridium_parent_planet) + table.insert(star.children, holmium_parent_planet) + for i, p in pairs(other_planets) do + table.insert(star.children, p) + end + table.insert(star.children, cryonite_parent_planet) + for i, b in pairs(other_asteroid_belts) do + table.insert(star.children, b) + end + Universe.star_gravity_well_distribute(star) +end + +function Universe.make_generic_planet(star, index) + Log.debug_log("make_generic_planet - New planet for star: "..star.name, "universe") + local protoplanets = table.deepcopy(UniverseRaw.unassigned_planets_or_moons) + Universe.shuffle(protoplanets) + local new_planet = nil + for i = 1, #protoplanets do + if protoplanets[i] and not global.zones_by_name[protoplanets[i].name] then + new_planet = protoplanets[i] + end + end + if new_planet then + local planet_prototype = table.deepcopy(new_planet) + if index then + table.insert(star.children, index, new_planet) + else + table.insert(star.children, new_planet) + end + new_planet.type = "planet" + new_planet.parent = star + new_planet.radius_multiplier = 0.4 + 0.6 * math.pow(global.rng(), 2) -- need to consistently call rng even if prototype.radius_multiplier is defined + if planet_prototype and planet_prototype.radius_multiplier then + new_planet.radius_multiplier = planet_prototype.radius_multiplier + end + new_planet.radius = Universe.planet_max_radius * new_planet.radius_multiplier + new_planet.index = #global.zone_index + 1 + new_planet.climate = new_planet.climate or {} + new_planet.seed = global.rng(4294967295) + new_planet.children = {} + global.zone_index[new_planet.index] = new_planet + global.zones_by_name[new_planet.name] = new_planet + Log.debug_log("make_generic_planet - New planet: "..new_planet.name.." index: "..new_planet.index, "universe") + + new_planet.orbit = { + type = "orbit", + name = new_planet.name .. " Orbit", + parent = new_planet, + seed = global.rng(4294967295), + index = #global.zone_index + 1 + } + global.zone_index[new_planet.orbit.index] = new_planet.orbit + global.zones_by_name[new_planet.orbit.name] = new_planet.orbit + Log.debug_log("make_generic_planet - New plane orbitt: "..new_planet.orbit.name.." index: "..new_planet.orbit.index, "universe") + + Universe.star_gravity_well_distribute(star) + return new_planet + end +end + +function Universe.add_special_moon(parent_planet, special_type, special_list) + Log.debug_log("add_special_moon - New special moon for planet: "..parent_planet.name.." ("..special_type..")", "universe") + local protomoons = table.deepcopy(special_list) + Universe.shuffle(protomoons) + local new_moon = nil + for i = 1, #protomoons do + if protomoons[i] and not global.zones_by_name[protomoons[i].name] then + new_moon = protomoons[i] + end + end + if new_moon then + table.insert(parent_planet.children, 1, new_moon) + new_moon.type = "moon" + new_moon.special_type = special_type + new_moon.parent = parent_planet + new_moon.radius_multiplier = new_moon.radius_multiplier or 0.3 + new_moon.radius = (0.5 * parent_planet.radius + math.min(parent_planet.radius, Universe.planet_max_radius / 2)) / 2 * new_moon.radius_multiplier -- special moons can't be as big + new_moon.index = #global.zone_index + 1 + new_moon.climate = new_moon.climate or {} + new_moon.seed = global.rng(4294967295) + global.zone_index[new_moon.index] = new_moon + global.zones_by_name[new_moon.name] = new_moon + Log.debug_log("add_special_moon - New special moon: "..new_moon.name.." index: "..new_moon.index, "universe") + + new_moon.orbit = { + type = "orbit", + name = new_moon.name .. " Orbit", + parent = new_moon, + seed = global.rng(4294967295), + index = #global.zone_index + 1 + } + global.zone_index[new_moon.orbit.index] = new_moon.orbit + global.zones_by_name[new_moon.orbit.name] = new_moon.orbit + Log.debug_log("add_special_moon - New special moon orbit "..new_moon.orbit.name.." index: "..new_moon.orbit.index, "universe") + Universe.planet_gravity_well_distribute(parent_planet) + end +end + +function Universe.star_gravity_well_distribute(star) + star.star_gravity_well = 10 + #star.children + star.index / 1000 + Log.debug_log("star_gravity_well_distribute " .. star.name .." star_gravity_well "..star.star_gravity_well, "universe") + for c, child in pairs(star.children) do + child.star_gravity_well = star.star_gravity_well * (0.05 + 0.8 * (#star.children - c) / #star.children) + Log.debug_log("star_gravity_well_distribute " .. child.name .." star_gravity_well "..child.star_gravity_well , "universe") + if child.children then + Universe.planet_gravity_well_distribute(child) + end + end +end + +function Universe.planet_gravity_well_distribute(planet) + planet.planet_gravity_well = 10 * (1 + planet.radius_multiplier) + #planet.children -- 12-20 + n_children = 13 to 26 + for m, moon in pairs(planet.children) do + moon.star_gravity_well = planet.star_gravity_well + moon.planet_gravity_well = planet.planet_gravity_well * (#planet.children - m + 1) / (#planet.children + 2) + end +end + +function Universe.set_hierarchy_values() + -- zone.hierarchy_index for quick sorting in zone lists + local list = {} + table.insert(list, global.universe.anomaly) + local temp = {} + for _, star in pairs(global.universe.stars) do + table.insert(temp, star) + end + table.sort(temp, function(a,b) return a.name < b.name end) + for _, star in pairs(temp) do + table.insert(list, star) + table.insert(list, star.orbit) + for _, planet_or_belt in pairs(star.children) do + table.insert(list, planet_or_belt) + if planet_or_belt.orbit then + table.insert(list, planet_or_belt.orbit) + end + if planet_or_belt.children then + for _, moon in pairs(planet_or_belt.children) do + table.insert(list, moon) + table.insert(list, moon.orbit) + end + end + end + end + temp = {} + for _, zone in pairs(global.universe.space_zones) do + table.insert(temp, zone) + end + table.sort(temp, function(a,b) return a.name < b.name end) + for _, zone in pairs(temp) do + table.insert(list, zone) + end + for i, zone in pairs(list) do + zone.hierarchy_index = i + end +end + +return Universe diff --git a/space-exploration_0.5.58/space-exploration/scripts/util.lua b/space-exploration_0.5.58/space-exploration/scripts/util.lua new file mode 100644 index 0000000..a345b09 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/util.lua @@ -0,0 +1,782 @@ +local util = {} + +util.mod_prefix = "se-" -- update strings.cfg + +util.min = math.min +util.max = math.max +util.floor = math.floor +util.abs = math.abs +util.sqrt = math.sqrt +util.sin = math.sin +util.cos = math.cos +util.atan = math.atan +util.atan2 = math.atan2 +util.pi = math.pi +util.remove = table.remove +util.insert = table.insert +util.str_gsub = string.gsub + +function string.starts(String,Start) + return string.sub(String,1,string.len(Start))==Start +end + +function util.deep_copy (t) + return table.deepcopy(t) +end + +function util.shallow_copy (t) -- shallow-copy a table + if type(t) ~= "table" then return t end + local meta = getmetatable(t) + local target = {} + for k, v in pairs(t) do target[k] = v end + setmetatable(target, meta) + return target +end + +function util.remove_from_table(list, item) + local index = 0 + for _,_item in ipairs(list) do + if item == _item then + index = _ + break + end + end + if index > 0 then + util.remove(list, index) + end +end + +function util.shuffle (tbl) + size = #tbl + for i = size, 1, -1 do + --local rand = 1 + math.floor(size * (math.random() - 0.0000001)) + local rand = math.random(size) + tbl[i], tbl[rand] = tbl[rand], tbl[i] + end + return tbl +end + +function util.random_from_array (tbl) + --return tbl[1 + math.floor(#tbl * (math.random() - 0.0000001))] + return tbl[math.random(#tbl)] +end + +function util.transfer_burner (entity_a, entity_b) + if entity_a.burner and entity_a.burner.currently_burning and entity_b.burner then + entity_b.burner.currently_burning = entity_a.burner.currently_burning.name + entity_b.burner.remaining_burning_fuel = entity_a.burner.remaining_burning_fuel + end +end + +function util.copy_inventory (inv_a, inv_b, probability) + if not probability then probability = 1 end + if inv_a and inv_b then + local contents = inv_a.get_contents() + for item_type, item_count in pairs(contents) do + if probability == 1 or probability > math.random() then + inv_b.insert({name=item_type, count=item_count}) + end + end + end +end + +function util.move_inventory_items (inv_a, inv_b) + -- move all items from inv_a to inv_b + -- preserves item data but inv_b MUST be able to accept the items or they are lost. + -- inventory A is cleared. + for i = 1, util.min(#inv_a, #inv_b) do + if inv_a[i] and inv_a[i].valid then + inv_b.insert(inv_a[i]) + end + end + inv_a.clear() +end + +function util.transfer_inventory_filters_direct(inv_a, inv_b) + if inv_a.supports_filters() and inv_b.supports_filters() then + for i = 1, util.min(#inv_a, #inv_b) do + local filter = inv_a.get_filter(i) + if filter then + inv_b.set_filter(i, filter) + end + end + end +end + +function util.transfer_inventory_filters (entity_a, entity_b, inventory_type) + local inv_a = entity_a.get_inventory(inventory_type) + local inv_b = entity_b.get_inventory(inventory_type) + util.transfer_inventory_filters_direct(inv_a, inv_b) +end + +function util.transfer_equipment_grid (entity_a, entity_b) -- NOTE: entity can be an item + if not (entity_a.grid and entity_b.grid) then return end + local grid_a = entity_a.grid + local grid_b = entity_b.grid + local equipment = grid_a.equipment + for _, item in pairs(equipment) do + local new_item = grid_b.put({ + name=item.name, + position=item.position}) + if new_item then + if item.shield and item.shield > 0 then + new_item.shield = item.shield + end + if item.energy and item.energy > 0 then + new_item.energy = item.energy + end + else + util.send_message("Error transfering "..item.name) + end + end +end + +function util.area_add_position(area, position) + local area2 = table.deepcopy(area) + for k1, v1 in pairs(area2) do + for k2, v2 in pairs(v1) do + if k2 == 1 or k2 == "x" then + v1[k2] = v2 + (position.x or position[1]) + elseif k2 == 2 or k2 == "y" then + v1[k2] = v2 + (position.y or position[2]) + end + end + end + return area2 +end + +function util.area_extend(area, range) + local area2 = table.deepcopy(area) + for k1, v1 in pairs(area2) do + local m = 1 + if k1 == 1 or k1 == "left_top" then + m = -1 + end + for k2, v2 in pairs(v1) do + v1[k2] = v2 + range * m + end + end + return area2 +end + +function util.position_to_area(position, radius) + return {{x = position.x - radius, y = position.y - radius}, + {x = position.x + radius, y = position.y + radius}} +end + +function util.position_to_tile(position) + return {x = math.floor(position.x or position[1]), y = math.floor(position.y or position[2])} +end + +function util.tile_to_position(tile_position) + return {x = math.floor(tile_position.x)+0.5, y = math.floor(tile_position.y)+0.5} +end + +function util.tile_to_area(tile_position, margin) + tile_position = {x = math.floor(tile_position.x or tile_position[1]), y = math.floor(tile_position.y or tile_position[2])} + margin = margin or 0.01 + return { + {tile_position.x+margin, tile_position.y+margin}, + {tile_position.x+1-margin, tile_position.y+1-margin} + } +end + +function util.position_to_xy_string(position) + return util.xy_to_string(position.x, position.y) +end + +function util.xy_to_string(x, y) + return util.floor(x) .. "_" .. util.floor(y) +end + +function util.lerp(a, b, alpha) + return a + (b - a) * alpha +end + +function util.lerp_angles(a, b, alpha) + local da = b - a + + if da < -0.5 then + da = da + 1 + elseif da > 0.5 then + da = da - 1 + end + local na = a + da * alpha + if na < 0 then + na = na + 1 + elseif na > 1 then + na = na - 1 + end + return na +end + +function util.array_to_vector(array) + return {x = array[1], y = array[2]} +end + +function util.vectors_delta(a, b) -- from a to b + if not a and b then return 0 end + return {x = b.x - a.x, y = b.y - a.y} +end + +function util.nvectors_delta(a, b) -- from a to b + local delta = {} + for i, coordinate in pairs(a) do + delta[i] = b[i] - a[i] + end + return delta +end + +function util.vectors_delta_length(a, b) + return util.vector_length_xy(b.x - a.x, b.y - a.y) +end + +function util.nvectors_delta_length(a, b) + return util.nvector_length(util.nvectors_delta(a, b)) +end + +function util.vector_length(a) + return util.sqrt(a.x * a.x + a.y * a.y) +end + +function util.nvector_length(a) + local d = 0 + for _, c in pairs(a) do + d = d + c * c + end + return util.sqrt(d) +end + +function util.vector_length_xy(x, y) + return util.sqrt(x * x + y * y) +end + +function util.vector_dot(a, b) + return a.x * b.x + a.y * b.y +end +function util.nvector_dot(a, b) + local d = 0 + for i, c in pairs(a) do + d = d + a[i] * b[i] + end + return d +end + +function util.vector_multiply(a, multiplier) + return {x = a.x * multiplier, y = a.y * multiplier} +end +function util.nvector_multiply(a, multiplier) + local d = {} + for i, c in pairs(a) do + d[i] = c*multiplier + end + return d +end + +function util.vector_dot_projection(a, b) + local n = util.vector_normalise(a) + local d = util.vector_dot(n, b) + return {x = n.x * d, y = n.y * d} +end + +function util.vector_normalise(a) + local length = util.vector_length(a) + return {x = a.x/length, y = a.y/length} +end +function util.nvector_normalise(a) + local length = util.nvector_length(a) + local d = {} + for i, c in pairs(a) do + d[i] = c/length + end + return d +end + +function util.nvector_normalise(a) + local length = util.nvector_length(a) + local normalised = {} + for i, coordinate in pairs(a) do + normalised[i] = coordinate / length + end + return normalised +end + +function util.vector_set_length(a, length) + local old_length = util.vector_length(a) + if old_length == 0 then return {x = 0, y = -length} end + return {x = a.x/old_length*length, y = a.y/old_length*length} +end + +function util.vector_cross(a, b) + -- N = i(a2b3 - a3b2) + j(a3b1 - a1b3) + k(a1b2 - a2b1) + return { + x = (a.y or a[2]) * (b.z or b[3]) - (a.z or a[3]) * (b.y or b[2]), + y = (a.z or a[3]) * (b.x or b[1]) - (a.x or a[1]) * (b.z or b[3]), + z = (a.x or a[1]) * (b.y or b[2]) - (a.y or a[2]) * (b.x or b[1]), + } +end + +function util.orientation_from_to(a, b) + return util.vector_to_orientation_xy(b.x - a.x, b.y - a.y) +end + +function util.orientation_to_vector(orientation, length) + return {x = length * util.sin(orientation * 2 * util.pi), y = -length * util.cos(orientation * 2 * util.pi)} +end + +function util.rotate_vector(orientation, a) + if orientation == 0 then + return {x = a.x, y = a.y} + else + return { + x = -a.y * util.sin(orientation * 2 * util.pi) + a.x * util.sin((orientation + 0.25) * 2 * util.pi), + y = a.y * util.cos(orientation * 2 * util.pi) -a.x * util.cos((orientation + 0.25) * 2 * util.pi)} + + end +end + +function util.vectors_add(a, b) + return {x = a.x + b.x, y = a.y + b.y} +end + +function util.vectors_add3(a, b, c) + return {x = a.x + b.x + c.x, y = a.y + b.y + c.y} +end + +function util.lerp_vectors(a, b, alpha) + return {x = a.x + (b.x - a.x) * alpha, y = a.y + (b.y - a.y) * alpha} +end + +function util.move_to(a, b, max_distance, eliptical) + -- move from a to b with max_distance. + -- if eliptical, reduce y change (i.e. turret muzzle flash offset) + local eliptical_scale = 0.9 + local delta = util.vectors_delta(a, b) + if eliptical then + delta.y = delta.y / eliptical_scale + end + local length = util.vector_length(delta) + if (length > max_distance) then + local partial = max_distance / length + delta = {x = delta.x * partial, y = delta.y * partial} + end + if eliptical then + delta.y = delta.y * eliptical_scale + end + return {x = a.x + delta.x, y = a.y + delta.y} +end + +function util.vector_to_orientation(v) + return util.vector_to_orientation_xy(v.x, v.y) +end + +function util.vector_to_orientation_xy(x, y) + return util.atan2(y, x) / util.pi / 2 +end + +function util.direction_to_orientation(direction) + if direction == defines.direction.north then + return 0 + elseif direction == defines.direction.northeast then + return 0.125 + elseif direction == defines.direction.east then + return 0.25 + elseif direction == defines.direction.southeast then + return 0.375 + elseif direction == defines.direction.south then + return 0.5 + elseif direction == defines.direction.southwest then + return 0.625 + elseif direction == defines.direction.west then + return 0.75 + elseif direction == defines.direction.northwest then + return 0.875 + end + return 0 +end + +function util.direction_to_string(direction) + if direction == defines.direction.north then + return "north" + elseif direction == defines.direction.northeast then + return "northeast" + elseif direction == defines.direction.east then + return "east" + elseif direction == defines.direction.southeast then + return "southeast" + elseif direction == defines.direction.south then + return "south" + elseif direction == defines.direction.southwest then + return "southwest" + elseif direction == defines.direction.west then + return "west" + elseif direction == defines.direction.northwest then + return "northwest" + end + return 0 +end + +function util.signal_to_string(signal) + return signal.type .. "__" .. signal.name +end + +function util.signal_container_add(container, signal, count) + if signal then + if not container[signal.type] then + container[signal.type] = {} + end + if container[signal.type][signal.name] then + container[signal.type][signal.name].count = container[signal.type][signal.name].count + count + else + container[signal.type][signal.name] = {signal = signal, count = count} + end + end +end + +function util.signal_container_add_inventory(container, entity, inventory) + local inv = entity.get_inventory(inventory) + if inv then + local contents = inv.get_contents() + for item_type, item_count in pairs(contents) do + util.signal_container_add(container, {type="item", name=item_type}, item_count) + end + end +end + +function util.signal_container_get(container, signal) + if container[signal.type] and container[signal.type][signal.name] then + return container[signal.type][signal.name] + end +end + +function util.signal_from_wires(red, green, signal) + local value = 0 + if red then value = value + red.get_signal(signal) or 0 end + if green then value = value + green.get_signal(signal) or 0 end + return value +end + +util.char_to_multiplier = { + m = 0.001, + c = 0.01, + d = 0.1, + h = 100, + k = 1000, + M = 1000000, + G = 1000000000, + T = 1000000000000, + P = 1000000000000000, +} + +function util.string_to_number(str) + str = ""..str + local number_string = "" + local last_char = nil + for i = 1, #str do + local c = str:sub(i,i) + if c == "." or (c == "-" and i == 1) or tonumber(c) ~= nil then + number_string = number_string .. c + else + last_char = c + break + end + end + if last_char and util.char_to_multiplier[last_char] then + return tonumber(number_string) * util.char_to_multiplier[last_char] + end + return tonumber(number_string) +end + +function util.replace(str, what, with) + what = util.str_gsub(what, "[%(%)%.%+%-%*%?%[%]%^%$%%]", "%%%1") -- escape pattern + with = util.str_gsub(with, "[%%]", "%%%%") -- escape replacement + str = util.str_gsub(str, what, with) + return str --only return the first variable from str_gsub +end + +function util.split(s, delimiter) + result = {}; + for match in (s..delimiter):gmatch("(.-)"..delimiter) do + table.insert(result, match); + end + return result; +end + +function util.string_join (str_table, sep) + local str = "" + for _, str_part in pairs(str_table) do + if str ~= "" then + str = str .. sep + end + str = str .. str_part + end + return str +end + +function util.parse_with_prefix(s, prefix) + if string.sub(s, 1, string.len(prefix)) == prefix then + return string.sub(s, string.len(prefix)+1) + end +end + +function util.overwrite_table(table_weak, table_strong) + for k,v in pairs(table_strong) do table_weak[k] = v end + return table_weak +end + +function util.table_contains(table, check) + for k,v in pairs(table) do if v == check then return true end end + return false +end + +function util.table_to_string(table) + return serpent.block( table, {comment = false, numformat = '%1.8g' } ) +end + +function util.values_to_string(table) + local string = "" + for _, value in pairs(table) do + string = ((string == "") and "" or ", ") .. string .. value + end + return string +end + +function util.math_log(value, base) + --logb(a) = logc(a) / logc(b) + return math.log(value)/math.log(base) +end + +function util.seconds_to_clock(seconds, use_days) + local seconds = tonumber(seconds) + + if seconds <= 0 then + return "0"; + else + local days = 0 + if use_days then days = math.floor(seconds/3600/24) end + local hours = math.floor(seconds/3600 - days*24) + local mins = math.floor(seconds/60 - hours*60 - days*1440) + local secs = math.floor(seconds - mins *60 - hours*3600 - days*86400) + local s_hours = string.format("%02.f",hours); + local s_mins = string.format("%02.f", mins); + local s_secs = string.format("%02.f", secs); + if days > 0 then + return days.."d:"..s_hours..":"..s_mins..":"..s_secs + end + if hours > 0 then + return s_hours..":"..s_mins..":"..s_secs + end + if mins > 0 then + return s_mins..":"..s_secs + end + if secs == 0 then + return "0" + end + return s_secs + end +end + +function util.to_rail_grid(number_or_position) + if type(number_or_position) == "table" then + return {x = util.to_rail_grid(number_or_position.x), y = util.to_rail_grid(number_or_position.y)} + end + return math.floor(number_or_position / 2) * 2 +end + +function util.format_fuel(fuel, ceil) + return string.format("%.2f",(fuel or 0) / 1000).."k" +end + +function util.format_energy(fuel, ceil) + if ceil then + return math.ceil((fuel or 0) / 1000000000).."GJ" + else + return math.floor((fuel or 0) / 1000000000).."GJ" + end +end + +function util.direction_to_vector (direction) + if direction == defines.direction.east then return {x=1,y=0} end + if direction == defines.direction.north then return {x=0,y=-1} end + if direction == defines.direction.northeast then return {x=1,y=-1} end + if direction == defines.direction.northwest then return {x=-1,y=-1} end + if direction == defines.direction.south then return {x=0,y=1} end + if direction == defines.direction.southeast then return {x=1,y=1} end + if direction == defines.direction.southwest then return {x=-1,y=1} end + if direction == defines.direction.west then return {x=-1,y=0} end +end + +function util.sign(x) + if x<0 then + return -1 + elseif x>0 then + return 1 + else + return 0 + end +end + +function util.find_first_descendant_by_name(gui_element, name) + for _, child in pairs(gui_element.children) do + if child.name == name then + return child + end + local found = util.find_first_descendant_by_name(child, name) + if found then return found end + end +end + +function util.find_descendants_by_name(gui_element, name, all_found) + local found = all_found or {} + for _, child in pairs(gui_element.children)do + if child.name == name then + table.insert(found, child) + end + util.find_descendants_by_name(child, name, found) + end + return found +end + +function util.swap_entity_inventories(entity_a, entity_b, inventory) + util.swap_inventories(entity_a.get_inventory(inventory), entity_b.get_inventory(inventory)) +end + +function util.swap_inventories(inv_a, inv_b) + if inv_a.is_filtered() then + for i = 1, math.min(#inv_a, #inv_b) do + inv_b.set_filter(i, inv_a.get_filter(i)) + end + end + for i = 1, math.min(#inv_a, #inv_b)do + inv_b[i].swap_stack(inv_a[i]) + end +end + +function util.find_damage_types_from_trigger_items(trigger_items) + local damage_types = {} + for _, trigger_item in pairs(trigger_items) do + if trigger_item.action_delivery then + for _, action_delivery in pairs(trigger_item.action_delivery) do + if action_delivery.target_effects then --action_delivery.type == "instant" + for _, target_effect in pairs(action_delivery.target_effects) do + if target_effect.type == "damage" and target_effect.damage and target_effect.damage.type then + damage_types[target_effect.damage.type] = true + end + end + end + --"instant", "projectile", "flame-thrower", "beam", "stream", "artillery". + local beam_or_projectile + if action_delivery.beam then + beam_or_projectile = game.entity_prototypes[action_delivery.beam] + end + if action_delivery.projectile then + beam_or_projectile = game.entity_prototypes[action_delivery.projectile] + end + if beam_or_projectile then + if beam_or_projectile.attack_result then + local damage_types_2 = util.find_damage_types_from_trigger_items(beam_or_projectile.attack_result) + for damage_type, b in pairs(damage_types_2) do + damage_types[damage_type] = true + end + end + if beam_or_projectile.final_attack_result then + local damage_types_2 = util.find_damage_types_from_trigger_items(beam_or_projectile.final_attack_result) + for damage_type, b in pairs(damage_types_2) do + damage_types[damage_type] = true + end + end + end + end + end + end + return damage_types +end + +function util.separate_points(positions, separation, max_iterations) + positions = table.deepcopy(positions) + --if true then return positions end + if not max_iterations then max_iterations = 20 end + local overshoot = 1.05 -- increse slightly to allow early finish + local i = 1 + local continue = true + while i <= max_iterations and continue do + i = i + 1 + continue = false + local forces = {} + for a, pos_a in pairs(positions) do + for b, pos_b in pairs(positions) do + if a ~= b then + local delta = Util.vectors_delta(pos_a, pos_b) + local length = Util.vector_length(delta) + if length < separation then + local force = Util.vector_set_length(delta, (separation - length) / 2) + if forces[a] then + forces[a].x = forces[a].x + force.x + forces[a].y = forces[a].y + force.y + else + forces[a] = force + end + end + end + end + end + for a, pos_a in pairs(positions) do + local force = forces[a] + if force then + local length = Util.vector_length(force) + if length > separation / 2 then + force = Util.vector_set_length(force, separation / 2) + end + pos_a.x = pos_a.x - force.x * overshoot + pos_a.y = pos_a.y - force.y * overshoot + continue = true + end + end + end + return positions +end + +function util.safe_destroy(entity) + if not entity.valid then return end + if entity.type == "linked-container" then + entity.link_id = 0 + entity.destroy({raise_destroy=true}) + else + entity.destroy({raise_destroy=true}) + end +end + +function util.HSVToRGB( hue, saturation, value ) + --https://gist.github.com/GigsD4X/8513963 + -- Returns the RGB equivalent of the given HSV-defined color + -- (adapted from some code found around the web) + + -- If it's achromatic, just return the value + if saturation == 0 then + return value; + end; + + -- Get the hue sector + local hue_sector = math.floor( hue / 60 ); + local hue_sector_offset = ( hue / 60 ) - hue_sector; + + local p = value * ( 1 - saturation ); + local q = value * ( 1 - saturation * hue_sector_offset ); + local t = value * ( 1 - saturation * ( 1 - hue_sector_offset ) ); + + if hue_sector == 0 then + return value, t, p; + elseif hue_sector == 1 then + return q, value, p; + elseif hue_sector == 2 then + return p, value, t; + elseif hue_sector == 3 then + return p, q, value; + elseif hue_sector == 4 then + return t, p, value; + elseif hue_sector == 5 then + return value, p, q; + end; +end; + +return util diff --git a/space-exploration_0.5.58/space-exploration/scripts/weapon.lua b/space-exploration_0.5.58/space-exploration/scripts/weapon.lua new file mode 100644 index 0000000..41e1b14 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/weapon.lua @@ -0,0 +1,278 @@ +Weapon = {} + +-- constants +Weapon.tesla_base_damage = 25 +Weapon.tesla_ammo_category = "tesla" +Weapon.cryogun_freeze_time_min = 300 +Weapon.cryogun_freeze_time_max = 1200 +Weapon.cryogun_ice_radius = 1 +Weapon.cryogun_freeze_radius = 4 +Weapon.name_cryogun_ice = mod_prefix.."cryogun-ice" +Weapon.name_cryogun_ice_spacer = mod_prefix.."cryogun-ice-spacer" + +function Weapon.on_trigger_created_entity(event) + if not event.entity and event.entity.valid then return end + if event.entity.name == mod_prefix.."tesla-gun-trigger" then + if event.source and event.source.valid then + local tick_task = new_tick_task("chain-beam") + tick_task.surface = event.entity.surface + tick_task.beam = mod_prefix.."tesla-gun-beam" + tick_task.max_bounces = 10 + math.random() * 20 + tick_task.range = 10 + tick_task.instigator = event.source + tick_task.instigator_force = event.source.force + tick_task.initial_vector = util.vector_normalise(util.vectors_delta(event.source.position, event.entity.position)) + local first_hit = util.move_to(event.source.position, event.entity.position, 3, false) + tick_task.affected_locations = {{position = first_hit}} + local source = event.source.position + -- gun graphic offset + source.y = source.y - 1 + source = util.move_to(source, util.vectors_add(source, tick_task.initial_vector), 0.7, true) + + tick_task.surface.create_entity{ + name = tick_task.beam, + position = first_hit, + target_position = first_hit, + source_position = source, + duration = 10, + } + end + elseif event.entity.name == mod_prefix .. "plague-cloud"then + local surface_index = event.entity.surface.index + local zone = Zone.from_surface_index(surface_index) + if zone and not zone.plague_tick_task then + if not zone.plague_used then + zone.plague_used = game.tick + end + local surface = event.entity.surface + local map_gen_settings = surface.map_gen_settings + map_gen_settings.autoplace_controls["enemy-base"].size = -1 + map_gen_settings.autoplace_controls["trees"].size = -1 + surface.map_gen_settings = map_gen_settings + local tick_task = new_tick_task("plague-tick") + tick_task.surface_index = surface_index + tick_task.zone = zone + if event.entity.force then + tick_task.force_name = event.entity.force.name + end + tick_task.started = game.tick + zone.plague_tick_task = tick_task + end + elseif event.entity.name == mod_prefix.."cryogun-trigger" then + local pos = event.entity.position + local surface = event.entity.surface + local safe_pos = surface.find_non_colliding_position(Weapon.name_cryogun_ice_spacer, pos, Weapon.cryogun_ice_radius, 0.1, false) + local ice_entities = {} + if safe_pos then + local ice = surface.create_entity{name = Weapon.name_cryogun_ice, position = safe_pos, force = "neutral"} + table.insert(ice_entities, ice) + local spaceship = Spaceship.from_own_surface_index(surface.index) + if spaceship then + Log.trace("test") + Spaceship.add_as_particle(spaceship, ice, Spaceship.ice_particle) + end + end + local freeze_entities = surface.find_entities_filtered{ + type = {"unit", "turret", "ammo-turret", "electric-turret", "fluid-turret"}, + position = safe_pos or pos, + radius = Weapon.cryogun_freeze_radius + } + local reactivate_entities = {} + for _, entity in pairs(freeze_entities) do + if entity.active then + entity.active = false + table.insert(reactivate_entities, entity) + table.insert(ice_entities, surface.create_entity{name = Weapon.name_cryogun_ice, position = entity.position, force = "neutral"}) + end + end + if #ice_entities > 0 or #reactivate_entities > 0 then + local tick_task = new_tick_task("cryogun-unfreeze") + tick_task.ice_entities = ice_entities + tick_task.reactivate_entities = reactivate_entities + tick_task.freeze_tick = game.tick + tick_task.unfreeze_tick = game.tick + math.random(Weapon.cryogun_freeze_time_min, Weapon.cryogun_freeze_time_max) + end + elseif event.entity.name == mod_prefix.."pheromone-trigger" then + local units = event.entity.surface.find_entities_filtered{type="unit", position = event.entity.position} + if event.source and event.source.valid then + for _, unit in pairs(units) do + if unit.force ~= event.source.force then + if string.find(unit.name, "biter", 1, true) or string.find(unit.name, "spitter", 1, true) then + unit.force = event.source.force + unit.set_command({type = defines.command.wander}) + end + end + end + end + + end +end +Event.addListener(defines.events.on_trigger_created_entity, Weapon.on_trigger_created_entity) + +function Weapon.cryogun_unfreeze(tick_task) + if game.tick >= tick_task.unfreeze_tick then + tick_task.valid = false + for _, e in pairs(tick_task.ice_entities) do + if e.valid then e.destroy() end + end + for _, e in pairs(tick_task.reactivate_entities) do + if e.valid then e.active = true end + end + end +end + +function Weapon.plague_tick(tick_task) + --game.print((game.tick - (tick_task.started + 10 * 60 * 60)) / 60) + if game.tick > tick_task.started + settings.global["se-plague-max-runtime"].value * 60 * 60 then -- 15 minutes + tick_task.valid = false + tick_task.zone.plague_tick_task = nil + local surface = game.surfaces[tick_task.surface_index] + if surface then + local enemies = surface.find_entities_filtered{ force = "enemy" } + for _, entity in pairs(enemies) do + entity.destroy() + end + local plague = surface.find_entities_filtered{ name={ + mod_prefix .. "plague-cloud", + mod_prefix .. "plague-wave"} } + for _, entity in pairs(plague) do + entity.destroy() + end + local trees = surface.find_entities_filtered{ type = "tree" } + for _, entity in pairs(trees) do + entity.destroy() + end + end + end +end + +function Weapon.chain_beam(tick_task) + if not (tick_task.surface and tick_task.surface.valid) then + tick_task.valid = false + return + end + local branch_chance = tick_task.branch_chance or 0.1 + local emanate_from = nil + if math.random() < branch_chance then + emanate_from = tick_task.affected_locations[math.random(#tick_task.affected_locations)] -- branching bouncing beam + else + emanate_from = tick_task.affected_locations[#tick_task.affected_locations] -- single bouncing beam + end + + local entities = tick_task.surface.find_entities_filtered{ + area = util.position_to_area(emanate_from.position, tick_task.range), + collision_mask = {"object-layer", "player-layer"}, + } + + local valids = {} + for _, entity in pairs(entities) do + if entity.valid and (entity.type ~= "cliff" and entity.force ~= tick_task.instigator_force) then + local already_affected = false + for _, affected in pairs(tick_task.affected_locations) do + if entity == affected.entity then + already_affected = true + end + end + if not already_affected then + table.insert(valids, entity) + end + end + end + + local desired_pos = util.vectors_add(emanate_from.position, util.vector_multiply(util.vector_normalise(tick_task.initial_vector), 2)) + + local chosen = nil + + if #valids > 0 then + + local closest_dist = 10000 + for _, valid in pairs(valids) do + local dist = (1 + util.vectors_delta_length(desired_pos, valid.position)) * 0.5 + math.random() + if dist < closest_dist then + closest_dist = dist + chosen = valid + end + end + + end + + if chosen then + table.insert(tick_task.affected_locations, {position = chosen.position, entity = chosen}) + + if chosen.type == "simple-entity" and string.find(chosen.name, "rock") then + chosen.health = math.max(0.01, chosen.health - chosen.prototype.max_health / 50) + end + + local target_position = chosen.position + + local force = tick_task.instigator_force + local bonus_damage = Weapon.tesla_base_damage * force.get_ammo_damage_modifier(Weapon.tesla_ammo_category) + if bonus_damage > 0 then + chosen.damage(bonus_damage, force, "electric") + end + + local target = nil + if chosen and chosen.valid then + target = chosen + end + + tick_task.surface.create_entity{ + name = tick_task.beam, + position = emanate_from.position, + target = target, + force = force, + target_position = target_position, + source_position = emanate_from.position, + duration = 10, + } + else + -- hit ground + local ground = {x = desired_pos.x + ((math.random() - 0.5) * 0.25 * tick_task.range), + y = desired_pos.y + ((math.random() - 0.5) * 0.25 * tick_task.range)} + + table.insert(tick_task.affected_locations, {position = ground}) + + tick_task.surface.create_entity{ + name = tick_task.beam, + position = emanate_from.position, + target_position = ground, + source_position = emanate_from.position, + duration = 10, + } + end + + if #tick_task.affected_locations >= (tick_task.max_bounces or 2) then + tick_task.valid = false + end + +end + +function Weapon.on_entity_died(event) + if event.entity and event.entity.valid and event.entity.type == "unit"then + local entity = event.entity + if entity.stickers then + for _, sticker in pairs(entity.stickers) do + if sticker.name == mod_prefix .. "bloater-sticker" then + local max_health = entity.prototype.max_health + local remain = max_health + while remain > 0 do + local done = false + for _, e in pairs({10000, 4000, 1000, 400, 100, 40, 10}) do + done = true + remain = remain - e + entity.surface.create_entity{ + name= mod_prefix .. "bloater-burst-"..e, + position = entity.position, + force = "player" + } + end + if not done then remain = 0 end + end + end + end + end + end +end +Event.addListener(defines.events.on_entity_died, Weapon.on_entity_died) + +return Weapon diff --git a/space-exploration_0.5.58/space-exploration/scripts/zone.lua b/space-exploration_0.5.58/space-exploration/scripts/zone.lua new file mode 100644 index 0000000..149a38a --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/zone.lua @@ -0,0 +1,2022 @@ +local Zone = {} + +-- constants +Zone.solar_multiplier = 1 + +Zone.discovery_scan_radius = 32 +Zone.clear_enemies_radius = 512 + +Zone.travel_cost_interstellar = 400 -- stellar position distance, roughly 50 distance between stars, can be up to 300 apart +Zone.travel_cost_star_gravity = 500 -- roughly 10-20 base for a star +Zone.travel_cost_planet_gravity = 100 -- roughly 10-20 base for a planet +Zone.travel_cost_space_distortion = Zone.travel_cost_interstellar * 25 -- based on 0-1 range + +Zone.name_tech_discover_random = mod_prefix.."zone-discovery-random" +Zone.name_tech_discover_targeted = mod_prefix.."zone-discovery-targeted" +Zone.name_tech_discover_deep = mod_prefix.."zone-discovery-deep" + +-- based on alien biomes, unsure as to how ti make this more dynamic +-- biome name = {tilenames} +Zone.biome_tiles = { + ["out-of-map"] = {"out-of-map"}, -- always allowed + ["water"] = {"water", "deepwater", "water-green", "deepwater-green", "water-shallow", "water-mud"}, + + ["dirt-purple"] = {"mineral-purple-dirt-1", "mineral-purple-dirt-2", "mineral-purple-dirt-3", "mineral-purple-dirt-4", "mineral-purple-dirt-5", "mineral-purple-dirt-6"}, + ["dirt-violet"] = {"mineral-violet-dirt-1", "mineral-violet-dirt-2", "mineral-violet-dirt-3", "mineral-violet-dirt-4", "mineral-violet-dirt-5", "mineral-violet-dirt-6"}, + ["dirt-red"] = {"mineral-red-dirt-1", "mineral-red-dirt-2", "mineral-red-dirt-3", "mineral-red-dirt-4", "mineral-red-dirt-5", "mineral-red-dirt-6"}, + ["dirt-brown"] = {"mineral-brown-dirt-1", "mineral-brown-dirt-2", "mineral-brown-dirt-3", "mineral-brown-dirt-4", "mineral-brown-dirt-5", "mineral-brown-dirt-6"}, + ["dirt-tan"] = {"mineral-tan-dirt-1", "mineral-tan-dirt-2", "mineral-tan-dirt-3", "mineral-tan-dirt-4", "mineral-tan-dirt-5", "mineral-tan-dirt-6"}, + ["dirt-aubergine"] = {"mineral-aubergine-dirt-1", "mineral-aubergine-dirt-2", "mineral-aubergine-dirt-3", "mineral-aubergine-dirt-4", "mineral-aubergine-dirt-5", "mineral-aubergine-dirt-6"}, + ["dirt-dustyrose"] = {"mineral-dustyrose-dirt-1", "mineral-dustyrose-dirt-2", "mineral-dustyrose-dirt-3", "mineral-dustyrose-dirt-4", "mineral-dustyrose-dirt-5", "mineral-dustyrose-dirt-6"}, + ["dirt-beige"] = {"mineral-beige-dirt-1", "mineral-beige-dirt-2", "mineral-beige-dirt-3", "mineral-beige-dirt-4", "mineral-beige-dirt-5", "mineral-beige-dirt-6"}, + ["dirt-cream"] = {"mineral-cream-dirt-1", "mineral-cream-dirt-2", "mineral-cream-dirt-3", "mineral-cream-dirt-4", "mineral-cream-dirt-5", "mineral-cream-dirt-6"}, + ["dirt-black"] = {"mineral-black-dirt-1", "mineral-black-dirt-2", "mineral-black-dirt-3", "mineral-black-dirt-4", "mineral-black-dirt-5", "mineral-black-dirt-6"}, + ["dirt-grey"] = {"mineral-grey-dirt-1", "mineral-grey-dirt-2", "mineral-grey-dirt-3", "mineral-grey-dirt-4", "mineral-grey-dirt-5", "mineral-grey-dirt-6"}, + ["dirt-white"] = {"mineral-white-dirt-1", "mineral-white-dirt-2", "mineral-white-dirt-3", "mineral-white-dirt-4", "mineral-white-dirt-5", "mineral-white-dirt-6"}, + + ["sand-purple"] = {"mineral-purple-sand-1", "mineral-purple-sand-2", "mineral-purple-sand-3"}, + ["sand-violet"] = {"mineral-violet-sand-1", "mineral-violet-sand-2", "mineral-violet-sand-3"}, + ["sand-red"] = {"mineral-red-sand-1", "mineral-red-sand-2", "mineral-red-sand-3"}, + ["sand-brown"] = {"mineral-brown-sand-1", "mineral-brown-sand-2", "mineral-brown-sand-3"}, + ["sand-tan"] = {"mineral-tan-sand-1", "mineral-tan-sand-2", "mineral-tan-sand-3"}, + ["sand-aubergine"] = {"mineral-aubergine-sand-1", "mineral-aubergine-sand-2", "mineral-aubergine-sand-3"}, + ["sand-dustyrose"] = {"mineral-dustyrose-sand-1", "mineral-dustyrose-sand-2", "mineral-dustyrose-sand-3"}, + ["sand-beige"] = {"mineral-beige-sand-1", "mineral-beige-sand-2", "mineral-beige-sand-3"}, + ["sand-cream"] = {"mineral-cream-sand-1", "mineral-cream-sand-2", "mineral-cream-sand-3"}, + ["sand-black"] = {"mineral-black-sand-1", "mineral-black-sand-2", "mineral-black-sand-3"}, + ["sand-grey"] = {"mineral-grey-sand-1", "mineral-grey-sand-2", "mineral-grey-sand-3"}, + ["sand-white"] = {"mineral-white-sand-1", "mineral-white-sand-2", "mineral-white-sand-3"}, + + ["vegetation-green"] = {"vegetation-green-grass-1", "vegetation-green-grass-2", "vegetation-green-grass-3", "vegetation-green-grass-4"}, + ["vegetation-olive"] = {"vegetation-olive-grass-1", "vegetation-olive-grass-2"}, + ["vegetation-yellow"] = {"vegetation-yellow-grass-1", "vegetation-yellow-grass-2"}, + ["vegetation-orange"] = {"vegetation-orange-grass-1", "vegetation-orange-grass-2"}, + ["vegetation-red"] = {"vegetation-red-grass-1", "vegetation-red-grass-2"}, + ["vegetation-violet"] = {"vegetation-violet-grass-1", "vegetation-violet-grass-2"}, + ["vegetation-purple"] = {"vegetation-purple-grass-1", "vegetation-purple-grass-2"}, + ["vegetation-mauve"] = {"vegetation-mauve-grass-1", "vegetation-mauve-grass-2"}, + ["vegetation-blue"] = {"vegetation-blue-grass-1", "vegetation-blue-grass-2"}, + ["vegetation-turquoise"] = {"vegetation-turquoise-grass-1", "vegetation-turquoise-grass-2"}, + + ["volcanic-orange"] = {"volcanic-orange-heat-1", "volcanic-orange-heat-2", "volcanic-orange-heat-3", "volcanic-orange-heat-4"}, + ["volcanic-green"] = {"volcanic-green-heat-1", "volcanic-green-heat-2", "volcanic-green-heat-3", "volcanic-green-heat-4"}, + ["volcanic-blue"] = {"volcanic-blue-heat-1", "volcanic-blue-heat-2", "volcanic-blue-heat-3", "volcanic-blue-heat-4"}, + ["volcanic-purple"] = {"volcanic-purple-heat-1", "volcanic-purple-heat-2", "volcanic-purple-heat-3", "volcanic-purple-heat-4"}, + + ["frozen-snow"] = {"frozen-snow-0", "frozen-snow-1", "frozen-snow-2", "frozen-snow-3", "frozen-snow-4"}, + ["frozen-ice"] = {"frozen-snow-5", "frozen-snow-6", "frozen-snow-7", "frozen-snow-8", "frozen-snow-9"}, +} +Zone.biome_collections = { + ["all-sand"] = {"sand-purple", "sand-violet", "sand-red", "sand-brown", "sand-tan", "sand-aubergine", "sand-dustyrose", "sand-beige", "sand-cream", "sand-black", "sand-grey", "sand-white"}, + ["all-dirt"] = {"dirt-purple", "dirt-violet", "dirt-red", "dirt-brown", "dirt-tan", "dirt-aubergine", "dirt-dustyrose", "dirt-beige", "dirt-cream", "dirt-black", "dirt-grey", "dirt-white"}, + ["all-vegetation"] = {"vegetation-green", "vegetation-olive", "vegetation-yellow", "vegetation-orange", "vegetation-red", + "vegetation-violet", "vegetation-purple", "vegetation-mauve", "vegetation-blue", "vegetation-turquoise" }, + ["all-volcanic"] = {"volcanic-orange", "volcanic-green", "volcanic-blue", "volcanic-purple"}, + ["all-frozen"] = {"frozen-snow", "frozen-ice"}, +} +Zone.signal_to_zone_type = { + [mod_prefix.."planet"] = "planet", + [mod_prefix.."moon"] = "moon", + [mod_prefix.."planet-orbit"] = "orbit", + [mod_prefix.."moon-orbit"] = "orbit", + [mod_prefix.."star"] = "orbit", + [mod_prefix.."asteroid-belt"] = "asteroid-belt", + [mod_prefix.."asteroid-field"] = "asteroid-field", + [mod_prefix.."anomaly"] = "anomaly", +} +Zone.controls_without_frequency_multiplier = { + "trees", + "enemy-base" +} +-- NOTE: cliff and base terrain sliders have special settings, + +--[[ eg: +biome_replacements = { + {replace={"all-dirt", "all-sand", "all-volcanic"}, with="sand-red"}, + {replace={"all-vegetation", "all-frozen"}, with="vegetation-red"} +} ]]-- + +function Zone.get_default() + return Zone.from_name("Nauvis") +end + +function Zone.get_force_home_zone(force_name) + if global.forces[force_name] and global.forces[force_name].homeworld_index then + return Zone.from_zone_index(global.forces[force_name].homeworld_index) + end +end + +function Zone.type_title(zone) + if zone.type == "planet" then + return "Planet" + elseif zone.type == "moon" then + return "Moon" + elseif zone.type == "star" then + return "Star" + elseif zone.type == "asteroid-field" then + return "Asteroid Field" + elseif zone.type == "asteroid-belt" then + return "Asteroid Belt" + elseif zone.type == "anomaly" then + return "Anomaly" + elseif zone.type == "spaceship" then + return "Spaceship" + elseif zone.type == "orbit" then + return (Zone.type_title(zone.parent) .. " Orbit") + end +end + +function Zone.get_signal_name(zone) + -- used for rich text + if zone.type == "orbit" and zone.parent.type == "star" then + return mod_prefix.."star" + elseif zone.type == "orbit" and zone.parent.type == "planet" then + return mod_prefix.."planet-orbit" + elseif zone.type == "orbit" and zone.parent.type == "moon" then + return mod_prefix.."moon-orbit" + else + return mod_prefix..zone.type + end +end + +function Zone.get_icon(zone) + -- used for rich text + return "virtual-signal/" .. Zone.get_signal_name(zone) +end + +function Zone.is_solid(zone) + return zone.type == "planet" or zone.type == "moon" +end + +function Zone.is_space(zone) + return not Zone.is_solid(zone) +end + +function Zone.from_zone_index(zone_index) + return global.zone_index[zone_index] +end + +function Zone.from_name(name) + return global.zones_by_name[name] +end + +function Zone.from_surface_index(surface_index) + return global.zones_by_surface[surface_index] +end + +function Zone.from_surface(surface) + local from_index = Zone.from_surface_index(surface.index) + if from_index then return from_index end + -- maybe a spaceship + return Spaceship.from_own_surface_index(surface.index) +end + +function Zone.get_stellar_position(zone) + if not zone then return nil end + if zone.type == "anomaly" then return {x = 0, y = 0} end + -- everything else should have a stellar position + return zone.stellar_position or Zone.get_stellar_position(zone.parent) +end + +function Zone.get_star_gravity_well(zone) + if zone.type == "orbit" then + return Zone.get_star_gravity_well(zone.parent) + end + return zone.star_gravity_well or 0 +end + +function Zone.get_planet_gravity_well(zone) + if zone.type == "orbit" then + if zone.parent.type == "star" then + return 0 + elseif zone.parent.type == "planet" then + return Zone.get_planet_gravity_well(zone.parent) - 1 + else + return Zone.get_planet_gravity_well(zone.parent) - 0.5 + end + end + return zone.planet_gravity_well or 0 +end + +function Zone.get_space_distortion(zone) -- anomaly + if zone.space_distortion then + return zone.space_distortion + end + return zone.type == "anomaly" and 1 or 0 +end + +function Zone.find_parent_star(zone) + if zone.type == "star" then + return zone + elseif zone.parent then + return Zone.find_parent_star(zone.parent) + end +end + +function Zone.apply_markers(zone) + for force_name, force_data in pairs(global.forces) do + local force = game.forces[force_name] + if force and force_data.zones_discovered[zone.index] then + if not (force_data.zones_discovered[zone.index].marker and force_data.zones_discovered[zone.index].marker.valid) then + local surface = Zone.get_surface(zone) + if surface then + force_data.zones_discovered[zone.index].marker = force.add_chart_tag(surface, { + icon = {type = "virtual", name = Zone.get_signal_name(zone)}, + position = {0,0}, + text = zone.name + }) + end + end + end + end +end + +function Zone.validate_controls_and_error(controls) + if controls then + for name, control in pairs(controls) do + if type(name) ~= "string" then + error(serpent.block(name)) + end + end + end +end + +function Zone.validate_controls(controls) + if controls then + for name, control in pairs(controls) do + if type(name) ~= "string" then + controls[name] = nil + end + end + end +end + +function Zone.apply_controls_to_mapgen(zone, controls, mapgen) + Zone.validate_controls(controls) + local frequency_multiplier = Zone.get_frequency_multiplier(zone) + for name, control in pairs(controls) do + if type(name) == "string" then + if name == "moisture" then + mapgen.property_expression_names = mapgen.property_expression_names or {} + if control.frequency then + mapgen.property_expression_names["control-setting:moisture:frequency:multiplier"] = control.frequency + end + if control.bias then + mapgen.property_expression_names["control-setting:moisture:bias"] = control.bias + end + elseif name == "aux" then + mapgen.property_expression_names = mapgen.property_expression_names or {} + if control.frequency then + mapgen.property_expression_names["control-setting:aux:frequency:multiplier"] = control.frequency + end + if control.bias then + mapgen.property_expression_names["control-setting:aux:bias"] = control.bias + end + elseif name == "water" then + if control.frequency then + mapgen.terrain_segmentation = control.frequency + end + if control.size then + mapgen.water = control.size + end + elseif name == "cliff" then + mapgen.cliff_settings = mapgen.cliff_settings or { + name="cliff", + cliff_elevation_0=10, -- default + cliff_elevation_interval=400, -- when set from the GUI the value is 40 / frequency. + richness=0, -- 0.17 to 6. + } + if control.frequency then + mapgen.cliff_settings.cliff_elevation_interval = 40 / control.frequency + mapgen.cliff_settings.cliff_elevation_0 = mapgen.cliff_settings.cliff_elevation_interval / 4 + end + if control.richness then + mapgen.cliff_settings.richness = richness + end + else + if game.autoplace_control_prototypes[name] then + mapgen.autoplace_controls[name] = table.deepcopy(control) + if mapgen.autoplace_controls[name].frequency and not Util.table_contains(Zone.controls_without_frequency_multiplier, name) then + mapgen.autoplace_controls[name].frequency = mapgen.autoplace_controls[name].frequency * frequency_multiplier + end + else + log("Zone.apply_controls_to_mapgen: Attempt to apply invalid control name to mapgen: "..name) + controls[name] = nil + end + end + end + end +end + +function Zone.get_frequency_multiplier(zone) + if zone.radius then + return 5000 / zone.radius + end + return 1 +end + +function Zone.create_surface(zone) + + if not zone.surface_index then + + Universe.inflate_climate_controls(zone, false) + + -- TODO planets should have customised controls + + local map_gen_settings = table.deepcopy(game.default_map_gen_settings) + map_gen_settings.width = 0 + map_gen_settings.height = 0 + if not zone.seed then zone.seed = math.random(4294967295) end + map_gen_settings.seed = zone.seed + + local autoplace_controls = map_gen_settings.autoplace_controls + zone.controls = zone.controls or {} + + local frequency_multiplier = Zone.get_frequency_multiplier(zone) -- increase for small planets and moons + + -- For all possible controls set values so it can be regenreated consistently. + for control_name, control_prototype in pairs(game.autoplace_control_prototypes) do + if control_name ~= "planet-size" and game.autoplace_control_prototypes[control_name] then + zone.controls[control_name] = zone.controls[control_name] or {} + zone.controls[control_name].frequency = (zone.controls[control_name].frequency or (0.17 + math.random() * math.random() * 2)) + zone.controls[control_name].size = zone.controls[control_name].size or (0.1 + math.random() * 0.8) + zone.controls[control_name].richness = zone.controls[control_name].richness or (0.1 + math.random() * 0.8) + end + end + + zone.controls.moisture = zone.controls.moisture or {} + zone.controls.moisture.frequency = (zone.controls.moisture.frequency or (0.17 + math.random() * math.random() * 2)) + zone.controls.moisture.bias = zone.controls.moisture.bias or (math.random() - 0.5) + + zone.controls.aux = zone.controls.aux or {} + zone.controls.aux.frequency = (zone.controls.aux.frequency or (0.17 + math.random() * math.random() * 2)) + zone.controls.aux.bias = zone.controls.aux.bias or (math.random() - 0.5) + + zone.controls.cliff = zone.controls.cliff or {} + zone.controls.cliff.frequency = (zone.controls.cliff.frequency or (0.17 + math.random() * math.random() * 10)) -- + zone.controls.cliff.richness = zone.controls.cliff.richness or (math.random() * 1.25) + + --[[ + map_gen_settings.property_expression_names = { + ["control-setting:moisture:frequency:multiplier"] = zone.controls.moisture.frequency * frequency_multiplier, + ["control-setting:moisture:bias"] = zone.controls.moisture.bias, + ["control-setting:aux:frequency:multiplier"] = zone.controls.aux.frequency * frequency_multiplier, + ["control-setting:aux:bias"] = zone.controls.aux.bias, + } + zone.controls.water = zone.controls.water or {} + zone.controls.water.size = zone.controls.water.size or 0.01 -- high is 6, low is 0 + zone.controls.water.frequency = (zone.controls.water.frequency or 1) -- low is 0.17 + zone.controls.water.frequency = 0.5 + zone.controls.water.frequency / 2 + map_gen_settings.water = zone.controls.water.size + map_gen_settings.terrain_segmentation = zone.controls.water.frequency + ]]-- + Zone.apply_controls_to_mapgen(zone, zone.controls, map_gen_settings) + + autoplace_controls["planet-size"] = { frequency = 1, size = 1 } -- default + -- planet_radius = 10000 / 6 * (6 + log(1/planet_frequency/6, 2)) + -- planet_frequency = 1 / 6 / 2 ^ (planet_radius * 6 / 10000 - 6) + local planet_size_frequency = 1/6 -- 10000 radius planet + if Zone.is_solid(zone) then + map_gen_settings.width = zone.radius*2+32 + map_gen_settings.height = zone.radius*2+32 + -- planet or moon + --planet_size_frequency = 1 / (zone.radius / 10000) + planet_size_frequency = 1 / 6 / 2 ^ (zone.radius * 6 / 10000 - 6) + local penalty = -100000 + if zone.tags and util.table_contains(zone.tags, "water_none") then + map_gen_settings.property_expression_names["tile:deepwater:probability"] = penalty + map_gen_settings.property_expression_names["tile:water:probability"] = penalty + map_gen_settings.property_expression_names["tile:water-shallow:probability"] = penalty + map_gen_settings.property_expression_names["tile:water-mud:probability"] = penalty + end + map_gen_settings.property_expression_names["decorative:se-crater3-huge:probability"] = penalty + if not zone.is_homeworld then + map_gen_settings.starting_area = 0.5 + end + else + if zone.type == "orbit" then + autoplace_controls["planet-size"].size = zone.parent.radius and (zone.parent.radius / 200) or 50 + elseif zone.type == "asteroid-belt" then + autoplace_controls["planet-size"].size = 200 + elseif zone.type == "asteroid-field" then + autoplace_controls["planet-size"].size = 10000 + end + + planet_size_frequency = 1/1000 + map_gen_settings.cliff_settings={ + name="cliff", + cliff_elevation_0=10, -- default + cliff_elevation_interval=400, -- when set from the GUI the value is 40 / frequency. + richness=0, -- 0.17 to 6. + } + zone.controls.cliff.frequency = 0 + zone.controls.cliff.richness = 0 + + map_gen_settings.property_expression_names = { + ["control-setting:moisture:frequency:multiplier"] = 10, + ["control-setting:moisture:bias"] = -1, + ["control-setting:aux:frequency:multiplier"] = 0, + ["control-setting:aux:bias"] = 0, + } + map_gen_settings.starting_area = 0 + end + autoplace_controls["planet-size"].frequency = planet_size_frequency + + Log.debug_log("Creating surface " .. zone.name .. " with map_gen_settings:") + Log.debug_log(util.table_to_string(map_gen_settings)) + if Zone.is_space(zone) then + -- Speed up terrain generation by excluding everything not specifically allowed to spawn + --map_gen_settings.default_enable_all_autoplace_controls = false + map_gen_settings.autoplace_settings={ + ["decorative"]={ + treat_missing_as_default=false, + settings={ + ["se-crater3-huge"] ={}, + ["se-crater1-large-rare"] ={}, + ["se-crater1-large"] ={}, + ["se-crater2-medium"] ={}, + ["se-crater4-small"] ={}, + ["se-sand-decal-space"] ={}, + ["se-stone-decal-space"] ={}, + ["se-rock-medium-asteroid"] ={}, + ["se-rock-small-asteroid"] ={}, + ["se-rock-tiny-asteroid"] ={}, + ["se-sand-rock-medium-asteroid"] ={}, + ["se-sand-rock-small-asteroid"] ={} + } + }, + --[[["entity"]={ + treat_missing_as_default=false, + settings={ + ["se-rock-huge-asteroid"] ={}, + ["se-rock-big-asteroid"] ={}, + ["se-sand-rock-big-asteroid"] ={}, + ["se-rock-huge-space"] ={}, + ["se-rock-big-space"] ={}, + } + },]]-- + ["tile"]={ + treat_missing_as_default=false, + settings={ + ["se-asteroid"]={}, + ["se-space"]={} + } + }, + } + else + -- speed up terrain generation by specifying specific things not to spawn + local penalty = -100000 + map_gen_settings.property_expression_names["decorative:se-crater3-huge:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-crater1-large-rare:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-crater1-large:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-crater2-medium:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-crater4-small:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-sand-decal-space:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-stone-decal-space:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-rock-medium-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-rock-small-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-rock-tiny-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-sand-rock-medium-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["decorative:se-sand-rock-small-asteroid:probability"] = penalty + + map_gen_settings.property_expression_names["entity:se-rock-huge-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["entity:se-rock-big-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["entity:se-sand-rock-big-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["entity:se-rock-huge-space:probability"] = penalty + map_gen_settings.property_expression_names["entity:se-rock-big-space:probability"] = penalty + + map_gen_settings.property_expression_names["tile:se-asteroid:probability"] = penalty + map_gen_settings.property_expression_names["tile:se-space:probability"] = penalty + end + + local surface + if not game.surfaces[zone.name] then + surface = game.create_surface(zone.name, map_gen_settings) + surface.force_generate_chunk_requests() + + else + -- this happens if the mod was uninstalled and reinstalled. The surface will be invalid and unfaxable. + -- game.delete_surface(zone.name) -- does not work in time to re make the surface + surface = game.surfaces[zone.name] + surface.clear(false) + + end + + zone.surface_index = surface.index + global.zones_by_surface = global.zones_by_surface or {} + global.zones_by_surface[surface.index] = zone + + Zone.set_solar_and_daytime(zone) + + if zone.type == "planet" and not zone.is_homeworld then + + -- Vault planet + if (not zone.ruins) and not zone.glyph then + Ancient.assign_zone_next_glyph(zone) + end + Ancient.make_vault_exterior(zone) -- only makes the vault if glyph exists + + -- Interburbulator planet + if (not zone.glyph) and (not zone.ruins) and not global.interburbulator then + Interburbulator.make_interburbulator(zone) + end + if zone.interburbulator then + Interburbulator.build_platform() + end + + end + + if not zone.is_homeworld then + -- Unique ruins + Ruin.zone_assign_unique_ruins(zone) + Ruin.zone_build_ruins(zone, surface) + end + + if zone.type == "anomaly" then + Ancient.make_gate(Ancient.gate_default_position) + Ruin.build({ruin_name = "galaxy-ship", surface_index = surface.index, position = Ancient.galaxy_ship_default_position}) + end + + end +end + + +function Zone.get_star_from_child(zone) + if zone.type == "star" then + return zone + elseif zone.parent then + return Zone.get_star_from_child(zone.parent) + end +end + +function Zone.get_stellar_object_from_child(zone) + if zone.type == "asteroid-field" then + return zone + else + return Zone.get_star_from_child(zone) + end +end + +function Zone.get_star_from_position(zone) + if not zone.stellar_position then return end + for _, star in pairs(global.universe.stars) do + if star.stellar_position.x == zone.stellar_position.x and star.stellar_position.y == zone.stellar_position.y then + return star + end + end +end + +function Zone.get_stellar_object_from_position(zone) + local star = Zone.get_star_from_position(zone) + if star then return star end + for _, asteroid_field in pairs(global.universe.space_zones) do + if asteroid_field.stellar_position.x == zone.stellar_position.x and asteroid_field.stellar_position.y == zone.stellar_position.y then + return asteroid_field + end + end +end + +function Zone.get_solar(zone) -- can be spaceship too + -- return the actual expected light % including daytime for space zones and spaceships. + -- return peak expected light % space solid zones. + + if zone.type == "anomaly" then + return 0 + end + + local star + local star_gravity_well = 0 + + if zone.type == "spaceship" then + star = zone.near_star + star_gravity_well = zone.star_gravity_well or 0 + else + star = Zone.get_star_from_child(zone) + star_gravity_well = Zone.get_star_gravity_well(zone) + end + + local light_percent = 0 + + if star then + light_percent = 1.6 * star_gravity_well / (star.star_gravity_well + 1) + end + + if Zone.is_space(zone) then + if(zone.type == "orbit" and zone.parent and zone.parent.type == "star") then -- star + light_percent = light_percent * 10 -- x20 + elseif zone.type == "asteroid-belt" then + light_percent = light_percent * 2.5 -- x5 + else + light_percent = light_percent * 5 -- x10 + if zone.parent and zone.parent.radius then + light_percent = light_percent * (1 - 0.1 * zone.parent.radius / 10000) + end + end + light_percent = light_percent + 0.01 + else + if zone.radius then + light_percent = light_percent * (1 - 0.1 * zone.radius / 10000) + if zone.is_homeworld then + light_percent = 1 + end + end + end + + if zone.space_distortion and zone.space_distortion > 0 then + + light_percent = light_percent * (1 - zone.space_distortion) + + if zone.is_homeworld then + light_percent = 1 + end + end + return light_percent +end + +function Zone.get_display_light_percent(zone) + return Zone.get_solar(zone) +end + +function Zone.set_solar_and_daytime(zone) + local surface = Zone.get_surface(zone) + if not surface then return end + + if zone.type == "anomaly" then + surface.solar_power_multiplier = 0 + surface.daytime = 0.5 + return + end + + local light_percent = Zone.get_solar(zone) + + if Zone.is_space(zone) then + + -- light_percent is the total output + -- but we have most space zones daylight ranging from mid evening to night so that lights are active. + -- so that is the main driving factor. + -- except stars. + + surface.freeze_daytime = true + + if zone.type == "orbit" and zone.parent.type == "star" then + + surface.daytime = 0 -- very bright + surface.solar_power_multiplier = Zone.solar_multiplier * light_percent + + else + + if light_percent >= 0.5 then + surface.daytime = 0.35 -- half light + surface.solar_power_multiplier = Zone.solar_multiplier * light_percent * 2 -- x2 compensate for half light + else + -- for now all zone surfaces are syneced so that daytime 0 is at game.tick 0 + surface.daytime = 0.45 - 0.2 * light_percent + surface.solar_power_multiplier = Zone.solar_multiplier -- x2 compensate for half light max + -- light_percent of 1 would be 0.35 (half-light), + -- light_percent of 0 would be 0.45 (dark) + end + + end + + else + -- planet or moon + -- has daytime + + surface.daytime = (game.tick / zone.ticks_per_day) % 1 + surface.solar_power_multiplier = Zone.solar_multiplier * light_percent + + if zone.ticks_per_day then + surface.ticks_per_day = zone.ticks_per_day + end + + end + + if zone.type == "anomaly" then + surface.solar_power_multiplier = 0 + surface.daytime = 0.5 + end + +end + +function Zone.get_flags_weight(zone, force_name, playerdata) + local weight = ( + ((playerdata.track_glyphs and zone.glyph) and 0.96 or 0) + + ((zone.interburbulator or zone.ruins) and 0.95 or 0) + + ((playerdata.visited_zone and playerdata.visited_zone[zone.index]) and 0.97 or 0) + + ((global.forces[force_name].zone_assets and global.forces[force_name].zone_assets[zone.index] and table_size(global.forces[force_name].zone_assets[zone.index].rocket_landing_pad_names) > 0) and 0.98 or 0) + + ((global.forces[force_name].zone_assets and global.forces[force_name].zone_assets[zone.index] and table_size(global.forces[force_name].zone_assets[zone.index].rocket_launch_pad_names) > 0) and 1 or 0) + ) + Log.debug_log("Zone.get_flags_weight " .. zone.name.." " ..weight, "zone") + return weight +end + +function Zone.get_surface(zone) -- returns surface but does not build + if zone.type == "spaceship" then + return Spaceship.get_current_surface(zone) + end + if zone.surface_index then + return game.get_surface(zone.surface_index) + end + return nil +end + +function Zone.get_surface_name(zone) + local surface = Zone.get_surface(zone) + if surface then return surface.name end +end + +function Zone.get_make_surface(zone) + if zone.type == "spaceship" then + return Spaceship.get_current_surface(zone) + end + if not zone.surface_index then Zone.create_surface(zone) end + return game.get_surface(zone.surface_index) +end + +function Zone.discover(force_name, zone, source) -- source could be "Satellite " + global.forces[force_name] = global.forces[force_name] or {} + global.forces[force_name].zones_discovered = global.forces[force_name].zones_discovered or {} + global.forces[force_name].zones_discovered_count = global.forces[force_name].zones_discovered_count or 0 + + if not global.forces[force_name].zones_discovered[zone.index] then + + Universe.inflate_climate_controls(zone, false) + + global.forces[force_name].zones_discovered[zone.index] = { + discovered_at = game.tick, + marker = nil + } + global.forces[force_name].zones_discovered_count = global.forces[force_name].zones_discovered_count + 1 + if zone.type == "planet" and (not zone.is_homeworld) and (not zone.ruins) and (not zone.glyph) then + Ancient.assign_zone_next_glyph(zone) + end + + -- Unique ruins + Ruin.zone_assign_unique_ruins(zone) + + local message = nil + if source then + message = {"space-exploration.source-discovered-zone", source, Zone.type_title(zone), Zone.get_icon(zone), zone.name} + --game.forces[force_name].print(source .. " discovered a new " .. Zone.type_title(zone) .. ": " .. zone.name) + else + message = {"space-exploration.discovered-zone", source, Zone.type_title(zone), Zone.get_icon(zone), zone.name} + --game.forces[force_name].print("Discovered a new " .. Zone.type_title(zone) .. ": " .. zone.name) + end + local tick_task = new_tick_task("force-message") + tick_task.force_name = force_name + tick_task.message = message + + Zone.apply_markers(zone) -- in case the surface exists + + for _, player in pairs(game.connected_players) do + if Zonelist.get_main_window(player.index) then + Zonelist.gui_update_list(player.index) + end + end + + if zone.type == "anomaly" then + local tick_task = new_tick_task("force-message") + tick_task.force_name = force_name + tick_task.message = {"space-exploration.discovered-anomaly-additional"} + tick_task.delay_until = game.tick + 300 --5s + end + + if zone.glyph then + local force = game.forces[force_name] + for _, player in pairs(force.players) do + if player.connected then + local playerdata = get_make_playerdata(player) + if playerdata.track_glyphs then + player.print({"space-exploration.discovered-glyph-vault", zone.name}) + end + end + end + end + + return true + + end + return false +end + +function Zone.discover_next_research(force_name, source, allow_targeted) + global.forces[force_name] = global.forces[force_name] or {} + global.forces[force_name].zones_discovered = global.forces[force_name].zones_discovered or {} + global.forces[force_name].zones_discovered_count = global.forces[force_name].zones_discovered_count or 0 + + local target_resource = "n/a" + if allow_targeted then + target_resource = global.forces[force_name].search_for_resource + end + + local can_discover = {} + local can_discover_targeted = {} + + -- star and deep space discovery should be bias to nearer positions + local closest_1 = nil + local closest_stellar_distance = 1000000 + local pos1 = {x = 0, y = 0} -- focus on aeras close to the center of the star map + + for _, star in pairs(global.universe.stars) do + if not global.forces[force_name].zones_discovered[star.index] then + local pos2 = Zone.get_stellar_position(star) + local distance = util.vectors_delta_length(pos1, pos2) + if distance < closest_stellar_distance then + closest_stellar_distance = distance + closest_1 = star + end + end + end + + if closest_1 then + -- x5 + table.insert(can_discover, closest_1) + table.insert(can_discover, closest_1) + table.insert(can_discover, closest_1) + table.insert(can_discover, closest_1) + table.insert(can_discover, closest_1) + end + + for _, star in pairs(global.universe.stars) do + if global.forces[force_name].zones_discovered[star.index] then + for _, planet in pairs(star.children) do + if not global.forces[force_name].zones_discovered[planet.index] then + if planet.primary_resource == target_resource then + table.insert(can_discover_targeted, planet) + if planet.type == "planet" then + --x5 bias towards planets + table.insert(can_discover_targeted, planet) + table.insert(can_discover_targeted, planet) + table.insert(can_discover_targeted, planet) + table.insert(can_discover_targeted, planet) + end + else + table.insert(can_discover, planet) + if planet.type == "planet" then + --x5 bias towards planets + table.insert(can_discover, planet) + table.insert(can_discover, planet) + table.insert(can_discover, planet) + table.insert(can_discover, planet) + end + end + else + if planet.children then + for _, moon in pairs(planet.children) do + if not global.forces[force_name].zones_discovered[moon.index] then + if moon.primary_resource == target_resource then + table.insert(can_discover_targeted, moon) + else + table.insert(can_discover, moon) + end + end + end + end + end + end + end + end + + if #can_discover_targeted > 0 then + return Zone.discover(force_name, Util.random_from_array(can_discover_targeted), source) + end + if #can_discover > 0 then + return Zone.discover(force_name, Util.random_from_array(can_discover), source) + end + +end + +function Zone.discover_next_research_deep_space(force_name, source, allow_targeted) + global.forces[force_name] = global.forces[force_name] or {} + global.forces[force_name].zones_discovered = global.forces[force_name].zones_discovered or {} + global.forces[force_name].zones_discovered_count = global.forces[force_name].zones_discovered_count or 0 + + if game.forces[force_name].technologies[Zone.name_tech_discover_deep].level > 11 then + -- should have discovered multiple stars at this point + if not global.forces[force_name].zones_discovered[global.universe.anomaly.index] then + return Zone.discover(force_name, global.universe.anomaly, source) + end + end + + local target_resource = "n/a" + if allow_targeted then + target_resource = global.forces[force_name].search_for_resource + end + + local can_discover = {} + local can_discover_targeted = {} + for _, zone in pairs(global.universe.space_zones) do + if not global.forces[force_name].zones_discovered[zone.index] then + if zone.primary_resource == target_resource then + table.insert(can_discover_targeted, zone) + else + table.insert(can_discover, zone) + end + end + end + + if #can_discover_targeted > 0 then + return Zone.discover(force_name, Util.random_from_array(can_discover_targeted), source) + end + if #can_discover > 0 then + return Zone.discover(force_name, Util.random_from_array(can_discover), source) + end +end + +function Zone.discover_next_satellite(force_name, source, system_restriction) + global.forces[force_name] = global.forces[force_name] or {} + global.forces[force_name].zones_discovered = global.forces[force_name].zones_discovered or {} + global.forces[force_name].zones_discovered_count = global.forces[force_name].zones_discovered_count or 0 + + if system_restriction then + local star = system_restriction + while star.parent do + star = star.parent + end + local last_valid + if star.children then + for _, planet in pairs(star.children) do + if not global.forces[force_name].zones_discovered[planet.index] then + if math.random() < 0.5 then -- skip it + last_valid = planet + else + return Zone.discover(force_name, planet, source) + end + elseif planet.children then + for _, moon in pairs(planet.children) do + if not global.forces[force_name].zones_discovered[moon.index] then + if math.random() < 0.5 then -- skip it + last_valid = moon + else + return Zone.discover(force_name, moon, source) + end + end + end + end + end + end + --skipped too much + if last_valid then + return Zone.discover(force_name, last_valid, source) + end + -- find stars now + local closest_1 = nil + local closest_stellar_distance = 1000000 + local pos1 = Zone.get_stellar_position(star) + + for _, star2 in pairs(global.universe.stars) do + if not global.forces[force_name].zones_discovered[star2.index] then + local pos2 = Zone.get_stellar_position(star2) + local distance = util.vectors_delta_length(pos1, pos2) + if distance < closest_stellar_distance then + closest_stellar_distance = distance + closest_1 = star2 + end + end + end + if closest_1 then + return Zone.discover(force_name, closest_1, source) + end + return false + end + +end + +function Zone.find_nearest_stellar_object(stellar_position) + local closest_distance = math.huge + local closest = nil + + for _, star in pairs(global.universe.stars) do + local distance = util.vectors_delta_length(star.stellar_position, stellar_position) + if distance < closest_distance then + closest_distance = distance + closest = star + end + end + + for _, space_zone in pairs(global.universe.space_zones) do + local distance = util.vectors_delta_length(space_zone.stellar_position, stellar_position) + if distance < closest_distance then + closest_distance = distance + closest = space_zone + end + end + return closest +end + +function Zone.find_nearest_star(stellar_position) + local closest_distance = math.huge + local closest = nil + + for _, star in pairs(global.universe.stars) do + local distance = util.vectors_delta_length(star.stellar_position, stellar_position) + if distance < closest_distance then + closest_distance = distance + closest = star + end + end + return closest +end + +function Zone.find_nearest_zone(space_distortion, stellar_position, star_gravity_well, planet_gravity_well) + + if space_distortion > 0.4 then return global.universe.anomaly end -- default from the anomaly + + local star = Zone.find_nearest_stellar_object(stellar_position) -- can be asteroid field + if star_gravity_well > 0 then + local closest_zone = star + local closest_distance = math.abs((star.star_gravity_well or 0) - star_gravity_well) + if closest_zone.type == "star" then + for _, planet in pairs(star.children) do + local distance = math.abs(planet.star_gravity_well - star_gravity_well) + if distance < closest_distance then + closest_distance = distance + closest_zone = planet + end + end + end + + if closest_zone.type == "planet" then + local closest_zone2 = closest_zone + closest_distance = math.abs(closest_zone.planet_gravity_well - planet_gravity_well) + for _, moon in pairs(closest_zone.children) do + if moon.type == "moon" then + local distance = math.abs(moon.planet_gravity_well - planet_gravity_well) + if distance < closest_distance then + closest_distance = distance + closest_zone2 = moon + end + end + end + return closest_zone2 + end + return closest_zone + else + if not star then return global.universe.anomaly end + if not star.children then return star end + local last_child = star.children[#star.children] + if last_child.children then + last_child = last_child.children[#last_child.children] + end + return last_child + end + return Zone.get_default() + +end + +function Zone.find_nearest_solid_zone(space_distortion, stellar_position, star_gravity_well, planet_gravity_well, allow_moon) + if space_distortion == 1 then return Zone.get_default() end -- default from the anomaly + + if planet_gravity_well == 0 then -- if no moon + planet_gravity_well = 100000 -- high to land on planet + end + + if star_gravity_well == 0 then -- if no planet + star_gravity_well = 100000 -- high to land on planet with high solar + end + + local star = Zone.find_nearest_star(stellar_position) + if not star then return Zone.get_default() end + + local closest_planet = nil + local closest_distance = math.huge + for _, planet in pairs(star.children) do + if planet.type == "planet" then -- not an asteroid belt + local distance = math.abs(planet.star_gravity_well - star_gravity_well) + if distance < closest_distance then + closest_distance = distance + closest_planet = planet + end + end + end + + if not closest_planet then return Zone.get_default() end + + local closest_body = closest_planet -- default to planet + + if allow_moon then + closest_distance = math.abs(closest_body.planet_gravity_well - planet_gravity_well) + -- see if a moon is closer + for _, moon in pairs(closest_planet.children) do + if moon.type == "moon" then + local distance = math.abs(moon.planet_gravity_well - planet_gravity_well) + if distance < closest_distance then + closest_distance = distance + closest_body = moon + end + end + end + end + + return closest_body + +end + +function Zone.find_nearest_solid_zone_from_zone(zone) + -- typically used for escape pod + if Zone.is_solid(zone) then return nil end -- already there + + if zone.type == "orbit" and Zone.is_solid(zone.parent) then + return zone.parent -- drop to planet / moon + end + + return Zone.find_nearest_solid_zone( + Zone.get_space_distortion(zone), + Zone.get_stellar_position(zone), + Zone.get_star_gravity_well(zone), + Zone.get_planet_gravity_well(zone), + true + ) +end + +function Zone.get_force_assets(force_name, zone_index) + if not global.forces[force_name] then + if game.forces[force_name] then + setup_force(game.forces[force_name]) + else + return + end + end + if not global.forces[force_name] then + if game.forces[force_name] then + game.forces[force_name].print("Error getting force data for invalid player force " .. force_name) + else + game.forces[force_name].print("Error getting force data for invalid force " .. force_name) + end + return -- invalid force + end + if not global.forces[force_name].zone_assets then + global.forces[force_name].zone_assets = {} + end + if not global.forces[force_name].zone_assets[zone_index] then + global.forces[force_name].zone_assets[zone_index] = { + rocket_launch_pad_names = {}, + rocket_landing_pad_names = {}, + } + end + --Log.debug_log("Zone.get_force_assets: " .. util.table_to_string(global.forces[force_name].zone_assets[zone_index])) + return global.forces[force_name].zone_assets[zone_index] +end + +function Zone.get_travel_delta_v_sub(origin, destination) + -- expected ranges: + -- 1500 planetary system + -- 15000 solar system + -- 50000 interstellarsystem + -- 50000 to/from anomaly + if origin == destination then return 0 end + + local origin_space_distorion = Zone.get_space_distortion(origin) + local origin_stellar_position = Zone.get_stellar_position(origin) + local origin_star_gravity_well = Zone.get_star_gravity_well(origin) + local origin_planet_gravity_well = Zone.get_planet_gravity_well(origin) + + local destination_space_distorion = Zone.get_space_distortion(destination) + local destination_stellar_position = Zone.get_stellar_position(destination) + local destination_star_gravity_well = Zone.get_star_gravity_well(destination) + local destination_planet_gravity_well = Zone.get_planet_gravity_well(destination) + + if origin_space_distorion > 0 then + return Zone.travel_cost_space_distortion + + Zone.travel_cost_star_gravity * destination_star_gravity_well + + Zone.travel_cost_planet_gravity * destination_planet_gravity_well + elseif destination_space_distorion > 0 then + return Zone.travel_cost_space_distortion + + Zone.travel_cost_star_gravity * origin_star_gravity_well + + Zone.travel_cost_planet_gravity * origin_planet_gravity_well + end + + if origin_stellar_position.x == destination_stellar_position.x and origin_stellar_position.y == destination_stellar_position.y then + -- same solar system + if origin_star_gravity_well == destination_star_gravity_well then + -- same planetary system + return Zone.travel_cost_planet_gravity * math.abs(origin_planet_gravity_well - destination_planet_gravity_well) -- the planet_gravity_well difference + else + -- different planetary systems + return Zone.travel_cost_star_gravity * math.abs(destination_star_gravity_well - origin_star_gravity_well) -- the star_gravity_well difference + + Zone.travel_cost_planet_gravity * origin_planet_gravity_well + + Zone.travel_cost_planet_gravity * destination_planet_gravity_well + end + else + -- interstellar + return Zone.travel_cost_interstellar * util.vectors_delta_length(origin_stellar_position, destination_stellar_position) + + Zone.travel_cost_star_gravity * origin_star_gravity_well + + Zone.travel_cost_planet_gravity * origin_planet_gravity_well + + Zone.travel_cost_star_gravity * destination_star_gravity_well + + Zone.travel_cost_planet_gravity * destination_planet_gravity_well + end + +end + +function Zone.get_travel_delta_v(origin, destination) + if origin and destination then + if origin.type == "spaceship" or destination.type == "spaceship" then + return Zone.get_travel_delta_v_sub(origin, destination) + end + global.cache_travel_delta_v = global.cache_travel_delta_v or {} + global.cache_travel_delta_v[origin.index] = global.cache_travel_delta_v[origin.index] or {} + if not global.cache_travel_delta_v[origin.index][destination.index] then + global.cache_travel_delta_v[origin.index][destination.index] = Zone.get_travel_delta_v_sub(origin, destination) + end + return global.cache_travel_delta_v[origin.index][destination.index] + end +end + +function Zone.get_launch_delta_v(zone) + -- 10000 to 800 for planets, 0 for in space + return 500 + (zone.radius or 50) +end + +function Zone.get_closest_zone(origin, destination_list) + if origin and destination_list then + if Util.table_contains(destination_list, origin) then return origin end + local destination = nil + local delta_v_closest = math.huge + local delta_v_current = nil + for _, zone in pairs(destination_list) do + delta_v_current = Zone.get_travel_delta_v(origin, zone) + if delta_v_current < delta_v_closest then + delta_v_closest = delta_v_current + destination = zone + end + end + return destination + end +end + +function Zone.find_zone_landing_position(zone, try_position) + Log.debug_log("Zone.find_zone_landing_position: " ..zone.name) + local surface = Zone.get_make_surface(zone) + + if not try_position then + if zone.type == "spaceship" then + try_position = Spaceship.get_boarding_position(zone) + elseif Zone.is_solid(zone) then + local try_angle = math.random() * math.pi * 2 -- rad + local try_distance = math.random() * (zone.radius / 4 or 512) + try_position = {x = math.cos(try_angle) * try_distance, y = math.sin(try_angle) * try_distance} + else + try_position = {x = math.random(-512, 512), y = math.random(-128, 128)} + end + end + surface.request_to_generate_chunks(try_position, 2) + surface.force_generate_chunk_requests() + local safe_position + if Zone.is_solid(zone) then + safe_position = surface.find_non_colliding_position(collision_rocket_destination_surface, try_position, 64, 1) + else + safe_position = surface.find_non_colliding_position(collision_rocket_destination_orbit, try_position, 64, 1) + end + if not safe_position then + local try_position_2 = {x = 64 * (math.random() - 0.5), y = 64 * (math.random() - 0.5)} + surface.request_to_generate_chunks(try_position_2, 2) + surface.force_generate_chunk_requests() + if Zone.is_solid(zone) then + safe_position = surface.find_non_colliding_position(collision_rocket_destination_surface, try_position_2, 64, 1) + else + safe_position = surface.find_non_colliding_position(collision_rocket_destination_orbit, try_position_2, 64, 1) + end + end + if safe_position then + Log.debug_log("Zone.find_zone_landing_position: safe_position found") + return safe_position + else + Log.debug_log("Zone.find_zone_landing_position: safe_position not found, falling back to try_position") + return try_position + end +end + +function Zone.dropdown_name_from_zone(zone, no_indent) + local i1 = " " + local i2 = " " + local i3 = " " + if no_indent then + i1 = "" + i2 = "" + i3 = "" + end + if zone.type == "orbit" then + if zone.parent.type == "star" then + return "[img=virtual-signal/se-star] " .. zone.name -- star orbit + elseif zone.parent.type == "planet" then + return i2.."[img=virtual-signal/se-planet-orbit] " .. zone.name -- planet orbit + elseif zone.parent.type == "moon" then + return i3.."[img=virtual-signal/se-moon-orbit] " .. zone.name -- moon orbit + end + elseif zone.type == "asteroid-belt" then + return i1 .. "[img=virtual-signal/se-asteroid-belt] " .. zone.name + elseif zone.type == "planet" then + return i1 .. "[img=virtual-signal/se-planet] " .. zone.name + elseif zone.type == "moon" then + return i2 .. "[img=virtual-signal/se-moon] " .. zone.name + elseif zone.type == "asteroid-field" then + return "[img=virtual-signal/"..mod_prefix..zone.type .. "] " .. zone.name .. " [color=black](Asteroid Field)[/color]" + elseif zone.type == "anomaly" then + return "[img=virtual-signal/"..mod_prefix..zone.type .. "] " .. zone.name .. " [color=black](Anomaly)[/color]" + elseif zone.type == "spaceship" then + return "[img=virtual-signal/"..mod_prefix..zone.type .. "] " .. zone.name .. " [color=black](Spaceship)[/color]" + end + return "[img=virtual-signal/"..mod_prefix..zone.type .. "] " .. zone.name +end + +function Zone.get_alphabetised() + local zones_alphabetised = {} + for _, zone in pairs(global.zone_index) do + table.insert(zones_alphabetised, zone) + end + for _, spaceship in pairs(global.spaceships) do + table.insert(zones_alphabetised, spaceship) + end + table.sort(zones_alphabetised, function(a,b) return a.name < b.name end) + return zones_alphabetised +end + +function Zone.is_visible_to_force(zone, force_name) + if global.debug_view_all_zones then return true end + if zone.type == "spaceship" then return zone.force_name == force_name end + if not (global.forces[force_name] and global.forces[force_name].zones_discovered) then return false end + return global.forces[force_name].zones_discovered[zone.index] or (zone.type == "orbit" and global.forces[force_name].zones_discovered[zone.parent.index]) and true or false +end +function Zone.insert_if_visible_to_force(target_table, zone, force_name) + if Zone.is_visible_to_force(zone, force_name) then table.insert(target_table, zone) end +end + +function Zone.dropdown_list_zone_destinations(force_name, current, alphabetical, filter, wildcard, star_restriction) + -- wildcard = {list = "display", value={type = "any"}} + local selected_index = 1 + local list = {""} + local values = {{type = "nil", index = nil}} -- zone indexes + local forcedata = global.forces[force_name] + if not forcedata then return list, selected_index, values end + + if wildcard then + table.insert(list, wildcard.list) + table.insert(values, wildcard.value) + end + + function conditional_add_zone_to_list(forcedata, current, zone) + if global.debug_view_all_zones + or (zone.type == "spaceship" and forcedata.force_name == zone.force_name) + or (zone.type ~= "spaceship" and (forcedata.zones_discovered[zone.index] or (zone.type == "orbit" and forcedata.zones_discovered[zone.parent.index]))) then + local allowed_system = true + if star_restriction then + allowed_system = false + if zone == star_restriction + or Zone.get_star_from_child(zone) == star_restriction then + allowed_system = true + end + end + if allowed_system then + if zone.type == "star" then + table.insert(list, Zone.dropdown_name_from_zone(zone.orbit, alphabetical or filter)) + table.insert(values, {type = "zone", index = zone.orbit.index}) + if current and zone.orbit.index == current.index then selected_index = #list end + elseif zone.type == "spaceship" then + table.insert(list, Zone.dropdown_name_from_zone(zone, alphabetical or filter)) + table.insert(values, {type = "spaceship", index = zone.index}) + if current and zone.type == current.type and zone.index == current.index then selected_index = #list end + else + table.insert(list, Zone.dropdown_name_from_zone(zone, alphabetical or filter)) + table.insert(values, {type = "zone", index = zone.index}) + if current and zone.type == current.type and zone.index == current.index then selected_index = #list end + end + end + end + end + + if alphabetical == true or filter then + for _, zone in pairs(Zone.get_alphabetised()) do + if not(zone.type == "orbit" and zone.parent.type == "star") then + if (not filter) or string.find(string.lower(zone.name), string.lower(filter), 1, true) then + conditional_add_zone_to_list(forcedata, current, zone) + end + end + end + else + conditional_add_zone_to_list(forcedata, current, global.universe.anomaly) + + for _, star in pairs(global.universe.stars) do + conditional_add_zone_to_list(forcedata, current, star) + for _, planet in pairs(star.children) do + conditional_add_zone_to_list(forcedata, current, planet) + if planet.children then + conditional_add_zone_to_list(forcedata, current, planet.orbit) + for _, moon in pairs(planet.children) do + conditional_add_zone_to_list(forcedata, current, moon) + conditional_add_zone_to_list(forcedata, current, moon.orbit) + end + end + end + end + + for _, zone in pairs(global.universe.space_zones) do + conditional_add_zone_to_list(forcedata, current, zone) + end + + for _, spaceship in pairs(global.spaceships) do + conditional_add_zone_to_list(forcedata, current, spaceship) + end + end + + if star_restriction then + if filter then + list[1] = (#list - 1) .. " matching locations in system" + else + list[1] = (#list - 1) .. " known locations in system" + end + else + if filter then + list[1] = (#list - 1) .. " matching locations" + else + list[1] = (#list - 1) .. " known locations" + end + end + + return list, selected_index, values +end + +function Zone.build_tile_replacements(zone) + -- replaces biome_collections in replace specifications with the full biome names + --[[ + convert : + biome_replacement = { + {replace={"all-dirt", "all-sand", "all-volcanic"}, with="sand-red"}, + {replace={"all-vegetation", "all-frozen"}, with="vegetation-red"} + } + to + { + ["tile-from-1"] = "tile-to-1", + ["tile-from-2"] = "tile-to-1", + } + ]]-- + if zone.biome_replacements then + + -- expand replacement collections + local biome_replacements_expanded = {} + for _, replacement in pairs(zone.biome_replacements) do + local replace_biomes = {} + for _, replace in pairs(replacement.replace) do + if Zone.biome_collections[replace] then -- this is a collection name + for _, biome_name in pairs(Zone.biome_collections[replace]) do + if biome_name ~= replacement.with then -- don't replace to iteself + table.insert(replace_biomes, biome_name) + end + end + elseif replace ~= replacement.with then -- this is a biome name + table.insert(replace_biomes, replace) + end + end + table.insert(biome_replacements_expanded, {replace = replace_biomes, with = replacement.with}) + end + -- biome_replacements_expanded now has all of the replace names being all biome names + -- build tile map + local tile_replacements = {} + for _, replacement in pairs(biome_replacements_expanded) do + local to_tiles = Zone.biome_tiles[replacement.with] + local i = 0 + for _, replace in pairs(replacement.replace) do + for _, replace_tile in pairs(Zone.biome_tiles[replace]) do + tile_replacements[replace_tile] = to_tiles[(i % #to_tiles) + 1] + i = i + 1 + end + end + end + + zone.tile_replacements = tile_replacements + end + +end + +function Zone.on_chunk_generated(event) + local area = event.area + local surface = event.surface + local zone = Zone.from_surface(surface) + if zone and Zone.is_solid(zone) then + if zone.biome_replacements then + if not zone.tile_replacements then + Zone.build_tile_replacements(zone) + end + local set_tiles = {} -- by tile name, array of positions, for the surface.set_tiles function + for x = area.left_top.x, area.right_bottom.x do + for y = area.left_top.y, area.right_bottom.y do + local tile = surface.get_tile(x, y) + if zone.tile_replacements[tile.name] then + table.insert(set_tiles, { + name = zone.tile_replacements[tile.name], + position = tile.position + }) + end + end + end + if #set_tiles > 0 then + surface.set_tiles(set_tiles, true) + surface.destroy_decoratives{area = area} + surface.regenerate_decorative(nil, {{x = math.floor((area.left_top.x+16)/32), y = math.floor((area.left_top.y+16)/32)}}) + end + end + end +end +Event.addListener(defines.events.on_chunk_generated, Zone.on_chunk_generated) + +function Zone.export_zone(zone) + if not zone then return end + -- not safe to deepcopy + -- make all object table references id references instead. + local export_zone = Util.shallow_copy(zone) + if export_zone.orbit then + export_zone.orbit_index = export_zone.orbit.index + export_zone.orbit = nil + end + if export_zone.parent then + export_zone.parent_index = export_zone.parent.index + export_zone.parent = nil + end + if export_zone.children then + export_zone.child_indexes = {} + for i, child in pairs(export_zone.children) do + export_zone.child_indexes[i] = child.index + end + export_zone.children = nil + end + -- should be safe to deepcopy now + export_zone = Util.deep_copy(export_zone) + return export_zone +end + +function Zone.get_threat(zone) + if Zone.is_solid(zone) then + if zone.is_homeworld and zone.surface_index then + local surface = Zone.get_surface(zone) + local mapgen = surface.map_gen_settings + if mapgen.autoplace_controls["enemy-base"] and mapgen.autoplace_controls["enemy-base"].size then + return math.max(0, math.min(1, mapgen.autoplace_controls["enemy-base"].size / 3)) -- 0-1 + end + end + if zone.controls and zone.controls["enemy-base"] and zone.controls["enemy-base"].size then + return math.max(0, math.min(1, zone.controls["enemy-base"].size / 3)) -- 0-1 + end + end + return 0 +end + +function Zone.get_priority(zone, force_name) + if global.forces[force_name] then + if zone.type ~= "spaceship" and global.forces[force_name].zone_priorities and global.forces[force_name].zone_priorities[zone.index] then + return global.forces[force_name].zone_priorities[zone.index] + end + if zone.type == "spaceship" and global.forces[force_name].spaceship_priorities and global.forces[force_name].spaceship_priorities[zone.index] then + return global.forces[force_name].spaceship_priorities[zone.index] + end + end + return 0 +end + +function Zone.get_attrition(zone, default_rate) + if default_rate == nil then default_rate = settings.global["robot-attrition-factor"].value end + if zone then + if zone.type == "spaceship" then + return 0 -- no attrition + elseif zone.type == "anomaly" then -- anomalies are dangerous, give them an absolute increase + return 10 + default_rate * 2 + elseif Zone.is_solid(zone) then -- planet or moon + if zone.name == "Nauvis" or zone.is_homeworld then + return default_rate + end + local enemy = 0 + if zone.controls and zone.controls["enemy-base"] and zone.controls["enemy-base"].size then + enemy = Zone.get_threat(zone) -- 0-1 + end + local rate = 0.5 * (1 - enemy * 0.9) + rate = rate + 0.5 * zone.radius / 10000 + if enemy == 0 then -- add a penalty to enemy free zones + rate = rate + 10 + end + return rate * (0.5 + 0.5 * default_rate) + else -- space + local star_gravity_well = Zone.get_star_gravity_well(zone) + local planet_gravity_well = Zone.get_planet_gravity_well(zone) + local base_rate = star_gravity_well / 20 + planet_gravity_well / 200 + local rate = 10 * (0.01 + 0.99 * base_rate) -- 0-1 + return rate * (0.5 + 0.5 * default_rate) + end + end +end + +function Zone.rebuild_surface_index() + global.zones_by_surface = {} + for _, zone in pairs(global.zone_index) do + if zone.surface_index then + if game.surfaces[zone.surface_index] then + global.zones_by_surface[zone.surface_index] = zone + else + zone.surface_index = nil + end + end + end +end + +function Zone.trim_surface(zone, player_index) + local surface = Zone.get_surface(zone) + if not surface then return end + + local protected_forces = { + friendle = "friendly", + capture = "capture", + conquest = "conquest" + } + + for force_name, forcedata in pairs(global.forces) do + if game.forces[force_name] and not is_system_force(force_name) then + protected_forces[force_name] = force_name + end + end + + local protected_entities = table.deepcopy(Ancient.vault_entrance_structures) + table.insert(protected_entities, Ancient.name_gate_blocker) + table.insert(protected_entities, Ancient.name_gate_blocker_void) + for name, stuff in pairs(Ancient.gate_fragments) do + table.insert(protected_entities, name) + end + + local min_x = 1000000 + local max_x = -1000000 + local min_y = 1000000 + local max_y = -1000000 + + local entities = surface.find_entities_filtered{name = protected_entities} + if #entities > 0 then + for _, entity in pairs(entities) do + --local p = entity.position + local b = entity.bounding_box + min_x = min_x and math.min(min_x, b.left_top.x) or b.left_top.x + min_y = min_y and math.min(min_y, b.left_top.y) or b.left_top.y + max_x = max_x and math.max(max_x, b.right_bottom.x) or b.right_bottom.x + max_y = max_y and math.max(max_y, b.right_bottom.y) or b.right_bottom.y + end + end + + + for chunk in surface.get_chunks() do + if surface.count_entities_filtered{force = protected_forces, area = chunk.area} > 0 then + min_x = min_x and math.min(min_x, chunk.area.left_top.x) or chunk.area.left_top.x + min_y = min_y and math.min(min_y, chunk.area.left_top.y) or chunk.area.left_top.y + max_x = max_x and math.max(max_x, chunk.area.right_bottom.x) or chunk.area.right_bottom.x + max_y = max_y and math.max(max_y, chunk.area.right_bottom.y) or chunk.area.right_bottom.y + end + end + + local chunk_min_x = math.floor(min_x/32) -1 + local chunk_max_x = math.floor(max_x/32) +1 + local chunk_min_y = math.ceil(min_y/32) -1 + local chunk_max_y = math.ceil(max_y/32) +1 + + local chunks_deleted = 0 + for chunk in surface.get_chunks() do + if chunk.x < chunk_min_x + or chunk.x > chunk_max_x + or chunk.y < chunk_min_y + or chunk.y > chunk_max_y then + chunks_deleted = chunks_deleted + 1 + surface.delete_chunk(chunk) + end + end + rendering.draw_rectangle{ + color = {0,0,1}, + widht = 1, + filled = false, + left_top = {min_x, min_y}, + right_bottom = {max_x, max_y}, + surface = surface, + time_to_live = 60 + } + rendering.draw_rectangle{ + color = {1,0,0}, + widht = 1, + filled = false, + left_top = {chunk_min_x*32, chunk_min_y*32}, + right_bottom = {chunk_max_x*32, chunk_max_y*32}, + surface = surface, + time_to_live = 60 + } + game.print({"space-exploration.trim-zone-results", chunks_deleted, zone.name, chunk_min_x, chunk_max_x, chunk_min_y, chunk_max_y}) + --game.print("Deleted "..chunks_deleted.." from "..zone.name ..". Trimmed X ["..chunk_min_x.." to "..chunk_max_x.."] Y ["..chunk_min_y.." to "..chunk_max_y.."]") + +end + +function Zone.delete_surface(zone, player_index) + local player + if player_index then + player = game.players[player_index] + end + if zone.surface_index == 1 then + if player then player.print("Game cannot delete surface 1.") end + return + end + if zone.is_homeworld then + if player then player.print("Cannot delete homeworlds.") end + return + end + if zone.type == "anomaly" then + if player then player.print("Cannot delete anomalies.") end + return + end + if zone.type == "spaceship" then + if player then player.print("Cannot delete spaceships. They must be landed and dismantled.") end + return + end + if not zone.surface_index then + if player then player.print("Zone has no surface.") end + return + end + local surface = Zone.get_surface(zone) + if not surface then + --error(Zone.name.." has a surface but it was missing.") + zone.surface_index = nil + Zone.rebuild_surface_index() + return + end + local force_names = {} + for force_name, force in pairs(global.forces) do + if force.has_players and game.forces[force_name] then + table.insert(force_names, force_name) + end + end + local count_entities = surface.count_entities_filtered{force=force_names, type={"character", "electric-pole", "container", "logistic-container"}} + if count_entities > 0 then + if player then player.print("Cannot delete a zone with player entities.") end + else + log("Deleting surface for zone: " .. zone.name) + -- find all players viewing that surface + for _, player in pairs(game.connected_players) do + if player.surface == surface then + local force = player.force + local home_zone + if global.forces[force.name] and global.forces[force.name].homeworld_index then + home_zone = Zone.from_zone_index(global.forces[force.name].homeworld_index) + end + if not home_zone then home_zone = Zone.from_name("Nauvis") end + player.teleport({0,0}, Zone.get_make_surface(home_zone)) + end + end + game.delete_surface(surface) + zone.surface_index = nil + zone.deleted_surface = {tick = game.tick, player_index = player_index} + Zone.rebuild_surface_index() + end +end + + +function Zone.on_surface_created(surface_index) + local zone = Zone.from_surface_index(surface_index) + if not zone then + game.surfaces[surface_index].solar_power_multiplier = Zone.solar_multiplier * 0.5 + end +end +Event.addListener(defines.events.on_surface_created, on_surface_created) + +function Zone.on_research_finished(event) + + local force = event.research.force + + if event.research.name == Zone.name_tech_discover_random then + local dicovered_something = Zone.discover_next_research(force.name, "Telescope data analysis", false) + if not dicovered_something then + force.print({"space-exploration.tech-discovered-nothing"}) + end + elseif event.research.name == Zone.name_tech_discover_targeted then + local dicovered_something = Zone.discover_next_research(force.name, "Telescope data analysis", true) + if not dicovered_something then + force.print({"space-exploration.tech-discovered-nothing"}) + end + elseif event.research.name == Zone.name_tech_discover_deep then + local dicovered_something = Zone.discover_next_research_deep_space(force.name, "Telescope data analysis", false) + if not dicovered_something then + force.print({"space-exploration.tech-deep-discovered-nothing"}) + end + end +end +Event.addListener(defines.events.on_research_finished, Zone.on_research_finished) + + +function Zone.zone_fix_all_tiles(zone) -- or spaceship + --/c p = game.player po = p.position for x = -5,5 do for y = -5,5 do p.surface.set_tiles{{name = "dirt-1", position = {x+po.x, y=y+po.y}}} end end + local surface = Zone.get_surface(zone) + if surface then + if Zone.is_space(zone) then + if zone.type ~= "spaceship" or zone.own_surface_index then + -- remove all tiles not allowd in space + local tiles = surface.find_tiles_filtered{ + collision_mask = {"ground-tile", "water-tile"}, + } + local set_tiles = {} + for _, tile in pairs(tiles) do + if not Util.table_contains(tiles_allowed_in_space, tile.name) then + -- remove the tile + table.insert(set_tiles, {name = name_space_tile, position = tile.position}) + surface.set_hidden_tile(tile.position, nil) + end + end + + if #set_tiles > 0 then + surface.set_tiles( + set_tiles, + true, -- corect tiles + true, -- remove_colliding_entities + true, -- remove_colliding_decoratives + true -- raise_event + ) + end + + log("Zone.zone_fix_all_tiles: " .. zone.type.." " .. zone.name.." is_space "..#set_tiles.." tiles changed surface_index "..surface.index.." surface_name " .. surface.name) + else + log("Zone.zone_fix_all_tiles: " .. zone.type.." " .. zone.name.." anchored surface_index "..surface.index.." surface_name " .. surface.name) + end + else + -- remove space tiles + local tiles = surface.find_tiles_filtered{ + collision_mask = global.named_collision_masks.space_collision_layer + } + local set_tiles = {} + for _, tile in pairs(tiles) do + if not Util.table_contains(Spaceship.names_spaceship_floors, tile.name) then -- spacehip floor is allowed + -- remove the tile + table.insert(set_tiles, {name = "nuclear-ground", position = tile.position}) + surface.set_hidden_tile(tile.position, nil) + end + end + + if #set_tiles > 0 then + surface.set_tiles( + set_tiles, + true, -- corect tiles + true, -- remove_colliding_entities + true, -- remove_colliding_decoratives + true -- raise_event + ) + end + + log("Zone.zone_fix_all_tiles: " .. zone.type.." " ..zone.name.." is_land "..#set_tiles.." tiles changed surface_index "..surface.index.." surface_name " .. surface.name) + + end + end +end + +function Zone.zones_fix_all_tiles() + for _, zone in pairs(global.zone_index) do + Zone.zone_fix_all_tiles(zone) + end + if global.spaceships then + for _, spaceship in pairs(global.spaceships) do + Zone.zone_fix_all_tiles(spaceship) + end + end +end + + +function Zone.set_zone_as_homeworld(data) + local zone = Zone.from_name(data.zone_name) + local nauvis = Zone.from_name("Nauvis") + if not zone then + game.print("No zone found") + else + if zone.type ~= "planet" then + game.print("Zone type must be planet, selected zone is: " .. zone.type) + return + else + zone.is_homeworld = true + zone.inflated = true + zone.resources = {} + zone.ticks_per_day = 25000 + zone.fragment_name = "se-core-fragment-omni" + zone.radius = nauvis.radius + + local nauvis_map_gen = table.deepcopy(game.surfaces[1].map_gen_settings) + + if not zone.original_seed then + zone.original_seed = zone.seed + end + if data.match_nauvis_seed then + zone.seed = nauvis_map_gen.seed + else + nauvis_map_gen.seed = zone.seed + end + + local surface = Zone.get_surface(zone) + if surface and reset_surface ~= false then + surface.map_gen_settings = nauvis_map_gen + surface.clear() + else + surface = Zone.get_make_surface(zone) + surface.map_gen_settings = nauvis_map_gen + end + + Universe.make_validate_homesystem(zone) + global.resources_and_controls_compare_string = nil -- force udpate resources + Universe.load_resource_data() + + surface.request_to_generate_chunks({0,0}, 4) + surface.force_generate_chunk_requests() + + if settings.startup[mod_prefix.."spawn-small-resources"].value then + Zone.spawn_small_resources(surface) + end + + end + end + + return Zone.export_zone(Zone.from_name(data.zone_name)) +end + +function Zone.spawn_small_resources(surface) + + local seed = surface.map_gen_settings.seed + local rng = game.create_random_generator(seed) + -- The starting resourecs of the map generation are inconsistent and spread out. + -- Add some tiny patches to reduce the amount of running around at the start. + -- We only care about super-early game, so just iron, copper, stone, and coal. + -- If there are other resources added to the game then the naturally spawned resources will have to do for now. + -- These resources are not designed to replace the normal starting resources at all. + local valid_position_search_range = 256 + local cluster_primary_radius = 50 -- get away from crash site + local cluster_secondary_radius = 25 + local resources = {} + if game.entity_prototypes["iron-ore"] then table.insert(resources, { name = "iron-ore", tiles = 200, amount = 100000}) end + if game.entity_prototypes["copper-ore"] then table.insert(resources, { name = "copper-ore", tiles = 150, amount = 80000}) end + if game.entity_prototypes["stone"] then table.insert(resources, { name = "stone", tiles = 150, amount = 80000}) end + if game.entity_prototypes["coal"] then table.insert(resources, { name = "coal", tiles = 150, amount = 80000}) end + + local cluster_orientation = rng() + local secondary_orientation = rng() + local cluster_position = Util.orientation_to_vector(cluster_orientation, cluster_primary_radius) + surface.request_to_generate_chunks(cluster_position, 4) + surface.force_generate_chunk_requests() + + Log.trace("[gps="..math.floor(cluster_position.x)..","..math.floor(cluster_position.y).."]") + local closed_tiles = {} -- 2d disctionary + local open_tiles = {} -- 1d array + local function close_tile(position) + closed_tiles[position.x] = closed_tiles[position.x] or {} + closed_tiles[position.x][position.y] = true + end + local function open_tile(set, position) -- don't open if closed + if not (closed_tiles[position.x] and closed_tiles[position.x][position.y]) then + table.insert(set, position) + close_tile(position) + end + end + local function open_neighbour_tiles(set, position) + open_tile(set, Util.vectors_add(position, {x=0,y=-1})) + open_tile(set, Util.vectors_add(position, {x=1,y=0})) + open_tile(set, Util.vectors_add(position, {x=0,y=1})) + open_tile(set, Util.vectors_add(position, {x=-1,y=0})) + end + for i, resource in pairs(resources) do + resource.orientation = secondary_orientation + rng() + local offset = Util.orientation_to_vector(resource.orientation, rng(cluster_secondary_radius/2, cluster_secondary_radius)) + local position = Util.tile_to_position(Util.vectors_add(offset, cluster_position)) + local valid = surface.find_non_colliding_position(resource.name, position, valid_position_search_range, 1, true) + if not valid then Log.trace("no valid position found") end + resource.start_point = surface.find_non_colliding_position(resource.name, position, valid_position_search_range, 1, true) or position + resource.open_tiles = {resource.start_point} + resource.entities = {} + resource.amount_placed = 0 + end + local continue = true + local repeats = 0 + while continue and repeats < 1000 do + repeats = repeats + 1 + continue = false + for _, resource in pairs(resources) do + --if #resource.entities < resource.tiles then + if resource.amount_placed < resource.amount then + continue = true + local try_tile + if #resource.open_tiles > 0 then + local choose = rng(#resource.open_tiles) + try_tile = resource.open_tiles[choose] + close_tile(try_tile) + end + if not try_tile then -- handle tiny island case + try_tile = resource.start_point + end + local position = surface.find_non_colliding_position(resource.name, try_tile, valid_position_search_range, 1, true) + if not position then -- exit + resource.amount_placed = resource.amount + log("Space Exploration failed to place starting resource, no valid positions in range. [".. resource.name.."]") + else + close_tile(try_tile) + close_tile(position) + local remaining = resource.amount - resource.amount_placed + local amount = math.ceil(math.min( remaining * (0.01 + rng() * 0.005) + 100 + rng() * 100, remaining)) + resource.amount_placed = resource.amount_placed + amount + table.insert(resource.entities, surface.create_entity{name = resource.name, position=position, amount=amount, enable_tree_removal=true, snap_to_tile_center =true}) + --Log.trace("Starting resource entity created "..resource.name.." ".. position.x.." "..position.y) + open_neighbour_tiles(resource.open_tiles, position) + end + end + end + end + +end + +return Zone diff --git a/space-exploration_0.5.58/space-exploration/scripts/zonelist.lua b/space-exploration_0.5.58/space-exploration/scripts/zonelist.lua new file mode 100644 index 0000000..4ee28a4 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/scripts/zonelist.lua @@ -0,0 +1,1332 @@ +local Zonelist = {} +--[[ +Zonelist is an informatron style popup in the middle of the screen. +It lists zones and has a starmap link. +If you choose to view a zone it puts you into remote view mode. +]]-- + +Zonelist.name_gui_root = mod_prefix.."zonelist_main" +Zonelist.name_shortcut = mod_prefix.."universe-explorer" +Zonelist.name_event = mod_prefix.."universe-explorer" + +Zonelist.name_button_close = "zonelist_button_close" +Zonelist.name_button_starmap = "zonelist_button_starmap" +Zonelist.name_button_view_zone = "zonelist_button_view_zone" +Zonelist.name_button_overhead_explorer = mod_prefix .. "overhead_explorer" +Zonelist.name_setting_overhead_explorer = mod_prefix .. "show-overhead-button-universe-explorer" + +Zonelist.name_zonelist_headings_row = "zonelist_headings_row" +Zonelist.name_zonelist_scroll = "zonelist_scroll" +Zonelist.name_zonelist_search = "zonelist_search" +Zonelist.name_zonelist_search_clear = "zonelist_search_clear" +Zonelist.name_zonelist_filters = "zonelist_filters" +Zonelist.name_zone_content_title = "zone_content_title" +Zonelist.name_zone_content_priority_flow = "zone_content_priority_flow" +Zonelist.name_zone_content_frame = "zone_content_frame" +Zonelist.name_zone_content_pane = "zone_content_pane" +Zonelist.name_zone_content_preview_frame = "zone_content_preview_frame" +Zonelist.name_zone_priority_field = "zone_priority_field" +Zonelist.name_zone_priority_plus_button = "zone_priority_plus_button" +Zonelist.name_zone_priority_minus_button = "zone_priority_minus_button" +Zonelist.name_zone_trim_surface_button = "zone_trim_surface_button" +Zonelist.name_zone_delete_surface_button = "zone_delete_surface_button" +Zonelist.name_zone_scan_surface_button = "zone_scan_surface_button" + +Zonelist.name_color_priority_positive = {r=50/255, g=250/255, b=50/255} +Zonelist.name_color_priority_neutral = {r=255/255, g=174/255, b=0/255} +Zonelist.name_color_priority_negative = {r=250/255, g=20/255, b=20/255} + +Zonelist.min_bar_brightness = 200 + +Zonelist.priority_max = 999 + +function Zonelist.get_selected_zone_or_current(player_index) + local player = game.players[player_index] + local playerdata = get_make_playerdata(player) + local zone = playerdata.zonelist_selected_zone + if not zone then + zone = Zone.from_surface(player.surface) + end + return zone +end + +function Zonelist.get_main_window(player_index) + local player = game.players[player_index] + if player and player.connected then + return player.gui.screen[Zonelist.name_gui_root] + end +end + +function Zonelist.gui_close(player_index) + local window = Zonelist.get_main_window(player_index) + if window then window.destroy() end +end + +function Zonelist.gui_open(player_index) + local player = game.players[player_index] + if not player and player.connected then return end + + local gui = player.gui.screen + close_own_guis(player) + Zonelist.gui_close(player_index) + --gui.clear() + local playerdata = get_make_playerdata(player) + playerdata.zonelist_filter_excludes = playerdata.zonelist_filter_excludes or {} + local forcedata = global.forces[player.force.name] + + local root = gui.add{ type = "frame", name = Zonelist.name_gui_root, direction="vertical"} + root.style.bottom_padding = 10 + root.auto_center = true + + local main_table = root.add{type="table", name="main_table", column_count=2, draw_horizontal_lines=false} + main_table.style.horizontally_stretchable = true + main_table.style.column_alignments[1] = "left" -- title, search, zone list table + main_table.style.column_alignments[2] = "right" -- starmap, close, selected zone info + + local main_left_flow = main_table.add{type = "flow", name="main_left_flow", direction = "vertical"} + local main_right_flow = main_table.add{type = "flow", name="main_right_flow", direction = "vertical"} + main_left_flow.style.right_margin = 10 + + local title_table = main_left_flow.add{type="table", name="title_table", column_count=2, draw_horizontal_lines=false} + title_table.drag_target = root + title_table.style.horizontally_stretchable = true + title_table.style.column_alignments[1] = "left" -- name + title_table.style.column_alignments[2] = "right" -- search + + -- LEFT TOP + local title_frame = title_table.add{type="frame", name="title_frame", caption={"space-exploration.zonelist-window-title"}, style="informatron_title_frame", ignored_by_interaction = true} + + + -- LEFT TOP (right aligned) + local filter_search_container = title_table.add{type="flow", name="filter_search_flow", direction="horizontal"} + + local filters_container = filter_search_container.add{type="flow", name=Zonelist.name_zonelist_filters, direction="horizontal"} + for _, zone_type in pairs({"star", "planet", "planet-orbit", "moon", "moon-orbit", "asteroid-belt", "asteroid-field", "anomaly", "spaceship"}) do + if zone_type ~= "anomaly" or Zone.is_visible_to_force(Zone.from_name("Foenestra"), player.force.name) then + local style = "se_zone_list_filter_down" + if playerdata.zonelist_filter_excludes[zone_type] then + style = "se_zone_list_filter" + end + local button = filters_container.add{type = "sprite-button", name=zone_type, sprite="virtual-signal/se-"..zone_type, tooltip={"space-exploration.zonelist_filter_"..zone_type}, style=style} + end + end + + local zonelist_search = filter_search_container.add{ type="textfield", name=Zonelist.name_zonelist_search} + zonelist_search.style.width = 275 + zonelist_search.style.top_margin = -4 + zonelist_search.style.left_margin = 10 + local search_button = filter_search_container.add{ type = "sprite-button", name=Zonelist.name_zonelist_search_clear, sprite="utility/search_icon", tooltip={"space-exploration.clear-search"}, style="informatron_close_button"} + search_button.style.left_margin = 5 + search_button.style.height = 28 + search_button.style.width = 28 + search_button.style.top_margin = -2 + + -- LEFT BOTTOM + local zonelist_frame = main_left_flow.add{type="frame", name="zonelist_frame", style="informatron_inside_deep_frame", direction="vertical"} + zonelist_frame.style.horizontally_stretchable = true + zonelist_frame.style.minimal_height = 300 + local zonelist_headings_row = zonelist_frame.add{type="flow", name=Zonelist.name_zonelist_headings_row, direction="horizontal"} + local zonelist_scroll = zonelist_frame.add{type="scroll-pane", name=Zonelist.name_zonelist_scroll, direction="vertical", style="zonelist_rows_pane"} + + -- TODO: Only shof if zones list is small + if ((not forcedata.satellites_launched) or forcedata.satellites_launched < 18) and (not global.debug_view_all_zones) then + local instruction = main_left_flow.add{type = "label", name="instruction", caption={"space-exploration.remote-view-instruction"}} + instruction.style.single_line = false + instruction.style.horizontally_stretchable = true + end + + + --RIGHT TOP + local title_table = main_right_flow.add{type="table", name="title_table", column_count=2, draw_horizontal_lines=false} + title_table.drag_target = root + title_table.style.horizontally_stretchable = true + title_table.style.column_alignments[1] = "left" -- blank + title_table.style.column_alignments[2] = "right" -- starmap, close + + local title_frame = title_table.add{type="frame", name="title_frame", caption=" ", style="informatron_title_frame", direction="horizontal", ignored_by_interaction = true} + title_frame.style.left_margin = -18 + + local right_flow = title_table.add{type="flow", name="title_flow_right", direction="horizontal"} + local starmap = right_flow.add{type="button", name=Zonelist.name_button_starmap, + caption={"space-exploration.simple-a-b-space", "[img=se-map-gui-starmap]", { "space-exploration.interstellar-map" } }, + style="informatron_close_button", tooltip={"space-exploration.interstellar-map"}} + starmap.style.right_margin = 6 + starmap.style.maximal_width = 200 + starmap.style.maximal_height = 32 + starmap.style.padding = 0 + starmap.style.left_padding = 5 + starmap.style.right_padding = 5 + + local close = right_flow.add{type="sprite-button", name=Zonelist.name_button_close, sprite = "utility/close_white", style="informatron_close_button"} + close.style.width = 28 + close.style.height = 28 + + --RIGHT Upper MIDDLE + local zone_content_frame = main_right_flow.add{type="flow", name="zone_content_frame", direction="vertical"} + local zone_content_title_frame = zone_content_frame.add{type="frame", name="zone_content_title_frame", style="informatron_content_title"} + zone_content_title_frame.style.horizontally_stretchable = true + zone_content_title_frame.style.margin = 0 + zone_content_title_frame.style.top_padding = 0 + zone_content_title_frame.style.bottom_padding = 0 + zone_content_title_frame.style.right_padding = 0 + zone_content_title_frame.style.left_margin = -1 + local zone_content_title_table = zone_content_title_frame.add{type="table", name="title_table", column_count=2, draw_horizontal_lines=false, draw_vertical_lines=false} + zone_content_title_table.style.horizontally_stretchable = true + zone_content_title_table.style.column_alignments[1] = "left" -- name + zone_content_title_table.style.column_alignments[2] = "right" -- priority + local zone_content_title = zone_content_title_table.add{type="label", name=Zonelist.name_zone_content_title, caption=" ", style="heading_2_label"} + zone_content_title.style.horizontally_stretchable = true + zone_content_title.style.margin = 0 + zone_content_title.style.padding = 0 + --zone_content_title.style.width = 200 + local zone_content_priority_flow = zone_content_title_table.add{type="flow", name=Zonelist.name_zone_content_priority_flow, direction="horizontal"} -- icon, -, number, + + zone_content_priority_flow.style.horizontal_align = "right" + zone_content_priority_flow.style.vertical_align = "center" + zone_content_priority_flow.style.right_padding = 0 + --zone_content_priority_flow.style.width = 200 + + Zonelist.gui_create_zone_content(player, zone_content_frame) + + Zonelist.gui_update(player_index) +end + +function Zonelist.gui_create_zone_content(player, parent) + + local zone_content_frame = parent.add{type="frame", name=Zonelist.name_zone_content_frame, style="informatron_inside_deep_frame"} + local zone_content_pane = zone_content_frame.add{type="scroll-pane", name=Zonelist.name_zone_content_pane, style="zonelist_content_pane"} + zone_content_pane.vertical_scroll_policy = "always" + zone_content_pane.style.extra_top_padding_when_activated = 0 + zone_content_pane.style.extra_bottom_padding_when_activated = 0 + zone_content_pane.style.extra_left_padding_when_activated = 0 + zone_content_pane.style.extra_right_padding_when_activated = 0 + zone_content_pane.style.extra_top_margin_when_activated = 0 + zone_content_pane.style.extra_bottom_margin_when_activated = 0 + zone_content_pane.style.extra_left_margin_when_activated = 0 + zone_content_pane.style.extra_right_margin_when_activated = 0 + zone_content_pane.style.minimal_height = 300 + zone_content_pane.style.maximal_height = 600 + zone_content_pane.style.width = 300 + zone_content_pane.style.padding = 12 + if not settings.get_player_settings(player)["se-show-zone-preview"].value then + zone_content_pane.style.minimal_height = 600 + zone_content_pane.style.maximal_height = 900 + end + + --RIGHT BOTTOM + if settings.get_player_settings(player)["se-show-zone-preview"].value then + local zone_content_preview_frame = parent.add{type="frame", name=Zonelist.name_zone_content_preview_frame, style="informatron_inside_deep_frame"} + zone_content_preview_frame.style.width = 300 + zone_content_preview_frame.style.height = 300 + zone_content_preview_frame.style.top_margin = 10 + end + + --RIGHT BOTTOM + local zone_view_button = parent.add{type="button", name=Zonelist.name_button_view_zone, style="confirm_button", caption={"space-exploration.zonelist-view-surface"}, tooltip={"space-exploration.zonelist-view-surface"}} + zone_view_button.style.top_margin = 10 + zone_view_button.style.horizontally_stretchable = true + if not RemoteView.is_unlocked(player) then + zone_view_button.enabled = false + zone_view_button.tooltip = {"space-exploration.remote-view-requires-satellite"} + end +end + +function Zonelist.gui_update(player_index) -- only call when something changed + Zonelist.gui_update_list(player_index) + Zonelist.gui_update_selected(player_index) +end + +function Zonelist.gui_update_selected(player_index) -- only call when something changed + local player = game.players[player_index] + if not player and player.connected then return end + local window = Zonelist.get_main_window(player_index) + if not window then return end + local force_name = player.force.name + local forcedata = global.forces[force_name] + local playerdata = get_make_playerdata(player) + + local selected_zone = playerdata.zonelist_selected_zone + if not selected_zone then + selected_zone = Zone.from_surface(player.surface) + end + if not selected_zone then + if forcedata and forcedata.homeworld_index then + selected_zone = Zone.from_zone_index(forcedata.homeworld_index) + end + end + if not selected_zone then + selected_zone = Zone.get_default() + end + + local zonelist_scroll = util.find_first_descendant_by_name(window, Zonelist.name_zonelist_scroll) + for _, row in pairs(zonelist_scroll.children) do + row.style = "zonelist_row_button" + if row.row_flow then + for _, child in pairs(row.row_flow.children) do + if child.name ~= "cell_priority" then + child.style.font_color = {r=1,g=1,b=1} + end + end + end + end + + local zone_content_title = util.find_first_descendant_by_name(window, Zonelist.name_zone_content_title) + local zone_content_priority_flow = util.find_first_descendant_by_name(window, Zonelist.name_zone_content_priority_flow) + + if selected_zone then + local zone = selected_zone + local row = Zonelist.find_row_for_zone(player_index, zone) + if row then + row.style = "zonelist_row_button_selected" + if row.row_flow then + for _, child in pairs(row.row_flow.children) do + if child.name ~= "cell_priority" then + child.style.font_color = {r=0,g=0,b=0} + end + end + end + end + + -- Title + if zone_content_title then zone_content_title.caption = zone.name end + -- Priority + + if zone_content_priority_flow then + zone_content_priority_flow.tooltip={"space-exploration.priority-tooltip"} + if not zone_content_priority_flow.priority_icon then + zone_content_priority_flow.add{type="label", name="priority_icon", caption={"space-exploration.priority-icon"}, tooltip={"space-exploration.priority-tooltip"}} + end + if not zone_content_priority_flow[Zonelist.name_zone_priority_field] then + local textfield = zone_content_priority_flow.add{type="textfield", name=Zonelist.name_zone_priority_field, style="zonelist_priority_textfield", + numeric = true, allow_negative = true, tooltip={"space-exploration.priority-tooltip"} + } + textfield.style.width = 30 + textfield.style.height = 30 + textfield.style.horizontal_align = "center" + textfield.style.padding = 0 + textfield.style.margin = 0 + textfield.style.right_margin = 4 + end + local priority = Zone.get_priority(zone, force_name) + local textfield = zone_content_priority_flow[Zonelist.name_zone_priority_field] + textfield.text = ""..priority + if priority > 0 then + textfield.style.font_color = Zonelist.name_color_priority_positive + elseif priority < 0 then + textfield.style.font_color = Zonelist.name_color_priority_negative + else + textfield.style.font_color = Zonelist.name_color_priority_neutral + end + if not zone_content_priority_flow["buttons_flow"] then + local buttons_flow = zone_content_priority_flow.add{type="flow", name="buttons_flow", direction = "vertical", tooltip={"space-exploration.priority-tooltip"}} + buttons_flow.style.margin = -1 + end + if not zone_content_priority_flow["buttons_flow"][Zonelist.name_zone_priority_plus_button] then + local plus = zone_content_priority_flow["buttons_flow"].add{type="button", name=Zonelist.name_zone_priority_plus_button, + caption="▲", style="zonelist_priority_button", tooltip={"space-exploration.priority-tooltip"}} + plus.style.margin = -2 + plus.style.padding = 0 + plus.style.width = 20 + plus.style.height = 20 + plus.style.font = "default-tiny-bold" + plus.style.horizontal_align = "center" + end + if not zone_content_priority_flow["buttons_flow"][Zonelist.name_zone_priority_minus_button] then + local minus = zone_content_priority_flow["buttons_flow"].add{type="button", name=Zonelist.name_zone_priority_minus_button, + caption="▼", style="zonelist_priority_button", tooltip={"space-exploration.priority-tooltip"}} + minus.style.margin = -2 + minus.style.padding = 0 + minus.style.width = 20 + minus.style.height = 20 + minus.style.font = "default-tiny-bold" + minus.style.horizontal_align = "center" + end + end + else + if zone_content_title then zone_content_title.caption = " " end + if zone_content_priority_flow then zone_content_priority_flow.clear() end + end + + Zonelist.gui_update_zone_content(player, window, selected_zone) +end + +function Zonelist.gui_update_zone_content(player, window, zone) + local force_name = player.force.name + local forcedata = global.forces[force_name] + local playerdata = get_make_playerdata(player) + local zone_force_assets = Zone.get_force_assets(force_name, zone.index) + + local zone_content_pane = util.find_first_descendant_by_name(window, Zonelist.name_zone_content_pane) + local zone_content_preview_frame = util.find_first_descendant_by_name(window, Zonelist.name_zone_content_preview_frame) + + if zone then + -- zone content + if zone_content_pane then + zone_content_pane.clear() + local zone_properties = zone_content_pane.add{type="table", name="zone_properties", column_count=2, draw_horizontal_lines=false} + zone_properties.style.width = 260 + zone_properties.style.horizontally_stretchable = true + zone_properties.style.column_alignments[1] = "left" -- name + zone_properties.style.column_alignments[2] = "right" -- priority + zone_properties.style.top_margin = -5 + zone_properties.style.bottom_margin = 5 + local label, value + + label = zone_properties.add{type="label", name="label_type", caption={"space-exploration.zone-tooltip-type"}} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_properties.add{type="label", name="value_type", caption="[img="..Zone.get_icon(zone) .. "] " .. Zone.type_title(zone)} + value.style.horizontal_align = "right" + + if zone.parent then + label = zone_properties.add{type="label", name="label_parent", caption={"space-exploration.zone-tooltip-parent"}} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_properties.add{type="label", name="value_parent", caption=zone.parent.name} + value.style.horizontal_align = "right" + end + + if zone.radius then + label = zone_properties.add{type="label", name="label_radius", caption={"space-exploration.zone-tooltip-radius"}} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_properties.add{type="label", name="value_radius", caption=string.format("%.0f",zone.radius)} + value.style.horizontal_align = "right" + end + + if Zone.is_solid(zone) then + label = zone_properties.add{type="label", name="label_daynight", caption={"space-exploration.zone-tooltip-daynight"}} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_properties.add{type="label", name="value_daynight", caption=string.format("%.2f", zone.ticks_per_day/ 60 / 60 ).." minutes"} + value.style.horizontal_align = "right" + end + + + if zone.type ~= "spaceship" then + local interference_type = "radiation" + if zone.type == "anomaly" then + interference_type = "spacial-distortion" + elseif Zone.is_solid(zone) then + interference_type = "wind" + end + label = zone_properties.add{type="label", name="label_attrition", caption={"space-exploration.zone-tooltip-bot-attrition", {"space-exploration.attrition-type-"..interference_type}}} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_properties.add{type="label", name="value_attrition", caption=string.format("%.2f",Zone.get_attrition(zone))} + value.style.horizontal_align = "right" + end + + if zone.type ~= "spaceship" then + local threat = Zone.get_threat(zone) + label = zone_properties.add{type="label", name="label_threat", caption={"space-exploration.zone-tooltip-threat"}} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_properties.add{type="label", name="value_threat", caption=string.format("%.0f", threat*100).."%"} + value.style.horizontal_align = "right" + + end + + local origin = Zone.from_surface(player.surface) + if (not origin) and playerdata and playerdata.character and playerdata.character.valid and playerdata.character.surface then + origin = Zone.from_surface(playerdata.character.surface) + end + if origin and origin ~= zone then + local delta_v = Zone.get_travel_delta_v(origin, zone) + if delta_v > 0 then + label = zone_properties.add{type="label", name="label_delta_v", caption={"space-exploration.zone-tooltip-delta-v", origin.name}} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_properties.add{type="label", name="value_delta-v", caption=string.format("%.0f", delta_v)} + value.style.horizontal_align = "right" + end + end + + if zone.type == "spaceship" then + local spaceship = zone + + local closest = Zone.find_nearest_zone( + spaceship.space_distortion, + spaceship.stellar_position, + spaceship.star_gravity_well, + spaceship.planet_gravity_well) + label = zone_properties.add{type="label", name="label_closest", caption={"space-exploration.zone-tooltip-closest"}} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_properties.add{type="label", name="value_closest", caption=closest and ("[img="..Zone.get_icon(closest) .. "] " .. closest.name)} + value.style.horizontal_align = "right" + + local destination = Spaceship.get_destination_zone(spaceship) + label = zone_properties.add{type="label", name="label_destination", caption={"space-exploration.zone-tooltip-destination"}} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_properties.add{type="label", name="value_destination", caption=destination and ("[img="..Zone.get_icon(destination) .. "] " .. destination.name)} + value.style.horizontal_align = "right" + + end + + local solar = Zone.get_display_light_percent(zone) + label = zone_properties.add{type="label", name="label_solar", caption={"space-exploration.zone-tooltip-solar"}} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_properties.add{type="label", name="value_solar", caption=string.format("%.0f", solar*100).."%"} + value.style.horizontal_align = "right" + + if is_debug_mode or (global.spaceships and table_size(global.spaceships) > 0) then + label = zone_properties.add{type="label", name="label_signals", caption="Automation signal:"} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_properties.add{type="label", name="value_signals", caption=""} + value.style.horizontal_align = "right" + value.caption = "[img="..Zone.get_icon(zone).."] "..zone.index + value.tooltip = {"space-exploration.simple-a-b", {"virtual-signal-name."..Zone.get_signal_name(zone)}, " "..zone.index.."\nUsed for spaceship automation."} + end + + -- TODO: resources + --for k = 0, 40, 1 do -- test scrollbar + -- label = zone_properties.add{type="label", name="label_solar_"..k, caption={"space-exploration.zone-tooltip-solar"}} + --end + if zone.type ~= "spaceship" then + if zone.type ~= "orbit" then + local resources_flow = zone_content_pane.add{type="flow", name="resources_flow", direction="vertical"} + local fsrs = {} + local max_fsr = 0 + for resource_name, resource_settings in pairs(global.resources_and_controls.resource_settings) do + if zone.controls[resource_name] then + local fsr = Universe.estimate_resource_fsr(zone.controls[resource_name]) + if fsr > 0 then + max_fsr = math.max(max_fsr, fsr) + table.insert(fsrs, {name=resource_name, fsr=fsr}) + end + end + end + table.sort(fsrs, function(a,b) return a.fsr > b.fsr end) + local mapgen + if zone.surface_index then mapgen = Zone.get_make_surface(zone).map_gen_settings end + + for i = 1, #fsrs, 1 do + local resource_name = fsrs[i].name + tooltip = {"space-exploration.zonelist-resource-bar-tooltip", "[img=entity/"..resource_name.."]", {"entity-name."..resource_name}} + if mapgen then + table.insert(tooltip, string.format("%.0f", mapgen.autoplace_controls[resource_name].frequency * 100).."%") + table.insert(tooltip, string.format("%.0f", mapgen.autoplace_controls[resource_name].size * 100).."%") + table.insert(tooltip, string.format("%.0f", mapgen.autoplace_controls[resource_name].richness * 100).."%") + else + local frequency_multiplier = Zone.get_frequency_multiplier(zone) + table.insert(tooltip, string.format("%.0f", zone.controls[resource_name].frequency * frequency_multiplier * 100).."%") + table.insert(tooltip, string.format("%.0f", zone.controls[resource_name].size * 100).."%") + table.insert(tooltip, string.format("%.0f", zone.controls[resource_name].richness * 100).."%") + end + if resource_name == mod_prefix.."cryonite" or resource_name == mod_prefix.."vulcanite" or resource_name == mod_prefix.."vitamelange" then + tooltip[1] = "space-exploration.zonelist-resource-bar-tooltip-extended" + table.insert(tooltip, {"space-exploration.resource-terrain-required-"..resource_name}) + end + local row = resources_flow.add{type="flow", name=resource_name, direction="horizontal", tooltip = tooltip} + row.style.top_margin = 4 + row.style.vertical_align = "center" + local label = row.add{type="label", name="resource_icon", caption="[img=entity/"..resource_name.."]", tooltip=tooltip} + local overlap = row.add{type="flow", name="resource_bar_overlap", direction="vertical"} + local percent = math.pow(fsrs[i].fsr/max_fsr, 1/3) + local progressbar = overlap.add{type="progressbar", name="resource_bar", value=percent, tooltip=tooltip, style="zonelist_progressbar"} + progressbar.style.horizontally_stretchable = true + progressbar.style.color = Zonelist.name_color_priority_neutral + local proto = game.entity_prototypes[resource_name] + if proto and proto.map_color then + local color = proto.map_color + local rgb = color.r + color.g + color.b + if rgb < 150 then + color.r = color.r + 1 + color.g = color.g + 1 + color.b = color.b + 1 + rgb = rgb + 3 + end + --[[if rgb < 255 then + local rgb_m = 255 / rgb + color.r = math.min(255, color.r * rgb_m) + color.g = math.min(255, color.g * rgb_m) + color.b = math.min(255, color.b * rgb_m) + end]] + local rgb_max = math.max(color.r, math.max(color.g,color.b)) + if rgb_max < Zonelist.min_bar_brightness then + local rgb_m = Zonelist.min_bar_brightness / rgb_max + color.r = math.min(255, color.r * rgb_m) + color.g = math.min(255, color.g * rgb_m) + color.b = math.min(255, color.b * rgb_m) + end + progressbar.style.color = color + end + local label = overlap.add{type="label", name="resource_label", caption={"entity-name."..resource_name}, tooltip=tooltip} + label.style.top_margin = -26 + label.style.left_padding = 8 + label.style.font = "default-bold" + label.style.font_color = {} + end + if Zone.is_solid(zone) then + local resources_disclaimer = resources_flow.add{type="label", name="resources_disclaimer", caption={"space-exploration.zonelist-resources-disclaimer"}, tooltip={"space-exploration.zonelist-resources-disclaimer-tooltip"}} + resources_disclaimer.style.font_color = {r=0.5,g=0.5,b=0.5} + end + end + + -- flags + local has_glyph = playerdata.track_glyphs and (zone.glyph ~= nil) + local has_ruin = zone.interburbulator or zone.ruins + local has_visisted = playerdata.visited_zone and playerdata.visited_zone[zone.index] + local has_launchpad = table_size(zone_force_assets.rocket_launch_pad_names) > 0 + local has_landingpad = table_size(zone_force_assets.rocket_landing_pad_names) > 0 + + if has_glyph or has_visisted or has_launchpad or has_landingpad or has_ruin then + local label = zone_properties.add{type="label", name="label_flags", caption={"space-exploration.zone-tooltip-flags"}} + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + local flags_flow = zone_properties.add{type="flow", name="flags_flow", direction="horizontal"} + flags_flow.style.horizontal_align = "right" + if has_visisted then + flags_flow.add{type="label", name="flag_visited", caption="[img=entity/character]", tooltip="Visited in person"} + end + if has_launchpad then + flags_flow.add{type="label", name="flag_launchpad", caption="[img=entity/"..Launchpad.name_rocket_launch_pad.."]", tooltip={"entity-name."..Launchpad.name_rocket_launch_pad}} + end + if has_landingpad then + flags_flow.add{type="label", name="flag_landingpad", caption="[img=entity/"..Landingpad.name_rocket_landing_pad.."]", tooltip={"entity-name."..Landingpad.name_rocket_landing_pad}} + end + if has_glyph then + flags_flow.add{type="label", name="flag_tomb", caption="[img=entity/se-pyramid-a]", tooltip={"space-exploration.mysterious-structure"}} + end + if has_ruin then + flags_flow.add{type="label", name="flag_ruin", caption="[img=virtual-signal/se-ruin]", tooltip={"space-exploration.ruin"}} + end + end + + + -- tags + if zone.tags then + local caption = nil + for _, tag in pairs(zone.tags) do + if not string.find(tag, "enemy", 1, true) then + if caption == nil then + caption = {"space-exploration.climate_"..tag} + else + caption = {"space-exploration.simple-a-b-comma", caption, {"space-exploration.climate_"..tag}} + end + end + end + if zone.is_homeworld then + caption = {"space-exploration.climate_homeworld"} + end + local label = zone_content_pane.add{type="label", name="label_tags", caption="Climate tags:"} + label.style.top_margin = 10 + label.style.horizontally_stretchable = true + label.style.font_color = {r=0.5,g=0.5,b=0.5} + value = zone_content_pane.add{type="label", name="value_tags", caption=caption} + value.style.horizontal_align = "left" + value.style.single_line = false + end + + -- + if zone.surface_index and global.spaceships then + local zone_spaceships = {} + for _, spaceship in pairs(global.spaceships) do + if spaceship.console and spaceship.console.valid and spaceship.console.surface == zone.surface_index then + table.insert(zone_spaceships, spaceship) + end + end + if #zone_spaceships > 0 then + + end + end + + local scan_button = zone_content_pane.add{type="button", name=Zonelist.name_zone_scan_surface_button, --style="green_button", + caption={"space-exploration.scan-zone-button"}, + tooltip = {"space-exploration.scan-zone-button-tooltip"}} + scan_button.style.top_margin = 15 + if forcedata.is_scanning then + scan_button.caption={"space-exploration.stop-scan-zone-button"} + scan_button.tooltip={"space-exploration.stop-scan-zone-button-tooltip"} + elseif not RemoteView.is_unlocked(player) then + scan_button.enabled = false + scan_button.tooltip = {"space-exploration.scan-zone-button-disabled-tooltip"} + end + + local trim_button = zone_content_pane.add{type="button", name=Zonelist.name_zone_trim_surface_button, style="red_button", + caption={"space-exploration.trim-zone-button"}, + tooltip = {"space-exploration.trim-zone-button-tooltip"}} + trim_button.style.top_margin = 10 + if not zone.surface_index then + trim_button.enabled = false + trim_button.tooltip = {"space-exploration.trim-zone-button-no-surface-tooltip"} + end + + local delete_button = zone_content_pane.add{type="button", name=Zonelist.name_zone_delete_surface_button, style="red_button", + caption={"space-exploration.delete-zone-button"}, + tooltip = {"space-exploration.delete-zone-button-tooltip"}} + delete_button.style.top_margin = 10 + if not zone.surface_index then + delete_button.enabled = false + delete_button.tooltip = {"space-exploration.delete-zone-button-no-surface-tooltip"} + end + + end + + end + + -- zone preview + if zone_content_preview_frame then + zone_content_preview_frame.clear() + local surface = Zone.get_surface(zone) + if surface then + local position = {0,0} + if playerdata.surface_positions and playerdata.surface_positions[surface.index] then + position = playerdata.surface_positions[surface.index] + end + if zone.known_tiles_average_x and zone.known_tiles_average_y then + position = {zone.known_tiles_average_x, zone.known_tiles_average_y} + end + local camera = zone_content_preview_frame.add{type="camera", name="zone_content_preview_camera", position=position, zoom=0.05, surface_index=surface.index} + camera.style.horizontally_stretchable = true + camera.style.vertically_stretchable = true + else + zone_content_preview_frame.style.horizontal_align = "center" + zone_content_preview_frame.style.vertical_align = "center" + local preview_text = zone_content_preview_frame.add{type="label", name="preview_text", caption="Scan, view, or visit the selected\nsurface to enable this preview camera."} + preview_text.style.font_color = {r=0.5,g=0.5,b=0.5} + preview_text.style.single_line = false + preview_text.style.horizontal_align = "center" + end + end + else + if zone_content_pane then zone_content_pane.clear() end + if zone_content_preview_frame then zone_content_preview_frame.clear() end + end +end + +function Zonelist.get_row_name_for_zone(zone) + local name = "zone_" .. zone.index + if zone.type == "spaceship" then + name = "spaceship_" .. zone.index + end + return name +end + +function Zonelist.find_row_for_zone(player_index, zone) + local window = Zonelist.get_main_window(player_index) + if not window then return end + local zonelist_scroll = util.find_first_descendant_by_name(window, Zonelist.name_zonelist_scroll) + if not zonelist_scroll then return end + local name = Zonelist.get_row_name_for_zone(zone) + return zonelist_scroll[name] +end + +function Zonelist.gui_update_list(player_index) -- only call when something changed + local player = game.players[player_index] + if not player and player.connected then return end + local window = Zonelist.get_main_window(player_index) + if not window then return end + local force_name = player.force.name + local forcedata = global.forces[force_name] + local playerdata = get_make_playerdata(player) + local selected_zone = playerdata.zonelist_selected_zone + if not selected_zone then + selected_zone = Zone.from_surface(player.surface) + end + + local zonelist_headings_row = util.find_first_descendant_by_name(window, Zonelist.name_zonelist_headings_row) + local zonelist_scroll = util.find_first_descendant_by_name(window, Zonelist.name_zonelist_scroll) + local zonelist_search = util.find_first_descendant_by_name(window, Zonelist.name_zonelist_search) + + zonelist_headings_row.clear() + zonelist_scroll.clear() + + local zones_list = {} + -- build list in the hierarchy order as it is the most dificult to sort + Zone.insert_if_visible_to_force(zones_list, global.universe.anomaly, force_name) + for _, star in pairs(global.universe.stars) do + Zone.insert_if_visible_to_force(zones_list, star.orbit, force_name) + for _, planet_or_belt in pairs(star.children) do + Zone.insert_if_visible_to_force(zones_list, planet_or_belt, force_name) + if planet_or_belt.orbit then + Zone.insert_if_visible_to_force(zones_list, planet_or_belt.orbit, force_name) + end + if planet_or_belt.children then + for _, moon in pairs(planet_or_belt.children) do + Zone.insert_if_visible_to_force(zones_list, moon, force_name) + Zone.insert_if_visible_to_force(zones_list, moon.orbit, force_name) + end + end + end + end + for _, zone in pairs(global.universe.space_zones) do + Zone.insert_if_visible_to_force(zones_list, zone, force_name) + end + for _, spaceship in pairs(global.spaceships) do + Zone.insert_if_visible_to_force(zones_list, spaceship, force_name) + end + + -- filter + if playerdata.zonelist_filter_excludes and table_size(playerdata.zonelist_filter_excludes) > 0 then + local temp_list = zones_list + zones_list = {} + for _, zone in pairs(temp_list) do + if zone.type == "orbit" then + if zone.parent.type == "star" then + if not playerdata.zonelist_filter_excludes["star"] then + table.insert(zones_list, zone) + end + elseif zone.parent.type == "planet" then + if not playerdata.zonelist_filter_excludes["planet-orbit"] then + table.insert(zones_list, zone) + end + elseif zone.parent.type == "moon" then + if not playerdata.zonelist_filter_excludes["moon-orbit"] then + table.insert(zones_list, zone) + end + end + else + if not playerdata.zonelist_filter_excludes[zone.type] then + table.insert(zones_list, zone) + end + end + end + end + + -- search + local search = nil + if zonelist_search then + search = string.trim(zonelist_search.text) + if search == "" then + search = nil + end + end + if search then + local resource_names = {} + for resource_name, resource_settings in pairs(global.resources_and_controls.resource_settings) do + if string.find(string.lower(resource_name), string.lower(search), 1, true) then + table.insert(resource_names, resource_name) + end + end + + local temp_list = zones_list + zones_list = {} + for _, zone in pairs(temp_list) do + if string.find(string.lower(zone.name), string.lower(search), 1, true) then + table.insert(zones_list, zone) + elseif #resource_names > 0 and zone.type ~= "orbit" then + for _, resource_name in pairs(resource_names) do + if zone.controls and zone.controls[resource_name] and zone.controls[resource_name].size > 0 and zone.controls[resource_name].richness > 0 then + table.insert(zones_list, zone) + break + end + end + end + end + end + + -- sort + + local try_criteria = playerdata.sort_criteria or {} + -- set criteris in reverse order + -- eg {"name", "type"} = sort alphabetically then by type, so type has priority, then alphabetical within type + -- if "hierarchy" or "name" are in the list then later ones are removed as they won't do anything. + + local sort_criteria = {} + if #try_criteria > 0 then + for i = #try_criteria, 1, -1 do + table.insert(sort_criteria, 1, try_criteria[i]) + if try_criteria[i].name == "hierarchy" or try_criteria[i].name == "name" then + break + end + end + end + if #sort_criteria == 0 then + sort_criteria = {{name="hierarchy", direction=1}} + end + playerdata.sort_criteria = sort_criteria + + Universe.set_hierarchy_values() + for i = 1, #sort_criteria, 1 do + local mode = sort_criteria[i].name + local direction = sort_criteria[i].direction or 1 + if mode == "hierarchy" then + Universe.set_hierarchy_values() + -- nothing to do, should alredy be in this mode + table.sort(zones_list, function(a,b) + if a.type == "spaceship" then + if b.type == "spaceship" then + return a.name < b.name + end + return false + end + if b.type == "spaceship" then + return true + end + return a.hierarchy_index < b.hierarchy_index end) + elseif mode == "type" then + if direction == -1 then + table.sort(zones_list, function(a,b) + if a.type == b.type and a.type == "orbit" then return a.parent.type < b.parent.type end + return a.type < b.type + end) + else + table.sort(zones_list, function(a,b) + if a.type == b.type and a.type == "orbit" then return a.parent.type > b.parent.type end + return a.type > b.type + end) + end + elseif mode == "name" then + if direction == -1 then + table.sort(zones_list, function(a,b) return a.name > b.name end) + else + table.sort(zones_list, function(a,b) return a.name < b.name end) + end + elseif mode == "radius" then + if direction == -1 then + table.sort(zones_list, function(a,b) return (a.radius or 0) < (b.radius or 0) end) + else + table.sort(zones_list, function(a,b) return (a.radius or 0) > (b.radius or 0) end) + end + elseif mode == "resource" then + if direction == -1 then + table.sort(zones_list, function(a,b) return (a.is_homeworld and "1" or ((a.type ~= "orbit" and a.primary_resource) and a.primary_resource or "zzz")) > (b.is_homeworld and "1" or ((b.type ~= "orbit" and b.primary_resource) and b.primary_resource or "zzz")) end) + else + table.sort(zones_list, function(a,b) return (a.is_homeworld and "1" or ((a.type ~= "orbit" and a.primary_resource) and a.primary_resource or "zzz")) < (b.is_homeworld and "1" or ((b.type ~= "orbit" and b.primary_resource) and b.primary_resource or "zzz")) end) + end + elseif mode == "attrition" then + if direction == -1 then + table.sort(zones_list, function(a,b) return Zone.get_attrition(a) > Zone.get_attrition(b) end) + else + table.sort(zones_list, function(a,b) return Zone.get_attrition(a) < Zone.get_attrition(b) end) + end + elseif mode == "threat" then + if direction == -1 then + table.sort(zones_list, function(a,b) return Zone.get_threat(a) > Zone.get_threat(b) end) + else + table.sort(zones_list, function(a,b) return Zone.get_threat(a) < Zone.get_threat(b) end) + end + elseif mode == "solar" then + if direction == -1 then + table.sort(zones_list, function(a,b) return Zone.get_display_light_percent(a) < Zone.get_display_light_percent(b) end) + else + table.sort(zones_list, function(a,b) return Zone.get_display_light_percent(a) > Zone.get_display_light_percent(b) end) + end + elseif mode == "flags" then + if direction == -1 then + table.sort(zones_list, function(a,b) return Zone.get_flags_weight(a, force_name, playerdata) < Zone.get_flags_weight(b, force_name, playerdata) end) + else + table.sort(zones_list, function(a,b) return Zone.get_flags_weight(a, force_name, playerdata) > Zone.get_flags_weight(b, force_name, playerdata) end) + end + elseif mode == "priority" then + if direction == -1 then + table.sort(zones_list, function(a,b) return Zone.get_priority(a, force_name) < Zone.get_priority(b, force_name) end) + else + table.sort(zones_list, function(a,b) return Zone.get_priority(a, force_name) > Zone.get_priority(b, force_name) end) + end + end + end + + -- column names are: hierarchy, type, name, radius, resource, attrition, solar, priority + + -- build headings + local function format_cell(element, is_heading) + if is_heading then + element.style="dark_button" + end + element.style.margin = 0 + element.style.width = 68 + --element.style.horizontal_align = "center" + if element.name == "cell_name" then + element.style.width = 210 + element.style.maximal_width = 900 + --element.style.horizontally_stretchable = true + --element.style.horizontal_align = "left" + end + if element.name == "cell_flags" then + element.style.width = 100 + end + return element + end + + if zonelist_headings_row then + local cell_hierarchy = format_cell(zonelist_headings_row.add{type="button", name="cell_hierarchy", caption="[img=virtual-signal/se-hierarchy]", tooltip={"space-exploration.zonelist-heading-hierarchy"}}, true) + local cell_type = format_cell(zonelist_headings_row.add{type="button", name="cell_type", caption="[img=virtual-signal/se-planet]", tooltip={"space-exploration.zonelist-heading-type"}}, true) + local cell_name = format_cell(zonelist_headings_row.add{type="button", name="cell_name", caption={"space-exploration.name"}, tooltip={"space-exploration.zonelist-heading-name"}}, true) + cell_name.style.horizontal_align = "left" + cell_name.style.font_color = {1,1,1} + local cell_radius = format_cell(zonelist_headings_row.add{type="button", name="cell_radius", caption="[img=virtual-signal/se-radius]", tooltip={"space-exploration.zonelist-heading-radius"}}, true) + local cell_resource = format_cell(zonelist_headings_row.add{type="button", name="cell_resource", caption="[img=item/se-core-fragment-omni]", tooltip={"space-exploration.zonelist-heading-primary-resource"}}, true) + local cell_attrition = format_cell(zonelist_headings_row.add{type="button", name="cell_attrition", caption="[img=item/logistic-robot]", tooltip={"space-exploration.zonelist-heading-attrition"}}, true) + local cell_threat = format_cell(zonelist_headings_row.add{type="button", name="cell_threat", caption="[img=item/artillery-targeting-remote]", tooltip={"space-exploration.zonelist-heading-threat"}}, true) + local cell_solar = format_cell(zonelist_headings_row.add{type="button", name="cell_solar", caption="[img=item/solar-panel]", tooltip={"space-exploration.zonelist-heading-solar"}}, true) + local cell_flags = format_cell(zonelist_headings_row.add{type="button", name="cell_flags", caption="[img=item/"..Landingpad.name_rocket_landing_pad.."]", tooltip={"space-exploration.zonelist-heading-flags"}}, true) + local cell_priority = format_cell(zonelist_headings_row.add{type="button", name="cell_priority", caption="[img=virtual-signal/se-accolade]", tooltip={"space-exploration.zonelist-heading-priority"}}, true) + end + + -- build rows + if zonelist_scroll then + for i, zone in pairs(zones_list) do + -- zone row + local hierarchy = " ✖" + if zone.type == "planet" then + hierarchy = " | - ●" + elseif zone.type == "moon" then + hierarchy = " | | - ●" + elseif zone.type == "asteroid-belt" then + hierarchy = " | - ✖" + end + if zone.type == "orbit" then + if zone.parent.type == "star" then + hierarchy = "⬤" + elseif zone.parent.type == "planet" then + hierarchy = " | ○" + else + hierarchy = " | | ○" + end + end + if zone.type == "anomaly" then + hierarchy = " ?" + end + if zone.type == "spaceship" then + hierarchy = " ▴" + end + local name = Zonelist.get_row_name_for_zone(zone) + Log.debug_log("zonelist: "..zone.type.." "..zone.name.." "..zone.index, "zonelist") + local row = zonelist_scroll.add{type="button", name=name, style=(zone == selected_zone and "zonelist_row_button_selected" or "zonelist_row_button")} + --row.style.horizontally_stretchable = true + --row.style.bottom_margin = -3 + local row_flow = format_cell(row.add{type="flow", name="row_flow", direction="horizontal"}) + row_flow.ignored_by_interaction = true + local cell_hierarchy = format_cell(row_flow.add{type="label", name="cell_hierarchy", caption=hierarchy}) + cell_hierarchy.style.horizontal_align = "left" + local cell_type = format_cell(row_flow.add{type="label", name="cell_type", caption="[img="..Zone.get_icon(zone).."]", tooltip=Zone.type_title(zone)}) + cell_type.style.horizontal_align = "center" + cell_type.style.left_margin = -12 + local cell_name = format_cell(row_flow.add{type="label", name="cell_name", caption=zone.name}) + cell_name.style.horizontal_align = "left" + cell_name.style.left_padding = 16 + local cell_radius = format_cell(row_flow.add{type="label", name="cell_radius", caption=zone.radius and (string.format("%.0f", zone.radius)) or "-"}) + cell_radius.style.horizontal_align = "right" + cell_radius.style.right_padding = 16 + local cell_resource = format_cell(row_flow.add{type="label", name="cell_resource", + caption= (zone.primary_resource and zone.type ~= "orbit") and ("[img=entity/".. zone.primary_resource.."]") or "-", + tooltip= (zone.primary_resource and zone.type ~= "orbit") and ({"entity-name."..zone.primary_resource}) or nil}) + if zone.is_homeworld then + cell_resource.caption = "[img=item/se-core-fragment-omni]" + cell_resource.tooltip = {"item-name.se-core-fragment-omni"} + end + cell_resource.style.horizontal_align = "center" + local cell_attrition = format_cell(row_flow.add{type="label", name="cell_attrition", caption=string.format("%.2f", Zone.get_attrition(zone))}) + cell_attrition.style.horizontal_align = "right" + cell_attrition.style.right_padding = 16 + local cell_threat = format_cell(row_flow.add{type="label", name="cell_threat", caption=string.format("%.0f", Zone.get_threat(zone)*100).."%"}) + cell_threat.style.horizontal_align = "right" + cell_threat.style.right_padding = 16 + local cell_solar = format_cell(row_flow.add{type="label", name="cell_solar", caption=string.format("%.0f", Zone.get_display_light_percent(zone) * 100).."%"}) + cell_solar.style.horizontal_align = "right" + cell_solar.style.right_padding = 16 + local cell_flags = format_cell(row_flow.add{type="label", name="cell_flags", caption=""}) + cell_flags.style.horizontal_align = "center" + if playerdata.visited_zone and playerdata.visited_zone[zone.index] then + cell_flags.caption = cell_flags.caption .. "[img=entity/character]" + end + if global.forces[force_name].zone_assets and global.forces[force_name].zone_assets[zone.index] and table_size(global.forces[force_name].zone_assets[zone.index].rocket_launch_pad_names) > 0 then + cell_flags.caption = cell_flags.caption .. "[img=entity/"..Launchpad.name_rocket_launch_pad.."]" + end + if global.forces[force_name].zone_assets and global.forces[force_name].zone_assets[zone.index] and table_size(global.forces[force_name].zone_assets[zone.index].rocket_landing_pad_names) > 0 then + cell_flags.caption = cell_flags.caption .. "[img=entity/"..Landingpad.name_rocket_landing_pad.."]" + end + if playerdata.track_glyphs and (zone.glyph ~= nil) then + cell_flags.caption = cell_flags.caption .. "[img=entity/se-pyramid-a]" + end + if zone.interburbulator or zone.ruins then + cell_flags.caption = cell_flags.caption .. "[img=virtual-signal/se-ruin]" + end + + local priority = Zone.get_priority(zone, force_name) + local cell_priority = format_cell(row_flow.add{type="label", name="cell_priority", caption=priority}) + cell_priority.style.horizontal_align = "right" + cell_priority.style.right_padding = 30 + if priority > 0 then + cell_priority.style.font_color = Zonelist.name_color_priority_positive + elseif priority < 0 then + cell_priority.style.font_color = Zonelist.name_color_priority_negative + else + cell_priority.style.font_color = Zonelist.name_color_priority_neutral + end + end + end + +end + + +function Zonelist.toggle_main_window(player_index) + local window = Zonelist.get_main_window(player_index) + if window then + window.destroy() + else + Zonelist.gui_open(player_index) + end +end + +function Zonelist.on_gui_click (event) + if not (event.element and event.element.valid) then return end + local element = event.element + local player = game.players[event.player_index] + + if event.element.name == Zonelist.name_button_overhead_explorer then + Zonelist.toggle_main_window(event.player_index) return + end + + root = gui_element_or_parent(element, Zonelist.name_gui_root) + if root then -- remote view + local map_view_zone = MapView.gui_get_zone_from_element(root) + local playerdata = get_make_playerdata(player) + if element.name == Zonelist.name_button_view_zone then + if RemoteView.is_unlocked(player) then + local zone + if root.parent then zone = MapView.gui_get_zone_from_element(root.parent) end -- try to get zone from parent + if not zone then zone = map_view_zone or Zonelist.get_selected_zone_or_current(event.player_index) end + if zone then + Zonelist.gui_close(event.player_index) + MapView.gui_close(player) + RemoteView.start(player, zone) + end + else + player.print({"space-exploration.remote-view-requires-satellite"}) + end + elseif element.parent and element.parent.name == Zonelist.name_zonelist_headings_row then + playerdata.sort_criteria = playerdata.sort_criteria or {} + local criterion = util.replace(element.name, "cell_", "") + if playerdata.sort_criteria[#playerdata.sort_criteria].name == criterion then + playerdata.sort_criteria[#playerdata.sort_criteria].direction = -1 * (playerdata.sort_criteria[#playerdata.sort_criteria].direction or 1) + else + for _, c in pairs(playerdata.sort_criteria) do + if c.name == criterion then + table.remove(playerdata.sort_criteria, _) + break + end + end + table.insert(playerdata.sort_criteria, {name=criterion, direction = 1}) + end + Zonelist.gui_update_list(event.player_index) + elseif gui_element_or_parent(element.parent, Zonelist.name_zonelist_scroll) then + if string.find(element.name, "zone_", 1, true) then + local number_string = util.replace(element.name, "zone_", "") + local zone_index = util.string_to_number(number_string) + local zone = Zone.from_zone_index(zone_index) + if zone then + playerdata.zonelist_selected_zone = zone + Zonelist.gui_update_selected(event.player_index) + end + elseif string.find(element.name, "spaceship_", 1, true) then + local number_string = util.replace(element.name, "spaceship_", "") + local spaceship_index = util.string_to_number(number_string) + local spaceship = Spaceship.from_index(spaceship_index) + if spaceship then + playerdata.zonelist_selected_zone = spaceship + Zonelist.gui_update_selected(event.player_index) + end + end + elseif element.name == Zonelist.name_button_starmap then + Zonelist.gui_close(event.player_index) + MapView.start_interstellar_map(player) + elseif element.name == Zonelist.name_zonelist_search_apply then + local textfield = util.find_first_descendant_by_name(root, Zonelist.name_zonelist_search) + if textfield then + textfield.text = "" + Zonelist.gui_update_list(event.player_index) + end + elseif element.parent and element.parent.name == Zonelist.name_zonelist_filters then + playerdata.zonelist_filter_excludes = playerdata.zonelist_filter_excludes or {} + if playerdata.zonelist_filter_excludes[element.name] then + playerdata.zonelist_filter_excludes[element.name] = nil + element.style = "se_zone_list_filter_down" + else + playerdata.zonelist_filter_excludes[element.name] = true + element.style = "se_zone_list_filter" + end + Zonelist.gui_update_list(event.player_index) + elseif element.name == Zonelist.name_zone_priority_plus_button then + local zone = Zonelist.get_selected_zone_or_current(event.player_index) + local forcedata = global.forces[player.force.name] + if zone.type ~= "spaceship" then + forcedata.zone_priorities = forcedata.zone_priorities or {} + local priority = (forcedata.zone_priorities[zone.index] or 0) + 1 + Zonelist.change_priority(player.force.name, zone, priority) + else + forcedata.spaceship_priorities = forcedata.spaceship_priorities or {} + local priority = (forcedata.spaceship_priorities[zone.index] or 0) + 1 + Zonelist.change_priority(player.force.name, zone, priority) + end + elseif element.name == Zonelist.name_zone_priority_minus_button then + local zone = Zonelist.get_selected_zone_or_current(event.player_index) + local forcedata = global.forces[player.force.name] + if zone.type ~= "spaceship" then + forcedata.zone_priorities = forcedata.zone_priorities or {} + local priority = (forcedata.zone_priorities[zone.index] or 0) - 1 + Zonelist.change_priority(player.force.name, zone, priority) + else + forcedata.spaceship_priorities = forcedata.spaceship_priorities or {} + local priority = (forcedata.spaceship_priorities[zone.index] or 0) - 1 + Zonelist.change_priority(player.force.name, zone, priority) + end + elseif element.name == Zonelist.name_zone_trim_surface_button then + local zone + if root.parent then zone = MapView.gui_get_zone_from_element(root.parent) end -- try to get zone from parent + if not zone then zone = map_view_zone or Zonelist.get_selected_zone_or_current(event.player_index) end + if zone then + Zone.trim_surface(zone, event.player_index) + end + elseif element.name == Zonelist.name_zone_delete_surface_button then + local zone + if root.parent then zone = MapView.gui_get_zone_from_element(root.parent) end -- try to get zone from parent + if not zone then zone = map_view_zone or Zonelist.get_selected_zone_or_current(event.player_index) end + if zone then + Zone.delete_surface(zone, event.player_index) + Zonelist.gui_update_selected(event.player_index) + MapView.gui_update(player) + end + elseif element.name == Zonelist.name_zone_scan_surface_button then + local forcedata = global.forces[player.force.name] + local zone + if root.parent then zone = MapView.gui_get_zone_from_element(root.parent) end -- try to get zone from parent + if not zone then zone = map_view_zone or Zonelist.get_selected_zone_or_current(event.player_index) end + local surface = Zone.get_make_surface(zone) + if forcedata.is_scanning then + forcedata.is_scanning = false + player.force.cancel_charting() + Zonelist.gui_update_selected(event.player_index) + forcedata.scanning_zone = nil + forcedata.scanning_cursor = nil + else + forcedata.is_scanning = true + forcedata.scanning_zone = zone + Zonelist.gui_update_selected(event.player_index) + end + MapView.gui_update(player) + elseif element.name == Zonelist.name_button_close then + Zonelist.gui_close(event.player_index) + end + return + end +end +Event.addListener(defines.events.on_gui_click, Zonelist.on_gui_click) + +function Zonelist.change_priority(force_name, zone, priority) + priority = math.min(math.max(priority, -Zonelist.priority_max), Zonelist.priority_max) + local forcedata = global.forces[force_name] + if zone.type == "spaceship" then + forcedata.spaceship_priorities = forcedata.spaceship_priorities or {} + forcedata.spaceship_priorities[zone.index] = priority + else + forcedata.zone_priorities = forcedata.zone_priorities or {} + forcedata.zone_priorities[zone.index] = priority + end + for _, player in pairs(game.connected_players) do + local window = Zonelist.get_main_window(player.index) + if window then + local zonelist_scroll = util.find_first_descendant_by_name(window, Zonelist.name_zonelist_scroll) + + local row = zonelist_scroll[(zone.type == "spaceship" and "spaceship" or "zone").."_"..zone.index] + if row and row.row_flow and row.row_flow.cell_priority then + local cell = row.row_flow.cell_priority + cell.caption = priority + if priority > 0 then + cell.style.font_color = Zonelist.name_color_priority_positive + elseif priority < 0 then + cell.style.font_color = Zonelist.name_color_priority_negative + else + cell.style.font_color = Zonelist.name_color_priority_neutral + end + end + local selected_zone = Zonelist.get_selected_zone_or_current(player.index) + if selected_zone == zone then + local textfield = util.find_first_descendant_by_name(window, Zonelist.name_zone_priority_field) + textfield.text = ""..priority + if priority > 0 then + textfield.style.font_color = Zonelist.name_color_priority_positive + elseif priority < 0 then + textfield.style.font_color = Zonelist.name_color_priority_negative + else + textfield.style.font_color = Zonelist.name_color_priority_neutral + end + end + end + end +end + +function Zonelist.on_gui_text_changed(event) + if not (event.element and event.element.valid) then return end + local element = event.element + local root = gui_element_or_parent(element, Zonelist.name_gui_root) + if root then -- remote view + if element.name == Zonelist.name_zonelist_search then + Zonelist.gui_update_list(event.player_index) + elseif element.name == Zonelist.name_zone_priority_field then + local player = game.players[event.player_index] + local zone = Zonelist.get_selected_zone_or_current(event.player_index) + local priority = util.string_to_number(element.text) + if priority then + Zonelist.change_priority(player.force.name, zone, priority) + end + end + end +end +Event.addListener(defines.events.on_gui_text_changed, Zonelist.on_gui_text_changed) + +function Zonelist.on_lua_shortcut (event) + if event.player_index + and game.players[event.player_index] + and game.players[event.player_index].connected then + + if event.prototype_name == Zonelist.name_shortcut then + Zonelist.toggle_main_window(event.player_index) + end + + end +end +Event.addListener(defines.events.on_lua_shortcut, Zonelist.on_lua_shortcut) + +function Zonelist.on_universe_explorer_keypress (event) + Zonelist.toggle_main_window(event.player_index) +end +Event.addListener(Zonelist.name_event, Zonelist.on_universe_explorer_keypress) + +function Zonelist.on_gui_opened(event) + local player_index = event.player_index + local window = Zonelist.get_main_window(player_index) + if window then + window.destroy() + game.players[player_index].opened = nil + end +end +Event.addListener(defines.events.on_gui_opened, Zonelist.on_gui_opened) + +function Zonelist.update_overhead_button(player_index) + local player = game.players[player_index] + local button_flow = mod_gui.get_button_flow(player) + if button_flow then + if settings.get_player_settings(player)[Zonelist.name_setting_overhead_explorer].value == true then + if not button_flow[Zonelist.name_button_overhead_explorer] then + button_flow.add{type="sprite-button", name=Zonelist.name_button_overhead_explorer, sprite="se-map-gui-universe-explorer", tooltip = {"space-exploration.zonelist-window-title"}} + end + else + if button_flow[Zonelist.name_button_overhead_explorer] then + button_flow[Zonelist.name_button_overhead_explorer].destroy() + end + end + end +end + +function Zonelist.on_runtime_mod_setting_changed(event) + for _, player in pairs(game.connected_players) do + Zonelist.update_overhead_button(player.index) + end +end +Event.addListener(defines.events.on_runtime_mod_setting_changed, Zonelist.on_runtime_mod_setting_changed) + +function Zonelist.on_configuration_changed() + for _, player in pairs(game.connected_players) do + Zonelist.update_overhead_button(player.index) + end +end +Event.addListener("on_configuration_changed", Zonelist.on_configuration_changed, true) + + +return Zonelist diff --git a/space-exploration_0.5.58/space-exploration/settings.lua b/space-exploration_0.5.58/space-exploration/settings.lua new file mode 100644 index 0000000..42257f4 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/settings.lua @@ -0,0 +1,230 @@ +data:extend{ + { + type = "int-setting", + name = "se-meteor-interval", + setting_type = "runtime-global", + default_value = 30, + minimum_value = 1, + maximum_value = 2880, + order = "a-a" + }, + { + type = "bool-setting", + name = "se-print-meteor-info", + setting_type = "runtime-per-user", + default_value = true, + order = "a-b" + }, + { + type = "int-setting", + name = "se-plague-max-runtime", + setting_type = "runtime-global", + default_value = 5, + minimum_value = 1, + maximum_value = 1000, + order = "b" + }, + { + type = "bool-setting", + name = "se-print-satellite-discovered-nothing", + setting_type = "runtime-per-user", + default_value = true, + order = "c-a" + }, + { + type = "bool-setting", + name = "se-never-show-lifesupport", + setting_type = "runtime-per-user", + default_value = false, + order = "c-b" + }, + { + type = "bool-setting", + name = "se-show-zone-preview", + setting_type = "runtime-per-user", + default_value = true, + order = "d" + }, + { + type = "int-setting", + name = "se-cmes-max-frequency", + setting_type = "runtime-global", + minimum_value = 0, + maximum_value = 200, + default_value = 36, + order = "a-c" + }, + { + type = "int-setting", + name = "se-space-pipe-capacity", + setting_type = "startup", + default_value = 100, + minimum_value = 50, + maximum_value = 200, + order = "e" + }, + { + type = "string-setting", + name = "se-space-science-pack", + setting_type = "startup", + default_value = "Replace", + allowed_values = {"Remove", "Replace", "OptimisationUranium", "OptimisationFish"}, + order = "i" + }, + --[[{ + type = "bool-setting", + name = "se-electric-boiler", + setting_type = "startup", + default_value = true + }, + { + type = "bool-setting", + name = "se-deep-space-belt-black", + setting_type = "startup", + default_value = false + },]]-- + { + type = "int-setting", + name = "se-deep-space-belt-speed", + setting_type = "startup", + default_value = 64, + minimum_value = 1, + maximum_value = 512, + order = "f" + }, + { + type = "bool-setting", + name = "se-deep-space-belt-white", + setting_type = "startup", + default_value = true, + order = "g" + }, + { + type = "bool-setting", + name = "se-deep-space-belt-red", + setting_type = "startup", + default_value = true, + order = "g" + }, + { + type = "bool-setting", + name = "se-deep-space-belt-magenta", + setting_type = "startup", + default_value = true, + order = "g" + }, + { + type = "bool-setting", + name = "se-deep-space-belt-blue", + setting_type = "startup", + default_value = true, + order = "g" + }, + { + type = "bool-setting", + name = "se-deep-space-belt-cyan", + setting_type = "startup", + default_value = true, + order = "g" + }, + { + type = "bool-setting", + name = "se-deep-space-belt-green", + setting_type = "startup", + default_value = true, + order = "g" + }, + { + type = "bool-setting", + name = "se-deep-space-belt-yellow", + setting_type = "startup", + default_value = true, + order = "g" + }, + { + type = "bool-setting", + name = "se-pylon-charge-points", + setting_type = "startup", + default_value = false, + order = "e-b" + }, + { + type = "bool-setting", + name = "se-spawn-small-resources", + setting_type = "startup", + default_value = true, + order = "h" + }, + { + type = "bool-setting", + name = "se-show-overhead-button-satellite-mode", + setting_type = "runtime-per-user", + default_value = true, + order = "d-b" + }, + { + type = "bool-setting", + name = "se-show-overhead-button-interstellar-map", + setting_type = "runtime-per-user", + default_value = true, + order = "d-c" + }, + { + type = "bool-setting", + name = "se-show-overhead-button-universe-explorer", + setting_type = "runtime-per-user", + default_value = true, + order = "d-d" + }, + { + type = "bool-setting", + name = "se-show-pin-help-tooltip", + setting_type = "runtime-per-user", + default_value = true, + order = "e-a" + }, + { + type = "int-setting", + name = "se-scan-search-budget", + setting_type = "runtime-global", + default_value = 1000, + minimum_value = 1, + maximum_value = 10000, + order = "s-a" + }, + { + type = "int-setting", + name = "se-scan-chart-budget", + setting_type = "runtime-global", + default_value = 10, + minimum_value = 1, + maximum_value = 1000, + order = "s-b" + }, + { + type = "int-setting", + name = "se-scan-alert-interval", + setting_type = "runtime-global", + default_value = 60, + minimum_value = 0, + maximum_value = 1000, + order = "s-c" + }, + { + type = "int-setting", + name = "se-supercharger-individual-charge-rate", + setting_type = "startup", + default_value = 90, + minimum_value = 90, + maximum_value = 1000, + order = "e-c" + } + +} + +for _, setting in pairs(data.raw["string-setting"]) do + if string.find(setting.name, "alien-biomes-include-", 1, true) and setting.name ~= "alien-biomes-include-rivers" then + setting.allowed_values = {"Enabled"} + end +end +data.raw["string-setting"]["alien-biomes-disable-vegetation"].allowed_values = {"Disabled"} diff --git a/space-exploration_0.5.58/space-exploration/shared.lua b/space-exploration_0.5.58/space-exploration/shared.lua new file mode 100644 index 0000000..f025147 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/shared.lua @@ -0,0 +1,8 @@ +local Shared = {} +-- used in data phase and control + +Shared.resources_with_shared_controls = { + "lithia-water", --uses ground-water +} + +return Shared diff --git a/space-exploration_0.5.58/space-exploration/sound/canister-breath.ogg b/space-exploration_0.5.58/space-exploration/sound/canister-breath.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4f8dab1698af000b5edc694000194fb94c6f568a GIT binary patch literal 29109 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 A+5i9m literal 0 HcmV?d00001 diff --git a/space-exploration_0.5.58/space-exploration/sound/gate-button.ogg b/space-exploration_0.5.58/space-exploration/sound/gate-button.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ffbb37587c9789941310627ac1c96e60e7688537 GIT binary patch literal 22894 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 c;>%)EO1qx+ZqMHyrvuFExSpWb4 literal 0 HcmV?d00001 diff --git a/space-exploration_0.5.58/space-exploration/sound/gate-lock.ogg b/space-exploration_0.5.58/space-exploration/sound/gate-lock.ogg new file mode 100644 index 0000000000000000000000000000000000000000..dec48c7a3c549785e8564f43e41f84e39fdacf2e GIT binary patch literal 80401 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

xA7u+~GvPsP04% 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%0DQv?VJoICY{WQ|}|gx_KG!`;PnHryL$ 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 literal 0 HcmV?d00001 diff --git a/space-exploration_0.5.58/space-exploration/sound/gate-power-up.ogg b/space-exploration_0.5.58/space-exploration/sound/gate-power-up.ogg new file mode 100644 index 0000000000000000000000000000000000000000..652faebcb541c053b032a36afc01c40dbf10c98e GIT binary patch literal 85722 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≪DPS_BfBeUB@^w)4&rI3uO4T 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

!v3 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�mJkMng9R* literal 0 HcmV?d00001 diff --git a/space-exploration_0.5.58/space-exploration/sound/gate-turning.ogg b/space-exploration_0.5.58/space-exploration/sound/gate-turning.ogg new file mode 100644 index 0000000000000000000000000000000000000000..41b68db4edf89adf251927a25ee11d53231e9af1 GIT binary patch literal 58027 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 literal 0 HcmV?d00001 diff --git a/space-exploration_0.5.58/space-exploration/sound/meteor-woosh.ogg b/space-exploration_0.5.58/space-exploration/sound/meteor-woosh.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e9fac5a490b346b4cb34b1dab36734f9d17f9e67 GIT binary patch literal 122680 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

`ew#iH6J``_;b&wE6&tm3wZ4+G-)zrvDtqb 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 bQmOc1T`c%ItL>I7?>p!0fzHK7EZ{!?16LkF literal 0 HcmV?d00001 diff --git a/space-exploration_0.5.58/space-exploration/sound/spaceship-woosh.ogg b/space-exploration_0.5.58/space-exploration/sound/spaceship-woosh.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fa3a985438b727a71d16a8cf99c242e146d9260c GIT binary patch literal 44163 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 AH~;_u literal 0 HcmV?d00001 diff --git a/space-exploration_0.5.58/space-exploration/sound/tesla-gunshot.ogg b/space-exploration_0.5.58/space-exploration/sound/tesla-gunshot.ogg new file mode 100644 index 0000000000000000000000000000000000000000..33a02937126c1232eff89d0b761bc36943a08727 GIT binary patch literal 33897 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 literal 0 HcmV?d00001 diff --git a/space-exploration_0.5.58/space-exploration/stdlib/area/area.lua b/space-exploration_0.5.58/space-exploration/stdlib/area/area.lua new file mode 100644 index 0000000..43d7056 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/area/area.lua @@ -0,0 +1,243 @@ +--- Area module +-- @module Area + +local Core = require 'stdlib/core' +local Position = require 'stdlib/area/position' + +local Area = {} + +--- Creates an area from the 2 positions p1 and p2 +-- @param x1 x-position of left_top, first point +-- @param y1 y-position of left_top, first point +-- @param x2 x-position of right_bottom, second point +-- @param y2 y-position of right_bottom, second point +-- @return Area tabled area +function Area.construct(x1, y1, x2, y2) + return { left_top = Position.construct(x1, y1), right_bottom = Position.construct(x2, y2) } +end + +--- Returns the size of the space contained in the 2d area
+-- Deprecated, Area.area is misleading. See: Area.size +-- @param area the area +-- @return size of the area +function Area.area(area) + return Area.size(area) +end + +--- Returns the size of the space contained in the 2d area +-- @param area the area +-- @return size of the area +function Area.size(area) + Core.fail_if_missing(area, "missing area value") + area = Area.to_table(area) + + local left_top = Position.to_table(area.left_top) + local right_bottom = Position.to_table(area.right_bottom) + + local dx = math.abs(left_top.x - right_bottom.x) + local dy = math.abs(left_top.y - right_bottom.y) + return dx * dy +end + +--- Tests if a position {x, y} is inside (inclusive) of area +-- @param area the area +-- @param pos the position to check +-- @return true if the position is inside of the area +function Area.inside(area, pos) + Core.fail_if_missing(pos, "missing pos value") + Core.fail_if_missing(area, "missing area value") + pos = Position.to_table(pos) + area = Area.to_table(area) + + local left_top = Position.to_table(area.left_top) + local right_bottom = Position.to_table(area.right_bottom) + return pos.x >= left_top.x and pos.y >= left_top.y and pos.x <= right_bottom.x and pos.y <= right_bottom.y +end + +--- Shrinks the size of an area by the given amount +-- @param area the area +-- @param amount to shrink each edge of the area inwards by +-- @return the shrunk area +function Area.shrink(area, amount) + Core.fail_if_missing(area, "missing area value") + Core.fail_if_missing(amount, "missing amount value") + if amount < 0 then error("Can not shrunk area by a negative amount (see Area.expand)!", 2) end + area = Area.to_table(area) + + local left_top = Position.to_table(area.left_top) + local right_bottom = Position.to_table(area.right_bottom) + return {left_top = {x = left_top.x + amount, y = left_top.y + amount}, right_bottom = {x = right_bottom.x - amount, y = right_bottom.y - amount}} +end + +--- Expands the size of an area by the given amount +-- @param area the area +-- @param amount to expand each edge of the area outwards by +-- @return the expanded area +function Area.expand(area, amount) + Core.fail_if_missing(area, "missing area value") + Core.fail_if_missing(amount, "missing amount value") + if amount < 0 then error("Can not expand area by a negative amount (see Area.shrink)!", 2) end + area = Area.to_table(area) + + local left_top = Position.to_table(area.left_top) + local right_bottom = Position.to_table(area.right_bottom) + return {left_top = {x = left_top.x - amount, y = left_top.y - amount}, right_bottom = {x = right_bottom.x + amount, y = right_bottom.y + amount}} +end + +--- Calculates the center of the area and returns the position +-- @param area the area +-- @return area to find the center for +function Area.center(area) + Core.fail_if_missing(area, "missing area value") + area = Area.to_table(area) + + local dist_x = area.right_bottom.x - area.left_top.x + local dist_y = area.right_bottom.y - area.left_top.y + + return {x = area.left_top.x + (dist_x / 2), y = area.left_top.y + (dist_y / 2)} +end + +--- Offsets the area by the {x, y} values +-- @param area the area +-- @param pos the {x, y} amount to offset the area +-- @return offset area by the position values +function Area.offset(area, pos) + Core.fail_if_missing(area, "missing area value") + Core.fail_if_missing(pos, "missing pos value") + area = Area.to_table(area) + + return {left_top = Position.add(area.left_top, pos), right_bottom = Position.add(area.right_bottom, pos)} +end + +--- Converts an area to the integer representation, by taking the floor of the left_top and the ceiling of the right_bottom +-- @param area the area +-- @return the rounded integer representation +function Area.round_to_integer(area) + Core.fail_if_missing(area, "missing area value") + area = Area.to_table(area) + + local left_top = Position.to_table(area.left_top) + local right_bottom = Position.to_table(area.right_bottom) + return {left_top = {x = math.floor(left_top.x), y = math.floor(left_top.y)}, + right_bottom = {x = math.ceil(right_bottom.x), y = math.ceil(right_bottom.y)}} +end + +--- Iterates an area. +-- @usage +---for x,y in Area.iterate({{0, -5}, {3, -3}}) do +-----... +---end +-- @param area the area +-- @return iterator +function Area.iterate(area) + Core.fail_if_missing(area, "missing area value") + + local iterator = {idx = 0} + function iterator.iterate(area2) --luacheck: ignore + local rx = area.right_bottom.x - area.left_top.x + 1 + local dx = iterator.idx % rx + local dy = math.floor(iterator.idx / rx) + iterator.idx = iterator.idx + 1 + if (area.left_top.y + dy) > area.right_bottom.y then + return + end + return (area.left_top.x + dx), (area.left_top.y + dy) + end + return iterator.iterate, Area.to_table(area), 0 +end + +--- Iterates an area in a spiral inner-most to outer-most fashion. +---

Example:

+---
+---for x, y in Area.spiral_iterate({{-2, -1}, {2, 1}}) do
+---- print("(" .. x .. ", " .. y .. ")")
+---end
+--- prints: (0, 0) (1, 0) (1, 1) (0, 1) (-1, 1) (-1, 0) (-1, -1) (0, -1) (1, -1) (2, -1) (2, 0) (2, 1) (-2, 1) (-2, 0) (-2, -1)
+---
+-- iterates in the order depicted:
+-- ![](http://i.imgur.com/EwfO0Es.png) +-- @param area the area +-- @return iterator +function Area.spiral_iterate(area) + Core.fail_if_missing(area, "missing area value") + area = Area.to_table(area) + + local rx = area.right_bottom.x - area.left_top.x + 1 + local ry = area.right_bottom.y - area.left_top.y + 1 + local half_x = math.floor(rx / 2) + local half_y = math.floor(ry / 2) + local center_x = area.left_top.x + half_x + local center_y = area.left_top.y + half_y + + local x = 0 + local y = 0 + local dx = 0 + local dy = -1 + local iterator = {list = {}, idx = 1} + for _ = 1, math.max(rx, ry) * math.max(rx, ry) do + if - (half_x) <= x and x <= half_x and - (half_y) <= y and y <= half_y then + table.insert(iterator.list, {x, y}) + end + if x == y or (x < 0 and x == -y) or (x > 0 and x == 1 - y) then + local temp = dx + dx = -(dy) + dy = temp + end + x = x + dx + y = y + dy + end + + function iterator.iterate() + if #iterator.list < iterator.idx then return end + local x2, y2 = unpack(iterator.list[iterator.idx]) + iterator.idx = iterator.idx + 1 + + return (center_x + x2), (center_y + y2) + end + return iterator.iterate, Area.to_table(area), 0 +end + +--- Creates a new area, a modified copy of the original, such that left and right x, up and down y are normalized, where left.x < right.x, left.y < right.y order +-- @param area the area to adjust +-- @return a normalized area, always { left_top = {x = ..., y = ...}, right_bottom = {x = ..., y = ...} } +function Area.normalize(area) + Core.fail_if_missing(area, "missing area value") + area = Area.to_table(area) + + local left_top = Position.copy(area.left_top) + local right_bottom = Position.copy(area.right_bottom) + + if right_bottom.x < left_top.x then + local x = left_top.x + left_top.x = right_bottom.x + right_bottom.x = x + end + if right_bottom.y < left_top.y then + local y = left_top.y + left_top.y = right_bottom.y + right_bottom.y = y + end + + return Area.construct(left_top.x, left_top.y, right_bottom.x, right_bottom.y) +end + +--- Creates a new area, a modified copy of the original, such that left and right x, up and down y are normalized, where left.x < right.x, left.y < right.y order +-- Deprecated, Area.adjust is ambigious. See: Area.normalize +-- @param area the area to adjust +-- @return a adjusted area, always { left_top = {x = ..., y = ...}, right_bottom = {x = ..., y = ...} } +function Area.adjust(area) + return Area.normalize(area) +end + +--- Converts an area in the array format to an array in the table format +-- @param area_arr the area to convert +-- @return a converted area, { left_top = area_arr[1], right_bottom = area_arr[2] } +function Area.to_table(area_arr) + Core.fail_if_missing(area_arr, "missing area value") + if #area_arr == 2 then + return { left_top = Position.to_table(area_arr[1]), right_bottom = Position.to_table(area_arr[2]) } + end + return area_arr +end + +return Area diff --git a/space-exploration_0.5.58/space-exploration/stdlib/area/chunk.lua b/space-exploration_0.5.58/space-exploration/stdlib/area/chunk.lua new file mode 100644 index 0000000..fe9f497 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/area/chunk.lua @@ -0,0 +1,108 @@ +--- Chunk module +---

A chunk represents a 32x32 area of a surface in factorio.

+-- @module Chunk + +local Core = require 'stdlib/core' +local Position = require 'stdlib/area/position' + +local Chunk = {} +local MAX_UINT = 4294967296 + +--- Calculates the chunk coordinates for the tile position given +-- @param position to calculate the chunk for +-- @return the chunk position as a table +-- @usage +----local chunk_x = Chunk.from_position(pos).x +function Chunk.from_position(position) + position = Position.to_table(position) + local x = math.floor(position.x) + local y = math.floor(position.y) + local chunk_x = bit32.arshift(x, 5) + if x < 0 then + chunk_x = chunk_x - MAX_UINT + end + local chunk_y = bit32.arshift(y, 5) + if y < 0 then + chunk_y = chunk_y - MAX_UINT + end + return {x = chunk_x, y = chunk_y} +end + +--- Converts a chunk to the area it contains +-- @param chunk_pos to convert to an area +-- @return area that chunk is valid for +function Chunk.to_area(chunk_pos) + Core.fail_if_missing(chunk_pos, "missing chunk_pos argument") + chunk_pos = Position.to_table(chunk_pos) + + local left_top = { x = chunk_pos.x * 32, y = chunk_pos.y * 32 } + return { left_top = left_top, right_bottom = Position.offset(left_top, 32, 32) } +end + +--- Gets user data from the chunk, stored in a mod's global data. +---

The data will persist between loads

+-- @param surface the surface to look up data for +-- @param chunk_pos the chunk coordinates to look up data for +-- @param default_value (optional) to set and return if no data exists +-- @return the data, or nil if no data exists for the chunk +function Chunk.get_data(surface, chunk_pos, default_value) + Core.fail_if_missing(surface, "missing surface argument") + Core.fail_if_missing(chunk_pos, "missing chunk_pos argument") + if not global._chunk_data then + if not default_value then return nil end + global._chunk_data = {} + end + + local idx = Chunk.get_index(surface, chunk_pos) + local val = global._chunk_data[idx] + if not val then + global._chunk_data[idx] = default_value + val = default_value + end + + return val, idx +end + +--- Sets user data on the chunk, stored in a mod's global data. +---

The data will persist between loads

+-- @param surface the surface to look up data for +-- @param chunk_pos the chunk coordinates to look up data for +-- @param data the data to set (or nil to erase the data for the chunk) +-- @return the previous data associated with the chunk, or nil if the chunk had no previous data +function Chunk.set_data(surface, chunk_pos, data) + Core.fail_if_missing(surface, "missing surface argument") + Core.fail_if_missing(chunk_pos, "missing chunk_pos argument") + if not global._chunk_data then global._chunk_data = {} end + + local idx = Chunk.get_index(surface, chunk_pos) + local prev = global._chunk_data[idx] + global._chunk_data[idx] = data + + return prev +end + +--- Calculates and returns a stable, deterministic, unique integer id for the given chunk_pos +---

The id will not change once calculated

+-- @param surface the chunk is on +-- @param chunk_pos of the chunk +function Chunk.get_index(surface, chunk_pos) + Core.fail_if_missing(surface, "missing surface argument") + Core.fail_if_missing(chunk_pos, "missing chunk_pos argument") + if not global._next_chunk_index then global._next_chunk_index = 0 end + if not global._chunk_indexes then global._chunk_indexes = {} end + + if type(surface) == "string" then + surface = game.surfaces[surface] + end + local surface_idx = surface.index + if not global._chunk_indexes[surface_idx] then global._chunk_indexes[surface_idx] = {} end + + local surface_chunks = global._chunk_indexes[surface_idx] + if not surface_chunks[chunk_pos.x] then surface_chunks[chunk_pos.x] = {} end + if not surface_chunks[chunk_pos.x][chunk_pos.y] then + surface_chunks[chunk_pos.x][chunk_pos.y] = global._next_chunk_index + global._next_chunk_index = global._next_chunk_index + 1 + end + + return surface_chunks[chunk_pos.x][chunk_pos.y] +end diff --git a/space-exploration_0.5.58/space-exploration/stdlib/area/position.lua b/space-exploration_0.5.58/space-exploration/stdlib/area/position.lua new file mode 100644 index 0000000..58fe60b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/area/position.lua @@ -0,0 +1,205 @@ +--- Position module +-- @module Position + +local Core = require 'stdlib/core' + +local Position = {} + +--- Creates a table representing the position from x and y +-- @param x x-position +-- @param y y-position +-- @return Position +function Position.construct(x, y) + Core.fail_if_missing(x, "missing x position argument") + Core.fail_if_missing(y, "missing y position argument") + return { x = x, y = y } +end + +--- Creates a position that is a copy of the given position +-- @param pos the position to copy +-- @return Position +function Position.copy(pos) + Core.fail_if_missing(pos, "missing position argument") + pos = Position.to_table(pos) + return { x = pos.x, y = pos.y } +end + +--- Creates a position that is offset by x,y coordinate pair +-- @param pos the position to offset +-- @param x the amount to offset the position in the x direction +-- @param y the amount to offset the position in the y direction +-- @return a new position, offset by the x,y coordinates +function Position.offset(pos, x, y) + Core.fail_if_missing(pos, "missing position argument") + Core.fail_if_missing(x, "missing x-coordinate value") + Core.fail_if_missing(y, "missing y-coordinate value") + + if #pos == 2 then + return { x = pos[1] + x, y = pos[2] + y } + else + return { x = pos.x + x, y = pos.y + y } + end +end + +--- Adds 2 positions +-- @param pos1 the first position +-- @param pos2 the second position +-- @return a new position +function Position.add(pos1, pos2) + Core.fail_if_missing(pos1, "missing first position argument") + Core.fail_if_missing(pos2, "missing second position argument") + + pos1 = Position.to_table(pos1) + pos2 = Position.to_table(pos2) + return { x = pos1.x + pos2.x, y = pos1.y + pos2.y} +end + +--- Subtracts 2 positions +-- @param pos1 the first position +-- @param pos2 the second position +-- @return a new position +function Position.subtract(pos1, pos2) + Core.fail_if_missing(pos1, "missing first position argument") + Core.fail_if_missing(pos2, "missing second position argument") + + pos1 = Position.to_table(pos1) + pos2 = Position.to_table(pos2) + return { x = pos1.x - pos2.x, y = pos1.y - pos2.y } +end + +--- Translates a position in the given direction +-- @param pos the position to translate +-- @param direction in which direction to translate (see defines.direction) +-- @param distance distance of the translation +-- @return the translated position +function Position.translate(pos, direction, distance) + Core.fail_if_missing(pos, "missing position argument") + Core.fail_if_missing(direction, "missing direction argument") + Core.fail_if_missing(distance, "missing distance argument") + + pos = Position.to_table(pos) + + if direction == defines.direction.north then + return { x = pos.x, y = pos.y - distance } + elseif direction == defines.direction.northeast then + return { x = pos.x + distance, y = pos.y - distance } + elseif direction == defines.direction.east then + return { x = pos.x + distance, y = pos.y } + elseif direction == defines.direction.southeast then + return { x = pos.x + distance, y = pos.y + distance } + elseif direction == defines.direction.south then + return { x = pos.x, y = pos.y + distance } + elseif direction == defines.direction.southwest then + return { x = pos.x - distance, y = pos.y + distance } + elseif direction == defines.direction.west then + return { x = pos.x - distance, y = pos.y } + elseif direction == defines.direction.northwest then + return { x = pos.x - distance, y = pos.y - distance } + end +end + +--- Expands a position to a square area +-- @param pos the position to expand into an area +-- @param radius half the side length of the area +-- @return a bounding box +function Position.expand_to_area(pos, radius) + Core.fail_if_missing(pos, "missing position argument") + Core.fail_if_missing(radius, "missing radius argument") + + if #pos == 2 then + return { left_top = { x = pos[1] - radius, y = pos[2] - radius }, right_bottom = { x = pos[1] + radius, y = pos[2] + radius } } + end + return { left_top = { x = pos.x - radius, y = pos.y - radius}, right_bottom = { x = pos.x + radius, y = pos.y + radius } } +end + +--- Calculates the Euclidean distance squared between two positions, useful when sqrt is not needed +-- @param pos1 the first position +-- @param pos2 the second position +-- @return the square of the Euclidean distance +function Position.distance_squared(pos1, pos2) + Core.fail_if_missing(pos1, "missing first position argument") + Core.fail_if_missing(pos2, "missing second position argument") + + pos1 = Position.to_table(pos1) + pos2 = Position.to_table(pos2) + local axbx = pos1.x - pos2.x + local ayby = pos1.y - pos2.y + return axbx * axbx + ayby * ayby +end + +--- Calculates the Euclidean distance between two positions +-- @param pos1 the first position +-- @param pos2 the second position +-- @return the square of the Euclidean distance +function Position.distance(pos1, pos2) + Core.fail_if_missing(pos1, "missing first position argument") + Core.fail_if_missing(pos2, "missing second position argument") + + return math.sqrt(Position.distance_squared(pos1, pos2)) +end + +--- Calculates the manhatten distance between two positions +-- @param pos1 the first position +-- @param pos2 the second position +-- @return the square of the Euclidean distance +function Position.manhattan_distance(pos1, pos2) + Core.fail_if_missing(pos1, "missing first position argument") + Core.fail_if_missing(pos2, "missing second position argument") + pos1 = Position.to_table(pos1) + pos2 = Position.to_table(pos2) + + return math.abs(pos2.x - pos1.x) + math.abs(pos2.y - pos1.y) +end + +-- see: https://en.wikipedia.org/wiki/Machine_epsilon +Position._epsilon = 1.19e-07 + +--- Whether 2 positions are equal +-- @param pos1 the first position +-- @param pos2 the second position +-- @return true if positions are equal +function Position.equals(pos1, pos2) + if not pos1 or not pos2 then return false end + -- optimize for a shallow equality check first + if pos1 == pos2 then return true end + + local epsilon = Position._epsilon + local abs = math.abs + if #pos1 == 2 and #pos2 == 2 then + return abs(pos1[1] - pos2[1]) < epsilon and abs(pos1[2] - pos2[2]) < epsilon + elseif #pos1 == 2 and #pos2 == 0 then + return abs(pos1[1] - pos2.x) < epsilon and abs(pos1[2] - pos2.y) < epsilon + elseif #pos1 == 0 and #pos2 == 2 then + return abs(pos1.x - pos2[1]) < epsilon and abs(pos1.y - pos2[2]) < epsilon + elseif #pos1 == 0 and #pos2 == 0 then + return abs(pos1.x - pos2.x) < epsilon and abs(pos1.y - pos2.y) < epsilon + end + + return false +end + +--- Converts a position in the array format to a position in the table format +-- @param pos_arr the position to convert +-- @return a converted position, { x = pos_arr[1], y = pos_arr[2] } +function Position.to_table(pos_arr) + Core.fail_if_missing(pos_arr, "missing position argument") + + if #pos_arr == 2 then + return { x = pos_arr[1], y = pos_arr[2] } + end + return pos_arr +end + +--- Converts a position to a string +-- @param pos the position to convert +-- @return string representation of pos +function Position.tostring(pos) + Core.fail_if_missing(pos, "missing position argument") + if #pos == 2 then + return "Position {x = " .. pos[1] .. ", y = " .. pos[2] .. "}" + else + return "Position {x = " .. pos.x .. ", y = " .. pos.y .. "}" + end +end + +return Position diff --git a/space-exploration_0.5.58/space-exploration/stdlib/area/tile.lua b/space-exploration_0.5.58/space-exploration/stdlib/area/tile.lua new file mode 100644 index 0000000..822010d --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/area/tile.lua @@ -0,0 +1,121 @@ +--- Tile module +---

A tile represents a 1x1 area on a surface in factorio +-- @module Tile + +local Core = require 'stdlib/core' +local Position = require 'stdlib/area/position' +local Chunk = require 'stdlib/area/chunk' + +local Tile = {} +--local MAX_UINT = 4294967296 + +--- Calculates the tile coordinates for the position given +-- @param position to calculate the tile for +-- @return the tile position +function Tile.from_position(position) + position = Position.to_table(position) + return {x = math.floor(position.x), y = math.floor(position.y)} +end + +--- Converts a tile position to the area it contains +-- @param tile_pos to convert to an area +-- @return area that tile is valid for +function Tile.to_area(tile_pos) + Core.fail_if_missing(tile_pos, "missing tile_pos argument") + tile_pos = Tile.from_position(tile_pos) + + return { left_top = tile_pos, right_bottom = Position.offset(tile_pos, 1, 1) } +end + +--- Creates a list of tile positions for all adjacent tiles (N, E, S, W) or (N, NE, E, SE, S, SW, W, NW) if diagonal is true +-- @param surface to examine for adjacent tiles +-- @param position the center tile position, to search around +-- @param diagonal (optional: defaults to false) whether to include diagonal tiles +-- @param tile_name (optional) whether to restrict adjacent tiles to one particular tile name (e.g 'water-tile') +-- @return list of tile positions adjacent to the given position +function Tile.adjacent(surface, position, diagonal, tile_name) + Core.fail_if_missing(surface, "missing surface argument") + Core.fail_if_missing(position, "missing position argument") + + local offsets = {{0, 1}, {1, 0}, {0, - 1}, { - 1, 0}} + if diagonal then + offsets = {{0, 1}, {1, 1}, {1, 0}, { - 1, 1}, { - 1, 0}, { - 1, - 1}, {0, - 1}, {1, - 1}} + end + local adjacent_tiles = {} + for _, offset in pairs(offsets) do + local adj_pos = Position.add(position, offset) + if tile_name then + local tile = surface.get_tile(adj_pos.x, adj_pos.y) + if tile and tile.name == tile_name then + table.insert(adjacent_tiles, adj_pos) + end + else + table.insert(adjacent_tiles, adj_pos) + end + end + return adjacent_tiles +end + +--- Gets user data from the tile, stored in a mod's global data. +---

The data will persist between loads

+-- @param surface the surface to look up data for +-- @param tile_pos the tile coordinates to look up data for +-- @param default_value (optional) to set and return if no data exists +-- @return the data, or nil if no data exists for the chunk +function Tile.get_data(surface, tile_pos, default_value) + Core.fail_if_missing(surface, "missing surface argument") + Core.fail_if_missing(tile_pos, "missing tile_pos argument") + if not global._tile_data then + if not default_value then return nil end + global._tile_data = {} + end + local chunk_idx = Chunk.get_index(surface, Chunk.from_position(tile_pos)) + if not global._tile_data[chunk_idx] then + if not default_value then return nil end + global._tile_data[chunk_idx] = {} + end + + local chunk_tiles = global._tile_data[chunk_idx] + if not chunk_tiles then return nil end + + local idx = Tile.get_index(tile_pos) + local val = chunk_tiles[idx] + if not val then + chunk_tiles[idx] = default_value + val = default_value + end + + return val +end + +--- Sets user data on the tile, stored in a mod's global data. +---

The data will persist between loads

+-- @param surface the surface to look up data for +-- @param tile_pos the chunk coordinates to look up data for +-- @param data the data to set (or nil to erase the data for the tile) +-- @return the previous data associated with the tile, or nil if the tile had no previous data +function Tile.set_data(surface, tile_pos, data) + Core.fail_if_missing(surface, "missing surface argument") + Core.fail_if_missing(tile_pos, "missing tile_pos argument") + if not global._tile_data then global._tile_data = {} end + + local chunk_idx = Chunk.get_index(surface, Chunk.from_position(tile_pos)) + if not global._tile_data[chunk_idx] then global._tile_data[chunk_idx] = {} end + + local chunk_tiles = global._tile_data[chunk_idx] + local idx = Tile.get_index(tile_pos) + local prev = chunk_tiles[idx] + chunk_tiles[idx] = data + + return prev +end + +--- Calculates and returns a stable, deterministic integer id for the given tile_pos +---

Tile id will not change once calculated

+---

Tile ids are only unique for the chunk they are in, they may repeat across a surface.

+-- @param tile_pos +-- @return the tile index +function Tile.get_index(tile_pos) + Core.fail_if_missing(tile_pos, "missing tile_pos argument") + return bit32.band(bit32.bor(bit32.lshift(bit32.band(tile_pos.x, 0x1F), 5), bit32.band(tile_pos.y, 0x1F)), 0x3FF) +end diff --git a/space-exploration_0.5.58/space-exploration/stdlib/color/color.lua b/space-exploration_0.5.58/space-exploration/stdlib/color/color.lua new file mode 100644 index 0000000..153e3b2 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/color/color.lua @@ -0,0 +1,14 @@ +--- Color module +-- @module Color + +require 'stdlib/color/defines' + +local Color = {} + +function Color.set(color, alpha) + color = color or defines.colors.white + color.a = alpha or 1 + return color +end + +return Color diff --git a/space-exploration_0.5.58/space-exploration/stdlib/color/defines.lua b/space-exploration_0.5.58/space-exploration/stdlib/color/defines.lua new file mode 100644 index 0000000..7079ebb --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/color/defines.lua @@ -0,0 +1,38 @@ +--Global color defines. +--@usage: font_color=defines.colors.red to set a styles font color to red. + +defines.colors = { + white = {r = 1.00, g = 1.00, b = 1.00}, + black = {r = 0.00, g = 0.00, b = 0.00}, + darkgrey = {r = 0.25, g = 0.25, b = 0.25}, + grey = {r = 0.50, g = 0.50, b = 0.50}, + lightgrey = {r = 0.75, g = 0.75, b = 0.75}, + red = {r = 1.00, g = 0.00, b = 0.00}, + darkred = {r = 0.50, g = 0.00, b = 0.00}, + lightred = {r = 1.00, g = 0.50, b = 0.50}, + green = {r = 0.00, g = 1.00, b = 0.00}, + darkgreen = {r = 0.00, g = 0.50, b = 0.00}, + lightgreen = {r = 0.50, g = 1.00, b = 0.50}, + blue = {r = 0.00, g = 0.00, b = 1.00}, + darkblue = {r = 0.00, g = 0.00, b = 0.50}, + lightblue = {r = 0.50, g = 0.50, b = 1.00}, + orange = {r = 1.00, g = 0.55, b = 0.10}, + yellow = {r = 1.00, g = 1.00, b = 0.00}, + pink = {r = 1.00, g = 0.00, b = 1.00}, + purple = {r = 0.60, g = 0.10, b = 0.60}, + brown = {r = 0.60, g = 0.40, b = 0.10}, +} +defines.anticolors = { + white = defines.colors.black, black = defines.colors.white, darkgrey = defines.colors.white, + grey = defines.colors.black, lightgrey = defines.colors.black, red = defines.colors.white, + darkred = defines.colors.white, lightred = defines.colors.black, green = defines.colors.black, + darkgreen = defines.colors.white, lightgreen = defines.colors.black, blue = defines.colors.white, + darkblue = defines.colors.white, lightblue = defines.colors.black, orange = defines.colors.black, + yellow = defines.colors.black, pink = defines.colors.white, purple = defines.colors.white, + brown = defines.colors.white, +} +defines.lightcolors = { + white = defines.colors.lightgrey, grey = defines.colors.darkgrey, lightgrey = defines.colors.grey, + red = defines.colors.lightred, green = defines.colors.lightgreen, blue = defines.colors.lightblue, + yellow = defines.colors.orange, pink = defines.colors.purple, +} diff --git a/space-exploration_0.5.58/space-exploration/stdlib/config/config.lua b/space-exploration_0.5.58/space-exploration/stdlib/config/config.lua new file mode 100644 index 0000000..72d343b --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/config/config.lua @@ -0,0 +1,180 @@ +--- Config module +-- @module Config +-- luacheck: ignore 143 options reservedCharacters value + +require 'stdlib/string' +require 'stdlib/table' + +----------------------------------------------------------------------- +--Setup repeated code for use in sub functions here +----------------------------------------------------------------------- +local reservedCharacters = '`~!@#$%^&*+=|;:/\\\'",?()[]{}<>' +local testReservedCharacters = function(path) + local reservedCharacters = reservedCharacters + for c in reservedCharacters:gmatch('.') do + if path:find(c, 1, true) then + return c + end + end + return nil +end + +Config = {} + +--- Creates a new Config object +-- to ease the management of a config table. +-- @param config_table [required] The table to be managed. +-- @return the Config instance for managing config_table +-- +-- @usage --[Use a global table for config that persists across game save/loads] +--CONFIG = Config.new(global.testtable) +-- +-- @usage --[You can also create a temporary scratch pad config] +--CONFIG = Config.new({}) -- Temporary scratch pad +-- +-- @usage --[Setting data in Config] +--CONFIG = Config.new(global.testtable) +--CONFIG.set("your.path.here", "myvalue") +-- +-- @usage --[Getting data out of Config] +--CONFIG = Config.new(global.testtable) +--my_data = CONFIG.get("your.path.here") +-- +-- @usage --[Getting data out of Config with a default to use if path is not found in Config] +--CONFIG = Config.new(global.testtable) +--my_data = CONFIG.get("your.path.here", "Your Default here") +-- +-- @usage --[Deleting a path from Config] +--CONFIG = Config.new(global.testtable) +--CONFIG.delete("your.path.here") +-- +-- @usage --[Checking if a path exists in Config] +--CONFIG = Config.new(global.testtable) +--CONFIG.is_set("your.path.here") +function Config.new(config_table) + if not config_table then + error("config_table is a required parameter.", 2) + elseif type(config_table) ~= "table" then + error("config_table must be a table. Was given [" .. type(options) .. "]", 2) + elseif type(config_table.get) == "function" then + error("Config can't manage another Config object", 2) + end + + ----------------------------------------------------------------------- + --Setup the Config object + ----------------------------------------------------------------------- + local Config = {} + + --- Get a stored config value. + -- @param path [required] a string representing the variable to retrieve + -- @param default (optional) value to be used if path is nil + -- @return value at path or nil if not found and no default given + function Config.get(path, default) + if type(path) ~= "string" or path:is_empty() then error("path is invalid", 2) end + + local config = config_table + + local c = testReservedCharacters(path) + if c ~= nil then error("path '" .. path .. "' contains the reserved character '" .. c .. "'", 2) end + + local pathParts = path:split('.') + local part = config; + local value = nil; + + for key = 1, #pathParts, 1 do + local partKey = pathParts[key] + if (type(part) ~= "table") then + value = nil; + break; + end + + value = part[partKey]; + part = part[partKey]; + end + + if (type(value) == "table") then + --Force break references. + return table.deepcopy(value); + elseif (value ~= nil) then + return value; + else + return default; + end + end + + --- Set a stored config value. + -- @param path [required] a string, config path to set + -- @param data (optional) Value to set path to. If nil it behaves identical to Config.delete() + -- @return number 0 on failure; number of affected paths on success + function Config.set(path, data) + if type(path) ~= "string" or path:is_empty() then error("path is invalid", 2) end + + local config = config_table + + local c = testReservedCharacters(path) + if c ~= nil then error("path contains the reserved character '" .. c .. "'", 2) end + + local pathParts = path:split('.') + local part = config; + local value = nil; + + for key = 1, #pathParts - 1, 1 do + local partKey = pathParts[key] + if (type(part[partKey]) ~= "table") then + part[partKey] = {}; + end + + value = part[partKey]; + part = part[partKey]; + end + + part[pathParts[#pathParts]] = data; + + return 1; + end + + --- Delete a stored config value. + -- @param path a string, config path to delete + -- @return number 0 on failure; number of affected paths on success + function Config.delete(path) + if type(path) ~= "string" or path:is_empty() then error("path is invalid", 2) end + + local config = config_table + + local c = testReservedCharacters(path) + if c ~= nil then error("path contains the reserved character '" .. c .. "'", 2) end + + local pathParts = path:split('.') + local part = config + local value = nil + + for key = 1, #pathParts - 1, 1 do + local partKey = pathParts[key] + if (type(part[partKey]) ~= "table") then + return 0 + end + + part = part[partKey] + end + + if part[pathParts[#pathParts]] == nil then + return 0 + else + part[pathParts[#pathParts]] = nil + return 1 + end + end + + --- Test the existence of a stored config value. + -- @param path a string, config path to test + -- @return boolean, true on success, false otherwise + function Config.is_set(path) + if type(path) ~= "string" or path:is_empty() then error("path is invalid", 2) end + + return Config.get(path) ~= nil + end + + return Config +end + +return Config diff --git a/space-exploration_0.5.58/space-exploration/stdlib/core.lua b/space-exploration_0.5.58/space-exploration/stdlib/core.lua new file mode 100644 index 0000000..1cb443f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/core.lua @@ -0,0 +1,20 @@ +--- Core module +-- @module Core + +local Core = {} + +--- Errors if the variable evaluates to false, with an optional msg +-- @param var variable to evaluate +-- @param msg (optional) message +function Core.fail_if_missing(var, msg) + if not var then + if msg then + error(msg, 3) + else + error("Missing value", 3) + end + end + return false +end + +return Core diff --git a/space-exploration_0.5.58/space-exploration/stdlib/data/data.lua b/space-exploration_0.5.58/space-exploration/stdlib/data/data.lua new file mode 100644 index 0000000..87eb70f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/data/data.lua @@ -0,0 +1,63 @@ +--- Data module +-- @module Data +-- luacheck: ignore selection + +local Core = require 'stdlib/core' +require 'stdlib/string' +require 'stdlib/table' + +local Data = {} + +--- Selects all data values where the key matches the selector pattern. +-- The selector pattern is divided into groups. The pattern should have a colon character `:` to denote the selection for each group. +--
The first group is for the class of the data type (item, recipe, entity-type, etc) +--
The second group is for the name of the data element, and is optional. If missing, all elements matching prior groups are returned. +--

For more granular selectors, see other modules, such as Recipe.select. +-- @usage Data.select('recipe') -- returns a table with all recipes +-- @usage Data.select('recipe:steel.*') -- returns a table with all recipes whose name matches 'steel.*' +-- @param pattern to search with +-- @return table containing the elements matching the selector pattern, or an empty table if there was no matches +function Data.select(pattern) + Core.fail_if_missing(pattern, "missing pattern argument") + + local parts = string.split(pattern, ":") + local category_pattern = table.first(parts) + local results = {} + for category, values in pairs(data.raw) do + if string.match(category, category_pattern) then + local element_pattern = #parts > 1 and parts[2] or '.*' + -- escape the '-' in names + element_pattern = string.gsub(element_pattern, "%-", "%%-") + for element_name, element in pairs(values) do + if string.match(element_name, element_pattern) then + table.insert(results, element) + end + end + end + end + setmetatable(results, Data._select_metatable.new(results)) + return results +end + +-- this metatable is set on recipes, to control access to ingredients and results +Data._select_metatable = {} +Data._select_metatable.new = function(selection) + local self = { } + self.__index = function(tbl, key) + if key == 'apply' then + return function(k, v) + table.each(tbl, function(obj) + obj[k] = v + end) + return tbl + end + end + end + self.__newindex = function(tbl, key, value) + table.each(tbl, function(obj) + obj[key] = value + end) + end + + return self +end diff --git a/space-exploration_0.5.58/space-exploration/stdlib/data/protohelpers.lua b/space-exploration_0.5.58/space-exploration/stdlib/data/protohelpers.lua new file mode 100644 index 0000000..57d94a9 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/data/protohelpers.lua @@ -0,0 +1,199 @@ +------------------------------------------------------------------------------- +--[[Helper Proto Functions]]-- +local Proto = {} + +--Quickly duplicate an existing prototype into a new one. +function Proto.dupli_proto( type, name1, name2, adaptMiningResult ) + if data.raw[type][name1] then + local proto = table.deepcopy(data.raw[type][name1]) + proto.name = name2 + if adaptMiningResult then + if proto.minable and proto.minable.result then proto.minable.result = name2 end + end + if proto.place_result then proto.place_result = name2 end + if proto.result then proto.result = name2 end + return(proto) + else + error("prototype unknown " .. name1 ) + return(nil) + end +end + +-------------------------------------------------------------------------------------- +--Prettier monolith extracting +function Proto.extract_monolith(filename, x, y, w, h) + return { + type = "monolith", + + top_monolith_border = 0, + right_monolith_border = 0, + bottom_monolith_border = 0, + left_monolith_border = 0, + + monolith_image = { + filename = filename, + priority = "extra-high-no-scale", + width = w, + height = h, + x = x, + y = y, + }, + } +end + +--Define pipe connection pipe pictures, not all entities use these. This function needs some work though. +Proto.pipes = function (pictures, shift_north, shift_south, shift_west, shift_east) + if pictures == "turret" then + shift_north = shift_north or {0, 0} + shift_south = shift_south or {0, 0} + shift_west = shift_west or {0, 0} + shift_east = shift_east or {0, 0} + + return { + north = + { + filename = "__base__/graphics/entity/pipe/pipe-straight-vertical.png", + priority = "extra-high", + width = 44, + height = 42, + shift = shift_north + }, + south = + { + filename = "__base__/graphics/entity/pipe/pipe-straight-vertical.png", + priority = "extra-high", + width = 44, + height = 42, + shift = shift_south + }, + west = + { + filename = "__base__/graphics/entity/pipe/pipe-straight-horizontal.png", + priority = "extra-high", + width = 32, + height = 42, + shift = shift_west + }, + east = + { + filename = "__base__/graphics/entity/pipe/pipe-straight-horizontal.png", + priority = "extra-high", + width = 32, + height = 42, + shift = shift_east + }, + } + else + shift_north = shift_north or {0, 0} + shift_south = shift_south or {0, 0} + shift_west = shift_west or {0, 0} + shift_east = shift_east or {0, 0} + return + { + north = + { + filename = "__base__/graphics/entity/assembling-machine-2/pipe-north.png", + priority = "extra-high", + width = 40, + height = 45, + shift = shift_north + }, + south = + { + filename = "__base__/graphics/entity/assembling-machine-2/pipe-south.png", + priority = "extra-high", + width = 40, + height = 45, + shift = shift_south + }, + west = + { + filename = "__base__/graphics/entity/assembling-machine-2/pipe-west.png", + priority = "extra-high", + width = 40, + height = 45, + shift = shift_west + }, + east = + { + filename = "__base__/graphics/entity/assembling-machine-2/pipe-east.png", + priority = "extra-high", + width = 40, + height = 45, + shift = shift_east + }, + } + end +end + +--Quick to use empty sprite +Proto.empty_sprite ={ + filename = "__core__/graphics/empty.png", + priority = "extra-high", + width = 1, + height = 1 +} + +--Quick to use empty animation +Proto.empty_animation = { + filename = Proto.empty_sprite.filename, + width = Proto.empty_sprite.width, + height = Proto.empty_sprite.height, + line_length = 1, + frame_count = 1, + shift = { 0, 0}, + animation_speed = 1, + direction_count=1 +} + +--return pipe covers for true directions. +Proto.pipe_covers = function(n, s, e, w) + if (n == nil and s == nil and e == nil and w == nil) then + n, s, e, w = true, true, true, true + end + if n == true then n = { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-north.png", + priority = "extra-high", + width = 44, + height = 32 + } + else + n = Proto.empty_sprite + end + if e == true then + e = { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-east.png", + priority = "extra-high", + width = 32, + height = 32 + } + else + e = Proto.empty_sprite + end + if s == true then + s = + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-south.png", + priority = "extra-high", + width = 46, + height = 52 + } + else + s = Proto.empty_sprite + end + if w == true then + w = + { + filename = "__base__/graphics/entity/pipe-covers/pipe-cover-west.png", + priority = "extra-high", + width = 32, + height = 32 + } + else + w = Proto.empty_sprite + end + + return {north = n, south = s, east = e, west = w} +end + +return Proto diff --git a/space-exploration_0.5.58/space-exploration/stdlib/data/recipe.lua b/space-exploration_0.5.58/space-exploration/stdlib/data/recipe.lua new file mode 100644 index 0000000..d88e409 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/data/recipe.lua @@ -0,0 +1,118 @@ +--- Recipe module +-- @module Recipe +-- luacheck: ignore item + +local Core = require 'stdlib/core' +local Data = require 'stdlib/data/data' + +local Recipe = {} + +--- Selects all recipe values where the key matches the selector pattern. +-- The selector pattern is divided into groups. The pattern should have a colon character `:` to denote the selection for each group. +--
The first group is for the name of the recipe element +--
The second group is for the name of keys inside of the recipe element, and is optional. If missing, all elements matching prior groups are returned. +--
The third group is for the name of values inside of the recipe element, and is optional. If missing, all elements matching prior groups are returned. +--

Selectors without a colon `:` separator are assumed to select all values in the first group. +-- @usage Recipe.select('.*') -- returns a table with all recipes, equivalent to Data.select('recipe:.*') +-- @usage Recipe.select('steel.*') -- returns a table with all recipes whose name matches 'steel.*' +-- @usage Recipe.select('steel.*:ingredients') -- returns a table with all ingredients from all recipes whose name matches 'steel.*' +-- @usage Recipe.select('steel.*:ingredients:iron-plate') -- returns a table with all iron-plate ingredient objects, from all recipes whose name matches 'steel.*' +-- @param pattern to search with +-- @return table containing the elements matching the selector pattern, or an empty table if there was no matches +function Recipe.select(pattern) + Core.fail_if_missing(pattern, "missing pattern argument") + + local results = {} + local parts = string.split(pattern, ":") + local inner_field_pattern = #parts > 1 and parts[2] or nil + + if inner_field_pattern then + -- Data.select --> { { recipe }, { recipe } } + for _, recipe in pairs(Data.select('recipe:' .. pattern)) do + for field_key, field_value in pairs(recipe) do + -- field_key --> ingredients, field_value --> { { 'copper-ore', 1} } + if string.match(field_key, inner_field_pattern) then + local contents_field_pattern = #parts > 2 and parts[3] or nil + if contents_field_pattern then + -- escape the '-' in names + contents_field_pattern = string.gsub(contents_field_pattern, "%-", "%%-") + + -- ex: field_value --> { { 'copper-ore', 1} } + for _, content_value in pairs(field_value) do + -- ex: content_value --> { 'copper-ore', 1} + for _, content in pairs(content_value) do + -- ex: content --> 'copper-ore', 1 + if string.match(content, contents_field_pattern) then + Recipe.format_items({recipe}) + table.insert(results, content_value) + end + end + end + else + for _, value in pairs(field_value) do + setmetatable(value, Recipe._item_metatable.new(value)) + table.insert(results, value) + end + end + end + end + end + else + return Recipe.format_items(Data.select('recipe:' .. pattern)) + end + setmetatable(results, Data._select_metatable.new(results)) + return results +end + +-- this metatable is set on recipes, to control access to ingredients and results +Recipe._item_metatable = {} +Recipe._item_metatable.new = function(item) + local self = { } + self.__index = function(tbl, key) + if type(key) == 'number' then + local keys = { 'name', 'amount' } + local val = rawget(tbl, keys[key]) + -- amount defaults to one + if not val and keys[key] == 'amount' then + return 1 + end + return val + elseif type(key) == 'string' then + local keys = { name = 1, amount = 2 } + local val = rawget(tbl, keys[key]) + -- amount defaults to one + if not val and key == 'amount' then + return 1 + end + return val + end + return rawget(tbl, key) + end + + self.__newindex = function(tbl, key, value) + if type(key) == 'number' and #tbl == 0 then + local keys = { 'name', 'amount' } + rawset(tbl, keys[key], value) + elseif type(key) == 'string' and #tbl > 0 then + local keys = { name = 1, amount = 2 } + rawset(tbl, keys[key], value) + else + return rawset(tbl, key, value) + end + end + + return self +end + +function Recipe.format_items(recipes) + recipes = recipes or data.raw.recipe + table.each(recipes, function(recipe) + if recipe.ingredients and type(recipe.ingredients) == 'table' then + table.each(recipe.ingredients, function(ingredient) setmetatable(ingredient, Recipe._item_metatable.new(ingredient)) end) + end + if recipe.results and type(recipe.results) == 'table' then + table.each(recipe.results, function(result) setmetatable(result, Recipe._item_metatable.new(result)) end) + end + end) + return recipes +end diff --git a/space-exploration_0.5.58/space-exploration/stdlib/debug/console.lua b/space-exploration_0.5.58/space-exploration/stdlib/debug/console.lua new file mode 100644 index 0000000..f486b07 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/debug/console.lua @@ -0,0 +1,63 @@ +local USE_FALLBACK_INTERFACE = false + +--Console Code from adil modified for use with STDlib +require("stdlib.gui.gui") + +local function create_gui_player(player) + if player.gui.left.console then player.gui.left.console.destroy() end + local c=player.gui.left.add{type='frame',name='console',direction='horizontal'} + local t = c.add{type='textfield',name='console_line'} + t.style.minimal_width=600 + t.style.maximal_width=600 + c.add{type='button', name='console_enter',caption='<', tooltip="Run Script"} + c.add{type='button', name='console_clear', caption='C', tooltip="Clear Input"} + c.add{type='button', name ='console_close', caption="X", tooltip="Close"} +end + +--console.create_gui = function(player) +local function create_gui(player) + --if not sent with a player, then enable for all players? + if not (player and player.valid) then + for _, cur_player in pairs(game.players) do + create_gui_player(cur_player) + end + else + create_gui_player(player) + end +end + +local function handler(event) + local i=event.element.player_index + local p=game.players[event.player_index] + --if second then second=false return end + local s=p.gui.left.console.console_line.text + assert(loadstring(s))() + game.write_file('console.log',s..'\n',true,i) +end +Gui.on_click("console_enter", handler) + +local function close(event) + local p = game.players[event.player_index] + p.gui.left.console.destroy() +end +Gui.on_click("console_close", close) + +local function clear(event) + local p = game.players[event.player_index] + p.gui.left.console.console_line.text = "" +end +Gui.on_click("console_clear", clear) + +--Fallback interface --- set USE_FALLBACK_INTERACE = true and +--just using a require("path.to.console") in your control will +--create the console interface, this interface is only recomended for local testing. +--If more then 1 mod adds it, the first mod to add it will be the enviorment used +if USE_FALLBACK_INTERFACE and not remote.interfaces.console then + remote.add_interface("console", {show = function(player) create_gui(player) end}) +end + +--return the create_gui function +--example usage: +--remote.add_interface("my_interface", {show=require("path.to.console")}) +--/c remote.call("my_interface", "show", game.player) +return create_gui diff --git a/space-exploration_0.5.58/space-exploration/stdlib/debug/debug.lua b/space-exploration_0.5.58/space-exploration/stdlib/debug/debug.lua new file mode 100644 index 0000000..070d32e --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/debug/debug.lua @@ -0,0 +1,27 @@ +--This is horrendous.. What was I thinking + +local function print_log(msg, level) + local fullname = MOD.fullname or MOD.name or "Error" + level = math.max(level or 0, ((global and global.config and global.config.loglevel) or MOD.config.control.loglevel or 0)) + if (level > 0) then + if (level >= 1) then + if type(msg) == "table" then + MOD.logfile.log(serpent.block(msg, {comment=false})) + else + MOD.logfile.log(tostring(msg)) + end + end + if (level >= 2) then + local message = fullname .. ": " .. serpent.line(msg, {comment = false}) + if game and game.players[1] then + game.print(message) + elseif global then + global._mess_queue = global._mess_queue or {} + local queue = global._mess_queue + queue[#queue+1] = message + end + end + end +end + +return print_log diff --git a/space-exploration_0.5.58/space-exploration/stdlib/debug/quickstart.lua b/space-exploration_0.5.58/space-exploration/stdlib/debug/quickstart.lua new file mode 100644 index 0000000..c67c3de --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/debug/quickstart.lua @@ -0,0 +1,79 @@ +--luacheck: no global +require("stdlib.event.event") +require("stdlib.config.config") + +local QS = Config.new(QS or (MOD and MOD.config and MOD.config.quickstart) or {}) + +if remote.interfaces["quickstart-script"] then + if game then game.print("Existing quickstart script - "..remote.call("quickstart-script", "creative_mode_quickstart_registered_to")) end + return remote.call("quickstart-script", "registered_to") +end +local qs_interface = {} +qs_interface.creative_mode_quickstart_registerd_to = function() + game.print(QS.get("mod_name", "not-set")) + return QS.get("mod_name", "not-set") +end +qs_interface.registered_to = function() + return (MOD and MOD.name) or QS.get("mod_name", "not-set") +end +remote.add_interface("quickstart-script", qs_interface) + +local Area=require("stdlib.area.area") +--local quickstart = {} +quickstart = {} +--quickstart.map = require("test") +function quickstart.on_player_created(event) + if #game.players == 1 then + local player = game.players[event.player_index] + + if QS.get("clear_items", false) then + player.clear_items_inside() + end + + local simple_stacks = QS.get("stacks", {}) + + for _, item in pairs(simple_stacks) do + if game.item_prototypes[item] then + player.insert(item) + end + end + + if QS.get("power_armor", true) then + --Put on power armor, install equipment + local inv = player.get_inventory(defines.inventory.player_armor) + inv.insert("power-armor-mk2") + local armor = inv[1].grid + armor.put{name="fusion-reactor-equipment"} + armor.put{name="personal-roboport-equipment"} + end + + local surface = player.surface + local area = QS.get("area_box", {{-100, -100}, {100, 100}}) + + if QS.get("disable_rso_starting", false) and remote.interfaces["RSO"] and remote.interfaces["RSO"]["disableStartingArea"] then + remote.call("RSO", "disableStartingArea") + end + if QS.get("disable_rso_chunk", false) and remote.interfaces["RSO"] and remote.interfaces["RSO"]["disableChunkHandler"] then + remote.call("RSO", "disableChunkHandler") + end + if QS.get("destroy_everything", true) then + for _, entity in pairs(surface.find_entities(area)) do + if entity.name ~= "player" then + entity.destroy() + end + end + end + + if QS.get("floor_tile", true) then + local tiles = {} + for x, y in Area.spiral_iterate(area) do + tiles[#tiles+1]={name=QS.get("floor_tile", "concrete"), position={x=x, y=y}} + end + surface.set_tiles(tiles, true) + --surface.set_tiles(quickstart.map, true) + end + end +end +Event.register(defines.events.on_player_created, quickstart.on_player_created) + +return quickstart diff --git a/space-exploration_0.5.58/space-exploration/stdlib/entity/entity.lua b/space-exploration_0.5.58/space-exploration/stdlib/entity/entity.lua new file mode 100644 index 0000000..17ceb0d --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/entity/entity.lua @@ -0,0 +1,154 @@ +--- Entity module +-- @module Entity + +local Core = require 'stdlib/core' +local Area = require 'stdlib/area/area' + +local Entity = {} + +--- Converts an entity and its selection_box to the area around it +-- @param entity to convert to an area +-- @return area that entity selection_box is valid for +function Entity.to_selection_area(entity) + Core.fail_if_missing(entity, "missing entity argument") + + local pos = entity.position + local bb = entity.prototype.selection_box + return Area.offset(bb, pos) +end + +--- Converts an entity and its collision_box to the area around it +-- @param entity to convert to an area +-- @return area that entity collision_box is valid for +function Entity.to_collision_area(entity) + Core.fail_if_missing(entity, "missing entity argument") + + local pos = entity.position + local bb = entity.prototype.collision_box + return Area.offset(bb, pos) +end + +--- Tests whether an entity has access to the field +-- @param entity to test field access +-- @param field_name that should be tested for +-- @return true if the entity has access to the field, false if the entity threw an exception accessing the field +function Entity.has(entity, field_name) + Core.fail_if_missing(entity, "missing entity argument") + Core.fail_if_missing(field_name, "missing field name argument") + + local status = pcall(function() return entity[field_name]; end) + return status +end + +--- Gets user data from the entity, stored in a mod's global data. +---

The data will persist between loads, and will be removed for an entity when it becomes invalid

+-- @param entity the entity to look up data for +-- @return the data, or nil if no data exists for the entity +function Entity.get_data(entity) + Core.fail_if_missing(entity, "missing entity argument") + if not global._entity_data then return nil end + + local unit_number = entity.unit_number + if unit_number then + return global._entity_data[unit_number] + else + local entity_name = entity.name + if not global._entity_data[entity_name] then return nil end + + local entity_category = global._entity_data[entity_name] + for _, entity_data in pairs(entity_category) do + if Entity._are_equal(entity_data.entity, entity) then + return entity_data.data + end + end + return nil + end +end + +--- Sets user data on the entity, stored in a mod's global data. +---

The data will persist between loads, and will be removed for an entity when it becomes invalid

+-- @param entity the entity to set data for +-- @param data the data to set, or nil to delete the data associated with the entity +-- @return the previous data associated with the entity, or nil if the entity had no previous data +function Entity.set_data(entity, data) + Core.fail_if_missing(entity, "missing entity argument") + + if not global._entity_data then global._entity_data = {} end + + local unit_number = entity.unit_number + if unit_number then + local prev = global._entity_data[unit_number] + global._entity_data[unit_number] = data + return prev + else + local entity_name = entity.name + if not global._entity_data[entity_name] then + global._entity_data[entity_name] = {} + end + + local entity_category = global._entity_data[entity_name] + + for i = #entity_category, 1, -1 do + local entity_data = entity_category[i] + if not entity_data.entity.valid then + table.remove(entity_category, i) + end + if Entity._are_equal(entity_data.entity, entity) then + local prev = entity_data.data + if data then + entity_data.data = data + else + table.remove(entity_category, i) + end + return prev + end + end + table.insert(entity_category, { entity = entity, data = data }) + end + return nil +end + +--- Freezes an entity, by making it inactive, inoperable, and non-rotatable, or unfreezes by doing the reverse. +-- @param entity the entity to freeze or unfreeze +-- @param mode (optional) if true, freezes the entity, if false, unfreezes the entity. If not specified, is true. +-- @return entity passed into it +function Entity.set_frozen(entity, mode) + Core.fail_if_missing(entity, "missing entity argument") + mode = mode == false and true or false + entity.active = mode + entity.operable = mode + entity.rotatable = mode + return entity +end + +--- Makes an entity indestructible, so that it can not be damaged or mined by the player or enemy factions +-- @param entity the entity to set indestructible +-- @param mode (optional) if true, makes the entity indestructible, if false, makes the entity destructable. If not specified, is true. +-- @return entity passed into it +function Entity.set_indestructible(entity, mode) + Core.fail_if_missing(entity, "missing entity argument") + mode = mode == false and true or false + entity.minable = mode + entity.destructible = mode + return entity +end + +--- Tests if two entities are equal +--

If they don't have reference equality and entity_a has an 'equals' function, +-- it will be called with entity_b as the first argument

+-- @tparam table entity_a +-- @tparam table entity_b +-- @treturn bool +function Entity._are_equal(entity_a, entity_b) + if entity_a == nil then + return entity_a == entity_b + elseif entity_a == entity_b then + return true + elseif Entity.has(entity_a, "equals") and entity_a.equals ~= nil then + return entity_a.equals(entity_b) + else + return false + end +end + +return Entity diff --git a/space-exploration_0.5.58/space-exploration/stdlib/entity/inventory.lua b/space-exploration_0.5.58/space-exploration/stdlib/entity/inventory.lua new file mode 100644 index 0000000..ea4bbbf --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/entity/inventory.lua @@ -0,0 +1,41 @@ +--- Inventory module +-- @module Inventory +-- luacheck: ignore cur_stack + +local Core = require 'stdlib/core' + +local Inventory = {} + +--- Copies an inventory contents to a destination inventory +-- Deprecated, refer to https://github.com/Afforess/Factorio-Stdlib/issues/66 for details. +-- @param src source inventory to copy from +-- @param dest destination inventory, to copy to +-- @return an array of SimpleItemStacks of left over items that could not be copied. +function Inventory.copy_inventory(src, dest) + Core.fail_if_missing(src, "missing source inventory") + Core.fail_if_missing(dest, "missing destination inventory") + + local left_over = {} + for i = 1, #src do + local stack = src[i] + if stack and stack.valid and stack.valid_for_read then + local copy_of_item_stack = { name = stack.name, count = stack.count, health = stack.health or nil, durability = stack.durability or nil } + -- allow valid/valid_for_read calls, without setting the real fields + setmetatable(copy_of_item_stack, { __index = { valid = true, valid_for_read = true }}) + + -- ammo is a special case field, accessing it on non-ammo itemstacks causes an exception + if stack.prototype.ammo_type then + copy_of_item_stack.ammo = stack.ammo or nil + end + + local inserted = dest.insert(copy_of_item_stack) + local amt_not_inserted = stack.count - inserted + if amt_not_inserted > 0 then + table.insert(left_over, cur_stack) + end + end + end + return left_over +end + +return Inventory diff --git a/space-exploration_0.5.58/space-exploration/stdlib/event/event.lua b/space-exploration_0.5.58/space-exploration/stdlib/event/event.lua new file mode 100644 index 0000000..d164bb7 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/event/event.lua @@ -0,0 +1,128 @@ +--- Event module +-- @module Event + +local Core = require 'stdlib/core' +local Game = require 'stdlib/game' + +Event = { + _registry = {}, + core_events = { + init = -1, + load = -2, + configuration_changed = -3, + _register = function(id) + if id == Event.core_events.init then + script.on_init( + function() + Event.dispatch({name = Event.core_events.init, tick = game.tick}) + end + ) + elseif id == Event.core_events.load then + script.on_load( + function() + Event.dispatch({name = Event.core_events.load, tick = -1}) + end + ) + elseif id == Event.core_events.configuration_changed then + script.on_configuration_changed( + function(data) + Event.dispatch({name = Event.core_events.configuration_changed, tick = game.tick, data = data}) + end + ) + end + end + } +} + +--- Registers a function for a given event +-- @param event or array containing events to register +-- @param handler Function to call when event is triggered +-- @return #Event +function Event.register(event, handler) + Core.fail_if_missing(event, "missing event argument") + + if type(event) == "number" then + event = {event} + end + + for _, event_id in pairs(event) do + Core.fail_if_missing(event_id, "missing event id") + if handler == nil then + Event._registry[event_id] = nil + script.on_event(event_id, nil) + else + if not Event._registry[event_id] then + Event._registry[event_id] = {} + + if event_id >= 0 then + script.on_event(event_id, Event.dispatch) + else + Event.core_events._register(event_id) + end + end + table.insert(Event._registry[event_id], handler) + end + end + return Event +end + +--- Calls the registerd handlers +-- @param event LuaEvent as created by game.raise_event +function Event.dispatch(event) + Core.fail_if_missing(event, "missing event argument") + if Event._registry[event.name] then + log(event.name .. "=" .. #Event._registry[event.name]) + for _, handler in pairs(Event._registry[event.name]) do + local metatbl = { __index = function(tbl, key) if key == '_handler' then return handler else return rawget(tbl, key) end end } + setmetatable(event, metatbl) + local success, err = pcall(handler, event) + if not success then + -- may be nil in on_load + if _G.game then + if Game.print_all(err) == 0 then + -- no players received the message, force a real error so someone notices + error(err) + end + else + -- no way to handle errors cleanly when the game is not up + error(err) + end + return + end + if err then + return + end + end + end +end + +--- Removes the handler from the event +-- @param event event or array containing events to remove the handler +-- @param handler to remove +-- @return #Event +function Event.remove(event, handler) + Core.fail_if_missing(event, "missing event argument") + Core.fail_if_missing(handler, "missing handler argument") + + if type(event) == "number" then + event = {event} + end + + for _, event_id in pairs(event) do + Core.fail_if_missing(event_id, "missing event id") + if Event._registry[event_id] then + for i=#Event._registry[event_id], 1, -1 do + if Event._registry[event_id][i] == handler then + table.remove(Event._registry[event_id], i) + end + end + if #Event._registry[event_id] == 0 then + Event._registry[event_id] = nil + script.on_event(event_id, nil) + end + end + end + return Event +end + +return Event diff --git a/space-exploration_0.5.58/space-exploration/stdlib/event/time.lua b/space-exploration_0.5.58/space-exploration/stdlib/event/time.lua new file mode 100644 index 0000000..e2f3f42 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/event/time.lua @@ -0,0 +1,76 @@ +--- Time Event module +-- @module Event.Time + +require 'stdlib/event/event' + +Event.Time = {} +--Event.Time._last_change = {} + +--All times are offset by 0.5 +--This is because both EvoGUI and MoWeather already apply that offset. +--Following the precedent to remain consistent. +--Actually, this little snippet is even borrowed from EvoGUI. +if remote.interfaces.MoWeather then + -- assume MoWeather's getdaytime is sane + function Event.Time.get_day_time(surface_name_or_index) return remote.call("MoWeather", "getdaytime", surface_name_or_index) end +else + -- 0.5 is midnight; let's make days *start* at midnight instead. + function Event.Time.get_day_time(surface_name_or_index) return game.surfaces[surface_name_or_index].daytime + 0.5 end +end + +--- @field Fires whenever it becomes midday/noon on a surface +Event.Time.midday = script.generate_event_name() +--- @field Fires whenever it becomes midnight on a surface +Event.Time.midnight = script.generate_event_name() +--- @field Fires whenever the sunrises on a surface +Event.Time.sunrise = script.generate_event_name() +--- @field Fires whenever the sunsets on a surface +Event.Time.sunset = script.generate_event_name() +--- @field Fires every hour for a surface +Event.Time.hourly = script.generate_event_name() +--- @field Fires every minute for a surface +Event.Time.minutely = script.generate_event_name() +--- @field Fires every day for a surface +Event.Time.daily = script.generate_event_name() + +Event.register(defines.events.on_tick, + function() + for idx, surface in pairs(game.surfaces) do + local day_time = math.fmod(Event.Time.get_day_time(idx), 1) + local day_time_minutes = math.floor(day_time * 24 * 60) + + global._last_time_change = global._last_time_change or {} + if day_time_minutes ~= global._last_time_change[idx] then + global._last_time_change[idx] = day_time_minutes + game.raise_event(Event.Time.minutely, {surface = surface}) + + if day_time_minutes % 60 == 0 then + game.raise_event(Event.Time.hourly, {surface = surface}) + end + + if day_time_minutes == 0 then + game.raise_event(Event.Time.daily, {surface = surface}) + game.raise_event(Event.Time.midnight, {surface = surface}) + end + + -- These are not 100% accurate but within 5-10 Nauvis minutes of the real thing. + -- 105 (1:45AM) Brightness starts to increase + -- 265 (4:25AM) Flashlight clicks off + if day_time_minutes == 265 then + game.raise_event(Event.Time.sunrise, {surface = surface}) + end + + if day_time_minutes == 720 then + game.raise_event(Event.Time.midday, {surface = surface}) + end + + -- These are not 100% accurate but within 5-10 Nauvis minutes of the real thing. + -- 1070 (5:50PM) Brightness starts to decrease + -- 1160 (7:20PM) Flashlight clicks on + if day_time_minutes == 1160 then + game.raise_event(Event.Time.sunset, {surface = surface}) + end + end + end + end +) diff --git a/space-exploration_0.5.58/space-exploration/stdlib/force.lua b/space-exploration_0.5.58/space-exploration/stdlib/force.lua new file mode 100644 index 0000000..9dd43c6 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/force.lua @@ -0,0 +1,46 @@ +------------------------------------------------------------------------------- +--[[Force]] +------------------------------------------------------------------------------- +require("stdlib/event/event") +local Force = {} + +function Force.get_object_and_data(name) + if game.forces[name] then + return game.forces[name], global.forces[name] + end +end + +function Force.new(force_name) + local obj = { + index = force_name, + } + return obj +end + +function Force.add_data_all(data) + local fdata = global.forces + table.each(fdata, function(v) table.merge(v, table.deepcopy(data)) end) +end + +function Force.init(event, overwrite) + global.forces = global.forces or {} + local fdata = global.forces or {} + if event and event.force.name then + if not fdata[event.force.name] or (fdata[event.force.name] and overwrite) then + fdata[event.force.name] = Force.new(event.force.name) + end + else + for name in pairs(game.forces) do + if not fdata[name] or (fdata[name] and overwrite) then + fdata[name] = Force.new(name) + end + end + end +end +Event.register(defines.events.on_force_created, function(event) Force.init(event.force.name) end) + +function Force.merge() +end +Event.register(defines.events.on_forces_merging, Force.merge) + +return Force diff --git a/space-exploration_0.5.58/space-exploration/stdlib/game.lua b/space-exploration_0.5.58/space-exploration/stdlib/game.lua new file mode 100644 index 0000000..bc3fa01 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/game.lua @@ -0,0 +1,67 @@ +--- Game module +-- @module Game + +local Game = {} + +Game.VALID_FILTER = function(v) + return v.valid +end + +--- Messages all players currently connected to the game +-- @param msg message to send to players +-- @param condition (optional) optional condition to be true for the player to be messaged +-- @return the number of players who received the message. Offline players are not counted as having received the message. +function Game.print_all(msg, condition) + local num = 0 + for _, player in pairs(game.players) do + if player.valid then + if condition == nil or select(2, pcall(condition, player)) then + player.print(msg) + if player.connected then + num = num + 1 + end + end + end + end + return num +end + +--- Messages all players with the given force connected to the game +-- Deprecated for Factorio 0.14+, see force.print(msg) instead. +-- @param force (may be force name string, or force object) the players with the given force to message +-- @param msg message to send to players +-- @return the number of players who received the message +function Game.print_force(force, msg) + local force_name + if type(force) == "string" then + force_name = force + else + force_name = force.name + end + return Game.print_all(msg, + function(player) + return player.force.name == force_name + end + ) +end + +--- Messages all players with the given surface connected to the game +-- Deprecated for Factorio 0.14+, see surface.print(msg) instead. +-- @param surface the players with the given surface to message +-- @param msg message to send to players +-- @return the number of players who received the message +function Game.print_surface(surface, msg) + local surface_name + if type(surface) == "string" then + surface_name = surface + else + surface_name = surface.name + end + return Game.print_all(msg, + function(player) + return player.surface.name == surface_name + end + ) +end + +return Game diff --git a/space-exploration_0.5.58/space-exploration/stdlib/gui/gui.lua b/space-exploration_0.5.58/space-exploration/stdlib/gui/gui.lua new file mode 100644 index 0000000..a6deda9 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/gui/gui.lua @@ -0,0 +1,144 @@ +--- Gui module +-- @module Gui + +require 'stdlib/event/event' +local Core = require 'stdlib/core' + +Gui = {} +-- Factorio's gui events are so monolithic we need a special event system for it. +Gui.Event = { + _registry = {}, + _dispatch = {} +} + +--- Registers a function for a given event and matching gui element pattern +-- @param event Valid values are defines.event.on_gui_* +-- @param gui_element_pattern the name or string regular expression to match the gui element +-- @param handler Function to call when event is triggered +-- @return #Gui.Event +function Gui.Event.register(event, gui_element_pattern, handler) + Core.fail_if_missing(event, "missing event name argument") + Core.fail_if_missing(gui_element_pattern, "missing gui name or pattern argument") + + if type(gui_element_pattern) ~= "string" then + error("gui_element_pattern argument must be a string") + end + + if handler == nil then + Gui.Event.remove(event, gui_element_pattern) + return Gui.Event + end + + if not Gui.Event._registry[event] then + Gui.Event._registry[event] = {} + end + Gui.Event._registry[event][gui_element_pattern] = handler + + -- Use custom Gui event dispatcher to pass off the event to the correct sub-handler + if not Gui.Event._dispatch[event] then + Event.register(event, Gui.Event.dispatch) + Gui.Event._dispatch[event] = true + end + + return Gui.Event +end + +--- Calls the registered handlers +-- @param event LuaEvent as created by game.raise_event +function Gui.Event.dispatch(event) + Core.fail_if_missing(event, "missing event argument") + + local gui_element = event.element + if gui_element and gui_element.valid then + local gui_element_name = gui_element.name; + local gui_element_state = nil; + local gui_element_text = nil; + + if event.name == defines.events.on_gui_checked_state_changed then + gui_element_state = gui_element.state + end + + if event.name == defines.events.on_gui_text_changed then + gui_element_text = gui_element.text + end + + for gui_element_pattern, handler in pairs(Gui.Event._registry[event.name]) do + local match_str = string.match(gui_element_name, gui_element_pattern) + if match_str ~= nil then + local new_event = { + tick = event.tick, + name = event.name, + _handler = handler, + match = match_str, + element = gui_element, + state = gui_element_state, + text = gui_element_text, + player_index = event.player_index , + _event = event + } + local success, err = pcall(handler, new_event) + if not success then + game.print(err) + end + end + end + end +end + +--- Removes the handler with matching gui element pattern from the event +-- @param event Valid values are defines.event.on_gui_* +-- @param gui_element_pattern the name or string regular expression to remove the handler for +-- @return #Gui.Event +function Gui.Event.remove(event, gui_element_pattern) + Core.fail_if_missing(event, "missing event argument") + Core.fail_if_missing(gui_element_pattern, "missing gui_element_pattern argument") + + if type(gui_element_pattern) ~= "string" then + error("gui_element_pattern argument must be a string") + end + + local function tablelength(T) + local count = 0 + for _ in pairs(T) do count = count + 1 end + return count + end + + if Gui.Event._registry[event] then + if Gui.Event._registry[event][gui_element_pattern] then + Gui.Event._registry[event][gui_element_pattern] = nil + end + if tablelength(Gui.Event._registry[event]) == 0 then + Event.remove(event, Gui.Event.dispatch) + Gui.Event._registry[event] = nil + Gui.Event._dispatch[event] = false + end + end + return Gui.Event +end + +--- Registers a function for a given gui element name or pattern when the element is clicked +-- @param gui_element_pattern the name or string regular expression to match the gui element +-- @param handler Function to call when gui element is clicked +-- @return #Gui +function Gui.on_click(gui_element_pattern, handler) + Gui.Event.register(defines.events.on_gui_click, gui_element_pattern, handler) + return Gui +end + +--- Registers a function for a given gui element name or pattern when the element checked state changes +-- @param gui_element_pattern the name or string regular expression to match the gui element +-- @param handler Function to call when gui element checked state changes +-- @return #Gui +function Gui.on_checked_state_changed(gui_element_pattern, handler) + Gui.Event.register(defines.events.on_gui_checked_state_changed, gui_element_pattern, handler) + return Gui +end + +--- Registers a function for a given gui element name or pattern when the element text changes +-- @param gui_element_pattern the name or string regular expression to match the gui element +-- @param handler Function to call when gui element text changes +-- @return #Gui +function Gui.on_text_changed(gui_element_pattern, handler) + Gui.Event.register(defines.events.on_gui_text_changed, gui_element_pattern, handler) + return Gui +end diff --git a/space-exploration_0.5.58/space-exploration/stdlib/log/logger.lua b/space-exploration_0.5.58/space-exploration/stdlib/log/logger.lua new file mode 100644 index 0000000..2ec988d --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/log/logger.lua @@ -0,0 +1,100 @@ +--- Logger module +-- @module Logger + +Logger = {} + +--- Creates a new logger object.

+-- In debug mode, the logger writes immediately. Otherwise the loggers buffers lines. +-- The logger flushes after 60 seconds has elapsed since the last message. +--

+-- When loggers are created, a table of options may be specified. The valid options are: +-- +-- log_ticks -- whether to include the game tick timestamp in logs. Defaults to false. +-- file_extension -- a string that overides the default 'log' file extension. +-- force_append -- each time a logger is created, it will always append, instead of +-- -- the default behavior, which is to write out a new file, then append +-- +-- +-- @usage +--LOGGER = Logger.new('cool_mod_name') +--LOGGER.log("this msg will be logged!") +-- +-- @usage +--LOGGER = Logger.new('cool_mod_name', 'test', true) +--LOGGER.log("this msg will be logged and written immediately in test.log!") +-- +-- @usage +--LOGGER = Logger.new('cool_mod_name', 'test', true, { file_extension = data }) +--LOGGER.log("this msg will be logged and written immediately in test.data!") +-- +-- @param mod_name [required] the name of the mod to create the logger for +-- @param log_name (optional, default: 'main') the name of the logger +-- @param debug_mode (optional, default: false) toggles the debug state of logger. +-- @param options (optional) table with optional arguments +-- @return the logger instance +function Logger.new(mod_name, log_name, debug_mode, options) + if not mod_name then + error("Logger must be given a mod_name as the first argument") + end + if not log_name then + log_name = "main" + end + if not options then + options = {} + end + local Logger = {mod_name = mod_name, log_name = log_name, debug_mode = debug_mode, buffer = {}, last_written = 0, ever_written = false} + + --- Logger options + Logger.options = { + log_ticks = options.log_ticks or false, -- whether to add the ticks in the timestamp, default false + file_extension = options.file_extension or 'log', -- extension of the file, default: log + force_append = options.force_append or false, -- append the file on first write, default: false + } + Logger.file_name = 'logs/' .. Logger.mod_name .. '/' .. Logger.log_name .. '.' .. Logger.options.file_extension + Logger.ever_written = Logger.options.force_append + + --- Logs a message + -- @param msg a string, the message to log + -- @return true if the message was written, false if it was queued for a later write + function Logger.log(msg) + local format = string.format + if _G.game then + local tick = game.tick + local floor = math.floor + local time_s = floor(tick/60) + local time_minutes = floor(time_s/60) + local time_hours = floor(time_minutes/60) + + if Logger.options.log_ticks then + table.insert(Logger.buffer, format("%02d:%02d:%02d.%02d: %s\n", time_hours, time_minutes % 60, time_s % 60, tick - time_s*60, msg)) + else + table.insert(Logger.buffer, format("%02d:%02d:%02d: %s\n", time_hours, time_minutes % 60, time_s % 60, msg)) + end + + -- write the log every minute + if (Logger.debug_mode or (tick - Logger.last_written) > 3600) then + return Logger.write() + end + else + table.insert(Logger.buffer, format("00:00:00: %s\n", msg)) + end + return false + end + + --- Writes out all buffered messages immediately + -- @return true if there any messages were written, false if not + function Logger.write() + if _G.game then + Logger.last_written = game.tick + game.write_file(Logger.file_name, table.concat(Logger.buffer), Logger.ever_written) + Logger.buffer = {} + Logger.ever_written = true + return true + end + return false + end + + return Logger +end + +return Logger diff --git a/space-exploration_0.5.58/space-exploration/stdlib/player.lua b/space-exploration_0.5.58/space-exploration/stdlib/player.lua new file mode 100644 index 0000000..6305014 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/player.lua @@ -0,0 +1,50 @@ +------------------------------------------------------------------------------- +--[[Player]] +------------------------------------------------------------------------------- +require("stdlib/event/event") +local Player = {} + +function Player.get_object_and_data(index) + if game.players[index] then + return game.players[index], global.players[index] + end +end + +function Player.new(player_index) + local obj = { + index = player_index, + name = game.players[player_index].name, + } + return obj +end + +function Player.add_data_all(data) + local pdata = global.players + table.each(pdata, function(v) table.merge(v, table.deepcopy(data)) end) +end + +function Player.init(event, overwrite) + global.players = global.players or {} + local pdata = global.players or {} + if event and event.player_index then + if not game.players[event.player_index] then error("Invalid Player") end + if not pdata[event.player_index] or (pdata[event.player_index] and overwrite) then + pdata[event.player_index] = Player.new(event.player_index) + end + else + for index in pairs(game.players) do + if not pdata[index] or (pdata[index] and overwrite) then + pdata[index] = Player.new(index) + end + end + end + if global._mess_queue then + for _, msg in pairs(global._mess_queue) do + game.print(msg) + end + end + global._mess_queue = nil +end +Event.register(defines.events.on_player_created, Player.init) + +return Player diff --git a/space-exploration_0.5.58/space-exploration/stdlib/string.lua b/space-exploration_0.5.58/space-exploration/stdlib/string.lua new file mode 100644 index 0000000..3e05ec8 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/string.lua @@ -0,0 +1,80 @@ +--- String module +-- @module string + +--- Returns a copy of the string with any leading or trailing whitespace from the string removed. +-- @param s the string to remove leading or trailing whitespace from +-- @return a copy of the string without leading or trailing whitespace +function string.trim(s) + return (s:gsub("^%s*(.-)%s*$", "%1")) +end + +--- Tests if a string starts with a given substring +-- @param s the string to check for the start substring +-- @param start the substring to test for +-- @return true if the start substring was found in the string +function string.starts_with(s, start) + return string.find(s, start, 1, true) == 1 +end + +--- Tests if a string ends with a given substring +-- @param s the string to check for the end substring +-- @param ends the substring to test for +-- @return true if the end substring was found in the string +function string.ends_with(s, ends) + return #s >= #ends and string.find(s, ends, #s - #ends + 1, true) and true or false +end + +--- Tests if a string contains a given substring +-- @param s the string to check for the substring +-- @param ends the substring to test for +-- @return true if the substring was found in the string +function string.contains(s, ends) + return s and string.find(s, ends) ~= nil +end + +--- Tests whether a string is empty +-- @param s the string to test +function string.is_empty(s) + return s == nil or s == '' +end + +--- Splits a string into a table +--

+-- Note: Empty split substrings are not included in the resulting table. +-- For example, string.split('foo.bar...', '.', false) results in the table {'foo', 'bar'} +-- @param s the string to split +-- @param sep (optional) the separator to use. The period character, `.`, is the default separator. +-- @param pattern whether to interpret the separator as a lua pattern or plaintext for the string split +-- @return the table +function string.split(s, sep, pattern) + sep = sep or "." + sep = sep ~= "" and sep or "." + sep = not pattern and string.gsub(sep, "([^%w])", "%%%1") or sep + + local fields = {} + local start_idx, end_idx = string.find(s, sep) + local last_find = 1 + while start_idx do + local substr = string.sub(s, last_find, start_idx - 1) + if string.len(substr) > 0 then + table.insert(fields, string.sub(s, last_find, start_idx - 1)) + end + last_find = end_idx + 1 + start_idx, end_idx = string.find(s, sep, end_idx + 1) + end + local substr = string.sub(s, last_find) + if string.len(substr) > 0 then + table.insert(fields, string.sub(s, last_find)) + end + return fields +end + +function string.PrettyNumber( number ) + if number < 1000 then + return string.format("%i", number) + elseif number < 1000000 then + return string.format("%.1fk", (number/1000)) + else + return string.format("%.1fm", (number/1000000)) + end +end diff --git a/space-exploration_0.5.58/space-exploration/stdlib/surface.lua b/space-exploration_0.5.58/space-exploration/stdlib/surface.lua new file mode 100644 index 0000000..67c221a --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/surface.lua @@ -0,0 +1,102 @@ +--- Surface module +-- @module Surface + +local Core = require 'stdlib/core' +local Area = require 'stdlib/area/area' + +local Surface = {} + +--- Flexible, safe lookup function for surfaces.

+-- May be given a string, the name of a surface, or may be given a table with surface names, +-- may be given the a surface object, or may be given a table of surface objects, or +-- may be given nil.

+-- Returns an array of surface objects of all valid, existing surfaces +-- If a surface does not exist for the surface, it is ignored, if no surfaces +-- are given, an empty array is returned. +-- @param surface to lookup +-- @treturn LuaSurface[] the list of surfaces looked up +function Surface.lookup(surface) + if not surface then + return {} + end + if type(surface) == 'string' then + if game.surfaces[surface] then + return {game.surfaces[surface]} + end + return {} + end + local result = {} + for _, surface_item in pairs(surface) do + if type(surface_item) == 'string' then + if game.surfaces[surface_item] then + table.insert(result, game.surfaces[surface_item]) + end + elseif type(surface_item) == 'table' and surface_item['__self'] then + table.insert(result, surface_item) + end + end + return result +end + +--- Given search criteria, a table that contains a name or type of entity to search for, +-- and optionally surface or force, searches all loaded chunks for the entities that +-- match the critera. +-- @usage +----Surface.find_all_entities({ type = 'unit', surface = 'nauvis', area = {{-1000,20},{-153,2214}}) --returns a list containing all unit entities on the nauvis surface in the given area +-- @tparam table search_criteria a table of criteria. Must contain either the *name* or *type* or *force* of an entity. May contain *surface* or *force* or *area*. +-- @treturn table an array of all entities that matched the criteria +function Surface.find_all_entities(search_criteria) + Core.fail_if_missing(search_criteria, "missing search_criteria argument") + if search_criteria.name == nil and search_criteria.type == nil and search_criteria.force == nil and search_criteria.area == nil then + error("Missing search criteria field: name or type or force or area of entity", 2) + end + + local surface_list = Surface.lookup(search_criteria.surface) + if search_criteria.surface == nil then + surface_list = game.surfaces + end + + local result = {} + + for _, surface in pairs(surface_list) do + local entities = surface.find_entities_filtered( + { + area = search_criteria.area, + name = search_criteria.name, + type = search_criteria.type, + force = search_criteria.force + }) + for _, entity in pairs(entities) do + table.insert(result, entity) + end + end + + return result +end + +--- determine surface extension +-- returns Area covering entire extension of this surface +-- useful, if you compare total number of chunks with number of chunks of this area +-- @tparam LuaSurface surface +-- @treturn table Area +function Surface.get_surface_bounds(surface) + Core.fail_if_missing(surface, "missing surface value") + local x1, y1, x2, y2 = 0, 0, 0, 0 + + for chunk in surface.get_chunks() do + if chunk.x < x1 then + x1 = chunk.x + elseif chunk.x > x2 then + x2 = chunk.x + end + if chunk.y < y1 then + y1 = chunk.y + elseif chunk.y > y2 then + y2 = chunk.y + end + end + + return Area.construct(x1*32, y1*32, x2*32, y2*32) +end + +return Surface diff --git a/space-exploration_0.5.58/space-exploration/stdlib/table.lua b/space-exploration_0.5.58/space-exploration/stdlib/table.lua new file mode 100644 index 0000000..9040b29 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/table.lua @@ -0,0 +1,312 @@ +--- Table module +-- @module table +-- luacheck: ignore 432 + +--- Given a mapping function, creates a transformed copy of the table +--- by calling the function for each element in the table, and using +--- the result as the new value for the key. Passes the index as second argument to the function. +--- @usage a= { 1, 2, 3, 4, 5} +---table.map(a, function(v) return v * 10 end) --produces: { 10, 20, 30, 40, 50 } +--- @usage a = {1, 2, 3, 4, 5} +---table.map(a, function(v, k, x) return v * k + x end, 100) --produces { 101, 104, 109, 116, 125} +-- @param tbl to be mapped to the transform +-- @param func to transform values +-- @param[opt] ... additional arguments passed to the function +-- @return a new table containing the keys and mapped values +function table.map(tbl, func, ...) + local newtbl = {} + for i, v in pairs(tbl) do + newtbl[i] = func(v, i, ...) + end + return newtbl +end + +--- Given a filter function, creates a filtered copy of the table +--- by calling the function for each element in the table, and +--- filtering out any key-value pairs for non-true results. Passes the index as second argument to the function. +--- @usage a= { 1, 2, 3, 4, 5} +---table.filter(a, function(v) return v % 2 == 0 end) --produces: { 2, 4 } +--- @usage a = {1, 2, 3, 4, 5} +---table.filter(a, function(v, k, x) return k % 2 == 1 end) --produces: { 1, 3, 5 } +-- @param tbl to be filtered +-- @param func to filter values +-- @param[opt] ... additional arguments passed to the function +-- @return a new table containing the filtered key-value pairs +function table.filter(tbl, func, ...) + local newtbl = {} + local insert = #tbl > 0 + for k, v in pairs(tbl) do + if func(v, k, ...) then + if insert then table.insert(newtbl, v) + else newtbl[k] = v end + end + end + return newtbl +end + +--- Given a candidate search function, iterates over the table, calling the function +--- for each element in the table, and returns the first element the search function returned true. +--- Passes the index as second argument to the function. +--- @usage a= { 1, 2, 3, 4, 5} +---table.find(a, function(v) return v % 2 == 0 end) --produces: 2 +--- @usage a = {1, 2, 3, 4, 5} +---table.find(a, function(v, k, x) return k % 2 == 1 end) --produces: 1 +-- @param tbl to be searched +-- @param func to use to search for any matching element +-- @param[opt] ... additional arguments passed to the function +-- @return the first found value, or nil if none was found +function table.find(tbl, func, ...) + for k, v in pairs(tbl) do + if func(v, k, ...) then + return v, k + end + end + return nil +end + +--- Given a candidate search function, iterates over the table, calling the function +--- for each element in the table, and returns true if search function returned true. +--- Passes the index as second argument to the function. +---
See also: table.find(...) +--- @usage a= { 1, 2, 3, 4, 5} +---table.any(a, function(v) return v % 2 == 0 end) --produces: true +--- @usage a = {1, 2, 3, 4, 5} +---table.any(a, function(v, k, x) return k % 2 == 1 end) --produces: true +-- @param tbl to be searched +-- @param func to use to search for any matching element +-- @param[opt] ... additional arguments passed to the function +-- @return true if an element was found, false if none was found +function table.any(tbl, func, ...) + return table.find(tbl, func, ...) ~= nil +end + +--- Given a function, apply it to each element in the table. Passes the index as second argument to the function. +--

Iteration is aborted if the applied function returns true for any element during iteration. +-- @param tbl to be iterated +-- @param func to apply to values +-- @param[opt] ... additional arguments passed to the function +-- @return the given table +function table.each(tbl, func, ...) + for k, v in pairs(tbl) do + if func(v, k, ...) then + break + end + end + return tbl +end + +--- Returns a new table that is a one-dimensional flattening of this array (recursively). +-- For every element that is an table, extract its elements into the new array. +-- The optional level argument determines the level of recursion to flatten. +--

Note: does not flatten associative elements, only arrays +-- @param tbl to be flattened +-- @param level (optional) recursive levels, or no limit to recursion if not supplied +-- @return a new table that represents the flattened contents of the given table +function table.flatten(tbl, level) + local flattened = {} + table.each(tbl, function(value) + if type(value) == "table" and #value > 0 then + if level then + if level > 0 then + table.merge(flattened, table.flatten(value, level - 1), true) + else + table.insert(flattened, value) + end + else + table.merge(flattened, table.flatten(value), true) + end + else + table.insert(flattened, value) + end + end) + return flattened +end + +--- Given an array, returns the first element or nil if no element exists +-- @param tbl the array +-- @return the first element +function table.first(tbl) + return tbl[1] +end + +--- Given an array, returns the last element or nil if no elements exist +-- @param tbl the array +-- @return the last element +function table.last(tbl) + local size = #tbl + if size == 0 then return nil end + return tbl[size] +end + +--- Given an array of only numeric values, returns the minimum or nil if no element exists +-- @param tbl the array +-- @return the minimum value +function table.min(tbl) + if #tbl == 0 then return nil end + + local min = tbl[1] + for _, num in pairs(tbl) do + min = num < min and num or min + end + return min +end + +--- Given an array of only numeric values, returns the maximum or nil if no element exists +-- @param tbl the array +-- @return the maximum value +function table.max(tbl) + if #tbl == 0 then return nil end + + local max = tbl[1] + for _, num in pairs(tbl) do + max = num > max and num or max + end + return max +end + +--- Given an array of only numeric values, return the sum of all values, or 0 for empty arrays +-- @param tbl the array +-- @return the sum +function table.sum(tbl) + local sum = 0 + for _, num in pairs(tbl) do + sum = sum + num + end + return sum +end + +--- Given an array of only numeric values, returns the average or nil if no element exists +-- @param tbl the array +-- @return the average value +function table.avg(tbl) + local cnt = #tbl + return cnt ~= 0 and table.sum(tbl) / cnt or nil +end + +--- Merges 2 tables, values from first get overwritten by second +--- @usage function some_func(x, y, args) +-- args = table.merge({option1=false}, args) +-- if opts.option1 == true then return x else return y end +-- end +-- some_func(1,2) --returns 2 +-- some_func(1,2,{option1=true}) --returns 1 +-- @param tblA first table +-- @param tblB second table +-- @param array_merge (optional: false) whether to merge the tables as arrays, or associatively +-- @return tblA with merged values from tblB +function table.merge(tblA, tblB, array_merge) + if not tblB then + return tblA + end + if array_merge then + for _, v in pairs(tblB) do + table.insert(tblA, v) + end + + else + for k, v in pairs(tblB) do + tblA[k] = v + end + end + return tblA +end + +-- copied from factorio/data/core/luablib/util.lua + +--- Creates a deep copy of table, not coyping Factorio objects +-- @param object the table to copy +-- @return a copy of the table +function table.deepcopy(object) + local lookup_table = {} + local function _copy(object) + if type(object) ~= "table" then + return object + elseif object.__self then + return object + elseif lookup_table[object] then + return lookup_table[object] + end + local new_table = {} + lookup_table[object] = new_table + for index, value in pairs(object) do + new_table[_copy(index)] = _copy(value) + end + return setmetatable(new_table, getmetatable(object)) + end + return _copy(object) +end + +--- Returns a copy of all of the values in the table +-- @param tbl the table to copy the keys from, or an empty table if the tbl is nil +-- @param sorted (optional) whether to sort the keys (slower) or keep the random order from pairs() +-- @param as_string (optional) whether to try and parse the values as strings, or leave them as their existing type +-- @return an array with a copy of all the values in the table +function table.values(tbl,sorted,as_string) + if not tbl then return {} end + local valueset = {} + local n = 0 + if as_string == true then --checking as_string /before/ looping is faster + for _,v in pairs(tbl) do n = n+1 ; valueset[n] = tostring(v) end + else + for _,v in pairs(tbl) do n = n+1 ; valueset[n] = v end + end + if sorted == true then + table.sort(valueset, function(x,y) --sorts tables with mixed index types. + local tx = type(x) == 'number' + local ty = type(y) == 'number' + if tx == ty then + return x < y and true or false --similar type can be compared + elseif tx == true then + return true --only x is a number and goes first + else + return false --only y is a number and goes first + end + end) + end + return valueset +end + +--- Returns a copy of all of the keys in the table +-- @param tbl the table to copy the keys from, or an empty table if the tbl is nil +-- @param sorted (optional) whether to sort the keys (slower) or keep the random order from pairs() +-- @param as_string (optional) whether to try and parse the keys as strings, or leave them as their existing type +-- @return an array with a copy of all the keys in the table +function table.keys(tbl,sorted,as_string) + if not tbl then return {} end + local keyset = {} + local n = 0 + if as_string == true then --checking as_string /before/ looping is faster + for k,_ in pairs(tbl) do n = n+1 ; keyset[n] = tostring(k) end + else + for k,_ in pairs(tbl) do n = n+1 ; keyset[n] = k end + end + if sorted == true then + table.sort(keyset, function(x,y) --sorts tables with mixed index types. + local tx = type(x) == 'number' + local ty = type(y) == 'number' + if tx == ty then + return x < y and true or false --similar type can be compared + elseif tx == true then + return true --only x is a number and goes first + else + return false --only y is a number and goes first + end + end) + end + return keyset +end + +--- Removes keys from a table (sets them to nil) +-- @usage local a = {1, 2, 3, 4} +--table.remove_keys(a, {1,3} --returns {nil, 2, nil, 4} +-- @usage local b = {k1 = 1, k2 = 'foo', old_key = 'bar'} +--table.remove_keys(b, {'old_key'}) --returns {k1 = 1, k2 = 'foo'} +-- @param tbl the table to remove the keys from +-- @param keys array with the keys to remove +-- @return tbl without the specified keys +function table.remove_keys(tbl, keys) + for i=1, #keys do + tbl[keys[i]] = nil + end + return tbl +end diff --git a/space-exploration_0.5.58/space-exploration/stdlib/time.lua b/space-exploration_0.5.58/space-exploration/stdlib/time.lua new file mode 100644 index 0000000..8f12716 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/time.lua @@ -0,0 +1,31 @@ +--- Time module +-- @module Time + +local Time = {} + +--- @field the number of factorio ticks in a second +Time.SECOND = 60 + +--- @field the number of factorio ticks in a minute +Time.MINUTE = Time.SECOND * 60 + +--- @field the number of factorio ticks in an hour +Time.HOUR = Time.MINUTE * 60 + +--- @field the number of factorio ticks in a day +Time.DAY = Time.MINUTE * 60 + +--- @field the number of factorio ticks in a week +Time.WEEK = Time.DAY * 7 + +function Time.FormatTicksToTime( ticks ) + local seconds = ticks / 60 + local minutes = seconds / 60 + local hours = minutes / 60 + return string.format("%02d:%02d:%02d", + math.floor(hours + 0.5), + math.floor(minutes + 0.5) % 60, + math.floor(seconds + 0.5) % 60) +end + +return Time diff --git a/space-exploration_0.5.58/space-exploration/stdlib/trains/trains.lua b/space-exploration_0.5.58/space-exploration/stdlib/trains/trains.lua new file mode 100644 index 0000000..5003992 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/trains/trains.lua @@ -0,0 +1,228 @@ +--- Trains module +--

+-- @module Trains + +-- Event registration is performed at the bottom of this file, +-- once all other functions have been defined + +require 'stdlib/event/event' +require 'stdlib/table' +local Surface = require 'stdlib/surface' +local Entity = require 'stdlib/entity/entity' + +local Trains = {} +--- This event is fired when a train's id has changed. +--

Train id's are dervied from a property of the train's main locomotive. +-- That means when locomotives are attached/detached from carriages or other +-- locomotives, the locomotive considered the main one can change, leading to a changed +-- in train id.

+--

For example: a train with a front and back locomotive will get its id +-- from the front locomotive. If that is disconnected, the back locomotive will become +-- the main one and the train's id will change

+--

+-- Event parameters
+-- A table with the following properties: +--

    +--
  • old_id (int) The id of the train before the change
  • +--
  • new_id (int) The id of the train after the change
  • +--
+--

+-- @usage +----Event.register(Trains.on_train_id_changed, my_handler) +Trains.on_train_id_changed = script.generate_event_name() + +-- Finds the distinct trains from an array of locomotive entities +-- @tparam LuaEntity[] locomotives +-- @return List of train details tables for the distinct trains +local function find_distinct_trains(locomotives) + local train_data = {} + for _, engine in pairs(locomotives) do + local t = engine.train + local id = Trains.get_train_id(t) + + local equals_id = function(x) + return x.id == id + end + + local existing = table.filter(train_data, equals_id) + + if #existing == 0 then + table.insert(train_data, { + train = t, + id = id + }) + end + end + + return train_data +end + +--- Given search criteria (a table that contains at least a surface_name) +-- searches the given surface for trains that match the criteria +-- @usage +----Trains.find_filtered({ surface_name = "nauvis", state = defines.train_state.wait_station }) +-- @tparam Table criteria Table with any keys supported by the Surface module.

+--

If the name key isn't supplied, this will default to 'diesel-locomotive'

+--

If the surface key isn't supplied, this will default to 1

+-- @return A list of train details tables, if any are found matching the criteria. Otherwise the empty list.
train (LuaTrain)The LuaTrain instance +--
id (int)The id of the train
+function Trains.find_filtered(criteria) + criteria = criteria or {} + + -- Ensuure surface is set + criteria.surface = criteria.surface or 'nauvis' + + -- Make sure 'locomotive' is specified as the type by default + criteria.type = criteria.type or 'locomotive' + + -- Get locomotives by filter + local locomotives = Surface.find_all_entities(criteria) + + -- Distinguish trains + local train_data = find_distinct_trains(locomotives) + + --- Apply state filters + if criteria.state then + train_data = table.filter(train_data, function(data) + return data.train.state == criteria.state + end) + end + + return train_data +end + +--- Find the id of a LuaTrain instance +-- @tparam LuaTrain train +-- @treturn int +function Trains.get_train_id(train) + local loco = Trains.get_main_locomotive(train) + return loco and loco.unit_number +end + +--- Event fired when some change has happened to a locomotive +-- @return void +function Trains._on_locomotive_changed() + -- For all the known trains + local renames = {} + for id, train in pairs(global._registry) do + -- Check if their known ID is the same as the LuaTrain's dervied id + local derived_id = Trains.get_train_id(train) + -- If it's not + if (id ~= derived_id) then + -- Capture the rename + table.insert(renames, {old_id = id , new_id = derived_id, train = train }) + end + end + + -- Go over the captured renaming operations + for _, renaming in pairs(renames) do + -- Rename it in the registry + -- and dispatch a renamed event + global._registry[renaming.new_id] = renaming.train + table.remove_keys(global._registry, {renaming.old_id}) + + local event_data = { + old_id = renaming.old_id, + new_id = renaming.new_id, + name = Trains.on_train_id_changed + } + Event.dispatch(event_data) + end +end +--- Event fired when a new locomotive has been created +-- @tparam LuaEntity new_locomotive The new entity +-- @return void +function Trains._on_locomotive_created(new_locomotive) + local train_id = Trains.get_train_id(new_locomotive.train) + if (global._registry[train_id] == nil) then + global._registry[train_id] = new_locomotive.train + end +end + +--- Determines which locomotive in a train is the main one +-- @tparam LuaTrain train +-- @treturn LuaEntity the main locomotive +function Trains.get_main_locomotive(train) + if train.valid and + train.locomotives and + (#train.locomotives.front_movers > 0 or #train.locomotives.back_movers > 0) + then + return train.locomotives.front_movers and train.locomotives.front_movers[1] or train.locomotives.back_movers[1] + end +end + +--- Creates an Entity module-compatible entity from a train +-- @tparam LuaTrain train +-- @treturn table +function Trains.to_entity(train) + local name = "train-" .. Trains.get_train_id(train) + return { + name = name, + valid = train.valid, + equals = function(entity) + return name == entity.name + end + } +end + +--- Set user data on a train +--

This is a helper method around Entity.set_data

+-- @tparam LuaTrain train +-- @tparam mixed data +-- @return mixed +function Trains.set_data(train, data) + return Entity.set_data(Trains.to_entity(train), data) +end + +--- Get user data on a train +--

This is a helper method around Entity.get_data

+-- @tparam LuaTrain train +-- @return mixed +function Trains.get_data(train) + return Entity.get_data(Trains.to_entity(train)) +end + +-- Creates a registry of known trains +-- @return table A mapping of train id to LuaTrain object +local function create_train_registry() + local registry = {} + + local all_trains = Trains.find_filtered({surface_name = 1}) + for _, trainInfo in pairs(all_trains) do + registry[tonumber(trainInfo.id)] = trainInfo.train + end + + return registry +end + +-- When developers load this module, we need to +-- attach some new events + +-- Filters events related to entity_type +-- @tparam string event_parameter The event parameter to look inside to find the entity type +-- @tparam string entity_type The entity type to filter events for +-- @tparam callable callback The callback to invoke if the filter passes. The object defined in the event parameter is passed. +local function filter_event(event_parameter, entity_type, callback) + return function(evt) + if(evt[event_parameter].type == entity_type) then + callback(evt[event_parameter]) + end + end +end + +-- When a locomotive is removed .. +Event.register(defines.events.on_entity_died, filter_event('entity', 'locomotive', Trains._on_locomotive_changed)) +Event.register(defines.events.on_preplayer_mined_item, filter_event('entity', 'locomotive', Trains._on_locomotive_changed)) +Event.register(defines.events.on_robot_pre_mined, filter_event('entity', 'locomotive', Trains._on_locomotive_changed)) + +-- When a locomotive is added .. +Event.register(defines.events.on_built_entity, filter_event('created_entity', 'locomotive', Trains._on_locomotive_created)) +Event.register(defines.events.on_robot_built_entity, filter_event('created_entity', 'locomotive', Trains._on_locomotive_created)) + +-- When the mod is initialized the first time +Event.register(Event.core_events.init, function() global._registry = create_train_registry() end) + +return Trains diff --git a/space-exploration_0.5.58/space-exploration/stdlib/utils/list.lua b/space-exploration_0.5.58/space-exploration/stdlib/utils/list.lua new file mode 100644 index 0000000..fa6a49d --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/utils/list.lua @@ -0,0 +1,51 @@ +--luacheck: globals List +List = {} + +function List.new () + return {first = 1, last = 0} +end + +function List.count(list) + if list.first > list.last then return 0 + else return list.last - list.first + 1 end +end + +function List.push_left (list, value) + local first = list.first - 1 + list.first = first + list[first] = value +end + +function List.push_right (list, value) + local last = list.last + 1 + list.last = last + list[last] = value +end + +function List.pop_left (list) + local first = list.first + if first > list.last then return nil end + local value = list[first] + list[first] = nil -- to allow garbage collection + list.first = first + 1 + return value +end + +function List.pop_right (list) + local last = list.last + if list.first > last then return nil end + local value = list[last] + list[last] = nil -- to allow garbage collection + list.last = last - 1 + return value +end + +function List.peek_left (list) + return list[list.first] +end + +function List.peek_right (list) + return list[list.last] +end + +return List diff --git a/space-exploration_0.5.58/space-exploration/stdlib/utils/queue.lua b/space-exploration_0.5.58/space-exploration/stdlib/utils/queue.lua new file mode 100644 index 0000000..c35936f --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/utils/queue.lua @@ -0,0 +1,80 @@ +------------------------------------------------------------------------------- +--[[Queue]] +------------------------------------------------------------------------------- +local function NtoZ_c(x, y) + return (x >= 0 and x or (-0.5 - x)), (y >= 0 and y or (-0.5 - y)) +end + +local function cantorPair_v7(pos) + local x, y = NtoZ_c(math.floor(pos.x), math.floor(pos.y)) + local s = x + y + local h = s * (s + 0.5) + x + return h + h +end + +local Queue = {} + +function Queue.new() + return {_hash={}} +end + +function Queue.set_hash(t, data) + local index = data.entity.unit_number or cantorPair_v7(data.entity.position) + local hash = t._hash + hash[index] = hash[index] or {} + hash[index].count = (hash[index].count or 0) + 1 + hash[index][data.action] = data.action + return index +end + +function Queue.get_hash(t, entity) + local index = entity.unit_number or cantorPair_v7(entity.position) + return t._hash[index] +end + +function Queue.insert(t, data, tick, count) + data.hash = Queue.set_hash(t, data) + t[tick] = t[tick] or {} + t[tick][#t[tick] + 1] = data + + return t, count +end + +function Queue.next(t, _next_tick, tick_spacing, dont_combine) + tick_spacing = tick_spacing or 1 + local count = 0 + local tick = (_next_tick and _next_tick >= game.tick and _next_tick) or game.tick + local next_tick = function(really_dont_combine) + tick = tick + tick_spacing + while (dont_combine or really_dont_combine) and t[tick] do + tick = tick + 1 + end + count = count + 1 + return tick, count + end + local queue_count = function(num) + count = count + (num or 0) + return count + end + return next_tick, queue_count +end + +--Tick handler, handles executing multiple data tables in a queue +function Queue.execute(event, queue) + if queue[event.tick] then + for _, data in ipairs(queue[event.tick]) do + local hash, index = queue._hash, data.hash + if Queue[data.action] then + Queue[data.action](data) + end + hash[index][data.action] = nil + hash[index].count = hash[index].count - 1 + if hash[index].count <= 0 then + hash[index] = nil + end + end + queue[event.tick] = nil + end +end + +return Queue diff --git a/space-exploration_0.5.58/space-exploration/stdlib/utils/utils.lua b/space-exploration_0.5.58/space-exploration/stdlib/utils/utils.lua new file mode 100644 index 0000000..674fc98 --- /dev/null +++ b/space-exploration_0.5.58/space-exploration/stdlib/utils/utils.lua @@ -0,0 +1,267 @@ +--luacheck: ignore +-- utils.lua by binbinhfr, v1.0.10 + +local author_name1 = "Nexela" +local author_name2 = "Nexela" + +------------------------------------------------------------------------------- +--@return Player Object +-- function Game.get_valid_player(player_or_index) +-- if not player_or_index then +-- if game.player then return game.player +-- elseif game.players[1] then +-- return game.players[1] +-- end +-- elseif type(player_or_index) == "number" or type(player_or_index) == "string" then +-- if game.players[player_or_index] and game.players[player_or_index].valid then +-- return game.players[player_or_index] +-- end +-- elseif type(player_or_index) == "table" and player_or_index.valid then +-- return player_or_index +-- end +-- return false +-- end +-- +-- function Game.valid_force(force) +-- if type(force) == "string" and game.forces[force] and game.forces[force].valid then +-- return true +-- elseif type(force) == "table" and game.forces[force.name] and game.forces[force.name].valid then +-- return true +-- end +-- return false +-- end + +-------------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------------- +function GetNearest( objects, point ) + if #objects == 0 then + return nil + end + + local maxDist = math.huge + local nearest = objects[1] + for _, obj in ipairs(objects) do + local dist = DistanceSqr(point, obj.position) + if dist < maxDist then + maxDist = dist + nearest = obj + end + end + + return nearest +end + +-------------------------------------------------------------------------------------- +function nearest_players( params ) + local origin = params.origin + local max_distance = params.max_distance or 2 + local list = {} + + for playerIndex = 1, #game.players do + local player = game.players[playerIndex] + local distance = util.distance(player.position, origin) + if distance <= max_distance then + table.insert(list, player) + end + end + + return list +end + +-------------------------------------------------------------------------------------- +function flying_text(line, color, pos, surface) + color = color or defines.colors.red + line = line or "missing text" --If we for some reason didn't pass a message make a message + if not pos then + for _, p in pairs(game.players) do + p.surface.create_entity({name="flying-text", position=p.position, text=line, color=color}) + end + return + else + if surface then + surface.create_entity({name="flying-text", position=pos, text=line, color=color}) + end + end +end + +-------------------------------------------------------------------------------------- +function min( val1, val2 ) + if val1 < val2 then + return val1 + else + return val2 + end +end + +-------------------------------------------------------------------------------------- +function max( val1, val2 ) + if val1 > val2 then + return val1 + else + return val2 + end +end + +-------------------------------------------------------------------------------------- +function iif( cond, val1, val2 ) + if cond then + return val1 + else + return val2 + end +end + +-------------------------------------------------------------------------------------- +function table.add_list(list, obj) + -- to avoid duplicates... + for _, obj2 in pairs(list) do + if obj2 == obj then + return(false) + end + end + table.insert(list,obj) + return(true) +end + +-------------------------------------------------------------------------------------- +function table.del_list(list, obj) + for i, obj2 in pairs(list) do + if obj2 == obj then + table.remove( list, i ) + return(true) + end + end + return(false) +end + +-------------------------------------------------------------------------------------- +function table.in_list(list, obj) + for k, obj2 in pairs(list) do + if obj2 == obj then + return(k) + end + end + return(nil) +end + +function table.spairs(t, order) + -- collect the keys + local keys = {} + for k in pairs(t) do keys[#keys+1] = k end + + -- if order function given, sort by it by passing the table and keys a, b, + -- otherwise just sort the keys + if order then + table.sort(keys, function(a,b) return order(t, a, b) end) + else + table.sort(keys) + end + + -- return the iterator function + local i = 0 + return function() + i = i + 1 + if keys[i] then + return keys[i], t[keys[i]] + end + end +end + +------------------------------------------------------------------------------------ +function is_dev(player) + return( player.name == author_name1 or player.name == author_name2 ) +end + +-------------------------------------------------------------------------------------- + +----------------------------------------------------------------------------------- +--Additional Table Helpers + +function table.raw_merge(tblA, tblB, safe_merge) + --safe_merge, only merge tblB[k] does not already exsist in tblA + if safe_merge then + for k, v in pairs(tblB) do + if not rawget(tblA, k) then + rawset(tblA, k, v) + end + end + else + for k, v in pairs(tblB) do + rawset(tblA, k, v) + end + end + return tblA +end + +function table.val_to_str ( v ) + if "string" == type( v ) then + v = string.gsub( v, "\n", "\\n" ) + if string.match( string.gsub(v,"[^'\"]",""), '^"+$' ) then + return "'" .. v .. "'" + else + return '"' .. string.gsub(v,'"', '\\"' ) .. '"' + end + else + return "table" == type( v ) and table.tostring( v ) or + tostring( v ) + + end + end + + function table.key_to_str ( k ) + if "string" == type( k ) and string.match( k, "^[_%a][_%a%d]*$" ) then + return k + else + return "[" .. table.val_to_str( k ) .. "]" + end + end + + function table.tostring( tbl ) + if type(tbl) ~= "table" then return tostring(tbl) end + local result, done = {}, {} + for k, v in ipairs( tbl ) do + table.insert( result, table.val_to_str( v ) ) + done[ k ] = true + end + for k, v in pairs( tbl ) do + if not done[ k ] then + table.insert( result, + table.key_to_str( k ) .. "=" .. table.val_to_str( v ) ) + end + end + return "{" .. table.concat( result, "," ) .. "}" + end + + function table.arraytostring(...) + local s = "" + + for _, v in ipairs({...}) do + s = s .." " .. tostring(v) + end + return s + end + + function table.getvalue(value, tbl) + if tbl==nil or value == nil then return nil end + if type(tbl) ~= "table" then + if tostring(value) == tostring(tbl) then return value else return nil end + end + for _, v in ipairs(tbl) do + if v == value then return v end + end + return nil + end + + function table.add_values(tbl, key, val) + tbl[key] = (tbl[key] or 0) + val + return tbl + end + + function table.getcount(tbl) + local i = 0 + for _,_ in pairs(tbl) do + i = i + 1 + end + return i + end diff --git a/space-exploration_0.5.58/space-exploration/thumbnail.png b/space-exploration_0.5.58/space-exploration/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..4799d517a6d97ea799ad47366f453df16292a5e6 GIT binary patch literal 13728 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%0D6|+DuS5zz+>sSNj(IT#|zbtETuu!LAC) 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

When this module is loaded, it registers new +-- events in order to track trains as locomotives and +-- carriages are moved around. For this reason, you should use +-- this library's Event module