• Vážení hráči, Dne 30.4.2024 (úterý) bude hra aktualizována na verzi 2.311. V důsledku toho se do hry nebudete moci po určitou dobu přihlásit. Níže naleznete podrobný seznam změn. Děkujeme za pochopení. Více informací najdete na herním fóru

Devblog Vánoční mír - devblog

  • Zakladatel vlákna DeletedUser12305
  • Vytvořeno

DeletedUser12305

Guest
Proč nebyl vánoční čas tak klidný...

Vážení hráči,

jak si pravděpodobně mnozí z vás všimli, náš mír letos do hry moc klidu nepřinesl. A bohužel se to nestalo v historii Grepolisu poprvé, takže tento blog je zaměřen na vysvětlení toho, proč je doba míru pravidelně problémová, co se letos pokazilo a co zlepšíme do budoucna.

Doba míru opět nefunguje správně?

Grepolis má v souvislosti s obdobími míru bohatou historii - ale letos bylo něco jinak! Zatímco jsme měli potíže s logikou a kontrolami zvláštních případů v dávné minulosti, poslední doby míru měly stále spoustu problémů, protože nebyly řádně nastaveny. A skutečně, systém pro nastavení "míru" byl velmi pomalý, naši komunitní manageři nemohli skutečně plánovat a vše se muselo na každém světě nastavovat ručně, takže tento postup byl trochu předurčen k neúspěchu (opomenutí zaškrtnutí zaškrtávacího políčka pro jeden ze světů, zapomenutí číslice pro určení času...). Toto vše je důvodem, proč jsme přepracovali mechaniku pro nastavení míru tak, aby se dala použít stejná, jakou využíváme pro herní události (jako například nedávné kolo štěstí).

Proč jsme stále měli problémy? Něco jsme pokazili během předělávky? Netestovali jsme dostatečně?

V průběhu přesunu systému jsme napsali spoustu testů, které byly prováděny automaticky (známé jako testy integrační a jednotkové), abychom zajistili funkčnost mechaniky, ale zejména množství pokrytých scénářů, se kterými bylo v minulosti mnoho problémů - včetně těch, které selhaly letos. A všechno prošlo. Samozřejmě jsme také ručně testovali časy míru, tedy jsme vlastně nasimulovali Vánoce na našich interních serverech a i tady vše fungovalo.

Počkat, cože? Tak co se pokazilo?

Abychom to vysvětlili, ve zkratce musím vysvětlit, jak Grepolis pracuje na pozadí. Grepolis je hra, kde náš "Backend" (program, běžící na našich serverech, např. řízení probíhajících akcí apod.) běží pod PHP, takže "nejede" stále, ale musíme "sestavit" hru s každým požadavkem od vašeho prohlížeče, aplikace nebo našeho systému (např. při dopadu útoku). Jak si můžete všimnout, Grepolis je velmi komplexní hra, takže na každé sestavení je potřeba nějaký čas. Abychom toto vylepšili (a také dosáhli kratších dob odezvy) používáme mnoho technik, přičemž jednou z nich je ukládání dat do tzv. cache. To již nejspíše znáte z vašeho webového prohlížeče, kdy si prohlížeč pamatuje např. obrázky, takže při dalším otevření stránky se nemusí nahrávat celé znovu. Vlastně děláme to samé, především s naším happening systémem (myšleno systém, který používáme pro události ve hře, které jsou druhem speciálních happeningů).

Idea je: Proč bychom se měli ptát databáze (místo, kde ukládáme veškeré informace o hře) jestliže již o něčem víme, když dotaz na databázi je "drahý" (stojí čas), takže se pokoušíme zapamatovat oodpověď, kterou již známe.

Dobře, ale co to vše má společného s problémy, které jsme zaznamenali?

Jen pro připomenutí problému: 24 hodin před začátkem míru nemělo být možné odeslat kolonizační lodě do jiných měst (tedy nemělo být možné dobýt město, pokud lodě již nebyly na cestě).

Abychom zajistili dodržení tohoto pravidla (a spousty dalších), máme seznam kontrol, které musí proběhnout, když se hráč pokouší odeslat útok - a ten bude odeslán pouze v případě, že nebylo žádne pravidlo porušeno.

