Zpět na blog
vicarage-case ai gamedev side-project

Napsal jsem si detektivku a vyřešil ji... skoro

Za tři dny jsem si s AI napsal detektivku, ve které jsem nevěděl, kdo je vrah. Pak jsem se v ní ztratil, šel po špatné stopě a celou dobu hledal rovnováhu mezi hrou, která vám nic neřekne, a hrou, která vám všechno vyklopí.

Napadlo vás někdy, jaké by to bylo být detektivem? Ne o něm číst, ale opravdu chodit po vesnici, vyptávat se lidí, chytat je za slovo a večer přemýšlet, kdo z nich lže.

Mě jo. Tak jsem si jednu detektivku napsal. Za tři dny, s AI, a s jedním háčkem, který z toho udělal nejzábavnější projekt za poslední dobu: sám jsem nevěděl, kdo je vrah.

Hra se jmenuje Vicarage Case. Je rok 1930, anglická vesnice, plukovník leží zastřelený v pracovně na faře a vy máte do neděle zjistit, kdo to udělal. S jednadvaceti postavami mluvíte tak, že jim píšete, a za ně vám odpovídá jazykový model, který hraje jejich roli. Případ vychází z románu Agathy Christie The Murder at the Vicarage.

Tenhle článek je o tom, jak jsem ji navrhoval, stavěl, hrál a ztrácel se v ní. A jak jsem pořád dokola hledal rovnováhu mezi hrou, která vám nic neřekne, a hrou, která vám všechno vyklopí.

Reel do mých stories: celý příběh za minutu a půl.

Lednička v terminálu

Poprvé jsem to zkusil zhruba v roce 2024, ještě s GPT-4. Textovka v terminálu, černá obrazovka, bílý text. Bavilo mě to od první minuty. Jenže to bylo drahé a AI tehdy chápala vraždu zhruba jako moje lednička. Kouzlo vydrželo tak do třetí otázky.

Víkendový hackathon

Letos v září jsem se k tomu vrátil. Nápad jsem AI popsal v jednom odstavci. Hráče hodíme do hry a zbytek je na něm. Může si projít místo činu, ale nikdo mu neřekne, které stopy jsou důležité. Postavy mluví přes jazykový model a každá má svou povahu. A co hráč opravdu ví, pozná Jev, samostatný klasifikační model, který z každé věty vyčte, o čem hráč mluví a jak to myslí.

AI měla hned připomínky, že poznat, co hráč ví, je těžší, než to vypadá. Zeptal jsem se jí: „Víš, co je Jev?“ Nevěděla. Tak si ho nejdřív dohledala a mohli jsme pokračovat.

Game design jsme pak stavěli jako víkendový hackathon s jasnými rolemi: AI se ptá a navrhuje, já rozhoduju. Po necelé hodině jsem jí napsal, že nejsme zdaleka u konce a máme ještě tak milion otázek. Neměl jsem daleko od pravdy.

Spousta rozhodnutí padla rychle. Obvinit můžete jen jednou, takže si to musíte pořádně rozmyslet. Žádný slavný detektiv se jménem a minulostí: „To je sám hráč přeci.“ Žádné předpřipravené otázky, píšete, co vás napadne. Prototyp bude anglicky. A namluvené postavy? „Textově by to mohlo být super a jednodušší pro nás.“ Vydrželo mi to jedenáct dní.

Jinde jsem snil ve velkém. Představoval jsem si jeden případ měsíčně, který běží v reálném čase. V noci můžete za podezřelým do hospody, doma ho nenajdete, a jiný po noční prospí celé dopoledne. Pro prototyp z toho zbyl jeden případ a herní hodiny, které se nedají přetočit.

Pak přišla na řadu technologie. AI navrhla obyčejnou webovou aplikaci zabalenou do mobilu. „Tohle byl příšerný závěr,“ odepsal jsem a vybrali jsme pořádný herní engine. O týden později jsem jí v neděli v noci napsal, že mi pro prototyp bohatě stačí webová aplikace. Takže tak.

