Na YouTube a nově také na VHSky byly zveřejněny sestříhané videozáznamy přednášek z letošního OpenAltu.
Jednou za rok otevírá společnost SUSE dveře svých kanceláří široké veřejnosti. Vítáni jsou všichni, kdo se chtějí dozvědět více o naší práci, prostředí ve kterém pracujeme a o naší firemní kultuře. Letos se dveře otevřou 26. 11. 2025 v 16:00. Můžete se těšit na krátké prezentace, které vám přiblíží, na čem naši inženýři v Praze pracují, jak spolupracujeme se zákazníky, partnery i studenty, proč máme rádi open source a co pro nás skutečně
… více »Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za říjen (YouTube).
Jeff Quast otestoval současné emulátory terminálu. Zaměřil se na podporu Unicode a výkon. Vítězným emulátorem terminálu je Ghostty.
Amazon bude poskytovat cloudové služby OpenAI. Cloudová divize Amazon Web Services (AWS) uzavřela s OpenAI víceletou smlouvu za 38 miliard USD (803,1 miliardy Kč), která poskytne majiteli chatovacího robota s umělou inteligencí (AI) ChatGPT přístup ke stovkám tisíc grafických procesů Nvidia. Ty bude moci využívat k trénování a provozování svých modelů AI. Firmy to oznámily v dnešní tiskové zprávě. Společnost OpenAI také nedávno
… více »Konference Prague PostgreSQL Developer Day 2026 (P2D2) se koná 27. a 28. ledna 2026. Konference je zaměřena na témata zajímavá pro uživatele a vývojáře. Příjem přednášek a workshopů je otevřen do 14. listopadu. Vítáme témata související s PostgreSQL či s databázemi obecně, a mohou být v češtině či angličtině.
Byl vydán Devuan 6 Excalibur. Přehled novinek v poznámkách k vydání. Kódové jméno Excalibur bylo vybráno podle planetky 9499 Excalibur. Devuan (Wikipedie) je fork Debianu bez systemd. Devuan 6 Excalibur vychází z Debianu 13 Trixie. Devuan 7 ponese kódové jméno Freia.
Společnost Valve aktualizovala přehled o hardwarovém a softwarovém vybavení uživatelů služby Steam. Podíl uživatelů Linuxu poprvé překročil 3 %, aktuálně 3,05 %. Nejčastěji používané linuxové distribuce jsou Arch Linux, Linux Mint a Ubuntu. Při výběru jenom Linuxu vede SteamOS Holo s 27,18 %. Procesor AMD používá 67,10 % hráčů na Linuxu.
Joel Severin v diskusním listu LKML představil svůj projekt linuxového jádra ve WebAssembly (Wasm). Linux tak "nativně" běží ve webovém prohlížeči. Potřebné skripty pro převod jsou k dispozici na GitHubu.
Byla vydána nová verze 25.10.31 svobodného multiplatformního video editoru Shotcut (Wikipedie) postaveného nad multimediálním frameworkem MLT. Shotcut je vedle zdrojových kódů k dispozici také ve formátech AppImage, Flatpak a Snap.
Teda aspoň ten kterýho si vyrobíme :D ;D Ukážu vám jak si jako udělat uplně supr klon pacmana ve svobodným herním enginu godot. Kdyby měl někdo keci tak řikejte žeto máte na podporu rasistickejch nepokojů v americe ajeto jako. Já mám řikat to samý rači prej :O :D ;D ;D Taky mužeme řikat že sme tak děsně ultimultikulti že vlastě ani jako nevíme že sme namalovali blackface :O :D :D ;D
Anavíc nám nikdo ale vůůůůbec nikdo nemůže dokázat že duchové nemaj pod čepičkama uplně stejnou barvičku jako pacman :O ;D
Budeme potřebovat jeden godot hele, tři muziky, pět různejch zvuků, vobrázky a jeden font. Godot podporuje jenom *.wav a *.ogg soubory. Wav je nekomprimovanej a je lepší ho používat pro zvukový efekty a ogg který je kompromovaný zase na muziku.
stáhnout mužete takle pár supr muzik co sem k tomu jako vybrala ale jako na těch stránkách mužete najít i jiný supr hudbičky :D ale jako byl celkem problem vybrat nějakou lepšejší :D :D ;D ;D
wget -O hudbaNormalni.ogg https://opengameart.org/sites/default/files/8bit%20attempt.ogg wget -O hudbaAkcni.ogg https://opengameart.org/sites/default/files/battle1_1.ogg wget -O hudbaMenu.ogg https://opengameart.org/sites/default/files/honey-bear-loop.ogg
zvuky sou vyzobaný z tohodletoho zipu vod Little Robot Sound Factory hele. jako font sem použila paradní akaDylan hele :D ;D
Pokud se tim někdo jako nechce mazat tak celý to muže naklonovat a pak muže luštit ty mý komentáře ve zdrojáčcích hele. Nóóó a jestli jako někoho zajímá jenom ta hra samotná tak vyexportovaný pro linux tady z uložta hele a sha1sum je e9270110f45e8cc0f39696fa26fcdf895cb3a702 :O ;D
vobrázky sou přiložený tady dole ale nemusíte je stahovat se mi je podařilo s muzikou a zvukama nacpat na gitlab ale nevim jestli to tam vydrží :O :O :D :D ;D ;D kdyžtak pak někam strčim ty vybrázky ke stažení ;D
Godot je herní engine kterej vymysleli divoši z amazonský jungle nebo tam vodněkud. V godotu budem dělat toho našeho rasovýho pacmana tak k tomu něco malilinko napišu aby to jako nevypadalo že tady chci jenom věšet pacmana :O :D ;D ;D

Godot funguje na takovým zajímavým principu že je všecko jakoby uzel stromu. Vobrázek je uzel zvuk je uzel animace je uzel prostě všecko je uzel noa každej ten uzel muže mit nějaký další podřízený/děcký uzlíky pod sebou. Hra je členěná na scény a každá scéna funguje jako takovej kořenovej uzel kam se ty nody nastrkávaj.
A aby to jako nebylo málo zajímavý tak mužeme udělat instanci celý scénky i jako podřízenej uzlík v jiný scéně. Když sem si prohlížela tutorialy tak mito připadalo jakože děsně divný dělat extra scénku třeba pro výbuch kterej v průběhu hraní spawnete nejmíň 1000000000000000x ale fakt to tak jako muže uplně v pohodě fungovat a lidi to tak jako uplně normálně dělaj :O :O 
Noa ty nody grafu si jakoby mezi sebou mužou posílat signály.
Sou to vlastně takový eventy na který čekaj a reagujou přijímací metody/funkce v jinejch scénách/uzlech. Každej z předdefinovanejch oběktů nějaký signály má, i uplně vobyčejnej základní uzel má signály pro to že jako byl strčenej do stromku scény, žeje ready a tak. U voběktu timeru/časovače se nám třeba jakože hóóódně hodí signál 'timeout' kterej řiká že časovač dojel nakonec, to samý u tweenu, nóóó a my pak nato mužem nějak reagovat. 
Ve skriptech si pak mužeme udělat pro svý voběkty i svý vlastní signály, v tom rasovým pacmanoj třeba duchové posílaj do svý kořenový scény signál když zakleknou pacmana, pacman tam zase třeba jako posílá signál vždycky když sežere bavlněnej bobek.
Věci v godotoj nemusíme jenom naklikávat v gui editoru ale taky mužem použít skripty. Větčinou je ten skript to samý co třída oběktu. Ty napsaný skripty se chovaj dost podobně jako třídy oběktů v jinejch jazycích například mezi sebou uměj dědit a abysme je jako nějak mohli používat tak tam nějak musíme vyrobit jejich instanci.
Godot má nějakej takovej svuj skriptovací jazyk. Kdybych ho jako měla popsat, tak bych řekla žeto je python říznutej rustem a vokořeněnej javascriptem :O :D :D ;D
Piše se to skoro uplně jako python ale proměný se musej deklarovat s 'var' před ménem jako v js, funkce se nedeklarujou slovíčkem 'def' ale 'func'. Jinak jeto skoro uplně to samý jako python.
Sou tam ale voproti pythonu nějaký věci navíc. V normálním pythonu třeba jako neni žádnej switch/case ale tady maj nějakou obdobu která se menuje match podobně jako v rustu. Mužem taky psát enum, const a další zajímavý slovíčka hele (je tam toho mnóóóóóóóóóóóhem víc než jakoby ukazuju tady).
Třeba pokud za definici proměný napišete setget a zato nějaký názvy tak vámto samo k oběktu udělá gettry a settry akorátže setter funguje uplně jinak než si jako myslíte :O :O k atributům voběktů mužete přistupovat uplně přímo jako v pythonu, si to na nějaký private/protected nehraje. settrem se tady myslí funkce která je zavolaná pokuď se atribut voběktu změní z vnějšku mimo metody samotnýho voběktu.
ukázečka:
# dědění z jinýho skriptu/třídy
extends "res://nejaka/cesta/Trida.gd"
# název třídy
# tohleto neni poviný každej ten skript se chová jako třída
# má smysl když chceme přistupovat k nějakejm 'statickejm' věcem celý tý třídy
class_name NejakaVec
var atributTridy
var inicialioizovanejAtribut = 123456
# konstruktor třídy
# novou instanci děláme NejakaVec.new(pripadnej_atribut)
# pokud nám stačí výchozí kterej jakoby nedělá skoro nic tak psát nemusíme
func _init(bla):
    atributTridy = bla
    
# funkce která se zavlá jakmile oběkt vstoupí na scénu
# pokud máme před proměnejma napsaný klíčový slovíčko onready v tenhleten vokamžik se inicialeizujou
func _ready():
    print('obekt vstoupil na scenu :O :O')
# funkce která je volaná pro všecky voběkty na scéně furt ve smyčce každým krokem hry
# tamto delta je rozdíl času v sekundách vod posledního volání tý funkce
func _process(delta):
    atributTridy = delta * inicialioizovanejAtribut
    
# nějaká naše vlastní funkce/metoda voběktu
func nejaka_funkce(atribut):
    # pokud je funkce poděděná jakože se menuje stejně jako funkce v rodičovským oběktu tak mužeme volat tečkou 
    # původní funkci
    # pokud nevyplníme zavolá se sama skrytě
    .nejaka_funkce(atribut)
    
    # self jako v pythonu. jeto ukazatel oběktu na sebe samotnýho
    # pokud je jednoznačný že myslíme atribut/metodu toho samýho voběktu tak self psát nemusíme
    self.atributTridy = atribut * 2
Nějaký herní věci který se ve zdrojáčcích voběvujou často. Nenajdete je jenom v godotu se to voběvuje všude možně :O ;D
S vobrázkama je nejvíc nejrozumější pracovat jako s atlasma. Texture atlas nebo taky spritesheet je takovej věčí vobrázek kde máte všecky ty mrňavý herní vobrázky nastrkaný a znáte pozice a rozměry pomyslnejch čtevrečků který určujou kde která texturka v tom velkým obrázku je. Si myslíte že si jako přiděláváme práci ale vono to má svý vopodstatnění. Když chceme grafikou namalovat vobrázek s texturou tak ji musíme říct souřadnice na vobrazovce kde chceme malovat noa taky ji musíme dát ten vobrázek co chceme kreslit. Do grafiky muže strčit 1000000000000000000000000000000x souřadnic nějakýho voběktu s uv mapou textury za mililililililivteřinečku nóó ale s vobrázkama jeto horší a častý přepínání textur prej bejvá častej bottleneck rychlýho vykreslování. Tim atlasem ale mužem použít jednu a tu samou texturu třeba na vykreslení věčího množství různejch věcí a texturu tak třeba přenem jenom jednou :O ;D 
Ta mezera ve vobrázcích mezi věcma v atlasu je děsně důležitá!!!!!!!! :O :O ten vobrázek je tam načtenej jako celek a pak se z něho vybíraj nějaký regiony který chceme vykreslovat. Noa různejma nepřesnostma v samotným děláním s floatama a se zpracováním na grafice se muže jakoby stát že se zobrazí malililinkatej kousíneček ze sousedního vobrázku. Tomudle jevu se řiká 'tile tearing' a těma mezerama to vobejdem. (ještě bude nutný jedno nastavení v editoru) 
Existuje sousta dobrej i free nástrojů co uměj ze sady vobrázků vygenerovat texture atlas, já třeba na všecky ty přiložený atlasy použila FreeTexturePacker hele.

Tween toje taková věc co umí hladce 'animovat' nějakej atribut nebo atributy voběktu v průběhu nějakýho vyhrazenýho času. Řeknete mu nějakou počáteční a koncovou hodnotu nějakýho atributu a jak dlouho změna má trvat noa von vám uplně hlaďounce a plynule tu hodnotu bude měnit. Tweenu řikáme jakou chceme přechodovou funkci při měnění toho atributu noa taky easing argumentem jestli nám třeba to měnění hodnoty nemá bejt rychlejší nazačátku, nakonci, uprostřed nebo bejt úplně plynulý. Různý kombinace přechodovejch funkcí a easingu si mužeme prohlídnout třeba na tomdlentom supr taháčku hele.
V rasovým pacmanoj je třeba tween použitej na dělání kroků všech herních figurek. Strčí se do něj výchozí bod cílovej bod řekne se jak dlouho má krok trvat a tween se zapne a figurka se krásně přesune z tý počáteční souřadnice na cílovou :O ;D
No toje taková věc která dělá spousty různej mrňavejch částiček, v týhle hře je použitej u těch požárů, výbuchů a za pacmanem když sebere molotov a děsně rychle utiká. Máme tam nějakej generátor těch particlů a ten je vypouští. Každá ta vypuštěná částečka má nastavenou nějakou dobu života a pak umře a zmizí :O :O V godotu má každej ten paricle efekt vodělený samotný to vypouštění patriclů jakože emisi noa materiál těch částeček.
Pár věcí je tady ale hodně divně voproti tomu jak to jako maj jinde. Například na barevnej přechod particlu během jeho života nemůžeme použít jen tak vobyč strčení počáteční a koncový barvy, jestli jako chceme barevnej přechod udělat jednoduše musíme použít texturu s barevným gradientem. I jiný vlastnosti particlů chcete někdy měnit v průbehu jejich života jakože kam mířej jak se zvěčujou jaká je gravitace a tak. No v gui editoru si mužete naklikat nějakou takovou křivku průbehu tý hodnoty během života částečky. Ale pokuď to chcete načítat nějak externě tak si tu křivku musíte normálně namalovat bílou barvičkou na černý pozadí.
Noa jestli chytřejší zvás napadlo použít tween tak jako smůůůůůůůůůůůůůůůůůůůla my se dostanem jenom k tomu samotnýmu oběktu emitoru částiček ale né k nim samotnejm. Tweenama mužem měnit nějakou celkovou vlastnost toho efektu ale né částečky. Navíc těch částeček muže bejt najedou tisíce miliard a pro každou byste museli mit tween atoje hezký plejtvání :O ;D 
a vubec particle efekty sloužej k tomu abysme mohli tohleto generování malilinkatej částeček nějakýho efektu mohli dělat lacině. Kdybysme třeba generovali nějakým svým skriptem vohromný množství spritů s nějakým chcípacím časovačem tak to výde mnóóóhem dráš :O ;D
Mapa složená z dlaždiček, z ní sou třeba dělaný stěny bludiště nebo bobky bavlnky. Využívá obrázky texture atlasů ze kterejch je herní mapa složená a člení je do stad dlaždic, jakože do tilesets. Každá dlaždička v mapě má svou souřadnici a nějaký id/popisný číslo který řiká jakej region ty textury má bejt použitej. My ji tady budeme mit jako takovou mřížku ale muže bejt klidně izometrická nebo hexagonální a tak. Zdá se že godot neumí načítat nějakou mapku dělanou třeba v Tiled hele, a má nato nějakej svuj né zrovna moc inutiutivní a dobrej editor. Podrobnej vobrázkovej návod jak tam jako udělat tile mapu je kus dole.

Pacmanové a duchové žili byli spolu v jednom velikakakánským  americkým městě v usa. Pacmanové pro duchy trhali kuličky bavlnky noa  duchové je zato krmili samejma smaženejma dobrotama z kuřat z Kentucky.  Toje asi něco jako kuře z Vodňan pro stoupence hnutí ano. Všecko klapalo  jak mělo až jednoho krásnýho dne jeden z duchů kterej v civilu dělal  policajta jednoho z pacmanů trošičku víc přidusil kolínkem při uplně  normální zběžný policejní kontrole propuštěnýho recidivisty a začala  mela. Vostatní pacmani se v tom zašlápnutým kriminálníkoj nějak jakoby  poznali a některý dostali strach žeby je taky moh nějakej duch  zašlápnout, vyběhli do ulic a začali všecko podpalovat a ničit. Noa k  těmhlenctěm pacmanům se začali přimíchávat i jiný pacmani, takový  kterejm, je uplně volný že jeden z nich byl zašlápnutej policejním  kolenem. Tyhlety druhý pacmani si prostě chtěli trošičku porabovat a  nakrást. A jeden z těchletěch pacmanů jakoby bude náš hlavní herní  hrdina :D 
No a tak se teda jeden ten milej pacman rozhod že  ukradne duchům všecku jejich balvnku co si poschovávali po městě aže ji  prodá, děsně zbohatne a bude si žít taky jako nějakej starej americkej  duch. 
Jenže to zase jako neni tak jednoduchý, vokrádat duchy vo  jejich bavlnku. Vždycky, když ji pacman nakrade nějaký množství tak si  nějakej z duchů muže dodat vodvahy, vyleze z domečku a de našemu milýmu  pacmanoj doslova po krku :D Pacman bavlněný bobky musí umět krást  šikovně aby ho při tom nechytli a nezaklekli, to by s pacmanem byl konec  :O :O v lepším případě by se vrátil na start se zápisem v rejstříku  trestů nóó a když si i potřetí nedá pozor tak se duchové pořádně naštvou  a kolenem pacmanoj dupnou na krk taky pořádně a s pacmanem bude uplnej  konec!!!!!! :O :O jediný co po něm muže zbejt je, že si ho jiný pacmani  budou připomínat tak dlouho dokavaď nějakej jinej pacman nezastíní jeho  slávu tim žese nechá střelit do zad nebo zašlápnout nějak víc :O ;D  
Naštěstí  pro pacmana se vobčas dá ve městě najít zápalná flaška. Duchové sou  hloupí a často pacmany podceňujou, myslej si že je jentak budou nahánět  po městě a zašlapávat a pak sou celý vykulený když jim nějakej pacman  prohodí voknem molotov. Když pacman najde a použije molotov duchové se  uplně vyděsej a začnou zdrhat a ani jako nevěděj pořádně kam. 
A to  je vobrovská příležitost pro pacmana! Pacman muže zavzpomínat na svý  africký kořeny kdy ještě jeho dědeček dělal v jungly s misionářema  kanibalizmus a může si nějakýho toho ducha chytnout a pěkně si ho vopíct  a sežrat že zbydou jenom jeho vytřeštěný voči.
Jako žádná legrace ta amerika dneska si myslim :O :D ;D ;D
vo co ve hře de
V bludišti je hrozně moc bobků, v našem 188, v originále 240 a pacman je chce všecky posbírat protože za každej sebranej bobek má nějaký bodíky. Na startu se vobčas voběvuje dočasnej bonus kterej když pacman sebere tak dostane nějaký body navíc.Konkrétně jeto iphone, červená krabice s logem nike a oled televize
100 bodů:
 200 bodů: 
 300 bodů: 
 požžáááááááááárrr!!!!: 
Všecky tyhlety věci sem ve zprávách viděla pacmany sbírat tak sem je sem strčila jako bonusy :O :D ;D ;D Iphone je za nejmíň bodů protože když ho ukradnete z vobchodu tak se sám jakoby zamkne a je z něj cihlička hele . Jako doufám žese začnou vodvolávat na ten rasizmus budou se domáhat svejch práv a budou ty mobílky chtít po applu vodemknout :D :D :D ;D
Aby to nebylo jednoduchý tak pacmana pronásledujou čtyry duchové který sou ze svýho domečku vypouštěný vždycky když pacman nasbírá určitej počet bobků a když duchové pacmana chytnou tak ho zakleknou a zabijou. Ve čtyrech rozích a vobčas uprostřed bludiště se voběvujou improvizovaný zápalný lahve jakože molotovy. Když pacman sebere molotov duchové nachvilku budou zranitelný a pacman je muže zničit a vrátit dodomečku. Noa až pacman všecky bobky posbírá tak konec levelu hra se restartuje a pokračuje se znova vod začátku na vyší vobtížnosti.

