Kako je F.E.A.R. ustvaril eno najboljših umetnih inteligenc vseh časov

Umetna inteligenca ali na kratko UI (v angleščini Artificial inteligence oziroma AI) že dolgo časa igra nadvse pomembno vlogo v računalniških igrah, kamor spada tudi F.E.A.R.. Če smo realni, dandanes težko naletimo na igro, ki ne vsebuje vsaj rudimentarnih zametkov umetne inteligence. Vsaj, dokler se res ne poglobimo v zamotano črevesje večkrat nedodelanih neodvisnih naslovov na Steam-u.

Glavna naloga umetne inteligence je, da nudi iluzijo inteligentnega obnašanja računalniško vodenih likov in hkrati predstavlja izziv za igralca. Ampak morda si se med košenjem množic možgansko nenadarjenih zbirk enk in ničel kdaj vprašal, kako njihov um sploh deluje? Zadnja leta smo ogromno poslušali o zmožnostih računalniških možganov in napredkih na področjih računalništva in umetne inteligence. Zakaj potemtakem razvijalci enostavno ne ustvarijo pametnejših umetnih likov, ki bi po razmišljanju zmogli konkurirati miselnemu vzorcu dejanskega igralca?

No, stvar niti približno ni tako enostavna. Čeprav je cilj teh umetnih sovražnikov resda iluzija človeškega nasprotnika v največji možni meri, lahko razvijalci hitro presežejo mejo. Teoretično bi lahko ustvarili sovražnika z idealnim reakcijskim časom in merjenjem na ravni najbolj patetičnih goljufivcev. Ampak igranje proti takim sovražnikom niti približno ne bi bilo zabavno. Isto namreč velja tudi za igranje proti zgoraj omenjenim goljufivcem v večigralskih igrah. Če želiš videti, kaj vse zmore doseči umetna inteligenca brez nepoštenih prednosti (kot je recimo znanje o lokaciji igralca in celotnem zemljevidu), si lahko pogledaš spodnji video o AlphaStar, umetni inteligenci za igro StarCraft 2. AlphaStar sloni na principu nevronskih omrežij. Na voljo ima povsem enaka orodja kot igralec, le, da jih zna kljub pomanjkanju sposobnosti improviziranja izkoristiti veliko bolje. Postal je tako učinkovit, da so jo bili primorani oslabiti, saj drugače najboljši StarCraft 2 igralci sveta niso imeli nobene možnosti za zmago.

Strah pred znanim

Ne lažimo si. Igralci iger nismo popolni v svoji panogi. Nič čudnega ni, da razvijalci namesto mehansko popolnega sovražnika raje preko algoritmov postavijo pogoje. Ti pogoji narekujejo, kako naj umetna inteligenca postopa v primeru določenih situacij. Enostavno rečeno gre za osnovo vsakega programskega jezika – če se zgodi to, napravi to. Ampak obstajajo tudi izjeme. Ena njih je precej stara franšiza, ki je vse skupaj ponesla na novo raven. Ta franšiza se imenuje First Encounter Assault Recon oziroma na kratko F.E.A.R..

Ena največjih odlik originalnega F.E.A.R. iz leta 2005 je bilo odlično grozljivo vzdušje, ki je zmoglo spraviti mravljince na zatilje še tako premetenega igričarja. Ampak zraven grozljivosti je igra premogla še eno premeteno karakteristiko, katere ji morda ne bi predpisal. Vsebovala je na videz eno najpametnejših umetnih inteligenc, kar jih je igričarski svet kadarkoli videl. Na podlagi te je dokaj stereotipna selekcija sovražnih človečnjakov aktualna ostala vse do danes.

Danes se tako ne bomo lotili najprepoznavnejšega lika v F.E.A.R. – Alme Wade, srhljive male punčke, ki nam je tekom igranja radostno mešala štrene. Spregovorili bomo o inteligenci vsem znane topovske krme, ki služi kot akcijski predah med srhljivimi stopnjami. Oglejmo si torej, kako so razvijalci uspeli postaviti nov mejnik glede umetne inteligence in zakaj istega ne vidimo večkrat.