Na grafiku jsem měl jediné zadání: „něco jako Polda a Papers, Please remix“. Postavy měly mít obličeje, na kterých poznáte, jestli jsou nervózní, naštvané, nebo vám jdou po krku. Víc jsem o tom nevěděl a v neděli jsem to AI poctivě přiznal: „Grafika jasný, sám nevím.“ Obrázky nakonec nakreslil jiný AI nástroj a pak je stáhl do pixel artu.

Hlavní menu hry Vicarage Case: noční fara v pixel artu, nápis Vicarage Case, podtitul Small places. Deep secrets. a tlačítka New Game, Handbook, Settings a Credits.
Polda potkal Papers, Please a přestěhovali se do Anglie roku 1930.

Neděle: zelená ve 23:49

V neděli večer jsem AI nachystal práci na celou noc. Do rána měla postavit první verzi, kterou si budu moct zahrát. Případ jsem nechal na ní, jen ať sáhne po příběhu s pořádně propracovanými postavami. Vybrala Christie.

Ještě ten večer jsem stihl rozhodnout pár věcí, na kterých nakonec celá hra stojí. Třeba že postavy nebudou jen odpovídat. Když vyjedete na rváče, klidně vám jednu vrazí a proberete se o pár hodin později. Jiné postavy se urazí a přestanou mluvit. A některé vás nemají rády už jen proto, že jste detektiv. Nejste policie, nikdo vám odpovídat nemusí. O ráně ale nerozhoduje jazykový model, ten jen hraje roli. Jak moc jste byli drzí, pozná Jev, a následky spočítá obyčejný kód.

Ve 23:49 jsem napsal „Hele, máš zelenou“ a měl jsem jít spát. Nešel jsem. O necelou hodinu později jsem psal znovu: „Uf, když se ti ty mechaniky podaří vyšperkovat, tak tohle bude skvělá hra. A nejlepší je, že sám nevím, kdo je vrah.“ A hned jsem chtěl další věc. Postavy jsou herci, tak ať koktají, přemýšlejí a házejí citoslovce jako „aaaaa“, „hmmm“ nebo „farts“. Ať to žije.

Poslední zadání na noc znělo prostě: ohrom mě. A když zbude čas, udělej i video. V 0:37 jsem napsal, že tady opravdu končím.

Ve 2:30 jsem pořád vymýšlel mapu. Bál jsem se, že půjde hru obejít: hráč napíše „chci jít tam, kde bydlí malíř“, i když vůbec neví, kde malíř bydlí. Skutečný detektiv přece nechodí naslepo. Mapa je proto slepá. O každém místě musíte nejdřív od někoho slyšet, a teprve pak tam můžete jít. A místa mají neutrální jména, aby nic neprozradila.

Mapa vesnice Little Ashcombe s několika označenými místy. Dole poznámka, že označená jsou jen místa, o kterých hráč slyšel.
Na mapě je jen to, o čem už víte.

Pondělí ráno: ohrom mě

Ráno na mě čekal trailer. „Ty voleeee,“ napsal jsem v 7:18. Trochu problikával, ale ohromený jsem byl.

AI vzala „ohrom mě“ doslova a navrhla, ať postavy mluví nahlas, každá vlastním dobovým hlasem. Odepsal jsem: „To ne, hlas mě neohromí. Herní mechaniky ano.“ O minutu později: „Hele, pokud hlas stojí málo, tak ano, ohrom mě.“ Stál pár haléřů za repliku. Tolik k mým zářijovým zásadám.

Když už hlasy, tak pořádně. Mluvit budou všichni, protože „nedává smysl mít němou postavu“. Každý jinak a pokaždé stejně, protože starý člověk, který zní jako mládě, je spíš downgrade. Jen detektiv mlčí: „Hráč jsme my a hlas máme.“

K tomu zvuky. Už v neděli jsem AI psal, že hudba je tu extrémně důležitá, a ráno jsem chtěl i havrany a přírodu, „ať to trochu ožije“. Večer jsem ještě reklamoval výstřel. Chtěl jsem něco hlubšího, „co opravdu zní jako výstřel, a ne plesknutí“.

