
I made a CSV file of every signal in Space Age, and put it into a combinator. Each signal is included in each of the 6 qualities.
- CSV file available on GitHub Gists. Note: Excluded the 8 signals that don't work.
- Blueprint available on Factorio Codex (blueprint #444), factoriobin, Factorio prints and as a backup on GitHub Gists.
- I've also included the source code below in case anyone else would like to reproduce my results / use this on a later version of Space Age.
Previous best
- 581 base signals
- 2,905 unique signals (uses 5 qualities)
- 11.6 KB storage per combinator
- 1,300 base signals
- Up to 7,800 unique signals (if using all 6 qualities)
- 31.2 KB storage per combinator
- 2,224 base signals
- 13,344 unique signals (uses all 6 qualities)
- 53.3 KB storage per combinator
- Includes every signal from the prototypes (`item`, `fluid`, `virtual`, `entity`, `recipe`, `space-location`, `asteroid-chunk`, `quality`), which are the only prototype categories allowed for signals, as defined in the Factorio API Reference.
- 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`).
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-everything",
"virtual,signal-each",
"virtual,signal-anything",
"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()
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.
- N.B.: If generating using the lua command, note the CSV file will contain the 8 invalid wildcard signals, and will need to be manually removed.
- Note 2: Some signals don't even show up at all in the GUI but work as they light up lamps, can be counted, and otherwise act as regular signals.