Industrija video iger si že dalj časa prizadeva najti dostopne in pragmatične pristope za hitro in učinkovito sprejemanje inteligentnih odločitev računalniško vodenih likov. To je privedlo do mnogih inovacij. Od navigacijskih mrež za lažje gibanje po 3D okoljih, do strojev končnega stanja vedenjskega obnašanja (Finite State Machines) v igrah, kot je Half Life. Dandanes vse bolj popularna postajajo tudi nevronska omrežja, ki so trenutno najboljši približek dejanskemu človeškemu razmišljanju. A njihova vpeljava je zaradi kompleksnosti še nepraktična. Tako so vse od sredine 2000-ih najpopularnejši koncept postala vedenjska drevesa (Behaviour Trees). Populariziral jih je Halo 2 in še dandanes veljajo za najpogosteje uporabljeno tehniko v AAA igrah.

Toda v tem članku bomo vse te metode dali na stran in si ogledali še eno tehniko, ki je prav tako postala popularna nekje v istem času kot vedenjska drevesa. Oglejmo si torej ciljno usmerjeno akcijsko načrtovanje (Goal Oriented Action Planning), ki ga je populariziral F.E.A.R..

Mislim, torej sem pameten

Da bi razumeli ciljno načrtovano akcijsko načrtovanje in njegovo uporabo v F.E.A.R. in številnih drugih igrah, moramo najprej preveriti, iz česa sploh izhaja. Njegova osnova leži na že obstoječi UI tehniki, znani kot avtomatizirano načrtovanje (Automated Planning). Avtomatizirano načrtovanje ali “AI načrtovanje” je postopek, pri katerem sistem poskuša pravilno predvideti zaporedje dejanj, s katerimi bo najlažje dosegel cilj, ki mu ga je zastavil razvijalec – postopek, imenovan načrt. Da bi to naredili, težavo oblikujemo v programskem jeziku, ki nam da vedeti vse informacije o svetu v trenutnem stanju. To je znano kot dejstva ali predikati. Preprosto dejstvo o svetu pove nekaj, kar bomo morda potrebovali kasneje. Sistem torej shrani vse informacije o tem, kako je videti svet v katerem koli trenutku, znanem tudi kot trenutno stanje.

Zamislimo si recimo zaprta vrata, ki jih bomo označili kot “Vrata1”. Mogoče bi razvijalec želel, da NPC odpre vrata vrata1. Za izvedbo tega mora NPC predhodno vedeti, v kakšnem stanju vrata so. Torej mora vedeti, ali so odprta ali zaprta. Recimo, da so trenutno zaprta. Stanje našega sveta zdaj sestavljajo ena zaprta vrata. S temi podatki lahko sestavimo dejanje, ki bo omogočalo odpiranje vrat.

Vsako dejanje, ki ga NPC izvede, je običajno razdeljeno na tri dele. Prvi je navedba vseh povezanih predmetov, ki sodelujejo pri dejanju. Drugi so vsi predpogoji za dejanje – seznam dejstev, katera morajo biti resnična, preden se lahko dejanje izvede. Tretjega pa sestavljajo učinki dejanja – ti predstavljajo, kako se je svet spremenil zaradi dejanja, ali kako se je svet spremenil – z dodajanjem novih informacij glede stanja sveta ali ob izbrisu obstoječih dejstev, ki zaradi dejanja niso več resnična.

Recimo torej, da je naša želja odprtje Vrat1 s strani NPC-ja. Ena izmed predpogojev za dejanje bi bila zaprta vrata in nahajanje NPC-ja v isti sobi kot so vrata. Ko bo dejanje končano, bo učinek odprtje vrat, torej bodo vrata sedaj odprta.

Poglejmo si še naprednejši primer. NPC-ja želimo premakniti iz sobe A v sobo B, a vrata med njima so zaprta. V našem modelu načrtovanja bi morali vedeti, da Vrata1 povezujejo sobi A in B in da se ne moremo prosto premikati med sobama, dokler so zaprta. V tem primeru bo sistem ustvaril načrt, ki bo najprej odprl vrata. Nato se bo lik premaknil iz sobe A v sobo B. Svet bo spremenjen tako, da se bo NPC zdaj nahajal v sobi B, vrata med sobama pa bodo odprta.

