Alt-F4 #33 - Vanilla: Protřepat, nemíchat  30-04-2021

Napsal Villfuk02, redlabel, upravil stringweasel, Nanogamer7, Conor_, Therenas, Firerazer,
přeložil oof2win2

Obsah

V tomto skvělém #33. vydáním Alt-F4, Villfuk02 oznámí jejich nedávný módový výtvor: Znáhodňovač Receptů! Řekne o všech designových problémech, které musely být překročeny, aby mód byl opravdu dobrý. poté redlabel nám řekne o nejnovějším COMFY eventu, který bude nejspíše trochu vybuchující.

Vanilla: Protřepat, nemíchat Villfuk02

Vill’s Recipe Randomizer (Villův Znáhodňovač Receptů) děla to, co by jste si z názvu mysleli - znáhodní recepty. Na první pohled, toto může znít jako stupidní, ale je to velmi lehký nápad. Pokud se ale budete snažit, aby to bylo méně stupidní, bude se to docela rychle komplikovat.

Vzorek špaget zdarma
Příklad továrny, která vyrábí vědecké balíčky produktivity z kapslí s rozptylovacími roboty, vypínačů a paliva pro plamenomet

Jak to začalo

Poprvé jsem na tomto projektu začal pracovat v září 2020. V té době jsem se pouze snažil vytvořit mód, který je obojí lehký a unikátní. Poté, co jsem narazil do několika problémů, věděl jsem moc dobře, že tento mód si nikdo nezahraje, vzdal jsem se a nikdy jsem už neprogramoval.

Po dvou dalších selhaných pokusech jsem se vrátil zpět k Factoriu, tentokrát ale jako hráč. Hrál jsem vanillu, potom Industrial Revolution 2 (Industriální Revoluce 2), poté jsem zkusil Space Exploration (Průzkum vesmíru). Miloval jsem módy, které změnily celou hru, protože mi to dovolilo naučit se nové recepty, objevit nové layouty továren a řešit nové logistické problémy. Ale většina těchto módů jsou velmi těžké a jsem rychle znuzen. To jsem si uvědomil, že znáhodňovač receptů má doopravdy účel: Je to jako nekonečné množství módů s velkými změnami, zatímco vanilla pořád existuje! Největší bonus pro mě byl, že jsem nemusel vytvářet žádné nové přístroje nebo grafiky, protože je to pouze měnění číslic a písmen.

Ne tak lehké jak to vypadá

Tento mód by mohl lehce vzít každý recept a přidat mu náhodné itemy jako ingredience. Toto by bylo docela k ničemu, protože například, červené vědecké balíčky by mohly potřebovat nukleární palivo jako ingredienci, ale vy ho nebudete mít. Tak jsem módu řekl, aby šel zkrz strom technologií a pro každý recept který je odemčen, použít pouze itemy, které mohou být vzány předtím, jako potenciální ingredience. Ovšem existují výjmky v některých módech, kde můžete odemknout recept, dříve než ho jste schopni vyrobit, takže musím být více opatrný.

Nejspíše by se vám nechtělo vyrábět podzemní pás z parních strojů a laboratoří. To by bylo moc drahé. Potřeboval jsem způsob, jak udělat recepty více balancovanějšími. Proto jsem se rozhodl implementovat algoritmus, který vyhodnotí počet surových materiálů na každý item. Můžeme lehce zpočítat, že jeden obvod stojí 1 železné rudy a 1.5 měděné rudy.

Jak je to vyrobeno: Elektronický obvod
1.5 měděné rudy plus 1 železné rudy vytvoří jeden elektronický obvod

Řekněmě, že elektronický obvod tedy má hodnotu 2.5. Znáhodňovač tedy ví, že může použít jeden pás (hodnota 1.5) a jednu měděnou rudu (1) jako nový recept na elektronické obvody. Je trochu variace v finálním výsledku. Přicá to trochu náhody, ale jako nejdůležitější, je mnohem lehčí najít validní kombinaci, což zrychluje proces znáhodnění.

