Factorio circuit network tutorial
Part #1: Basics
Disclaimer: hoewel ik mijn best doe om dingen zo duidelijk en foutloos mogelijk op te schrijven, zal er onverhoopt vast wel iets niet kloppen. DM me gerust voor vragen, opmerkingen, of als je me simpelweg wilt wijzen op typo's
Delen in deze reeks:
Part #1: Basics
Part #2: My First Circuit
Part #3: Digital Display
TL;DR
Deze tutorial behandelt puur de basistheorie achter circuit networks en combinators, en kan prima geskipt worden als je hier redelijk bekend mee bent. Aan bod komt: signals, wires, combinators en hoe dit allemaal samenwerkt. De verwachting is dat er nog wel terugverwezen wordt naar deze tutorial voor achtergrond informatie - er wordt sowieso niet verwacht dat de lezer meteen alles begrijpt. Sommige dingen moet je nou eenmaal gewoon eerst
doen 
.
Inleiding
Factorio draait om automatisering, en hoewel de game prima uit te spelen is zonder ook maar 1 red of green wire te trekken, ontkomt de die hard factorioïst er niet aan om zijn mega factory toch wat te voorzien van logische schakelingen om bepaalde zaken in goede banen te leiden. Denk hierbij aan het gebalanceerd houden van voorraden, het stopzetten van bepaalde productie in low power situaties of het regelen van spoorverkeer om te voorkomen dat resources je train stations dicht laten slibben. Anderzijds kan het ook gebruikt worden om de speler te voorzien van informatie of om de boel simpelweg op te leuken.
Het "circuit network" is in Factorio de manier om dat te doen. Het omvat de volgende componenten:
[list]• Signals: de "datapakketjes" die gecommuniceerd worden tussen gebouwen
• Gebouwen: verzenders en ontvangers van de datapakketjes
• Wires: het medium waarover signals getransporteerd kunnen worden
• Combinators: een specifieke set gebouwen die het maken van logische schakelingen mogelijk maakt
In dit deel van de tutorial reeks zullen elk van deze dingen worden besproken. Het gaat puur om de theorie, we zullen nog geen schakelingen maken - de volgende delen zullen vooral ingaan op het maken van schakelingen met Combinators. Het geeft niets als je een bepaald aspect nog even niet begrijpt, dit komt vanzelf wanneer je ermee aan de slag gaat. Tzt kun je dan evt weer terugvallen op deze tutorial voor meer info