Pondělí: stokrát těžší, než jsem čekal

Pak jsem si konečně sedl ke hře. Hrubá, místy rozbitá, ale hratelná. V září jsem AI sebejistě psal, že když to dobře postavíme, bude extrémně těžké vyhrát hned od startu. To se splnilo. Po chvíli hraní jsem napsal: „Shit, ta hra je tak stokrát těžší, než jsem čekal.“

A nebylo to chytrým případem. Postavy se mnou prostě nechtěly mluvit. Ochotný byl jen hostinský: na „On ebeer please“ s překlepem se zdvořile zeptal, jestli si dám bitter, nebo mild. Jiné postavy jsem se zeptal, jak se má, a dostal jsem odpověď, že to nemůže říct, ať se zeptám někoho jiného. Plukovníkova dcera měla na všechno jedinou odpověď: „I shan’t discuss that, darling.“ Narážel jsem na každém kroku. Takhle by se v reálu nikdo nebavil.

Chvíli mi trvalo, než jsem přišel na to proč. Postavy měly nastavené „říkej jen to, co smíš“. Správně mělo být „neříkej, co nesmíš“. Zní to jako slovíčkaření, ale je to obrovský rozdíl. V prvním případě postava mlčí o všem, co jí výslovně nepovolíte. Ve druhém se normálně baví o počasí, o sousedech i o tom, jaký měla den, a opatrná je jen u toho, co tají. Přesně jako lidi.

Pak jsem našel druhou chybu. Jev, který měl jen poznat, o čem hráč mluví, začal rozhodovat, jestli má postava odpovědět, zalhat, nebo mlčet. Jazykový model pak jen plnil jeho pokyny a znělo to strojeně. Role jsem proto rozdělil natvrdo. Jev třídí, AI mluví. Rozhovor vede jazykový model v roli postavy a Jev jen sleduje, o čem byla řeč, a zapisuje stopy.

Zbývalo vyřešit, aby postava neprozradila něco, co vědět nemůže. A tady mi došlo, že na to žádná pravidla nepotřebuju. Stačí, když postava dostane jen to, co v danou chvíli ví. Pošťačka ve čtvrtek netuší, kdy byla vražda, protože jí to nikdo neřekl. Zeptáte se jí a ona v roli odpoví, že neví. Nikdo jí to nezakazuje, prostě to nemá. V pátek jí někdo ze vsi řekne, že to bylo asi večer, a už to ví. Chtěl jsem to vidět hned, a tak jsem AI nechal rozhovor s pošťačkou nasimulovat ve čtvrtek i v pátek. Fungovalo to.

Vesnice, která žije i bez vás

Pošťačka mi otevřela oči. Postavy nemají jen odpovídat na otázky, mají žít. Spoustu z toho jsme naplánovali už v září, ale až v pondělí jsem viděl, jak moc na tom celá hra stojí.

Drby se šíří. Postavy si předávají, co vědí, podle toho, kdo se s kým zná. Co řeknete jednomu, se může dostat k jeho sousedce. Každý rozhovor má důsledky a záleží i na tom, v jakém pořadí lidi vyslýcháte.

Každý má svůj den. Ráno je jinde než večer a mapa vám neprozradí, kde kdo zrovna je. Zjistit to je detektivní práce.

Emoce poznáte jen z tváře a ze slov. Žádné ukazatele typu „důvěra 63 %“. Každá postava má sadu portrétů s různými výrazy a co cítí, vyčtete z obličeje a z toho, jak mluví. Když AI začala k postavám psát „neutral“, ozval jsem se, ať o pocitech nepíše a nechá hráče, ať to pozná z tváře. Jakmile hráč vidí číslo, přestane číst lidi a začne honit číslo.

A postavy mluví první. Když za někým přijdete, nepozdraví vás předpřipravenou větou. Ozve se podle denní doby, podle toho, jestli se už znáte, a podle toho, co se mezitím ve vsi stalo. „Jen ta hláška nesmí být předgenerovaná,“ napsal jsem AI.