V tomto bodě, zveřejnil jsem mód a z zpětné vazby a trochu testování, bylo zřejmé, že existovalo mnoho bugů (ovšem) a dva “velké” problémy. Slovo velké je v uvozovkách, protože mód byl mnohem hratelnější, než by jste očekávali od znáhodňovače. Chtěl jsem aby si to hráči ale užili, ne jenom prožili

Prvních pár problémů

Prvním problémem bylo dřevo. Defaultní nastavení se ujistily, že dřevo nebylo znáhodněno, ale jak si můžete myslet, mnoho receptů používalo dřevěné elecktrické sloupy jako ingredienci! Jako si můžete myslet, oprava měla být byla docela lehká a nudná. Přidal jsem parametr pro nenáhodné suroviny, jako dřevo, a každý item, který potřebuje materiál s tímto parametrem ho dostane.

Druhý problém byl, i když suroviny potřebovaly správné množství surovin, byly často moc komplexní a neférové. Mód nepočítal s množstvím montážních kroků nebo časem montáže. Skvělým příkladem by byly červené vědecké balíčky. Je velmi levný, protože má pouze hodnotu 3, ale trvá 5 sekund na výrobu. Byl použit v několika receptech, jako základní komponent, podobně k železným kolečkům. Dlouhá doba výroby znamenala, že budete potřebovat několik montoven na výrobu červených vědeckých balíčků pro něco lehkého jako podzemní pásy. Další problematický příklad je něco tak lehkého jako železná kolečka může potřebovat několik kroků, jako výroba z kamenných cihel, které jsou vyrobeny z železných tyčí, které by mohly být vyrobeny z trubek atd. Proto jsem nechal mód vypočítat druhou hodnotu, pojmenovanou náročnost, pro každý item. Komplexita vezme v potaz počet kroků na výrobu, počet ingrediencí (a výstupů) a také dobu výroby.

Balancování surovin

Vypadalo to, jako že bych měl perfektní znáhodňovač, ale ovšem, objevilo se několik problémů (a bugů). Často se stalo, že většina receptů používala primárně jednu surovinu (často železo nebo kámen), což bylo trochu nudné, protože jste museli objevovat hodně místa aby jste našli velká množství té rudy. Také, často nebyla nutná ropa k odpálení rakety. Pro daný recept, všechny validní itemy měly stejnou pravděpodobnost, aby se vybraly, takže všechny itemy z ropy měly nižší šanci na výběr, protože jich bylo tak málo. Zkoušel jsem pár strategií, aby algoritmus vybíral lepší recepty ale nic nefungovalo. Mohl jsem mu jednoduše říct, aby používal více plastu nebo tuhého paliva atd., ale co kdyby jste chtěli hrát s módy a bylo ještě více itemů na prioritizaci? Chtěl jsem univerzální řešení.

Již jsem znal jeden způsob, jak by to mohlo fungovat, ale bál jsem se ho implementovat, protože by se všechno stalo mnohem více komplikovanějším. Toto znamená více pvývoje, víc bugů a potenciálně mnohem delší doby načítání. Potom co jsem zkusil mnohem lehčí cestu jak dosáhnout podobných výsledků, rozhodl jsem se jít s tímto komplikovaným řešením.

Hlavní nápad byl použít počet surovin radši než totální hodnotu. Toto znamená, že mód se může ujistit, aby každý recept měl správné množství surovin, což bude znamenat, že všechny suroviny budou použity. Podobně k totální hodnotě, množství surovin pro každý recept může být jiné, nebo mohou být kompletně náhodné podle nastavení módu. Docela lehké, co? No, teď místo dělání matematiky s pouze jedním číslem, musím jich použít několik a logika je mnohem komplikovanější. Naštěstí, s nějjakými optimalizacemi a hodně testování, mód funguje správně a je pořád docela rychlý.

A to je celá historie Vill’s Recipe Randomizer (Villův Znáhodňovač Receptů)!

Musíme jít hlouběji