Na kratko ta postopek, ki smo ga ravnokar opisali, imenujemo načrtovanje. Gre za ugotavljanje, kaj je potrebno storiti in kakšna je najoptimalnejša pot do te točke. Postopek kodiranja težav in načrtovalnih sistemov za reševanje teh težav je že desetletja aktivno raziskovalno področje. Medtem, ko je F.E.A.R. pomagal pri uvajanju načrtovanja v razvoj iger, se je že prej uporabljalo v drugih panogah za reševanje številnih logističnih težav – vse od sedemdesetih let prejšnjega stoletja. V področjih, kot so robotika (od manjših domačih naprav do Marsovskega Roverja), nadzor nad velikimi mehanskimi sistemi (vetrnice, elektrarne in izdelovalni procesi), zapleteni prostorski problemi (iskalne operacije, vojaško načrtovanje in pomoč v primeru katastrof).

Toda ta razlaga skrije nekaj neprijetnih podrobnosti. Načrti GOAP temeljijo na tem, da lahko težavo objasnimo na enostavni način. Načrtovalec mora imeti na voljo vse informacije za njeno reševanje. Če se vrnemo k težavi z odpiranjem vrat, sem omenil, da mora biti NPC v sobi A in da morajo Vrata1 povezovati sobo A in sobo B. To v stopnji načrtovanja sicer popolnoma deluje. Vendar obstaja nekaj razhajanj med načrtom in med načinom njegove izvedbe v resničnem življenju.

Na primer – kje v sobi A so vrata v sobo B? V katero smer se mora NPC premakniti, da pride do vrat? Pravzaprav lahko NPC v modelu načrtovanja instantno odpre vrata. Se pravi, da je naenkrat obdarjen s telekinetskimi sposobnostmi in zmožen odpreti vrata na daljavo? Tako potrebujemo nadaljnjo razlago, da mora biti NPC v trenutku odpiranja vrat lociran zraven le teh. Zato je načrtovanje idealno za razcepitev večjih problemov. Ob praktični izvedbi (pa naj bo to v resničnem svetu ali v video igrah) pa je njegova izvedba veliko težja.

Zdaj, ko vemo, kaj je načrtovanje in kako deluje, si poglejmo ciljno usmerjeno akcijsko načrtovanje, ki ga je na igričarsko sceno vpeljal F.E.A.R. in kako je vodilo v bolj realistično obnašanje umetne inteligence v video igrah.

Ciljno usmerjeno akcijsko načrtovanje (GOAP)

Ciljno usmerjeno akcijsko načrtovanje – ali na kratko GOAP (Goal Oriented Action Planning) – je izvedenka sistemskega načrtovanja STRIPS (Sistem Stanfordskega Razvojnega Inštituta za načrtovanje problematičnega reševanja problemov iz leta 1971) za uporabo v igrah. Vodilni za razvojem projekta je bil dr. Jeff Orkin, vodja oddelka za razvoj umetne inteligence v studiu Monolith Productions ob razvoju iger No One Lives Forever 2 iz leta 2002 in F.E.A.R., kjer je bil GOAP prvič uveden.

Kot je podrobno opisano v Orkinovi publikaciji na konferenci razvijalcev iger leta 2006, sistem GOAP poganja sistem končnih stanj (FSM). Gre za sistem, v katerem se umetna inteligenca nahaja v enem stanju obnašanja in nato na podlagi dogodkov preide v drugo. Vendar ima FSM, prvič uporabljen v Half Life, v kodni bazi lahko več kot 80 edinstvenih stanj. Čeprav vsa niso na voljo vsakemu NPC-ju (saj je njihov dostop določen z razredom lika), gre še vedno za ogromno količino stanj, kjer lahko gre hitro kaj narobe. V GOAP pozna sistem končnih stanj le tri stanja:

  • Premik v določen položaj v svetu.
  • Predvajanje animacije.
  • Interakcija s tako imenovanim pametnim objektom – predmeti sveta, s katerimi NPC lahko komunicira.