.
Signals
Signals vormen de basis voor informatie. Een signal bestaat uit twee delen: het type, en een waarde.
Typen
Voor elk item in Factorio is een type signal, van Wooden Chest tot Lubricant. Daarnaast zijn er nog 45 extra typen die worden aangeduid met 0 t/m 9, A t/m Z en een negental verschillende kleuren, deze worden virtual signals genoemd. Hoewel al die verschillende typen strict gezien geen specifieke betekenis hebben, zullen specifieke gebouwen die die signals produceren of consumeren daar natuurlijk wel een betekenis aan hangen. Een chest die zijn voorraad vertelt, zal natuurlijk een Iron Ore signal gebruiken om de hoeveelheid iron ore weer te geven. Net zoals dat een filter inserter alleen de elementen oppakt waarvan het bijbehorende signal een positieve waarde (groter dan nul) heeft. Maar anders dan dat ben je vrij om elk type signal naar eigen inzicht te gebruiken. Wel handig om te weten is dat de 45 virtual signals nooit standaard gebruikt zullen worden voor gebouwen (de lamp uitgezonderd, die op basis van de 9 kleurensignals van kleur kan veranderen).
Waardes
Belangrijk om te realiseren is dat de waarden die gekoppeld zijn aan een type signal altijd alleen gehele getallen zijn. Kommagetallen, zoals bijvoorbeeld gebruikt door fluids, zullen automatisch worden omgezet naar een geheel getal. Een storage tank met 34,5 units aan oil zal rapporteren dat hij maar 34 oil heeft. Bij deze conversie wordt er altijd richting nul afgerond (andersgezegd, het gedeelte achter de komma wordt gewoon genegeerd). In realiteit worden voor signals 32 bits signed integers gebruikt. Dit betekent dat ze een waarde kunnen aannemen van -2.147.483.648 t/m 2.147.483.647. Bij een overflow of underflow zal de waarde "omslaan" (tel 10 op bij 2.147.483.640 en je krijgt -2.147.483.646), wat tot vervelende gevolgen kan leiden.
Nul: een speciaal geval
Als een signal de waarde 0 heeft, dan zal hij niet worden verstuurd. Omgekeerd, alle signals die niet worden verstuurd, hebben de waarde 0. Onthoud dit, het kan zowel in je voordeel als je nadeel werken.
Gebouwen
Verschillende soorten gebouwen zijn aan te sluiten op het circuit network. Daarbij zijn ze op te delen in producers en consumers van informatie (of beide). Een producer biedt informatie aan. Dit kan bijvoorbeeld zijn de voorraad in een chest, of het type en de hoeveelheid die een inserter momenteel "in de hand" heeft. Een consumer zal iets met de geboden informatie doen. Zo kunnen gebouwen bijvoorbeeld worden uitgezet of rail signals worden bediend.
Voor een uitgebreide lijst met gebouwen die aangesloten kunnen worden op het circuit network, verwijs ik je naar de
Factorio Wiki.
Tip
Als je met de muis hovered over een (met wire verbonden) gebouw, dan zie je in het informatiescherm rechts alle input en output signals voor dat gebouw.
Wires
Dit is het medium waarover de signals worden getransporteerd. Net als copper wire is de lengte beperkt. En ook net als copper wire kun je ze verbinden aan power poles om een langere afstand af te leggen. Een gebouw dat signals verstuurt, zal dat doen aan alle andere gebouwen die met de draad in contact staat. Om te voorkomen dat signals van verschillende gebouwen mengen, zijn er twee verschillende kleuren kabel: rood en groen. Het is onmogelijk om red en green wire aan elkaar te koppelen, en elk gebouw heeft altijd twee verschillende contactpunten voor de verschillende kleuren draad. De gebouwen versturen dezelfde outputs over beide draden, en de signals van beide draden worden bij elkaar opgeteld voor de input.
Verbindt je namelijk twee verzendende gebouwen met dezelfde kleur kabel, dan zullen de signals bij elkaar worden opgeteld. Als gebouw A 32 batteries rapporteert in dezelfde game tick dat gebouw B 16 batteries rapporteert, dan zal er op de draad een signal staan van 32+16 = 48 batteries.
Wires plaatsen doe je door met een green of red wire in de hand eerst op het ene gebouw te klikken, en daarna op het andere. Zit er al een wire tussen met die kleur? Dan wordt hij weer weggehaald. Wires die je weghaalt, of de wires die verdwijnen als je een gebouw weghaalt waar ze aan vast zitten, krijg je niet terug in je inventory. Daar tegenover staat dat wires geheel gratis door robots worden geplaatst als je bouwt met blueprints. Dit alles geldt overigens ook voor copper wire.
Tip
Als je met de muis hovered over een gebouw, dan zullen alle wires die in verbinding staan met dat gebouw worden gehighlight.
Power poles zijn handig om te "debuggen", omdat ze precies laten zien welke signals er afzonderlijk over de groene en rode kabels gaan. Dit is niet direct af te leiden als je puur naar de input en de output van gebouwen kijkt. Ook kun je aan de output van een gebouw niet zien hoe het mengt met overige signals die met die output verbonden zijn. Het kan dus lonen om af en toe even een draadje naar een power pole te trekken om meer informatie te krijgen.
Combinators
Nu komen we bij het hart van de logische schakelingen in Factorio

. Met combinators kun je signals combineren en transformeren. Er zijn drie typen combinators:
- Arithmetic Combinator
- Decider Combinator
- Constant Combinator
De arithmetic en decider combinator hebben verschillende contactpunten voor input en output (deze zijn aangegeven in Alt mode). Let dus goed op met het verbinden van wires aan welke kant je ze plaatst. Bovendien kun je de output direct verbinden met de input. Dit zorgt voor een feedback loop wat voor sommige zaken handig kan zijn. Ook kunnen deze combinators vóór het plaatsen 90 graden worden gedraaid, maar eenmaal geplaatst kunnen ze alleen nog worden gespiegeld.
Arithmetic Combinator