Nemluvil jsem ale o pár VELKÝCH problémech (všimněte si velkých písmen a žádných apostrof), které tam byly od začátku. Jedna z nich je receptová smyčka. Algoritmus se mohl zaseknout, když se snažil vyhodnotit hodnotu receptu, nebo ji mohl vyhodnotit špatně. Smyčky, které byly obsaženy v jednom receptu byly docela lehké na řešení. Pro vyhodnocení receptu, algoritmus odebral itemy které se objevily na obou stranách, protože jejich hodnoty jsou neznámé, což nechalo, aby recept byl připraven pro znáhodnění. V vanille, toto je aplikováno na Kovarexův obohacující proces a zkapalňování uhlí:

Ukliď to!
40 U-235 a 2 U-238 mohou být odebrány z Kovarexu a 25 těžkého oleje může být odstraňeno z zkapalňování uhlí.

Smyčky s více recepty jsou ale trochu problematičtější. Nejsou žádné smyčky v vanille s více než jedním receptem (mimo barellování, což stejně není automaticky znáhodněno), takže je docela lehké je přehlédnout, ale v módech, jsou všude! Znáhodňovač může také vytvořit smyčku v některých kondicích. Abychom si tento problém ukázali, budeme potřebovat příklad. Vezmeme si syntetické safíry v Industrial Revolution 2 (Industriální Revoluce 2). Budete potřebovat čistý nikl, siliku a safírový prášek aby jste vytvořili safír, ale safírový prášek je vytvořen z drcení safírů, což vytváří smyčku:

Safírová smyčka

Způsob, jak jsem tento problém vyřešil je, když je smyčka detekována, je roztřihnuta v jednom bodě a recepty jsou poté sloučeny do jednoho. Nový recept je poté použit do výpočtů místo toho v smyčce. Zde, dva recepty jsou sloučeny tím, že tři safírové prášky jsou odebrány v prostředku, tak můžeme odebrat dva safíry, které jsou obojí jako ingredience a jako výsledek:

Safír odsmyčkován

Skončíme s receptem na safíry bez problematických detailů! Co se ale stane, když jsou větvené smyčky v smyčkách?

Smyčkový diagram
Toto není založeno na žádných konkrétních receptech, ale jsem si jist, že něco takto komplikovaného jako tento diagram existuje v nějakém módu

Pouze řekněme, že věci se stanou smyčkujícími. Myslím si, že jsem to trochu vyřešil v módu, ale nepůjdu zde do detailů, toto není kurz grafové teorie, a také si nejsem jist, jestli řešení funguje spolehlivě.

Můj nepřítel

A teď, čas na největší problém ze všech: recepty s několika výstupy. Podívejme se na pokročilé zpracování ropy jako příklad.

Pokročilé zpracování ropy

Defaultně, ropa má hodnotu 0.4 (budeme na chvíli ignorovat vodu). To znamená, že recept má hodnotu 40. Tak víme, že 25 těžkého oleje + 45 lehkého oleje + 55 petroleje musí mít součet hodnoty 40, ale kolik \ té hodnoty je v každém produktu? Je mnoho způsobů, jak tento problém vyřešit, a řešení tohoto mi zabralo nejvíce času a mnoho bolestí hlavy. Podívejme se na nejčastěji používané možnosti.

Nejlehčí: Pouze nechte, aby každý z výsledků měl rovnou část totální hodnoty. Toto je nejrozumnější řešení, ale rozbije se, pokud přidáte odpadové produkty. Například, Kovarexův obohacující proces vyrobí 41 U-235 a 2 U-238, algoritmus by si myslel, že obojí má stejnou hodnotu, ale vy nejspíše víte, že U-235 je mnohem cennější. Takže tento přístup není moc použitelný.

“Nejlepší”: Pouze nechte, aby každý díl měl plnou hodnotu, ale zapište si vedlejší výrobky, které potom můžete odečíst. Například, těžký olej má lehký olej a petroleum jako vedlejší výrobky v pokročilém zpracování ropy. To znamená, že lubrikant je také má jako vedlejší produkty, protože je to vyrobeno pouze z těžkého oleje. Kdybychom chtěli vyrobit expresní rozdělovač, potřebovali bychom, mimo jiné, lubrikant a pokročilé obvody. Pokročilé obvody potřebují petroleum, ale my máme nějaké jako vedlejší produkt lubrikantu, tak to můžeme odečíst. Jediný vedlejší produkt, který zbývá je lehký olej. Co s tím budeme dělat? Ovšem ho můžeme krakovat, abychom měli ještě více petrolea. Ale to vyžaduje vodu. Je levnější použít více vody, nebo více petrolea? No, zpočítejme obě dvě možnosti kdyby něco.

