V Travianu to funguje následovně:
Uživatelské rozhraní funguje jako generátor dat, která se ukládají do DB.
Pak jsou tam "procesory", které události zpracují.
Jedná se o následující procesory:
- stavby a obchod
- bitvy
Vyšleš vojáky do vesnice X, ve chvíli vyslání se do budoucnosti naplánuje událost útok.
Spolu s tebou vyšle do vesnice X vojáky pět tvých kamarádů tak, aby dorazili ve stejnou vteřinu jako ty.
Někdo jiný vyšle do vesnice X posily, ve chvíli vyslání se do budoucnosti naplánuje událost přišla posila.
Máš tedy naplánované události:
- útok: 0:51 vteřin
- útok: 0:51 vteřin
- útok: 0:51 vteřin
- posila: 0:51 vteřin
- posila: 0:51 vteřin
- posila: 0:51 vteřin
Plánovač, tedy procesor, prochází DB a počítá si děj.
Nastala 0:51
- vezme všechny posily, narve je do města
- vezme všechny útoky, spojí je dohromady a pak nějak vygenerují výsledek
- výsledek se zapíše do DB, s uživatelským UI se vůbec nespojuje, tam se zobrazí až při příštím refreshi
Původně, někdy v roce 2002?, kdy jsem hrál travian poprvé, to všechno bylo velmi jednoduché.
Dokonce docházelo ke stavům, že procesor útoků nestíhal a pak jsem viděl červeně, že nastal útok třeba minutu, než přišel výsledek.
Ze začátku taky nešlo tuším kumulovat útoky, to přišlo až později.
Ale o co jde, ve stejnou vteřinu nastává jen minimum údálostí.
Pokud prioritně vyřešíš boje mezi hráči, tak ostatní eventy mohou počkat.
Hlavně musíš korektně vyřešit plánovač.
Plánování délky chůze nesmíš generovat na klientovi, jinak budou lidi cheatovat s instatnním útokem napříč mapou.
Travian je megajednoduchá hra, kterou by měl zvládnout naprogramovat šikovnější středoškolák.
Velkou výhodou je, že například produkci farem může počítat klient a nemusíš jí počítat ty.
Tedy, ty tu produkci počítáš taky, ale počitadlo jeho počitadlo zobrazuje neustále aktuální stav.
Ovšem ve chvíli, kdy začne něco stavět, vezmeš to ze stavu, který počítáš ty, aby nešvindloval.
Navíc Travian je ohromná řada malých funkcí, které nejsou vzájemně provázané, takže můžeš postupně udělat stavění vesnice, pak přidat produkci farem, pak přidat útočení, jednotlivé věci nejsou přímo propojené, přesněji řečeno můžeš stavě baráky a přitom se nemusíš zabývat tím, jestli tam někdy nějací vojáci budou.
Prakticky nemušíš analyzovat nic, co jde paralelně.
Představ si, že bys stavěl třeba nějakou zeď, kteár ti má zlepšit obranu vesnice.
Co se stane, pokud ty jí v útoku nezohledníš, protože ještě neproběhl event upravující obranu vesnice?
Nic, hráč ti nic nedokáže!
Stejně tak ti nedokáže nic, pokud ti bude blbě počítat vyhodnocení bojů, bude nasranej, přemejšlet, proč to tak dopadlo, ale pokud zrovna jeho tisíc vojáků neporazí jeden panáček, tak nad tím nasraně mávne rukou.
Je to o tom, že při vyslání vojáků stanovíš target.
Plánovač si periodicky zjišťuje, kam ty útoky jdou.
Select * from utoky where target=vesniceX
Na základě nalezení události vytvoří plán provedení tak, aby nejprve proběhly události v čas 0.50, pak 0.51 a nakonec 0.52
Je to o tom, abys nemusel každou vteřinu vyhodnocovat, jestli na každou vesnici nejde útok.
A to, jak si data při útoku srovnáš, jestli jednotky sečteč nebo ne, to je vedlejší.