Page 1 of 1

Fully Exhaustive List of Every Space Age Signal in a Decider Combinator (v2.0.77)

Posted: Sat Sep 05, 2026 7:39 am
by crkit
Overview
I made a combinator with every possible signal in Space Age v2.0.77, with each of the 6 qualities.

Blueprint available as blueprint #444 on Factorio Codex, CSV file available on GitHub Gists. Alternative blueprint link available on GitHub Gists.
Details
I wrote a Lua snippet (run in the Factorio console) that exports to a file every prototype name that can be used as a signal. I then wrote a Python script that puts all those signals with every quality into a decider combinator, and converts those into a blueprint string.

I've also included the source code in case anyone else would like to reproduce my results / use this on a later version of Space Age.

Image

This is a a singular decider combinator containing every possible signal in Factorio: Space Age a combinator can contain. I believe this list is exhaustive. (Stored in a decider combinator as it allows the blueprint string to be smaller in size than using a Constant combinator).
  • Includes every signal from the prototypes (item, fluid, virtual, entity, recipe, space-location, asteroid-chunk, quality), which are the only allowed prototype categories that can be used for signals, as defined in the [uel=https://lua-api.factorio.com/latest/con ... DType.html]Factorio API Reference[/url].
  • Each signal is included in every quality (normal, uncommon, rare, epic, legendary, and quality-unknown). quality-unknown is a special quality used internally by Factorio, but is also a valid quality for a signal.
  • This list also includes signals only shown in Editor mode (such as cliff, big-demolisher-expanding-ash-cloud-1, etc.), as well as remnants and explosions (e.g. artillery-wagon-explosion, artillery-wagon-remnants).
N.B.: There are 5 signals (virtual,signal-item-parameter, virtual,signal-fuel-parameter, virtual,signal-fluid-parameter, virtual,signal-signal-parameter, virtual,signal-unknown) that do NOT work (as they are special wildcard signals for use in circuit conditions for trains and space platforms), and are not included.
Source Code
Below is the Python code used to generate the blueprint string:

Code: Select all

# This is the original Python script used to generate the comprehensive list of all
# Factorio: Space Age signals as listed at https://lua-api.factorio.com/latest/concepts/SignalIDType.html
# Last updated: September 2026
#
# To generate `signals.csv`, run the below code in the Factorio console:
#
# /c local t={}; local function add(p,typ) for n,_ in pairs(p) do t[#t+1]=typ..","..n end end; add(prototypes.item,"item"); add(prototypes.fluid,"fluid"); add(prototypes.recipe,"recipe"); add(prototypes.entity,"entity"); add(prototypes.space_location,"space-location"); add(prototypes.asteroid_chunk,"asteroid-chunk"); add(prototypes.quality,"quality"); add(prototypes.virtual_signal,"virtual"); helpers.write_file("signals.csv",table.concat(t,"\\n"))
#
# Then, copy 'signals.csv' from the 'script-output' folder in the Factorio user data directory to the folder this script is in.
#
# Requires: pyperclip for copying to clipboard


USE_INDEXED = False  # If `True`, the signals value will match their 1-based index.`
CSV_FILENAME = "signals.csv"


def main():
    import base64
    import json
    from pathlib import Path
    import zlib

    import pyperclip

    if not (CSV_PATH := Path(CSV_FILENAME)).exists():
        raise FileNotFoundError(
            "\n".join([
                f"File not found: '{CSV_PATH}'",
                "To generate the CSV file, run the below code in the Factorio console:",
                "",
                """/c local t={}; local function add(p,typ) for n,_ in pairs(p) do t[#t+1]=typ..","..n end end; add(prototypes.item,"item"); add(prototypes.fluid,"fluid"); add(prototypes.recipe,"recipe"); add(prototypes.entity,"entity"); add(prototypes.space_location,"space-location"); add(prototypes.asteroid_chunk,"asteroid-chunk"); add(prototypes.quality,"quality"); add(prototypes.virtual_signal,"virtual"); helpers.write_file("signals.csv",table.concat(t,"\\n"))""",
                "",
                "Then, copy 'signals.csv' from the 'script-output' folder in the Factorio user data directory to the folder this script is in.",
            ])
        )

    def encode_blueprint(data: dict) -> str:
        raw = json.dumps(data, separators=(",", ":"), ensure_ascii=False).encode("utf-8")
        compressed = zlib.compress(raw, level=zlib.Z_BEST_COMPRESSION)

        # Factorio version prefix
        return "0" + base64.b64encode(compressed).decode("ascii")

    # These signals do not work
    BLACKLIST_SIGNALS = ("virtual,signal-item-parameter", "virtual,signal-fuel-parameter", "virtual,signal-fluid-parameter", "virtual,signal-signal-parameter", "virtual,signal-unknown")
    SIGNALS = tuple(
        {"type": k, "name": v}
        for k, v in [
            line.split(",")
            for line in CSV_PATH.read_text().splitlines()
            if line not in BLACKLIST_SIGNALS  # 5 signals are invalid
        ]
    )
    QUALITIES = "normal", "uncommon", "rare", "epic", "legendary", "quality-unknown"
    outputs = []

    for s in SIGNALS:
        for q in QUALITIES:
            data = {
                "signal": {**s, "quality": q},
                "copy_count_from_input": False,
            }

            if USE_INDEXED:
                data["constant"] = len(outputs) + 1  # must be 1-indexed

            outputs.append(data)

    result = encode_blueprint({
        "blueprint": {
            "description": f"A decider combinator containing all the possible {len(outputs)} signals in Factorio: Space Age.{'\n\nIndexed by item count.' if USE_INDEXED else ''}",
            "icons": [{"signal": {"name": "decider-combinator"}, "index": 1}],
            "entities": [
                {
                    "entity_number": 1,
                    "name": "decider-combinator",
                    "position": {"x": 0, "y": 0},
                    "direction": 4,
                    "control_behavior": {
                        "decider_conditions": {
                            "conditions": [{"first_signal": {"name": "gate"}, "comparator": "="}, {"first_signal": {"name": "gate"}, "comparator": "\u2260"}],
                            "outputs": outputs,
                        }
                    },
                }
            ],
            "item": "blueprint",
            "label": f"Factorio: Space Age - All {len(outputs)} Signals{' (Indexed)' if USE_INDEXED else ''}",
            "version": 562949958467584,
        }
    })
    pyperclip.copy(result)  # Copy to clipboard

    print(f"Blueprint copied to clipboard.")
    print(f"Blueprint length: {len(result)}")


if __name__ == "__main__":
    main()

Below is the Lua snippet run in the Factorio console used to generate a CSV of all the available signals:

Code: Select all

/c local t={};
local function add(p,typ) for n,_ in pairs(p) do t[#t+1]=typ..","..n end end;
add(prototypes.item,"item");
add(prototypes.fluid,"fluid");
add(prototypes.recipe,"recipe");
add(prototypes.entity,"entity");
add(prototypes.space_location,"space-location");
add(prototypes.asteroid_chunk,"asteroid-chunk");
add(prototypes.quality,"quality");
add(prototypes.virtual_signal,"virtual");
helpers.write_file("signals.csv",table.concat(t,"\n"))
Note: the CSV file appears in the "script-output" folder of the Factorio user data directory.
Note 2: I have not included any conditions in the Decider combinator

This is a proof=of-concept base post that demonstrates the ability to obtain every signal. Next steps would be writing a Python script that creates a lamp array of all the signals / a more general-purpose Python script.