Jak si můžete všimnout, tento přístup je šíleně komplikovaný. Existuje mnoho hranných případů a otázky, na které jsou potřeba odpovědi. Jako co dělat s extra vedlejšími produkty, když jiné recepty je nepotřebují? Zkusil jsem implemenetovat verzi tohoto přístupu a musím říct, byl jsem docela úspěšný. Ztrávil jsem na tom pouze 100 hodin a musel jsem opravit asi milión bugů. A co byl výsledek? No, řešení pořád není perfektní, ale přichází to hodně blízko. Také jsem vůbec nevěděl, co můj kód dělá. Vše se rozbilo, když jsem něco zkusil změnit. A jako nejdůležitější, tento mód se načítal 10 sekund až 10 minut. Protože jsem chtěl, aby mód byl s nejvíce ostatními módy kompatibilní (a fungování s vanilla Factoriem by také bylo docela fajn), rozhodl jsem se, že toto není směr, kterým jít.

Nakonec, po hodně přemýšlení, dostal jsem se k algoritmu, který používám teď. Je to vlastně kompromis mezi dvoumi přístupy, které jsem popsal výše. Funguje docela dobře a je docela lehký. Není to ale dost lehké, abych to vysvětlit, protože bych musel vysvětlit mnohé další věci v mém vyhodnocujícím algoritmu. Nevyhodnocuje všechny multi-výstupové recepty nejlépe ve všech případech, ale také se to nerozbíjí v krajových případech (doufám).

Konečné poznámky

Toto uzavírá náš náhled do vnitřního fungování Receptového Znáhodňovače. Pokud máte nějaké otázky nebo nápady, můžete mi napsat na mém Discord serveru. Také bych rád poděkoval všem, kteří se do něj připojili a postovali bugy, nápady, testovali věci nebo mě jinak podporovali při vývoji. Mód by se nedostal takto daleko bez vaší pomoci!

COMFY Minesweeper! redlabel

Abychom oslavili novou mapu legendárního tvůrce map mewmew a třpytící se nový Ryzen 9 5950X od Gerkize, COMFY Factorio organizuje speciální event 1. května v 17:00 UTC. Všichni a jejich rodiny jsou pozváni, žádná nutnost odpovědět.

Minesweeper v Factoriu

Pokud někoho zajímá o čem Minesweeper je, no, je to nová mapa, kde expanze se stává tím, že řešíte minesweeper problém (problém minového pole). Aby jste odstranili minu, pec se na ní musí položit. Když pec položíte na čisté místo, spustí se exploze. Když šlápnete na minu, stejný výsledek. Chyby vás budou stát, protože vypustí kousače a nukleární exploze. Hráči také mohou vydělat (nebo ztratit) body, záležící na tom, jak dobří jsou, a mohou se poté porovnat k ostatním hráčům zkrz tabulky skór, která má přehled důležitých internetových bodů.

COMFY je jedna z primárních Factorio multiplayer skupin a pár z našich výtvorů jsou Mountain Fortress (Pevnost v Hoře), Biter Battles (Bitvy s kousači), Chronotrain (Chronovlak) a Cave Miner (Horník Jeskyně). A brzo, velmi brzo to bude obsahovat mapy o pirátech a plachtící lodě! Zůsteňte naladěni pro to.

Můžete se připojit do COMFY komunity s více než 3500 uživateli na našem Discordu.

Odpočet skončil

Přispívání

Jako vždy, hledáme lidi, kteří chtějí přispívat k Alt-F4, buď to je přidáváním zajímavěho článku nebo překladem. Pokud máte něco zajímavého na mysli co by jste chtěli sdílet s komunitou v hezkém způsobu, toto je ideální místo kde o tom diskutovat. Pokud si nejste moc jisti o tom, rádi pomůžeme s diskuzí nápadů o obsahu a strukturování otázek. Pokud to zní jako něco zajímavého, připojte se na Discordu aby jste začali!