Alt-F4 #53 - Lenost srkz automatizaci 26-11-2021
přeložil oof2win2
Pro exkluzivní 53. vydání Alt-F4, velmistr Therenas se vrací, aby nás poctil s dalším článkem. Pokračující s jeho minulými mistrovskými díly, která mluví hlavně o jeho vlastních módech, zde je více slov o stejných tématech. Tyto slova zkoumají jak automaticky sbírat screenshoty v Factoriu. Musím ale varovat, jsou to 20% technických detailů, 40% filozofických otázek a 50% špatných vtipů. Čtete správně, sčítá se to do 110!
Lenost zrkz automatizaci Therenas
Často mám problémy děláním screenshotů pro své módy. Je poměrně dost práce sestavit scenário, kde mód vypadá dobře a zárověň to vysvětluje hlavní koncept módu v vizuálním způsobu. Můj názor je, že mnoho módů nemá moc dobrých screenshotů, a není to protože autory módu to nezajímá, ale je prostě moc těžké vytvořit dobré fotky. Musí se do toho dát hodně úsilí s limitovanou možností ‘jazyku’, i když je obrázek hoden tisíc slov.
Tak, i když to znělo poměrně fňukavě (což to je), opravdový problém není dělání fotek samotných. Je docela vpohodě nad nimi ztrávit pár hodin, poté co jste na módu samotném strávili pár desítky nebo i stovky hodin. Doopravdový problém je aktualizace fotek. Každý změna v módu by ideálně měla být ukázána v screenshotech, jejich aktualizace mi ukazuje způsob péče o mód. Možná jsem pouze puntičkář.
Jak často musí být aktualizované je na samotném módu. Pokud jste Bottleneck a věci se často nemění, screenshoty nebudou staré. Pokud jste ale poměrně komplexní GUI mód, u kterého se každých pár vydání mění GUI, je to docela důležité. Ideálně pět minut ztrávených na UI by mělo být doprovozeno aktualizací screenshotů, ale to by vás nutilo dělat screenshoty déle než práci samotnou. Toto nikdo nechce dělat, a proto jsou screenshoty časem staré.
Dále s tímto efektem je docela zlý cyklus lidksé psychologie. Pokud víte, že screenshoty budou muset být aktualizovány každou druhou aktualizaci, řeknete si, že je nebudete aktualizovat, pouze tentokrát. Příští aktualizace stejně bude mít nové změny, tak proč aktualizovat teď, vždýť to je ztráta času. Ale až když nová aktualizace přijde, stejná psychologie vás donutí znovu prokrastinovat. Pouze tentokrát. Toto se poté opakuje do nekonečna.
Možná jsem pouze extrémně líný a většina lidí s tímto nemá žádné problémy. Prostě aktualizují jejich screenshoty na regulérní bázi, a proto budou většinu času správně. Ale já ne. V praxi, dovedlo mě to k aktualizaci screenshotů zhruba každých šest měsíců, když už. A vůbec, otravovalo mě, když nebyly aktualizovány, ale tendence říst ‘Udělám to příště’ byla přemohující a mnohem lehčí, než práci doopravdy udělat.
Pořád jsem ale chtěl řešení. Potřeboval jsem řešení, pokud jsem chtěl opravit svou nutkavost mít aktualizované screenshoty. Nápad, že bych pracoval na sobě jako člověkovi, nešel dál než mumlání, to budu dělat příští týden. Zdálo se, že automatizace byla slíbená zem, jak se často stává.
Již jsem automatizoval procesy týkající se vývoje módů, například proces balíčkování nových vydání a mikromanagement, který se toho týkal. V tomto případě to ani nebylo protože bych nechtěl dělat chyby pro všechny mé vydání (169 a počítající pro Factory Planner), bylo to spíše o prevenci chyb při tomto procesu, který by mohl dovést k rozbitým verzím u uživatelů a tak dále, což by bylo poměrně špatné.
Už se dostaň k screenshotování!
Jo, jo, dostaňme se k zábavné části. Můj nápad byl napsat Pythonový skript, který by spustil Factorio do mého vlastního scenária, který poté sám dělá screenshoty (pro což Factorio naštěstí má dedikované API), po čemž skript vloží screenshoty do správné složky a možná je trochu ořeže. První část je docela lehká, musím pouze zjistit jaké commandlinové argumenty jsem potřeboval, dostat je dohromady, a scenário již běželo. Zatím docela snadné.
Samotné scenário je ale trochu komplikovanější. Abych mohl brát užitečné screenshoty, musel jsem sestavit několik GUI v několika fázích, které by ukazovaly funkcionalitu, kterou jsem chtěl ukázat. Dělání tohoto pro entity na mapě je mnohem jednodušší, protože můžete již využít API, které by jste při modování Factoria stejně užívali. Pro GUI, které jsou světem samotným, musíte ale přijít na kloub jinému systému.
Největší problém je, že nejste schopni simulovat doopravdové klikání uživatele na vaše rozhraní. Hra nemá žádné API metody pro toto, protože to není nutné pro žádný mód. Co toto ale znamená, je, že musíte sami simulovat klikání myší. Toto je poměrně nešikovný způsob jak to dělat, protože pokud nedesignujete svůj mód od začátku, aby takto pracoval, nebo není velmi dobře strukturován, budete buďto muset přepsat váš snímač eventů, nebo využít poměrně zajímavé metody. Asi můžete vědět, jakou metodu jsem zvolil.
Poté co jsem vyřešil metody, které jsem chtěl využít, celá tato kontrapce šla tak daleko až do zapnutí hry, nastavení interfacu pro zajímavé scenário, a začatí snímání fotek pro různé části UI. Musím poznamenat, že toto je poměrně nevyspělé řešení, a nejspíš se rozbije pokud budete měnit rozložení vašeho módu. V tomto scenáriu ale není moc alternativ, tak toto budu muset vydržet. Je mnohem větší zábava vytvářet hordy špagetykódu než manuální sběr screenshotů znovu a znovu, takže to je výhra jakýmkoli způsobem.
Byl jsem docela šťastný s tím co jsem již udělal, stále to ale nebyla maximální automatizace. Pořád byla událost ořezávání screenshotů na menší velikost. Mnoho dialogů z módu Plánovač Továren je relativně malých, a hra v pozadí by byla pouze rozptylem. Mohl bych je ořezávat manuálně, ale nechtěl jsem. Byl jsem trochu líný. Měl jsem v pozadí hlavy potenciální řešení, ale potřebovalo by trochu špinavé práce.
Hlavní nápad byl, poté co scénário dodělalo bratí fotek, také snímat velikost dialogů, kde fotky byly brány. Tato metadata poté mohla být také poslána do souboru, a Pythoní skript by je poté mohl využít na ořezání screenshotů na správnou velikost. Toto zní jako skvělý nápad v teorii, ale dostanete se do maličkatého problému v realitě: hra vás nenechá číst dimenze GUI oken, pouze je zapisovat.
Toto je zakázáno z dobrého důvodu, protože tyto dimenze nejsou vždy deterministické, protože jiné jazyky hry mohou měnit velikosti různých elementů. Čtení a využití těchto nedetministických hodnot v multiplayer hře by mohlo vést k desynchronizacím, což by nechalo mód nekompatibilní s multiplayerem, a také s znovuhrou. Zní to jako slepá ulice. Byl jsem nucen manuálně ořezávat fotky? Nakonec ne.
No, nebyl jsem schopen rozchodit, že čtení dimenzí potenciálně šlo k desynchronizacím, to je prostě jak hra funguje v základech. Nehrál jsem hru ale v multiplayeru abych tyto screenshoty sbíral, a je to tak, že jste schopni spustit hru v speciálním režimu, pojmenovaném Instrumentální Režim, který kompletně vypne multiplayer a zapne nějakou netestovanou funkcionalitu. Zní to jako perfektní místo, kam bych mohl přidat super-tajnou funkcionalitu, která mi dá přístup na zakázanou znalost dimenzí obrazu. Tak jsem se rozhodl, že to přidám. Práce pro Wube ve finále má své výhody.
Po několika dnech, co jsem přidával hacky, monstrum nakonec zařvalo, a plně automatický způsob braní screenshotů pro mě byl zrozen. Vypadá to, plně automatizovaný způsob ale není zprávný. Nakonec to není plně automatizováno. Ovšem že není. Proč bych měl být plně šťastný? Jsou dva kroky, které budu muset dělat sám.
První krok je vypnutí hry, poté co screenshoty jsou brány, aby Pythoní skripty mohly pořád běžět dále. Je to tak, že Factorio mód není schopen vypnou Factorio na plochu. To je kompletně pochopitelné, aby se zabránilo zneužití, i když by to byla hezká možnost v instrumentálním řežimu. Přesto, zmáčknutím kláves Alt-F4 (ping) v správném čase, je něco co nejspíše jsem schopen sám dát. Jedna z mých nekalých myšlenek byla metoda schození Factoria chybovou hláškou, ale problém je, že tyto chyby jsou velmi rychle opraveny.
Druhá věc je upload těchto svěžích fotek na Factorio módový portál. Zatím neexistuje správné API na manipulaci portálu tímto způsobem, tak v tomto mám smůlu. Prozatím budu muset manuálně otevírat browser, smazat staré screenshoty jeden po jednom, a nahrát nové jeden po jednom. Jaká tragedie! Možná ale existuje myšlenka pro API jako takové v budoucnosti, uvidíme.
Mimo tyto dvě věci, jsem docela spokojen s tím, jak toto skončilo. Myslím si, že džus stál za moštování, vzhledem k tomu, že jsem schopen hrát si s benefity tohoto skriptu do nekonečna. Výhra automatizace: Nekonečné zisky. Aspoň do té doby co se to poprvé rozbije, což nejspíše bude velmi brzy. No jo no.
Přispívání
Jako vždy, hledáme lidi, kteří by chtěli přispět do Alt-F4, ať už příspěvem článku, nebo pomáháním s překlady. Pokud máte něco zajímavého na mysli a chtěli by jste se podělit s komunitou upraveným způsobem, toto je místo, kde můžete učinit. Pokud si nejse úplně jisti o tom, rádi vám pomůžeme diskuzí nápadů a strukturací otázek. Pokud se vám to líbí, přidejte se na Discord aby jste začali!