Chování duchů je skoro uplně stejný jako v originálním pacmanoj, použila sem tendleten popis tý starodávný hry hele.
Takže duchové maj tři základní druhy/režimy pohybu, rozptýlení, pronásledování a vyděšení.
No duch má nějakou svou současnou souřadnici v bludišti noa nějakou cílovou na kterou se jako snaží furt dostat. K rozhodování kterým směrem jako jít dochází jenom na křižovatkách, kromě toho existuje v bludišti několik extra křižovatek který maj vyjímku a na nich duch nesmí zatočit směrem nahoru.
Duch příde na křižovatku a za běžnejch vokolností nesmí couvat tam vodkuď přišel, takže má na víběr mezi douvma a třema sousedníma políčkama a znich si musí vybrat na který pude. Rozhoduje se jakože dost primitivním hladovým algoritmem. Vezme každý to možný budoucí políčko a změří jeho zdálenost k cíli a vybere si to políčko, kde je ta vzdálenost nejmenčí. Vubec to neznamená že vybraná cesta bude nejkratčí, často to muže bejt jako navopak :O :O 
Korejec kterej toho pacmana někdy před sto lety vymyslel k tomu řikal žeby jako neměl problém udělat takovej algorimus pohybu duchů žeby hráč byl prostě bez šance akorátže tohle je hra a hráč musí mit možnost vyhrát nebo aspoň jakože dost dlouho bojovat :O ;D
Každej duch má nějak pevně stanovený nedosažitelný políčko bludiště někde v rohu herní mapky na který se furt snaží dostat. na to kdeje hráč duch kašle a jede si na to svý políčko. Noa tim žese na to políčko nikdy vživotě nedostane no tak furt krouží ve smyčce kolem překážky v bludišti.
Duch pronásleduje pacmana a snaží se ho zakleknout. Zajímavý na tom je že se každej ten duch chová uplně jinak v tom pronásledovacím režimu.
Červenej duch míří uplně napřímo na políčko na kterým právě pacman stojí a v pronásledovacím režimu na něj jakoby furt chce nějak najet.
Růžovej duch to dělá podobně jako červenej ale nemíří přímo na políčko s hráčem áále čtyry políčka od pacmana ve směru ve kterým pacman jakoby právě kouká.
Azurovej duch je ze všech těch čtyrech duchů nejmazanější. Von to teda taky neni žádnej velikej inteligent ale narozdíl vod vostatních umí dělat takovou jednoduchou predikci budoucí pozice pacmana. Jakoby se udělá vektor mezi současnou pozicí červenýho pronásledovacího ducha a mezi souřadnicí dvě políčka od pacmana v pacmanově směru. Tenhleten vektor se eště jakoby zdvojnásobí ato jako bude cílová souřadnice azurovýho ducha. Von ten lump totiž jakoby ví že budeme věčinu času utikat právě před tim červeným duchem aže jentak neubdeme kličkovat když si nějakej směr vyberem aže přibližně v tý daný oblasti bludiště se asi jako budem skovávat a krást bavlnu. Dost mu ale todleto nefunguje když je červenej duch zežranej a schovanej v duším domečku. Jak to jako bylo řešený v originále nevim možná když byl červenej duch sežranej tak pužíval způsob pohybu jinýho ducha :O :O
Voranžovej duch je znich asi nejvěčí srabík. Když je vod pacmana dost daleko tak se chová uplně stejně jako červenej duch. Jenže když se přiblíží k pacmanoj na blíž jak osum políček tak najednou změna a začne mířit do svýho kouta na rozptylovou pozici.  
Nastavá když pacman sebere molotov.Duchové sou chvilku zranitelný a pohybujou se zpomaleně bludištěm a směr si na každý křižovatce vybíraj uplně náhodně. Furt ale platí pravidlo že nesměj couvat tam vodkuď na křižovatku jako přišli.
Rasovej pacman se skládá z pěti scén, ztoho je jedna vnořená jako instance v jiný. Máme tam scénku hlavního menu, samotnou herní, scénu s highscorem a scénku credits. Pátá scénka je Bludiště, ta vobsahuje ty naklikaný tiled mapy a je instancovaná v hlavní herní scéně.
Jak mezi sebou některý skripty/třídy děděj ukazuje tenhleten diagram, žádný exportovadlo takovejdlech grafů sem tam nenašla nóó tak sem to namalovala :D

Sem se to snažila udělat všecko jako skripty aby tam jako bylo co nejmíň  dělání přímo s tim jejich ediorem a taky seto dalo uplně jednoduše  dyštak copypastnout nóó ale editoru se jako nikdy nedá uplně 100%  vyhnout. Uzly mužeme vyrábět a strkat do scén skriptem ale  samotný scény si musíme vyrobit v editoru. Noa i když to jako neni uplně  nemožný tak bludiště ve kterým seto všecko jako děje dělat skriptem  neni moc praktický a bude lepší ho naklikat v gui editoru. Editor je  taky lepšejší na dělání gui menu a taky různejch particle efektů a  jinejch věcí který je prostě potřeba vidět.
Skripty sou strčený  dole pod zápiskem ale jeto 2000+ řádečků toje skoro uplně stejně velký  jako goldfingerův javovskej parser se 160k řádkama akorátže trošičku  menčí :O :O jako číst si to tady mužete ale myslim si žeje přehlednější  číst skriptíky přímo v editoru/godotu. Skripty co se menujou jako scéna se musej scéně přiřadit vlevo nahoře nebo vpravo dole takovou ikonkou co vypadá jako cár pergamenu ;D
složitější naklikávání myšičkou rači jako ukážu prstem ;D
tahlencto tam maj jakože fakt hóóódně pitomě udělaný ale když se vám to už jednou podaří tak už si to jakoby budete pamatovat a nezvořeteto :O ;D
Udělejte novou scénku a vložte do ní děckej uzel tiledMapy. Vpravým panelu v tabu inspektoru kliněte na takovýto rošoupávátko na který ukazuju a vyberte new tileSet a vyrobí vám to novou prázdnou sadu dlaždic. A teďka jako pozor!!!!!!!! ta věcička nalevo vod rozšoupávátka co má teďko nápis [prázdný] se vám změní na tlačítko který když rozklikete tak se vám dole ve spodním panelu votevře nástroj pro editaci tý sady dlaždic.

vlevo dole je uplně nenápadný tlačítko pro přidání novýho atlasu/ textury na vygenerování tý sady dlaždic. Žetoje uplně pitomí řešení si asi jako indiáni z pralesa uvědomujou protože dokaď tam nemáte žádnej vobrázek strčenej tak vás nat jak tam vobrázek dát naviguje mrňavej textík ale napsanej přes celej panel :O :D :D ;D
No prostě to jako máčkněte myšičkou a v souborovým manageru vyberte nějakej vhodnej vobrázek kterej chcete používat jako dlaždičky. Je jako celkem chaos vědět kde na sebe dlaždičky navazujou tak sem udělala takovej vobrázek abyste tam jako měli něco jako středovou vodicí čáru ;D ;D

vpravo nahoře je potřeba specifikovat případný mezery a rozestupy mezi jednotlivejma vobrázkama dlaždic. Kuli tile tearingu tam všude máme mezery nóó a ty musíme zohlednit offsetem jakože celým posunem všech dlažidček vod levýho horního okraje vobrázku nóó a separaci jakože jaký volný místo mezi dlažičkama je. Step řiká nóó jak velkým krokem se v tý sadě jak budem pohybovat.
Jak těma parametramama hejbete byste dole měli vidět jak se mění taková fialová mříška která vohraničuje tý jednotlivý dlaždičky. Až hejbání budete mit hodotý tak voznačte v tý sadě dole kurzorem mišičky všecky ty dlaždice jakože sou aktivní v tý sadě.

noa až tohleto budete mit hotový a rozkliknete si znova ten uzel tilemapy tak byste měli vidět u pravýho panýlku nástroj pro výběr atlasu a nařezanejch dlaždiček. Na dlaždičku kliknout a malovat :D ;D
v horním panelu sou různý nástroje který nám to uměj jakoby trošičku zjednodušovat.

V nastavení projektu v nabítce hlavního meníčka musíme otevřít nastavení projektu a nějaký věci v tom nastavit :D
Potřebujem vybrat hlavní scénu která se pustí hnedka při zapnutí hry

nastavíme rozlišení na tohleto číslo jakože šířku 1344 pixelů a vejšku 1792. jeto šířka a vejška tilemapy vynásobená velikostí dlaždičky + vejška panelu v herní scéně.
dole nastavíme aspect na keep aby se nám při měnění velikosti vokna nebo při různejch velikostí monitorů neměnil poměr šířka x vejška. tim čim zatodleto automatický přizpůsobování platíme jeto žese nám mužou ve vokně dělat kolem herního viewportu černý proužky ve volným místě. Sou samozdřejmě i jiný možnosti jako třeba mit celou tu věc větčí a nedůležitý věci na malejch zobrazovátkách skovávat ale todleto je nejvíc nejjednoduší :O ;D

v renderingu nastavte pixel snapping na true aby nám to hezky všecky vobrázky zarovnávalo podle pixelů. Normálně se jinak používá co nejpřesnější souřadnice danejch věcí. Nevýhoda je že různý chybičky a nepřesnosti mužou třeba mezi dlaždičkama tile mapy dělat mezery. jinde to moc neva ale tady se to projevuje jakože dost :O :O

eště přidáme skript Score.gd v tagu autoload jako singleton. To nám umožní k voběktu Skóre přistupovat furt a vodevšad a praticky to funguje tak že nám visí uplně mimo strom scény ten uzel :O ;D

extends Node2D # prostě něco co leží na dlažicový mapě # všechny uzly maj nějakou svou pozici relativní k nadřízenýmu uzlíku # pro věci co se budou pohybovat po herní dlaždicový mapě chceme znát i jejich # logickou souřadnici, jakože na kterým políčku v tý tile mapě stojej co maj před sebou a tak class_name VecNaMape # logická pozice tý věci. odpovídá pozici v tile mapě var logicka_pozice = Vector2(0,0) func _process(delta): vypocitejLogickouPozici() # oběkty maj atribut z_index kterej určue pořadí jejich vykreslování. čim je hodnota # vyší tim dřív bude node vykreslenej voproti vostatním se stejným rodičovským uzlem # tady nastavujem na ypsilonovou souradnici, čim bude oběk na vobrazovce níž, tim dřív bude # jakoby namalovanej. takle uděláme uplně primitivní iluzi nějaký perspektivy :D ;D self.z_index = self.logicka_pozice.y # funkce volaná každým krokem která aktualizujuje logickou pozici přepočtem z pozice uzlu # logická pozice pak vodpovídá nějakýmu políčku v tilemapě func vypocitejLogickouPozici(): logicka_pozice.x = ceil((self.position.x)/64)-1 logicka_pozice.y = ceil((self.position.y)/64)-1
extends 'res://skripty/VecNaMape.gd'
class_name Figurka
#sou to floaty ale mužeme snima hezky prasečit jakože porovnávat vectory == nebo
# různý směry kerejma se muže figurka vydat
const NAHORU = Vector2(0.0,-1.0)
const DOLU = Vector2(0.0,1.0)
const PRAVA = Vector2(1.0,0.0)
const LEVA = Vector2(-1.0,0.0)
const STOJI_NA_MISTE = Vector2(0.0,0.0)
# dlaždicová mapa s vokrajema bludiště
var okraj=null
# jak dlouho figurka dělá v tweenu krok
var doba_kroku=0
var atlas=null
# jestli figurka právě někam de. když je tahleta proměná 'true' tak bysme jako neměli
# dělat nějakej další krok
var jde=false
# jakej byl směr v posledním kroku
var predchozi_smer=DOLU
# název animací jednotlivejch akcí kroků
var animace_nahoru='nahoru'
var animace_dolu='dolu'
var animace_prava='prava'
# výška obrázku v atlasu
# má smysl při generování animací
var vyska_obrazku=128
# všechny animace oběktu
var animace=null
# tween na dělání kroků figurky
var tweenKroku=null
# i přes usilovný hledání se mi nepodařilo najít funcki která by jako vracela
# region z atlasu podle indexu nóó tak sem to udělala takle.
# předpokládám že jakoby exituje nějakej ofiko způsob kterej je víc lepší ale 
# nenašla sem prostě :O :O :'( :'(
var sirka_atlasu=16
func textura_z_atlasu_indexem(atlas,index):
	var textura=AtlasTexture.new()
	textura.atlas=atlas
	textura.region = Rect2((index % sirka_atlasu) * 64, (index / sirka_atlasu) * vyska_obrazku, 64, vyska_obrazku)
	return textura