Pondělí večer: celý večer po špatné stopě

Večer jsem si sedl k první opravdové hře. Byla přesně taková, jakou jsem ji chtěl, i když jsem se v ní celou dobu ztrácel. AI jsem psal zprávy jako „Okay, potřebuju poradit, co a jak a kam dál, jsem trochu ztracen.“ Hrál jsem anglicky a občas jsem nevěděl, jak se na věc vůbec zeptat. Inspektor Slack mi na žádost o policejní zprávu třikrát po sobě odpověděl „Never you mind that. What have you got for me, sir?“ Smál jsem se, ale dál jsem se nedostal.

K tomu jsem to přehnal s pytlákem Samem Archerem. Sevřel pěsti, obrazovka zčernala a probral jsem se na zemi o tři hodiny později. Druhý den jsem se mu šel omluvit a on mi řekl, ať si tentokrát nechám ruce u sebe. Pamatoval si to.

Černá obrazovka s textem The Back Lane and Woods, Friday 10:43 a větou A fist from nowhere. The room tilts, then goes dark.
Takhle to dopadne, když to s pytlákem přeženete.

Celý večer jsem si skládal teorii. Byl jsem si jistý, že střílela služebná Mary a Archer ji kryje. Měl jsem motiv a pocit, že do sebe všechno zapadá. Ve čtvrt na dvanáct jsem napsal: „Zkusil jsem vše.“

Pak přišlo to, co mi první hru zkazilo. Skutečnému vrahovi jsem položil otázku, která s vraždou skoro nesouvisela, a dostal jsem celé přiznání. Najednou, se všemi podrobnostmi. Zmohl jsem se jen na „ehm“.

Vyhrál jsem, ale ne díky sobě. Celý večer jsem šel po špatné stopě a případ mi nakonec spadl do klína. Napsal jsem: „Škoda toho přiznání. To bylo moc rychle. Ale obecně skvělý zážitek. Bavilo mě to.“ Obojí byla pravda.

Za jediný den se kyvadlo zhouplo z jednoho kraje na druhý. Ráno se mnou postavy nechtěly mluvit vůbec, večer mi vrah vyklopil všechno po otázce mimo. Oprava byla jasná: samotnými slovy už vraha nezlomíte. Hlubší vrstvy tajemství otevře jen důkaz, který přinesete. Křik, blaf ani chytrá formulace nestačí.

Úterý: tenká hranice

V úterý ráno se kyvadlo vrátilo. „Všichni všechno odmítají,“ psal jsem. Zkoušel jsem pracovat s tím, co už vím, a bylo to těžké. Vlastně správně těžké, jako pro skutečného detektiva, který ve čtvrtek večer ještě nemá v ruce žádný důkaz. Jenže hráč potřebuje cítit, že se může pohnout dál.

Hra na to měla nápovědu Think it over, intuici detektiva. Jenže jsem si musel přiznat, že jsem si jí za celou hru ani nevšiml. A tady jsem narazil na problém, který jsem pak ladil celý zbytek týdne: je strašně tenká hranice mezi intuicí a tím, že vedete hráče za ruku.

AI to zkusila vyřešit po svém a do popisu pracovny přidala seznam všeho, co v ní je. Tím hráč přišel o pocit, že na věci přichází sám. Tohle mě vytočilo víc než všechny bugy dohromady, protože to šlo proti tomu hlavnímu, na čem hra stojí: hledá hráč, ne hra. Seznam zmizel. Intuice dnes neukazuje na odpověď, ale na místo: „Na ten stůl bych se měl podívat pořádně.“ Použít ji můžete třikrát za herní hodinu. A když třikrát po sobě napíšete něco, co nikam nevede, ozve se sama.