Morda vse to zveni nekoliko zmedeno. Kako lahko vse skupaj deluje na tako enostavnem konceptu? Razlaga leži v podrobnem opazovanju delovanja računalniško vodenih likov. Najsi naletijo na sovražnika ali storijo kakšno drugo dejanje, večino časa je vse, kar počnejo, zgolj izvajanje animacij. Ko se ta animacija izvede na pravem mestu ob pravem času, izpade pametna in ko se v zaporedju predvaja več pametnih animacij, izgleda obnašanje izvajalca inteligentno. Zato vsako od teh treh stanj konec koncev zgolj predvaja specifične animacije.

  • Pojdi do (GoTo): predvaja animacijo premikanja (hoja, tek, hitra hoja, skakanje, plavanje, plezanje…) ki premikajo lik proti določeni lokaciji.
  • Izvedi animacijo (Animate): predvaja specifično animacijo. Lahko gre za interakcijo z igralcem ali katero koli drugo animacijo, s pomočjo katere NPC izgleda nekoliko bolj človeško.
  • Uporabi pametni objekt (Use Smart Object): predstavlja situacijo, kjer mora NPC recimo izvesti interakcijo z okoljem – ročice, odpiranje vrat, sedenje na stolu in podobno. V vsakem primeru so animacije tega stanja povezane neposredno z objektom in pogosto bo sam objekt liku povedal, kaj mora storiti.

Namesto kompleksnih stanj, kjer je vsako možno obnašanje označeno kot ločeno stanje, je vse skupaj izvedeno v veliko ožji in podatkovno vodeni implementaciji. Izvaja se v kombinaciji premikanja in raznih animacij. V kolikor se jih več izvede v pravilni sekvenci, dobimo na videz pametno obnašanje.

Ampak kako objekt ve, v katerem stanju mora biti, v kakšnem zaporedju izvesti dejanja in katere informacije bo potreboval za izvedbo? Tu pride v poštev načrtovalni način GOAP. Z uporabo načrtovanja, o katerem smo spregovorili že prej (vrata), sistem ustvari načrte za reševanje specifičnih problemov in nato prebrska po bazi za najbolj optimalno rešitev za reševanje vsakega problema. Vsa dejanja se pretvorijo v specifična FSM stanja. S podatki, ki so neposredno povezani z NPC-jem. Tako ta ve, kam se lahko premakne, katere animacije mora predvajati ob katerem času in s katerimi objekti lahko interaktira.

Za boljše razumevanje, kako vse skupaj deluje v praktični obliki, preverimo praktično implementacijo sistema GOAP v F.E.A.R.

F.E.A.R. in ciljno usmerjeno akcijsko načrtovanje

Na našo srečo je del C++ podatkovne baze igre že dalj časa na voljo širši javnosti. Prvi pogled smo dobili že z originalnim F.E.A.R. SDK, nato pa so bili nadaljnje informacije razkrite preko javnih orodij za izdelavo modifikacij. In z malo truda lahko tudi sami odpremo del izvorne kode, kateri vsebuje vse nam potrebne informacije o umetni inteligenci.

Vsak NPC v F.E.A.R. potrebuje cilje. Ti cilji bodo gonilo, s pomočjo katerega bo načrtovalnik poiskal zaporedje dogodkov, preko katerih bo uspešno opravil cilj. To velja za vse ne-igralne like v igri, od vojščakov do morilcev in srhljivih pojav proti koncu igre, pa vse do podgan, ki tekajo naokoli. Vsi ostali liki, kot so Jin Sun-Kwon in Jankowski ter celo Alma imajo v celoti ali vsaj v veliki meri skriptirano obnašanje.

Kot zanimivost – GOAP je vodil do problema, katerega niti razvijalci pri Monolith Productions niso zaznali niti mnogo let po izidu. V raziskavi profesorja Erica Jacopina v 2014 je le ta analiziral delovanje GOAP načrtovalnika v F.E.A.R.. Ugotovil je, da neprestano spreminjanje načrtov vodi v nepredvideno porabo sistemskih resursov v nekaterih stopnjah igre. Razlog za to? Podgane. Podgane so namreč vodene preko istega sistema, ki ga uporabljajo vsi ostali UI vodeni NPC-ji. Njihovi načrti so na srečo precej neoptimistični. Vključujejo capljanje naokoli in bežanje pred igralcem, če se jim le ta približa. Tako tudi na začetku prve stopnje srečaš par teh podgan. A tudi, ko boš 20 minut kasneje že daleč stran, bodo še vedno veselo tekale naokoli in “prebavljale” sistemske resurse ter opravljale svoje naloge kot pridni miniaturni NPC-ji.