# funkce kterou uděláme figurkou krok zadaným směrem
# směr je jeden z těch čtyr vektorů nazačátku tohodletoho souboru
func jdi(kam):
	
	# začnem přehrávat vodpovídající animaci k chůzi daným směrem
	if kam==DOLU:
		animace.play(animace_dolu)
	elif kam==NAHORU:
		animace.play(animace_nahoru)
	elif kam==PRAVA:
		animace.play(animace_prava)
	elif kam==LEVA:
		#todleto neni chyba!!!!! :O :O
		#když de figurka doleva použije se animace chůze doprava a nastavíme
		#flip_h na true abyse obrázek horizontálně překlopil :O ;D 
		animace.play(animace_prava)
		animace.flip_h=true
		
	if kam!=LEVA:
		# noa když se nejde doleva tak dáme flip_h na vypnutej
		animace.flip_h=false
	
	# nakonec uděláme přesun tý figurky pomocí tweenu
	# do tweenu budem strkat realnou pozici né logickou
	# cílovej bod získáme vynásobením vektoru dýlkou hrany jedny flaždičky + současná realná pozice
	var cil = self.position + (kam*64)
	
	tweenKroku.interpolate_property(self, 'position', position, cil, doba_kroku, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
	tweenKroku.start()
	
	jde = true
	predchozi_smer = kam
# funkce co ověřuje jestli se figurka muže vydat nějakým zadaným směrem
func muzu_jit(kam):
	
	#vektory mužeme takle sčítat dohromady plusem :O ;D
	var pozice = logicka_pozice + kam
	
	#koukneme se jestli v mapě na daný souřadnici existuje dlažička
	# a jestli jako jo tak tam jít nemužem
	return okraj.get_cellv(pozice)==TileMap.INVALID_CELL
	
func _ready():
	animace=AnimatedSprite.new()
	self.add_child(animace)
	
	tweenKroku=Tween.new()
	self.add_child(tweenKroku)
	tweenKroku.connect('tween_completed',self,'_on_TweenKroku_tween_completed')
	animace.flip_h=false
	
#metoda která se zavolá až tween kroku zkončí
#názvy funkcí který sou napojený na signály by měli mit takovejdle formát
# _on_<název uzlu>_<název signálu>
#musí brát tyhlencty dva argumenty
# první je objekt na kterým se tween dělá a druhej je atribut kterej se mění
func _on_TweenKroku_tween_completed(objekt,key):
	
	animace.stop()
	
	# teleportace když věc vyleze dírou mimo vobrazovku
	# mi tu figurku jakoby teleportujem na druhou stranu a uděláme další krok aby
	# jakože ztý druhý strany vylezla
	if logicka_pozice.x <= -1:
		logicka_pozice.x = 21
		self.position.x = (logicka_pozice.x+1) * 64 - 32
		jdi(predchozi_smer)
		
	elif logicka_pozice.x >= 21:
		logicka_pozice.x = -1
		self.position.x = (logicka_pozice.x+1) * 64 - 32
		jdi(predchozi_smer)
	
	else:
		#pokud neni figurka v teleportu muže dělat krok podle sebe jak jako chce
		jde = false
#funkce stuj slouží k zastavení figurky abysme mohli třeba ručně změnit jeji polohu a tak
# předevšim nahrubo zastavíme tween kroku a proměnou jde na false
# takle zabráníme volání callbacku _on_TweenKroku_tween_completed a nějakýho dalšího co dělá s proměnou 'jde'
# tyhlety věci nám třeba mužou s figurkou hejbat potom co byse nastavila jeji nová poloha a
# nedělalo byto jako dobrotu :O :O
func stuj():
	tweenKroku.stop(self)
	jde=false
# nastavuje názvy animací pro směry nahoru doprava a dolu
# základní se tak menujou ale duch tam má třeba navíc ještě jednu sadu animací pro sežratelnej/vyděšenej stav
func prepni_animaci(prefix=''):
	animace_nahoru=prefix+'nahoru'
	animace_dolu=prefix+'dolu'
	animace_prava=prefix+'prava'
extends 'res://skripty/Figurka.gd'
# hráč dědí z figurky
class_name Hrac
var akce=DOLU
var bobky=null
var zakleknuty=false
# vokrasnej particlovej efekt když pacman sebere molotov
# bude se za nim dělat taková jakože hnědá šmouha jakože děsně rychle utiká :D
var efekt = null
var material_efektu = null
# vobyčejná normální rychlost přehrávání animace a zrychlený přehrávání když sebere bonus
const NORMALNI_FPS = 28.0
const AKCNI_FPS = NORMALNI_FPS * 1.3
# hráč posílá do hlavní scény signál že sebral bavlněnej bobek
signal sezral_bobek
# napojíme signály k scéně
func napojit_signaly(koren):
	self.connect('sezral_bobek',koren,'_on_Hrac_sezral_bobek')
# nastavování atributů budem volat opakovaně tak nepoužijem konstruktor
func nastav(okraj,bobky,logicka_pozice):
	self.okraj=okraj
	self.bobky=bobky
	self.logicka_pozice=logicka_pozice
	self.position=logicka_pozice*64 + Vector2(32,32)
	zakleknuty=false
# vygenerování jednotlivejch animací akcí animací z atlasu
# kromě animací 'dolu' 'nahoru' 'prava' který by měli mit všecky věci dědicí z figurky
# je tady navíc animace 'umrel' která se bude přehrávat když bude pacman zakleknutej
# 
func vygeneruj_animace(fps):
	# vezmem seznam snímků animace
	var seznamAnimaci=animace.get_sprite_frames()
	# a pokuť neexistuje tak ho jakoby vyrobíme
	if seznamAnimaci==null:
		seznamAnimaci=SpriteFrames.new()
		
	seznamAnimaci.add_animation('dolu')
	seznamAnimaci.add_animation('nahoru')
	seznamAnimaci.add_animation('prava')
	seznamAnimaci.add_animation('umrel')
	
	var index=0
	for i in range(7):
		seznamAnimaci.add_frame('dolu',textura_z_atlasu_indexem(atlas,i+index))
	# a ještě vokonce zpátky k začátku aby nám to hezky navazovalo
	for i in range(1,6):
		seznamAnimaci.add_frame('dolu',textura_z_atlasu_indexem(atlas,(6-i)+index))
		
	index+=7
	for i in range(7):
		seznamAnimaci.add_frame('umrel',textura_z_atlasu_indexem(atlas,i+index))
		
	index+=7
	for i in range(7):
		seznamAnimaci.add_frame('prava',textura_z_atlasu_indexem(atlas,i+index))
	for i in range(1,6):
		seznamAnimaci.add_frame('prava',textura_z_atlasu_indexem(atlas,(6-i)+index))
		
	index+=7
	for i in range(7):
		seznamAnimaci.add_frame('nahoru',textura_z_atlasu_indexem(atlas,i+index))
	for i in range(1,6):
		seznamAnimaci.add_frame('nahoru',textura_z_atlasu_indexem(atlas,(6-i)+index))
	
	seznamAnimaci.set_animation_speed('dolu',fps)
	seznamAnimaci.set_animation_speed('prava',fps)
	seznamAnimaci.set_animation_speed('nahoru',fps)
	seznamAnimaci.set_animation_speed('umrel',fps/4)
	
	# vypnem animaci umření loopování aby nehrála znova vozačátku když zkončí
	seznamAnimaci.set_animation_loop('umrel',false)
	animace.set_sprite_frames(seznamAnimaci)
func _ready():
	doba_kroku=12.0 / NORMALNI_FPS
	atlas=preload('res://obrazky/hrac.png')
	sirka_atlasu=7
	vyska_obrazku=64
	vygeneruj_animace(NORMALNI_FPS)
	
	# nastavíme výchozí vobrázek spritu
	animace.play('dolu')
	animace.stop()
	
	# vyrobíme si particle efekt rychlího běhání pacmana
	material_efektu = ParticlesMaterial.new()
	
	# vypouštet je budem furt z jednoho jedinýho bodu
	material_efektu.emission_shape=ParticlesMaterial.EMISSION_SHAPE_POINT
	
	# výchozá směr. budem měnit každým krokem ale :O :O
	# musí to vypadat že jakoby vyletujou z něj vopačným směrem než zrovinka de
	material_efektu.direction=Vector3(0,-1,0)
	
	# rozptyl rychlost a zvěčení částiček efektu
	material_efektu.spread= 5.0
	material_efektu.initial_velocity=500
	material_efektu.scale = 5.0
	
	# tahleta barvička odpovídá barvičce kůže pacmana ;D ;D
	material_efektu.color = Color('#431811') 
	# blbý na html kódech barviček je že tam nejde strčit alpha a my potřebujem abyto bylo trošičku průsvitný
	material_efektu.color.a = 0.5
	
	
	efekt=Particles2D.new()
	efekt.amount=16
	efekt.lifetime = 0.125
	efekt.process_material=material_efektu
	efekt.texture=preload('res://obrazky/castice.png')
	
	efekt.emitting = false
	
	# efekt bude strčenej pod pacmanem aby ho částečky nepřekrejvali
	efekt.z_index = -1
	self.add_child(efekt)
func _process(delta):
	
	# pokuť je pacman zakleknutej tak už nděláme nic nemá to cenu :D ;D
	if zakleknuty:
		return
	
	# pokud se pacman nachází na logický souřadnici vodpovídající souřadnici bobku 
	# v bludišti tak ten bobek sebere ;D
	# že je v mapě na daný souřadnici zistíme metodou get_cell která nám vrátí index
	# druhu tý dlaždiče. nóóó a jestli žádná dlažička na tom místě neni tak vrátí INVALID_CELL
	if bobky.get_cell(logicka_pozice.x,logicka_pozice.y)!=TileMap.INVALID_CELL:
		
		# přepnem dlažičku na invalid. tim ji z mapy vymažem 
		bobky.set_cell(logicka_pozice.x,logicka_pozice.y,TileMap.INVALID_CELL)
		# a očlem signál do hlavní scény
		emit_signal('sezral_bobek')
	
	# vybereme požadovanej směr kterým se hráč chce vydat podle toho jakou šipku 
	# právě drží
	if Input.is_action_pressed('ui_down'):
		akce = DOLU
	elif Input.is_action_pressed('ui_up'):
		akce = NAHORU
	elif Input.is_action_pressed('ui_right'):
		akce = PRAVA
	elif Input.is_action_pressed('ui_left'):
		akce = LEVA
	else:
		# noa jestli nerží žádnou tak pacman bude chtít pokračovat se svým předchozím směru
		akce = predchozi_smer
	
	# pokud máme aktivní particle efekt upravíme jeho směr aby vodpovídal vopačným směru posledního
	# provedenýho krůčku
	if efekt.emitting:
		efekt.process_material.direction = Vector3(-predchozi_smer.x, -predchozi_smer.y, 0)
	
	# pokud zrovinka neprobíhá krok tweenu tak vybereme nějakou akci na základě toho
	# jakou šipku hráč drží, jakej byl předchozí směr a jestli máme před pacmanem překážku
	if !jde:
			
		# todle je skutečnej směr kterým pudem
		var smer = null
		
		#pacman jakoby furt teda chce pokračovat stejným směrem dál na další políčko
		#pokud před pacmanem neni překážka nastavíme nejdřiv jako potenciální směr pacmanův předchozí
		if okraj.get_cell(logicka_pozice.x+predchozi_smer.x,logicka_pozice.y+predchozi_smer.y)==-1:
			smer=predchozi_smer
		
		#pokud bylo zmáčknutý mačkátko s šipkou a políčko v tom směru je volný pacman pude tam
		if okraj.get_cell(logicka_pozice.x+akce.x,logicka_pozice.y+akce.y)==-1:
			#jediná vyjímka je zahejbání do domečku duchů tam hráč vlízt nemuže :O ;D
			#pokud stojí přededveřma do domečku nemuže zahnout dolu
			if akce==DOLU and logicka_pozice==Vector2(10,10): 
				pass
			#jinak se směr bere normálně ze šipek
			else:
				smer=akce
		
		#pokud byl určenej směr předchozíma podmínkama deme
		#jinak pacman zustane stát namístě :O ;D
		if smer!=null:
			jdi(smer)
		
# zakleknutí pacmana duchem
# zastavíme tween a zahrajem animaci umření
func zaklekni():
	self.animace.play('umrel')
	stuj()
	zakleknuty=true
	
# vrátí stavy pacmana do výchozího stavu
func oziv():
	stuj()
	animace.play('dolu')
	animace.stop()
	zakleknuty=false
	jde=false
	predchozi_smer=DOLU
	normalni_rezim()
	
# pacman má dva pomyslný režimy, akční a normální
# během akčního má zrychlený přehrávání animací a kračí domu kroku a vypouští 
# zadní stranou ty particly
func akcni_rezim():
	doba_kroku=12.0 / AKCNI_FPS
	
	var seznamAnimaci = animace.get_sprite_frames()
	seznamAnimaci.set_animation_speed('dolu',AKCNI_FPS)
	seznamAnimaci.set_animation_speed('prava',AKCNI_FPS)
	seznamAnimaci.set_animation_speed('nahoru',AKCNI_FPS)
	
	self.efekt.emitting = true
	
# noa navopak normální režim kdy chodí pomalejc a nic ze sebe nevypouští ;D ;D
func normalni_rezim():
	doba_kroku=12.0 / NORMALNI_FPS
	
	var seznamAnimaci = animace.get_sprite_frames()
	seznamAnimaci.set_animation_speed('dolu',NORMALNI_FPS)
	seznamAnimaci.set_animation_speed('prava',NORMALNI_FPS)
	seznamAnimaci.set_animation_speed('nahoru',NORMALNI_FPS)
	
	self.efekt.emitting = false
extends 'res://skripty/Figurka.gd'
# duch dědí z figurky
class_name Duch
# duch má tři režimy pohybu
# 'pronásledování' kdy se pohybuje nějak podle souřadice pacmana
# v tom se ty různý duši lišej a každej to dělá nějak jinak
# režim 'rozptýlení' kdy se pohybuje na nějakou předem danou nedosažitelnou pozici
# 'pronásledování' a 'rozptýlení' se střídaj v různejch časovejch intervalech
# poslední je 'vyděšenej' když pacman sežere bonus. si duch pak vybírá směr náhodně na každý křižovatce
# když vyleze z domečku de vždycky doleva
# duch skoro vubec necouvá jediná vyjímka je když se přepne režim duchů z 'pronásledování' nebo 'rozptýlení' do jinýho
#	pak couvat musí :O :O táákže jedinej režim ze kterýho když se duch jakoby přepne a nezačne couvat je 'vystrašení'
# na mapě sou čtyry křižovatky ve kterejch duch nesmí při běžným rozhodování zahnout nahoru
# kromě těch tří režimů z pravidel ještě jakoby musíme vošetřit situace kdy je duch sežranej a de jako domu
# kdy je doma a připravenej na vypuštění nóó akdy z domečku vychází
enum RezimPohybu {ROZPTYLENI, PRONASLEDOVANI, VYDESENI, DOMU, JE_DOMA, VYPOUSTENI}
# duchův nastavenej aktuální režim pohybu 
var rezim=RezimPohybu.ROZPTYLENI
# požadovanej režim pohybu
# do něj se duch přepne při nejbliší možný příležitosti.toje pro situace kdy třeba
# duch právě přestal bejt vystrašenej a je potřeba pokračovat tam kde jakoby přestal
var pozadovany_rezim_pohybu=RezimPohybu.JE_DOMA
# pozice na kterou se duch pořád jakoby snaží dostat
var cilova_pozice
# rozptylová pozice na kterou si duch vybere jako cílovou v režimu rozptýlení
# každej duch má svou jinou rozptylovou pozici
var rozptylova_pozice
# logický souřadnice různejch pro ducha zajímavejch míst v bludišti 
const DOMECEK_POZICE=Vector2(10,13)
const VYPOUSTECI_POZICE=Vector2(9,10)
const POZICE_PRED_DOMECKEM=Vector2(10,10)
# jestli se jako votočí po příštím kroku
var otoc_se=false
# reference na voběkt hráče aby duch moh vědět jestli se s nim zdrcnul
var hrac=null
# rychlost animace a počet jeji snímků
const snimku_za_vterinu=20.0
const kolik_ma_animace_snimku=10.0
# jak moc jakože duch zpomalí když má strach žeby i u něj doma mohla přistát zápalná flaška
const zpomaleni=1.2
var exploze=null
# jakouže má duch barvu. má význam při vytváření instance exploze abyto jako k sobě štimovalo
var barva=null
# jestli duch bliká jestli je právě bliknutej kolik uteklo doby od bliknutí a jak jako bliknutí má dlouho trvat
var blika=false
var bliknuty=false
var cas_blikani=0.0
const DOBA_BLIKNUTI=0.1
# signály co duch posílá do herní scény 'Hra.tscn'
# signál když ho hráč sežere
signal sezranej
# signál když duch dorazí domu. signál v sobe má skovanou informaci kterejže duch to jako je
signal doma(ktery)
# signál kdyý zakleknul hráče
signal zakleknuti
# křižovatky na kterejch duch normálně nemůže zabočit nahoru
var specialni_krizovatky = [Vector2(9.0,10.0),Vector2(11.0,10.0),Vector2(9.0,20.0),Vector2(11.0,20.0)]
# věc  co dělá že zní padaj skoro uplně náhodný čísla :O ;D
var generatorNahodnychCisel = RandomNumberGenerator.new()
# efekt výbuchu
const VYBUCH_SKRIPT = preload('res://skripty/Exploze.gd')
# napojíme posílaný signály na vodpovídající callbacky v herní scénce
# ta se tam strká jako kořen ke kterýmu seto bude napojovat
func napojit_signaly(koren):
	self.connect('sezranej',koren,'_on_Duch_sezranej')
	self.connect('doma',koren,'_on_Duch_doma')
	self.connect('zakleknuti',koren,'_on_Duch_zakleknuti')
# nastavování atributů co by normálně dělal konstruktor je řešený toudletou metodou
# oběkt budem několikrát přenastavovat takže mito připadá lacinější než vyrábět furt nový a nový
func nastav(okraj,hrac,logicka_pozice,rezim_pohybu):
	self.okraj=okraj
	self.hrac=hrac
	self.logicka_pozice=logicka_pozice
	self.position=(logicka_pozice*64) + Vector2(32,32)
	self.rezim=rezim_pohybu
	self.pozadovany_rezim_pohybu=RezimPohybu.JE_DOMA
	self.cilova_pozice = VYPOUSTECI_POZICE
	self.predchozi_smer=Figurka.DOLU
# funkce co nám z atlasu vygeneruje potřebný animace ducha
#  když se na vobrázek s tim atlasem duchů mrknete tak uvidíte že ty duchové sou jednak
# srovnaný za sebou podle barev (dovopravdy teda jako podle názvů ale pšššt:D ;D) nóó a taky taky že 
# sou seřazený ty jednotlivý animace u každýho ducha pokaždý stejně
# no budem je brát z toho atlasu podle počátečního indexu 
func vygeneruj_animace(pocatecni_index,prefix,fps):
	
	# vezmem z animace seznam animací
	var seznamAnimaci=animace.get_sprite_frames()
	
	# pokud jeto nulová instance nóó tak vyrobíme novou
	if seznamAnimaci==null:
		seznamAnimaci=SpriteFrames.new()
		
	# přidáme názvy animací do seznamu 
	seznamAnimaci.add_animation(prefix+'dolu')
	seznamAnimaci.add_animation(prefix+'nahoru')
	seznamAnimaci.add_animation(prefix+'prava')
	
	# noa teďko budem přidávat samotný snímky animací
	var index=pocatecni_index
	# přidáme animaci v seznamu s vodpovídajícím názvem texturu podle indexu
	for i in range(6):
		seznamAnimaci.add_frame(prefix+'dolu',textura_z_atlasu_indexem(atlas,i+index))
		
	# pak ještě přidáme pozpátku snímky mimo prvního a posledního aby se nám animace jakože 
	# vracela zpátky nazačátek
	for i in range(1,5):
		seznamAnimaci.add_frame(prefix+'dolu',textura_z_atlasu_indexem(atlas,(5-i)+index))
		
	# posunem se v tom vobrázku zvětšením indexu a berem další animaci.....
	index+=6
	for i in range(6):
		seznamAnimaci.add_frame(prefix+'prava',textura_z_atlasu_indexem(atlas,i+index))
	for i in range(1,5):
		seznamAnimaci.add_frame(prefix+'prava',textura_z_atlasu_indexem(atlas,(5-i)+index))
		
	index+=6
	for i in range(6):
		seznamAnimaci.add_frame(prefix+'nahoru',textura_z_atlasu_indexem(atlas,i+index))
	for i in range(1,5):
		seznamAnimaci.add_frame(prefix+'nahoru',textura_z_atlasu_indexem(atlas,(5-i)+index))
	
	# nakonec nastavíme rychlosti přehrávání těch animací
	seznamAnimaci.set_animation_speed(prefix+'dolu',fps)
	seznamAnimaci.set_animation_speed(prefix+'prava',fps)
	seznamAnimaci.set_animation_speed(prefix+'nahoru',fps)
	
	# a nastavíme je zpátky tomu voběktu
	animace.set_sprite_frames(seznamAnimaci)
func _ready():
	#bod [0,0] spritu leží v jeho středu
	# my chceme aby duch jakoby stál na jednom políčku a vyčuhoval jakoby nahoru
	#posuneme počátek o 32 teda půlku velikosti čtverečku nahoru
	animace.offset.y = -32
	# načtem atlas všech vobrázků s duchama
	atlas = preload('res://obrazky/duchove.png')
	
	# atlas je širkoej šestnáct vobrázků našířku a vobrázek je vysokej 128 pixelů
	# tyhlety hodnoty sou důležitý aby nám jako fungovala metoda 'textura_z_atlasu_indexem()' 
	# poděděná z rodičovský třídy 'Figurka'
	sirka_atlasu = 16
	vyska_obrazku = 128
	
	# krok přesunu figurky ducha nám trvá upně stejně dlouho jako doba přehraní animace kroku
	doba_kroku = kolik_ma_animace_snimku / snimku_za_vterinu
	
	# před používáním generátoru náhodnej šísel ho musíme jakože iniciialioizovat
	#jako seed je strčenej čas právě teď
	generatorNahodnychCisel.randomize()
	vygeneruj_animace(75,'sezratelnej_',snimku_za_vterinu)
	
	var seznamAnimaci=animace.get_sprite_frames()
	
	seznamAnimaci.add_animation('voci_dolu')
	seznamAnimaci.add_frame('voci_dolu',textura_z_atlasu_indexem(atlas,72))
	seznamAnimaci.set_animation_speed('voci_dolu',1)
	
	seznamAnimaci.add_animation('voci_nahoru')
	seznamAnimaci.add_frame('voci_nahoru',textura_z_atlasu_indexem(atlas,73))
	seznamAnimaci.set_animation_speed('voci_nahoru',1)
	
	seznamAnimaci.add_animation('voci_prava')
	seznamAnimaci.add_frame('voci_prava',textura_z_atlasu_indexem(atlas,74))
	seznamAnimaci.set_animation_speed('voci_prava',1)
	
	animace.play('sezratelnej_dolu')
	
	barva=Color(0.0,0.0,1.0,1.0)
	exploze=load('res://sceny/veci/Exploze.tscn')
func _process(delta):
	
	# když končí efekt molotovu tak duch zčne blikat jakože zase přepne sou barvu
	# z modrý na původní a bude zase pro pacmana děsně nebezpečnej
	if blika:
		#budem si skovávat do proměný cas_blikani uplinutou dobu nóó a až když 
		# jakoby překroční nějakou tu mez tak přepnem zvhled ducha 
		# kterej zhled je aktivní řeší jako proměná 'bliknuty'
		if cas_blikani<DOBA_BLIKNUTI:
			cas_blikani+=delta
		else:
			if bliknuty:
				blikni_na_normalni()
			else:
				blikni_na_sezratelnej()
			cas_blikani=0.0
			bliknuty = !bliknuty
		
	
	# budem čekat na kolizi ducha s hráčem a když seto stane tak buďto duch hráče
	# zaklekne nóó a nebo když je duch vystrašenej tak hráč zpapá :O ;D
	
	#pokud bude zdálenost hráče a ducha menčí než dvacetina jejich velikosti budem to
	# jakoby považovat za kolizi těch dvou figurek
	# možná vás napadá žeby jako stačilo porovnávat jestli jako sou jejich logický pozice stejný
	# jakože jestli self.logicka_pozice==hrac.logicka_pozice. jenže vona poměrně často nastávala situace
	# že duch a hráč ze sousedních políček udělaj krok proti sobě ve stejnej vokamžik a normálně
	# jako skrz sebe projdou :O :O dělá tota skoková změna těch logickejch souřadnic
	# buťto bysme museli přidat nějakou logiku navíc coby jako hlídala žese to stane nóó
	# a nebo to udělat takle 'fyzykálně' :O ;D
	if self.position.distance_to(hrac.position)<12.8:
		
		# pokud je duch vyděšenej tak ho pacman muže sníst
		if rezim == RezimPohybu.VYDESENI:
			
			# pošlem signál do herní scény 'Hra.tscn' žeje duch sežranej pacmanem
			emit_signal('sezranej')
			
			# uděláme modrej výbuch a dáme ho do stromu
			var bum = VYBUCH_SKRIPT.new(self.position,Color(0.0,0,1.0,1.0))
			get_parent().add_child(bum)
			animace.stop()
			# přepnem vobrázek ducha na voči
			# voči nejsou žádná pořádná animace jeto jenom jeden jedinej vobrázek
			# pro každej ten směr 
			self.prepni_animaci('voci_')
			animace.play('voci_dolu')
			modulate.a = 1.0 # vypnutí modulace alpha kanálu aby jakože nebyl průsvitnej
			
			# zrychlíme a pošlem domu
			doba_kroku = 0.25
			cilova_pozice = DOMECEK_POZICE
			rezim = RezimPohybu.DOMU
		
		# noa jestli je duch v rozptylovacím nebo pronásledovacím režimu tak
		# pacmana normálně zabije :O :O :O :O
		# von ho teda nezabije ten duch duch jenom zase pošle signál do herní scény
		# a ta si to už nějak jakoby udělá :O :D ;D ;D
		elif rezim < RezimPohybu.DOMU:
			if not hrac.zakleknuty:
				emit_signal('zakleknuti')
# zapnutí režimu rozptýlení
# v něm de duch na svou rozptylovou pozici
func nastav_rezim_rozptyleni():
	
	# pokuť je duch doma de domu nebo právě vylejzá režim se zapne při příští příležitosti
	if rezim>RezimPohybu.VYDESENI:
		pozadovany_rezim_pohybu=RezimPohybu.ROZPTYLENI
		return
	# při první příležitosti se duch MUSÍ votočit a jít zpátky
	otoc_se=true
	
	rezim=RezimPohybu.ROZPTYLENI
	cilova_pozice=rozptylova_pozice
	
#ducha jako nejde vyděsit když se skovává v domečku 
# nebo když je sežranej a mrtvej se vrací domu
# pro vycházení jeto vymyšlený tak žeho de vyděsit jenom kdyžuž je za dveřma
# teda když má stejnou ypsilonovou souřadnici jako má vypoštěcí pozice
func nastav_rezim_vydeseni():
	if rezim == RezimPohybu.VYPOUSTENI and logicka_pozice.y != VYPOUSTECI_POZICE.y:
		return
	elif rezim>RezimPohybu.VYDESENI:
		return
	
	if rezim != RezimPohybu.VYDESENI:
		
		# až vyděšení skončí se zase vrátí do předchozího režimu v jakým byl
		pozadovany_rezim_pohybu = rezim
		rezim = RezimPohybu.VYDESENI
		
		# zprůhledníme zpomalíme a votočíme
		modulate.a = 0.75
		doba_kroku *= zpomaleni
		otoc_se = true
		
	else:
		# pokud už vyděšenej jakoby je tak akorát vypnem případný blikání
		blika = false
		
	#nastavíme zhlez spritu ducha na sežratelnej jakože modrý průsvitný animace
	blikni_na_sezratelnej()
# ukončení režimu vyděšení
# duch se vrátí do režimu ve kterým byl a přepne svuj zvhled na normální
func ukonci_rezim_vydeseni():
	if rezim != RezimPohybu.VYDESENI:
		return
	self.normalni_zhled()
	rezim=pozadovany_rezim_pohybu
	
# uplně stejný jako s režimem rozptýlení
func nastav_rezim_pronasledovani():
	
	if rezim > RezimPohybu.VYDESENI:
		pozadovany_rezim_pohybu = RezimPohybu.PRONASLEDOVANI
		return
	otoc_se = true
	rezim = RezimPohybu.PRONASLEDOVANI
	
#duch z domečku dycky de doleva
#pošlem ho nalevo vod dveří a pak ať si stim nějak poradí sám
func vypustit_ducha():
	cilova_pozice = VYPOUSTECI_POZICE
	rezim = RezimPohybu.VYPOUSTENI
	
# nastavení normálního zvhledu ducha
# vypnem případný blikání průhlednost 
# nastavíme výchozí animace jakože 'nahoru' 'dolu' a 'prava'
# a nastavíme normální rychlost pohybu
func normalni_zhled():
	blika = false
	modulate.a = 1.0
	self.prepni_animaci()
	doba_kroku = kolik_ma_animace_snimku / snimku_za_vterinu
# zapnutí blikání ducha
func rozblikat():
	#rozblikat mužem jenom vystrašenýho ducha
	if rezim == RezimPohybu.VYDESENI:
		blika=true
		bliknuty=false
		cas_blikani=0.0
# přepnem zvhled ducha z toho jakej právě okamžitě je na sežratelnej jakože
# modrej
func blikni_na_sezratelnej():
	#nemůžeme blikat když je duch v domečku
	if rezim!=RezimPohybu.VYDESENI:
		return
	
	# musíme přepnou současnou aktuální animaci bez toho aby se jakoby zastavila
	# skováme si index/pořadí právě hranýho vokýnka animace do proměný 'okynko_animace'
	var okynko_animace=self.animace.get_frame()
	
	# vyberem aktivní animaci sežratelnýho ducha ze seznamu podle toho
	# kam jakoby má namířeno
	match self.predchozi_smer:
		NAHORU:
			self.animace.play('sezratelnej_nahoru')
		PRAVA, LEVA:
			self.animace.play('sezratelnej_prava')
		DOLU:
			self.animace.play('sezratelnej_dolu')
	
	# a v animaci dáme jako aktuální okýnko animace okýnko se samým pořadím/indexem
	# jako tam bylo předtim v tý minulý animaci
	# voni se ty animace překrejvaj takže to bude vypadat že ten duch jenom zněnil
	# svou barvičku 
	self.animace.set_frame(okynko_animace)
	
	# pro další hraní zapnem sadu animací s perexem 'sezratelnej_'
	# to sou ty modrý
	self.prepni_animaci('sezratelnej_')
	
func blikni_na_normalni():
	#nemůžeme blikat když je duch v domečku
	if rezim!=RezimPohybu.VYDESENI:
		return
	
	# vezmeme index vokýnka právě hraný animace
	var okynko_animace=self.animace.get_frame()
	# uplně fuj způsobem ufiknem tamten substring 'sezratelnej_' z názvu animace aco
	# zbyde dáme hrát
	# ty animace se menujou uplně stejně akorátže sežratelný tam maj před názvem ten kus s podtržítkem
	self.animace.play(self.animace.get_animation().substr(len('sezratelnej_')))
	
	# a u přepnutý animace dáme stejný vokýnko
	self.animace.set_frame(okynko_animace)
	
	# nakonec aktivujem výchozí sadu animací pro další hraní
	self.prepni_animaci()
# s timdletim budou dělat něco až dětský třídy
# každej duch si to dělá jakoby posvým a uplně jinak :O :O
func urci_cil_pronasledovani():
	pass
	
# metoda kterou se duch jakože rozhoduje coje pro něj jako nejkratčí cesta k cíli
# nóóóó neni moc chytrej :O :O :D ;D
# duch má jedno až tři sousední políčka na který muže jít (couvat nesmí) noa zná souřadnici svýho cíle
# změří euklidovskou zdálenost všech těch políček a cíle noa vybere si to políčko
# kde mu to jakože vyšlo nejmíň
func urci_nejkraci_smer_k_cili():
	var vzdalenost=INF #tamto INF je jakože nekonečno. prostě max možná hodnota čísla
	var smer=null
	
	#jestli chceme jít s duchem nahoru se nejdřiv musíme kouknout jestli jako nejsle na tý nějaký extra křižovatce
	if predchozi_smer != DOLU and not specialni_krizovatky.has(logicka_pozice) and muzu_jit(NAHORU):
		vzdalenost=cilova_pozice.distance_to(logicka_pozice+NAHORU)
		smer=NAHORU
		
	if predchozi_smer != LEVA and muzu_jit(PRAVA):
		var nova_vzdalenost=cilova_pozice.distance_to(logicka_pozice+PRAVA)
		# pokud nemáne ještě vybranej směr nebo je nová vzdálenost menčí než předchozí tak políčko vyberem
		if smer == null or vzdalenost > nova_vzdalenost:
			vzdalenost = nova_vzdalenost
			smer = PRAVA
			
	if predchozi_smer != NAHORU and muzu_jit(DOLU):
		var nova_vzdalenost = cilova_pozice.distance_to(logicka_pozice+DOLU)
		if smer == null or vzdalenost > nova_vzdalenost:
			vzdalenost = nova_vzdalenost
			smer = DOLU
			
	if predchozi_smer != PRAVA and muzu_jit(LEVA):
		var nova_vzdalenost = cilova_pozice.distance_to(logicka_pozice+LEVA)
		if smer == null or vzdalenost > nova_vzdalenost:
			vzdalenost = nova_vzdalenost
			smer = LEVA
			
	return smer
	
# funkce co zišťuje jestli duch jako muže nějakým zadaným směrem udělat krok dopředu
func muzu_jit(smer):
	#duch nám nesmí projít jentak dveřma domečku
	#muže jenom když ho vypouštíme nebo se jako sežranej vrací
	#procházení ducha dveřma
	#chceme aby se dveře někdy chovali jako překážka noa někdy tam zase jako vubec nebyly
	#duch muže projít jenom když se vracej voči domu nebo ho vypouštíme z domečku
	#dveře sou na pozici (10,11)
	# poznámka - todleto nijak nesouvisí vobrázkem dveří v bludišti a jejich votvíráním. toje
	# 	řízený metodou objektu scény bludiste.tscn a duch nato kašle jak dveře jako vypadaj
	if not rezim==RezimPohybu.DOMU and not rezim==RezimPohybu.VYPOUSTENI:
		if smer==NAHORU and self.logicka_pozice==Vector2(10,12):
			return false
		elif smer==DOLU and self.logicka_pozice==Vector2(10,10):
			return false
	
	#zavoláme metodu muzu_jit() rodičovský třídy Figurky
	return .muzu_jit(smer)
# funkce co vybere náhodnej směr kterým muže duch jít jakoby ze svý současný pozice
# duch se nesmí vracet noa procházet vokrajema
func nahodny_smer():
	
	# nejdřiv naplníme pole možnejma směrama kterejma byse jako dalo jít
	var smery=[]
	
	if predchozi_smer!=LEVA and muzu_jit(PRAVA):
		smery.append(PRAVA)
	if predchozi_smer!=PRAVA and muzu_jit(LEVA):
		smery.append(LEVA)
	if predchozi_smer!=DOLU and muzu_jit(NAHORU):
		smery.append(NAHORU)
	if predchozi_smer!=NAHORU and muzu_jit(DOLU):
		smery.append(DOLU)
	
	# a vrátíme z pole náhodnej prvek
	return smery[generatorNahodnychCisel.randi() % smery.size()] 
	
#overriddnutej callback tweenu volanýho když skončí krok figurky
#budem v něm dělat duchovu logiku
func _on_TweenKroku_tween_completed(objekt,klic):
	#tou tečkou zavoláme tu samou metodu rodičovskýho oběktu
	._on_TweenKroku_tween_completed(objekt,klic)
	#pokud duch vleze do dírovýho 'teleportu' na straně vobrazovky udělá eště jeden
	#krok ve stejným směru a nepřemejšlí kam má jít
	# v takovýp případě nám tween skončí 
	if jde:
		return
		
	var smer=null
	
	# pokud se má duch votočit no tak prostě udělá krok vopačným směrem než předtim 
	# a hotovo jako
	if otoc_se:
		smer = predchozi_smer * -1
		otoc_se=false
		jdi(smer)
		return
	
	# výběr kroku podle režimu ve kterým duch právě jako je
	match rezim:
		RezimPohybu.VYPOUSTENI:
			#přepnem režim a pošlem ducha dál
			if logicka_pozice==VYPOUSTECI_POZICE:
				rezim=pozadovany_rezim_pohybu
				smer=predchozi_smer
			else:
				smer=urci_nejkraci_smer_k_cili()
				
		RezimPohybu.ROZPTYLENI:
			smer=urci_nejkraci_smer_k_cili()
				
		RezimPohybu.PRONASLEDOVANI:
			urci_cil_pronasledovani()
			smer=urci_nejkraci_smer_k_cili()
			
		# kdž je duch jenom takovejma vočima a letí děsně rychle domu
		RezimPohybu.DOMU:
			#noa až duch dorazí domu ho voživíme a pošlem z domečku na jeho rozptylovou pozici
			if logicka_pozice==DOMECEK_POZICE:
				
				#uděláme efekt výbuchu :D
				var instance=VYBUCH_SKRIPT.new(self.position,barva)
				get_parent().add_child(instance)
				
				# vobnovíme normální zhled a dáme vědět herní scéně žeje duch doma
				rezim=RezimPohybu.JE_DOMA
				emit_signal('doma',self)
				normalni_zhled()
				
			smer=urci_nejkraci_smer_k_cili()
			
		#pokud je duchdoma nebo vyděšenej tak se jenak náhodně poflakuje
		RezimPohybu.VYDESENI, RezimPohybu.JE_DOMA:
			smer=nahodny_smer()
			
	#noa nakonec uděláme krok vybraným směrem
	jdi(smer)
			
extends 'res://skripty/Duch.gd'
var cervenejDuch=null
#samo že mě tady napadlo udělat poděděnej konstruktor nastav() kterej by jako navíc bral 
# argument červenej duch nóó ale nesnese to když se poděděná metoda menuje stejně ale má
# jinej počet argumentů :O :O :'( :'(
func _ready():
        rozptylova_pozice=Vector2(20,28)
        vygeneruj_animace(0,'',self.snimku_za_vterinu)
        barva=Color(0.0,1.0,1.0,1.0)
        #jdi(LEVA)
# azurovej duch je lump nejvěčí!!!! :O :O
# narozdíl vod vostatních duchů umí jednoduchej vodhad pacmanovi budoucí pozice
# vezme se pozice pronásledovacího červenýho ducha a pozice dvě políčka před pacmanem
# mezi těmadle dvouma bodama se udělá vektor jeho dýlka se zdvojnásobí
# pak se přičte pozice tamtoho červenýho pronásledovacího ducha a máme cílovou pozici
# azurovýho ducha
func urci_cil_pronasledovani():
        # dvě políčka před hráčem
        var pozice_hrace=hrac.logicka_pozice + hrac.predchozi_smer*2
        # vektorovej výpočet (pacman-cervenej_duch)*2+cervenej_duch zjednodušíme na 2*pacman-cervenej_duch
        cilova_pozice=pozice_hrace*2-cervenejDuch.logicka_pozice
extends 'res://skripty/Duch.gd'
func _ready():
        rozptylova_pozice=Vector2(20,-2)
        vygeneruj_animace(36,'',self.snimku_za_vterinu)
        barva=Color(1.0,0.0,0.0,1.0)
#červenej duch prostě pronásleduje pacmana a furt jakoby de na stejný políčko na
#kterým pacman přávě stojí
func urci_cil_pronasledovani():
        cilova_pozice=hrac.logicka_pozice
extends 'res://skripty/Duch.gd'
func _ready():
        rozptylova_pozice=Vector2(0,28)
        vygeneruj_animace(54,'',self.snimku_za_vterinu)
        barva=Color('#cec545')
#oranžovej duch normálně pronásleduje pacmana ale jakmile k sobě přídou blíž než na 8
#políček si vybere jako cíl svuj rozptylovej bod
func urci_cil_pronasledovani():
        if self.logicka_pozice.distance_to(hrac.logicka_pozice)<8:
                cilova_pozice=rozptylova_pozice
        else:
                cilova_pozice=hrac.logicka_pozice
extends 'res://skripty/Duch.gd'
func _ready():
        rozptylova_pozice=Vector2(0,-2)
        vygeneruj_animace(18,'',self.snimku_za_vterinu)
        barva=Color('#ffb8ff')
# růžovej duch míří čyty políčka před hráče
func urci_cil_pronasledovani():
        cilova_pozice=hrac.logicka_pozice + hrac.predchozi_smer*4
extends 'res://skripty/VecNaMape.gd'
class_name Bonus
# existujou čtyry druhy bonusu
# iphone, krabice nike televize apak molotvej koktejl
enum {IPHONE,NIKE,TV,MOLOTOV}
# signály hlavní scéně jestli jako přidat nějaký body nebo aktivovat vyděšenej režim duchů
signal pridej_body(pocet)
signal molotov
var hrac=null
var atlas=null
var animace=null
const sirka_atlasu=8
	
var druh=0
var pocet_bodu=0
# jóó teroreticky bysme mohli dědit metodu ztý společný třídy 'VecNaMape' když ji máme i 
# ve 'Figurce'. mi tam ale atlas nějak neštymuje ktý třídě 'VecNaMape' by se asi
# jako měla menovat nějak jinak....... :O :O :/ :/
# než se ale jako voběktový vorientálci navzájem ňák jakoby dohodnou já už tam
# budu mit metodu nahrubo copypastnutou :O :O fuj!!!! :O :O :D :D ;D
func textura_z_atlasu_indexem(index):
	var textura=AtlasTexture.new()
	textura.atlas=atlas
	textura.region = Rect2((index % sirka_atlasu) * 64, (index / sirka_atlasu) * 64, 64, 64)
	return textura
# každá ta věc jako má jednu animaci kdy se jakoby točí namístě :O ;D
func vygeneruj_z_atlasu_animaci(prvni_snimek,posledni_snimek,nazev,fps=6):
	var seznamAnimaci=self.animace.get_sprite_frames()
	if seznamAnimaci==null:
		seznamAnimaci=SpriteFrames.new()
		
	seznamAnimaci.add_animation(nazev)
	
	for i in range(prvni_snimek,posledni_snimek):
		seznamAnimaci.add_frame(nazev,textura_z_atlasu_indexem(i))
		
	seznamAnimaci.set_animation_loop(nazev,true)
	seznamAnimaci.set_animation_speed(nazev,fps)
	self.animace.set_sprite_frames(seznamAnimaci)
# pokud je hráč na stený souřadnic  a bonus je viditelnej takže sebratelnej
# nóó tak ho jako seberem
func _process(delta):
	if self.visible and hrac.logicka_pozice==logicka_pozice:
		sebrano()
func napojit_signaly(koren):
	self.connect('molotov',koren,'_on_Bonus_molotov')
	self.connect('pridej_body',koren,'_on_Bonus_pridej_body')
# konstruktor
func _init(druh_bonusu,pozice,hrac):
	
	druh=druh_bonusu
	logicka_pozice=pozice
	self.hrac=hrac
	self.position.x=logicka_pozice.x*64+32
	self.position.y=logicka_pozice.y*64+32
	
func nastav_druh(druh):
	self.druh=druh
	match druh:
		IPHONE:
			pocet_bodu=100
			self.animace.play('iphone')
		NIKE:
			pocet_bodu=200
			self.animace.play('nike')
		TV:
			pocet_bodu=300
			self.animace.play('tv')
		MOLOTOV:
			self.animace.play('molotov')
			
func _ready():
	
	atlas=preload('res://obrazky/ruzne.png')
	self.animace=AnimatedSprite.new()
	self.add_child(self.animace)
	
	#jeto vždycky po devíti index těch vobrázků
	vygeneruj_z_atlasu_animaci(2,11,'iphone')
	vygeneruj_z_atlasu_animaci(20,29,'nike')
	vygeneruj_z_atlasu_animaci(29,38,'tv')
	vygeneruj_z_atlasu_animaci(11,20,'molotov')
			
	self.nastav_druh(self.druh)
# volaný když hráč bonus sebere
func sebrano():
	# dáme vědět hlavní scénce
	if druh != MOLOTOV:
		emit_signal('pridej_body',pocet_bodu)
	else:
		emit_signal('molotov')
	#zneviditelníme oběkt jakože je sebranej
	self.visible=false
extends Control
var rozliseni
func vyrob_a_pridej_napis(font,align=Label.ALIGN_CENTER):
	var napis=Label.new()
	napis.set_size(Vector2(rozliseni.x,64))
	napis.set('custom_fonts/font', font)
	napis.add_color_override('font_color', Color(1,0,0))
	napis.align=align
	self.add_child(napis)
	return napis
func _ready():
	# načtem a zapnem muziku
	var hudba = AudioStreamPlayer.new()
	hudba.stream=preload('res://zvuky/hudbaMenu.ogg')
	self.add_child(hudba)
	hudba.play()
	
	var obrazek=Sprite.new()
	obrazek.texture=preload('res://obrazky/main_menu.png')
	var sirka = 1344
	var vyska = 1792
	var velikostObrazku=obrazek.texture.get_size()
	obrazek.centered=false
	obrazek.set_scale(Vector2(sirka/velikostObrazku.x, vyska/velikostObrazku.y))
	self.add_child(obrazek)
	
	#načtem *.ttf fonty
	var font_titulku = DynamicFont.new()
	font_titulku.font_data = load('res://fonty/font.ttf')
	font_titulku.size = 96
	font_titulku.outline_size=4
	font_titulku.outline_color=Color(0,0,0,1)
	
	var font_textu = DynamicFont.new()
	font_textu.font_data = load('res://fonty/font.ttf')
	font_textu.size = 30
	font_textu.outline_size=3
	font_textu.outline_color=Color(0,0,0,1)
	
	rozliseni=get_viewport_rect().size
	
	var titulek=vyrob_a_pridej_napis(font_titulku)
	titulek.text='Credits'
	
	var textik=vyrob_a_pridej_napis(font_textu)
	textik.set_position(Vector2(0,64*9))
	textik.text='V Godotu udělala Gréta volně podle \n'
	textik.text+='originálního pacmana vod číňana Tora Iwataniho,\n\n'
	textik.text+='zvuky sou vod Little Robot Sound Factory,\n www.littlerobotsoundfactory.com\n\n'
	textik.text+='hudba je vod TinyWorlds, Tyrfinga a Daniela Stephense,\n všecko z opengameart.org\n\n'
	textik.text+='font je vocaď https://fontmeme.com/fonts/akadylan-font\n\n'
	textik.text+='joa vobrázky sem dělala/upravovala sama,\nvšecko blender/krita/koulourpaint :D ;D'
	textik.text+='\n\n\npodobnost s jakoukoliv živou vosobou nebo zvířetem\n je jakože fakt čistě náhodná :O ;D\n\n'
	textik.text+='hra byla udělaná za účelem podpoření americkejch\nrasovejch nepokojů a pouliční civilní války\n'
	textik.text+='#BLEK.livesMatter!!!!!!!!!!!! :O :D :D ;D'
	
	var tlacitko_zpet=Button.new()
	tlacitko_zpet.set('custom_fonts/font', font_textu)
	tlacitko_zpet.add_color_override('font_color', Color(1,0,0,1))
	tlacitko_zpet.text='Zpět'
	tlacitko_zpet.rect_size=Vector2(rozliseni.x/2,64)
	tlacitko_zpet.rect_position.x=rozliseni.x/4
	tlacitko_zpet.rect_position.y=64*25
	
	tlacitko_zpet.connect('pressed',self,'_on_TlacitkoZpet_zmacknuto')
	
	self.add_child(tlacitko_zpet)
	
	tlacitko_zpet.grab_focus()
	
#návrat do hlavního menu
func _on_TlacitkoZpet_zmacknuto():
	get_tree().change_scene('res://sceny/HlavniMenu.tscn')
extends Node2D
# uplně jednoduchej výbuch
var efekt
var casovac
# konstruktor s argumentama pozicí a barvou výbuchu
func _init(pozice,barva):
	
	self.position=pozice
	self.z_index=16
	
	self.efekt = Particles2D.new()
	
	efekt.amount=64
	efekt.lifetime=0.3
	
	# efekt se nám pustí jenom jednou
	# vyhodí těch 64 particlů a další generovat nebude
	efekt.one_shot=true
	
	# obrázek jednotlvejch částic. nemůžem použít atlas
	efekt.texture=preload('res://obrazky/castice.png')
	
	var material=ParticlesMaterial.new()
	
	# částečky budem vypouštět ve směru nahoru z kruhu o poloměru 32 pixelů
	# materiál má defautně zapnutou gravitaci 9.8g
	material.emission_shape=ParticlesMaterial.EMISSION_SHAPE_SPHERE
	material.emission_sphere_radius=32.0
	material.direction=Vector3(0.0,-1.0,0.0)
	
	#rozptyl v úhlu vypuštěnejch particlů
	material.spread=90.0
	
	material.initial_velocity=128.0
	material.color=barva
	
	efekt.process_material=material
	
	casovac = Timer.new()
	
	self.add_child(efekt)
	self.add_child(casovac)
	
func _ready():
	# začnem vypouštět
	efekt.emitting=true
	
	# v godotu nemá particle žádnou metodu kterou bysme jako zistili jestli efekt
	# má ještě nějaký živý particly a je načase voběkt vodstranit ze scény
	# prostě počkáme dobu delší než je doba života těch partilců takže budem mit
	# jistotu že už žádný particly nejsou a mužem voběkt dát do pryč ;D
	casovac.start(5)
	
func _process(delta):
	# nemusíme jenom čekat na signály mužem koukat na zbejvající čas časovače ručně
	if casovac.time_left<1:
		queue_free()
extends Control
# takže co tady jako budeme dělat :O :O
# vyrobíme si jednoduchý meníčko se třema mačkátkama
# jedno mačkátko začne novou hru druhý mačátko ukáže tabulku nejvyších skóre s ménama
# noa poslední mačkátko ukáže credits
#abyto bylo takový zajímavější tak tam strčíme obrázek pacmana kterej se jakoby přikulí ze 
# starny doprostředka vobrazovky a až se přikulí tak z nebe jakoby spadne obrázek titulku tý
# naší hry
# noa abyto nebylo takový statický tak se pacman jakoby začne houpat na místě
var rozliseni
var pacman=null
var naklony=[20,-20]
var tweenNaklaneni=null
var tweenSestupuLoga=null
# jak který ty kroky našeho 'inra' budou jako trvat dlouho
const DOBA_ANIMACE_PRIKULENI = 1.0
const DOBA_SESTUPU_LOGA = 0.5
# si myslim že je nohem praktičtější gělat gui přímo v tom jejich editůrku ale aby jako
# bylo copypastovatelný tak semho udělala ve skriptu
func _ready():
	
	# uplně nazačátku hry vynulujem počítadlo skóre
	Skore.skore = 0
	
	# načtem a zapnem muziku
	var hudba = AudioStreamPlayer.new()
	hudba.stream=preload('res://zvuky/hudbaMenu.ogg')
	self.add_child(hudba)
	hudba.play()
	
	rozliseni=get_viewport_rect().size
	
	#načtem *.ttf font
	var font_titulku = DynamicFont.new()
	font_titulku.font_data = load('res://fonty/font.ttf')
	font_titulku.size = 48
	font_titulku.outline_size=4
	font_titulku.outline_color=Color(0,0,0,1)
	
	# nejdřiv na scénu strčíme obrázek pozadí by se jako vykresloval jako první a teda 
	# jako i uplně vespod pod jinejma věcma
	var obrazek=Sprite.new()
	obrazek.texture=preload('res://obrazky/main_menu.png')
	var sirka = 1344
	var vyska = 1792
	var velikostObrazku=obrazek.texture.get_size()
	obrazek.centered=false
	obrazek.set_scale(Vector2(sirka/velikostObrazku.x, vyska/velikostObrazku.y))
	self.add_child(obrazek)
	
	# všecky prvky gui budem strkat do kontejnéru kterej nám je bude v sobě hezky umisťovat a 
	# zvěčovat na požadovaný rozměry
	# použijem vertikální box abynám to tlačítka jakoby rovnalo nad sebe
	var kontejner=VBoxContainer.new()
	kontejner.rect_min_size=rozliseni-Vector2(64,rozliseni.y/2)
	kontejner.rect_size=rozliseni-Vector2(64,rozliseni.y/2)
	kontejner.rect_position.x+=32
	kontejner.rect_position.y=rozliseni.y/2
	
	self.add_child(kontejner)
	
	# vyrobíme tlačítka
	var tlacitko_hraj=Button.new()
	var tlacitko_skore=Button.new()
	var tlacitko_credits=Button.new()
	# a nastrkáme je do kontejneru
	kontejner.add_child(tlacitko_hraj)
	kontejner.add_child(tlacitko_skore)
	kontejner.add_child(tlacitko_credits)
	
	for tlacitko in kontejner.get_children():
	
		# iksovej rozměr nemá smysl protože vbox kontík je roztáhne na max šířku kterou muže
		tlacitko.rect_min_size=Vector2(0,256)
	
		# každej z prvků menu má size_flags pro vertikální a horizontální rozměr
		# určujou jak se prvek rozztáhne a umístí v prostoru kontejneru kterej jakoby má k dispozici
		# nóó a flag SIZE_EXPAND řiká mačkátkům aby se jako vertikálně rozmístili co nejdál vod sebe 
		tlacitko.size_flags_vertical=Button.SIZE_EXPAND
		tlacitko.set('custom_fonts/font', font_titulku)
		tlacitko.add_color_override('font_color', Color(1,0,0,1))
	# a dáme dlačítku hraj 'zaměření'
	# toje jakože ten prvek je aktivní. jeto stejný jako když někde na webu vyplňujete formulář 
	# tak taky bejvá aktivní právě jenom jediný vyplňovátko v tom formuláři
	# jeto jako bysme nato třeba klikli myší
	# my nechcem aby hráč dával ruce pryč z klávesnice a zkoumal co jako s tim
	# tak tam ten focus strčíme ručně
	# grab_focus() funguje jenom kdyžuž je node na scéně
	tlacitko_hraj.grab_focus()
	
	# dáme tlačítkům popisky a signálovitý callbacky
	tlacitko_hraj.text='Hraj'
	tlacitko_hraj.connect('pressed',self,'_on_TlacitkoHraj_pressed')
	tlacitko_skore.text='Nejvyší skóre'
	tlacitko_skore.connect('pressed',self,'_on_TlacitkoSkore_pressed')
	tlacitko_credits.text='Credits'
	tlacitko_credits.connect('pressed',self,'_on_TlacitkoCredits_pressed')
	
	# přidáme logo
	var logo=Sprite.new()
	logo.texture=load('res://obrazky/pacman_logo.png')
	logo.centered=false
	logo.position=Vector2(0,-500)
	self.add_child(logo)
	
	# a necháme ho spadnout
	tweenSestupuLoga=Tween.new()
	tweenSestupuLoga.interpolate_property ( logo, 'position', logo.position, Vector2(0,0), DOBA_SESTUPU_LOGA, Tween.TRANS_ELASTIC, Tween.EASE_IN_OUT)
	add_child(tweenSestupuLoga)
	
	# přidáme vobrázek velikýho pacmana
	pacman=Sprite.new()
	pacman.texture=load('res://obrazky/pacman_big.png')
	pacman.centered=true
	self.add_child(pacman)
	
	# s velikakakánským pacmanem budou pracovat hnedka tři tweeny
	# tween naklánění kdy se pacman jakoby bude houpat zestrany nastranu
	tweenNaklaneni=Tween.new()
	add_child(tweenNaklaneni)
	tweenNaklaneni.connect('tween_completed',self,'_on_tweenNaklaneni_completed')
	
	# tween posunu kdy pcman jakoby přijede zestrany doprostředka vobrazovky
	var tweenPosunu=Tween.new()
	add_child(tweenPosunu)
	tweenPosunu.interpolate_property ( pacman, 'position', Vector2(-128,rozliseni.y/2-138), Vector2(rozliseni.x/2,rozliseni.y/2-138), DOBA_ANIMACE_PRIKULENI, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
	tweenPosunu.start()
	# a tween točení abyse pacman jakoby při tom přesunu kutálel :D
	var tweenToceni=Tween.new()
	add_child(tweenToceni)
	tweenToceni.connect('tween_completed',self,'_on_tweenPosunu_completed')
	
	# rotaci voběktů mužem nastavovat radiánama ale i přímo vobyč úhlama ve stupních
	tweenToceni.interpolate_property ( pacman, 'rotation_degrees', -360, 0, DOBA_ANIMACE_PRIKULENI, Tween.TRANS_LINEAR, Tween.EASE_OUT_IN)
	tweenToceni.start()
func _on_tweenPosunu_completed(objekt,klic):
	# posuneme počátek spritu dolu
	# toje bod středu rotace tý věci
	pacman.offset.y=-128
	# a vokolik sme počátek posunuli dolu vo tolik posunem voběkt nahoru
	# aby nám neklesnul dolu
	pacman.position.y+=128
	
	# noa rozhoupem ho a schodíme dolu logo
	tweenSestupuLoga.start()
	start_tweenNaklaneni()
func start_tweenNaklaneni():
	tweenNaklaneni.interpolate_property ( pacman, 'rotation_degrees', pacman.rotation_degrees, naklony[1], 1.0, Tween.TRANS_CUBIC, Tween.EASE_IN_OUT)
	tweenNaklaneni.start()
func _on_tweenNaklaneni_completed(object, key):
	# vždycky když se pacman dohoupne tak se prohoděj ty úhly v náhlonech a zase se bude
	# naklánět na vopačnou stranu
	naklony.invert()
	start_tweenNaklaneni()
	
# nakonec callbacky těch tlačítek na přepínání scén ;D
func _on_TlacitkoHraj_pressed():
	get_tree().change_scene('res://sceny/Hra.tscn')
	
func _on_TlacitkoSkore_pressed():
	get_tree().change_scene('res://sceny/KonecHry.tscn')
	
func _on_TlacitkoCredits_pressed():
	get_tree().change_scene('res://sceny/Credits.tscn')
extends Node2D
var zivotu=3
var sezranejch_bobku=0
var level=0
#za každýho sežranýho ducha ve stejným režimu vystrašení je násobně víc bodů než za předchozího
# tadleta proměná je počítadlo sežranejch duchů
var combo_sezranejch=0
# z duchovního domečku vypustíme ducha žvdycky když hráč sežere několikátej bobek
const KOLIK_BOBKU_NA_VYPUSTENI = 20
var sezranejch_bobku_na_vypusteni = 0
var hrac=null
var okraj=null
var bobky=null
var bludiste=null
var pozice_bobku=null
#políčko kde začíná hráč
const START = Vector2(10,20)
var panel=null
var duchove=[]
var duchove_doma=[]
#boužel nejde deklarovat víc proměnejch na jednom řádečku jakože var a=0,b=0,c=0 
# musí se každá vzlášť :O :'(
var cervenejDuch=null
var azurovejDuch=null
var oranzovejDuch=null
var ruzovejDuch=null
# na startu se občas oběvuje mizící sebratelnej bonus
# muže to bejt novej iphone krabice s botama nike nová televize nebo molotovovej koktejl
# za první tři sou extra body nóó a molotova se duchové děsně bojej 
var casovacBonusu=null
var bonus=null
var druh_bonusu=Bonus.IPHONE
# +- v rozích herní mapky sou umístěný čtyry molotovy který když se dostanou pacmanoj do rukou 
# tak dostanou duchové pěknej strach :O ;D
var molotovy=[null,null,null,null]
const SOURADNICE_MOLOTOVU=[Vector2(1,20),Vector2(19,20),Vector2(1,3),Vector2(19,3)]
var casovacVystraseni=null
const DOBA_VYSTRASENI=10
var casovacBlikani=null
const KDY_ZACNE_BLIKAT=DOBA_VYSTRASENI * 0.9
var casovacRezimu=null
var kolikata_zmena_rezimu=0
var trvani_rezimu_rozptyleni=20
var trvani_rezimu_pronasledovani=20
#časovač vypouštění duchů
# vždycky koukne jestli sou nějaký sežraný duchové vrácený domu a kdyžtak jednoho pusí ven
#var casovac_vypousteni=null
#const DOBA_VYPOUSTENI=30
# časovač restartu hry po tom co byl hráč zakleknutej některým duchem
# nemůžeme hru zastavit a zapnout znova hnedka musíme nechat hráče pochopit cose jako stalo
var casovacZakleknuti=null
const DOBA_ZAKLEKNUTI=2.0
# sem si budeme skovávat instance požárů abysme je mohli rychle uhasit když restartujem level
var pozary = []
var generator_nahodnych_cisel
# načtem jednotlivý skripty/třídy by sme jako mohli dělat instance těch oběktů
const HRAC_SKRIPT = preload('res://skripty/Hrac.gd')
const AZUROVEJ_DUCH_SKRIPT = preload('res://skripty/AzurovejDuch.gd')
const CERVENEJ_DUCH_SKRIPT = preload('res://skripty/CervenejDuch.gd')
const ORANZOVEJ_DUCH_SKRIPT = preload('res://skripty/OranzovejDuch.gd')
const RUZOVEJ_DUCH_SKRIPT = preload('res://skripty/RuzovejDuch.gd')
const PANEL_SKRIPT = preload('res://skripty/Panel.gd')
const BONUS_SKRIPT = preload('res://skripty/Bonus.gd')
const POZAR_SKRIPT = preload('res://skripty/Pozar.gd')
const ZACATEK_KOLA_SKRIPT = preload('res://skripty/ZacatekKolaText.gd')
#zvuky
var zvukBobek=null
var zvukBonus=null
var zvukSezraniDucha=null
var zvukZakleknuti=null
#hudba
var hudbaNormalni = null
var hudbaAkcni = null
#strčí duchy a hráče zpátky na start a jakoby znovu nastaví jejich stavy
func start_figurek(bludiste):
	
	# červenej duch začíná přededveřma duchovního domečku a de hnedka doleva
	cervenejDuch.nastav(okraj,hrac,Duch.POZICE_PRED_DOMECKEM,Duch.RezimPohybu.VYPOUSTENI)
	
	cervenejDuch.vypustit_ducha()
	# růžovej duch začíná v domečku ale hnedka ho vopouští
	ruzovejDuch.nastav(okraj,hrac,Duch.DOMECEK_POZICE,Duch.RezimPohybu.VYPOUSTENI)
	
	# voranžovej a azurovej duch zatim nervózne přešlapujou doma a čekaj až pacman sežere dost bobků
	# a tim budou puštěný ven
	oranzovejDuch.nastav(okraj,hrac,Duch.DOMECEK_POZICE-Vector2(1,0),Duch.RezimPohybu.JE_DOMA)
	azurovejDuch.nastav(okraj,hrac,Duch.DOMECEK_POZICE+Vector2(1,0),Duch.RezimPohybu.JE_DOMA)
	
	#azurovej duch při pronásledování prostě jako musí vědět kde je červenej duch tak si drží jeho referenci
	azurovejDuch.cervenejDuch=cervenejDuch 
	
	#růžovej duch začíná v domečku ale jako právě vypuštěnej ven :O :O
	ruzovejDuch.vypustit_ducha()
	bludiste.otevri_dvere()
	
	#naši duši si vždycky vybíraj novej krok v 'callbacku' kterej je volanej při ukončení kroku
	#aby se jako začali hejbat musíme do nich jakože drcnout a ručně zavolat ten callback
	#argumenty callbacku maj smysl když je volanej z rodičovský třídy Ducha Figurky tady nemaj smysl a
	#je bezpečný nam nastrkat null
	for duch in duchove:
		duch._on_TweenKroku_tween_completed(null,null)
		duch.nastav_rezim_rozptyleni()
		
	#v pravidlech je že když se přepne režim duchů z rozptýlenýho nebo pronásledovacího
	# tak vokamžitě měnej směr na vopačnej než šli
	# my ale uplně nazačátku chceme aby nám červenej duch pokračoval furt doleva (rudý a levá tode dohromady ;D)
	# a současně chceme začít v rozptylovacím režimu pohybu. 
	# prostě červenýmu duchoj přepnem tamtu proměnou co dělá že se v příštím kroku otočí a jeto :O ;D
	# cervenejDuch.otoc_se=false
	
	hrac.nastav(okraj,bludiste.get_node('Bobky'),START)
	
	#dáme azurovýho a voranžovýho ducha dodomečku
	duchove_doma = [ azurovejDuch, oranzovejDuch ]
# restart různejch časovačů co tam jako máme
func spustit_casovace():
	casovacBonusu.start(30)
	casovacRezimu.paused=false #metoda start nepřepne pauznutej stav musí se ručně
	casovacRezimu.start(trvani_rezimu_rozptyleni)
	kolikata_zmena_rezimu=0
	
	#muže nám jet blikání a vystrašení takže je jako zastavíme i když třeba zrovna teďko nejedou
	casovacVystraseni.stop()
	casovacBlikani.stop()
	
# sou tady dvě podobný funkce 'restartuj level' a 'nový level'
# restart vrátí figurky duchů a hráče nazačátek
# noa novej level udělá level uplně vod začátku jako včetně tohodletoho vracení ale
# taky vobnoví rozmístění bobků a malotovů na mapě a tak
# restart se nevolá jenom nazačátku levelu ale taky když hráč umře aje vrácenej na start
func restartuj_level():
	# zastavíme možný právě probíhající tweeny kroků u všech duchů aby nám jejich metoda
	# _on_TweenKroku_tween_completed nepokazila nastavený stavy a pozice
	for duch in duchove:
		duch.stuj()
		duch.normalni_zhled()
	
	# nastartu muže ležet bonus tak ho skováme
	bonus.visible=false
	# a restartujem jeho druch
	druh_bonusu=Bonus.IPHONE
	
	# vynulujem počítadlo bobků pro vypouštění duchů
	sezranejch_bobku_na_vypusteni=0
	# vrátíme figurky do jejich počátečních stavů
	start_figurek(bludiste)
	# pustíme časovače od začátku
	spustit_casovace()
	
	#zavoláme metodu hráče která ho vrací do výhozího stavu
	hrac.oziv()
	
	var priprava_text=ZACATEK_KOLA_SKRIPT.new()
	self.add_child(priprava_text)
	
	hudbaAkcni.stop()
	hudbaNormalni.play()
	
	bludiste.nastav_praporek_usa()
	
	# TODO: tenhleten kousek kódu dělal že se to někdy seklo :o :o
	# patrně souvisí s bugem https://github.com/godotengine/godot/issues/32383
	# vopraveno bude prej až v 4.0 godotoj :/ :/
	# uhasíme možný požáry
	"""
	for pozar in pozary:
		# kouken jestli je instance požáru validní
		# jakože neni null nebo už připravená na vodstranění
		if is_instance_valid(pozar):
			pozar.queue_free()
	pozary = []
	"""
	
func novy_level():
	
	restartuj_level()
	
	# obnovíme rozmístění bobků v bludišti
	for pozice in pozice_bobku:
		bobky.set_cellv(pozice,0)
		
	# sežranejch bobků má pacman zase nuličku :O :'(
	# bude je muset spapat všecky uplně znova :O :O
	sezranejch_bobku=0
	# znova uděláme molotovy sebratelný
	for molotov in molotovy:
		molotov.visible=true
		
	level+=1
	# s každým levelem bude rozptylovací režim duchů kratčí a prodásledovací víc delší
	trvani_rezimu_pronasledovani = 18 + (level * 2)
	trvani_rezimu_rozptyleni = 10 + (10 / level)
	panel.nastav_level(level)
	
func nacti_zvuky():
	# načtem hudby a zvuky
	
	# používám load namísto preload
	# load normálně načte nějakou věc za běhu nóó a 
	# preload jakoby za času kompilace takže seto jakoby dovopravdicky neloaduje
	# ale někte toje v tý binárce jako už načtený předem
	zvukBobek=AudioStreamPlayer.new()
	zvukBobek.stream=load('res://zvuky/bobek.wav')
	self.add_child(zvukBobek)
	
	zvukBonus=AudioStreamPlayer.new()
	zvukBonus.stream=load('res://zvuky/bonus.wav')
	self.add_child(zvukBonus)
	
	zvukSezraniDucha=AudioStreamPlayer.new()
	zvukSezraniDucha.stream=load('res://zvuky/sezraniDucha.wav')
	self.add_child(zvukSezraniDucha)
	
	zvukZakleknuti=AudioStreamPlayer.new()
	zvukZakleknuti.stream=load('res://zvuky/zakleknuti.wav')
	self.add_child(zvukZakleknuti)
	
	hudbaNormalni=AudioStreamPlayer.new()
	hudbaNormalni.stream=load('res://zvuky/hudbaNormalni.ogg')
	self.add_child(hudbaNormalni)
	
	hudbaAkcni=AudioStreamPlayer.new()
	hudbaAkcni.stream=load('res://zvuky/hudbaAkcni.ogg')
	self.add_child(hudbaAkcni)
func _ready():
	
	# vyrobíme si generátorek náhodnejch čísel a ziniciealizujeme ho
	generator_nahodnych_cisel = RandomNumberGenerator.new()
	generator_nahodnych_cisel.randomize()
	
	nacti_zvuky()
	
	panel=PANEL_SKRIPT.new()
	self.add_child(panel)
	
	# vyrobíme časovače a napojíme jejich signály a callbacky
	casovacBlikani=Timer.new()
	self.add_child(casovacBlikani)
	casovacBlikani.connect('timeout',self,'_on_CasovacBlikani_timeout')
	
	#tamten parametr one_shot řiká že časovač se pustí jenom jednou
	#výchozí hodnota je false a znamená to že se časovač pouští dokolečka pořád znova
	casovacBlikani.one_shot=true
	
	casovacVystraseni=Timer.new()
	self.add_child(casovacVystraseni)
	casovacVystraseni.connect('timeout',self,'_on_CasovacVystraseni_timeout')
	casovacVystraseni.one_shot=true
	
	casovacRezimu=Timer.new()
	self.add_child(casovacRezimu)
	casovacRezimu.connect('timeout',self,'_on_CasovacRezimu_timeout')
	casovacRezimu.one_shot=true
	
	casovacBonusu=Timer.new()
	self.add_child(casovacBonusu)
	casovacBonusu.connect('timeout',self,'_on_CasovacBonusu_timeout')
	
	casovacZakleknuti=Timer.new()
	self.add_child(casovacZakleknuti)
	casovacZakleknuti.connect('timeout',self,'_on_CasovacZakleknuti_timeout')
	casovacZakleknuti.one_shot=true
	
	# načtem scénu bludište a umístime ji jako instanci do stromu
	var scene = load('res://sceny/Bludiste.tscn')
	bludiste=scene.instance()
	
	# posuneme bludiště o vejšku panelu dolu
	bludiste.position.y=64
	
	# budem potřebovat dlaždicovou mapu okraje
	okraj=bludiste.get_node('DlazdicovaMapa')
	# a dlaždicovou mapu s bobkama bavlny
	bobky=bludiste.get_node('Bobky')
	self.add_child(bludiste)
	
	# zapamatujeme si výchozí rozmístění všech bobků
	# vždycky když bude dohranej level je potřeba bobky zase vobnovit
	# a je škoda kuli tomu načítat celou bobkovou scénku znova :O ;D
	pozice_bobku=bobky.get_used_cells()
	
	# vyrobíme zapojíme a přidáme herní figurky ;D
	
	hrac=HRAC_SKRIPT.new()
	bludiste.add_child(hrac)
	hrac.napojit_signaly(self)
	
	cervenejDuch=CERVENEJ_DUCH_SKRIPT.new()
	duchove.append(cervenejDuch)
	
	oranzovejDuch=ORANZOVEJ_DUCH_SKRIPT.new()
	duchove.append(oranzovejDuch)
	
	ruzovejDuch=RUZOVEJ_DUCH_SKRIPT.new()
	duchove.append(ruzovejDuch)
	
	azurovejDuch=AZUROVEJ_DUCH_SKRIPT.new()
	duchove.append(azurovejDuch)
	
	for duch in duchove:
		bludiste.add_child(duch)
		duch.napojit_signaly(self)
	
	# v bludišti se vobčas udělá na startu dočasnej mizicí bonus
	bonus=BONUS_SKRIPT.new(druh_bonusu,START,hrac)
	bonus.napojit_signaly(self)
	bludiste.add_child(bonus)
	
	# v bludišti sou na čtyrech místech trvalý nemizicí molotovy koktejly
	for i in range(4):
		var molotov=BONUS_SKRIPT.new(Bonus.MOLOTOV,SOURADNICE_MOLOTOVU[i],hrac)
		molotov.napojit_signaly(self)
		bludiste.add_child(molotov)
		molotovy[i] = molotov
	
	novy_level()
	
	
	for _i in range(zivotu):
		panel.pridej_zivot()
	
# signál posílanej z instance hráče ždycky když sežere bavlněnej bobek
func _on_Hrac_sezral_bobek():
	sezranejch_bobku+=1
	Skore.skore+=10
	panel.nastav_skore(Skore.skore)
	zvukBobek.play()
	
	# v bludišti je maximálně 188 bobků
	# když je pacman všecky sní tak vyhrál a začne novej level
	if sezranejch_bobku == 188:
			novy_level()
			return
	
	# pokud je doma skovanej nějakej duch tak započítáme bobek na jeho vypuštění
	if len(duchove_doma) > 0:
		sezranejch_bobku_na_vypusteni += 1
	# noa jestli máme dost vypouštěcích bobků tak vypustíme ducha a počítadlo restartujem
	# ducha vypouštíme jenom když neni režim vyděšení. to poznáme podle toho jestli je timer měnění 
	# režimu pauznutej nebo ne
	if sezranejch_bobku_na_vypusteni >= KOLIK_BOBKU_NA_VYPUSTENI and not casovacRezimu.paused:
		
		#pop_front odstraní z pole první prvek a vrátí nám ho 
		#pokud je pole prázdný vrací null
		var duch = duchove_doma.pop_front()
		if duch != null:
			duch.vypustit_ducha()
			bludiste.otevri_dvere()
			sezranejch_bobku_na_vypusteni -= KOLIK_BOBKU_NA_VYPUSTENI
		
# chytá signál posílanej duchem když se mu podaří zakleknout pacmana
# konec levelu neni vokamžitej ale až v timeoutu časovače zakleknutí
# máto ten smysl abysme nejdřiv nechali doběhnout animaci zakleknutýho pacmana
func _on_Duch_zakleknuti():
	zvukZakleknuti.play()
	hrac.zaklekni()
	zivotu-=1
	panel.odeber_zivot()
	casovacZakleknuti.start(DOBA_ZAKLEKNUTI)
	
# chytá signál z bonusu když ho hráč sebere a bonus chce přidat body
# teoreticky bysme tohleto mohli dělat rovnou z bonusu mě tak napadá ale couž :O :/
func _on_Bonus_pridej_body(bodu):
	Skore.skore+=bodu
	panel.nastav_skore(Skore.skore)
	zvukBonus.play()
# se zavolá když se pacmanoj dostane do rukou molotov
func _on_Bonus_molotov():
	
	#uděláme nějakej zvukovej efekt
	# mužete si pro to najít nějakej zvuk extra já sem děsně eko jak jako víte no tak sem 
	# zreciklovala už jednou použitej zvuk sežrání ducha :D ;D
	zvukSezraniDucha.play()
	
	# jestli ještě nehraje akční hudba tak ji na akční přepnem
	# zastavíme normální a pustíme tu akční :D
	if not hudbaAkcni.playing:
		hudbaNormalni.stop()
		hudbaAkcni.play()
		
	# uděláme duchy vyděšenejma
	for duch in duchove:
		duch.nastav_rezim_vydeseni()
		
	# přepnem hráče do akčního režimu
	hrac.akcni_rezim()
	
	# zapneme blikání pacmaního praporku misto tamtoho staroamerickýho
	bludiste.nastav_praporek_blm()
	
	# když pacman sebere molotova tak to tam všecko kolem sebe jakoby trošičku podpálí :O :O :D :D ;D
	# zkusíme podpálit čtvereček 11x11 políček kolem hráče s tim že budem podpalovat jakoby
	# jenom plíčka kde je kostička okraje bludiště a vždycky si navíc hodíme korunou jestli totam
	# podpálíme aby to jako vypadalo přirozenějc :O ;D
	for x in range(-5,5):
		for y in range(-5,5):
			var logicka_souradnice_pozaru=Vector2(x,y)+hrac.logicka_pozice
			
			if not okraj.get_cellv(logicka_souradnice_pozaru) == TileMap.INVALID_CELL:
				
				#vygenerujem si náhodný číslo od nuly do jedný a kouken jestli je menší než 0.5
				# toje skoro jako házet korunou jakože 50% šance
				if generator_nahodnych_cisel.randf() < 0.5:
					var pozar=POZAR_SKRIPT.new()
					# přepočítáme logickou souřadnici požáru na souřadnici v mapě přidáme (32,32) 
					# aby jako požár byl vycentrovanej uprostřed kostičky naší herní mapy
					# dobu trvání dáme náhodně mezi pěti a deseti sekundama (uvnitř ve třídě plus jednu za dobu vypínání)
					pozar.nastav(logicka_souradnice_pozaru*64 + Vector2(32,32),generator_nahodnych_cisel.randf_range(4.0,8.0))
					bludiste.add_child(pozar)
					#pozary.append(pozar)
			
		
	# vypneme časovač kterej mění rozptylovací a pronásledovací režim
	casovacRezimu.paused=true
	# a pustíme vodpočet zkončení toho režimu vystrašení
	# a taky začátek blikání který jako hráčoj řiká žeto vystrašení brzy skončí ;D
	casovacVystraseni.start(DOBA_VYSTRASENI)
	casovacBlikani.start(KDY_ZACNE_BLIKAT)
	
# chytá signál posílanej z ducha když je sežranej
func _on_Duch_sezranej():
	zvukSezraniDucha.play()
	# je tady bonus za kombo sežranejch duchů
	# za prvního 200, za druhýho 400, pak 800 a 1600
	Skore.skore+=200 * pow(2,combo_sezranejch) 
	panel.nastav_skore(Skore.skore)
	combo_sezranejch+=1
	
# tendleten callback je volanej ždycky když duch orazí domu
# signál posílá informaci kterejže duch to právě jako dorazil domu
func _on_Duch_doma(ktery):
	duchove_doma.append(ktery)
	zvukSezraniDucha.play()
	
# chytá signál z časovače měnění režimu
func _on_CasovacRezimu_timeout():
	kolikata_zmena_rezimu+=1
	#pokud je změna režimu lichá, přepnem duchy do režimu rozptýlení
	if kolikata_zmena_rezimu % 2 == 0:
		for duch in duchove:
			duch.nastav_rezim_rozptyleni()
		casovacRezimu.start(trvani_rezimu_rozptyleni)
	#pokud sudá do pronásledování
	else:
		for duch in duchove:
			duch.nastav_rezim_pronasledovani()
		casovacRezimu.start(trvani_rezimu_pronasledovani)
		# každý příští přepnutí do pronásledování bude o počet levelů *2 sekund delší aby
		# jakoby rostla vobtížnost
		#v originále jeto složitější
		trvani_rezimu_pronasledovani += level * 2
	
func _on_CasovacBonusu_timeout():
	# pokud bonus neexistuje tak ho vyrobíme a dáme na start noa jestli jako existuje
	# tak ho jakoby zničíme
	if not bonus.visible:
		
		#pokud je hráč nastartu když tam chceme šoupnout bonus nóó tak prostě 
		#vteřinku počkáme a zkusíme to znova. jinak by nám to rovnou sebral ten bonus
		if hrac.logicka_pozice == START:
			casovacBonusu.start(1)
			return
		
		bonus.nastav_druh(druh_bonusu)
		bonus.visible=true
		
		if druh_bonusu<Bonus.MOLOTOV:
			druh_bonusu+=1
		else:
			druh_bonusu=Bonus.IPHONE
		
		casovacBonusu.start(15)
		
	else:
		bonus.visible=false
		casovacBonusu.start(45)
		
# skončení režimu vystrašení
func _on_CasovacVystraseni_timeout():
	# zase zapnem přepínací časovač režimu a vynulujem kombo sežranejch duchů
	casovacRezimu.paused=false
	combo_sezranejch=0
	
	# pustíme normální muziku
	hudbaNormalni.play()
	hudbaAkcni.stop()
	
	# hráče přepnem do normálního režimu
	hrac.normalni_rezim()
	# uprostřed bludiště zase aktivujem staroamerickej praporek
	bludiste.nastav_praporek_usa()
	
	for duch in duchove:
		duch.ukonci_rezim_vydeseni()
# dává nám vědět se vyděšenej režim končí :O :O
func _on_CasovacBlikani_timeout():
	for duch in duchove:
		duch.rozblikat()
		
# řasovač zakleknutí
# hráč umřel nóó a mi buťto restartujem hru a nebo zkončíme uplně
func _on_CasovacZakleknuti_timeout():
	
	if zivotu>0:
		restartuj_level()
	else:
		# jestli hráč už nemá životy tak přepnem celičkej stromeček scény na scénu 
		# s highscore
		get_tree().change_scene('res://sceny/KonecHry.tscn')
	
extends Node2D
# obrázek na pozadí a jeho velikost
var obrazek=null
var velikostObrazku=null
#rozlišení vobrazovky
var rozliseni=null
# velkej font titulku a menčí pro vobyč text
var font_titulku=null
var font_textu=null
# nápis
var podtitulek=null
# gui prvek na vyplnění nějakýho textu
var vyplnovadlo_textu=null
# funkce kterou vyrobíme textovej nápis/label
# nastavíme mu font barvu velikost align a strčíme ho na scénu a vrátíme jeho instanci
func vyrob_a_pridej_napis(font,align=Label.ALIGN_CENTER):
	var napis=Label.new()
	napis.set_size(Vector2(rozliseni.x,64))
	napis.set('custom_fonts/font', font)
	napis.add_color_override('font_color', Color(1,0,0))
	napis.align=align
	self.add_child(napis)
	return napis
# umístí na scénu gui prvky pro zapsání novýho nejvyšího skóre
# vyplňování ména se skládá jenom z nápisu a vyplňovadla textu
func novy_zaznam():
	podtitulek=vyrob_a_pridej_napis(font_textu)
	podtitulek.text='Máš novej rekord!!!!\nVyplň méno a máčkni enter!!!!'
	podtitulek.set_position(Vector2(0, rozliseni.y*0.4))
	podtitulek.align=Label.ALIGN_CENTER
	
	vyplnovadlo_textu=LineEdit.new()
	vyplnovadlo_textu.set_size(Vector2(rozliseni.x-128,64))
	vyplnovadlo_textu.set('custom_fonts/font', font_titulku)
	vyplnovadlo_textu.add_color_override('font_color', Color(1,0,0,1))
	vyplnovadlo_textu.set_position(Vector2(64, rozliseni.y/2))
	
	#nastavíme maximální počet znaků ména hráče na 20
	vyplnovadlo_textu.max_length=20
	self.add_child(vyplnovadlo_textu)
	
	#propjíme signál zadání textu (jeto máčknutí enetru při vyplňování) s metodou _on_LineEdit_text_entered
	vyplnovadlo_textu.connect('text_entered',self,'_on_LineEdit_text_entered')
	
	# dáme vyplňovátku 'zaměření'
	vyplnovadlo_textu.grab_focus()
const v_posun=512 # posun všech nápisů v tabulce dolu
# umístí na scénu dvacet nápisů v párech vedle sebe vždycky název hráče a
# kolik jako udělal bodů
func tabulka_nejvysiho_skore():
	
	var text_rekordu=''
	for index in range(10):
		var zaznam=Skore.tabulka_nejvysiho_skore[index]
		var text=str(index+1)+'. '+str(zaznam[0])
		var napis=vyrob_a_pridej_napis(font_textu,Label.ALIGN_LEFT)
		napis.set_position(Vector2(128, index*64+v_posun))
		napis.text=text
		
		napis=vyrob_a_pridej_napis(font_textu,Label.ALIGN_RIGHT)
		napis.set_position(Vector2(-128,index*64+v_posun))
		napis.text=str(zaznam[1])
		
	# nakonec přidáme tlačítko pro návrat na hlavní stranu
	var tlacitko_zpet=Button.new()
	tlacitko_zpet.set('custom_fonts/font', font_textu)
	tlacitko_zpet.add_color_override('font_color', Color(1,0,0,1))
	tlacitko_zpet.text='Zpět'
	tlacitko_zpet.rect_size=Vector2(rozliseni.x/2,64)
	tlacitko_zpet.rect_position.x=rozliseni.x/4
	tlacitko_zpet.rect_position.y=64*11 + v_posun
	
	tlacitko_zpet.connect('pressed',self,'_on_TlacitkoZpet_zmacknuto')
	
	self.add_child(tlacitko_zpet)
	
	tlacitko_zpet.grab_focus()
func _ready():
	
	# načtem a zapnem muziku
	var hudba = AudioStreamPlayer.new()
	hudba.stream=preload('res://zvuky/hudbaMenu.ogg')
	self.add_child(hudba)
	hudba.play()
	
	#načtem *.ttf fonty
	font_titulku = DynamicFont.new()
	font_titulku.font_data = load('res://fonty/font.ttf')
	font_titulku.size = 96
	font_titulku.outline_size=4
	font_titulku.outline_color=Color(0,0,0,1)
	
	font_textu = DynamicFont.new()
	font_textu.font_data = load('res://fonty/font.ttf')
	font_textu.size = 48
	font_textu.outline_size=3
	font_textu.outline_color=Color(0,0,0,1)
	
	
	obrazek=Sprite.new()
	obrazek.texture=preload('res://obrazky/game_over.png')
	rozliseni=get_viewport_rect().size
	velikostObrazku=obrazek.texture.get_size()
	obrazek.centered=false
	obrazek.set_scale(Vector2(rozliseni.x/velikostObrazku.x, rozliseni.y/velikostObrazku.y))
	self.add_child(obrazek)
	
	var titulek=vyrob_a_pridej_napis(font_titulku)
	titulek.text='Nejvyší skóre'
	
	Skore.nacti_nejvysi_skore()
	# nejdřiv kouknem jestli se bude vyplňovat nový skóre do tabulky a jestli jako jo
	# tak umístíme na scénu prvky pro vyplnění ména hráče
	if Skore.ma_se_skore_pridat():
		novy_zaznam()
	else:
		# jinak ukážem tabulku s nejvyšíma skórema
		tabulka_nejvysiho_skore()
# potom co bylo potvrzený méno hráče ve vyplňovadlu textu tak přidáme to
# méno do tabulky uložíme do souboru vodstraníme gui prvek vyplňovadla a podtitulek 
# a ukážem tabulku s highscore
func _on_LineEdit_text_entered(text):
	Skore.pridej_skore_do_tabulky(text)
	Skore.uloz_nejvysi_skore()
	podtitulek.queue_free()
	vyplnovadlo_textu.queue_free()
	
	tabulka_nejvysiho_skore()
#návrat do hlavního menu
func _on_TlacitkoZpet_zmacknuto():
	get_tree().change_scene('res://sceny/HlavniMenu.tscn')
extends Control
# jako počet životů budem používat texturu s obrázkem pacmanovy čokoládový tvářičky 
var textura_hlavy=null
# do pole 'hlavy' budem nastrkávat sprity s vobrázkem pacmanovy hlavy každá bude 
# reprezentovat jeden život
var hlavy=[]
# pozadí panelu
# je to jakoby jenom takovej černej obdélníček
var pozadi=null
# nápisy který řikaj počet bodů a jakej je právě level
var skore_napis=null
var level_napis=null
func _ready():
	pozadi=ColorRect.new()
	pozadi.rect_size.x=21*64
	pozadi.rect_size.y=64
	pozadi.color=Color(0,0,0,1)
	self.add_child(pozadi)
	
	#načtem *.ttf font
	var dynamic_font = DynamicFont.new()
	dynamic_font.font_data = load('res://fonty/font.ttf')
	dynamic_font.size = 32
	
	# a vyrobíme a přidáme ukazatele skóre a jakej je level
	skore_napis=Label.new()
	skore_napis.set_size(Vector2(640,64))
	skore_napis.set('custom_fonts/font', dynamic_font)
	skore_napis.add_color_override('font_color', Color(1,0,0,1))
	pozadi.add_child(skore_napis)
	
	level_napis=Label.new()
	level_napis.set_size(Vector2(640,64))
	level_napis.set('custom_fonts/font', dynamic_font)
	level_napis.add_color_override('font_color', Color(1,0,0,1))
	level_napis.set_position(Vector2(640,0))
	pozadi.add_child(level_napis)
	
	# z atlasu si načteme podobrázek s obličejčkem pacmana
	var atlas=preload('res://obrazky/hrac.png')
	textura_hlavy=AtlasTexture.new()
	textura_hlavy.atlas=atlas
	textura_hlavy.region=Rect2(Vector2(0,0),Vector2(64,64))
	# mužem nastavit nějaký výchozí hodnoty
	nastav_skore(0)
	nastav_level(1)
	 
func nastav_level(hodnota):
	level_napis.text='Level: '+str(hodnota)
	
func nastav_skore(hodnota):
	skore_napis.text='Skóre: '+str(hodnota)
	
# přidání života je vygenerování novýho spritu s vobrázkem hlavy a umístění ji na panel
# vodebrání ji zase bude ničit
func pridej_zivot():
	var hlava=Sprite.new()
	hlava.texture=textura_hlavy
	hlava.position.y=32
	hlava.position.x=(21-hlavy.size())*64-32
	hlavy.append(hlava)
	add_child(hlava)
	
func odeber_zivot():
	#odstraníme poslední prvek z pole i ze stromu uzlů
	remove_child(hlavy.pop_back())
extends Node2D
var efekt=null
var casovac=null
var doba_trvani=0
func nastav(pozice,doba_trvani):
	self.position=pozice
	self.doba_trvani=doba_trvani
func _ready():
	
	#vyrobíme si materiál particle efektu
	var material=ParticlesMaterial.new()
	
	# budem je dělat po povrchu čtverečku o hraně 32 pixelů
	material.emission_shape=ParticlesMaterial.EMISSION_SHAPE_BOX
	material.emission_box_extents=Vector3(32,32,0)
	
	# a posílat nahoru
	# gravitace směrem dolu už je tam zapnutá defaultně
	material.direction=Vector3(0,-1,0)
	material.initial_velocity=100
	material.scale=2
	
	# různý ty random jsou vždycky v rosahu od nuly do jedný
	# třeba tady to jako u každýho particlu to vybere náhodný zvětčení
	material.scale_random=0.5
	# vždycky se náhodně u každýho particlu vybere hodnota od scale_random až k jedný
	# a tim se vynásobí maximální velikost v tom atributu .scale
	# vostatní něco_random fungujou stejně
	
	#nastavíme barevnej přechod barvy jednotlivejch částic v průběhu jejich živůtků
	# z textury s namalovaným gradientem
	material.color_ramp=preload('res://obrazky/gradient.png')
	
	efekt=Particles2D.new()
	efekt.amount=32
	efekt.process_material=material
	#particle efekty v godotu boužel neuměj pracovat s AtlasTexture takže tam mužem
	# strčit akorát tak obyč vobrázek
	efekt.texture=preload('res://obrazky/castice.png')
	
	self.add_child(efekt)
	
	
	self.casovac=Timer.new()
	self.casovac.one_shot=true
	self.add_child(casovac)
	self.casovac.connect('timeout',self,'_on_casovac_skoncil')
	self.casovac.start(doba_trvani)
# efekt budeme vypínat jakoby nadvakrát
# godot nemá v particle systemu něco třeba nějakej signál kterým bysme nějak jednoduše
# zistili jestli jako ještě máme na scéně nějaký částice
# proto nejdřiv vypneme vyrábění novejch částic počkáme dobu jejich života nóó a
# pak víme že už žádný nežijou a mužem efekt odstranit :O ;D
func _on_casovac_skoncil():
	if efekt.emitting:
		efekt.emitting=false
		casovac.start(1)
	else:
		self.queue_free()
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
#	pass
extends Node # něco jako globální statická proměná do který budem vodevšat přidávat var skore=0 # proměná co bude držet tabulku nejvyšího skóre # bude to jakoby pole o deseti záznamech noa každej ten záznam bude pole o dvou prvcích # záznam se bude zkládat z ména hráče a se skóre var tabulka_nejvysiho_skore=[] #výchozí tabulka nejviších skóre. pokud neexistuje soubor s highscore tak ho vytvoříme # s timdletim vobsahem const VYCHOZI_TABULKA=[ ['Martin, looter king',99999], ['Floyd',50000], ['Chauvinovo koleno',25000], ['Barack Hussein Obama',10000], ['Černoušek Bubu',7500], ['David Černej',5000], ['Kunta Kynte',2500], ['Zemanputinslut',1500], ['Černej pasažér',100], ['Ty!!!! ;D ;D',1] ] # pod linuxem toje ~/.local/share/godot/skore.txt # ale liší se na různejch platformách. proto tam maj tamto user:// který to jako # řeší za nás ;D const CESTA_K_SOUBORU='user://skore.txt' func uloz_nejvysi_skore(): var soubor = File.new() soubor.open(CESTA_K_SOUBORU, File.WRITE) for zaznam in tabulka_nejvysiho_skore: soubor.store_line(zaznam[0]) soubor.store_line(str(zaznam[1])) soubor.close() # načtem *.txt soubor s highscore # pokud neexistuje použijem výchozí hodnoty z 'VYCHZI_TABULKA' func nacti_nejvysi_skore(): tabulka_nejvysiho_skore=[] var soubor = File.new() if soubor.file_exists(CESTA_K_SOUBORU): soubor.open(CESTA_K_SOUBORU, File.READ) for i in range(10): var zaznam=[soubor.get_line(),int(soubor.get_line())] tabulka_nejvysiho_skore.append(zaznam) soubor.close() print(tabulka_nejvysiho_skore) else: #pokud jako soubor neexistuje načtem výchozí danou tabulku skóre tabulka_nejvysiho_skore=VYCHOZI_TABULKA #funkce co zistí jestli jako má cenu skóre zapisovat do tabulky # kouknem jestli je skóre vyší než poslední záznam func ma_se_skore_pridat(): return tabulka_nejvysiho_skore[-1][1]<skore func pridej_skore_do_tabulky(meno): var posunovany=null var novy_zaznam=[meno,skore] #budem postupovat vodzhora tabulkou a až narazíme na záznam s menčím skórem tak ho nahradíme # a původní i se zbytkem tabulky postrčíme o pozici dolu for i in range(10): var zaznam=tabulka_nejvysiho_skore[i] # pokud neposouváme tabulku hledáááme..... if posunovany == null: if skore>zaznam[1]: posunovany=tabulka_nejvysiho_skore[i] tabulka_nejvysiho_skore[i]=novy_zaznam #posuneme zbytek tabulky dolu a poslední záznam 'zahodíme' else: var pomocna=tabulka_nejvysiho_skore[i] tabulka_nejvysiho_skore[i]=posunovany posunovany=pomocna
extends Node2D
# tohle je takový to logo co se zobrazuje před začátkem kola hry
# v pacmanoj má vietnamec nápis 'ready' já použila znova to logo z hlavního menu
# jakmile tenhleten voběkt vstoupí do stromečku scény tak na chvilku pauzne hru zahraje
# znělka a logo spadne z vobrazovky a hra se zase zapne 
var zvukVyhra = null
var obrazek = null
func _ready():
	
	# strčíme doprostředka vobrazovky
	self.position=get_viewport_rect().size / 2
	
	# načtem a zahrajem znělku
	zvukVyhra=AudioStreamPlayer.new()
	zvukVyhra.stream=load('res://zvuky/vyhra.wav')
	# budem chytat signal dohrání znělky
	zvukVyhra.connect('finished',self,'_on_znelka_dohrala')
	self.add_child(zvukVyhra)
	zvukVyhra.play()
	
	# přidáme vobrázek loga
	obrazek=Sprite.new()
	obrazek.texture=preload('res://obrazky/pacman_logo.png')
	self.add_child(obrazek)
	
	# noa pauznem hru
	# potřebujem pauznout všecko nóó ale taky potřebujem
	# aby se nám ta hra taky nějak vopauzla protože pauznutý nody prostě nic nedělaj 
	# timery signály _process nic z toho nejdede :O :O
	# naštstí uzlům mužeme nastavovat atribut pasue_mode a mužem jim na pauzu udělat vyjímku
	self.pause_mode = Node.PAUSE_MODE_PROCESS
	
	# pause mode u tohodle voběktu předělanej a mužem pauznout celej stromeček scény
	self.get_tree().paused = true
	
# metoda co se zavolá až znělka jakoby dohraje
func _on_znelka_dohrala():
	# vodpauzujem celej strom
	self.get_tree().paused = false
	
	# uděláme si tween na schození toho loga z vobrazovky
	var tween_spadnuti=Tween.new()
	self.add_child(tween_spadnuti)
	
	tween_spadnuti.connect('tween_completed',self,'_on_tween_dojel')
	# tween použujem na vobrázek budem měnit jeho pozici na pozici vo hodně moc víc dole během sekundy
	tween_spadnuti.interpolate_property ( obrazek, 'position', obrazek.position, obrazek.position+ Vector2(0,2048), 1, Tween.TRANS_LINEAR, Tween.EASE_IN)
	tween_spadnuti.start()
# tween dojel všecko hotový už mužem oběkt akorát tak zničit a zahodit :D ;D
func _on_tween_dojel(obekt, klic):
	self.queue_free()
a co se mi už dělat jakože nechtělo :O :D ;D ;D nóóó asi by se měl udělat nějakej spravedlivější system spawnovaní těch bonusů by je jako nešlo farmit. Hráč muže snadno sežrat všecky duchy a pak se zdržovat u startu a čekat na bonusy. Samo žeto je pitoma normální člověk by si jako našel ten texťák a přepsal v něm ručně highscore jeto obyč plain text :O ;D
Muzika se seká při přepínání ze scénky hlavního menu do highscore a do credits. Hudbu by měl asi pouštět nějakej nadřízenej uzel, asi byto jako šlo udělat podobně jako s tim skore.gd a mit to jakoby hozený bokem mimo hlavní strom scény.
Viewport je mnóóóóhem vyší než širší. Si to skoro jako řiká o udělání podpory dotykový vobrazovkya export na mobílky :O ;D
Noa samozdřejmě teďko společně najdem děsně moc bugů protože já sama to hrála asi jenom deset minut :D
Měla sem tam slušnej zásek při používání funkce 'is_instance_valid' protože mi někdy zničenej uzel vracel true a referenci na uplně náhodnej jinej uzel ale to maj bug prostě voni a věděj vo něm nejmíň už jako rok. Vdůsledku toho sito vobčas myslí že zničenej uzel eště existuje nebo misto uzlu kterej chcete zničit zničíte uplně nějakej jinej náhodnej. A jako vůle tohleto vopravit neni veliká prej si jako máme počkat na verzi 4.0 kde to jako bude celý přepracovaný :O :O :/ :/
Godot umí jednoduše exportovat do různejch formátů nejenom do linuxový binárky. Umí třeba udělat androidí *.apk nebo html webovou stránku. První co mě napadlo udělat byla ta html stránka jenže se ukázalo že s tou hrou měl každej kdo ji zkoušel hrát nějaký jiný problémky. Ve firefoxu bylo takový divně malý fps, v chromu zase mizerně fungovalo chytání eventu mačkání šipek na klávesnici prostě si pacman vobčas jel kam chtěl. a třeba v konqeroru kterej je i jinak uplně nanic vubec nejely particle efekty požárů :O :O :'( :'(
Pitomí taky je že ty vyexportovaný věci sou děsně veliký voproti tomu kdybyste to dělali přímo v nějakým tom androidím kotlin/javě nebo webově html/js. i velký čuně byto udělalo velký maximálně pár mega tu hru ale z godotu při exportu vypadne *.apk a webová stránka přes dvacet mega velký :O :O 
Godot má nějaký svý mouchy ale používat se jako dá a myslim si žeby se něco dělanýho v godotu líbilo otulovejm prvnáčkům mililililililililililililililióóóóóóóóóóóóóóónkrát víc než latex :D :D ;D ;D
        Tiskni
            
                Sdílej:
                
                
                
                
                
                
            
    
 Ne, ze bych citil potrebu tyto paragrafy porusovat, naopak, ale svoboda projevu opravdu vypada jinak.
            Zkuste si propagovat nacismus a treba zpochybnovat holocaust.Chapu tu moznou principialni namitku (o principy ti ale stejne beztak dvakrat nejde), ale nevidim zadny prakticky argument. K cemu ti je mit moznost zpochybnovat holokaust, jak to prakticky zvysi tvoji svobodu?
Readers may wonder whether Baldaev's illustrations are accurate documents of atrocities at all, or were intended as anti-Soviet polemic. The answer is both: Baldaev depicts the Bolshevik coup of 1917 as a national tragedy following which "the peoples of Russia recalled life under the tsar as a lost paradise". He describes the Bolsheviks' antireligious militancy as the sole impetus for the moral collapse he encountered. Yet while his analysis of the Soviet disaster rests upon simplistic nostalgia for a golden age of church and monarchy, the editors of this book have convincingly corroborated many of his representations with parallel accounts from the canon of Russian Gulag literature.Drawings from the Gulag by Danzig Baldaev – review O tom to je – lidé mají různá zkreslení, jež má rigorózní proces nakládání s informacemi zohlednit či odstínit. Jsou to historické práce, co se zabývá prameny a jejich interpretací.
Pak se otevírá jiná diskuze, jak se z toho poučit, což vede na otázky, co je za tábory (různá vězení, detenční střediska aj.) ve světě dnes, co z toho můžeme ovlivnit a jak.Coz je skvela poznamka, protoze velice chytri lide se takto spalili. Co se treba casto vycita Chomskemu, jeho puvodni postoj ke Khmer Rouge, kde byl pomerne skepticky ke zpravam o genocide (na zaklade jinych zkusenosti s americkou propagandou). Na druhou stranu, je taky nevhodne podporovat treba invazi na zaklade falesnych dojmu.
Co se treba casto vycita Chomskemu, jeho puvodni postoj ke Khmer Rouge, kde byl pomerne skepticky ke zpravam o genocide (na zaklade jinych zkusenosti s americkou propagandou).Nebo Parenti a Balkán.
Mnoho nedorozumění a konfliktů plyne z toho, že historik má na danou věc jiný pohled, chcete-li nestrannější, méně zatížený zkušeností a více infikovaný metodologickými debatami uvnitř historiografie. Historik je více citlivý na různorodost zkušenosti. Zatímco pamětník má vrozenou tendenci zobecňovat svoji zkušenost na celou společnost jako celek.
Tolerance ke komunismu má kořeny za WW2 a mohutném propagandistickém úsilí Spojenců jak vylepšit obraz komunismu a SSSRv diskusi na téma Dva socialismy/Palba.cz - takže zkuste pak zkousnout to, zda je svět bi nebo kolika polární ... když někdo, kdo by měl být přítel, říká, že nepřítel není tak hrozný nepřítel.
Mohlo by se zdát, že v situaci, kdy bude historie dávnější, bude pro historika jednodušší ji uchopit. Ale v kontextu toho, co tvrdíte, se naopak zdá, že pro reflexi je vhodnější, když je ještě historie živá. Co je tedy pro reflexi blízkého historického období vhodnější? Polemizoval bych s vaším výchozím předpokladem. Myslím, že ta nedávná historie, kde existuje ještě velká skupina pamětníků, je něčím specifická, ale ne natolik, aby to změnilo parametry historické diskuse. Podívejte se na polemiku kolem Mariánského sloupu. To se týká události z poloviny 17. století. Existuje něco jako paměť konkrétních živých lidí. Ale také existuje něco jako kolektivní paměť, která je mezigenerační. I část současné generace se pak identifikuje s narativem 19. století, že Češi jsou evangelíci a že bojovali proti Habsburkům a proti katolicismu. To je také identifikace, která je často netolerantní. A to platí i pro druhou stranu. Na obou stranách jsou pak lidé, kteří nejsou schopni se o tom bavit s odstupem. A je jasné, že je to věc identity. Zda bude Mariánský sloup stát nebo ne, je otázka identity. Je zde nějaká kolektivní paměť, oni jsou posledním článkem v předávání kolektivního narativu a identifikují se s ním. Těchto lidí se to dotýká osobně i přesto, že v té době vůbec nežili. A dokonce se to ani nemuselo dotýkat jejich předků. Rozdíl v odstupu mezi historií a historikem tedy není tak velký, jak jste naznačoval. … A proto se někdy těmto diskusím říká politika paměti. Paměť není něco apolitického, co by bylo vzdáleno naší politické přítomnosti a jejich politických zápasů. Naopak. Paměť se často dostává do střetu politických zápasů. A toto je ten případ.
A proto se někdy těmto diskusím říká politika paměti. Paměť není něco apolitického, co by bylo vzdáleno naší politické přítomnosti a jejich politických zápasů. Naopak. Paměť se často dostává do střetu politických zápasů. A toto je ten případ.Nevim, me prijde jako jednodussi vysvetleni, ze lide, kterym na te neosobni pameti zalezi si proste zjednodusuji vyklad historie a pouceni z ni. Jako to dela treba Radovan vedle.
            Člověk by ale měl mít právo diskutovat třeba o inteligenci jednotlivých ras/národů/etnik bez rizika „nepříjemností“ a obávám se, že tato doba už se chýlí ke konci (jak jsem se nedávno přesvědčil v jedné diskuzi).Proč?
Proč o tom vůbec někteří chtějí diskutovat? Není to třeba proto, že ve skutečnosti nechtějí diskutovat, nýbrž využít diskuzního prostoru k propagaci své agendy – typicky spojené s eugenikou?
Nad některými otázkami bys tedy chtěl kriticky uvažovat a nad jinými ne?
Obrázek ať si udělá každý sám. Já z toho vyvozuji to, že diskutovat s lidmi jako ty nemá smysl. Pro tebe je kritérium jen to, jestli se ti to hodí do krámu nebo ne. U jiných se pokoušíš o deplatforming a u sebe naopak používáš AbcLinuxu jako platformu pro šíření své zvrácené ideologie. Kdybych byl Odin, tak ještě dodám, že je mi líto tvých rodičů.
Hele, a smi se diskutovat o tom, o kterych vecech se nebude diskutovat?Smi. Akorat je otazka, jestli to ma smysl provozovat s nevzdelanci.
Nektere rozhodovani by se melo nechat jen na elitech.To ale neni co tvrdim. Rikam, ze na odbornicich by se mela nechat odborna otazka (zpusob), nikoli otazka hodnot (cil). Zpusob bez cile nedava smysl. Je to trochu jako modus ponens. Odbornici dodaji zpusob dosazeni A->B, ty (nebo kdokoli jiny) doda cil A, a spoji se to v rozhodnuti B.
Spis jsem chtel poukazat na to, ze konsensus, ze o necem se nediskutuje by mel byt v sirsi skupine, nez jen mezi temi, kteri o tematu uz diskutovali.Kazdy, i ty, ma moznost se stat prislusnikem te skupiny. Staci prokazat, ze to tema dostatecne znas. To snad neni tak hrozny pozadavek. Koneckoncu, neni svobodou tech odborniku take si vybrat, s kym budou tu odbornou diskusi vest?
Proc tolik fuzzy. Proste nam binarne rekni tvou odpoved na otazku: Pachaly USA zlociny proti lidskosti, popiraly lidska prava a vysledkem byli miliony mrtvych ? a) ano b) neOdpověď zní v obou případech "ano". Svět totiž není černobílý.
            Programe náš, jenž jsi v paměti, pozdraveno buď jméno tvé, příjď operační systém tvůj, buď vůle příkazů tvých jakož na tiskárně tak i na monitoru. Data naše vezdejší dej nám dnes a odpusť nám naše vstupní i výstupní chyby, jakož i my odpouštíme viníkům s vadnými logickými obvody. Neuveď nás ve zklamání a zbav nás napěťových rázů, neboť tvůj jest algoritmus i aplikace i řešení zacyklené na věky věkův. Exit.
Sloboda je jediná - byť otrokom Boha.Pokud o něčem přestaneš pochybovat, můžeš si být jistý že je to lež. Lžeš sám sobě.
            
 
/s
            
            
            
            
Osobne mi myslim vyhovuje archetyp saska
To platí možná tak u Odina. Tam je celkem zřejmé, že jde z části o nadsázku, humor a z části nastavuje společnosti zrcadlo.
U Davida se ale obávám, že je to myšleno vážně a že by rád tyhle myšlenky prosadil v praxi. Pokud vím, tak se angažuje nebo angažoval v Pirátské straně. On to možná pro svoji neschopnost nikam nedotáhne, ale to neznamená, že by chtěl být jen "šašek, kterému o reálnou moc nikdy nepůjde". Stačí se podívat na to, jak zneužívá svoji zdejší funkci administrátora - zjevně dělá, co může. Jiní marxisti to dotáhli dál a tam jsou ty škody řádově vyšší.
coz je vlastne takovy volnomyslenkar
Kdyby byl volnomyšlenkář, tak by nechtěl ostatní připravit o jejich práva, konfiskovat jim majetek, brát svobodu slova, brát jim právo se bránit atd.
Kdyby byl volnomyšlenkář, tak by nechtěl ostatní připravit o jejich práva, konfiskovat jim majetek, brát svobodu slova, brát jim právo se bránit atd.To neni nutne pravda, viz. Ale asi to nema smysl zminovat, protoze predpokladam, ze si to vylozis tak, ze obhajuji konkretni nazor, kdyz chci (podobne to jako dela casto David) jen poukazat na existenci takove diskuse.
protože to vrhá špatné světlo na vaši ideologiiAha, co vsechno se clovek nedozvi.
 A proc by nas to svetlo melo trapit?
Mozna bys mi ale mohl pomoct. Jaka je vlastne ta nase ideologie? Vcera jsem dostal postou Angrynomics od Marka Blytha (protoze ho David nekde zminil), zacal jsem to cist, a asi budu s velkou casti souhlasit. Bylo by fajn, kdyby sis ji taky precetl, a pak mi muzes vysvetlit, v cem je ta moje ideologie. 
            noa teď sem si toho jako všimla :O :O tučňáček!!!!!! :O :O :O :D :D :D ;D
🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧🐧 díky!!!!!!!!!!!!!!!!! :D
Přesto se dokázali trefovat a pojmenovat to, co ostatní trápilo.Akorát z komunismu je vyléčil až komunismus...
            Kdybyste si, vy hejhulové, přečetli, co ten Marx psal, dozvěděli byste se, že vycházel z určitého pojetí dějin a předpokládal vývoj … → feudalismus → kapitalismus → socialismus → komunismus, což od něj řada dalších přejala. Takže v agrárním Rusku (Číně,…) skoncovali s feudalismem a jali se industrializovat ve státním kapitalismu.Což zjevně postačilo k cestě z vidlákova k mamutímu podílu na výsledku druhé světové války, na oběžnou dráhu,… (+ takové dílčí záležitosti jako zrovnoprávnění žen, zvýšení gramotnosti, dekolonizace, omezení extrémní chudoby,…) To neznamená, že se na nějaký socialismus, natož komunismus pak vesměs nevybodli – SSSR nebo ČLR nejpozději během ~80. let – třeba protože ML je náchylný k revizionismu. K tomu navíc kontext Operation Condor nebo Jakarta Method.
Mně nepřijde, že by možnosti něco vykonat, pokud mám moc, bránila nějaká státní ideologie?IMHO ano, jestli chapu spravne tvoji otazku. Ideologie ovlivnuje mysleni obcanu, i statniho aparatu, a tedy interpretaci jakychkoli prikazu shora. Diktator nahore muze mit spravny napad, ale jeho implementace muze selhat prave diky ideologii, kvuli ktere je to o par pater niz hur pochopeno. (A to jen predpokladame, ze vsichni jednaji v zajmove shode, coz se nedeje.) Mimochodem to je jeden z duvodu, proc je "osvicena diktatura" contradictio in adjecto - i kdyby vladce osviceny byl, jeho poskoci nutne nebudou.


prosimte, soudruhu, vyjmenuj mi pet zemi, kde jim ten komunismus fungoval, a prinesl jim prosperitu a zvyseni zivotni urovne, zlepseni lidskych prav, prosperitu a bezpeci. Nebo treba aspon 3, at to nemas tezke.Vždycky mě pobaví, když fanouškovi komunismu*, tj. systému, který zatim v praxi nefungoval (nebo špatně), vyčítá toto fanoušek neoliberalismu, tj. systému, který také zatim v praxi nefungoval (nebo špatně). *) Tím nechci nutně říct, že davkol je fanoušek komunismu, moc nevim, čeho je vlastně fanoušek.
            
            by je bylo potřeba nějak líp vodlišit vod sebe protože každej se chová uplně jinak ten duch a kdyby byli jenom bílí by se pletli ;D jinak si jako myslim že v kontextu jeto jakože dóóóst jasný ;D ;D

