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.
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).
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()
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 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.