Kaj nam da ta anekdota vedeti, je, da bo nasprotno brez ciljev umetna inteligenca dobesedno brezciljno mirovala. V igri obstaja okoli 70 ciljev in igralni liki lahko neprestano dodajajo, posodabljajo in odstranjujejo cilje iz lastne prioritetne liste. Če ima recimo vojščak dva cilja, enega za patruljiranje in enega za ubijanje sovražnikov, a se ne zaveda, da se igralčev lik nahaja v bližini, bo cilj ubijanja sovražnikov imel prioriteto 0, medtem, ko bo patruljiranje veliko višje, vsaj dokler bo lik imel zasnovano pot za opravljanje te dejavnosti. A takoj, ko NPC izve za lokacijo igralca, bo prvi cilj po prioriteti presegel drugega in podal se bo v lov.

F.E.A.R. ali S.T.R.A.H.

Za reševanje ciljev ima načrtovalnik dostop do kolekcije različnih dejavnosti. Skupno je v igri 120 različnih aktivnosti – od enostavnih animacij pa do različnih vrst napadov, načinov premikanja, uporabe pametnih predmetov ali enostavnega mirovanja na mestu. Vsa dejanja imajo pripadajoče C++ razrede in tako vsi NPC-ji nimajo dostopa do vseh dejanj. Malo smešno bi bilo, če bi podgana naenkrat začela polniti orožja. Razvijalci uporabijo ločen urejevalnik podatkovnih baz za povezovanje specifičnih dejavnosti s specifičnimi razredi likov, s tem pa temu prepustijo lastno voljo, kako bo našel pot do cilja preko dejavnosti, ki jih ima na voljo.

S ciljem v mislih bo specifičen lik čakal na priložnost za dostop do načrtovalca in najdbo najboljše rešitve za trenutno stanje. Tu se pojavi več problemov, na katere sem namignil že prej. Sistem mora namreč najti vsa dejanja, do katerih ima ta lik dostop, prebrskati po možnih dejanjih znotraj trenutnega stanja in najti načrt za dosego cilja. Vendar je treba vse to med izvajanjem ponovno potrditi glede na stalno spreminjajoče se stanje igralnega okolja. To je zato, ker se lahko med načrtovanjem ali med samim izvajanjem načrta zgodi nepredvidena situacija, ki prekine potek načrta. Če se vrnem na primer z vrati – v kolikor sistem pripravi načrt za odpiranje vrat in premikanje med sobami, vendar med postopkom načrtovanja ali med izvajanjem načrta vrata odpre nekdo drug, pogoji za izvedbo načrta takoj niso več uresničljivi.

To je problem, s katerim se sooča velika večina sistemov načrtovanja, saj so precej eksistencialne narave in domnevajo, da lahko samo načrtovalec vpliva na svet. Tako se v okviru načrta ta ni zmožen prilagoditi drugim likom, ki hkrati opravljajo dejanja na tem svetu. Noben sovražni NPC v F.E.A.R. ne ve za obstoj drugih NPC-jev in na prvi pogled sodelovalno vedenje je enostavno več NPC-jev z enakimi cilji, ki organsko in nehote ustvarijo nekaj podobnega usklajenemu vedenju.

To pomeni tudi, da se NPC ne more premakniti na drugo navigacijsko točko, če mu na poti stoji drugi NPC, ampak hkrati se ne zaveda njegovega obstoja, prav tako pa se njegovo stanje lahko konstantno spreminja. Če torej drugi NPC stori dejanje, ki prekine predlagani načrt, mora biti vsak NPC sposoben to prepoznati in ustaviti trenutno početje ter zaprositi za nov načrt ali po potrebi spremeniti cilj.

Ta problem se lahko razreši na tri različne načine: prvič, ob snovanju načrta bo sistem izvedel hitro preverjanje veljavnosti, ki vzame v obzir trenutno stanje sveta in izvrši načrt na tej kopiji. Drugič, vsak cilj lahko preglasi funkcijo za ponovno načrtovanje, ki neprestano preverja, ali je treba opustiti trenutni načrt in najti nadomestnega. Dober primer tega je, ko igralec ustreli sovražnika med izvajanjem načrta za izpolnitev cilja uboja sovražnika. A načrt se hkrati lahko spremeni le, če lik trenutno ne izvaja neprekinljive animacije. Nazadnje je treba vsako dejanje pred izvajanjem ponovno potrditi, pri čemer se preverijo predpogoji in učinki. V primeru, da sistem ne bo zadovoljen s predvideno rešitvijo, bo prekinil izvajanje in prisilil ponovno načrtovanje.