Met deze combinator kun je rekenen. In het configuratiescherm kun je verschillende dingen kiezen: een wiskundige operatie (bijvoorbeeld optellen of vermenigvuldigen), de twee inputs links en rechts van de gekozen operator (dus welke signals moeten worden opgeteld of vermenigvuldigd), en wat het output signal moet zijn. Voor de rechterkant van de operatie kun je bovendien een constant getal opgeven ipv een signal. Wil je de constante juist voor de linkerkant gebruiken (bij bijvoorbeeld aftrekken of delen), dan zul je daar een Constant Combinator voor moeten gebruiken.
Deze combinator vermenigvuldigt het aantal underground yellow belts met 5, en output dat als yellow transport belts.
Als je naar het tabje van de virtual signals kijkt voor de linkerkant van de operatie, dan zie je daar tevens een extra virtual signal aangegeven met geel sterretje: Each. Tezamen met Everything (rood) en Anything (groen), die ook bij de Decider Combinator te kiezen zijn, hebben deze een specifieke betekenis waar ik later op terugkom.
De mogelijke rekenoperaties zijn:
| + | Optellen |
| - | Aftrekken |
| * | Vermenigvuldigen |
| / | Delen |
| % | Modulo (rest na deling) |
| ^ | Machtsverheffen |
| << | Bitwise shift left (bits naar links schuiven) |
| >> | Bitwise shift right (bits naar rechts schuiven) |
| AND | Bitwise AND |
| OR | Bitwise OR |
| XOR | Bitwise Exclusive OR |
Een beschrijving van de bitwise operaties vallen buiten de scope van deze tutorial en daarvoor verwijs ik naar tal van documentatie die op het internet te lezen is
Tip
Als je simpelweg naar een ander signaaltype wilt converteren, dan kun je dat doen met een Arithmetic Combinator die de waarde ongewijzigd laat (bijvoorbeeld door +0 te doen), maar als output een ander signal gebruikt.
Decider Combinator

In plaats van een berekening, doet deze combinator een vergelijking. De combinator output alleen als de betreffende vergelijking waar is. Configuratie is vergelijkbaar met de Arithmetic Operator. Weer kun je een operatie instellen (die spreken voor zich), en kun je signals instellen voor de linker- en rechterkant van de vergelijkingsoperator, en voor rechts bovendien een constante.
Ook is er wederom een signal voor de output, maar daar heb je nu een extra keuze: je kunt een 1 laten outputten, of de totale hoeveelheid van dat output signal wat de combinator in kwam.
Deze decider laat al zijn inputs alleen door als het aantal inserters groter is dan 10
Constant combinator

Met de Constant Combinator kun je constante waardes opgeven voor signals. Er is ruimte voor 18 verschillende typen signals, maar je kunt natuurlijk altijd meerdere constant combinators met elkaar verbinden. Anders dan de andere twee combinators verbruikt deze combinator geen stroom en is hij maar 1 tile groot. Ook kun je 'm gewoon draaien na het plaatsen, al heeft dat natuurlijk louter esthetisch nut
Deze combinator output altijd 1x transport belt, 10x pipe, 5000x storage chest en -10x signal 'A'
Everything, Anything, Each