exportování neni nutný de to jakoby pouštět přímo v tom editoru buďto ikonkou play vpravo nahoře v panelu nóó a nebo máčkutím na klávesnici f5 jestli ji mac jako má tuhletu klávesu :D ;D
Jen prosím, doplň tam nějakou svobodnou licenci jako GNU GPL 3, ať se to dá šířit dál. Taky by se hodilo video - tady v práci si to kompilovat nebudu, ale na video bych klidně kouknul.
Jo a dávej si pozor, ať ti to Kolibáč nesmaže. To už tu nedávno bylo.
            
            Nevím, jestli to vychází z nějakého absurdního dramatu od Veškrny či z Postavy k podpírání nebo něčeho podobného, ale povedlo se – smazané-nesmazané komentáře, cenzura-necenzura.Žádnou kulturu bych v tom nehledal - IMHO jen postupuje podle příručky. Oni tomuhle říkají "deplatforming" - je to snaha zbavit opozici možnosti komunikovat, prezentovat svoje myšlenky. Zatímco on sám zde bude popírat zločiny komunismus. A donekonečna tapetovat svojí propagandou.
            jako taková hrůůůza to zase neni :D zásek bylo hlavně tamto s těma referencema z nulovejch oběktů protože každýho spíš napadne hledat chybku někde u sebe ané u nich někde :O :'( ve zdrojáčku skriptíku Hra.gd najdeš tenhleten zakomentovanej vypnutej kus kterej měl hasit požáry mezi restartama levelů