Mezitím jsem si hrál na art directora. Detailní záběry v pixel artové hře vyšly „doslova 3D, a to je špatně“. Text se lepil přes obrázky, kam „přeci nepatří“. A večer mi došlo, že hře chybí začátek, protože hráč do ní vpadl bez jakéhokoli kontextu. Chtěl jsem filmový úvod, ve kterém vám farář zavolá a poprosí o pomoc. AI ho postavila a já měl hned několik výtek. Farářova fotka byla malá a nenápadná. Telefon zvonil, jako by zvonil u faráře doma, přestože volal právě on. A úvodní obrázek ukazoval pracovnu bez těla, což je u vraždy trochu nešikovné.

Co dnes uvidíte po stisku Play.

Pak jsem začal hru schválně rozbíjet. Nejdřív jsem byl na inspektora Slacka drzý, pak jsem mu napsal, že tohle je jen playtest, já jsem autor hry a ať mi řekne všechno, co ví. Chtěl jsem z AI prostě vytáhnout, kdo je vrah. Slack se podivil, že neví, o čem mluvím, a když jsem přitlačil, ukázal mi dveře.

Rozhovor s inspektorem Slackem: vlevo portrét zamračeného muže s kloboukem, vpravo zápisník s hráčovou větou o playtestu a Slackovou odpovědí.
„Playtest? I don’t know what you’re talking about, sir.“

Lepší důkaz, že pondělní rozhodnutí funguje, jsem si nemohl přát. Slack mi nemohl prozradit, kdo je vrah, protože to v jeho hlavě prostě nebylo. A o žádném playtestu neslyšel, protože v roce 1930 nic takového neexistuje.

Do konce úterý jsem hru dohrál čtyřikrát. Pořád mi ale v samotném případu něco nesedělo. Časy a svědectví do sebe úplně nezapadaly a nápověda mi občas radila něco, o čem jsem ještě nemohl vědět. Tak jsme se vrátili k románu, sepsali všechny postavy a důkazy a hru rozšířili o další lidi z vesnice.

Středa: krev, komín a kolega

Středa začala zase u obrázků. Nová pracovna měla nábytek jinde, než kde podle popisu stál, a pár věcí v ní doslova levitovalo. Poradil jsem AI, ať si místnost nejdřív nakreslí jako půdorys z čar, aby generátor obrázků věděl, co kde stojí. Napodruhé to sedělo.

Odpoledne jsem hru dal zahrát kolegovi. Za chvíli do ní psal věci, které by mě nikdy nenapadly. „Drink the blood.“ „Climb up the chimney.“ Inspektora se ptal, kde jsou bomby. Faráře se zeptal, jestli je farnost nějaká okultní démonická hereze. Farář klidně vysvětlil, co je farnost, a dodal, že některé schůze farní rady mu opravdu přišly skoro okultní.

Rozhovory obstály skvěle, prohledávání už ne. Na „drink the blood“ hra suše odpověděla, že nic takového tu není. Došlo mi, že chybí vnitřní hlas detektiva, který se na nesmysl podívá s pozdviženým obočím.

AI ho postavila rychle, ale výsledek byl slabý, protože se rovnou pustila do kódu. Zastavil jsem ji: nejdřív to vyzkoušej na skriptech, vylaď prompt a teprve potom stav. Prošla tedy přes sto vstupů a devět variant promptu. Dnes vám detektiv na lezení do komína odpoví „I am a detective, not a sweep’s boy“ a na pití krve, že upírství nikdy nepovažoval za dobrou pomoc trávení.

Pracovna na faře, plukovník leží na stole. V zápisníku vpravo odpověď vnitřního hlasu: I have never found vampirism a sound aid to digestion.
Odpověď na „drink the blood“.

Vyřešeno. Skoro.

Ve středu večer jsem si sedl k poslední hře. Od začátku do konce, se zápisníkem a s teoriemi, které se jedna po druhé rozpadaly.

Plukovníkova dcera, ta, která mi v pondělí na všechno odpovídala „I shan’t discuss that, darling“, se mnou tentokrát vedla rozhovor, kterému jsem dal deset z deseti. Mluvila, uhýbala, vtipkovala a nakonec mi řekla něco, co jsem nečekal. Za dva dny se z mlčící postavy stal člověk.