Deze drie virtual signals kun je kiezen aan de linkerkant van een decider combinator (alle drie) of arithmetic combinator (alleen each), en idem voor de outputs. Deze signals hebben een speciale betekenis, en zijn zeer nuttig.
Everything
Als deze gebruikt wordt aan de linkerzijde van de vergelijking, dan zal de Decider alleen outputten als álle input signals aan de vergelijking voldoen.
Als deze gebruikt wordt als output (kan alleen als je niet Each gebruikt), dan zal de decider al zijn inputs outputten (maar mogelijk met waarde 1 als je dat zo instelt)
Anything
Als deze gebruikt wordt aan de linkerzijde van de vergelijking, dan zal de Decider alleen outputten als er minstens één signal bestaat dat voldoet aan de vergelijking.
Deze kan alleen worden gebruikt in de vergelijking, niet als output.
Each
Bij de Decider Combinator
Als deze gebruikt wordt aan de linkerzijde van de vergelijking, dan zal de Decider net als bij Anything alleen outputten als er minstens één signal bestaat dat voldoet aan de vergelijking. Het verschil zit 'm in de output:
[list]• Als je een enkele signal gebruikt als output die je op "output input count" zet, dan zal hij alle inputs waarvoor de vergelijking waar is bij de output optellen.
• Als je Each gebruikt als output (wat alleen kan als je 'm ook in de vergelijking gebruikt), dan output hij louter de signals waarvoor de vergelijking waar is.
Bij de Arithmetic Combinator
Vergelijkbaar met de Decider Combinator zal Each betekenen dat hij de operatie toepast op álle input signals. Deze zal hij dan vervolgens outputten als álle input signals (indien Each gebruikt als output), of alle outputs bij elkaar optellen (indien een ander signal als output wordt ingesteld).
Voorbeelden
Het is wellicht wat lastig te begrijpen met droge tekst, dus ik spoor iedereen aan om hier eens mee te experimenteren. Desalniettemin zal ik een voorbeeld geven wat de outputs zullen zijn bij een Decider Combinator in de volgende situaties.
De input is voor iedere situatie is: 10x Inserter, 20x Water, 30x Iron Ore
| Vergelijking | Output | Resultaat |
|---|
| [Inserter] > 5 | [Everything] x input count | 10x Inserter, 20x Water, 30x Iron Ore |
| [Inserter] > 5 | [Everything] x 1 | 1x Inserter, 1x Water, 1x Iron Ore |
| [Everything] > 25 | [Everything] x input count | (niets) |
| [Everything] > 5 | [Everything] x input count | 10x Inserter, 20x Water, 30x Iron Ore |
| [Anything] > 25 | [Everything] x input count | 10x Inserter, 20x Water, 30x Iron Ore |
| [Each] > 15 | [Each] x input count | 20x Water, 30x Iron Ore |
| [Each] > 15 | [Chest] x input count | 50x Chest |
| [Each] > 15 | [Chest] x 1 | 2x Chest |
Tip
Belangrijk om te realiseren is dat signals die 0 zijn (oftewel, signals die er niet zijn) niet meedoen met Everything, Anything en Each. Een vergelijking als "[Anything] = 0" zal dus nooit waar zijn. Als er helemaal geen input is, dan zal een vergelijking met Everything altijd waar zijn - er is immers geen signal waarvoor de vergelijking niet opgaat.
Game ticks & processing
[Achtergrond informatie]
Factorio doet al zijn werk in game ticks, en dus ook de processing van signals. Zo'n game tick vindt 60x per seconde plaats. In elke tick gebeuren de volgende drie stappen:
[list]• Verzamel alle input signals voor ieder gebouw (dus ook de combinators)
• Laat ieder gebouw zijn werk doen
• Output alle signals voor ieder gebouw
Hieruit volgt dat elke combinator een extra tick delay toevoegt. Als je 5 combinators in serie schakelt (elke output is verbonden aan de input van de volgende), dan duurt het 5 ticks voordat de output beschikbaar is. Als je bij de laatste combinator dan ook nog eens iets wilt doen met de originele input, dan matcht dat dus niet met elkaar: de berekening die bij die input hoort komt immers pas 4 ticks later bij die combinator.
Het kan essentieel zijn om hier rekening mee te houden. Het toevoegen van kunstmatige delays om alles op hetzelfde tijdstip aan te laten komen is dan ook waarschijnlijk iets dat je vroeg of laat nodig hebt. Dit doe je typisch met een Arithmetic Operator die gewoon "[each] = [each] + 0" doet. Hij output dus exact zijn input, zodat die signals een tick later beschikbaar zijn. En dat doe je mogelijk N keer achter elkaar, als je het signal N ticks wilt vertragen

.
Hier twee voorbeelden van een rij arithmetic combinators dat doet: ([input]^2 + 5) * 3 + [input]. Aan het eind is de originele input nog een keer nodig, de laatste optelling geschied simpelweg door de signals te combineren. Bij de rode wire gaat het fout - de originele input is eerder bij de laatste combinator dan de berekening ([input]^2 + 5) * 3. Bij het voorbeeld met de groene wire is dit opgelost: door de originele input 3 ticks te vertragen met een combinator die simpelweg zijn input doorgeeft, loopt alles weer in sync.
Bonusvraag: Er zit nog een fout in de opstelling met rode wire. Wie ziet hem?
Tot slot
Een hoop droge stof, we gaan het volgende deel echt aan de slag

. We gaan onder andere een indicator maken van hoe vol een storage tank zit met een rij gekleurde lampjes, en waarschijnlijk nog wat andere dingetjes. Stay tuned.
Wil je een notification bij het volgende deel? Upvote deze post, dan tag ik je

.
@Zorian @Imo62 @anboni @Twixxx @Sjeik @MatHack @eathan @lmno31 @-ko- @Tripple20 @Hans1990 @Raverty @Evilbee
[
Voor 255% gewijzigd door
.oisyn op 13-05-2017 03:11
]