A tady přichází problém: při odeslání útoku nejdříve zjistíme, zda nebude v čase dopadu mír (říkejme tomu timestamp1) NEBO o 24 hodin později - a to pouze v případě, že je spolu s útokem poslána i kolonizační loď (timestamp2).

A zde přichází problém s ukládáním do mezipaměti: Již jsme nahráli a uložili data o míru pro timestamp1. Když probíhala druhá kontrola, mezipaměť si myslela, že již data o míru zná - takže pokud by tu byl nový čas mezi timestamp1 a timestamp2, hra by o tom nevěděla.

Dobrá, to chápu - ale jak tedy mohly testy proběhnout úspěšně?

Tohle je právě důvod, proč řešení trvalo tak dlouho (začali jsme s opravami 23. prosince ve 21.00 a fix jsme měli až 24. prosince v 1.00. Problém je ten, že ukládání do mezipaměti jsme na testovacím systému měli vypnuté, protože nepotřebujeme posílit výkon, ale na druhou stranu chceme zjednodušit proces testování (toto téma nebudu hlouběji rozebírat). Takže přesto, že jsme opravdu hodně testovali, netestovali jsme za podmínek skutečné hry a to je rozhodně naše chyba, o tom není pochyb - a je nám to nesmírně líto!

Jej, chyba opravena, ale pak jsme udělali další botu :(

Abychom snížili dopad chyby na vás všechny, napsali jsme skript, který měl zkontrolovat všechny jedoucí útoky, obsahující kolonizační lodě A všechna probíhající dobývání, abychom viděli, kdy byly útoky odeslány.

Zrušení probíhajících útoků: fungovalo jako kouzlo. Zrušení probíhajících dobývání: už tak moc ne - a opět se za to velmi hluboce omlouváme. Logika našeho opravného skriptu byla asi taková: Najdi všechna dobývání, zkontroluj kdy byla zahájena, spočítej dobu trvání cesty z původního města do města dobývaného a zkontroluj, zda byl útok v pořádku. Až sem bylo vše v pořádku - až na jeden problém: při výpočtu času zahájení dobývání (to se bohužel nikde nezaznamenává), jsme museli vše spočítat zpět od času, kdy by bylo dobývání úspěšně dokončeno (tyto údaje se ukládají) a odečíst tolik hodin, kolik dobývání na daném světě trvá. Problém byl tento: Na většině světů byla hodnota 0.

Proč 0? Vždyť nemáme žádné světy s okamžitým dobytím?! 0 značí výchozí nastavení, které znamená, že bychom měli 24 hodin vydělit rychlostí světa. Byly už 4 ráno, když jsme skript spustili (nasazení do hry zabere nějaký čas a samozřejmě jsme opět vše testovali: nejdříve opravu v podmínkách živé hry a pak náš skript, funguje to, jedem!) a právě kvůli času jsme na tento detail zapomněli - na druhou stranu jsme byli pod silným tlakem, protože jsme chtěli co nejvíce minimalizovat následky naší chyby. Na našich testovacích serverech vše fungovalo jak mělo, protože tam tuto hodnotu většinou nastavujeme (nechceme testovat něco, co souvisí s dobýváním a pak čekat 8 nebo více hodin), takže ani tady jsme se nesetkali s výchozími hodnotami.

Proto jsme 25. prosince vytvořili další skript, který posléze připsal kompenzaci všem hráčům, jenž byli dotčeni našimi chybnými přerušeními dobývání (tentokrát nebyl vyvíjen ve tři ráno a téměř bez časového presu).

Sumarizace

V první řadě vám dlužíme omluvu - hluboce se omlouváme, vy všichni si zasloužíte více a my slibujeme, že tuto záležitost budeme brát vážně, poučíme se z ní a učiníme taková opatření, abychom těmto problémům v budoucnu předešli (nyní je nejdůležitější zabránit tomtu problému během novoročního míru).
Za druhé, tento problém odhalil některé zvláštnosti a konstrukční problémy s naším kódem - což je u her starých jako Grepolis naprosto normální, ale přesto je samozřejmě budeme řešit, abychom je neopakovali někde jinde.
Za třetí, děkujeme všem, kteří hrají fair-play a neposlali další kolonizační lodě, přestože to bylo možné!
 
Naposledy upraveno moderátorem:
Nahoru