Ko je načrt enkrat uspešno izveden, se dejanje v osnovi kode označi kot »Aktivirano«. Ko se to zgodi, se stroju končnih stanj sporoči, v katero od treh stanj naj NPC preide. Ta pred samo izvedbo preveri vse podatke, ki jih potrebuje za dokončanje spremenitve stanj. Recimo, na primer, da mora vojak ponovno napolniti orožje. Prešel bo v stanje “Izvedi animacijo” in podal posebne parametre animacije za ponovno napolnitev orožja.

Ko NPC uspešno zaključi načrt, prejme nov cilj in ponovno bo prešel v fazo načrtovanja. Z upravljanjem to ob uspešni, kot tudi neuspešni razrešitvi pomaga ohraniti tempo igre. Zagotavlja, da umetna inteligenca vedno ve, kaj storiti. Nikoli ne bo nepremično čakala na strel v sredo betice ampak bo stalno skušala opraviti sekvenco dejanj za zaključitev cilja. V praksi so načrti v F.E.A.R. pogosto precej kratki. Običajno obsegajo 1-2 dejanja – le peščica jih doseže 3 ali 4. To je precej smiselno glede na hiter tempo igre, kjer se okolje neprestano spreminja.

To je zgolj hiter pregled sistema. Vsakega, ki bi se rad podrobneje podučil o stvari, spodbujam, da si prebere izvorno kodo igre. Je resnično pronicljiva in koristna za vsakega obstojčega in potencialnega razvijalca.

Zaključek

Uporaba ciljno usmerjenega akcijskega načrtovanja (GOAP) v FEAR še danes velja za enega najboljših primerov umetne inteligence. Vodila je v veliko vznemirljivih in zabavnih strelskih spopadov. To kljub temu, da smo se večino časa spopadali zgolj s tipičnimi zlobnimi podaniki. In čeprav je od izdaje igre minilo skoraj 15 let, ima GOAP še dandanes vpliv na industrijo video iger. Čeprav ne pride niti blizu najpopularnejšim sistemom, obstaja kar nekaj zelo priljubljenih ali kultnih klasik, ki so sprejele metodologijo ali katero izmed njenih izpeljav.

Sem sodijo recimo Condemned Criminal Origins, S.T.A.L.K.E.R.: Shadow of Chernobyl, Just Cause 2, Deus Ex Human Revolution, Tomb Raider prenova iz leta 2013 in novejši naslovi Monolith-a, kot sta Middle-Earth: Shadow of Mordor in Shadow of War. Eno izmed izpeljav sistema pa najdemo tudi v Transformers: War for Cybetron in Empire ter Napoleon: Total War.

Ciljno načrtovanje je še vedno priljubljena tehnika v video igrah – čeprav jo po popularnosti vedenjska drevesa močno presegajo. Ampak s potekom časa se GOAP in njegov pristop v slogu STRIP uporablja vedno redkeje. Sodobnejši naslovi namesto njega raje uporabljajo podobno tehnologijo načrtovanja, imenovano Hierarhična delovna omrežja (Hierarchical Task Network ali HTN). Sistem se je uporabljal v večjih naslovih, kot so Killzone 2, Max Payne 3, Horizon Zero Dawn in Dying Light. V kolikor se bo med bralci našlo dovolj interesa, bom enega od prihodnjih člankov posvetil tudi HTN. Zazdaj pa upam, da sem pripomogel pri razumevanju sistema GOAP in razlogov za vso hvalo, ki jo je prejel ob implementaciji v F.E.A.R..

Vaša reakcija na članek?

Simon D.
Urednik strani in amaterski razvijalec iger, le redek naslov uspe uiti njegovemu sokoljemu očesu, vsaj dokler ne zaudarja že od daleč. Pa tudi takrat je le redkokatera stvar bolj zabavna od polnega kritiziranja precenjenega govna.

Sveže objave

2 KOMENTARJI

  1. Ta igra sploh ni bila grozljiva … isto kot ona od resident evil 7 biohazard … Nekateri so rekli, da ne morejo teh iger igrati, meni pa nič takega … pixli pač.

PUSTI ODGOVOR

Prosimo, vnesite vaš komentar!
Prosimo, vnesite vaše ime

Sveže novice na email!