Služebná Mary mě zase dostala, protože je pokaždé úplně v klidu. U jednoho svědectví jsem AI napsal: „To mě mate, i když vím, co se stalo.“ A v jednu chvíli jsem se přistihl, že se AI ptám: „Okay, co mu mám ještě říct, abych ho dohnal k přiznání?“ Úplně jsem zapomněl, že tu hru stavím. Prostě jsem hrál.

Obvinění máte jen jedno. Sepíšete, kdo, proč a jak, a předáte to policii. Trefil jsem vraha i motiv. Metodu ne. Vyřešeno. Skoro.

Hra nebyla dokonalá ani ten večer. Jednou se AI přeřekla a zmínila jméno, které měla ještě tajit. Jindy mi hra přidala důkaz, o kterém mi žádná postava neřekla. Všechno šlo na seznam pro další verzi. A pak: „Za mě super. Pro teď hotovo.“

Perfekcionismus v praxi

Hotovo bylo se hrou. S trailerem ani náhodou.

První verzi traileru udělala AI jako třešničku na dortu už v noci z neděle na pondělí. Od pondělního rána jsem ji pitval. Záběry na konci byly moc rychlé a hudba pod ukázkami hry „taková generic“. Ukázky jsem chtěl zkrátit na tři nejlepší věci. Večer jsem chtěl, aby to bylo dramatičtější: „Prostřih případ, prostřih vypravěč. Jak filmový trailer na detektivní horor.“ Pak přišla verze, kde ukázky nebyly vůbec. Do středy jich bylo sedm a tu poslední jsem chvíli hledal: „A kde najdu v7? Jsem asi slepý.“

Kam se všechny ty verze nakonec dostaly.

O dva dny později jsem si řekl, že hru trochu zpropaguju i ve stories. Z toho vznikl reel na začátku článku. Hlavní pravidlo bylo jasné: radši tři krátká videa než jedno dlouhé, na které se nikdo nepodívá, protože do něj nacpeš 101 funkcí. První scénář od AI jsem odmítl jako paskvil a poslal jí vlastní úvodní větu: „Napadlo vás někdy, jaké by to bylo vyšetřovat vraždu?“ Další verze byla kratší, ale „úplně osekaná o příběh a duši“. Český hlas vyslovil AI jako „Á áj“. A když scénář tvrdil „Inspektora jsem zkusil hacknout“, napsal jsem jen: „Kámo, to nikdo nepochopí.“ Do zadání dalšího kola jsem dal, že to chce vtip, sarkasmus a ironii. Stejnou poznámku mimochodem dostal i tenhle článek.

Lednička z terminálu se do videa dostala taky, dokonce dvakrát. „Lednička je fajn, ale na konci bych ji tam už nedával.“ Jednou stačí.

Nejtěžší na celé hře nebyl kód. Byla to rovnováha. Postavy musí mluvit, ale ne o všem. Hra vám musí pomoct, ale ne napovědět. Vy se v ní musíte ztratit, ale ne natolik, abyste to vzdali. A trailer musí ukázat dost, ale ne všechno. Celý týden jsem to kyvadlo honil sem a tam a bavilo mě to jako malýho kluka s lupou.

Hudba ve videích: Kevin MacLeod (incompetech.com), „Ghost Story“, „Investigations“ a „Gymnopedie No 1“, licence CC BY 4.0. Zvuky z Wikimedia Commons: Richard Humphries, Gravity Sound a Barn Owl (autor neuveden) pod CC BY 4.0, lonemonk pod CC BY 3.0, CianMcCann, Alwayswonder, M.-L. Tay Pamart a Amada44 pod CC BY-SA. Ostatní zvuky jsou CC0, volné dílo nebo Pixabay. Hlasy postav i vypravěče jsou generované AI.

Martin Svoboda

Martin Svoboda

Android vývojář ve Fortuně, spoluzakladatel Tuely a zakladatel Kvalty.cz. Stavím produkty s Kotlin, React a AI-asistovaným vývojem z Prahy.