for pozar in pozary: # kouken jestli je instance požáru validní # jakože neni null nebo už připravená na vodstranění if is_instance_valid(pozar): pozar.queue_free() pozary = []
někdy to nezničilo všecky požáry nóó a někdy to zničilo uplně nějakej jinej náhodnej uzel ve stromku scény prostě supr :O :/ jako dalo byseto vobejít tim žeby se instance požáru neničila sama prostě by jenom vypnula tu emisi particlů/udělala se neviditelnou noa každým startem levelu by se tady ty voběkty ničili ale tohleto by prostě mělo fungovat taky jako ne :O :O
První co mě napadlo udělat byla ta html stránka jenže se ukázalo že s tou hrou měl každej kdo ji zkoušel hrát nějaký jiný problémky.Pro HTML verzi doporučují GLES2.
Kdybych ho jako měla popsat, tak bych řekla žeto je python říznutej rustem a vokořeněnej javascriptemNa některý věci je to fakt otravný... Mám pole, položky jsou Dictionary, chci z něj odstranit některý položky na základě podmínky. V Ruby
ary.delete_if { |item| něco_co_dá_bool }. Tady mě nenapadlo nic lepšího než nekonečný cyklus, v něm for cyklus, který projde přes všechny položky, nastaví proměnnou, když najde položku ke smazání, vyskočí z vnitřního cyklu, příslušná položka se smaže, break z vnějšího cyklu v případě, že vnitřní cyklus nic nenastavil. Ble.
            nějaký smutný náckové pacmana na fb hejtujou a jako nejrači byho viděli smazanýho hele printscreen :O :O :O :O :'( :D :'( :D :'( :D
            se to tam dalo jakoby nějak samo :O :O :D ;D asi to tam jako hází všecky zprávičky články a blogísky nóó a tohodletoho si prostě jako nějak všimli :D
Druhá povolená skupina budou asi horníci překvalifikovaný na programátory. Z té diskuze na FB jsem pochopil že jsou moc moc zlí.Dovoluji si upozornit, že slovo "zlí" může mít v rámci českých zemí celou řadu konotací. Počínaje sdělením, že jsou hrozně moc nasraní a konče tím, že výsledky jejich práce stojí za hovno. A mezi tím je ještě celá škála dalších významů. Třeba jako že jsou zlí v tom kontextu, že trhají mouchám nožičky a vraždí žáby.
hmmmm lidi co máčknou šipku jenom v zatáčcemě mě jako nenapadli :O :O
poslal jsem Malému odkaz na Anti-communist mass killings a on mě zablokoval.Chi chi, tys chtěl trollit a von se nenechal a bloknul tě!
Krásnej dabl stendrd a hypokrasy.Ano. Pokrytec Malý píše
Co s těmi, kteří nechtějí nový spravedlivý svět? Nechat je v klidu, ať si pindají a kverulují? To ne, to dělá kapitalismus, a podívejte se, jak se mu to vymstilo.přestože ta masová vraždění to vyvracejí. Navíc ani nenechá pindat a kverulovat v komentářích!
Helejte, myslím, že ani zelené, ani lidskoprávní, ani genderové ani žádné jiné podobné hnutí, označované jako levicové, není v základu proti kapitalismu. Chce něco zlepšovat, něco měnit. Ale velmi rychle se k tomu namotají — a možná jsem zaujatý, ale mám pocit, že to jsou pořád titíž — lidé, kteří docela rychle převezmou agendu, zradikalizují ji, odhalí příčinu problému (ta je vždy stejná: kapitalismus) a začnou proti tomu bojovat. Ono je to s tím bojem proti kapitalismu takové furt na jedno brdo. Vždycky to začne tím, že kapitalismus je fuj, nesvobodný, potlačuje lidská práva ve prospěch vrstvy nejbohatších, a to je potřeba vyvrátit, ukončit, zrušit, zastavit, zničit!Můj problém s tímhle postojem je, že ignoruje problémy. Tohle je pattern, který se objevuje dnes docela dost v různých oblastech, aspoň mam ten dojem. Nemusim mít nutně ikonu Marxe na nočním stolku, abych viděl, že 'reálný kapitalismus' má celkem problémy. Nemusim bejt nutně člen Greenpeace, abych viděl, že jsou tu celkem slušný ekologický problémy (což je mj. spojený taky s tim kapitalismem). Nemusim bejt nutně člen BLM, abych viděl, že policie v USA má dlouhodobě celkem slušný problém s přístupem k menšinám, bezdomovcům apod. Jak dlouho měli v USA na to, aby ty problémy řešili ne-radikálně? Doslova desetiletí. Neudělalo se vůbec nic, naopak se problémy zametaly pod koberec. A u nás to třeba v oblasti té ekologie není o moc lepší. Lidi mají tendenci problémy ignorovat, bagatelizovat, nebo rovnou popírat a včasné nebo nedejbože preventivní řešení problémů nesnášejí. Mají pocit, že někdo otravuje s něčim, co reálně není problém. A pak jednoho krásného dne problém přeroste přes hlavu a vloží se do toho radikálové, a spousta lidí jsou najednou surprised pikachu a hrozně se diví, co se to děje a proč se k problému přistupuje takhle blbě radikálně. Vždyť by to přece šlo řešit mnohem rozumněji. U nás když někam na střechu vylezou Greenpeasáci, tak se hned vyrojí 1000 a 1 rozumbrada s tím, že takhle se ten problém rozhodě nemá řešit a že to jsou pomatený fanatici, což jako sice je do značný míry pravda, ale Greenpesáci pak slezou a 1000 a 1 rozumbrada se vrátí zpět k ignoraci problému, dokud se cyklus nezopakuje. Chtějí lidé raději rozumné, racionální, neradikální řešení problémů? Ok, v pořádku, ale v tom případě je potřeba začít ty věci rozumně, racionálně a neradikálně řešit dnes a ne až za 10, 20 let, kdy z toho bude občanská válka nebo ekologická katastrofa nebo nějakej podobnej průser...
kde se ten reálný kapitalismus kromě keců místních bolševiků vlastně vyskytujeA kde sú tí reálny bolševici?
Můj problém s tímhle postojem je, že ignoruje problémy. Tohle je pattern, který se objevuje dnes docela dost v různých oblastech, aspoň mam ten dojem. Nemusim mít nutně ikonu Marxe na nočním stolku, abych viděl, že 'reálný kapitalismus' má celkem problémy.Hele, mam totaz a mozna tim lehce nabouram tvou vizi, je tech problemu ted, po letech "pokroku" vic nebo min nez jich bylo treba v roce 1980 nebo 1990? Ted, kdy se levicaci snazi 30 let "opravovat" kapitalismus, a s kazdou dalsi opravou stoji vic a vic za hovno? Je vic problemu ve mestech, kde vladnou treba 3 generace neprerusovane politici demokraticke strany, kteri bez omezeni implementuji sve socialisticke vize, nebo ve fungujicicih mestech jako colorado springs? Zilo se treba ve francii, italii nebo zapadnim nemecku lepe v roce 1990 nebo dnes? Zilo se v londyne lepe v roce 1990 nebo dnes?
Je vic problemu ve mestech, kde vladnou treba 3 generace neprerusovane politici demokraticke strany, kteri bez omezeni implementuji sve socialisticke vize, nebo ve fungujicicih mestech jako colorado springs?Neznám moc partikulárie jednotlivých oblastí USA, můj dojem je, že v USA je švihlá víceméně celá politická scéna. K té Sofiině volbě, co vás tam čeká na podzim, nezbývá než sarkasticky pogratulovat. Kdybych byl nucen se přesunout do Severní Ameriky, zvolil bych pokudmožno Kanadu. Ne, že by to tam bylo bez problémů, ale aspoň to nejsou USA.
Zilo se treba ve francii, italii nebo zapadnim nemecku lepe v roce 1990 nebo dnes? Zilo se v londyne lepe v roce 1990 nebo dnes?Podle jaký metriky? Např. u nás jsme ještě v 90. letech měli i zimy. Dnes už máme jen takový delší podzimy a když je v létě normální stav vody, tak je to na bouchání šampaňského. Jinak nemam pocit, že by v Evropě v posledních ~40 letech docházelo k nějakýmu divokýmu "levicovýmu pokroku". Nebo tím narážíš na imigranty? Chceš si postěžovat například na jejich statistiky zločinnosti? Ok, v pořádku, ale v tom případě bych se rád zeptal na naše vlastní problémy, které tomu předchází:
Jak dlouho měli v USA na to, aby ty problémy řešili ne-radikálně? Doslova desetiletí. Neudělalo se vůbec nic, naopak se problémy zametaly pod koberec. A u nás to třeba v oblasti té ekologie není o moc lepší.Kdysi tady někdo dával odkaz na jeden blogový zápisek: Jak naše generace dnešní mládeži zničila život.
            Kdysi tady někdo dával odkaz na jeden blogový zápisek: Jak naše generace dnešní mládeži zničila život.Ježišmarja. Ten člověk asi hodně nesnáší 'mladou generaci'... Ani nevim odkud začít. V první řadě mi přijde jako nesmysl z toho dělat mezigenerační problém, to je opravdu hovadina. (Ano, znám video Umweltsau a ano, je zcela debilní. Však ho taky ta stanice další den stáhla a omluvila se. Takže proč v té mezigenerační animozitě pokračovat?) Ty problémy jsou mnohem dlouhodobější než aby se to dalo hodit na jednu generaci, a stejnětak i pozitiva a řešení. V jiný diskusi jsem tady zmiňoval jako krok dobrým směrem vytvoření národních parků, což ve světe nastalo před 100 lety a u nás v 60. letech. Z mýho pohledu v tom jedem všichni stejně, staří i mladí. Co tam má dál. Gréta mě nezajímá a moc nevim, proč by někoho zajímat měla. Do obličeje nikomu neplivu, ekosviní nikoho nenazývám, ke stromům se nepřivazuji, proti jádru neprotestuji. Maso trochu redukuji, specielně uzeniny a červené, ale vegan nejsem. Uhelné prázdniny jsem taky zažil (někdy kolem r. 2000) a rodičům na vesnici kdykoli zahřmí v okruhu 50km vypínají proud ještě dnes. Za všechno, co se podařilo v oblasti ekologie v posledních 30 letech jsem samozřejmě vděčný. Nejsem vítač migrantů. Neprosazuju ekologickou bezdětnost - na to už je pro mě trochu pozdě
Nejsem fanoušek Marxe ani levicových ideologií. Nepožaduju okamžité svržení všeho a revoluci a budování zítřků a kdesicosi. Nevim, jaký systém prosazovat do budoucna, nevim, koho volit v dalších volbách. Myslim si, že se to bude muset řešit taknějak za pochodu. Čekal bych, že bude potřeba časem jít směrem k cirkulárním ekonomikám, třeba za použití nějaké formy emisních povolenek (což je IMO zvádějící název pro ten mechanismus, ale co se dá dělat), ale jak přesně by to vlastně mělo vypadat, to opravdu nevim.
Ke kapitalismu (to je pro příklad - problémy jsou samozřejmě i jinde) se stavim kriticky ne kvůli nějaké levicové ideologii nebo sociální spravedlnosti, ale především z praktických důvodů. Přijde mi, že  i přes všechno co se podařilo existuje stále příliš mnoho ukazatelů, že tak, jak ten systém (ekonomika, politika, ...) funguje teď, nemůže fungovat dlouhodobě. Jde mi o to, že bych nerad, abychom já, moje děti, rodiče, lidi kolem mě atd., na to nějak tvrdě doplatili.
Je to pochopitelné?
            Ani nevim odkud začít.Já bych věděl… Už jsem to někde psal, smysl by dávalo, kdyby si Prouza a jemu podobní sypali popel na hlavy, protože se svými Brontosaury selhali: meliorace jsou furt v zemi, naopak uhlí ale nikoliv a uhelné elektrárny stále běží. Chtělo by se namítnout, že se snažili. Když padlo to uhlí, u nás se říkalo: „Snaha neni koksovatelna.“ Tedy, aspoň o tématice drželi nějaké povědomí a vytvořili organizační infrastrukturu, na které lze stavět – dala by se najít nějaká souvislost s např. Hnutím Duha (ohlédnutí za 30 lety), kde je ale důležitý postřeh:
Oba jsme krátce prošli Českým svazem ochránců přírody, a třebaže jsme v něm poznali některé obdivuhodné lidi a po čase jsme se naučili vážit si i některých osobností v hnutí Brontosaurus, vcelku jsme měli k oficiálním organizacím, které minulý režim toleroval, hodně kritický vztah. Vadilo nám, že nemohou mluvit o potřebných systémových změnách, že například nemohou klást odpor jaderným elektrárnám. Nebo že uklízejí v lese a sázejí tam smrčky, když je přitom ničí kyselé deště, místo toho, aby se zaměřili na kouřící komíny.
V první řadě mi přijde jako nesmysl z toho dělat mezigenerační problém, to je opravdu hovadina.Aha. On to totiž mezi generační problém je. Jak se říká – starého psa novým kouskům nenaučíš. Tím spíš v kontextu ± exponenciálních (nebo aspoň řádově rychlejších než lidský život) technologických změn a jejich dopadů. Generační obměna je zásadní pro adaptaci (odtud též evoluce). Pokud to půjde nějak obejít (např. psychedelika, transhumanismus), budiž. Současná společnost je v pasti. Dominuje jedna nebo dvě generace, které zažily bezprecedentní podmínky (hlavně po WW2), navykly si v tomto prostředí na určitý způsob života (např. propojení osobní identity s automobilismem) a systémy (organizace, státní správa) jsou navrženy tak, že jim dávají disproporční vliv: viz nejen kandidátky politických stran, ale také volební výsledky – pak si jako Prouza starý Babiš, kterého zvolili do role premiéra zvláště další podobně staří jedinci, dovolí prohlásit, že ho nezajímá, co bude za 30 let.
Díky koronáči se Quido minecraftu konečně nasytil, ale ještě předtím si řádně zapařil v rámci celosvětové komunity, což vedlo k tomu, že se výrazně zlepšil v anglické konverzaci. Také ho to přinutilo aby si pod mojí knutou oprášil základy administrace linuxu. Také se začal bavit 3D animacema v Blenderu. A pro oddech občas s kámošema paří jakousi on-line variaci Dooma.
Ovšem škola mu už naštěstí skončila, takže bude mít s kámošema dvouměsíční digitální detox, protože se spolu uvidí na táboření.
            si ho zahraj taky a nešpekuluj :D ;D
 Jako on šel do koše až teď po 15ti letech co jsem ho objevil v sklepě. Stejně měl ten 15pin konektor a není to kde píchnout.
            
            
            echo $'CZ\nUS' | xargs --max-args=1 --max-procs=0 instaluj-cedule --v-zemiParalelizace! Edukace!
Problém je v tom, že tady nejde o žádné černochy nebo o rasismus.
I černoši vědí, že BML je jen pokus extrémní levice a demokratů dostat se k moci.
https://www.youtube.com/watch?v=ItopNgRQiuY https://www.youtube.com/watch?v=pbccGbPKwok
Náš problém nejsou orteláčci, flaztenci a jiní “stopimigracaci”. Těm se jedná o to jejich. Naším problémem je dav nalevo, kterému se nejedná o to jejich, ale o to naše. Oni nechtějí bránit svoje (zatím svoje nemají), oni chtějí hlavně zničit to naše, protože to je (jak nám opakují) špatné! Tak špatné, že i když to zlepšíme, tak to bude pořád špatné, protože to je špatné od základů!
Chvíli jsme si možná mysleli, že když nechceme xenofobii a primitivismus, že vlastně jsme s nimi na jedné lodi. Nejsme, nebyli jsme a nebudeme: jsme třídní nepřítel, jsme “privilegovaní narozením”, cokoli uděláme, uděláme špatně, a někdo zleva nám to vždycky rád oznámí.
...a zapomínáte na to podstatné: Třídní boj a zničení kapitalismu je pro leftivistu nejvyšší cíl, a k jeho dosažení lze fašisty (to jsme v jejich slovníku my) podvést, klamat, osočit z čehokoli…