{"version":3,"sources":["objects/Enums.js","components/ShareAndPaypal.js","components/TitleScreen.js","components/Results.js","components/Hud.js","components/Countdown.js","objects/Support.js","objects/Mapping.js","objects/Player.js","objects/Portal.js","objects/Connection.js","objects/SpecialZone.js","objects/Explosion.js","objects/BonusPoint.js","objects/Rotator.js","components/Tutorial.js","components/MusicPlayer.js","serviceWorker.js","App.js","i18n.js","index.js"],"names":["specialKeys","8","9","13","16","17","18","19","20","27","32","33","34","35","36","37","38","39","40","45","46","96","97","98","99","100","101","102","103","104","105","106","107","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","144","145","191","224","403","404","405","406","controls","playerPhaseEnum","gamePhaseEnum","orientation","zoneType","explosionType","mappingType","connectionType","menuControlItems","mappingItems","greatColors","map","a","sort","Math","random","value","b","ShareAndPaypal","url","event","window","open","t","this","props","twitterURL","facebookURL","vkURL","className","title","target","rel","href","onClick","openThat","bind","action","method","type","name","src","border","alt","React","Component","withTranslation","TitleScreen","keyboardCount","players","filter","pl","controlledBy","length","keyboardCount0","controllerId","keyboardCount1","keyboardCount2","keyboardCount3","pi","style","backgroundColor","color","backgroundImage","fontClass","specialFontClass","key","guid","index","team","inMenuCurrent","indexOf","isMapped","controlTextMove","controlTextMoveAlt","controlTextPortal","controlTextDial","controlTextRam","controlTextMines","controlTextPauseMenu","mappingCurrent","mappingStepTimeout","toFixed","startCountdownRunning","startCountdown","isSetCustomMapping","Results","score","Hud","blockadeClassName","blockadeCooldown","blockadeStyle","portalClassName","portalCooldown","portalStyle","ramClassName","ramCooldown","ramStyle","overDriveClassName","overDriveCooldown","overDriveStyle","isFirst","energy","portalDial","Countdown","phase","gameCountdownMin","padStart","gameCountdownSec","keyName","which","String","fromCharCode","toLowerCase","rgbToHex","rgb","hex","Number","toString","clearCircle","context","x","y","radius","globalCompositeOperation","beginPath","arc","PI","fill","Mapping","isPositiveAxis","Player","colorId","game","isDemo","uniqueIndex","replace","c","r","bottomHudsHeight","getBottomHudsHeight","resetWidth","canvas","width","resetHeight","height","oldx","lastCheckX","floor","oldy","lastCheckY","lastNeighborX","lastNeighborY","neighborDetectionInterval","LastNeighborDetection","neighborClose1","neighborClose2","storm1x","storm1y","storm2x","storm2y","toStorm","StormPositionSet","baseSpeed","bonusSpeed","maxBonusSpeed","breaking","deaths","markedForRemove","smer","cycleWithoutNewSmer","strightLenght","strightTime","maxLine","anyAction","mappingAutoReload","mappingArray","lastPressedKeyId","lastPressedAxisId","mappingStepTimeoutDefault","playerPhase","state","gamePhase","playerPhasePrevious","setInMenuCurrent","setControlTexts","explosion","exRadius","clearBehindPlayer","AIactionTimeout","gateDuration","gateDurationDefault","gateCooldownTime","gateCooldownTimeDefault","gateCooldown","autoGateCooldownTime","autoGateCooldownTimeDefault","currentGateIsPortal","portalCooldownTime","portalCooldownTimeDefault","portalBeginX","portalBeginY","transferDelay","transferDelayDefault","transferX","transferY","blockadeDuration","blockadeDurationDefault","blockadeCooldownTime","blockadeCooldownTimeDefault","blockadeSpawnCurrentStep","ramDuration","ramDurationDefault","ramCooldownTime","ramCooldownTimeDefault","lastDial","dialResetAfter","overDriveDuration","overDriveDurationDefault","lastPause","tutorialBefore","restartTimeout","restartTimeoutDefault","menuActionTimeout","menuActionTimeoutDefault","actual","left","right","up","down","gate","blockade","ram","dial","pause","prev","prevPriorityChecksum","priorityArray","soundReadyPlayed","soundReadyTimeout","soundReadyTimeoutDefault","soundFirstPlayed","menuPosition","gamepads","id","mapping","colision","cycles","tmpx","tmpy","findSpecialZoneColision","addConnection","updatePlayersInfo","toMenuItemControls","delay","respawn","addPortal","playSound","prevPortalDial","pauseGame","tutorial","nsmer","actArr","prevArr","checksum","f","push","move","notMappedPressAny","gp","undefined","connected","devIsUsed","gamepadX","gamepadY","axes","sqrt","pow","angle","asin","actionAngle","buttons","pressed","loadMapping","axesLength","saveOrUpdateMapping","keydown","del","home","insert","end","w","s","d","z","e","q","i","k","j","l","n","o","u","m","playerNewWay","AInewWay","aiDetector","wayOK","pokusu","ctx","getImageData","data","detect","addAI","removeAI","toggleFullScreen","updateAIColor","updateGameLang","updateGameTime","musicPlayerNext","musicPlayerStop","musicPlayerVolumeUp","musicPlayerVolumeDown","movestep","detect1","detect2","colX","colY","moveToXY","stepAmount","newx","newy","floorX","floorY","points","colectPoints","console","log","updateTeamScore","sumEnergy","sumScore","detector","abs","boom","portal","findPortal","randPortal","getRandomPortal","ori","plusX","plusY","diff","endx","beginx","endy","beginy","processControlls","processAIControlls","timeoutPausableProcess","timeoutsProcess","controlMenu","controlPlayer","processNewPosition","infoctx","fillStyle","fillRect","speedLineOpacity","speedLineColor","clearRect","addExplosion","size","sizeBall","drawVehicle","strokeStyle","lineWidth","stroke","moveTo","lineTo","drawRam","zbyva","dropx","dropy","varX","varY","stormx","stormy","ran","Portal","bx","by","ex","ey","permanent","duration","dialCode","dx","dy","sx","sy","rnd1x","rnd1y","rnd2x","rnd2y","delayedInitDefault","delayedInit","portalDuration","changeColorTimeout","changeColorTimeoutDefault","shakeGateTimeout","shakeGateTimeoutDefault","startTargetCodeChanging","arrowAnimationCycle","arrowAnimationCycleDefault","arrowPosition","displayArrows","targetCode","ok","newColor","gameCountdown","gameCountdownDefault","InfofillStyle","InfostrokeStyle","lineBreaks","partX","partY","part","Connection","connectionDuration","SpecialZone","greatColor","cleared","durationDefault","toErase","toSwitch","toSwitchDefault","switch","moveAway","canvasWidth","canvasHeight","colide","boxAdd","baseWidth","baseHeight","borderSpacer","presahXdoprava","presahXdoleva","presahYdolu","presahYnahoru","previousWidth","previousHeight","playerColide","portalColide","zoneColide","findZoneZoneColision","findPlayerColision","findPortalColision","addBonusPoint","addRotator","speed","textAlign","font","fillText","strokeRect","prevBeginx","prevBeginy","prevEndx","prevEndy","Explosion","expansionDefault","nextLineTime","bonusDropped","speedDiameter","partsArray","plus","diameter","drawPlayerExplosion","drawEffectExplosion","BonusPoint","takeEfectStart","Rotator","step","oldStep","pos","lineCap","xx","cos","yy","sin","drawHand","Tutorial","class","MusicPlayer","files","file","link","playOrder","currentPlaybackFileID","playng","forceShow","volume","player","refs","mPlayer","paused","play","setState","setTimeout","next","load","onRef","shuffled","addEventListener","playerClass","playStop","volumeUp","volumeDown","ref","autoPlay","isLocalhost","Boolean","location","hostname","match","register","config","navigator","URL","process","origin","swUrl","fetch","headers","then","response","contentType","get","status","serviceWorker","ready","registration","unregister","reload","registerValidSW","catch","checkValidServiceWorker","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","error","self","skipWaiting","App","hudsRef","createRef","playerRef","time","gameSpeed","prevEsc","lastEsc","gamepadsMappingsArray","AIDemoPlayers","AIplayers","sameAIColor","portals","portalCounter","bonusPoints","bonusPointsCounter","connections","zones","zoneCounter","eraserZoneCount","eraserZoneDelay","rotators","rotatorCounter","explosions","specialZoneTimeout","specialZoneKillerTimeout","startCountdownDefault","countDownTempVisible","countDownTempVisibleDefault","menuAutoMoveCountdown","menuAutoMoveCountdownDefault","targetCodeChangingCountdown","targetCodeChangingCountdownDefault","menuFreezeCountdown","menuFreezeCountdownDefault","soundEnabled","soundPlayer1","document","createElement","soundPlayer2","soundPlayer3","soundPlayer4","soundPlayer5","soundCountdownPlayed","sound5MLeftPlayed","sound1MLeftPlayed","sound321GameOverPlayed","MixRunColor","soundPositions","setServiceWorkerInitialized","setServiceWorkerUpdated","space","preventDefault","gamepad","onloadeddata","canvasSize","innerWidth","innerHeight","serviceWorkerInitialized","serviceWorkerUpdated","serviceWorkerRegistration","countDownVisible","playersInfo","teamPlayers","forEach","nonDemoPlayers","fi","plaFirst","firstGroup","teamMates","someRemoved","splice","pla","hudsRefHeight","current","clientHeight","updateCanvasSize","SetUniqueIndex","shortedPlayers","updated","initialized","previousPhase","ReactGA","category","label","clearAllCanvas","removeAllDemoAI","p","playerRespawn","updateResults","playerToMenuPhase","playerExplode","playerToPreviousPhase","notPermanentPortals","heightDiff","widthDiff","stredx","stredy","count","demoPlayersCount","addPlayer","forErase","ais","ai","updateCountdown","i18n","changeLanguage","possibleZones","zone","possiblePlayers","possiblePortals","po","nx","ny","foundedPortals","portalId","filteredPossiblePortals","used","esc","updateGamePhase","addSpecialZone","readyIndex","notReadyPlayers","newPhase","actTime","Date","getTime","getGamepads","update","recognizePlayersAndControlls","changeTargetCode","conectionDuration","gamapadIdName","localStorage","JSON","parse","find","ma","stringify","infocanvas","draw","soundIndex","distance","volumeNew","actPlayer","isNaN","currentTime","setInterval","clearInterval","requestAnimationFrame","bgcanvas","round","bgstredx","bgstredy","reCreateBasicPortals","fullscreenElement","exitFullscreen","documentElement","requestFullscreen","getContext","bgctx","initialize","runLoop","registrationWaiting","waiting","postMessage","updateServiceWorker","updateSW","setSW","use","Backend","LanguageDetector","initReactI18next","init","fallbackLng","debug","interpolation","escapeValue","react","useSuspense","wait","resources","en","common","translation_en","cs","translation_cs","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.ec4f8571.chunk.js","sourcesContent":["//enum tabulka klíčů\r\nexport var specialKeys = {\r\n 8: \"backspace\", 9: \"tab\", 13: \"return\", 16: \"shift\", 17: \"ctrl\", 18: \"alt\", 19: \"pause\",\r\n 20: \"capslock\", 27: \"esc\", 32: \"space\", 33: \"pageup\", 34: \"pagedown\", 35: \"end\", 36: \"home\",\r\n 37: \"left\", 38: \"up\", 39: \"right\", 40: \"down\", 45: \"insert\", 46: \"del\",\r\n 96: \"0\", 97: \"1\", 98: \"2\", 99: \"3\", 100: \"4\", 101: \"5\", 102: \"6\", 103: \"7\",\r\n 104: \"8\", 105: \"9\", 106: \"*\", 107: \"+\", 109: \"-\", 110: \".\", 111: \"/\",\r\n 112: \"f1\", 113: \"f2\", 114: \"f3\", 115: \"f4\", 116: \"f5\", 117: \"f6\", 118: \"f7\", 119: \"f8\",\r\n 120: \"f9\", 121: \"f10\", 122: \"f11\", 123: \"f12\", 144: \"numlock\", 145: \"scroll\", 191: \"/\", 224: \"meta\",\r\n 403: \"red\", 404: \"green\", 405: \"yellow\", 406: \"blue\"\r\n};\r\n\r\n\r\n//enum typ ovládání\r\nexport var controls = {\r\n GAMEPAD: \"Gamepad\",\r\n KEYBOARD: \"Keyboard\",\r\n AI: \"Artificial Inteligence\"\r\n};\r\n\r\n\r\n//enum průběhu hry\r\nexport var playerPhaseEnum = {\r\n DEATH: \"death\",\r\n INMENU: \"in menu\",\r\n READY: \"ready to game\",\r\n GAME: \"game\"\r\n};\r\n\r\n//enum průběhu hry\r\nexport var gamePhaseEnum = {\r\n LOBBY: \"loby\",\r\n TUTORIAL: \"tutorial\",\r\n GAME: \"game\",\r\n RESULTS: \"results\",\r\n PAUSE: \"pause\"\r\n};\r\n\r\n\r\n\r\n//orientace brány\r\nexport var orientation = {\r\n VERTICAL: \"vertical\",\r\n HORIZONTAL: \"horizontal\"\r\n};\r\n\r\n\r\n//typ speciální zóny\r\nexport var zoneType = {\r\n ERASER: \"eraser\" /* mazající se zóna (úklid levelu) */,\r\n SNAKEU: \"snakeu\",\r\n SNAKED: \"snaked\",\r\n ROTODEATHR: \"rotodeathr\" /* tunel s rotátorem */,\r\n ROTODEATHL: \"rotodeathl\" /* tunel s rotátorem */,\r\n SPEEDTUNNEL: \"speedtunnel\",\r\n HEARTH: \"hearth\",\r\n MAZE: \"maze\",\r\n MONKEY: \"monkey\",\r\n OWL: \"owl\",\r\n RABBIT: \"rabbit\",\r\n KILLER: \"killer\"\r\n};\r\n\r\n//typy exploze\r\nexport var explosionType = {\r\n PLAYER: \"player\",\r\n CLEAR: \"clear\"\r\n}\r\n\r\nexport var mappingType = {\r\n BUTTON: \"button\",\r\n AXIS: \"axis\"\r\n}\r\n\r\n\r\nexport var connectionType = {\r\n PORTAL: \"portal\",\r\n DEATH: \"death\",\r\n}\r\n\r\n\r\n\r\nexport var menuControlItems = ['leave', 'lang', 'musicVol','music','screen', 'AI color', 'time', 'team', 'controls', 'tracer', 'color', 'AI count', 'ready'];\r\n\r\n//fáze konfigurace ovládání\r\nexport var mappingItems = ['up','down','left','right','portal','mines','hammer', 'dial' ,'pause'];\r\n\r\n\r\n//skvělé barvy pro hru\r\nexport var greatColors = ['#1a77ea', '#a200FF', '#FF0000', '#FF8000', '#00FF00', '#fcFF00', '#00F6FF', '#FF05DB', '#FFFFFF', '#009e1a', '#75400b'\r\n, '#0b755d'/* matna zelena */, '#191970'/*midnightblue*/, '#ffd700'/* gold */, '#696969' /* dimgray */, '#808000' /* olivova */, '#ff1493' /* deep pink */,\r\n'#8b0000' /* darkred */, '#cd853f' /* peru */, '#fa8072' /* lososova */ ];\r\n\r\n\r\n//export var greatColors = ['#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#00FFFF', '#FF00FF', '#FFFFFF'];\r\n// export var greatColors = ['#F44336', '#448AFF', '#388E3C', '#FFEB3B', '#FF9800', '#673AB7'];\r\n\r\n//uděláme jim mix\r\ngreatColors = greatColors\r\n.map((a) => ({sort: Math.random(), value: a}))\r\n.sort((a, b) => a.sort - b.sort)\r\n.map((a) => a.value);\r\n\r\n//console.log(greatColors);\r\n\r\n\r\nexport var gateColor = '#ffffff33';","import React from 'react';\r\nimport { withTranslation } from 'react-i18next';\r\n\r\nexport class ShareAndPaypal extends React.Component {\r\n\r\n\r\n openThat(url, event){\r\n window.open(url,'','menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=450,width=550,left=300,top=300');\r\n }\r\n\r\n render() {\r\n \r\n const { t } = this.props;\r\n let twitterURL = 'https://twitter.com/intent/tweet?url=https://cybertracers.devbob.cz/&hashtags=cybertracers,couchgame';\r\n let facebookURL = 'https://www.facebook.com/sharer.php?u=https://cybertracers.devbob.cz/&hashtag=%23cybertracers';\r\n let vkURL = 'https://vk.com/share.php?url=https://cybertracers.devbob.cz/';\r\n //vyresit problem https://mathiasbynens.github.io/rel-noopener/\r\n\r\n\r\n return(\r\n
\r\n\r\n
\r\n {t('game.donateText')}\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n\r\n
\r\n \r\n
\r\n \r\n {/*
\r\n \r\n
*/}\r\n\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n {/*
{t('game.thankYou')}
*/}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withTranslation('common')(ShareAndPaypal);","import React from 'react';\r\nimport { greatColors, menuControlItems, controls, mappingItems } from '../objects/Enums';\r\nimport { withTranslation } from 'react-i18next';\r\nimport ShareAndPaypal from './ShareAndPaypal';\r\n \r\nexport class TitleScreen extends React.Component {\r\n\r\n componentDidMount(){\r\n }\r\n \r\n \r\n render() {\r\n\r\n const { t } = this.props;\r\n let keyboardCount = this.props.players.filter(pl=>pl.controlledBy === controls.KEYBOARD || pl.controlledBy === controls.GAMEPAD).length ;\r\n let keyboardCount0 = this.props.players.filter(pl=>pl.controlledBy === controls.KEYBOARD && pl.controllerId === 0).length ;\r\n let keyboardCount1 = this.props.players.filter(pl=>pl.controlledBy === controls.KEYBOARD && pl.controllerId === 1).length ;\r\n let keyboardCount2 = this.props.players.filter(pl=>pl.controlledBy === controls.KEYBOARD && pl.controllerId === 2).length ;\r\n let keyboardCount3 = this.props.players.filter(pl=>pl.controlledBy === controls.KEYBOARD && pl.controllerId === 3).length ;\r\n\r\n return (\r\n
\r\n\r\n
\r\n\r\n
\r\n {t('game.press')}\r\n \r\n

\r\n {keyboardCount <= 4 &&\r\n keyboardCount0 === 0 ? <>

{t('game.or')} \r\n : keyboardCount1 === 0 ? <>
W
{t('game.or')} \r\n : keyboardCount2 === 0 ? <>
8
{t('game.or')} \r\n : keyboardCount3 === 0 && <>
I
{t('game.or')} }\r\n \r\n J\r\n

\r\n\r\n

\r\n
{t('game.toJoin')}
{t('game.player2')} P{keyboardCount}\r\n

\r\n
\r\n\r\n\r\n {this.props.players.map( pi=> {\r\n \r\n const style = {\r\n backgroundColor : greatColors[pi.color]\r\n ,backgroundImage: pi.type === 3 ?\"url(/trike.png)\":\"url(/quad.png)\"\r\n }\r\n \r\n const fontClass = pi.specialFontClass!=null ? pi.specialFontClass : ''\r\n\r\n return (\r\n
\r\n\r\n {pi.controlledBy === controls.AI && \r\n
\r\n
\r\n {t('game.onlyKeyboard')}
\r\n {t('game.orGamepad')}\r\n
\r\n
\r\n }\r\n\r\n {/*
\r\n { pi.controlledBy === controls.AI && }\r\n
*/}\r\n\r\n\r\n
\r\n { pi.controlledBy === controls.AI && <>AI{pi.index}}\r\n { pi.controlledBy !== controls.AI && <>P{pi.index}}\r\n { pi.team > 0 && T{pi.team}}\r\n
\r\n\r\n \r\n\r\n
\r\n { pi.inMenuCurrent === menuControlItems.indexOf('controls') \r\n && pi.isMapped \r\n &&
\r\n {t('game.move')}: {pi.controlTextMove} {pi.controlTextMoveAlt}
\r\n {t('game.portal')}: {pi.controlTextPortal}
\r\n {t('game.dial')}: {pi.controlTextDial}
\r\n {t('game.hammer')}: {pi.controlTextRam}
\r\n {t('game.mines')}: {pi.controlTextMines}
\r\n {t('game.pause')}: {pi.controlTextPauseMenu}\r\n\r\n
}\r\n \r\n { pi.inMenuCurrent === menuControlItems.indexOf('controls') \r\n && !pi.isMapped \r\n &&
\r\n {t('game.setupKey')}
\r\n {t('game.for')} \"{t('control.'+ mappingItems[pi.mappingCurrent])}\"
\r\n
\r\n {t('game.step')} {pi.mappingCurrent+1}/{mappingItems.length}
\r\n {t('game.for2')} {(pi.mappingStepTimeout/1000).toFixed(0)} {t('game.sec')}\r\n
}\r\n\r\n { pi.inMenuCurrent === menuControlItems.indexOf('ready') \r\n && this.props.startCountdownRunning \r\n &&
{this.props.startCountdown}\r\n
}\r\n\r\n
\r\n\r\n\r\n
\r\n \r\n { pi.inMenuCurrent > 0 && pi.controlledBy !== controls.AI && \"up\"}\r\n { (pi.inMenuCurrent === 0 || pi.controlledBy === controls.AI) &&
}\r\n\r\n { (pi.inMenuCurrent === 0 || pi.controlledBy === controls.AI) &&  }\r\n { pi.controlledBy !== controls.AI && pi.inMenuCurrent > 0 && { t('menu.'+ menuControlItems[pi.inMenuCurrent -1])}}\r\n\r\n { pi.inMenuCurrent === menuControlItems.indexOf('ready') && this.props.startCountdownRunning && { t('menu.'+ menuControlItems[pi.inMenuCurrent])}}\r\n { pi.inMenuCurrent === menuControlItems.indexOf('ready') && !this.props.startCountdownRunning && { t('menu.'+ menuControlItems[pi.inMenuCurrent])}}\r\n\r\n { pi.inMenuCurrent === menuControlItems.indexOf('controls') \r\n && !pi.isSetCustomMapping \r\n && \r\n { t('menu.'+ menuControlItems[pi.inMenuCurrent])}\r\n }\r\n\r\n { pi.inMenuCurrent !== menuControlItems.indexOf('ready') \r\n && (pi.inMenuCurrent !== menuControlItems.indexOf('controls') || pi.isSetCustomMapping)\r\n && <>\r\n \r\n \"left\"\r\n { t('menu.'+ menuControlItems[pi.inMenuCurrent])}\r\n \"right\"\r\n \r\n }\r\n\r\n { (pi.inMenuCurrent === menuControlItems.length-1 || pi.controlledBy === controls.AI) &&  }\r\n { pi.controlledBy !== controls.AI && pi.inMenuCurrent < menuControlItems.length-1 && { t('menu.'+ menuControlItems[pi.inMenuCurrent +1])}}\r\n\r\n\r\n { pi.inMenuCurrent < menuControlItems.length-1 && pi.controlledBy !== controls.AI && \"down\"}\r\n { (pi.inMenuCurrent === menuControlItems.length-1 || pi.controlledBy === controls.AI) &&
}\r\n\r\n
\r\n
\r\n );\r\n })\r\n }\r\n\r\n
\r\n\r\n {/* share buttons */}\r\n \r\n\r\n \r\n {t('game.cookieLine1')}
\r\n {t('game.cookieLine2')}
\r\n {t('game.cookieLine3')}
\r\n {t('game.fontLine')}
\r\n
\r\n
\r\n );\r\n\r\n }\r\n}\r\n\r\nexport default withTranslation('common')(TitleScreen);","import React from 'react';\r\nimport { greatColors, controls } from '../objects/Enums';\r\nimport { withTranslation } from 'react-i18next';\r\nimport ShareAndPaypal from './ShareAndPaypal';\r\n \r\nexport class Results extends React.Component {\r\n\r\n componentDidMount(){\r\n }\r\n \r\n \r\n render() {\r\n\r\n const { t } = this.props;\r\n\r\n return (\r\n
\r\n \r\n
\r\n

{t('game.scoreboard')}

\r\n\r\n
\r\n {t('game.player')} \r\n {t('game.score')}\r\n
\r\n\r\n {this.props.players.map( pi=> {\r\n \r\n const style = {\r\n backgroundColor : greatColors[pi.color]\r\n ,backgroundImage: pi.type === 3 ?\"url(/trike.png)\":\"url(/quad.png)\"\r\n } \r\n\r\n return (\r\n
\r\n\r\n
\r\n\r\n \r\n { pi.controlledBy === controls.AI && <>AI{pi.index}}\r\n { pi.controlledBy !== controls.AI && <>P{pi.index}}\r\n { pi.team > 0 && T{pi.team}}\r\n \r\n\r\n {pi.score}\r\n\r\n
\r\n );\r\n })\r\n }\r\n\r\n
\r\n\r\n {/* share buttons */}\r\n \r\n\r\n
\r\n );\r\n\r\n }\r\n}\r\n\r\n\r\nexport default withTranslation('common')(Results);","import React from 'react';\r\nimport { controls } from '../objects/Enums';\r\nimport { withTranslation } from 'react-i18next';\r\n\r\nexport class Hud extends React.Component {\r\n\r\n render() {\r\n\r\n const { t } = this.props;\r\n\r\n const style = {\r\n backgroundColor : this.props.color \r\n }\r\n\r\n //miny\r\n const blockadeClassName = this.props.blockadeCooldown ? 'PowerUp animuj10s' : 'PowerUp'\r\n const blockadeStyle = {\r\n backgroundColor : this.props.blockadeCooldown ? this.props.color : \"black\"\r\n }\r\n\r\n //portál\r\n const portalClassName = this.props.portalCooldown ? 'PowerUp animuj15s' : 'PowerUp'\r\n const portalStyle = {\r\n backgroundColor : this.props.portalCooldown ? this.props.color : \"black\"\r\n }\r\n\r\n //beranidlo\r\n const ramClassName = this.props.ramCooldown ? 'PowerUp animuj30s' : 'PowerUp'\r\n const ramStyle = {\r\n backgroundColor : this.props.ramCooldown ? this.props.color : \"black\"\r\n }\r\n\r\n //overdrive\r\n const overDriveClassName = this.props.overDriveCooldown ? 'PowerUp animuj10sback' : 'PowerUp'\r\n const overDriveStyle = {\r\n backgroundColor : this.props.overDriveCooldown ? this.props.color : \"black\"\r\n }\r\n\r\n const isFirst = this.props.isFirst;\r\n\r\n return(\r\n
\r\n \r\n
\r\n
\r\n { isFirst &&
}\r\n { !isFirst &&
P{this.props.index}
}\r\n
\r\n\r\n { this.props.controlledBy !== controls.AI && \r\n <>\r\n \"powerup\r\n \"powerup\r\n \"powerup\r\n
\r\n \"powerup\r\n {this.props.energy}\r\n
\r\n \r\n }\r\n
\r\n {this.props.controlledBy !== controls.AI && <>{t('game.score')}:} {this.props.score}\r\n
\r\n { this.props.portalDial > 0 && }\r\n { this.props.portalDial > 1 && }\r\n { this.props.portalDial > 2 && }\r\n { this.props.portalDial > 3 && }\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withTranslation('common')(Hud);","import React from 'react';\r\nimport { gamePhaseEnum } from '../objects/Enums';\r\nimport { withTranslation } from 'react-i18next';\r\n\r\nexport class Countdown extends React.Component {\r\n\r\n render() {\r\n\r\n const { t } = this.props;\r\n\r\n const phase = this.props.phase; \r\n\r\n return(\r\n
\r\n {this.props.gameCountdownMin.padStart(2, '0')}:{this.props.gameCountdownSec.padStart(2, '0')}\r\n {phase === gamePhaseEnum.PAUSE && <>
{t('game.pause')}}\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withTranslation('common')(Countdown);","import { specialKeys } from \"./Enums\"\r\n\r\n\r\n//reprezentace klávesy\r\nfunction keyName(event) {\r\n return specialKeys[event.which] || String.fromCharCode(event.which).toLowerCase();\r\n};\r\n\r\nfunction rgbToHex(rgb) {\r\n var hex = Number(rgb).toString(16);\r\n if (hex.length < 2) {\r\n hex = \"0\" + hex;\r\n }\r\n return hex;\r\n};\r\n\r\nfunction fullColorHex(r, g, b) {\r\n var red = this.rgbToHex(r);\r\n var green = this.rgbToHex(g);\r\n var blue = this.rgbToHex(b);\r\n return red + green + blue;\r\n};\r\n\r\n/**\r\n * tohle umí vymazat kruh skrz nastavení kreslení\r\n */\r\nfunction clearCircle(context, x, y, radius){\r\n\r\n context.globalCompositeOperation = 'destination-out';\r\n context.beginPath();\r\n context.arc(x, y, radius, 0, Math.PI*2, true);\r\n context.fill();\r\n context.globalCompositeOperation = 'source-over';\r\n};\r\n\r\n/**\r\n * generátor guid kódů pro hráče\r\n */\r\nfunction createGUID() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\r\n var r = Math.random() * 16 | 0, v = c === 'x' ? r : ((r & 0x3) | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n\r\n\r\nexport {keyName, rgbToHex, fullColorHex, clearCircle, createGUID};\r\n","import {} from './Enums';\r\n\r\n/**\r\n * jedno konkrétní mapování, pamatuje si typ a index mapovaného talčítka\r\n * pokud jde o osu, udává, jestli lde o positive - +0 až 1 nebo negative 0 až -1\r\n */\r\nexport default class Mapping {\r\n\r\n constructor(type, index, isPositiveAxis){\r\n\r\n this.type = type;\r\n this.index = index;\r\n this.isPositiveAxis = isPositiveAxis;\r\n }\r\n}","import { controls, playerPhaseEnum, greatColors, orientation, gateColor, explosionType, menuControlItems, gamePhaseEnum, mappingItems, mappingType, connectionType } from './Enums';\r\nimport { rgbToHex, clearCircle, createGUID } from './Support'\r\nimport Mapping from './Mapping';\r\n\r\n\r\n\r\nexport default class Player {\r\n\r\n constructor(controlledBy, controllerId, colorId, game, isDemo){\r\n\r\n this.game = game;\r\n\r\n //unikátní index hráče, nastaví se před výpisem výsledků a seřazením\r\n this.uniqueIndex = -1;\r\n this.guid = createGUID();\r\n\r\n let bottomHudsHeight = this.game.getBottomHudsHeight();\r\n\r\n let resetWidth = game.canvas.width - 200;\r\n let resetHeight = game.canvas.height - bottomHudsHeight - 200;\r\n \r\n this.x = this.oldx = this.lastCheckX = Math.floor(100 + Math.random() * resetWidth);\r\n this.y = this.oldy = this.lastCheckY = Math.floor(100 + Math.random() * resetHeight);\r\n \r\n\r\n //poslední blízká stěna\r\n this.lastNeighborX = this.x;\r\n this.lastNeighborY = this.y;\r\n \r\n //200ms\r\n this.neighborDetectionInterval = 200;\r\n this.LastNeighborDetection = Math.floor(Math.random() * 200);\r\n this.neighborClose1 = false;\r\n this.neighborClose2 = false;\r\n \r\n //místo kam udeří blesk\r\n this.storm1x = this.x;\r\n this.storm1y = this.y;\r\n\r\n this.storm2x = this.x;\r\n this.storm2y = this.y;\r\n\r\n\r\n //čas do efektíku výboje\r\n this.toStorm = 5000 + Math.floor(Math.random() * 2000);\r\n this.StormPositionSet = false;\r\n\r\n\r\n this.color = colorId;\r\n \r\n //3 cyber-trike, 4 cyber-truck, \r\n this.type = Math.floor(Math.random() * 2) + 2;\r\n \r\n //základní rychlost všech\r\n this.baseSpeed = 3;\r\n //zrychlení nebo zpomalení\r\n this.bonusSpeed = 0;\r\n this.maxBonusSpeed = 1.5;\r\n this.breaking = false;\r\n \r\n //skóre\r\n this.score = 0;\r\n this.isFirst = false;\r\n\r\n //tým 0 - bez týmu\r\n this.team = 0;\r\n\r\n this.deaths = 0;\r\n\r\n //pokud takto označíme hráče, tak jej hra odstraní ze hry\r\n this.markedForRemove = false;\r\n\r\n //0- nahoru, 1-doprava, 2-dolu, 3-doleva\r\n this.smer = Math.floor(Math.random() * 4);\r\n this.cycleWithoutNewSmer = false;\r\n\r\n //vzdálenost po kerou jedu rovně\r\n this.strightLenght = 0;\r\n //doba po kterou jedu rovně\r\n this.strightTime =0;\r\n this.maxLine = 0;\r\n \r\n //jak je hráč ovládaný\r\n this.controlledBy = controlledBy;\r\n //je to demo AI, bez interface do menu předtím, než hrají hráči\r\n this.isDemo = isDemo;\r\n\r\n this.anyAction = false;\r\n\r\n //identifikátor ovladače\r\n this.controllerId = controllerId;\r\n //controller je mapovaný (pro nestandardní kontrolery)\r\n this.isMapped = true;\r\n this.mappingAutoReload = true;\r\n //je nastavené vlastní mapování\r\n this.isSetCustomMapping = false;\r\n this.mappingCurrent = mappingItems.indexOf('up');\r\n this.mappingArray = []; //pole s mapováním\r\n this.lastPressedKeyId = null;\r\n this.lastPressedAxisId = null;\r\n\r\n //3s do dalšího kroku mapování\r\n this.mappingStepTimeout = 2000;\r\n this.mappingStepTimeoutDefault = 2000;\r\n\r\n\r\n this.specialFontClass = null;\r\n\r\n //texty k nápovědě ovládání\r\n this.controlTextMove = \"?\";\r\n this.controlTextMoveAlt = \"?\";\r\n this.controlTextPortal = \"?\";\r\n this.controlTextRam = \"?\";\r\n this.controlTextMines = \"?\";\r\n this.controlTextPauseMenu = \"?\";\r\n this.controlTextDial = \"?\";\r\n \r\n\r\n\r\n //AI startuje ve stavu READY, a pokud je hra již rozjetá, pak i běžný hráč. Jinak je ve stavu INMENU\r\n this.playerPhase = this.controlledBy === controls.AI ? \r\n playerPhaseEnum.READY : \r\n game.state.gamePhase !== gamePhaseEnum.GAME ?\r\n playerPhaseEnum.INMENU : playerPhaseEnum.READY;\r\n\r\n this.playerPhasePrevious = null;\r\n\r\n //pokud jsem v menu na začátku vybírám tracera ['tracer','color','ready','time']\r\n this.inMenuCurrent = menuControlItems.indexOf('controls');\r\n //ale někdy je potřeba to změnit\r\n this.setInMenuCurrent(controlledBy, controllerId);\r\n \r\n //update textu dle ovladače (musí být až za setInMenuCurrent)\r\n this.setControlTexts(controlledBy, controllerId)\r\n \r\n\r\n\r\n\r\n \r\n this.explosion = false;\r\n this.exRadius = 50;\r\n this.clearBehindPlayer = false;\r\n \r\n\r\n \r\n this.AIactionTimeout = Math.floor(Math.random() * 2000);\r\n \r\n //brány\r\n this.gateDuration = 0;\r\n this.gateDurationDefault = 400;\r\n \r\n //čas na udělání brány\r\n this.gateCooldownTime = 0;\r\n this.gateCooldownTimeDefault = 5000;\r\n this.gateCooldown = false;\r\n \r\n //automatické brány\r\n this.autoGateCooldownTime = 4000;\r\n this.autoGateCooldownTimeDefault = 4000;\r\n \r\n //portály\r\n //tato brana bude portál\r\n this.currentGateIsPortal = false;\r\n\r\n this.portalCooldownTime = 0;\r\n this.portalCooldownTimeDefault = 15000;\r\n this.portalCooldown = false;\r\n this.portalBeginX = null;\r\n this.portalBeginY = null;\r\n\r\n //prodleva mezi přesunem portálem\r\n this.transferDelay = 0;\r\n this.transferDelayDefault = 1000;\r\n //pokud jsou nastaveny a odpočet je na 0, přesouvám se\r\n this.transferX = null;\r\n this.transferY = null;\r\n\r\n\r\n //MINY\r\n this.blockadeDuration = 0;\r\n this.blockadeDurationDefault = 500;\r\n this.blockadeCooldownTime = 0;\r\n this.blockadeCooldownTimeDefault = 10000;\r\n this.blockadeCooldown = false;\r\n\r\n this.blockadeSpawnCurrentStep = 0;\r\n \r\n\r\n //KLADIVO\r\n this.ramDuration = 0;\r\n this.ramDurationDefault = 2000;\r\n \r\n this.ramCooldownTime = 0;\r\n this.ramCooldownTimeDefault = 30000;\r\n this.ramCooldown = false;\r\n\r\n //DIAL\r\n this.lastDial = 0;\r\n this.dialResetAfter =1000;\r\n this.portalDial = 0;\r\n\r\n //OVERDRIVE\r\n this.energy = 3;\r\n this.overDriveDuration = 0;\r\n this.overDriveDurationDefault = 10000;\r\n this.overDriveCooldown = false;\r\n\r\n \r\n //pauza\r\n this.lastPause = 0;\r\n this.tutorialBefore =500;\r\n\r\n //čas do restartu\r\n this.restartTimeout = this.isDemo ? 0 : 5000; \r\n this.restartTimeoutDefault = 5000;\r\n\r\n //čas pro povel ovládání v menu\r\n this.menuActionTimeout = 200;\r\n this.menuActionTimeoutDefault = 200;\r\n \r\n \r\n //aktuální ovládací povely\r\n this.actual = { left: false, right: false, up: false, down: false, gate: false, blockade: false, ram: false, dial: false, pause: false };\r\n this.prev = { left: false, right: false, up: false, down: false, dial: false, pause: false };\r\n this.prevPriorityChecksum = 0;\r\n \r\n //pole s posledními prioritami\r\n this.priorityArray = [];\r\n\r\n this.soundReadyPlayed = false;\r\n this.soundReadyTimeout = 300;\r\n this.soundReadyTimeoutDefault = 300;\r\n this.soundFirstPlayed = false;\r\n }\r\n\r\n\r\n /**\r\n * nastaví první bod v menu pro jednotlivé typy hráčů a ovládání\r\n * @param {*} controlledBy \r\n * @param {*} controllerId \r\n */\r\n setInMenuCurrent(controlledBy, controllerId){\r\n\r\n //AI je ready, hráčí vybírají tracer\r\n let menuPosition = controlledBy === controls.AI ? menuControlItems.indexOf('ready') : menuControlItems.indexOf('controls');\r\n\r\n if(controlledBy === controls.GAMEPAD \r\n && this.game.gamepads!=null \r\n && this.game.gamepads[controllerId].id.indexOf('XInput STANDARD GAMEPAD') === -1 \r\n && this.game.gamepads[controllerId].mapping !== 'standard'\r\n ){\r\n //donutím hráče nakonfigurovat ovládání\r\n menuPosition = menuControlItems.indexOf('controls');\r\n //není nastavené ovládání\r\n this.isMapped = false;\r\n }\r\n\r\n //nastavíme hodnotu\r\n this.inMenuCurrent = menuPosition;\r\n //console.log(menuControlItems[this.inMenuCurrent]);\r\n }\r\n\r\n\r\n /**\r\n * korektní nastavení popisu ovládání\r\n * @param {*} controlledBy \r\n * @param {*} controllerId \r\n */\r\n setControlTexts(controlledBy, controllerId){\r\n \r\n //sipky\r\n if(controlledBy === controls.KEYBOARD && controllerId === 0 ){\r\n this.controlTextMove = \"↑↓←→\";\r\n this.controlTextMoveAlt = \"\";\r\n this.controlTextPortal = \"del\";\r\n this.controlTextRam = \"ins\";\r\n this.controlTextMines = \"home\";\r\n this.controlTextPauseMenu = \"esc\";\r\n this.controlTextDial = \"end\";\r\n }\r\n\r\n //wsad\r\n if(controlledBy === controls.KEYBOARD && controllerId === 1 ){\r\n this.controlTextMove = \"wsad\";\r\n this.controlTextMoveAlt = \"\";\r\n this.controlTextPortal = \"z,y\";\r\n this.controlTextRam = \"q\";\r\n this.controlTextMines = \"e\";\r\n this.controlTextPauseMenu = \"esc\";\r\n this.controlTextDial = \"x\";\r\n }\r\n\r\n //8546\r\n if(controlledBy === controls.KEYBOARD && controllerId === 2 ){\r\n this.controlTextMove = \"8546\";\r\n this.controlTextMoveAlt = \"\";\r\n this.controlTextPortal = \"1\";\r\n this.controlTextRam = \"7\";\r\n this.controlTextMines = \"9\";\r\n this.controlTextPauseMenu = \"esc\";\r\n this.controlTextDial = \"0\";\r\n }\r\n\r\n //ikjl\r\n if(controlledBy === controls.KEYBOARD && controllerId === 3 ){\r\n this.controlTextMove = \"ikjl\";\r\n this.controlTextMoveAlt = \"\";\r\n this.controlTextPortal = \"n\";\r\n this.controlTextRam = \"u\";\r\n this.controlTextMines = \"o\";\r\n this.controlTextPauseMenu = \"esc\";\r\n this.controlTextDial = \"m\";\r\n }\r\n\r\n //gamepad xbox\r\n if(controlledBy === controls.GAMEPAD && this.game.gamepads!=null){\r\n \r\n if(this.game.gamepads[controllerId].id.indexOf('XInput STANDARD GAMEPAD') !== -1)\r\n {\r\n this.controlTextMove = \"D\";\r\n this.controlTextMoveAlt = \"L\";\r\n this.controlTextPortal = \"A\";\r\n this.controlTextRam = \"Y\";\r\n this.controlTextMines = \"B\";\r\n this.controlTextPauseMenu = \"V\";\r\n this.controlTextDial = \"X\";\r\n\r\n //speciální font\r\n this.specialFontClass = 'xbox';\r\n }\r\n else if (this.game.gamepads[controllerId].mapping === 'standard')\r\n {\r\n this.controlTextMove = \"↑↓←→\";\r\n this.controlTextMoveAlt = \"\";\r\n this.controlTextPortal = \"1\";\r\n this.controlTextRam = \"4\";\r\n this.controlTextMines = \"2\";\r\n this.controlTextPauseMenu = \"start\";\r\n this.controlTextDial = \"3\";\r\n }\r\n else if (this.isMapped === true && this.isSetCustomMapping === true)\r\n {\r\n //namapovaný nestandardní gamepad\r\n //this.controlTextMove = \"↑↓←→\";\r\n this.controlTextMove = (this.mappingArray[mappingItems.indexOf('up')].type === mappingType.BUTTON ? \"↑b\" : \"↑a\") + this.mappingArray[mappingItems.indexOf('up')].index + ' ';\r\n this.controlTextMove += (this.mappingArray[mappingItems.indexOf('down')].type === mappingType.BUTTON ? \"↓b\" : \"↓a\") + this.mappingArray[mappingItems.indexOf('down')].index + ' ';\r\n this.controlTextMove += (this.mappingArray[mappingItems.indexOf('left')].type === mappingType.BUTTON ? \"←b\" : \"←a\") + this.mappingArray[mappingItems.indexOf('left')].index + ' ';\r\n this.controlTextMove += (this.mappingArray[mappingItems.indexOf('right')].type === mappingType.BUTTON ? \"→b\" : \"→a\") + this.mappingArray[mappingItems.indexOf('right')].index;\r\n \r\n this.controlTextMoveAlt = \"\";\r\n this.controlTextPortal = (this.mappingArray[mappingItems.indexOf('portal')].type === mappingType.BUTTON ? \"b\" : \"a\") + this.mappingArray[mappingItems.indexOf('portal')].index;\r\n this.controlTextRam = (this.mappingArray[mappingItems.indexOf('hammer')].type === mappingType.BUTTON ? \"b\" : \"a\") + this.mappingArray[mappingItems.indexOf('hammer')].index;\r\n this.controlTextMines = (this.mappingArray[mappingItems.indexOf('mines')].type === mappingType.BUTTON ? \"b\" : \"a\") + this.mappingArray[mappingItems.indexOf('mines')].index;\r\n this.controlTextPauseMenu = (this.mappingArray[mappingItems.indexOf('pause')].type === mappingType.BUTTON ? \"b\" : \"a\") + this.mappingArray[mappingItems.indexOf('pause')].index;\r\n this.controlTextDial = (this.mappingArray[mappingItems.indexOf('dial')].type === mappingType.BUTTON ? \"b\" : \"a\") + this.mappingArray[mappingItems.indexOf('dial')].index;\r\n\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * nastaví unikátní index hráče v poli před sestavením výsledkové listiny\r\n * @param {*} uniqueIndex - unikátní index dle pořadí v poli výsledků\r\n */\r\n SetUniqueIndex(uniqueIndex){\r\n\r\n this.uniqueIndex = uniqueIndex;\r\n \r\n }\r\n\r\n respawn () {\r\n\r\n //vyresetuje hodnoty a znovu umístí hráče, zatím jej neoživuje\r\n\r\n this.explosion = false;\r\n\r\n let bottomHudsHeight = this.game.getBottomHudsHeight();\r\n\r\n let resetWidth = this.game.canvas.width - 200;\r\n let resetHeight = this.game.canvas.height - bottomHudsHeight - 200;\r\n\r\n let colision = true;\r\n let cycles = 0;\r\n\r\n let tmpx = this.x;\r\n let tmpy = this.y;\r\n\r\n\r\n while(colision === true)\r\n {\r\n cycles++;\r\n\r\n this.x = this.oldx = this.lastCheckX = this.storm1x = this.storm2x = Math.floor(100 + Math.random() * resetWidth);\r\n this.y = this.oldy = this.lastCheckY = this.storm1y = this.storm2y = Math.floor(100 + Math.random() * resetHeight);\r\n\r\n //zkontroluju na kolize\r\n if(cycles < 100)\r\n {\r\n colision = this.game.findSpecialZoneColision(this.x,this.y);\r\n }\r\n else\r\n {\r\n //zastavíme while, pokud to nejde, vrazíme jej do zóny\r\n colision = false;\r\n }\r\n }\r\n\r\n //smrtelný transfer\r\n if (this.deaths >0)\r\n {\r\n this.game.addConnection(tmpx,tmpy,this.x,this.y,this.color, connectionType.DEATH);\r\n }\r\n\r\n //vymazaání kolečka pod hráčem\r\n this.clearBehindPlayer = true;\r\n\r\n\r\n this.smer = Math.floor(Math.random() * 4);\r\n this.bonusSpeed = 0;\r\n\r\n //reset linky\r\n this.strightLenght = 0;\r\n this.strightTime = 0;\r\n this.maxLine = 0;\r\n\r\n //zresetuju ability\r\n this.ramCooldownTime = 0;\r\n this.blockadeCooldownTime = 0;\r\n this.ramCooldownTime = 0;\r\n\r\n //a updatuju state\r\n this.blockadeCooldown = false;\r\n this.gateCooldown = false;\r\n this.ramCooldown = false;\r\n this.game.updatePlayersInfo();\r\n };\r\n\r\n\r\n\r\n moveToXY (x, y) {\r\n\r\n this.x = this.oldx = this.lastCheckX = this.storm1x = this.storm2x = x;\r\n this.y = this.oldy = this.lastCheckY = this.storm1y = this.storm2y = y;\r\n };\r\n\r\n changeColor () {\r\n //todo doplnit;\r\n\r\n\r\n };\r\n\r\n\r\n /*\r\n * Přesun hráče v menu na controls, např po návratu z tutrialu\r\n */\r\n toMenuItemControls(){\r\n \r\n if(this.controlledBy !== controls.AI){\r\n this.inMenuCurrent = menuControlItems.indexOf('controls');\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n /*\r\n * přepnu stav hráče na ready\r\n */\r\n playerRespawn(){\r\n\r\n //playerPhaseEnum.READY\r\n if(this.inMenuCurrent === menuControlItems.indexOf('ready')){\r\n\r\n //přesun v menu na controls\r\n this.toMenuItemControls();\r\n\r\n //reset počítadla score\r\n this.score = 0;\r\n this.deaths = 0;\r\n this.isFirst = false;\r\n this.energy = 3;\r\n\r\n //respavnuju hráče\r\n this.playerPhase = playerPhaseEnum.DEATH;\r\n }\r\n };\r\n\r\n\r\n /**\r\n * přepnu stav hráče do menu\r\n */\r\n playerToMenuPhase(){\r\n\r\n //vracím hráče do menu\r\n this.playerPhasePrevious = this.playerPhase;\r\n this.playerPhase = playerPhaseEnum.INMENU;\r\n }\r\n\r\n /**\r\n * vybuchnu hráče po dohrání hry\r\n */\r\n playerExplode(){\r\n\r\n //aktivuju výbuch\r\n this.explosion = true;\r\n }\r\n\r\n\r\n /**\r\n * přepnu stav hráče při návratu z pauzy na původní stav\r\n */\r\n playerToPreviousPhase(){\r\n\r\n //připravím hráče na opětovnou volbu v menu\r\n if(this.inMenuCurrent === menuControlItems.indexOf('ready')){\r\n\r\n //přesun v menu na controls\r\n this.toMenuItemControls();\r\n }\r\n\r\n if(this.playerPhasePrevious==null)\r\n {\r\n //pro nově připojené hráče\r\n this.playerPhasePrevious = playerPhaseEnum.GAME;\r\n }\r\n\r\n //vracím předchozí fázi před skokem do menu\r\n this.playerPhase = this.playerPhasePrevious;\r\n }\r\n\r\n\r\n /**\r\n * zastavitelné procesy\r\n */\r\n timeoutPausableProcess () {\r\n \r\n\r\n //počítání doby rovné jízdy\r\n this.strightTime += this.game.delay;\r\n //poslední volba adresy\r\n this.lastDial += this.game.delay;\r\n\r\n\r\n //odpočet pauzy brány\r\n if (this.gateCooldownTime > 0){\r\n this.gateCooldownTime -= this.game.delay;\r\n\r\n if(this.gateCooldown === false){\r\n this.gateCooldown = true;\r\n this.game.updatePlayersInfo();\r\n }\r\n }\r\n else{\r\n if(this.gateCooldown === true){\r\n this.gateCooldown = false;\r\n this.game.updatePlayersInfo();\r\n }\r\n }\r\n\r\n\r\n //odpočet pauzy portálu\r\n if (this.portalCooldownTime > 0){\r\n this.portalCooldownTime -= this.game.delay;\r\n\r\n if(this.portalCooldown === false){\r\n this.portalCooldown = true;\r\n this.game.updatePlayersInfo();\r\n }\r\n }\r\n else{\r\n if(this.portalCooldown === true){\r\n this.portalCooldown = false;\r\n this.game.updatePlayersInfo();\r\n }\r\n }\r\n\r\n\r\n //odpočet do přesunu\r\n if (this.transferDelay > 0) {\r\n this.transferDelay -= this.game.delay;\r\n }\r\n\r\n\r\n //odpočet pauzy blokády\r\n if (this.blockadeCooldownTime > 0){\r\n this.blockadeCooldownTime -= this.game.delay;\r\n\r\n if(this.blockadeCooldown === false){\r\n this.blockadeCooldown = true;\r\n this.game.updatePlayersInfo();\r\n }\r\n }\r\n else\r\n {\r\n if(this.blockadeCooldown === true){\r\n this.blockadeCooldown = false;\r\n this.game.updatePlayersInfo();\r\n }\r\n }\r\n\r\n\r\n //odpočet trvání blokády\r\n if (this.blockadeDuration > 0){\r\n this.blockadeDuration -= this.game.delay;\r\n }\r\n else {\r\n //reset počítadl uvolněných teček\r\n this.blockadeSpawnCurrentStep = 0;\r\n }\r\n\r\n\r\n //odpočet pauzy kladiva\r\n if (this.ramCooldownTime > 0) {\r\n this.ramCooldownTime -= this.game.delay;\r\n\r\n if(this.ramCooldown === false){\r\n this.ramCooldown = true;\r\n this.game.updatePlayersInfo();\r\n }\r\n }\r\n else{\r\n if(this.ramCooldown === true){\r\n this.ramCooldown = false;\r\n this.game.updatePlayersInfo();\r\n }\r\n }\r\n \r\n //odpočet pro zobrazení použití overdrajvu\r\n if (this.overDriveDuration > 0) {\r\n this.overDriveDuration -= this.game.delay;\r\n }\r\n else{\r\n if(this.overDriveCooldown === true){\r\n this.overDriveCooldown = false;\r\n this.game.updatePlayersInfo();\r\n }\r\n }\r\n\r\n //odpočet trvání kladiva\r\n if (this.ramDuration > 0) {\r\n this.ramDuration -= this.game.delay;\r\n }\r\n\r\n //odpočet detekce sousedů\r\n if(this.LastNeighborDetection > 0)\r\n {\r\n this.LastNeighborDetection -= this.game.delay;\r\n }\r\n\r\n\r\n if (this.playerPhase === playerPhaseEnum.DEATH) {\r\n\r\n //umístím se jinde a přepnu se do přípravného stavu\r\n this.respawn();\r\n\r\n //spustím odpočet do oživení\r\n this.restartTimeout = this.restartTimeoutDefault;\r\n this.playerPhase = playerPhaseEnum.READY;\r\n }\r\n\r\n\r\n if (this.playerPhase === playerPhaseEnum.READY) {\r\n\r\n //cooldown restartu hrace\r\n if (this.restartTimeout > 0) {\r\n this.restartTimeout -= this.game.delay;\r\n }\r\n else {\r\n\r\n //znova rozjedu hru\r\n this.playerPhase = playerPhaseEnum.GAME;\r\n\r\n }\r\n }\r\n\r\n\r\n //odpočet tvorby brány (a případné založení portálu)\r\n if (this.gateDuration > 0) {\r\n\r\n this.gateDuration -= this.game.delay;\r\n\r\n if(this.gateDuration <= 0 && this.currentGateIsPortal && this.strightTime >= this.gateDurationDefault)\r\n {\r\n //pokud jsem jel celou dobu vývoje brány rovně, mohu udělat portál.\r\n\r\n //vyblokuju výrobu portálu pro hráče po dobu nabíjení\r\n this.portalCooldownTime = this.portalCooldownTimeDefault;\r\n //posunu auto bránu o další 4s\r\n this.autoGateCooldownTime = this.autoGateCooldownTimeDefault;\r\n \r\n //přidáme nový portál\r\n this.game.addPortal(this.portalBeginX,this.portalBeginY, this.x, this.y, (this.smer === 0 || this.smer === 2) ? orientation.VERTICAL: orientation.HORIZONTAL, false, 30000, this.portalDial);\r\n this.game.playSound(2,1);\r\n\r\n this.currentGateIsPortal = false;\r\n }\r\n\r\n }\r\n\r\n //odpočet automatické brány, kterou dělají všichni\r\n if (this.autoGateCooldownTime > 0){\r\n this.autoGateCooldownTime -= this.game.delay;\r\n }\r\n\r\n\r\n //portál\r\n if (this.actual.gate && this.portalCooldownTime <= 0) {\r\n\r\n if(this.gateDuration <=0)\r\n {\r\n //uložím si začátek brány\r\n this.portalBeginX = this.x;\r\n this.portalBeginY = this.y;\r\n //začnu tvořit běžnou bránu\r\n this.gateDuration = this.gateDurationDefault;\r\n }\r\n\r\n //běžná brána se stane portálem\r\n this.currentGateIsPortal = true;\r\n }\r\n\r\n\r\n //automatická brána\r\n if (this.autoGateCooldownTime <= 0) {\r\n //sposunu auto bránu o další 4s\r\n this.autoGateCooldownTime = this.autoGateCooldownTimeDefault;\r\n\r\n if(this.gateDuration <=0)\r\n {\r\n //uložím si začátek brány\r\n this.portalBeginX = this.x;\r\n this.portalBeginY = this.y;\r\n //začnu tvořit běžnou bránu\r\n this.gateDuration = this.gateDurationDefault;\r\n } \r\n }\r\n\r\n\r\n //blokáda\r\n if (this.actual.blockade && this.blockadeCooldownTime <= 0) {\r\n this.blockadeDuration = this.blockadeDurationDefault;\r\n this.blockadeCooldownTime = this.blockadeCooldownTimeDefault;\r\n this.game.playSound(6,1);\r\n }\r\n\r\n\r\n //beranidlo\r\n if (this.actual.ram && this.ramCooldownTime <=0) {\r\n this.ramDuration = this.ramDurationDefault;\r\n this.ramCooldownTime = this.ramCooldownTimeDefault;\r\n this.game.playSound(7,1);\r\n }\r\n \r\n\r\n //odložíme předchozí hodnotu\r\n let prevPortalDial = this.portalDial;\r\n\r\n //dial určení adresy, kazda nabezna hrana\r\n if(!this.prev.dial && this.actual.dial ){\r\n\r\n if(this.lastDial < this.dialResetAfter)\r\n {\r\n //inkrement adresy\r\n this.portalDial +=1;\r\n if(this.portalDial >4){\r\n this.portalDial = 1;\r\n }\r\n }\r\n else\r\n {\r\n //reset adresy\r\n this.portalDial = 1;\r\n }\r\n\r\n //reset času\r\n this.lastDial = 0;\r\n //console.log('dial' + this.portalDial);\r\n }\r\n\r\n //sestupna hrana bude resetovat na 0, jen když držím déle \r\n if(this.prev.dial && !this.actual.dial ){\r\n if(this.lastDial > this.dialResetAfter){\r\n\r\n //reset adresy do 0\r\n this.portalDial = 0;\r\n\r\n //reset času\r\n this.lastDial = 0;\r\n //console.log('dial' + this.portalDial);\r\n }\r\n }\r\n\r\n if(this.portalDial !== prevPortalDial)\r\n {\r\n //změna, update\r\n this.game.updatePlayersInfo();\r\n }\r\n\r\n\r\n //efekt blesků\r\n this.toStorm -= this.game.delay;\r\n\r\n //přechod okolo 1000ms\r\n if(this.toStorm<= 700 && this.StormPositionSet===false){\r\n \r\n //this.storm1x = this.storm2x = this.x;\r\n //this.storm1y = this.storm2y = this.y;\r\n\r\n this.StormPositionSet = true;\r\n }\r\n \r\n if(this.toStorm<=0){\r\n this.toStorm = Math.floor(Math.random() * 1000);\r\n this.StormPositionSet = false;\r\n }\r\n\r\n this.prev.dial = this.actual.dial;\r\n\r\n }\r\n\r\n\r\n /**\r\n * nezastavitelné procesy\r\n */\r\n timeoutsProcess () {\r\n\r\n //poslední pauza\r\n this.lastPause += this.game.delay;\r\n\r\n //odpočet pro pokyny v menu\r\n if(this.playerPhase === playerPhaseEnum.INMENU && this.menuActionTimeout >0){\r\n this.menuActionTimeout -= this.game.delay;\r\n }\r\n\r\n //zvuk ready po 500ms\r\n if(this.playerPhase === playerPhaseEnum.INMENU && this.controlledBy !== controls.AI)\r\n {\r\n \r\n if(this.inMenuCurrent === menuControlItems.indexOf('ready'))\r\n {\r\n //zvuk jsme rdy\r\n if (!this.soundReadyPlayed)\r\n {\r\n if(this.soundReadyTimeout > 0)\r\n {\r\n this.soundReadyTimeout -= this.game.delay;\r\n }\r\n else\r\n {\r\n this.soundReadyPlayed = true;\r\n\r\n this.game.playSound(13,1);\r\n //console.log('snd');\r\n }\r\n }\r\n }\r\n else\r\n {\r\n this.soundReadyPlayed = false;\r\n this.soundReadyTimeout = this.soundReadyTimeoutDefault;\r\n }\r\n }\r\n\r\n\r\n //pauza, kazda nabezna hrana\r\n if(!this.prev.pause && this.actual.pause ){\r\n\r\n this.game.pauseGame();\r\n\r\n if(this.lastPause < this.tutorialBefore)\r\n {\r\n this.game.tutorial();\r\n }\r\n\r\n //reset času\r\n this.lastPause = 0;\r\n }\r\n\r\n //odložení předchozího stavu, pro sledování hrany\r\n this.prev.pause = this.actual.pause;\r\n };\r\n\r\n\r\n /**\r\n * určení nového směru pro hráče\r\n * řeší:\r\n * priority jízdy, tedy aby vždy vyšel nový směr jízdy jako poslední nový pokyn ovladače\r\n */\r\n playerNewWay(){\r\n \r\n let nsmer = null;\r\n \r\n //z univerzálního formátu ted vytahneme o co jde todo: dle priority\r\n let actArr = [this.actual.up, this.actual.down, this.actual.left, this.actual.right];\r\n let prevArr = [this.prev.up, this.prev.down, this.prev.left, this.prev.right];\r\n\r\n //březinův algorytmus pro prioritizaci pohybu\r\n\r\n //1.kontrola změny\r\n let checksum = actArr[0] * 8 + actArr[1] * 4 + actArr[2] * 2 + actArr[3] * 1;\r\n\r\n if (checksum === 0 || this.prevPriorityChecksum !== checksum) {\r\n\r\n //reset priorit a nové sesstavení pole\r\n this.priorityArray = [];\r\n\r\n if (checksum !== 0) {\r\n //2. test na 1ky\r\n for (let f = 0; f < actArr.length; f++) {\r\n if (prevArr[f] === true && actArr[f] === true) {\r\n //zapíšu přioritu\r\n this.priorityArray.push(f);\r\n }\r\n }\r\n\r\n //3. test na prioritní přechody 0->1\r\n for (let f = 0; f < actArr.length; f++) {\r\n if (prevArr[f] === false && actArr[f] === true) {\r\n //zapíšu přioritu\r\n this.priorityArray.push(f);\r\n }\r\n }\r\n }\r\n }\r\n\r\n //4. poslední priorita je nový směr\r\n let move = null;\r\n if (this.priorityArray.length > 0) {\r\n //console.log(this.priorityArray);\r\n\r\n //získáme pohyb s nejvyšší prioritou\r\n move = this.priorityArray[this.priorityArray.length - 1];\r\n }\r\n\r\n //uložení předchozího checksumu\r\n this.prevPriorityChecksum = checksum;\r\n\r\n if (move !== null) {\r\n\r\n //nahoru\r\n if (move === 0) {\r\n nsmer = 0;\r\n }\r\n //dolů\r\n if (move === 1) {\r\n nsmer = 2;\r\n }\r\n //doleva\r\n if (move === 2) {\r\n nsmer = 3;\r\n }\r\n //napravo\r\n if (move === 3) {\r\n nsmer = 1;\r\n }\r\n }\r\n\r\n\r\n //uložení předchozích hodnot pohybu pro příští stanovení priorit\r\n this.prev.left = this.actual.left;\r\n this.prev.right = this.actual.right;\r\n this.prev.up = this.actual.up;\r\n this.prev.down = this.actual.down;\r\n\r\n return nsmer;\r\n }\r\n\r\n\r\n /**\r\n * zprocesování ovládání hráčů\r\n */\r\n processControlls(gamepads){\r\n \r\n //nezmacknuto nic\r\n let notMappedPressAny = false;\r\n\r\n //ovládání gamepady\r\n if (this.controlledBy === controls.GAMEPAD) {\r\n\r\n //let gamepads = navigator.getGamepads();\r\n \r\n let gp = gamepads[this.controllerId];\r\n \r\n if (gp !== undefined && gp !== null && gp.connected === true) {\r\n\r\n //tento gamepad je právě používán\r\n gp.devIsUsed = true;\r\n\r\n //standardní gamepady\r\n if(gp.mapping !=null && gp.mapping === 'standard')\r\n {\r\n //Analogové OSY \r\n let gamepadX, gamepadY;\r\n if (gp.axes[0] !== 0)\r\n {\r\n gamepadX = gp.axes[0];\r\n }\r\n\r\n if (gp.axes[1] !== 0)\r\n {\r\n gamepadY = gp.axes[1];\r\n }\r\n\r\n //nahoře a dole\r\n let c= Math.sqrt(Math.pow(gamepadX,2)+Math.pow(gamepadY,2));\r\n if(c>1) c=1;\r\n\r\n let angle = Math.asin(gamepadY/c);\r\n let actionAngle = Math.PI /10; //18stupnu\r\n \r\n if (gamepadX > 0.3 && -actionAngle < angle && angle < actionAngle) //doprava\r\n {\r\n this.actual.right = true;\r\n }\r\n if (gamepadX < -0.3 && -actionAngle < angle && angle < actionAngle) //doleva\r\n {\r\n this.actual.left = true;\r\n }\r\n if (gamepadY > 0.3 && ((Math.PI/2) -actionAngle) < angle && angle < ((Math.PI/2) +actionAngle)) //dolů\r\n {\r\n this.actual.down = true;\r\n }\r\n if (gamepadY < -0.3 && (-(Math.PI/2) -actionAngle) < angle && angle < (-(Math.PI/2) +actionAngle)) //nahoru\r\n {\r\n this.actual.up = true;\r\n }\r\n\r\n //Tlačítka\r\n if (gp.buttons[12].pressed) {\r\n this.actual.up = true;\r\n }\r\n if (gp.buttons[13].pressed) {\r\n this.actual.down = true;\r\n }\r\n if (gp.buttons[14].pressed) {\r\n this.actual.left = true;\r\n }\r\n if (gp.buttons[15].pressed) {\r\n this.actual.right = true;\r\n }\r\n if (gp.buttons[0].pressed) {\r\n this.actual.gate = true;\r\n }\r\n if (gp.buttons[1].pressed) {\r\n this.actual.blockade = true;\r\n }\r\n if (gp.buttons[3].pressed) {\r\n this.actual.ram = true;\r\n }\r\n if (gp.buttons[2].pressed) {\r\n this.actual.dial = true;\r\n }\r\n if(gp.buttons[9].pressed){\r\n this.actual.pause = true;\r\n //this.game.pauseGame();\r\n }\r\n }\r\n else\r\n {\r\n //pro nestandardní gamepady\r\n\r\n //LOADING ULOŽENÉHO MAPPINGU\r\n if(this.isMapped === false && this.mappingAutoReload === true)\r\n {\r\n //pokusím se jej sehnat ze storage\r\n let mapping = this.game.loadMapping(gp.id);\r\n\r\n if(mapping!=null)\r\n {\r\n //nastavím uložený mapping\r\n this.mappingArray = mapping;\r\n\r\n //přenastavím\r\n this.isMapped = true;\r\n this.isSetCustomMapping = true;\r\n this.setControlTexts(this.controlledBy, this.controllerId);\r\n\r\n //updatuju state\r\n this.game.updatePlayersInfo();\r\n }\r\n }\r\n\r\n //1. MANUÁLNÍ MAPPING\r\n if(this.isMapped === false)\r\n {\r\n //zapauzuju hru, pokud není pauza (je potřeba nakonfigurovat ovládání hráče)\r\n if(this.game.pause === false){\r\n this.game.pauseGame();\r\n }\r\n \r\n //Analogové OSY \r\n let axesLength = gp.axes.length;\r\n if(axesLength > 4)\r\n {\r\n axesLength = 4;\r\n }\r\n for (let a = 0; a < axesLength; a++) {\r\n if(gp.axes[a] != null && (gp.axes[a] > 0.3 || gp.axes[a] < -0.3))\r\n {\r\n notMappedPressAny = true;\r\n\r\n if(a !== this.lastPressedAxisId){\r\n \r\n //reset posledě držené klávesy\r\n this.lastPressedAxisId = a;\r\n this.mappingStepTimeout = this.mappingStepTimeoutDefault;\r\n }\r\n else{\r\n \r\n //zmacknuto stejne tlacitko, odpočet\r\n this.mappingStepTimeout -= this.game.delay;\r\n\r\n if(this.mappingStepTimeout <= 0)\r\n {\r\n if(gp.axes[a] > 0.3)\r\n {\r\n //uložíme klávesu a přepneme se v pořadí na další\r\n this.mappingArray.push(new Mapping(mappingType.AXIS, a, true));\r\n }\r\n else\r\n {\r\n this.mappingArray.push(new Mapping(mappingType.AXIS, a, false));\r\n }\r\n this.mappingStepTimeout = this.mappingStepTimeoutDefault;\r\n this.mappingCurrent ++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n //buttony\r\n for (let c = 0; c < gp.buttons.length; c++) {\r\n if(gp.buttons[c] != null && gp.buttons[c].pressed)\r\n {\r\n notMappedPressAny = true;\r\n\r\n if(c !== this.lastPressedKeyId)\r\n {\r\n //reset posledě držené klávesy\r\n this.lastPressedKeyId = c;\r\n this.mappingStepTimeout = this.mappingStepTimeoutDefault;\r\n }\r\n else\r\n {\r\n //zmacknuto stejne tlacitko, odpočet\r\n this.mappingStepTimeout -= this.game.delay;\r\n\r\n if(this.mappingStepTimeout <= 0)\r\n {\r\n //uložíme klávesu a přepneme se v pořadí na další\r\n this.mappingArray.push(new Mapping(mappingType.BUTTON, c, null));\r\n this.mappingStepTimeout = this.mappingStepTimeoutDefault;\r\n this.mappingCurrent ++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(this.mappingCurrent > mappingItems.indexOf('pause'))\r\n {\r\n //mapování je dokončeno, přepínám do true\r\n\r\n this.isMapped = true;\r\n this.isSetCustomMapping = true;\r\n this.setControlTexts(this.controlledBy, this.controllerId);\r\n\r\n //uložím nové mapování, případně updatuju staré\r\n this.game.saveOrUpdateMapping(gp.id, this.mappingArray);\r\n\r\n //povolíme opět automatické načítání mappingu\r\n this.mappingAutoReload = true;\r\n }\r\n\r\n if(notMappedPressAny === false)\r\n {\r\n //resetuju\r\n this.lastPressedKeyId = null;\r\n\r\n if(this.mappingStepTimeout !== this.mappingStepTimeoutDefault){\r\n this.mappingStepTimeout = this.mappingStepTimeoutDefault;\r\n this.game.updatePlayersInfo();\r\n }\r\n }\r\n else\r\n {\r\n //updatuju state\r\n this.game.updatePlayersInfo();\r\n }\r\n\r\n }\r\n else\r\n {\r\n //už je namapovaný, provádím ovládání dle mappingu\r\n\r\n //Analogové OSY \r\n let gamepadX, gamepadY;\r\n \r\n //vlevo a vpravo\r\n if (this.mappingArray[2].type === mappingType.AXIS && gp.axes[this.mappingArray[2].index] !== 0)\r\n {\r\n //podpora inverzního ovládání\r\n if(this.mappingArray[2].isPositiveAxis){\r\n gamepadX = -gp.axes[this.mappingArray[2].index];\r\n }\r\n else{\r\n gamepadX = gp.axes[this.mappingArray[2].index];\r\n }\r\n }\r\n\r\n //nahoru a dolu\r\n if (this.mappingArray[0].type === mappingType.AXIS && gp.axes[this.mappingArray[0].index] !== 0)\r\n {\r\n //podpora inverzního ovládání\r\n if(this.mappingArray[0].isPositiveAxis){\r\n gamepadY = -gp.axes[this.mappingArray[0].index];\r\n }\r\n else{\r\n gamepadY = gp.axes[this.mappingArray[0].index];\r\n }\r\n }\r\n\r\n //nahoře a dole\r\n let c= Math.sqrt(Math.pow(gamepadX,2)+Math.pow(gamepadY,2));\r\n if(c>1) c=1;\r\n\r\n let angle = Math.asin(gamepadY/c);\r\n let actionAngle = Math.PI /10; //18stupnu\r\n \r\n if (gamepadX > 0.3 && -actionAngle < angle && angle < actionAngle) //doprava\r\n {\r\n this.actual.right = true;\r\n }\r\n if (gamepadX < -0.3 && -actionAngle < angle && angle < actionAngle) //doleva\r\n {\r\n this.actual.left = true;\r\n }\r\n if (gamepadY > 0.3 && ((Math.PI/2) -actionAngle) < angle && angle < ((Math.PI/2) +actionAngle)) //dolů\r\n {\r\n this.actual.down = true;\r\n }\r\n if (gamepadY < -0.3 && (-(Math.PI/2) -actionAngle) < angle && angle < (-(Math.PI/2) +actionAngle)) //nahoru\r\n {\r\n this.actual.up = true;\r\n }\r\n\r\n //Tlačítka [0-up, 1-down, 2-left, 3-right, 4-portal, 5-mines, 6-ram, 7-dial, 8-pause\r\n if (this.mappingArray[0].type === mappingType.BUTTON && gp.buttons[this.mappingArray[0].index].pressed) {\r\n this.actual.up = true;\r\n }\r\n if (this.mappingArray[1].type === mappingType.BUTTON && gp.buttons[this.mappingArray[1].index].pressed) {\r\n this.actual.down = true;\r\n }\r\n if (this.mappingArray[2].type === mappingType.BUTTON && gp.buttons[this.mappingArray[2].index].pressed) {\r\n this.actual.left = true;\r\n }\r\n if (this.mappingArray[3].type === mappingType.BUTTON && gp.buttons[this.mappingArray[3].index].pressed) {\r\n this.actual.right = true;\r\n }\r\n if (this.mappingArray[4].type === mappingType.BUTTON && gp.buttons[this.mappingArray[4].index].pressed) {\r\n this.actual.gate = true;\r\n }\r\n if (this.mappingArray[5].type === mappingType.BUTTON && gp.buttons[this.mappingArray[5].index].pressed) {\r\n this.actual.blockade = true;\r\n }\r\n if (this.mappingArray[6].type === mappingType.BUTTON && gp.buttons[this.mappingArray[6].index].pressed) {\r\n this.actual.ram = true;\r\n }\r\n if (this.mappingArray[7].type === mappingType.BUTTON && gp.buttons[this.mappingArray[7].index].pressed) {\r\n this.actual.dial = true;\r\n }\r\n if(this.mappingArray[8].type === mappingType.BUTTON && gp.buttons[this.mappingArray[8].index].pressed) {\r\n this.actual.pause = true;\r\n //this.game.pauseGame();\r\n }\r\n\r\n }\r\n }\r\n }\r\n }\r\n\r\n //ovládání klávesnice 0\r\n if (this.controlledBy === controls.KEYBOARD && this.controllerId === 0) {\r\n\r\n //nahoru\r\n if (this.game.keydown.up) {\r\n this.actual.up = true;\r\n }\r\n //dolů\r\n if (this.game.keydown.down) {\r\n this.actual.down = true;\r\n }\r\n //doleva\r\n if (this.game.keydown.left) {\r\n this.actual.left = true;\r\n }\r\n //napravo\r\n if (this.game.keydown.right) {\r\n this.actual.right = true;\r\n }\r\n //brána\r\n if (this.game.keydown.del) {\r\n this.actual.gate = true;\r\n }\r\n //blokáda\r\n if (this.game.keydown.home) {\r\n this.actual.blockade = true;\r\n }\r\n //beranidlo\r\n if (this.game.keydown.insert) {\r\n this.actual.ram = true;\r\n }\r\n //vytáčení\r\n if (this.game.keydown.end) {\r\n this.actual.dial = true;\r\n }\r\n }\r\n\r\n //ovládání klávesnice 1 wasd\r\n if (this.controlledBy === controls.KEYBOARD && this.controllerId === 1) {\r\n\r\n //nahoru\r\n if (this.game.keydown.w) {\r\n this.actual.up = true;\r\n }\r\n //dolů\r\n if (this.game.keydown.s) {\r\n this.actual.down = true;\r\n }\r\n //doleva\r\n if (this.game.keydown.a) {\r\n this.actual.left = true;\r\n }\r\n //napravo\r\n if (this.game.keydown.d) {\r\n this.actual.right = true;\r\n }\r\n //brána\r\n if (this.game.keydown.z || this.game.keydown.y) {\r\n this.actual.gate = true;\r\n }\r\n //blokáda\r\n if (this.game.keydown.e) {\r\n this.actual.blockade = true;\r\n }\r\n //beranidlo\r\n if (this.game.keydown.q) {\r\n this.actual.ram = true;\r\n }\r\n //vytáčení\r\n if (this.game.keydown.x) {\r\n this.actual.dial = true;\r\n }\r\n }\r\n\r\n //ovládání klávesnice 2 tfgh\r\n if (this.controlledBy === controls.KEYBOARD && this.controllerId === 2) {\r\n\r\n //nahoru\r\n if (this.game.keydown[8]) {\r\n this.actual.up = true;\r\n }\r\n //dolů\r\n if (this.game.keydown[5]) {\r\n this.actual.down = true;\r\n }\r\n //doleva\r\n if (this.game.keydown[4]) {\r\n this.actual.left = true;\r\n }\r\n //napravo\r\n if (this.game.keydown[6]) {\r\n this.actual.right = true;\r\n }\r\n //brána\r\n if (this.game.keydown[1]) {\r\n this.actual.gate = true;\r\n }\r\n //blokáda\r\n if (this.game.keydown[9]) {\r\n this.actual.blockade = true;\r\n }\r\n //beranidlo\r\n if (this.game.keydown[7]) {\r\n this.actual.ram = true;\r\n }\r\n //vytáčení\r\n if (this.game.keydown[0]) {\r\n this.actual.dial = true;\r\n }\r\n }\r\n\r\n //ovládání klávesnice 3 ijkl\r\n if (this.controlledBy === controls.KEYBOARD && this.controllerId === 3) {\r\n\r\n //nahoru\r\n if (this.game.keydown.i) {\r\n this.actual.up = true;\r\n }\r\n //dolů\r\n if (this.game.keydown.k) {\r\n this.actual.down = true;\r\n }\r\n //doleva\r\n if (this.game.keydown.j) {\r\n this.actual.left = true;\r\n }\r\n //napravo\r\n if (this.game.keydown.l) {\r\n this.actual.right = true;\r\n }\r\n //brána\r\n if (this.game.keydown.n) {\r\n this.actual.gate = true;\r\n }\r\n //blokáda\r\n if (this.game.keydown.o) {\r\n this.actual.blockade = true;\r\n }\r\n //beranidlo\r\n if (this.game.keydown.u) {\r\n this.actual.ram = true;\r\n }\r\n //vytáčení\r\n if (this.game.keydown.m) {\r\n this.actual.dial = true;\r\n }\r\n }\r\n\r\n //detekce zmáčknutí tlačítka uživatelem\r\n if(this.controlledBy !== controls.AI){\r\n\r\n this.anyAction = this.actual.up || this.actual.down || this.actual.left || this.actual.right || this.actual.gate || this.actual.blockade || this.actual.ram || this.actual.dial || notMappedPressAny;\r\n }\r\n\r\n return this.playerNewWay();\r\n\r\n \r\n }\r\n\r\n\r\n /**\r\n * určení nového směru pro AI\r\n */\r\n AInewWay () {\r\n\r\n //dokud se nezmění směr\r\n let nsmer = Math.floor(Math.random() * 4);\r\n if (nsmer !== this.smer && ((this.smer === 0 && nsmer !== 2) || (this.smer === 1 && nsmer !== 3) || (this.smer === 2 && nsmer !== 0) || (this.smer === 3 && nsmer !== 1))) {\r\n\r\n //nový směr\r\n this.smer = nsmer;\r\n //mením směr, nemůže jít o portál\r\n this.currentGateIsPortal = false;\r\n\r\n this.strightLenght = 0;\r\n this.strightTime = 0;\r\n this.maxLine = 0;\r\n }\r\n };\r\n\r\n\r\n /**\r\n * zprocesování ovládání AI\r\n */\r\n processAIControlls(){\r\n \r\n //ovládání AI\r\n if (this.controlledBy === controls.AI) {\r\n\r\n //náhodné změny\r\n if (this.AIactionTimeout <= 0) {\r\n\r\n this.AInewWay();\r\n this.AIactionTimeout = Math.floor(Math.random() * 2000);\r\n }\r\n else {\r\n //odpočet\r\n this.AIactionTimeout -= this.game.delay;\r\n }\r\n\r\n //hledání překážek ve směru jízdy\r\n\r\n let aiDetector = null;\r\n\r\n let wayOK = false;\r\n let pokusu = 0;\r\n\r\n while (wayOK === false && pokusu < 5) {\r\n\r\n\r\n if (this.smer === 0) {\r\n aiDetector = this.game.ctx.getImageData(Math.floor(this.x), Math.floor(this.y) - 10, 1, 9).data;\r\n }\r\n if (this.smer === 1) {\r\n aiDetector = this.game.ctx.getImageData(Math.floor(this.x) + 1, Math.floor(this.y), 9, 1).data;\r\n }\r\n if (this.smer === 2) {\r\n aiDetector = this.game.ctx.getImageData(Math.floor(this.x), Math.floor(this.y) + 1, 1, 9).data;\r\n }\r\n if (this.smer === 3) {\r\n aiDetector = this.game.ctx.getImageData(Math.floor(this.x) - 10, Math.floor(this.y), 9, 1).data;\r\n }\r\n\r\n let detect = false;\r\n if (aiDetector !== null) {\r\n //kontroluju detektor 1\r\n for (let i = 3; i < aiDetector.length; i = i + 4) {\r\n if (aiDetector[i] > 150) {\r\n detect = true;\r\n //console.log('detekce kolize' + pokusu);\r\n //console.log(aiDetector);\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (detect === false) {\r\n wayOK = true;\r\n }\r\n else {\r\n this.AInewWay();\r\n }\r\n\r\n pokusu++;\r\n\r\n if (pokusu === 5 && wayOK === false)\r\n {\r\n //zkusím použít ram na zácranu AI\r\n\r\n if (this.ramCooldownTime <= 0) {\r\n\r\n this.ramDuration = this.ramDurationDefault;\r\n this.ramCooldownTime = this.ramCooldownTimeDefault;\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n\r\n /**\r\n * ovládání menu\r\n */\r\n controlMenu(nsmer){\r\n\r\n if(this.menuActionTimeout <=0){\r\n //zabráníme znovuzmáčknutí\r\n this.menuActionTimeout = this.menuActionTimeoutDefault;\r\n\r\n //zvuk pohyb v menu\r\n this.game.playSound(0,1);\r\n \r\n if(nsmer === 0 || nsmer === 2)\r\n {\r\n //nahoru a dolů\r\n if(nsmer === 0)\r\n {\r\n if(this.inMenuCurrent>0){\r\n this.inMenuCurrent --;\r\n } \r\n }\r\n if(nsmer === 2)\r\n {\r\n if(this.inMenuCurrent < menuControlItems.length-1){\r\n this.inMenuCurrent ++;\r\n }\r\n }\r\n }\r\n \r\n if(nsmer === 1 || nsmer === 3)\r\n {\r\n if(this.inMenuCurrent === menuControlItems.indexOf('tracer')){\r\n\r\n //změna typu vozidla 3 cyber-trike, 4 cyber-truck, \r\n if(this.type === 3) {\r\n this.type = 4;\r\n }\r\n else{\r\n this.type = 3;\r\n }\r\n }\r\n\r\n if(this.inMenuCurrent === menuControlItems.indexOf('color')){\r\n \r\n //změna barev\r\n if(nsmer === 1)\r\n {\r\n this.color ++;\r\n if(this.color > greatColors.length-1){\r\n this.color = 0;\r\n } \r\n }\r\n else\r\n {\r\n this.color --;\r\n\r\n if(this.color<0){\r\n this.color = greatColors.length-1;\r\n }\r\n }\r\n }\r\n\r\n if(this.inMenuCurrent === menuControlItems.indexOf('team'))\r\n {\r\n //změna týmu\r\n if(nsmer === 1)\r\n {\r\n this.team ++; \r\n }\r\n else\r\n {\r\n this.team --;\r\n }\r\n\r\n if(this.team < 0){\r\n this.team = 0;\r\n } \r\n }\r\n\r\n if(this.inMenuCurrent === menuControlItems.indexOf('AI count')){\r\n \r\n //změna barev\r\n if(nsmer === 1)\r\n {\r\n this.game.addAI(1);\r\n }\r\n else\r\n {\r\n this.game.removeAI();\r\n }\r\n }\r\n\r\n if(this.inMenuCurrent === menuControlItems.indexOf('screen')){\r\n \r\n this.game.toggleFullScreen();\r\n }\r\n\r\n\r\n if(this.inMenuCurrent === menuControlItems.indexOf('AI color')){\r\n \r\n //změna barev\r\n if(nsmer === 1)\r\n {\r\n this.game.updateAIColor(+1);\r\n }\r\n else\r\n {\r\n this.game.updateAIColor(-1);\r\n }\r\n }\r\n\r\n\r\n if(this.inMenuCurrent === menuControlItems.indexOf('lang')){\r\n \r\n //změna barev\r\n if(nsmer === 1)\r\n {\r\n this.game.updateGameLang(+1);\r\n }\r\n else\r\n {\r\n this.game.updateGameLang(-1);\r\n }\r\n }\r\n\r\n\r\n if(this.inMenuCurrent === menuControlItems.indexOf('time')){\r\n \r\n //změna barev\r\n if(nsmer === 1)\r\n {\r\n this.game.updateGameTime(+150000);\r\n }\r\n else\r\n {\r\n this.game.updateGameTime(-150000);\r\n }\r\n }\r\n\r\n if(this.inMenuCurrent === menuControlItems.indexOf('leave')){\r\n\r\n //označení hráče pro smazání\r\n this.markedForRemove = true;\r\n }\r\n\r\n if(this.inMenuCurrent === menuControlItems.indexOf('controls') && this.isSetCustomMapping ){\r\n\r\n //vynutím ruční nastavení\r\n this.mappingAutoReload = false;\r\n //odstranění mapování\r\n this.isMapped = false;\r\n this.isSetCustomMapping = false;\r\n //odstranění existujícího nastavení\r\n this.mappingArray = []; \r\n //reset počítadla\r\n this.mappingCurrent = mappingItems.indexOf('up');\r\n this.mappingStepTimeout = this.mappingStepTimeoutDefault;\r\n }\r\n\r\n\r\n //hudební přehrávač\r\n if(this.inMenuCurrent === menuControlItems.indexOf('music')){\r\n \r\n //změna hudby a nebo její zastaveni\r\n if(nsmer === 1)\r\n {\r\n this.game.musicPlayerNext();\r\n }\r\n else\r\n {\r\n this.game.musicPlayerStop();\r\n }\r\n }\r\n\r\n //hudební přehrávač - hlasitost\r\n if(this.inMenuCurrent === menuControlItems.indexOf('musicVol')){\r\n \r\n //změna hudby a nebo její zastaveni\r\n if(nsmer === 1)\r\n {\r\n this.game.musicPlayerVolumeUp();\r\n }\r\n else\r\n {\r\n this.game.musicPlayerVolumeDown();\r\n }\r\n }\r\n }\r\n\r\n //update state\r\n this.game.updatePlayersInfo();\r\n }\r\n\r\n }\r\n\r\n\r\n /**\r\n * aplikace ovládání mna vozítko\r\n * řeší:\r\n * aplikování nového směru jízdy\r\n * brždění\r\n * a bonusovou akceleraci pokud jedu podlel jiné čáry\r\n */\r\n controlPlayer(nsmer){\r\n\r\n //nastavení nového směru\r\n if (nsmer !== this.smer && ((this.smer === 0 && nsmer !== 2) || (this.smer === 1 && nsmer !== 3) || (this.smer === 2 && nsmer !== 0) || (this.smer === 3 && nsmer !== 1))) {\r\n\r\n //nový směr\r\n this.smer = nsmer;\r\n //mením směr, nemůže jít o portál\r\n this.currentGateIsPortal = false;\r\n this.strightLenght = 0;\r\n this.strightTime = 0;\r\n this.maxLine = 0;\r\n\r\n this.cycleWithoutNewSmer = false;\r\n }\r\n \r\n //brzdění\r\n if ((this.smer === 0 && nsmer === 2) || (this.smer === 1 && nsmer === 3) || (this.smer === 2 && nsmer === 0) || (this.smer === 3 && nsmer === 1)) {\r\n\r\n this.breaking = true;\r\n\r\n if (this.bonusSpeed - (this.game.movestep * 0.02) > -1.5) {\r\n this.bonusSpeed -= this.game.movestep * 0.02;\r\n }\r\n else {\r\n this.bonusSpeed = -1.5;\r\n }\r\n }\r\n\r\n //turbo, jen pokud jedu dost blízko vedle někoho jiného, a držím klávesu ve směru jízdy\r\n if (this.smer === nsmer) {\r\n\r\n\r\n if(this.LastNeighborDetection <= 0)\r\n {\r\n\r\n //resetuju počítadlo a zkontroluju kolize\r\n this.LastNeighborDetection = this.neighborDetectionInterval;\r\n\r\n //kontrola přítomnosti vedlejší linky pomocí dvou detektorů do stran oproti směru jízdy\r\n this.neighborClose1 = false;\r\n this.neighborClose2 = false;\r\n\r\n let detect1 = null;\r\n let detect2 = null;\r\n\r\n let colX = this.x;\r\n let colY = this.y;\r\n\r\n if(this.smer === 0 || this.smer === 2) {\r\n if (this.smer === 0) {\r\n //nahoru\r\n colY = this.y -2;\r\n }\r\n if (this.smer === 2) {\r\n //dolu\r\n colY = this.y +2;\r\n } \r\n detect1 = this.game.ctx.getImageData(Math.floor(this.x + 2), Math.floor(colY), 20, 1).data;\r\n detect2 = this.game.ctx.getImageData(Math.floor(this.x - 22), Math.floor(colY), 20, 1).data; \r\n }\r\n\r\n if (this.smer === 3 || this.smer === 1) {\r\n if(this.smer === 3){\r\n //nalevo\r\n colX = this.x - 2;\r\n }\r\n if (this.smer === 1) {\r\n //napravo\r\n colX = this.x + 2; \r\n } \r\n detect1 = this.game.ctx.getImageData(Math.floor(colX), Math.floor(this.y + 2), 1, 20).data;\r\n detect2 = this.game.ctx.getImageData(Math.floor(colX), Math.floor(this.y - 22), 1, 20).data;\r\n }\r\n\r\n if (detect1 !== null) {\r\n //kontroluju detektor 1\r\n for (let i = 3; i < detect1.length; i = i + 4) {\r\n if (detect1[i] > 150) {\r\n this.neighborClose1 = true;\r\n \r\n let colision = (i+1) / 4;\r\n if(this.smer === 0 || this.smer === 2)\r\n {\r\n colX = this.x + 2 + colision;\r\n }\r\n else\r\n {\r\n colY = this.y + 2 + colision;\r\n }\r\n\r\n this.storm1x = colX;\r\n this.storm1y = colY;\r\n //this.game.addConnection(this.x,this.y,colX,colY,this.color, connectionType.PORTAL);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(!this.neighborClose1)\r\n {\r\n this.storm1x = this.x;\r\n this.storm1y = this.y;\r\n }\r\n\r\n\r\n if (detect2 !== null ) {\r\n //kontroluju detektor 2\r\n for (let i = detect1.length-1; i >=0 ; i = i - 4) {\r\n if (detect2[i] > 150) {\r\n this.neighborClose2 = true;\r\n\r\n let colision = (detect1.length / 4) - ((i+1) / 4);\r\n if(this.smer === 0 || this.smer === 2)\r\n {\r\n colX = this.x - 2 - colision;\r\n }\r\n else\r\n {\r\n colY = this.y - 2 - colision;\r\n }\r\n\r\n this.storm2x = colX;\r\n this.storm2y = colY;\r\n //this.game.addConnection(this.x,this.y,colX,colY,this.color, connectionType.PORTAL);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(!this.neighborClose2)\r\n {\r\n this.storm2x = this.x;\r\n this.storm2y = this.y;\r\n }\r\n\r\n\r\n\r\n\r\n if (this.neighborClose1 || this.neighborClose2 || (this.cycleWithoutNewSmer && this.energy > 0) || this.overDriveCooldown === true) {\r\n\r\n if(!this.neighborClose1 && !this.neighborClose2 && this.overDriveCooldown === false && this.cycleWithoutNewSmer && this.energy > 0)\r\n {\r\n this.cycleWithoutNewSmer = false;\r\n //vyplýtvám jeden overdrive\r\n this.energy -=1;\r\n this.overDriveDuration = this.overDriveDurationDefault;\r\n this.overDriveCooldown = true;\r\n this.game.playSound(19,1); \r\n\r\n //update state\r\n this.game.updatePlayersInfo();\r\n }\r\n\r\n //bonus aktivní (jedu kolem něčeho, zrychluju)\r\n if (this.bonusSpeed + (this.game.movestep * 0.04) < this.maxBonusSpeed) {\r\n this.bonusSpeed += this.game.movestep * 0.04;\r\n }\r\n else {\r\n //maximum je 1.5\r\n this.bonusSpeed = this.maxBonusSpeed;\r\n }\r\n }\r\n else{\r\n this.storm1x = this.storm2x = this.x;\r\n this.storm1y = this.storm2y = this.y;\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * zpracuje novou polohu hráče na základě nastaveného směru a okolností\r\n */\r\n processNewPosition()\r\n {\r\n //staré hodnoty odložím (pro potřeby kreslení)\r\n this.oldx = this.x;\r\n this.oldy = this.y;\r\n\r\n //opožděný přesun portálem\r\n if(this.transferDelay <= 0 && this.transferX!= null && this.transferY !=null)\r\n {\r\n //vymažeme prostor okolo vstupního portálu\r\n //experiment\r\n //this.game.addExplosion(this.x,this.y, 0, explosionType.CLEAR,0,0,0);\r\n \r\n //přesun\r\n this.moveToXY(this.transferX, this.transferY);\r\n\r\n //smažu nové místo na přesun\r\n this.transferX = this.transferY = null;\r\n }\r\n\r\n\r\n //zpomalování \r\n if (this.bonusSpeed > 0) {\r\n \r\n if (this.bonusSpeed - (this.game.movestep * 0.01) > 0) {\r\n this.bonusSpeed -= this.game.movestep * 0.01;\r\n }\r\n else {\r\n this.bonusSpeed = 0;\r\n }\r\n }\r\n\r\n //zrychlování (turbo)\r\n if (this.bonusSpeed < 0) {\r\n \r\n if (this.bonusSpeed + (this.game.movestep * 0.005) < 0) {\r\n this.bonusSpeed += this.game.movestep * 0.005;\r\n }\r\n else {\r\n this.bonusSpeed = 0;\r\n }\r\n }\r\n\r\n //update polohy vozítka podle předchozí hodnoty\r\n this.maxLine = this.strightLenght;\r\n if(this.maxLine > 30)\r\n {\r\n this.maxLine = 30;\r\n }\r\n\r\n let stepAmount = (this.baseSpeed + this.bonusSpeed) * this.game.movestep;\r\n\r\n let newx = this.x;\r\n let newy = this.y;\r\n\r\n if (this.smer === 0) {\r\n newx = Math.floor(this.x);\r\n newy -= stepAmount;\r\n }\r\n\r\n if (this.smer === 1) {\r\n newx += stepAmount;\r\n newy = Math.floor(this.y);\r\n }\r\n\r\n if (this.smer === 2) {\r\n newx = Math.floor(this.x);\r\n newy += stepAmount;\r\n\r\n }\r\n\r\n if (this.smer === 3) {\r\n newx -= stepAmount;\r\n newy = Math.floor(this.y);\r\n }\r\n\r\n //výpočet ujeté vzdálenosti rovně\r\n this.strightLenght += stepAmount;\r\n\r\n\r\n //zaokrouhlíme novou polohu\r\n let floorX = Math.floor(newx);\r\n let floorY = Math.floor(newy);\r\n\r\n //zbírání bonusů\r\n let points = this.game.colectPoints(newx,newy, this.team);\r\n if(points!= null)\r\n {\r\n console.log(points);\r\n\r\n if(this.team > 0){\r\n //navýším score celému týmu\r\n this.game.updateTeamScore(this.team,points);\r\n //energii, jen hráči\r\n this.energy += points.sumEnergy;\r\n }\r\n else{\r\n //mavýším score jen sobě\r\n this.score += points.sumScore;\r\n this.energy += points.sumEnergy;\r\n }\r\n \r\n this.game.updatePlayersInfo();\r\n }\r\n\r\n //kolize s překážkama se kontroluje vždy, když se změní zaokrouhlená poloha (nemá smysl počítat když jsme se posunul o 0,1)\r\n if (this.lastCheckX !== floorX || this.lastCheckY !== floorY) {\r\n\r\n let detector = null;\r\n\r\n //nová detekce kolize\r\n if (Math.abs(this.lastCheckX - floorX) >= 1) {\r\n //rozdíl v x\r\n if (floorX > this.lastCheckX) {\r\n //kontrola kolize\r\n detector = this.game.ctx.getImageData(this.lastCheckX + 1, floorY, floorX - this.lastCheckX, 1).data;\r\n } else {\r\n //kontrola kolize floorX < this.lastCheckX\r\n detector = this.game.ctx.getImageData(floorX, floorY, this.lastCheckX - floorX, 1).data;\r\n }\r\n }\r\n if (Math.abs(this.lastCheckY - floorY) >= 1) {\r\n //rozdíl v y\r\n if (floorY > this.lastCheckY) {\r\n //kontrola kolize\r\n detector = this.game.ctx.getImageData(floorX, this.lastCheckY + 1, 1, floorY - this.lastCheckY).data;\r\n } else {\r\n //kontrola kolize floorY < this.lastCheckY\r\n detector = this.game.ctx.getImageData(floorX, floorY, 1, this.lastCheckY - floorY).data;\r\n }\r\n }\r\n\r\n //uložíme zaokrouhlený moment poslední kontorly\r\n this.lastCheckX = floorX;\r\n this.lastCheckY = floorY;\r\n\r\n //kontrola kolize\r\n let boom = false;\r\n let gate = false;\r\n\r\n if (detector !== null) {\r\n //kontroluju detektor\r\n for (let i = 3; i < detector.length; i = i + 4) {\r\n \r\n //poloprůhledná cesta\r\n if (detector[i] > 30 && detector[i] < 100) {\r\n gate = true;\r\n break;\r\n }\r\n \r\n //pevná barva\r\n if (detector[i] > 150) {\r\n boom = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n //výbuch v případě detekování kolize\r\n if (boom) {\r\n\r\n this.playerPhase = playerPhaseEnum.DEATH;\r\n this.deaths++;\r\n //aktivuju výbuch\r\n this.explosion = true;\r\n\r\n }\r\n else {\r\n\r\n //hledání portálu\r\n if(gate && this.transferDelay<=0){\r\n \r\n //vyhledám portály\r\n let portal = this.game.findPortal(this.x, newx, this.y, newy);\r\n\r\n\r\n if (portal!=null)\r\n {\r\n\r\n //dohledám nějaký portál na přesun\r\n let randPortal = this.game.getRandomPortal(portal.ori, portal.id, this.portalDial);\r\n\r\n if(randPortal!=null){\r\n\r\n let plusX = 0;\r\n let plusY = 0;\r\n\r\n if(portal.ori === orientation.HORIZONTAL){\r\n\r\n //spočítáme, kde vstupuju do portálu\r\n let diff = portal.endx - portal.beginx; \r\n let procX = 1 - ((portal.endx - newx) / diff);\r\n \r\n //spočítám kde vystupuju z náhodného portálu\r\n let randDiff = randPortal.endx - randPortal.beginx;\r\n plusX = procX * randDiff;\r\n\r\n //poskočím o 3 px\r\n if (this.smer === 0) {\r\n plusY -= 3;\r\n }\r\n if (this.smer === 2) {\r\n plusY += 3;\r\n }\r\n\r\n }\r\n else{\r\n //spočítáme, kde vstupuju do portálu\r\n let diff = portal.endy - portal.beginy; \r\n let procY = 1 - ((portal.endy - newy) / diff);\r\n \r\n //spočítám kde vystupuju z náhodného portálu\r\n let randDiff = randPortal.endy - randPortal.beginy;;\r\n plusY = procY * randDiff;\r\n\r\n //poskočím o 3 px\r\n if (this.smer === 1) {\r\n plusX += 3;\r\n }\r\n if (this.smer === 3) {\r\n plusX -= 3;\r\n }\r\n }\r\n\r\n //nastavím, kam se budu odložene přesouvat\r\n this.transferX = Math.floor(randPortal.beginx + plusX);\r\n this.transferY = Math.floor(randPortal.beginy + plusY);\r\n\r\n //přidám propojku, která na chvilku ukáže kam jsme letěl portálem\r\n this.game.addConnection(newx,newy,this.transferX,this.transferY,this.color, connectionType.PORTAL);\r\n this.game.playSound(3,1); \r\n\r\n //odložený přesun\r\n this.transferDelay = this.transferDelayDefault;\r\n\r\n //resetuju portal dial na 0\r\n if(this.portalDial!==0)\r\n {\r\n this.portalDial = 0;\r\n //změna, update\r\n this.game.updatePlayersInfo();\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n //zapsání nové polohy, posuv na novou souřadnici bez výbuchu a přesunu\r\n if(this.transferDelay <=0)\r\n {\r\n this.x = newx;\r\n this.y = newy;\r\n }\r\n }\r\n }\r\n else {\r\n\r\n //poloha se nezměnila, zapíšu nový malinký posuv (mikropohyb)\r\n if(this.transferDelay <=0)\r\n {\r\n this.x = newx;\r\n this.y = newy;\r\n }\r\n }\r\n\r\n let bottomHudsHeight = this.game.getBottomHudsHeight();\r\n\r\n //teleport na druhou stranu\r\n if (this.y < 15) {\r\n this.y = this.storm1y = this.storm2y = this.oldy = this.lastCheckY = this.game.canvas.height - (bottomHudsHeight + 15);\r\n }\r\n if (this.x > this.game.canvas.width - 15) {\r\n this.x = this.storm1x = this.storm2x = this.oldx = this.lastCheckX = 15;\r\n }\r\n if (this.y > this.game.canvas.height - (bottomHudsHeight + 15)) {\r\n this.y = this.storm1y = this.storm2y = this.oldy = this.lastCheckY = 15;\r\n }\r\n if (this.x < 15) {\r\n this.x = this.storm1x = this.storm2x = this.oldx = this.lastCheckX = this.game.canvas.width - 15;\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * update hráče a jeho činnost ve hře, \r\n * vrací informaci o tom, zda hráč něco stiskl\r\n * @param {*} pause - informace o tom zda hra aktuálně beží\r\n * @param {*} gamepads - pole aktuálního stavu kontrolerů\r\n */\r\n update (pause, gamepads) {\r\n\r\n //reset ovládání\r\n this.actual.left = false;\r\n this.actual.right = false;\r\n this.actual.up = false;\r\n this.actual.down = false;\r\n this.actual.gate = false;\r\n this.actual.blockade = false;\r\n this.actual.ram = false;\r\n this.actual.dial = false;\r\n this.actual.pause = false;\r\n this.anyAction = false;\r\n\r\n //nový směr\r\n let nsmer = null;\r\n this.breaking = false;\r\n\r\n //zprocesuju ovládání hráčů\r\n nsmer = this.processControlls(gamepads);\r\n if(!pause){\r\n this.processAIControlls();\r\n \r\n //zprocesuju odpočty\r\n this.timeoutPausableProcess();\r\n }\r\n \r\n this.timeoutsProcess();\r\n\r\n //řízení menu\r\n if(this.playerPhase === playerPhaseEnum.INMENU && nsmer!=null){\r\n this.controlMenu(nsmer);\r\n }\r\n\r\n if(!pause){\r\n\r\n //otočení před hrou\r\n if (this.playerPhase === playerPhaseEnum.READY && nsmer!=null) {\r\n this.smer = nsmer;\r\n }\r\n\r\n //změna směru\r\n if (this.playerPhase === playerPhaseEnum.GAME){\r\n if(nsmer !== null) {\r\n this.controlPlayer(nsmer);\r\n }\r\n else{\r\n this.cycleWithoutNewSmer = true;\r\n }\r\n }\r\n\r\n //obecné zpracování pohybu všech hráčů, včetně AI\r\n if (this.playerPhase === playerPhaseEnum.GAME ) {\r\n this.processNewPosition();\r\n }\r\n }\r\n\r\n if(this.isFirst)\r\n {\r\n if(this.playerPhase === playerPhaseEnum.GAME && !this.soundFirstPlayed)\r\n {\r\n this.soundFirstPlayed = true;\r\n this.game.playSound(10,1);\r\n }\r\n }\r\n else\r\n {\r\n this.soundFirstPlayed = false;\r\n }\r\n\r\n return this.anyAction;\r\n };\r\n\r\n\r\n drawVehicle (x, y) {\r\n\r\n this.game.infoctx.fillStyle = greatColors[this.color];\r\n this.game.infoctx.filter = \"blur(7px)\";\r\n this.game.infoctx.fillRect(x-4, y-4, 8, 8);\r\n this.game.infoctx.filter = \"none\";\r\n\r\n if(this.isFirst)\r\n {\r\n this.game.infoctx.filter = \"blur(7px)\";\r\n this.game.infoctx.fillRect(x-6, y-6, 12, 12);\r\n this.game.infoctx.filter = \"none\";\r\n }\r\n\r\n\r\n\r\n\r\n\r\n //příprava efektu rychlé jízdy\r\n let speedLineOpacity = 0;\r\n if(this.bonusSpeed>0){\r\n speedLineOpacity = (this.maxLine / 30) * (this.bonusSpeed / this.maxBonusSpeed) * 150;\r\n }\r\n let speedLineColor = '#FFFFFF' + rgbToHex(Math.floor(speedLineOpacity));\r\n \r\n\r\n if (this.playerPhase === playerPhaseEnum.READY) {\r\n this.game.infoctx.fillStyle = greatColors[this.color];\r\n }\r\n\r\n if (this.playerPhase === playerPhaseEnum.GAME) {\r\n this.game.infoctx.fillStyle = '#FFFFFFFF';\r\n }\r\n\r\n\r\n if (this.smer === 0) {\r\n\r\n //kola\r\n if (this.type === 3) {\r\n this.game.infoctx.fillRect(x, y - 1, 1, 2);\r\n }\r\n else {\r\n this.game.infoctx.fillRect(x - 3, y, 2, 2);\r\n this.game.infoctx.fillRect(x + 2, y, 2, 2);\r\n }\r\n this.game.infoctx.fillRect(x - 3, y + 4, 2, 2);\r\n this.game.infoctx.fillRect(x + 2, y + 4, 2, 2);\r\n\r\n //rychlé pruhy\r\n this.game.infoctx.fillStyle = speedLineColor;\r\n\r\n this.game.infoctx.fillRect(x - 3, y + 8, 2, this.maxLine * 0.25 + Math.floor(Math.random() * this.maxLine) * 0.75) ;\r\n this.game.infoctx.fillRect(x + 2, y + 8, 2, this.maxLine * 0.25 + Math.floor(Math.random() * this.maxLine) * 0.75) ;\r\n\r\n //brzdovky\r\n if(this.breaking){\r\n\r\n this.game.infoctx.fillStyle = \"#FF0000\" + rgbToHex(55+ Math.floor(Math.random()*200));\r\n this.game.infoctx.fillRect(x - 3, y + 7, 7, 4) ;\r\n }\r\n\r\n }\r\n\r\n if (this.smer === 1) {\r\n\r\n //kola\r\n if (this.type === 3) {\r\n this.game.infoctx.fillRect(x, y, 2, 1);\r\n }\r\n else {\r\n this.game.infoctx.fillRect(x - 1, y - 3, 2, 2);\r\n this.game.infoctx.fillRect(x - 1, y + 2, 2, 2);\r\n }\r\n this.game.infoctx.fillRect(x - 5, y - 3, 2, 2);\r\n this.game.infoctx.fillRect(x - 5, y + 2, 2, 2);\r\n\r\n //rychlé pruhy\r\n this.game.infoctx.fillStyle = speedLineColor;\r\n\r\n this.game.infoctx.fillRect(x - 8, y - 3, - (this.maxLine * 0.25 + Math.floor(Math.random() * this.maxLine) * 0.75) ,2) ;\r\n this.game.infoctx.fillRect(x - 8, y + 2, - (this.maxLine * 0.25 + Math.floor(Math.random() * this.maxLine) * 0.75) ,2) ;\r\n\r\n //brzdovky\r\n if(this.breaking){\r\n\r\n this.game.infoctx.fillStyle = \"#FF0000\" + rgbToHex(55+ Math.floor(Math.random()*200));\r\n this.game.infoctx.fillRect(x - 6, y - 3, - 4 ,7) ;\r\n }\r\n }\r\n\r\n if (this.smer === 2) {\r\n\r\n //kola\r\n if (this.type === 3) {\r\n this.game.infoctx.fillRect(x, y - 1, 1, 2);\r\n }\r\n else {\r\n this.game.infoctx.fillRect(x - 3, y - 2, 2, 2);\r\n this.game.infoctx.fillRect(x + 2, y - 2, 2, 2);\r\n }\r\n\r\n this.game.infoctx.fillRect(x - 3, y - 6, 2, 2);\r\n this.game.infoctx.fillRect(x + 2, y - 6, 2, 2);\r\n\r\n //rychlé pruhy\r\n this.game.infoctx.fillStyle = speedLineColor;\r\n\r\n this.game.infoctx.fillRect(x - 3, y - 8, 2, -(this.maxLine * 0.25 + Math.floor(Math.random() * this.maxLine) * 0.75)) ;\r\n this.game.infoctx.fillRect(x + 2, y - 8, 2, -(this.maxLine * 0.25 + Math.floor(Math.random() * this.maxLine) * 0.75)) ;\r\n\r\n //brzdovky\r\n if(this.breaking){\r\n\r\n this.game.infoctx.fillStyle = \"#FF0000\" + rgbToHex(55+ Math.floor(Math.random()*200));\r\n this.game.infoctx.fillRect(x - 3, y - 7, 7, -4) ;\r\n }\r\n }\r\n\r\n if (this.smer === 3) {\r\n\r\n //kola\r\n if (this.type === 3) {\r\n this.game.infoctx.fillRect(x - 1, y, 2, 1);\r\n }\r\n else {\r\n this.game.infoctx.fillRect(x, y - 3, 2, 2);\r\n this.game.infoctx.fillRect(x, y + 2, 2, 2);\r\n }\r\n\r\n this.game.infoctx.fillRect(x + 4, y - 3, 2, 2);\r\n this.game.infoctx.fillRect(x + 4, y + 2, 2, 2);\r\n\r\n //rychlé pruhy\r\n this.game.infoctx.fillStyle = speedLineColor;\r\n\r\n this.game.infoctx.fillRect(x + 8, y - 3, this.maxLine * 0.25 + Math.floor(Math.random() * this.maxLine) * 0.75 ,2) ;\r\n this.game.infoctx.fillRect(x + 8, y + 2, this.maxLine * 0.25 + Math.floor(Math.random() * this.maxLine) * 0.75 ,2) ;\r\n\r\n //brzdovky\r\n if(this.breaking){\r\n\r\n this.game.infoctx.fillStyle = \"#FF0000\" + rgbToHex(55+ Math.floor(Math.random()*200));\r\n this.game.infoctx.fillRect(x + 7, y - 3, + 4 ,7) ;\r\n }\r\n }\r\n\r\n };\r\n\r\n drawRam (x, y) {\r\n\r\n if (this.playerPhase === playerPhaseEnum.GAME) {\r\n this.game.infoctx.fillStyle = '#FFFFFFFF';\r\n\r\n //this.game.infoctx.fillStyle = greatColors[this.color];\r\n }\r\n\r\n\r\n if (this.smer === 0) {\r\n\r\n this.game.infoctx.fillRect(x - 6, y - 4, 13, 2);\r\n\r\n this.game.ctx.clearRect(x - 6, y - 4, 13, 2);\r\n }\r\n\r\n if (this.smer === 1) {\r\n\r\n this.game.infoctx.fillRect(x + 3, y - 6, 2, 13); \r\n\r\n this.game.ctx.clearRect(x + 3, y - 6, 2, 13); \r\n }\r\n\r\n if (this.smer === 2) {\r\n\r\n this.game.infoctx.fillRect(x - 6, y + 4, 13, 2);\r\n\r\n this.game.ctx.clearRect(x - 6, y + 4, 13, 2);\r\n }\r\n\r\n if (this.smer === 3) {\r\n\r\n this.game.infoctx.fillRect(x - 3, y - 6, 2, 13);\r\n\r\n this.game.ctx.clearRect(x - 3, y - 6, 2, 13);\r\n }\r\n };\r\n\r\n\r\n /**\r\n * tohle umí vymazat kruh skrz nastavení kreslení\r\n */\r\n clearCircle(context, x, y, radius){\r\n\r\n context.globalCompositeOperation = 'destination-out';\r\n context.beginPath();\r\n context.arc(x, y, radius, 0, Math.PI*2, true);\r\n context.fill();\r\n context.globalCompositeOperation = 'source-over';\r\n\r\n };\r\n\r\n\r\n\r\n draw () {\r\n\r\n let fillStyle = this.game.ctx.fillStyle;\r\n\r\n //vykreslování bude jen v celých číselch (výpočet však bude v přesnějších)\r\n let x = Math.floor(this.x);\r\n let y = Math.floor(this.y);\r\n\r\n let oldx = Math.floor(this.oldx);\r\n let oldy = Math.floor(this.oldy);\r\n\r\n\r\n if (this.controlledBy === controls.GAMEPAD || this.controlledBy === controls.KEYBOARD) {\r\n\r\n //this.game.infoctx.fillStyle = '#FFF';\r\n //this.game.infoctx.textAlign = \"begin\";\r\n //this.game.infoctx.font = \"10px arial\";\r\n //this.game.infoctx.fillText((this.baseSpeed + this.bonusSpeed).toFixed(2), x + 5, y);\r\n\r\n }\r\n\r\n if (this.explosion) {\r\n //vymazání kruhu\r\n\r\n //výbuch\r\n this.game.addExplosion(x,y, this.color , explosionType.PLAYER, this.smer, this.baseSpeed + this.bonusSpeed, this.team);\r\n this.explosion = false;\r\n }\r\n\r\n if (this.playerPhase === playerPhaseEnum.READY) {\r\n\r\n let size = (1 / this.restartTimeoutDefault) * this.restartTimeout;\r\n if (size < 0) {\r\n size = 0;\r\n }\r\n\r\n //barva\r\n let size255 = 255; //30 + Math.floor(size * 40);\r\n\r\n //velikost kolečka\r\n let sizeBall = size * 20;\r\n if (sizeBall < 10)\r\n sizeBall = 10;\r\n\r\n //barva pozadí\r\n if (size > 0.03) {\r\n this.game.infoctx.fillStyle = greatColors[this.color] + rgbToHex(size255);\r\n } else\r\n {\r\n this.game.infoctx.fillStyle = greatColors[this.color];\r\n }\r\n\r\n \r\n //barva hráče\r\n if(this.clearBehindPlayer === true)\r\n {\r\n //pokus o kruhové mazání\r\n clearCircle(this.game.ctx, this.x, this.y, 40);\r\n this.clearBehindPlayer = false;\r\n }\r\n\r\n this.drawVehicle(x, y);\r\n\r\n this.game.infoctx.strokeStyle = greatColors[this.color];\r\n\r\n this.game.infoctx.lineWidth = 2;\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.arc(x, y, sizeBall * 2, 0, 2 * Math.PI);\r\n this.game.infoctx.stroke();\r\n\r\n this.game.infoctx.lineWidth = 4;\r\n \r\n //šipka\r\n\r\n //this.game.infoctx.strokeStyle = \"#FFFFFF\";\r\n this.game.infoctx.lineWidth = 4;\r\n if (this.smer === 0) {\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.moveTo(this.x + sizeBall * 1.1, this.y + sizeBall * 1.1);\r\n this.game.infoctx.lineTo(this.x, this.y - sizeBall * 1.4);\r\n this.game.infoctx.lineTo(this.x - sizeBall * 1.1, this.y + sizeBall * 1.1);\r\n this.game.infoctx.stroke();\r\n }\r\n\r\n if (this.smer === 1) {\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.moveTo(this.x - sizeBall * 1.1, this.y - sizeBall * 1.1);\r\n this.game.infoctx.lineTo(this.x + sizeBall * 1.4, this.y);\r\n this.game.infoctx.lineTo(this.x - sizeBall * 1.1, this.y + sizeBall * 1.1);\r\n this.game.infoctx.stroke();\r\n }\r\n\r\n if (this.smer === 2) {\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.moveTo(this.x - sizeBall * 1.1, this.y - sizeBall * 1.1);\r\n this.game.infoctx.lineTo(this.x, this.y + sizeBall * 1.4);\r\n this.game.infoctx.lineTo(this.x + sizeBall * 1.1, this.y - sizeBall * 1.1);\r\n this.game.infoctx.stroke();\r\n }\r\n\r\n if (this.smer === 3) {\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.moveTo(this.x + sizeBall * 1.1, this.y + sizeBall * 1.1);\r\n this.game.infoctx.lineTo(this.x - sizeBall * 1.4, this.y);\r\n this.game.infoctx.lineTo(this.x + sizeBall * 1.1, this.y - sizeBall * 1.1);\r\n this.game.infoctx.stroke();\r\n } \r\n }\r\n\r\n //běžné vykreslení hráče\r\n if (this.playerPhase !== playerPhaseEnum.READY) {\r\n \r\n \r\n //barva hráče\r\n this.drawVehicle(x, y);\r\n\r\n //beranidlo\r\n if (this.ramDuration > 0)\r\n {\r\n this.drawRam(x,y);\r\n }\r\n\r\n //kreslení linky\r\n if (this.gateDuration > 0) {\r\n //barva brány\r\n this.game.ctx.fillStyle = gateColor;\r\n }\r\n else {\r\n //barva hráče\r\n this.game.ctx.fillStyle = greatColors[this.color];\r\n }\r\n\r\n if (this.smer === 0) {\r\n this.game.ctx.fillRect(x - 1, y + 1, 3, oldy - y);\r\n }\r\n\r\n if (this.smer === 1) {\r\n this.game.ctx.fillRect(oldx, oldy - 1, x - oldx, 3);\r\n }\r\n\r\n if (this.smer === 2) {\r\n this.game.ctx.fillRect(oldx - 1, oldy - 1, 3, y - oldy);\r\n }\r\n\r\n if (this.smer === 3) {\r\n this.game.ctx.fillRect(x + 1, y - 1, oldx - x, 3);\r\n }\r\n\r\n //blokáda\r\n if (this.blockadeDuration > 0) {\r\n let zbyva = this.blockadeDurationDefault - this.blockadeDuration;\r\n\r\n if (this.blockadeSpawnCurrentStep * 41 < zbyva) {\r\n //vyhodí tecku kazdych 41 ms. (celkem pak 12)\r\n this.blockadeSpawnCurrentStep++;\r\n\r\n let dropx = 0;\r\n let dropy = 0;\r\n\r\n if (this.smer === 0) {\r\n dropy = 20;\r\n }\r\n\r\n if (this.smer === 1) {\r\n dropx = -20;\r\n }\r\n\r\n if (this.smer === 2) {\r\n dropy = -20;\r\n }\r\n\r\n if (this.smer === 3) {\r\n dropx = 20;\r\n }\r\n\r\n var varX = -18 + Math.floor(Math.random() * 36);\r\n var varY = -18 + Math.floor(Math.random() * 36);\r\n\r\n //make it happend\r\n this.game.ctx.fillRect(x + dropx + varX, y + dropy + varY, 2, 2);\r\n\r\n }\r\n }\r\n\r\n //storm\r\n\r\n if(this.toStorm <= 500){\r\n\r\n let stormx = null;\r\n let stormy = null;\r\n\r\n let ran = Math.floor(Math.random() * 2);\r\n if(ran === 0){\r\n stormx = this.storm1x;\r\n stormy = this.storm1y; \r\n }\r\n if(ran === 1){\r\n stormx = this.storm2x;\r\n stormy = this.storm2y; \r\n }\r\n\r\n let a = this.x - stormx;\r\n let b = this.y - stormy;\r\n let c = Math.sqrt( a*a + b*b );\r\n\r\n if(c<=30)\r\n {\r\n //barva hráče\r\n this.game.infoctx.strokeStyle = greatColors[this.color];\r\n this.game.infoctx.lineWidth = 1;\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.moveTo(x, y);\r\n this.game.infoctx.lineTo(x - 5 + Math.floor(Math.random() * 10), y - 5 + Math.floor(Math.random() * 10));\r\n this.game.infoctx.lineTo(stormx - 5 + Math.floor(Math.random() * 10), stormy - 5 + Math.floor(Math.random() * 10));\r\n this.game.infoctx.lineTo(stormx, stormy);\r\n this.game.infoctx.stroke();\r\n }\r\n }\r\n }\r\n\r\n\r\n this.game.ctx.fillStyle = fillStyle;\r\n };\r\n\r\n}\r\n","import { greatColors, gateColor } from './Enums';\r\n\r\nexport default class Portal {\r\n\r\n constructor(game, bx, by, ex, ey, ori, permanent, duration, id, dialCode){\r\n\r\n this.game = game;\r\n\r\n //vzdy menší hodnota, než má konec\r\n this.beginx = Math.floor(bx);\r\n this.beginy = Math.floor(by);\r\n\r\n //vždy vvětší hodnota, než má začátek\r\n this.endx = Math.floor(ex);\r\n this.endy = Math.floor(ey);\r\n\r\n //střed portálu, optimalizace\r\n let dx = Math.abs(this.beginx - this.endx)/2;\r\n let dy = Math.abs(this.beginy - this.endy)/2;\r\n this.sx = this.beginx < this.endx ? this.beginx+dx : this.endx+dx;\r\n this.sy = this.beginy < this.endy ? this.beginy+dy : this.endy+dy;\r\n\r\n \r\n this.rnd1x = this.bx; \r\n this.rnd1y = this.by;\r\n\r\n this.rnd2x = this.ex;\r\n this.rnd2y = this.ey;\r\n\r\n \r\n this.color = Math.floor(Math.random() * greatColors.length);\r\n this.ori = ori;\r\n \r\n\r\n //odložený start portálu\r\n this.delayedInitDefault = 200;\r\n this.delayedInit = this.delayedInitDefault;\r\n\r\n\r\n //životnost\r\n this.portalDuration = duration;\r\n //nezničitelný\r\n this.permanent = permanent;\r\n\r\n this.changeColorTimeout = 0;\r\n this.changeColorTimeoutDefault = 100;\r\n\r\n this.shakeGateTimeout = 0;\r\n this.shakeGateTimeoutDefault = 50;\r\n\r\n //identifikátor, pro hledání jiného portálu, než ten ze kterého jdu\r\n this.id = id;\r\n\r\n //before cahnge TargetCode\r\n this.startTargetCodeChanging = 10000;\r\n\r\n this.arrowAnimationCycle = 1000;\r\n this.arrowAnimationCycleDefault = 1000;\r\n\r\n this.arrowPosition = 0;\r\n this.displayArrows = true;\r\n\r\n //náhodný dial\r\n this.targetCode = 1 + Math.floor(Math.random() * 4);\r\n if(dialCode > 0){\r\n this.targetCode = dialCode;\r\n }\r\n }\r\n\r\n timeoutsProcess () {\r\n\r\n //odložený start portálu\r\n if (this.delayedInit > 0){\r\n this.delayedInit -= this.game.delay;\r\n }\r\n\r\n //odpočet trvání brány\r\n if (this.permanent === false && this.delayedInit <=0 && this.portalDuration > 0){\r\n this.portalDuration -= this.game.delay;\r\n }\r\n\r\n if(this.changeColorTimeout >0)\r\n {\r\n this.changeColorTimeout -= this.game.delay\r\n }\r\n else\r\n {\r\n this.changeColorTimeout = this.changeColorTimeoutDefault;\r\n let ok = false;\r\n while(ok===false)\r\n {\r\n let newColor = Math.floor(Math.random() * greatColors.length);\r\n if(newColor !== this.color)\r\n {\r\n this.color = newColor;\r\n ok = true;\r\n }\r\n }\r\n }\r\n\r\n\r\n if(this.shakeGateTimeout >0)\r\n {\r\n this.shakeGateTimeout -= this.game.delay\r\n }\r\n else\r\n {\r\n this.shakeGateTimeout = this.shakeGateTimeoutDefault;\r\n \r\n this.rnd1x = this.beginx -2 + Math.floor(Math.random() * 5);\r\n this.rnd1y = this.beginy - 2 + Math.floor(Math.random() * 5);\r\n\r\n this.rnd2x = this.endx -2 + Math.floor(Math.random() * 5);\r\n this.rnd2y = this.endy - 2 + Math.floor(Math.random() * 5); \r\n }\r\n\r\n\r\n if(this.startTargetCodeChanging > 0)\r\n {\r\n this.startTargetCodeChanging -= this.game.delay\r\n }\r\n\r\n\r\n if(this.arrowAnimationCycle > 0){\r\n this.arrowAnimationCycle -= this.game.delay\r\n\r\n this.arrowPosition = 5 + (5 / this.arrowAnimationCycleDefault) * this.arrowAnimationCycle;\r\n }\r\n else{\r\n this.arrowAnimationCycle = this.arrowAnimationCycleDefault;\r\n }\r\n };\r\n \r\n /**\r\n * změna cílové adresy\r\n */\r\n changeTargetCode () {\r\n\r\n if(this.startTargetCodeChanging <= 0){\r\n\r\n //náhodně určím adresu cíle 1-4 tečky\r\n this.targetCode = 1 + Math.floor(Math.random() * 4);\r\n }\r\n };\r\n\r\n\r\n //update portálů\r\n update () {\r\n\r\n //zprocesuju odpočty\r\n this.timeoutsProcess();\r\n\r\n if(this.displayArrows === true && this.game.gameCountdown < (this.game.gameCountdownDefault - 60000))\r\n {\r\n this.displayArrows = false;\r\n }\r\n\r\n };\r\n\r\n //kreslení portálů\r\n draw () {\r\n\r\n let fillStyle = this.game.ctx.fillStyle;\r\n let strokeStyle = this.game.ctx.strokeStyle;\r\n let InfofillStyle = this.game.infoctx.fillStyle;\r\n let InfostrokeStyle = this.game.infoctx.strokeStyle;\r\n\r\n\r\n //vykreslování bude jen v celých číselch (výpočet však bude v přesnějších)\r\n let bx = this.beginx;\r\n let by = this.beginy;\r\n\r\n let ex = this.endx;\r\n let ey = this.endy;\r\n\r\n if (this.delayedInit <=0 && this.portalDuration > 0) {\r\n \r\n //exploze pouze v info canvasu\r\n this.game.infoctx.fillStyle = \"#FFFFFF\";\r\n //this.game.infoctx.strokeStyle = \"#FFFFFF\";\r\n this.game.infoctx.strokeStyle = greatColors[this.color];\r\n\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.lineWidth = 3;\r\n this.game.infoctx.moveTo(bx, by);\r\n \r\n //this.game.infoctx.lineTo(bx -2 + Math.floor(Math.random() * 4), by - 2 + Math.floor(Math.random() * 4));\r\n this.game.infoctx.lineTo(this.rnd1x, this.rnd1y);\r\n this.game.infoctx.lineTo(this.rnd2x, this.rnd2y);\r\n\r\n //this.game.infoctx.lineTo(bx + (ex-bx)*0.33 -2 + Math.floor(Math.random() * 4), by + (ey-by)*0.33 - 2 + Math.floor(Math.random() * 4));\r\n //this.game.infoctx.lineTo(bx + (ex-bx)*0.66 -2 + Math.floor(Math.random() * 4), by + (ey-by)*0.66 - 2 + Math.floor(Math.random() * 4));\r\n\r\n //this.game.infoctx.lineTo(ex -2 + Math.floor(Math.random() * 4), ey - 2 + Math.floor(Math.random() * 4));\r\n \r\n this.game.infoctx.lineTo(ex, ey);\r\n this.game.infoctx.stroke();\r\n\r\n //smažu starou čáru\r\n this.game.ctx.globalCompositeOperation = 'destination-out';\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 3;\r\n this.game.ctx.moveTo(bx, by);\r\n this.game.ctx.lineTo(ex, ey);\r\n this.game.ctx.stroke();\r\n this.game.ctx.globalCompositeOperation = 'source-over';\r\n\r\n\r\n //nakreslím novou\r\n this.game.ctx.strokeStyle = gateColor;\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 3;\r\n this.game.ctx.moveTo(bx, by);\r\n this.game.ctx.lineTo(ex, ey);\r\n this.game.ctx.stroke();\r\n\r\n //počet breaků na vykreslovaném portálu je o jedno menší, než jeho adresa\r\n let lineBreaks = this.targetCode - 1;\r\n\r\n let partX = (this.rnd2x-this.rnd1x) / ((lineBreaks*2) +1);\r\n let partY = (this.rnd2y-this.rnd1y) / ((lineBreaks*2) +1);\r\n this.game.infoctx.strokeStyle = \"#000000\";\r\n //targetCode\r\n for(let part= 0; part< (lineBreaks*2)+1; part++)\r\n {\r\n //každý lichý blok\r\n if(part%2===1)\r\n {\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.lineWidth = 6;\r\n this.game.infoctx.moveTo(this.rnd1x+(partX*part), this.rnd1y+(partY*part));\r\n this.game.infoctx.lineTo(this.rnd1x+(partX*(part+1)), this.rnd1y+(partY*(part+1)));\r\n this.game.infoctx.stroke();\r\n }\r\n }\r\n\r\n\r\n if(this.displayArrows){\r\n \r\n //šipky\r\n this.game.infoctx.strokeStyle = \"#FFFFFF\";\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.lineWidth = 2;\r\n\r\n if(bx==ex){\r\n this.game.infoctx.moveTo(bx + this.arrowPosition , (by + ey)/2);\r\n this.game.infoctx.lineTo(bx + this.arrowPosition + 10, (by + ey)/2);\r\n this.game.infoctx.moveTo(bx + this.arrowPosition , (by + ey)/2);\r\n this.game.infoctx.lineTo(bx + this.arrowPosition + 5, (by + ey)/2 +3 );\r\n this.game.infoctx.moveTo(bx + this.arrowPosition , (by + ey)/2);\r\n this.game.infoctx.lineTo(bx + this.arrowPosition + 5, (by + ey)/2 -3);\r\n\r\n this.game.infoctx.moveTo(bx - this.arrowPosition , (by + ey)/2);\r\n this.game.infoctx.lineTo(bx - this.arrowPosition - 10, (by + ey)/2);\r\n this.game.infoctx.moveTo(bx - this.arrowPosition , (by + ey)/2);\r\n this.game.infoctx.lineTo(bx - this.arrowPosition - 5, (by + ey)/2 +3 );\r\n this.game.infoctx.moveTo(bx - this.arrowPosition , (by + ey)/2);\r\n this.game.infoctx.lineTo(bx - this.arrowPosition - 5, (by + ey)/2 -3);\r\n }\r\n else{\r\n this.game.infoctx.moveTo((bx + ex)/2, by + this.arrowPosition);\r\n this.game.infoctx.lineTo((bx + ex)/2, by + this.arrowPosition + 10);\r\n this.game.infoctx.moveTo((bx + ex)/2, by + this.arrowPosition);\r\n this.game.infoctx.lineTo((bx + ex)/2 +3, by + this.arrowPosition + 5);\r\n this.game.infoctx.moveTo((bx + ex)/2, by + this.arrowPosition);\r\n this.game.infoctx.lineTo((bx + ex)/2 -3, by + this.arrowPosition + 5);\r\n\r\n this.game.infoctx.moveTo((bx + ex)/2, by - this.arrowPosition);\r\n this.game.infoctx.lineTo((bx + ex)/2, by - this.arrowPosition - 10);\r\n this.game.infoctx.moveTo((bx + ex)/2, by - this.arrowPosition);\r\n this.game.infoctx.lineTo((bx + ex)/2 +3, by - this.arrowPosition - 5);\r\n this.game.infoctx.moveTo((bx + ex)/2, by - this.arrowPosition);\r\n this.game.infoctx.lineTo((bx + ex)/2 -3, by - this.arrowPosition - 5);\r\n }\r\n \r\n this.game.infoctx.stroke();\r\n }\r\n\r\n }\r\n\r\n this.game.infoctx.fillStyle = InfofillStyle;\r\n this.game.infoctx.strokeStyle = InfostrokeStyle;\r\n\r\n this.game.ctx.fillStyle = fillStyle;\r\n this.game.ctx.strokeStyle = strokeStyle;\r\n };\r\n\r\n}\r\n","import { greatColors, connectionType } from './Enums';\r\n\r\nexport default class Connection {\r\n\r\n constructor(game, bx, by, ex, ey, color, type){\r\n\r\n this.game = game;\r\n\r\n //vzdy menší hodnota, než má konec\r\n this.beginx = Math.floor(bx);\r\n this.beginy = Math.floor(by);\r\n\r\n //vždy vvětší hodnota, než má začátek\r\n this.endx = Math.floor(ex);\r\n this.endy = Math.floor(ey);\r\n \r\n //this.color = Math.floor(Math.random() * greatColors.length);\r\n this.color = color;\r\n this.type = type;\r\n \r\n //životnost\r\n this.connectionDuration = 500;\r\n\r\n }\r\n\r\n\r\n timeoutsProcess () {\r\n\r\n //odpočet pauzy brány\r\n if (this.connectionDuration > 0){\r\n this.connectionDuration -= this.game.delay;\r\n }\r\n\r\n };\r\n\r\n //update portálů\r\n update () {\r\n\r\n //zprocesuju odpočty\r\n this.timeoutsProcess();\r\n\r\n };\r\n\r\n //kreslení čáry při přesunu hráče\r\n draw () {\r\n\r\n let fillStyle = this.game.infoctx.fillStyle;\r\n let strokeStyle = this.game.infoctx.strokeStyle;\r\n\r\n //vykreslování bude jen v celých číselch (výpočet však bude v přesnějších)\r\n let bx = this.beginx;\r\n let by = this.beginy;\r\n\r\n let ex = this.endx;\r\n let ey = this.endy;\r\n\r\n if (this.connectionDuration > 0) {\r\n \r\n if(this.type === connectionType.PORTAL)\r\n {\r\n this.game.infoctx.strokeStyle = greatColors[this.color];\r\n this.game.infoctx.lineWidth = 2;\r\n }\r\n else\r\n {\r\n this.game.infoctx.strokeStyle = \"#22222288\";\r\n //this.game.infoctx.setLineDash([5, 15]);\r\n this.game.infoctx.lineWidth = 5;\r\n }\r\n\r\n //exploze pouze v info canvasu\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.moveTo(bx, by);\r\n this.game.infoctx.lineTo(ex, ey);\r\n this.game.infoctx.stroke();\r\n }\r\n\r\n this.game.infoctx.fillStyle = fillStyle;\r\n this.game.infoctx.strokeStyle = strokeStyle;\r\n };\r\n\r\n}\r\n","import { greatColors, zoneType, orientation } from './Enums';\r\n\r\nexport default class SpecialZone {\r\n\r\n constructor(game, permanent, type, duration, id){\r\n\r\n this.game = game;\r\n //typ zóny\r\n this.type = type;\r\n //identifikátor, pro hledání jiné zóny, než ta o kterou se zrovna jedná\r\n this.id = id;\r\n\r\n this.greatColor = Math.floor(Math.random() * greatColors.length);\r\n this.color = '#FFFFFF77';\r\n \r\n //nezničitelný\r\n this.permanent = permanent;\r\n\r\n //bylo vymazáno před vložením\r\n this.cleared = false;\r\n\r\n //životnost, pokud duration klesne k 0, rozhodnu o smazání\r\n this.durationDefault = duration;\r\n this.duration = this.durationDefault;\r\n this.toErase = false;\r\n\r\n this.toSwitch = 5000;\r\n this.toSwitchDefault = 5000;\r\n this.switch = false;\r\n\r\n\r\n //přesunu a upravím velikost dle typu\r\n this.moveAway();\r\n }\r\n\r\n //přesunutí zóny na nové místo\r\n moveAway(){\r\n \r\n let bottomHudsHeight = this.game.getBottomHudsHeight();\r\n let canvasWidth = this.game.canvas.width;\r\n let canvasHeight = this.game.canvas.height - bottomHudsHeight;\r\n\r\n let colide = true;\r\n let cycles = 0;\r\n let boxAdd = 150;\r\n\r\n while(colide === true){\r\n\r\n cycles++;\r\n if(cycles> 10 && boxAdd >=10)\r\n {\r\n //po deseti pokusech začnu box zmenšovat, celkem 30 cyklů do nuly\r\n boxAdd-=10;\r\n }\r\n\r\n if(cycles> 100)\r\n {\r\n //nelze umístit smažu jej\r\n this.toErase = true;\r\n console.log('mažu zónu, příliš malá plocha pro její umístění ' + this.type);\r\n break;\r\n }\r\n\r\n //střed \r\n this.x = Math.floor(Math.random() * canvasWidth);\r\n this.y = Math.floor(Math.random() * canvasHeight);\r\n\r\n this.baseWidth = Math.floor(boxAdd + Math.random() * 100);\r\n this.baseHeight = Math.floor(boxAdd + Math.random() * 100);\r\n\r\n let borderSpacer = 0;\r\n\r\n\r\n if(this.type !== zoneType.ERASER){\r\n \r\n //větší mezera od okraje\r\n borderSpacer = 60;\r\n }\r\n\r\n if(this.type === zoneType.SNAKEU || this.type === zoneType.SNAKED)\r\n {\r\n //pevná velikost\r\n this.baseWidth = 80;\r\n this.baseHeight = 250;\r\n }\r\n\r\n if(this.type === zoneType.SPEEDTUNNEL)\r\n {\r\n //pevná velikost\r\n this.baseWidth = 200;\r\n this.baseHeight = 160;\r\n }\r\n\r\n if(this.type === zoneType.ROTODEATHR || this.type === zoneType.ROTODEATHL )\r\n {\r\n //pevná velikost\r\n this.baseWidth = 260;\r\n this.baseHeight = 60;\r\n }\r\n\r\n if(this.type === zoneType.HEARTH)\r\n {\r\n //pevná velikost\r\n this.baseWidth = 140;\r\n this.baseHeight = 140;\r\n }\r\n\r\n if(this.type === zoneType.MAZE)\r\n {\r\n //pevná velikost\r\n this.baseWidth = 140;\r\n this.baseHeight = 140;\r\n }\r\n\r\n if(this.type === zoneType.MONKEY)\r\n {\r\n //pevná velikost\r\n this.baseWidth = 240;\r\n this.baseHeight = 200;\r\n }\r\n\r\n if(this.type === zoneType.OWL)\r\n {\r\n //pevná velikost\r\n this.baseWidth = 160;\r\n this.baseHeight = 160;\r\n }\r\n\r\n if(this.type === zoneType.RABBIT)\r\n {\r\n //pevná velikost\r\n this.baseWidth = 160;\r\n this.baseHeight = 120;\r\n }\r\n\r\n if(this.type === zoneType.KILLER)\r\n {\r\n //pevná velikost\r\n this.baseWidth = 60;\r\n this.baseHeight = 60;\r\n }\r\n\r\n let presahXdoprava = (this.x + this.baseWidth/2) - (canvasWidth - (5+borderSpacer));\r\n //upravíme aby nebylo mimo hřiště\r\n if(presahXdoprava > 0){\r\n this.x -= presahXdoprava;\r\n }\r\n\r\n let presahXdoleva = (this.x - this.baseWidth/2) - (5+borderSpacer);\r\n //upravíme aby nebylo mimo hřiště\r\n if(presahXdoleva < 0){\r\n this.x -= presahXdoleva;\r\n }\r\n\r\n let presahYdolu = (this.y + this.baseHeight/2) - (canvasHeight - (borderSpacer));\r\n //upravíme aby nebylo mimo hřiště\r\n if(presahYdolu > 0){\r\n this.y -= presahYdolu;\r\n }\r\n\r\n let presahYnahoru = (this.y - this.baseHeight/2) - (5+borderSpacer);\r\n //upravíme aby nebylo mimo hřiště\r\n if(presahYnahoru < 0){\r\n this.y -= presahYnahoru;\r\n }\r\n\r\n\r\n this.width = this.baseWidth;\r\n this.height = this.baseHeight;\r\n\r\n this.previousWidth = this.baseWidth;\r\n this.previousHeight = this.baseHeight\r\n\r\n\r\n let playerColide = false;\r\n let portalColide = false;\r\n let zoneColide = this.game.findZoneZoneColision(this.x-10,this.y-10,this.baseWidth+20,this.baseHeight+20, this.id);\r\n \r\n if(this.type !== zoneType.ERASER)\r\n {\r\n //pokud nejde o danger kontroluju i kolizi s hráčem\r\n playerColide = this.game.findPlayerColision(this.x,this.y,this.baseWidth,this.baseHeight);\r\n portalColide = this.game.findPortalColision(this.x,this.y,this.baseWidth,this.baseHeight);\r\n }\r\n\r\n //generuju znova pokud koliduje kterákoliv možnost\r\n colide = zoneColide || playerColide || portalColide;\r\n }\r\n\r\n if(this.type === zoneType.SNAKEU)\r\n {\r\n //portál\r\n this.game.addPortal(this.x - 20, this.y - 125, this.x + 20, this.y - 125, orientation.HORIZONTAL, false, 100000, 0 );\r\n\r\n //bonus\r\n this.game.addBonusPoint(this.x,this.y + 100, false, 120000, 3, 0, 0);\r\n }\r\n\r\n if(this.type === zoneType.SNAKED)\r\n {\r\n //portál\r\n this.game.addPortal(this.x - 20, this.y + 125, this.x + 20, this.y + 125, orientation.HORIZONTAL, false, 100000, 0 );\r\n\r\n //bonus\r\n this.game.addBonusPoint(this.x,this.y - 100, false, 120000, 3, 0, 0);\r\n } \r\n\r\n if(this.type === zoneType.SPEEDTUNNEL)\r\n {\r\n //portál\r\n this.game.addPortal(this.x - 100, this.y -78, this.x - 100, this.y - 42, orientation.VERTICAL, false, 100000, 0 );\r\n\r\n //bonus\r\n this.game.addBonusPoint(this.x - 60,this.y - 60, false, 120000, 3, 0, 0);\r\n\r\n }\r\n\r\n \r\n if(this.type === zoneType.ROTODEATHR)\r\n {\r\n //portál\r\n this.game.addPortal(this.x + 130, this.y -20, this.x + 130, this.y + 20, orientation.VERTICAL, false, 100000, 0 );\r\n\r\n //bonus\r\n this.game.addBonusPoint(this.x - 110,this.y , false, 120000, 3, 0, 0);\r\n\r\n //test rotátoru\r\n this.game.addRotator(this.x, this.y, 26, false, 120000);\r\n }\r\n\r\n\r\n if(this.type === zoneType.ROTODEATHL)\r\n {\r\n //portál\r\n this.game.addPortal(this.x - 130, this.y -20, this.x - 130, this.y + 20, orientation.VERTICAL, false, 100000, 0 );\r\n\r\n //bonus\r\n this.game.addBonusPoint(this.x + 110,this.y , false, 120000, 3, 0, 0);\r\n\r\n //test rotátoru\r\n this.game.addRotator(this.x, this.y, 26, false, 120000);\r\n }\r\n\r\n\r\n\r\n if(this.type === zoneType.HEARTH)\r\n {\r\n //portál\r\n this.game.addPortal(this.x -20, this.y +70, this.x +20, this.y + 70, orientation.HORIZONTAL, false, 100000, 0 );\r\n\r\n //bonus\r\n this.game.addBonusPoint(this.x, this.y , false, 120000, 3, 0, 0);\r\n }\r\n\r\n if(this.type === zoneType.MAZE)\r\n {\r\n //bonus\r\n this.game.addBonusPoint(this.x, this.y , false, 120000, 3, 0, 0);\r\n }\r\n\r\n if(this.type === zoneType.MONKEY)\r\n {\r\n //portál\r\n this.game.addPortal(this.x -40, this.y +60, this.x, this.y + 60, orientation.HORIZONTAL, false, 100000, 0 );\r\n\r\n //bonus\r\n this.game.addBonusPoint(this.x+20, this.y-80 , false, 120000, 1, 0, 0);\r\n this.game.addBonusPoint(this.x-20, this.y-80 , false, 120000, 1, 0, 0);\r\n\r\n this.game.addBonusPoint(this.x+100, this.y+80 , false, 120000, 1, 0, 0);\r\n this.game.addBonusPoint(this.x-100, this.y+80 , false, 120000, 1, 0, 0);\r\n }\r\n\r\n if(this.type === zoneType.OWL)\r\n {\r\n //portál\r\n this.game.addPortal(this.x -20, this.y +80, this.x + 20, this.y + 80, orientation.HORIZONTAL, false, 100000, 0 );\r\n\r\n //bonus\r\n this.game.addBonusPoint(this.x+20, this.y-50 , false, 120000, 2, 0, 0);\r\n this.game.addBonusPoint(this.x-20, this.y-50 , false, 120000, 2, 0, 0);\r\n }\r\n\r\n\r\n if(this.type === zoneType.RABBIT)\r\n {\r\n //portál\r\n this.game.addPortal(this.x +80, this.y+10, this.x + 80, this.y + 40, orientation.VERTICAL, false, 100000, 0 );\r\n\r\n //bonus\r\n this.game.addBonusPoint(this.x-65, this.y-25 , false, 120000, 3, 0, 0);\r\n \r\n }\r\n\r\n \r\n if(this.type === zoneType.KILLER)\r\n {\r\n if (Math.floor(Math.random() * 2)===0)\r\n {\r\n //energie\r\n this.game.addBonusPoint(this.x,this.y, false, 30000, 0, 1, 0);\r\n }\r\n else\r\n {\r\n //bonus\r\n this.game.addBonusPoint(this.x, this.y , false, 30000, 2, 0, 0);\r\n }\r\n }\r\n\r\n };\r\n\r\n\r\n\r\n timeoutsProcess () {\r\n\r\n //odpočet životnosti zóny\r\n if (this.duration > 0){\r\n this.duration -= this.game.delay;\r\n }\r\n\r\n //přepínač killera\r\n if(this.type === zoneType.KILLER)\r\n {\r\n if (this.toSwitch > 0){\r\n this.toSwitch -= this.game.delay;\r\n }\r\n else{\r\n this.toSwitch = this.toSwitchDefault;\r\n this.switch = !this.switch;\r\n }\r\n }\r\n\r\n //SNAKE - do odstranění\r\n if(this.type !== zoneType.ERASER)\r\n {\r\n if(this.duration <= 0)\r\n {\r\n //doba vypršela změníme na ganger, což jej smaže\r\n this.type = zoneType.ERASER;\r\n }\r\n\r\n }\r\n\r\n //ERASER - zmenšování\r\n if(this.type === zoneType.ERASER)\r\n {\r\n //výbuchy\r\n if ( this.duration <= 0){\r\n\r\n //zmenšování\r\n let speed = 1;\r\n\r\n if(this.width <= 1 || this.height <=1)\r\n {\r\n speed = 6;\r\n }\r\n\r\n if(this.width - this.game.movestep * speed * 2 > 1)\r\n {\r\n this.width -= this.game.movestep * speed * 2;\r\n }\r\n else\r\n {\r\n this.width = 1;\r\n }\r\n\r\n if(this.height - this.game.movestep * speed * 2 > 1)\r\n {\r\n this.height -= this.game.movestep * speed * 2;\r\n }\r\n else\r\n {\r\n this.height = 1;\r\n }\r\n }\r\n }\r\n };\r\n\r\n //update portálů\r\n update () {\r\n\r\n //přesuny zóny\r\n if (this.width <= 1 && this.height <= 1)\r\n {\r\n if(this.permanent === true)\r\n {\r\n //přesunu\r\n this.moveAway();\r\n //reset počítadla pro zmenšování\r\n this.duration = this.durationDefault;\r\n }\r\n else\r\n {\r\n //smažu\r\n this.toErase = true;\r\n }\r\n }\r\n\r\n //zprocesuju odpočty\r\n this.timeoutsProcess();\r\n };\r\n\r\n //kreslení portálů\r\n draw () {\r\n\r\n let fillStyle = this.game.ctx.fillStyle;\r\n let strokeStyle = this.game.ctx.strokeStyle;\r\n\r\n //vzdy menší hodnota, než má konec\r\n this.beginx = Math.floor(this.x - this.width/2);\r\n this.beginy = Math.floor(this.y - this.height/2);\r\n\r\n //vždy vvětší hodnota, než má začátek\r\n this.endx = Math.floor(this.width);\r\n this.endy = Math.floor(this.height);\r\n\r\n if(this.type !== zoneType.ERASER){\r\n \r\n //pokud nejde o nebezpečí, na začátku smažu\r\n if(this.cleared === false)\r\n {\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.beginx - 20, this.beginy - 20 , this.endx + 40, this.endy + 40);\r\n\r\n this.cleared = true;\r\n }\r\n\r\n //odpočet\r\n this.game.infoctx.textAlign = \"center\";\r\n this.game.infoctx.fillStyle = \"#ffffff33\";\r\n this.game.infoctx.font = \"30px expansivabold\";\r\n this.game.infoctx.fillText((this.duration/1000).toFixed(0), this.x, this.y+10);\r\n\r\n //zakázaná oblast\r\n this.game.ctx.fillStyle = \"#777777FF\";\r\n this.game.ctx.strokeStyle = \"#777777FF\";\r\n \r\n\r\n //blikání před změnama\r\n if(this.type === zoneType.KILLER && this.toSwitch > 500 && this.toSwitch < 1000){\r\n //zakázaná oblast\r\n this.game.ctx.fillStyle = \"#FFFFFFFF\";\r\n this.game.ctx.strokeStyle = \"#FFFFFFFF\";\r\n }\r\n\r\n //kolizní bílá linka\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.strokeRect(this.beginx, this.beginy , this.endx, this.endy);\r\n }\r\n\r\n\r\n if(this.type === zoneType.SPEEDTUNNEL)\r\n {\r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.beginx -1 , this.beginy +121 , 2 , 38);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.beginx -1 , this.beginy + 1 , 2 , 38);\r\n\r\n //rozděluju\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.beginx, this.y - 40);\r\n this.game.ctx.lineTo(this.beginx + 160, this.y - 40);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.beginx + 40, this.y);\r\n this.game.ctx.lineTo(this.beginx + 200, this.y);\r\n this.game.ctx.stroke(); \r\n \r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.beginx, this.y + 40);\r\n this.game.ctx.lineTo(this.beginx + 160, this.y + 40);\r\n this.game.ctx.stroke();\r\n }\r\n\r\n\r\n if(this.type === zoneType.SNAKEU)\r\n { \r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x -20 , this.y -126 , 40 , 2);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-40, this.y - 50);\r\n this.game.ctx.lineTo(this.x+10, this.y - 50);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x -10, this.y + 50);\r\n this.game.ctx.lineTo(this.x + 40, this.y + 50);\r\n this.game.ctx.stroke();\r\n }\r\n\r\n if(this.type === zoneType.SNAKED)\r\n { \r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x -20 , this.y +124 , 40 , 2);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x -10, this.y - 50);\r\n this.game.ctx.lineTo(this.x +40, this.y - 50);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x -40, this.y + 50);\r\n this.game.ctx.lineTo(this.x +10, this.y + 50);\r\n this.game.ctx.stroke();\r\n }\r\n\r\n\r\n\r\n\r\n if(this.type === zoneType.ROTODEATHR)\r\n {\r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x + 129 , this.y -20 , 2 , 40);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x - 80, this.y);\r\n this.game.ctx.lineTo(this.x + 60, this.y);\r\n this.game.ctx.stroke();\r\n }\r\n\r\n if(this.type === zoneType.ROTODEATHL)\r\n {\r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 131 , this.y -20 , 2 , 40);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x - 80, this.y);\r\n this.game.ctx.lineTo(this.x + 60, this.y);\r\n this.game.ctx.stroke();\r\n }\r\n\r\n\r\n if(this.type === zoneType.HEARTH)\r\n {\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.strokeRect(this.x - 35, this.y -35 , 70, 70);\r\n\r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 20 , this.y +69 , 40 , 2);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 20 , this.y -36 , 40 , 2);\r\n }\r\n\r\n\r\n if(this.type === zoneType.MAZE)\r\n {\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.strokeRect(this.x - 50, this.y -50 , 100, 100);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.strokeRect(this.x - 30, this.y -30 , 60, 60);\r\n\r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 71 , this.y -10 , 2 , 20);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x + 69 , this.y -10 , 2 , 20);\r\n\r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 10 , this.y -51 , 20 , 2);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 10 , this.y +49 , 20 , 2);\r\n\r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 31 , this.y -10 , 2 , 20);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x + 29 , this.y -10 , 2 , 20);\r\n\r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.strokeRect(this.x - 12 , this.y -10 , 0 , 20);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.strokeRect(this.x + 12 , this.y -10 , 0 , 20);\r\n \r\n }\r\n\r\n if(this.type === zoneType.MONKEY)\r\n {\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n\r\n //vertikální\r\n //stred\r\n this.game.ctx.moveTo(this.x,this.y-80);\r\n this.game.ctx.lineTo(this.x,this.y);\r\n this.game.ctx.stroke();\r\n //spodni stred\r\n this.game.ctx.moveTo(this.x,this.y+60);\r\n this.game.ctx.lineTo(this.x,this.y+100);\r\n this.game.ctx.stroke();\r\n\r\n //spodni mantinely\r\n this.game.ctx.moveTo(this.x+40,this.y+20);\r\n this.game.ctx.lineTo(this.x+40,this.y+60);\r\n this.game.ctx.stroke();\r\n \r\n this.game.ctx.moveTo(this.x-40,this.y+20);\r\n this.game.ctx.lineTo(this.x-40,this.y+60);\r\n this.game.ctx.stroke();\r\n\r\n //horní mantinely\r\n this.game.ctx.moveTo(this.x+40,this.y-100);\r\n this.game.ctx.lineTo(this.x+40,this.y-60);\r\n this.game.ctx.stroke();\r\n \r\n this.game.ctx.moveTo(this.x-40,this.y-100);\r\n this.game.ctx.lineTo(this.x-40,this.y-60);\r\n this.game.ctx.stroke();\r\n\r\n //boční mantinely\r\n this.game.ctx.moveTo(this.x+80,this.y-60);\r\n this.game.ctx.lineTo(this.x+80,this.y+100);\r\n this.game.ctx.stroke();\r\n \r\n this.game.ctx.moveTo(this.x-80,this.y-60);\r\n this.game.ctx.lineTo(this.x-80,this.y+100);\r\n this.game.ctx.stroke();\r\n\r\n //vertikální\r\n this.game.ctx.moveTo(this.x-40,this.y+20);\r\n this.game.ctx.lineTo(this.x+40,this.y+20);\r\n this.game.ctx.stroke();\r\n \r\n this.game.ctx.moveTo(this.x-80,this.y-10);\r\n this.game.ctx.lineTo(this.x-40,this.y-10);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.moveTo(this.x+40,this.y-10);\r\n this.game.ctx.lineTo(this.x+80,this.y-10);\r\n this.game.ctx.stroke();\r\n\r\n }\r\n\r\n if(this.type === zoneType.OWL)\r\n {\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n\r\n //smazu rohy pravy horni\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x + 41 , this.y -81 , 40 , 2);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x + 79 , this.y -80 , 2 , 39);\r\n\r\n //smazu rohy levy horni\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 81 , this.y -81 , 40 , 2);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 81 , this.y -80 , 2 , 39);\r\n\r\n //smazu rohy pravy dolni\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x + 79 , this.y +61 , 2 , 39);\r\n\r\n //smazu rohy levy dolni\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 81 , this.y +61 , 2 , 39);\r\n\r\n //dolni linka\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 81 , this.y +79 , 160 , 2);\r\n\r\n //brisko\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.strokeRect(this.x - 20, this.y -20 , 40, 60);\r\n\r\n //vertikální\r\n //stred\r\n this.game.ctx.moveTo(this.x,this.y-40);\r\n this.game.ctx.lineTo(this.x,this.y-20);\r\n this.game.ctx.stroke();\r\n\r\n //pravy roh\r\n this.game.ctx.moveTo(this.x+40,this.y-80);\r\n this.game.ctx.lineTo(this.x+40,this.y-40);\r\n this.game.ctx.lineTo(this.x+80,this.y-40);\r\n this.game.ctx.stroke();\r\n\r\n //levy roh\r\n this.game.ctx.moveTo(this.x-40,this.y-80);\r\n this.game.ctx.lineTo(this.x-40,this.y-40);\r\n this.game.ctx.lineTo(this.x-80,this.y-40);\r\n this.game.ctx.stroke();\r\n\r\n //dole\r\n //pravy roh\r\n this.game.ctx.moveTo(this.x+20,this.y+80);\r\n this.game.ctx.lineTo(this.x+20,this.y+60);\r\n this.game.ctx.lineTo(this.x+80,this.y+60);\r\n this.game.ctx.stroke();\r\n\r\n //levy roh\r\n this.game.ctx.moveTo(this.x-20,this.y+80);\r\n this.game.ctx.lineTo(this.x-20,this.y+60);\r\n this.game.ctx.lineTo(this.x-80,this.y+60);\r\n this.game.ctx.stroke();\r\n\r\n //bludiste napravo\r\n this.game.ctx.moveTo(this.x+20,this.y-20);\r\n this.game.ctx.lineTo(this.x+60,this.y-20);\r\n this.game.ctx.lineTo(this.x+60,this.y+40);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.moveTo(this.x+40,this.y);\r\n this.game.ctx.lineTo(this.x+40,this.y+60);\r\n this.game.ctx.stroke();\r\n\r\n //bludiste nalevo\r\n this.game.ctx.moveTo(this.x-20,this.y-20);\r\n this.game.ctx.lineTo(this.x-60,this.y-20);\r\n this.game.ctx.lineTo(this.x-60,this.y+40);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.moveTo(this.x-40,this.y);\r\n this.game.ctx.lineTo(this.x-40,this.y+60);\r\n this.game.ctx.stroke();\r\n }\r\n\r\n\r\n if(this.type === zoneType.RABBIT)\r\n {\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n\r\n\r\n //mazání okrajů\r\n //pravy horni\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x + 41 , this.y -61 , 40 , 2);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x + 79 , this.y -60 , 2 , 120);\r\n\r\n //pravy spodni\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x + 61 , this.y +59 , 40 , 2);\r\n\r\n //smazu rohy levy horni\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 80 , this.y -61 , 19 , 2);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 81 , this.y -61 , 2 , 20);\r\n\r\n //smazu nad tapkou\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 81 , this.y+1 , 2 , 18);\r\n\r\n\r\n\r\n //horizontální\r\n //hlavicka\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-80,this.y-40);\r\n this.game.ctx.lineTo(this.x-60,this.y-40);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-40,this.y-40);\r\n this.game.ctx.lineTo(this.x+20,this.y-40);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-20,this.y-20);\r\n this.game.ctx.lineTo(this.x+60,this.y-20);\r\n this.game.ctx.stroke();\r\n\r\n //stred\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-80,this.y);\r\n this.game.ctx.lineTo(this.x-60,this.y);\r\n this.game.ctx.stroke();\r\n \r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-40,this.y);\r\n this.game.ctx.lineTo(this.x+40,this.y);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x+60,this.y+10);\r\n this.game.ctx.lineTo(this.x+80,this.y+10);\r\n this.game.ctx.stroke(); \r\n\r\n //pod stredem\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-80,this.y+20);\r\n this.game.ctx.lineTo(this.x-60,this.y+20);\r\n this.game.ctx.stroke();\r\n \r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-20,this.y+20);\r\n this.game.ctx.lineTo(this.x+20,this.y+20);\r\n this.game.ctx.stroke();\r\n\r\n //dole\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-60,this.y+40);\r\n this.game.ctx.lineTo(this.x-40,this.y+40);\r\n this.game.ctx.stroke();\r\n \r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x,this.y+40);\r\n this.game.ctx.lineTo(this.x+40,this.y+40);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x+60,this.y+40);\r\n this.game.ctx.lineTo(this.x+80,this.y+40);\r\n this.game.ctx.stroke();\r\n\r\n\r\n //vertikální\r\n //cumak\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-60,this.y-60);\r\n this.game.ctx.lineTo(this.x-60,this.y-40);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-60,this.y);\r\n this.game.ctx.lineTo(this.x-60,this.y+20);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-40,this.y-40);\r\n this.game.ctx.lineTo(this.x-40,this.y+40);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x-20,this.y+20);\r\n this.game.ctx.lineTo(this.x-20,this.y+60);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x+40,this.y-60);\r\n this.game.ctx.lineTo(this.x+40,this.y-20);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x+40,this.y);\r\n this.game.ctx.lineTo(this.x+40,this.y+40);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x+60,this.y-20);\r\n this.game.ctx.lineTo(this.x+60,this.y+10);\r\n this.game.ctx.stroke();\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.moveTo(this.x+60,this.y+40);\r\n this.game.ctx.lineTo(this.x+60,this.y+60);\r\n this.game.ctx.stroke();\r\n }\r\n\r\n if(this.type === zoneType.KILLER)\r\n {\r\n if(this.switch){\r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 31 , this.y -15 , 2 , 30);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x + 29 , this.y -15 , 2 , 30); \r\n\r\n //mažu linky okolo (aby to bylo krásné)\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 15 , this.y -33 , 30 , 2);\r\n this.game.ctx.clearRect(this.x - 15 , this.y -29 , 30 , 2);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 15 , this.y +31 , 30 , 2); \r\n this.game.ctx.clearRect(this.x - 15 , this.y +27 , 30 , 2); \r\n }\r\n else{ \r\n //mažu otvory\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 15 , this.y -31 , 30 , 2);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 15 , this.y +29 , 30 , 2); \r\n\r\n //mažu linky okolo (aby to bylo krásné)\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x - 33 , this.y -15 , 2 , 30);\r\n this.game.ctx.clearRect(this.x - 29 , this.y -15 , 2 , 30);\r\n\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.clearRect(this.x + 31 , this.y -15 , 2 , 30); \r\n this.game.ctx.clearRect(this.x + 27 , this.y -15 , 2 , 30);\r\n }\r\n }\r\n\r\n //mazající se zóna\r\n if(this.type === zoneType.ERASER){\r\n\r\n\r\n if(this.duration > 0)\r\n {\r\n this.game.infoctx.textAlign = \"center\";\r\n this.game.infoctx.fillStyle = \"#ffffff33\";\r\n this.game.infoctx.font = \"30px expansivabold\";\r\n this.game.infoctx.fillText((this.duration/1000).toFixed(0), this.x, this.y+10);\r\n \r\n //zakázaná oblast\r\n this.game.infoctx.lineWidth = 2;\r\n this.game.infoctx.strokeStyle = \"#FFFFFF20\";\r\n this.game.infoctx.strokeRect(this.beginx, this.beginy , this.endx, this.endy); \r\n }\r\n else\r\n {\r\n //smazání předchozího obdelníku\r\n //vzdy menší hodnota, než má konec\r\n let prevBeginx = Math.floor(this.x - this.previousWidth/2);\r\n let prevBeginy = Math.floor(this.y - this.previousHeight/2);\r\n\r\n //vždy vvětší hodnota, než má začátek\r\n let prevEndx = Math.floor(this.previousWidth);\r\n let prevEndy = Math.floor(this.previousHeight);\r\n\r\n\r\n //mazací obdelník předchozích rozměrů\r\n this.game.ctx.strokeStyle = \"#FF0000FF\";\r\n this.game.ctx.globalCompositeOperation = 'destination-out';\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 4;\r\n this.game.ctx.strokeRect(prevBeginx, prevBeginy , prevEndx, prevEndy);\r\n this.game.ctx.globalCompositeOperation = 'source-over';\r\n\r\n\r\n //pokud to má ještě rozměr, kreslím menší okno\r\n if(this.width >1 || this.height >1)\r\n {\r\n\r\n //zakázaná oblast\r\n this.game.infoctx.fillStyle = \"#999999FF\";\r\n this.game.infoctx.strokeStyle = \"#666666FF\";\r\n \r\n\r\n if(this.width >35 && this.height >35)\r\n {\r\n this.game.infoctx.lineWidth = 2;\r\n //vykřičník\r\n this.game.infoctx.textAlign = \"center\";\r\n this.game.infoctx.font = \"25px expansivabold\";\r\n this.game.infoctx.fillText(\"!\", this.x+1, this.y+13);\r\n\r\n //trojuhelnik\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.moveTo(this.x,this.y+15);\r\n this.game.infoctx.lineTo(this.x-15,this.y+15);\r\n this.game.infoctx.lineTo(this.x,this.y-15);\r\n this.game.infoctx.lineTo(this.x+15,this.y+15);\r\n this.game.infoctx.lineTo(this.x,this.y+15);\r\n this.game.infoctx.stroke();\r\n }\r\n\r\n\r\n //viditelná bílá linka\r\n this.game.infoctx.beginPath();\r\n \r\n this.game.infoctx.lineWidth = 2;\r\n this.game.infoctx.strokeRect(this.beginx, this.beginy , this.endx, this.endy);\r\n \r\n //kolizní bílá linka\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = 2;\r\n this.game.ctx.strokeRect(this.beginx, this.beginy , this.endx, this.endy);\r\n \r\n //odložíme to co jsme kreslili naposled\r\n this.previousWidth = this.width;\r\n this.previousHeight = this.height;\r\n }\r\n }\r\n }\r\n\r\n this.game.ctx.fillStyle = fillStyle;\r\n this.game.ctx.strokeStyle = strokeStyle;\r\n };\r\n\r\n}\r\n","import { greatColors, explosionType } from './Enums';\r\nimport { clearCircle } from './Support'\r\n\r\nexport default class Explosion {\r\n\r\n\r\n //smer: 0- nahoru, 1-doprava, 2-dolu, 3-doleva\r\n constructor(game, x,y, greatColor, type, smer, speed, team){\r\n\r\n this.game = game;\r\n\r\n this.x = Math.floor(x);\r\n this.y = Math.floor(y);\r\n \r\n //this.color = Math.floor(Math.random() * greatColors.length);\r\n this.greatColor = greatColor;\r\n \r\n //životnost\r\n this.expansionDefault = 100;\r\n this.duration = 700;\r\n this.durationDefault = 700;\r\n\r\n this.nextLineTime = 0;\r\n\r\n this.explosion =false;\r\n\r\n this.bonusDropped = false;\r\n\r\n //typ exploze\r\n this.type = type;\r\n\r\n //vlastnosti z vozítka\r\n this.smer = smer;\r\n this.speed = speed;\r\n\r\n //posuv efektu dle smeru\r\n this.speedDiameter = 0;\r\n\r\n //pro pozice čar exploze (max 10)\r\n this.partsArray =[];\r\n\r\n //team toho kdo explodoval\r\n this.team = team;\r\n }\r\n\r\n\r\n timeoutsProcess () {\r\n\r\n //odpočet životnosti zóny\r\n if (this.duration > 0){\r\n this.duration -= this.game.delay;\r\n }\r\n\r\n //pro linky\r\n this.nextLineTime += this.game.delay;\r\n \r\n if(this.duration <= 0 && this.type === explosionType.PLAYER)\r\n {\r\n if(this.bonusDropped === false)\r\n {\r\n //vypadne bonus 10s\r\n this.game.addBonusPoint(this.x,this.y, false, 10000, 1, 0, this.team);\r\n this.bonusDropped = true;\r\n }\r\n }\r\n };\r\n\r\n //update portálů\r\n update () {\r\n\r\n //zprocesuju odpočty\r\n this.timeoutsProcess();\r\n\r\n };\r\n\r\n //kreslení explozí\r\n drawPlayerExplosion(){\r\n\r\n //vymazání kruhu\r\n\r\n if(this.duration>=0)\r\n {\r\n //exploze pouze v info canvasu\r\n this.game.infoctx.fillStyle = greatColors[this.greatColor];\r\n this.game.infoctx.strokeStyle = greatColors[this.greatColor];\r\n\r\n //expansionDefault\r\n let plus = (this.durationDefault - this.duration)* 0.1;\r\n \r\n if(plus > 9)\r\n plus = 9;\r\n\r\n let diameter = 30 / 81 * plus * plus;\r\n\r\n\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.arc(this.x, this.y, 7, 0, 2 * Math.PI);\r\n this.game.infoctx.fill();\r\n\r\n\r\n this.game.infoctx.filter = \"blur(10px)\";\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.lineWidth = 4;\r\n this.game.infoctx.arc(this.x, this.y, diameter*0.9, 0, 2 * Math.PI);\r\n this.game.infoctx.stroke();\r\n this.game.infoctx.filter = \"none\";\r\n\r\n\r\n\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.lineWidth = 4;\r\n this.game.infoctx.arc(this.x, this.y, diameter, 0, 2 * Math.PI);\r\n this.game.infoctx.stroke();\r\n\r\n\r\n\r\n let stepAmount = this.speed * this.game.movestep;\r\n\r\n //úprava nové pozice\r\n //smer: 0- nahoru, 1-doprava, 2-dolu, 3-doleva\r\n this.speedDiameter += stepAmount;\r\n\r\n this.game.infoctx.strokeStyle = greatColors[this.greatColor];\r\n this.game.infoctx.lineWidth = 0.5;\r\n \r\n this.game.infoctx.beginPath(); \r\n this.game.infoctx.lineWidth = 1;\r\n this.game.infoctx.arc(this.x, this.y, this.speedDiameter, 0, 2 * Math.PI);\r\n this.game.infoctx.stroke();\r\n\r\n //this.game.ctx.clearRect(x - 16, y - 16, 32, 32);\r\n //pokus o kruhové mazání\r\n clearCircle(this.game.ctx, this.x, this.y, 40);\r\n\r\n this.explosion = false;\r\n }\r\n }\r\n\r\n //kreslení explozí\r\n drawEffectExplosion(){\r\n\r\n //vymazání kruhu\r\n\r\n if(this.duration>=0)\r\n {\r\n //exploze pouze v info canvasu\r\n this.game.infoctx.fillStyle = greatColors[this.greatColor];\r\n this.game.infoctx.strokeStyle = greatColors[this.greatColor];\r\n\r\n //this.game.ctx.clearRect(x - 16, y - 16, 32, 32);\r\n //pokus o kruhové mazání\r\n clearCircle(this.game.ctx, this.x, this.y, 40);\r\n\r\n this.explosion = false;\r\n }\r\n }\r\n\r\n\r\n\r\n //kreslení explozí\r\n draw () {\r\n\r\n let fillStyle = this.game.ctx.fillStyle;\r\n let strokeStyle = this.game.ctx.strokeStyle;\r\n\r\n\r\n if(this.type === explosionType.PLAYER){\r\n\r\n this.drawPlayerExplosion();\r\n }\r\n\r\n if(this.type === explosionType.CLEAR){\r\n\r\n this.drawEffectExplosion();\r\n }\r\n\r\n \r\n\r\n this.game.ctx.fillStyle = fillStyle;\r\n this.game.ctx.strokeStyle = strokeStyle;\r\n };\r\n\r\n}\r\n","// import { greatColors } from './Enums';\r\n\r\nexport default class BonusPoint {\r\n\r\n constructor(game, x, y, permanent , duration, score, energy, id, team){\r\n\r\n this.game = game;\r\n\r\n //vzdy menší hodnota, než má konec\r\n this.x = Math.floor(x);\r\n this.y = Math.floor(y);\r\n \r\n this.color = \"#FF8C00\";\r\n\r\n if(score === 1)\r\n {\r\n this.color = \"#00FF00\";\r\n }\r\n\r\n if(score === 3)\r\n {\r\n this.color = \"#ffe119\";\r\n }\r\n\r\n if(energy > 0)\r\n {\r\n this.color = \"#e7e4f9\";\r\n }\r\n\r\n\r\n //odměna\r\n this.score = score;\r\n this.energy = energy;\r\n \r\n //životnost\r\n this.duration = duration;\r\n //doba kdy se spouští efekt zebrání\r\n this.takeEfectStart = 500;\r\n\r\n //nezničitelný\r\n this.permanent = permanent;\r\n\r\n //identifikátor, pro vyhledání\r\n this.id = id;\r\n\r\n //team, udává ve kterém byl hráč týmu, hráči nesmí být odměnění za body z vlastního týmu\r\n this.team = team;\r\n }\r\n\r\n\r\n timeoutsProcess () {\r\n\r\n //odpočet pauzy brány\r\n if (this.permanent === false && this.duration > 0){\r\n this.duration -= this.game.delay;\r\n }\r\n\r\n };\r\n\r\n //update portálů\r\n update () {\r\n\r\n //zprocesuju odpočty\r\n this.timeoutsProcess();\r\n\r\n };\r\n\r\n //kreslení portálů\r\n draw () {\r\n\r\n let fillStyle = this.game.ctx.fillStyle;\r\n let strokeStyle = this.game.ctx.strokeStyle;\r\n let InfofillStyle = this.game.infoctx.fillStyle;\r\n let InfostrokeStyle = this.game.infoctx.strokeStyle;\r\n\r\n\r\n //vykreslování bude jen v celých číselch (výpočet však bude v přesnějších)\r\n let x = this.x;\r\n let y = this.y;\r\n\r\n\r\n if (this.permanent === true || this.duration > 0) {\r\n \r\n\r\n let size = 1;\r\n if(this.permanent === false && this.duration < this.takeEfectStart)\r\n {\r\n size = (this.duration)/500;\r\n }\r\n\r\n\r\n //exploze pouze v info canvasu\r\n this.game.infoctx.fillStyle = \"#FFFFFF\";\r\n this.game.infoctx.strokeStyle = this.color;\r\n\r\n if(this.score>0)\r\n {\r\n //kříž\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.lineWidth = 3;\r\n this.game.infoctx.moveTo(x - 5 * size, y);\r\n this.game.infoctx.lineTo(x + 5 * size, y);\r\n this.game.infoctx.moveTo(x, y - 5* size);\r\n this.game.infoctx.lineTo(x, y + 5* size);\r\n this.game.infoctx.stroke();\r\n }\r\n\r\n if(this.energy>0)\r\n {\r\n this.game.infoctx.lineWidth = 2;\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.arc(x, y, 4* size, 0.25* Math.PI , 0 * Math.PI );\r\n this.game.infoctx.stroke();\r\n\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.lineWidth = 2;\r\n this.game.infoctx.moveTo(x, y);\r\n this.game.infoctx.lineTo(x + 5 *size, y);\r\n this.game.infoctx.stroke();\r\n\r\n }\r\n\r\n\r\n var angle = 2 * Math.PI;\r\n if(this.duration < 10000)\r\n {\r\n //zmenšující se angle\r\n angle = (2 * Math.PI / 10000) * this.duration;\r\n\r\n this.game.infoctx.strokeStyle = \"#444444\";\r\n //kruh\r\n this.game.infoctx.lineWidth = 2;\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.arc(x, y, 8* size, 0, 2 * Math.PI);\r\n this.game.infoctx.stroke();\r\n }\r\n\r\n this.game.infoctx.strokeStyle = this.color;\r\n //kruh\r\n this.game.infoctx.lineWidth = 2;\r\n this.game.infoctx.beginPath();\r\n this.game.infoctx.arc(x, y, 8* size, 0, angle);\r\n this.game.infoctx.stroke();\r\n }\r\n\r\n this.game.infoctx.fillStyle = InfofillStyle;\r\n this.game.infoctx.strokeStyle = InfostrokeStyle;\r\n\r\n this.game.ctx.fillStyle = fillStyle;\r\n this.game.ctx.strokeStyle = strokeStyle;\r\n };\r\n\r\n}\r\n","import { greatColors } from './Enums';\r\n\r\nexport default class Rotator {\r\n\r\n constructor(game, x, y, r, permanent, duration, id){\r\n\r\n this.game = game;\r\n\r\n //vzdy menší hodnota, než má konec\r\n this.x = Math.floor(x);\r\n this.y = Math.floor(y);\r\n \r\n this.color = Math.floor(Math.random() * greatColors.length);\r\n \r\n //životnost\r\n this.duration = duration;\r\n //nezničitelný\r\n this.permanent = permanent;\r\n\r\n //poloměr\r\n this.radius = r;\r\n\r\n //poloha čáry překážky\r\n this.step = 0;\r\n this.oldStep = 0;\r\n\r\n //identifikátor, pro hledání jiného portálu, než ten ze kterého jdu\r\n this.id = id;\r\n }\r\n\r\n\r\n timeoutsProcess () {\r\n\r\n //odpočet pauzy brány\r\n if (this.permanent === false && this.duration > 0){\r\n this.duration -= this.game.delay;\r\n }\r\n\r\n //posunuju rotátorem\r\n this.step += 0.05 * this.game.delay;\r\n\r\n };\r\n\r\n //update portálů\r\n update () {\r\n\r\n //zprocesuju odpočty\r\n this.timeoutsProcess();\r\n\r\n };\r\n\r\n\r\n drawHand(x,y,pos, length, width) {\r\n this.game.ctx.beginPath();\r\n this.game.ctx.lineWidth = width;\r\n this.game.ctx.lineCap = \"round\";\r\n this.game.ctx.moveTo(x,y);\r\n \r\n let xx = Math.cos(pos * Math.PI/120);\r\n let yy = Math.sin(pos * Math.PI/120);\r\n\r\n this.game.ctx.lineTo(this.x + (xx * length), this.y + (yy * length));\r\n this.game.ctx.stroke();\r\n }\r\n\r\n\r\n\r\n //kreslení portálů\r\n draw () {\r\n\r\n let fillStyle = this.game.ctx.fillStyle;\r\n let strokeStyle = this.game.ctx.strokeStyle;\r\n let InfofillStyle = this.game.infoctx.fillStyle;\r\n let InfostrokeStyle = this.game.infoctx.strokeStyle;\r\n\r\n //vykreslování bude jen v celých číselch (výpočet však bude v přesnějších)\r\n if (this.duration > 0) {\r\n \r\n //exploze pouze v info canvasu\r\n this.game.ctx.strokeStyle = \"#999999FF\";\r\n\r\n //smažu starou čáru\r\n this.game.ctx.globalCompositeOperation = 'destination-out';\r\n this.drawHand(this.x,this.y, this.oldStep , this.radius, 5);\r\n this.game.ctx.globalCompositeOperation = 'source-over';\r\n\r\n\r\n //nakreslím novou\r\n this.drawHand(this.x,this.y, this.step , this.radius, 2);\r\n\r\n //zapíšu pro vymazání\r\n this.oldStep = this.step;\r\n }\r\n\r\n this.game.infoctx.fillStyle = InfofillStyle;\r\n this.game.infoctx.strokeStyle = InfostrokeStyle;\r\n\r\n this.game.ctx.fillStyle = fillStyle;\r\n this.game.ctx.strokeStyle = strokeStyle;\r\n };\r\n\r\n}\r\n","import React from 'react';\r\nimport { withTranslation } from 'react-i18next';\r\n \r\nexport class Tutorial extends React.Component {\r\n\r\n componentDidMount(){\r\n } \r\n \r\n render() {\r\n\r\n const { t } = this.props;\r\n\r\n return ( \r\n
\r\n
{t('tutorial.tutorialEscape')}
\r\n {/*

{t('game.tutorial')}

*/}\r\n

{t('tutorial.tutorial')} \"plus\"

\r\n {t('tutorial.line1')}
\r\n {t('tutorial.line2')}
\r\n {t('tutorial.line3')}
\r\n
\r\n

{t('tutorial.unstablePortals')} \"portal\"

\r\n {t('tutorial.unstablePortalsLine1')}
\r\n {t('tutorial.unstablePortalsLine2')}
\r\n
\r\n

{t('tutorial.specialAbilities')}

\r\n
\r\n
\r\n
\r\n
\r\n

\r\n {t('tutorial.mines')} {t('tutorial.mines')}\r\n  {t('tutorial.mines')}\r\n

\r\n

{t('tutorial.minesLine1')}

\r\n \r\n
\r\n
\r\n
\r\n

\r\n {t('tutorial.hammer')} {t('tutorial.hammer')}\r\n  {t('tutorial.hammer')}\r\n

\r\n

\r\n {t('tutorial.hammerLine1')}\r\n

\r\n
\r\n
\r\n

\r\n {t('tutorial.portal')} {t('tutorial.portal')}\r\n  {t('tutorial.portal')}\r\n

\r\n

\r\n {t('tutorial.portalLine1')}\r\n

\r\n
\r\n
\r\n

\r\n {t('tutorial.address')} {t('tutorial.address')}\r\n

\r\n

\r\n {t('tutorial.addressLine1')}\r\n

\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n

{t('tutorial.otherImportant')}

\r\n
\r\n
\r\n
\r\n
\r\n

\r\n {t('tutorial.tracerAnd')}\r\n  {t('tutorial.tracerAnd')}\r\n

\r\n

\r\n {t('tutorial.tracerAndLine1')}
\r\n {t('tutorial.tracerAndLine2')}
\r\n {t('tutorial.tracerAndLine3')}
\r\n

\r\n
\r\n
\r\n
\r\n

\r\n {t('tutorial.deathZones')}\r\n

\r\n

\r\n {t('tutorial.deathZonesLine1')}
\r\n {t('tutorial.deathZonesLine2')}
\r\n {t('tutorial.deathZonesLine3')}
\r\n

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n\r\n }\r\n}\r\n\r\n\r\nexport default withTranslation('common')(Tutorial);","import React from 'react';\r\nimport { withTranslation } from 'react-i18next';\r\n \r\nexport class MusicPlayer extends React.Component {\r\n\r\n constructor(props){\r\n super(props);\r\n\r\n this.state = {\r\n files:[\r\n {name:'Adamson - Tayalot', file:'Adamson - Tayalot.mp3', link: 'https://ektoplazm.com/free-music/lost-diamonds'},\r\n {name:'Bratenschneider - Means You', file:'Bratenschneider - Means You.mp3', link: 'https://ektoplazm.com/free-music/lost-diamonds'},\r\n {name:'Code Therapy - Pulse', file:'Code Therapy - Pulse.mp3', link: 'https://ektoplazm.com/free-music/lost-diamonds'},\r\n {name:'Ben Rama - VALIS (Crennwiick Remix)', file:'Ben Rama - VALIS (Crennwiick Remix).mp3', link: 'https://ektoplazm.com/free-music/digital-decade'},\r\n {name:'Simmetune - Simplify', file:'Simmetune - Simplify.mp3', link: 'https://ektoplazm.com/free-music/digital-family-vol-6'},\r\n {name:'Bratenschneider - Universal Control', file:'Bratenschneider - Universal Control.mp3', link: 'https://ektoplazm.com/free-music/digital-family-vol-6'},\r\n {name:'Code Therapy - Acid Rain', file:'Code Therapy - Acid Rain.mp3', link: 'https://ektoplazm.com/free-music/digital-family-vol-6'},\r\n {name:'Søren Nordström - Cyclic', file:'Søren Nordström - Cyclic.mp3', link: 'https://ektoplazm.com/free-music/hive-mind-volume-one'},\r\n {name:'Quirk - Superstructure', file:'Quirk - Superstructure.mp3', link: 'https://ektoplazm.com/free-music/hive-mind-volume-one'}\r\n ],\r\n playOrder:[0,1,2,3,4,5,6,7,8],\r\n currentPlaybackFileID: 0,\r\n playng: false,\r\n forceShow: false,\r\n volume: 0.2\r\n }\r\n }\r\n\r\n playStop(){\r\n\r\n let player = this.refs.mPlayer;\r\n\r\n if(!player.paused){\r\n player.pause();\r\n }\r\n else{\r\n player.play();\r\n }\r\n\r\n this.setState({\r\n forceShow: true\r\n }, ()=> {\r\n });\r\n\r\n setTimeout(() => {\r\n this.setState({\r\n forceShow: false\r\n }, ()=> {\r\n }); \r\n }, 500); \r\n }\r\n\r\n next(){\r\n\r\n let player = this.refs.mPlayer;\r\n \r\n //určíme další soubor \r\n let next = this.state.currentPlaybackFileID+1;\r\n if(next > this.state.files.length-1)\r\n {\r\n next = 0;\r\n }\r\n\r\n this.setState({\r\n currentPlaybackFileID: next\r\n }, ()=> {\r\n //zatím nic\r\n player.load();\r\n player.play();\r\n console.log('next loading ' + next);\r\n });\r\n\r\n }\r\n\r\n //zhlasení hudby\r\n volumeUp(){\r\n let player = this.refs.mPlayer;\r\n\r\n if(player.volume <= 0.95){\r\n player.volume = (player.volume + 0.05).toFixed(2);\r\n\r\n }\r\n \r\n\r\n this.setState({\r\n volume: player.volume,\r\n forceShow: true\r\n }, ()=> {\r\n });\r\n\r\n setTimeout(() => {\r\n this.setState({\r\n forceShow: false\r\n }, ()=> {\r\n }); \r\n }, 500); \r\n }\r\n\r\n //ztišení hudby\r\n volumeDown(){\r\n let player = this.refs.mPlayer;\r\n \r\n if(player.volume >= 0.05){\r\n player.volume = (player.volume - 0.05).toFixed(2);\r\n\r\n }\r\n\r\n this.setState({\r\n volume: player.volume,\r\n forceShow: true\r\n }, ()=> {\r\n });\r\n\r\n setTimeout(() => {\r\n this.setState({\r\n forceShow: false\r\n }, ()=> {\r\n }); \r\n }, 500); \r\n }\r\n\r\n componentDidMount(){\r\n\r\n this.props.onRef(this)\r\n\r\n let player = this.refs.mPlayer;\r\n player.volume = this.state.volume;\r\n\r\n //přeskládání pořadí přehrávání\r\n let shuffled = this.state.playOrder\r\n .map((a) => ({sort: Math.random(), value: a}))\r\n .sort((a, b) => a.sort - b.sort)\r\n .map((a) => a.value);\r\n\r\n this.setState({\r\n playOrder: shuffled\r\n }, ()=> {\r\n console.log(this.state.playOrder);\r\n }); \r\n\r\n\r\n //přehrávání dalších písniček po konci předchozí\r\n player.addEventListener('ended', (event) => {\r\n this.next(); \r\n });\r\n\r\n //po spuštění přehrávání\r\n player.addEventListener('play', (event) => {\r\n \r\n console.log('play');\r\n this.setState({\r\n playng: !player.paused,\r\n forceShow: true\r\n }, ()=> {\r\n });\r\n\r\n setTimeout(() => {\r\n this.setState({\r\n forceShow: false\r\n }, ()=> {\r\n }); \r\n }, 500);\r\n });\r\n\r\n //po zapauzování přehrávače\r\n player.addEventListener('pause', (event) => {\r\n \r\n console.log('pauza');\r\n this.setState({\r\n playng: !player.paused\r\n }, ()=> {\r\n });\r\n });\r\n }\r\n \r\n \r\n render() {\r\n\r\n // const { t } = this.props;\r\n\r\n const style = {\r\n backgroundImage: 'url(' + (this.state.playng?'/pause.svg':'/play.svg') + ')'\r\n }\r\n\r\n const playerClass = this.state.forceShow? \"musicPlayer\": \"musicPlayer withAutoHide\"\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n {this.state.files[this.state.playOrder[this.state.currentPlaybackFileID]].name}
\r\n volume: {(this.state.volume *100).toFixed(0)}\r\n +\r\n -\r\n
\r\n \r\n \r\n
\r\n );\r\n\r\n }\r\n}\r\n\r\n\r\nexport default withTranslation('common')(MusicPlayer);","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\n//cybertracers v 1.0.91\r\n//todo:vylepšit dle tohoto:\r\n//https://medium.com/better-programming/let-users-know-when-you-have-updated-your-service-worker-in-create-react-app-b0c2701995b3\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nwindow.self.addEventListener('message', (event) => {\r\n if (event.data && event.data.type === 'SKIP_WAITING') {\r\n window.self.skipWaiting();\r\n }\r\n});\r\n\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n \r\n registration.onupdatefound = () => {\r\n\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' }\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React from 'react';\r\nimport 'bootstrap/dist/css/bootstrap.min.css';\r\nimport './App.css';\r\nimport TitleScreen from './components/TitleScreen';\r\nimport Results from './components/Results';\r\nimport Hud from './components/Hud'\r\nimport Countdown from './components/Countdown';\r\nimport { controls, gamePhaseEnum, greatColors, orientation, zoneType, menuControlItems} from './objects/Enums';\r\nimport { keyName } from './objects/Support'\r\nimport Player from './objects/Player';\r\nimport Portal from './objects/Portal';\r\nimport Connection from './objects/Connection';\r\nimport SpecialZone from './objects/SpecialZone';\r\nimport Explosion from './objects/Explosion';\r\nimport BonusPoint from './objects/BonusPoint';\r\nimport Rotator from './objects/Rotator';\r\nimport { withTranslation } from 'react-i18next';\r\nimport i18n from 'i18next';\r\nimport ReactGA from \"react-ga\";\r\nimport Tutorial from './components/Tutorial';\r\nimport MusicPlayer from './components/MusicPlayer';\r\nimport * as serviceWorker from './serviceWorker';\r\n\r\n\r\n\r\n\r\nexport class App extends React.Component {\r\n \r\n constructor(props){ \r\n\r\n super(props); \r\n this.hudsRef = React.createRef();\r\n this.playerRef = React.createRef();\r\n \r\n //proměnné hry\r\n this.delay = 0;\r\n this.time = 0;\r\n this.gameSpeed = 50;\r\n\r\n this.pause = false;\r\n this.prevEsc = false;\r\n this.lastEsc = 0;\r\n this.tutorialBefore = 500;\r\n\r\n //pole pro stisknuté klávesy\r\n this.keydown = {};\r\n //pole pro zjištění aktuálních stavů gamepadů\r\n this.gamepads = null;\r\n this.gamepadsMappingsArray = [];\r\n\r\n //pole hráčů\r\n this.players = [];\r\n this.AIDemoPlayers = 10;\r\n this.AIplayers = 0;\r\n\r\n //první stejná barva\r\n this.sameAIColor = 0;\r\n\r\n //pole portálů\r\n this.portals = [];\r\n this.portalCounter = 0;\r\n\r\n //pole bonusů\r\n this.bonusPoints = [];\r\n this.bonusPointsCounter = 0;\r\n\r\n //pole propojení\r\n this.connections = [];\r\n\r\n //pole speciálních zón\r\n this.zones = [];\r\n this.zoneCounter = 0;\r\n \r\n this.eraserZoneCount = 0;\r\n this.eraserZoneDelay = 0;\r\n\r\n\r\n //pole rotátorů\r\n this.rotators = [];\r\n this.rotatorCounter = 0;\r\n\r\n\r\n //pole explozí\r\n this.explosions = [];\r\n\r\n //odpočet pro spawning speciálních zón\r\n this.specialZoneTimeout = 0;\r\n this.specialZoneKillerTimeout = 0;\r\n\r\n this.startCountdownRunning = false;\r\n this.startCountdown = 5000;\r\n this.startCountdownDefault = 5000;\r\n\r\n\r\n //odpočet hry (aktuálně 5minut)\r\n this.gameCountdown = 300000;\r\n this.gameCountdownDefault = 300000;\r\n \r\n //dočasná viditelnost odpočtu\r\n this.countDownTempVisible = 0;\r\n this.countDownTempVisibleDefault = 10000;\r\n\r\n //zajisťuje automatické přepínání pohledů v menu\r\n this.menuAutoMoveCountdown = 60000;\r\n this.menuAutoMoveCountdownDefault = 20000;\r\n // this.menuAutoMoveCountdown = 10000000;\r\n // this.menuAutoMoveCountdownDefault = 10000000;\r\n\r\n //timeout změn portálů\r\n this.targetCodeChangingCountdown = 15000;\r\n this.targetCodeChangingCountdownDefault = 15000;\r\n\r\n //dočasné znemožnění opuštění výsledkové listiny\r\n this.menuFreezeCountdown = 0;\r\n this.menuFreezeCountdownDefault = 2000;\r\n\r\n //čas pro povel ovládání v menu\r\n this.menuActionTimeout = 200;\r\n this.menuActionTimeoutDefault = 200;\r\n\r\n //zvuky\r\n this.soundEnabled = true;\r\n\r\n this.soundPlayer1 = document.createElement(\"audio\"); \r\n this.soundPlayer1.src = \"sounds.mp3\";\r\n this.soundPlayer2 = document.createElement(\"audio\"); \r\n this.soundPlayer2.src = \"sounds.mp3\";\r\n this.soundPlayer3 = document.createElement(\"audio\"); \r\n this.soundPlayer3.src = \"sounds.mp3\";\r\n this.soundPlayer4 = document.createElement(\"audio\"); \r\n this.soundPlayer4.src = \"sounds.mp3\";\r\n this.soundPlayer5 = document.createElement(\"audio\"); \r\n this.soundPlayer5.src = \"sounds.mp3\"; \r\n\r\n this.soundCountdownPlayed = false;\r\n\r\n this.sound5MLeftPlayed = true;\r\n this.sound1MLeftPlayed = true;\r\n this.sound321GameOverPlayed = false;\r\n\r\n //multi color after start\r\n this.MixRunColor = Math.floor(Math.random() * 2)===0? true : false;\r\n\r\n //zvuky ze hry\r\n //pouzity 0,8,12,13,14\r\n this.soundPositions = \r\n [\r\n ['0 menu click', 0.0, 0.2], ['1 exploze', 4.0, 5.5], ['2 create portal', 8.0, 9.0]\r\n , ['3 portal jump', 12.0, 14.5], ['4 point', 16.0, 17.5], ['5 3points', 20.0, 21.5]\r\n , ['6 mines', 24.0, 24.95], ['7 hammer', 28.0, 28.6], ['8 cybertracers', 32.0, 33.4]\r\n , ['9 game over', 36.0, 38.0 ], ['10 new powertracer', 40.0, 41.8], ['11 prepare your tracer', 44.0, 46.3]\r\n , ['12 3 2 1 lets go ', 48.0, 52.0], ['13 player ready', 52.0, 53.5], ['14 pause', 56.0, 58.0]\r\n , ['15 new player', 60.0, 61.3], ['16 five minutes left', 64.0, 66.5], ['17 1 minute left', 68.0, 70.0] , ['18 321 game over', 72.0, 76.5]\r\n , ['19 overdrive', 80.0, 81.1]\r\n ];\r\n\r\n\r\n\r\n //self pro eventy\r\n var self = this;\r\n\r\n\r\n // If you want your app to work offline and load faster, you can change\r\n // unregister() to register() below. Note this comes with some pitfalls.\r\n // Learn more about service workers: https://bit.ly/CRA-PWA\r\n serviceWorker.register({\r\n onSuccess: () => { \r\n console.log(\"APP.js service worker inicialozován\");\r\n\r\n this.setServiceWorkerInitialized(true);\r\n },\r\n onUpdate: registration => { \r\n console.log(\"APP.js service worker byl aktualizován\");\r\n\r\n this.setServiceWorkerUpdated(true, registration);\r\n },\r\n });\r\n\r\n window.addEventListener('keydown', function (event) {\r\n\r\n self.keydown[keyName(event)] = true;\r\n\r\n if (self.keydown.up || self.keydown.down || self.keydown.left || self.keydown.right || self.keydown.space) {\r\n \r\n event.preventDefault();\r\n }\r\n }, false);\r\n\r\n\r\n window.addEventListener('keyup', function (event) {\r\n\r\n self.keydown[keyName(event)] = false;\r\n\r\n }, false);\r\n\r\n\r\n //podpora gamepadů\r\n window.addEventListener(\"gamepadconnected\", (event) => {\r\n console.log(\"A gamepad connected:\");\r\n console.log(event.gamepad);\r\n });\r\n\r\n window.addEventListener(\"gamepaddisconnected\", (event) => {\r\n console.log(\"A gamepad disconnected:\");\r\n console.log(event.gamepad);\r\n });\r\n\r\n this.soundPlayer5.onloadeddata = function() {\r\n self.playSound(8,1);\r\n };\r\n\r\n\r\n //ošetření \r\n this.state = {\r\n canvasSize :{width: window.innerWidth, height: window.innerHeight}\r\n ,bottomHudsHeight: 100\r\n ,gamePhase: gamePhaseEnum.LOBBY\r\n ,serviceWorkerInitialized: false\r\n ,serviceWorkerUpdated: false\r\n ,serviceWorkerRegistration: null\r\n ,startCountdownRunning: this.startCountdownRunning\r\n ,startCountdown: (this.startCountdown / 1000).toFixed(0)\r\n ,gameCountdownMin: (Math.floor((this.gameCountdown / 1000) /60)).toFixed(0)\r\n ,gameCountdownSec: ((this.gameCountdown / 1000) %60).toFixed(0)\r\n ,countDownVisible: this.countDownTempVisible > 0\r\n ,playersInfo:[]\r\n ,Results:[]\r\n ,AIplayers: this.AIplayers\r\n };\r\n //this.handleEvent = this.handleEvent.bind(this); \r\n }\r\n \r\n\r\n /**\r\n * týmový update score\r\n * @param {*} team - updatovaný tým\r\n * @param {*} points - počet získaných bodů\r\n */\r\n updateTeamScore(team,points){\r\n\r\n let teamPlayers = this.players.filter(pl=>pl.controlledBy !== controls.AI && pl.team === team)\r\n if(teamPlayers!== undefined && teamPlayers !== null){\r\n \r\n //updatuju score všem v týmu\r\n teamPlayers.forEach(pl => {\r\n pl.score+=points.sumScore;\r\n });\r\n }\r\n }\r\n\r\n\r\n //https://reactjs.org/tutorial/tutorial.html\r\n //změny na hráči, které afektují UI\r\n updatePlayersInfo(){\r\n \r\n //zjistím, kdo je první\r\n let nonDemoPlayers = this.players.filter(fi=>fi.isDemo === false);\r\n\r\n if(nonDemoPlayers.length > 0)\r\n {\r\n let plaFirst = nonDemoPlayers[0];\r\n\r\n //1.reset prvenství a určení prvého\r\n for (let i = 0 ; i < nonDemoPlayers.length ; i++) {\r\n nonDemoPlayers[i].isFirst = false;\r\n\r\n if(nonDemoPlayers[i].score > plaFirst.score)\r\n {\r\n plaFirst = nonDemoPlayers[i];\r\n }\r\n }\r\n\r\n //2.všichni se stejným score jako nejvyšší\r\n let firstGroup = nonDemoPlayers.filter(pl=>pl.score === plaFirst.score);\r\n if(firstGroup!== undefined && firstGroup !== null){\r\n if(firstGroup.length === 1){\r\n //existuje jeden powertracer\r\n plaFirst.isFirst = true;\r\n }\r\n else if(firstGroup.length > 1){\r\n //pokud je jich více, jsou první pouze pokud jsou stejný tým\r\n let teamMates = firstGroup.filter(pl=>pl.team >0 && pl.team === plaFirst.team);\r\n if(teamMates!== undefined && teamMates !== null){\r\n if(firstGroup.length === teamMates.length)\r\n {\r\n //všichni v týmu jsou powertraceři\r\n teamMates.forEach(pl => {\r\n pl.isFirst = true;\r\n });\r\n } \r\n }\r\n }\r\n }\r\n\r\n //mazání hráčů určených pro výmaz\r\n let someRemoved = false;\r\n do{\r\n someRemoved = false;\r\n for (let i = 0 ; i < this.players.length ; i++) {\r\n if(this.players[i].markedForRemove)\r\n {\r\n this.players.splice(i,1);\r\n someRemoved = true;\r\n break;\r\n }\r\n }\r\n }while(someRemoved);\r\n }\r\n\r\n //zjistím, kdo je první\r\n nonDemoPlayers = this.players.filter(fi=>fi.isDemo === false); \r\n\r\n this.setState({\r\n playersInfo: nonDemoPlayers.map((pla, index)=>{ return {\r\n index: index\r\n , guid: pla.guid\r\n , color: pla.color\r\n , type: pla.type\r\n , team: pla.team\r\n , inMenuCurrent: pla.inMenuCurrent\r\n , isMapped: pla.isMapped\r\n , isSetCustomMapping: pla.isSetCustomMapping\r\n , mappingCurrent: pla.mappingCurrent\r\n , mappingStepTimeout: pla.mappingStepTimeout\r\n , controlledBy: pla.controlledBy\r\n , controllerId: pla.controllerId\r\n , score: pla.score\r\n , isFirst: pla.isFirst\r\n , deaths: pla.deaths\r\n , blockadeCooldown: pla.blockadeCooldown\r\n , gateCooldown: pla.gateCooldown\r\n , ramCooldown: pla.ramCooldown\r\n , portalCooldown: pla.portalCooldown\r\n , controlTextMove: pla.controlTextMove\r\n , controlTextMoveAlt: pla.controlTextMoveAlt\r\n , controlTextPortal: pla.controlTextPortal\r\n , controlTextRam: pla.controlTextRam\r\n , controlTextMines: pla.controlTextMines\r\n , controlTextPauseMenu: pla.controlTextPauseMenu\r\n , controlTextDial: pla.controlTextDial\r\n , specialFontClass: pla.specialFontClass\r\n , portalDial: pla.portalDial\r\n , energy: pla.energy\r\n , overDriveCooldown: pla.overDriveCooldown\r\n };\r\n }),\r\n AIplayers: this.AIplayers\r\n }, ()=> {\r\n\r\n //update výšky zakázané oblasti\r\n let hudsRefHeight = this.hudsRef.current.clientHeight;\r\n if(this.state.bottomHudsHeight !== hudsRefHeight)\r\n {\r\n //nechám výšku zapsat znova (pozor na nekonečnou rekurzi)\r\n this.updateCanvasSize();\r\n }\r\n\r\n });\r\n }\r\n\r\n\r\n //změny na hráči, které afektují Results UI\r\n updateResults(){\r\n //zjistím, kdo je první\r\n\r\n if(this.players.length > 0)\r\n {\r\n for (var i = 0 ; i < this.players.length ; i++) {\r\n //nastavím unikátní index hráče dle indexu v poli\r\n this.players[i].SetUniqueIndex(i);\r\n }\r\n }\r\n\r\n //zjistím, kdo je první\r\n let nonDemoPlayers = this.players.filter(fi=>fi.isDemo === false);\r\n\r\n //kopie setřízená\r\n let shortedPlayers = [...nonDemoPlayers].sort((a,b) => b.score - a.score);\r\n\r\n this.setState({\r\n Results: shortedPlayers.map((pla, index)=>{ return {\r\n index: pla.uniqueIndex\r\n , color: pla.color\r\n , type: pla.type\r\n , team: pla.team\r\n , inMenuCurrent: pla.inMenuCurrent\r\n , controlledBy: pla.controlledBy\r\n , score: pla.score\r\n , deaths: pla.deaths\r\n };\r\n })\r\n }, ()=> {\r\n //zatím nic\r\n });\r\n }\r\n\r\n\r\n /**\r\n * update odpočtu\r\n */\r\n updateCountdown(){\r\n this.setState({\r\n startCountdownRunning: this.startCountdownRunning\r\n ,startCountdown: (this.startCountdown / 1000).toFixed(0)\r\n ,gameCountdownMin: (Math.floor((this.gameCountdown / 1000) /60)).toFixed(0)\r\n ,gameCountdownSec: ((this.gameCountdown / 1000) %60).toFixed(0)\r\n ,countDownVisible: this.countDownTempVisible > 0\r\n }, ()=> {\r\n });\r\n }\r\n\r\n /**\r\n * update stavu service workeru\r\n */\r\n setServiceWorkerUpdated(updated, registration){\r\n this.setState({\r\n serviceWorkerUpdated: updated\r\n ,serviceWorkerRegistration: registration\r\n }, ()=> {\r\n });\r\n }\r\n\r\n /**\r\n * update stavu service workeru\r\n */\r\n setServiceWorkerInitialized(initialized){\r\n this.setState({\r\n serviceWorkerInitialized: initialized\r\n }, ()=> {\r\n });\r\n }\r\n\r\n /**\r\n * update stavu hry, a nastavení state pro zobrazení jednotlivých částí\r\n * možné pohyby : \r\n * \r\n * LOBBY->GAME (všichni hráči jsou rdy)\r\n * LOBBY->RESULTS (uplynulo 10 s bez aktivity)\r\n * RESULTS->LOBBY (uplynulo 10 s bez aktivity, nebo kterýkoliv uživatel udělal nějakou akci)\r\n * GAME->RESULTS (splněny podmínky konce hry)\r\n * GAME->PAUSE (pauza)\r\n * PAUSE->GAME (pokračování hry po pauze)\r\n * \r\n * @param {*} phase dle gamePhaseEnum, jde o požadovanou fázi hry\r\n */\r\n updateGamePhase(phase){\r\n \r\n\r\n let previousPhase = this.state.gamePhase;\r\n console.log('update fáze hry: ' + previousPhase + '->' + phase);\r\n\r\n this.setState({\r\n gamePhase: phase\r\n }, ()=> {\r\n\r\n //LOBBY -> GAME\r\n if(previousPhase === gamePhaseEnum.LOBBY && phase === gamePhaseEnum.GAME)\r\n {\r\n //reset odpočtu hry\r\n this.gameCountdown = this.gameCountdownDefault;\r\n //standardný resety (pohyb menu, čas do startu, chvilkové zastavení menu na snímku výsledků)\r\n this.menuAutoMoveCountdown = this.menuAutoMoveCountdownDefault;\r\n this.startCountdown = this.startCountdownDefault;\r\n this.menuFreezeCountdown = this.menuFreezeCountdownDefault;\r\n\r\n //start hry\r\n console.log('start hry');\r\n\r\n //start hry GA\r\n ReactGA.event({\r\n category: 'game',\r\n action: 'start',\r\n label: 'info'\r\n });\r\n\r\n\r\n //všecko smažu\r\n this.clearAllCanvas();\r\n\r\n //updatuju velikost okna (součást je vyrobení nových portálů\r\n this.updateCanvasSize();\r\n\r\n //odeberu všechny demo hráče\r\n this.removeAllDemoAI();\r\n\r\n //update stavu hráčů na hru n READY\r\n for (let p = 0; p < this.players.length; p++) {\r\n this.players[p].playerRespawn();\r\n }\r\n this.updatePlayersInfo();\r\n\r\n //vyrobím portály updateCanvasSize to již v sobě provolává\r\n //this.reCreateBasicPortals();\r\n\r\n }\r\n\r\n //GAME -> RESULTS\r\n if(previousPhase === gamePhaseEnum.GAME && phase === gamePhaseEnum.RESULTS)\r\n {\r\n //aktualizuju výsledkovou listinu\r\n this.updateResults();\r\n\r\n //update stavu hráčů na hru na INMENU\r\n for (let p = 0; p < this.players.length; p++) {\r\n this.players[p].playerToMenuPhase();\r\n //bum\r\n this.players[p].playerExplode();\r\n }\r\n this.updatePlayersInfo();\r\n\r\n //konec hry GA\r\n ReactGA.event({\r\n category: 'game',\r\n action: 'end',\r\n label: 'info'\r\n });\r\n\r\n }\r\n\r\n //GAME -> PAUSE\r\n if(previousPhase === gamePhaseEnum.GAME && phase === gamePhaseEnum.PAUSE)\r\n {\r\n //start hry\r\n console.log('pauza');\r\n\r\n this.playSound(14,1);\r\n\r\n //update stavu hráčů na hru na INMENU\r\n for (let p = 0; p < this.players.length; p++) {\r\n this.players[p].playerToMenuPhase();\r\n }\r\n this.updatePlayersInfo();\r\n\r\n }\r\n\r\n //PAUSE -> GAME\r\n if(previousPhase === gamePhaseEnum.PAUSE && phase === gamePhaseEnum.GAME)\r\n {\r\n //standardný resety (pohyb menu, čas do startu, chvilkové zastavení menu na snímku výsledků)\r\n this.menuAutoMoveCountdown = this.menuAutoMoveCountdownDefault;\r\n this.startCountdown = this.startCountdownDefault;\r\n this.menuFreezeCountdown = this.menuFreezeCountdownDefault;\r\n\r\n //start hry\r\n console.log('pokračování po pauze');\r\n\r\n //update stavu hráčů na hru na INMENU\r\n for (let p = 0; p < this.players.length; p++) {\r\n this.players[p].playerToPreviousPhase();\r\n }\r\n this.updatePlayersInfo();\r\n\r\n //deaktivuju pauzu\r\n this.pause = false;\r\n\r\n }\r\n\r\n\r\n //GAME -> TUTORIAL\r\n //TUTORIAL -> PAUSE\r\n if(previousPhase === gamePhaseEnum.TUTORIAL && phase === gamePhaseEnum.PAUSE)\r\n {\r\n //start hry\r\n console.log('opouštím tutorial');\r\n\r\n //update stavu hráčů na hru na INMENU\r\n for (let p = 0; p < this.players.length; p++) {\r\n this.players[p].toMenuItemControls();\r\n }\r\n this.updatePlayersInfo();\r\n }\r\n\r\n });\r\n }\r\n\r\n\r\n /**\r\n * vyrábí sadu základních permanentních portálů\r\n */\r\n reCreateBasicPortals()\r\n {\r\n if(this.state.gamePhase !== gamePhaseEnum.LOBBY)\r\n {\r\n //1. smažu staré portály\r\n let notPermanentPortals = this.portals.filter(portal=> \r\n portal.permanent === false);\r\n this.portals = notPermanentPortals;\r\n\r\n //spočítám rozsahy\r\n let height = this.state.canvasSize.height - this.state.bottomHudsHeight;\r\n let heightDiff = height/4;\r\n\r\n let width = this.state.canvasSize.width;\r\n let widthDiff = width/4;\r\n\r\n //2. vyrobín nové permanentní portály\r\n this.addPortal(this.stredx, this.stredy - heightDiff, this.stredx, this.stredy -heightDiff + 40, orientation.VERTICAL, true, 30000, 0);\r\n this.addPortal(this.stredx, this.stredy + heightDiff -40, this.stredx, this.stredy + heightDiff, orientation.VERTICAL, true, 30000, 0);\r\n\r\n this.addPortal(this.stredx - widthDiff, this.stredy, this.stredx - widthDiff+40, this.stredy, orientation.HORIZONTAL, true, 30000, 0);\r\n this.addPortal(this.stredx + widthDiff -40, this.stredy, this.stredx +widthDiff, this.stredy, orientation.HORIZONTAL, true, 30000, 0);\r\n }\r\n }\r\n\r\n\r\n addPlayer (controlledBy, controllerId) {\r\n \r\n if(this.players.length < 50){\r\n\r\n //barva\r\n let colorId = this.players.length;\r\n while(colorId > greatColors.length-1)\r\n {\r\n colorId -= greatColors.length-1;\r\n }\r\n\r\n //vyhledám non AI hráče\r\n let realPlayers = this.players.filter(pl=>pl.controlledBy !== controls.AI)\r\n let count = realPlayers.length;\r\n\r\n //vyhledám demo AI hráče\r\n let demoPlayers = this.players.filter(pl=>pl.controlledBy === controls.AI && pl.isDemo === true)\r\n let demoPlayersCount = demoPlayers.length;\r\n\r\n let isDemo = false;\r\n //AIčka před hráčema jsou DEMO hráči\r\n if(count === 0 && controlledBy === controls.AI){\r\n isDemo = true;\r\n colorId = 0;\r\n if(demoPlayersCount>4 && this.MixRunColor){\r\n colorId = 1;\r\n }\r\n }\r\n\r\n //přidání hráče před AIčka\r\n this.players.splice(count, 0, new Player(controlledBy, controllerId, colorId, this, isDemo));\r\n \r\n if(controlledBy!== controls.AI){\r\n this.playSound(15,1);\r\n }\r\n\r\n //update state\r\n this.updatePlayersInfo();\r\n }\r\n }\r\n\r\n //přidání AI hráčů\r\n addAI(count){\r\n for(let a=0;apl.controlledBy === controls.AI && pl.isDemo === false)\r\n if(forErase.length > 0){\r\n forErase[0].markedForRemove = true;\r\n }\r\n }\r\n\r\n //odebrání všech demo AI hráčů\r\n removeAllDemoAI()\r\n {\r\n let forErase = this.players.filter(pl=>pl.controlledBy === controls.AI && pl.isDemo === true)\r\n for(let i=0;ipl.controlledBy === controls.AI)\r\n if(ais!== undefined && ais !== null){\r\n \r\n if(diff>0){\r\n this.sameAIColor++;\r\n if(this.sameAIColor >= greatColors.length)\r\n {\r\n this.sameAIColor = 0;\r\n }\r\n }\r\n\r\n ////barva\r\n ais.forEach(ai => {\r\n\r\n if(diff>0){\r\n \r\n //stejná barva\r\n ai.color = this.sameAIColor;\r\n }\r\n else\r\n {\r\n //náhodná barva\r\n ai.color = Math.floor(Math.random() * greatColors.length);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * pustí další song\r\n */\r\n musicPlayerNext(){\r\n //pustím další track\r\n this.playerRef.next();\r\n }\r\n\r\n /**\r\n * pauzne nebo spustí přehrávač hudby\r\n */\r\n musicPlayerStop(){\r\n //spustím nebo pauznu playback hudby\r\n this.playerRef.playStop();\r\n }\r\n\r\n /**\r\n * pauzne nebo spustí přehrávač hudby\r\n */\r\n musicPlayerVolumeUp(){\r\n //spustím nebo pauznu playback hudby\r\n this.playerRef.volumeUp();\r\n }\r\n\r\n /**\r\n * pauzne nebo spustí přehrávač hudby\r\n */\r\n musicPlayerVolumeDown(){\r\n //spustím nebo pauznu playback hudby\r\n this.playerRef.volumeDown();\r\n }\r\n\r\n\r\n\r\n /*\r\n změna času hry\r\n */\r\n updateGameTime(diff)\r\n {\r\n this.gameCountdownDefault +=diff;\r\n\r\n if(this.gameCountdownDefault <150000){\r\n this.gameCountdownDefault = 150000;\r\n \r\n }\r\n\r\n //maximum 60 minut\r\n if(this.gameCountdownDefault >=3600000){\r\n this.gameCountdownDefault = 3600000;\r\n }\r\n\r\n //přepíšu hodnotu\r\n this.gameCountdown = this.gameCountdownDefault;\r\n\r\n //na 10 s viditelné\r\n this.countDownTempVisible = this.countDownTempVisibleDefault;\r\n this.updateCountdown();\r\n }\r\n\r\n /**\r\n * změna jazyku aplikace\r\n * @param {} diff \r\n */\r\n updateGameLang(diff)\r\n {\r\n if(diff>0)\r\n {\r\n i18n\r\n .changeLanguage('en')\r\n .then((t) => {\r\n t('key');\r\n });\r\n }\r\n else\r\n {\r\n i18n\r\n .changeLanguage('cs')\r\n .then((t) => {\r\n t('key');\r\n }); \r\n }\r\n }\r\n\r\n addPortal (bx,by,ex,ey, ori, permanent, duration, dialCode){\r\n\r\n //inkrementuju\r\n this.portalCounter +=1;\r\n\r\n //portál musím vkládat aby nalevo byla ta menší strana a napravo ta větší\r\n if(ori === orientation.VERTICAL)\r\n {\r\n //vertikální\r\n this.portals.push(new Portal(this, bx, by < ey? by:ey , bx, by < ey? ey:by , ori, permanent, duration, this.portalCounter, dialCode ));\r\n }\r\n else\r\n {\r\n //horizontální\r\n this.portals.push(new Portal(this, bx \r\n zone.x + zone.width / 2 > x - width / 2 &&\r\n zone.x - zone.width < x + width / 2 &&\r\n zone.y + zone.height / 2 > y - height / 2 &&\r\n zone.y - zone.height / 2 < y + height / 2 &&\r\n zone.id !== id\r\n ) \r\n\r\n if(possibleZones!=null && possibleZones.length>0){\r\n return true;\r\n }\r\n else{\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * hledá kolize speciální zóny s hráčema (aby zóna nevznikla přímo na hráčích)\r\n * @param {*} x \r\n * @param {*} y \r\n * @param {*} width \r\n * @param {*} height \r\n */\r\n findPlayerColision(x,y, width, height)\r\n {\r\n let possiblePlayers = this.players.filter(player=> \r\n player.x > x - 50 - width / 2 &&\r\n player.x < x + 50 + width / 2 &&\r\n player.y > y - 50 - height / 2 &&\r\n player.y < y + 50 + height / 2 ) \r\n\r\n if(possiblePlayers!=null && possiblePlayers.length>0){\r\n return true;\r\n }\r\n else{\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * hledá kolize speciální zóny s portálem (aby zóna nevznikla přímo na portálu)\r\n * @param {*} x \r\n * @param {*} y \r\n * @param {*} width \r\n * @param {*} height \r\n */\r\n findPortalColision(x,y, width, height)\r\n {\r\n let possiblePortals = this.portals.filter(portal=> \r\n ((portal.beginx > x - 10 - width / 2) || (portal.endx > x - 10 - width / 2)) &&\r\n ((portal.beginx < x + 10 + width / 2) || (portal.beginx < x + 10 + width / 2 )) &&\r\n ((portal.beginy > y - 10 - height / 2) || (portal.endy > y - 10 - height / 2)) &&\r\n ((portal.beginy < y + 10 + height / 2) || (portal.endy < y + 10 + height / 2))) \r\n\r\n if(possiblePortals!=null && possiblePortals.length>0){\r\n return true;\r\n }\r\n else{\r\n return false;\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * hledá kolize hráče se speciální zónou (aby hráč nevznikl přímo v speciální zóně)\r\n * @param {*} x \r\n * @param {*} y \r\n */\r\n findSpecialZoneColision(x,y)\r\n {\r\n let possibleZones = this.zones.filter(zone=> \r\n zone.x + zone.width / 2 > x &&\r\n zone.x - zone.width < x &&\r\n zone.y + zone.height / 2 > y &&\r\n zone.y - zone.height / 2 < y\r\n ) \r\n\r\n if(possibleZones!=null && possibleZones.length>0){\r\n return true;\r\n }\r\n else{\r\n return false;\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n\r\n /**\r\n * najde kolizi s bonusovými body a vrátí jejich počet\r\n * @param {*} x - poloha hráče x\r\n * @param {*} y - poloha hráče y\r\n * @param {*} team - team hráče zběrače, nelze zebrat body vaniklé smrtí teamového hráče\r\n */\r\n colectPoints (x,y, team)\r\n {\r\n let colision = this.bonusPoints.filter(points=> \r\n //nelze zebrat týmový bod (vzájemné obohacovaní se v týmu)\r\n (points.team === 0 || points.team !==team)\r\n //zjednodušený výpočet polohy\r\n && Math.abs(points.x - x) + Math.abs(points.y - y) < 10\r\n && (points.score > 0\r\n || points.energy > 0)\r\n ) \r\n\r\n if(colision!=null && colision.length>0){\r\n\r\n let sumScore = 0;\r\n let sumEnergy = 0;\r\n\r\n colision.forEach(po=>{\r\n\r\n if(po.score === 3)\r\n {\r\n this.playSound(4,1);\r\n }\r\n else\r\n {\r\n this.playSound(5,1);\r\n }\r\n\r\n //sečtu\r\n sumScore += po.score;\r\n sumEnergy += po.energy;\r\n //vynuluju body\r\n po.score = 0;\r\n po.energy = 0;\r\n po.permanent = false;\r\n po.duration = 500;\r\n })\r\n\r\n return {sumScore: sumScore, sumEnergy: sumEnergy}; \r\n }\r\n\r\n return null;\r\n }\r\n\r\n\r\n /**\r\n * //nalezení portálu, který projíždím podle polohy xy v obdelníku portálu\r\n * @param {*} x old x position\r\n * @param {*} nx new x position\r\n * @param {*} y old y position\r\n * @param {*} ny new y position\r\n */\r\n findPortal (x, nx,y, ny){\r\n\r\n\r\n //přesnější kontrola kolizí s portálem\r\n let foundedPortals = this.portals.filter(portal=> \r\n portal.delayedInit <=0\r\n && (\r\n (x===nx && portal.ori === orientation.HORIZONTAL && portal.beginx <= x && x <= portal.endx && ((y <= portal.beginy && portal.beginy <= ny) || (y>= portal.beginy && portal.beginy >= ny )))\r\n ||\r\n (y===ny && portal.ori === orientation.VERTICAL && portal.beginy <= y && y <= portal.endy && ((x <= portal.beginx && portal.beginx <= nx) || (x>= portal.beginx && portal.beginx >= nx )))\r\n ) \r\n );\r\n\r\n for(let id =0;id< foundedPortals.length; id++)\r\n {\r\n //vracím nalezený portál\r\n return foundedPortals[id];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * určuje portál, do kterého se přesuneme\r\n * @param {*} ori - vybírám jen stejně orientované portály\r\n * @param {*} portalId - které nejsou stejné, jako ten, do kterého jsem vjel\r\n * @param {*} portalDial - klíč portálu, který může nově redukovat náhodu při skoku\r\n */\r\n getRandomPortal (ori, portalId, portalDial)\r\n {\r\n //portály se stejnou orientací\r\n let possiblePortals = this.portals.filter(portal=> \r\n portal.delayedInit <=0\r\n && portal.ori === ori \r\n && portal.id !== portalId);\r\n\r\n\r\n let filteredPossiblePortals = null;\r\n //pokud jich je více, vyberu dle dialu\r\n if(portalDial>0 && possiblePortals!=null && possiblePortals.length > 1)\r\n {\r\n filteredPossiblePortals = possiblePortals.filter(portal=> \r\n portal.targetCode === portalDial);\r\n }\r\n\r\n //pokud existuje nějaký portál se stejným počtem čárek\r\n if(filteredPossiblePortals!=null && filteredPossiblePortals.length >0)\r\n {\r\n possiblePortals = filteredPossiblePortals;\r\n }\r\n\r\n if(possiblePortals!=null && possiblePortals.length > 0)\r\n {\r\n //náhodná volba\r\n let portId = Math.floor(Math.random() * possiblePortals.length);\r\n //vracím vybraný portál\r\n return possiblePortals[portId];\r\n }\r\n\r\n //není co vrátit\r\n return null;\r\n }\r\n\r\n\r\n\r\n recognizePlayersAndControlls (gamepads) {\r\n\r\n for (var i = 0; i < gamepads.length; i++) {\r\n\r\n //získám gamepad\r\n let gp = gamepads[i];\r\n \r\n //gp.devIsUsed je můj vlastní parametr, optimalizace odstraňující zbytečné testování již používaného ovladače\r\n if (gp !== null && gp.connected === true && gp.devIsUsed !== true) { \r\n\r\n let addPlayer = false;\r\n\r\n //pro STANDARD gamepady, viz odstavec 9, https://www.w3.org/TR/gamepad/ \r\n if(gp.mapping !=null && gp.mapping === 'standard')\r\n {\r\n let gamepadY = 0;\r\n if (gp.axes[1] !== 0)\r\n {\r\n gamepadY = gp.axes[1];\r\n }\r\n \r\n //změna, tlačítko 12 (dpad nahoru), nebo levá analogová páčka\r\n if ((gp.buttons[12] != null && gp.buttons[12].pressed) || (gp.buttons[13] != null && gp.buttons[13].pressed) || gamepadY < -0.3 || gamepadY > 0.3) {\r\n \r\n addPlayer = true;\r\n }\r\n\r\n }\r\n else //pro nestandardní gamepady\r\n {\r\n //buttony\r\n for (let c = 0; c < gp.buttons.length; c++) {\r\n if(gp.buttons[c] != null && gp.buttons[c].pressed)\r\n {\r\n addPlayer = true;\r\n }\r\n }\r\n\r\n //analogové páčky\r\n let axesLength = gp.axes.length;\r\n if(axesLength > 4)\r\n {\r\n axesLength = 4;\r\n }\r\n for (let a = 0; a < axesLength; a++) {\r\n if(gp.axes[a] != null && (gp.axes[a] > 0.3 || gp.axes[a] < -0.3))\r\n {\r\n addPlayer = true;\r\n }\r\n }\r\n\r\n }\r\n\r\n //přidání nového hráče\r\n if(addPlayer)\r\n {\r\n this.addPlayer(controls.GAMEPAD, i);\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n\r\n //klavesak sipky 0\r\n if (this.keydown.up || this.keydown.down) {\r\n let used = false;\r\n for (let p = 0; p < this.players.length; p++) {\r\n if (this.players[p].controlledBy === controls.KEYBOARD && this.players[p].controllerId === 0) {\r\n used = true;\r\n }\r\n }\r\n\r\n if (used === false) {\r\n //přidání nového hráče\r\n this.addPlayer(controls.KEYBOARD, 0);\r\n }\r\n }\r\n\r\n //klavesak wsad 1\r\n if (this.keydown.w || this.keydown.s) {\r\n let used = false;\r\n for (let p = 0; p < this.players.length; p++) {\r\n if (this.players[p].controlledBy === controls.KEYBOARD && this.players[p].controllerId === 1) {\r\n used = true;\r\n }\r\n }\r\n\r\n if (used === false) {\r\n //přidání nového hráče\r\n this.addPlayer(controls.KEYBOARD, 1);\r\n }\r\n }\r\n\r\n //klavesak 8456 2\r\n if (this.keydown[8] || this.keydown[5]) {\r\n let used = false;\r\n for (let p = 0; p < this.players.length; p++) {\r\n if (this.players[p].controlledBy === controls.KEYBOARD && this.players[p].controllerId === 2) {\r\n used = true;\r\n }\r\n }\r\n\r\n if (used === false) {\r\n //přidání nového hráče\r\n this.addPlayer(controls.KEYBOARD, 2);\r\n }\r\n }\r\n\r\n //klavesak ijkl 3\r\n if (this.keydown.i || this.keydown.k) {\r\n let used = false;\r\n for (let p = 0; p < this.players.length; p++) {\r\n if (this.players[p].controlledBy === controls.KEYBOARD && this.players[p].controllerId === 3) {\r\n used = true;\r\n }\r\n }\r\n\r\n if (used === false) {\r\n //přidání nového hráče\r\n this.addPlayer(controls.KEYBOARD, 3);\r\n }\r\n }\r\n\r\n\r\n //obecné klávesy, pauza hry\r\n if(!this.prevEsc && this.keydown.esc){ \r\n \r\n this.pauseGame();\r\n\r\n if(this.lastEsc < this.tutorialBefore)\r\n {\r\n this.tutorial();\r\n }\r\n\r\n //reset času\r\n this.lastEsc = 0;\r\n }\r\n\r\n\r\n this.prevEsc = this.keydown.esc;\r\n };\r\n\r\n\r\n /**\r\n * všechny časovače, které musí být zastavitelné dle pauzy\r\n */\r\n timeoutPausableProcess(){\r\n\r\n if(this.state.gamePhase === gamePhaseEnum.GAME){\r\n \r\n //odpočet hry\r\n if (this.gameCountdown > 0){\r\n this.gameCountdown -= this.delay;\r\n if(this.gameCountdown <0){\r\n this.gameCountdown = 0;\r\n }\r\n\r\n if(this.gameCountdown <3300){\r\n\r\n if(this.sound321GameOverPlayed === false){\r\n this.sound321GameOverPlayed = true; \r\n this.playSound(18,1);\r\n }\r\n }\r\n else{\r\n this.sound321GameOverPlayed = false; \r\n }\r\n\r\n if(this.gameCountdown <300000){\r\n\r\n if(this.sound5MLeftPlayed === false){\r\n this.sound5MLeftPlayed = true; \r\n this.playSound(16,1);\r\n }\r\n }\r\n else{\r\n this.sound5MLeftPlayed = false; \r\n }\r\n\r\n if(this.gameCountdown <60000){\r\n\r\n if(this.sound1MLeftPlayed === false){\r\n this.sound1MLeftPlayed = true; \r\n this.playSound(17,1);\r\n }\r\n }\r\n else{\r\n this.sound1MLeftPlayed = false; \r\n }\r\n\r\n //výměna kódů na portálech\r\n if(this.targetCodeChangingCountdown >0){\r\n this.targetCodeChangingCountdown -= this.delay;\r\n }\r\n else\r\n {\r\n this.targetCodeChangingCountdown = this.targetCodeChangingCountdownDefault;\r\n }\r\n\r\n }\r\n else\r\n {\r\n //konec hry\r\n this.updateGamePhase(gamePhaseEnum.RESULTS);\r\n console.log('konec hry');\r\n }\r\n //update state\r\n this.updateCountdown();\r\n\r\n\r\n //odpočet vyrobení speciální zóny\r\n if (this.specialZoneTimeout > 0){\r\n this.specialZoneTimeout -= this.delay;\r\n }\r\n else\r\n {\r\n //interval něco mezi 2 - 3 minutama\r\n this.specialZoneTimeout = 20000 + Math.floor(Math.random() * 20000);\r\n\r\n let zone = Math.floor(Math.random() * 10); //(0-9) 7/10 = 70% sance spawnu\r\n\r\n switch(zone) {\r\n case 0:\r\n if(Math.floor(Math.random() * 2) === 0){\r\n this.addSpecialZone(false, zoneType.SNAKEU, 120000); \r\n }\r\n else{\r\n this.addSpecialZone(false, zoneType.SNAKED, 120000); \r\n }\r\n break;\r\n case 1:\r\n this.addSpecialZone(false, zoneType.SPEEDTUNNEL, 120000); \r\n break;\r\n case 2:\r\n if(Math.floor(Math.random() * 2) === 0){\r\n this.addSpecialZone(false, zoneType.ROTODEATHR, 120000); \r\n }\r\n else{\r\n this.addSpecialZone(false, zoneType.ROTODEATHR, 120000); \r\n }\r\n break; \r\n case 3:\r\n this.addSpecialZone(false, zoneType.HEARTH, 120000); \r\n break;\r\n case 4:\r\n this.addSpecialZone(false, zoneType.MAZE, 120000); \r\n break; \r\n case 5:\r\n this.addSpecialZone(false, zoneType.MONKEY, 120000);\r\n break;\r\n case 6:\r\n this.addSpecialZone(false, zoneType.OWL, 120000);\r\n break; \r\n case 7:\r\n this.addSpecialZone(false, zoneType.RABBIT, 120000);\r\n break; \r\n default:\r\n break; \r\n }\r\n }\r\n\r\n //odpočet vyrobení speciální zóny killer (výplň)\r\n if (this.specialZoneKillerTimeout > 0){\r\n this.specialZoneKillerTimeout -= this.delay;\r\n }\r\n else\r\n {\r\n //interval něco mezi 10 - 20 sekundama\r\n this.specialZoneKillerTimeout = 10000 + Math.floor(Math.random() * 5000);\r\n\r\n // let zone = Math.floor(Math.random() * 2); //(0-9) 7/10 = 70% sance spawnu\r\n this.addSpecialZone(false, zoneType.KILLER, 30000);\r\n }\r\n\r\n\r\n if(this.eraserZoneCount < 3){\r\n \r\n if(this.eraserZoneDelay > 2500)\r\n {\r\n //speciální zóna\r\n this.addSpecialZone(true, zoneType.ERASER, 5000);\r\n this.eraserZoneCount++;\r\n this.eraserZoneDelay = 0;\r\n }\r\n else{\r\n this.eraserZoneDelay +=this.delay;\r\n }\r\n\r\n }\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n\r\n\r\n\r\n /**\r\n * zprocesování většiny časovačů a odpočtů hry\r\n */\r\n timeoutsProcess () {\r\n\r\n //odpočet začátku hry\r\n //gamePhaseEnum\r\n if(this.state.gamePhase === gamePhaseEnum.LOBBY || this.state.gamePhase === gamePhaseEnum.PAUSE)\r\n {\r\n let readyIndex = menuControlItems.indexOf('ready');\r\n\r\n\r\n let notReadyPlayers = 0;\r\n let players = this.players.filter(pl => pl.controlledBy !== controls.AI);\r\n if(players.length > 0){\r\n notReadyPlayers = players.filter(pl=>pl.inMenuCurrent !== readyIndex);\r\n }\r\n\r\n if(players.length > 0)\r\n {\r\n //čekám na to až budou všichni ready\r\n if(notReadyPlayers.length === 0) \r\n {\r\n if (this.startCountdown > 0){\r\n \r\n this.startCountdown -= this.delay;\r\n\r\n if(this.startCountdown <0)\r\n this.startCountdown = 0;\r\n\r\n if(this.startCountdown <3100 && !this.soundCountdownPlayed)\r\n {\r\n this.soundCountdownPlayed = true;\r\n this.playSound(12,1);\r\n }\r\n\r\n this.startCountdownRunning = true;\r\n }\r\n else\r\n {\r\n this.updateGamePhase(gamePhaseEnum.GAME);\r\n } \r\n }\r\n else\r\n {\r\n //reset odpočtu\r\n this.startCountdown = this.startCountdownDefault;\r\n this.startCountdownRunning = false;\r\n this.soundCountdownPlayed = false;\r\n }\r\n\r\n //update state\r\n this.updateCountdown();\r\n }\r\n }\r\n\r\n\r\n if(this.state.gamePhase !== gamePhaseEnum.GAME)\r\n {\r\n\r\n //dočasné zastavení autoposuvu v menu\r\n if(this.menuFreezeCountdown >0)\r\n {\r\n this.menuFreezeCountdown -= this.delay;\r\n }\r\n\r\n //automatické přesuny v menu\r\n if (this.menuAutoMoveCountdown > 0){\r\n\r\n this.menuAutoMoveCountdown -= this.delay;\r\n }\r\n\r\n\r\n if(this.state.gamePhase === gamePhaseEnum.LOBBY || this.state.gamePhase === gamePhaseEnum.RESULTS){\r\n\r\n //automatické přesuny v menu\r\n if(this.menuAutoMoveCountdown <=0 && this.menuFreezeCountdown <=0)\r\n {\r\n this.menuAutoMoveCountdown = this.menuAutoMoveCountdownDefault;\r\n \r\n let newPhase = null\r\n if(this.state.gamePhase === gamePhaseEnum.LOBBY){\r\n newPhase = gamePhaseEnum.RESULTS;\r\n }\r\n else{\r\n newPhase = gamePhaseEnum.LOBBY;\r\n }\r\n\r\n //změním fázi\r\n this.updateGamePhase(newPhase); \r\n }\r\n }\r\n }\r\n\r\n //odpočet pro pokyny v menu\r\n if(this.menuActionTimeout >0){\r\n this.menuActionTimeout -= this.delay;\r\n }\r\n\r\n //odp oslední pauzy\r\n this.lastEsc += this.delay;\r\n\r\n //odpočet viditelnosti změněné hodnoty v menu\r\n if (this.countDownTempVisible > 0){\r\n this.countDownTempVisible -= this.delay;\r\n\r\n if(this.countDownTempVisible <0)\r\n this.countDownTempVisible = 0;\r\n\r\n //update state\r\n this.updateCountdown(); \r\n }\r\n };\r\n\r\n\r\n update () {\r\n\r\n let date = new Date();\r\n let actTime = date.getTime();\r\n\r\n //vyčtu aktuální stav gamepadů\r\n this.gamepads = navigator.getGamepads();\r\n\r\n //spočtu prodlevu\r\n this.delay = actTime - this.time;\r\n if (this.delay === actTime) {\r\n //pokud se měří první běh, není ještě nastavena hodnota time, proto delay ještě neplatí.\r\n this.delay = 0;\r\n }\r\n\r\n //odložím aktuální čas\r\n this.time = actTime;\r\n\r\n // krok pohybu postav cim vetsi cislo tim pujdou pomaleji\r\n this.movestep = this.delay / this.gameSpeed;\r\n //limiter maximalniho pohybu postav pri velmi nizkem fps (sekani hry)\r\n if (this.movestep > 1) this.movestep = 1;\r\n\r\n\r\n if(!this.pause){\r\n //zpracování odpočtů\r\n this.timeoutPausableProcess();\r\n }\r\n\r\n this.timeoutsProcess();\r\n\r\n\r\n let anyAction = false;\r\n //update hráčů\r\n for (let p = 0; p < this.players.length; p++) {\r\n\r\n let plAction = this.players[p].update(this.pause, this.gamepads);\r\n //todo: přidělat okamžité vyskočení z menu\r\n if (plAction)\r\n {\r\n anyAction = true;\r\n }\r\n }\r\n\r\n\r\n //přidávání nových hráčů přesunuto sem, z důvodu většího výkonu \r\n //(po zpracování hráčů přesně vím, který gamepad je potřeba kontrolovat na start, a který je použit ve hře)\r\n this.recognizePlayersAndControlls(this.gamepads);\r\n\r\n\r\n\r\n\r\n if(anyAction)\r\n {\r\n //okamžitý návrat do lobby\r\n this.menuAutoMoveCountdown = this.menuAutoMoveCountdownDefault;\r\n if(this.state.gamePhase === gamePhaseEnum.RESULTS && this.menuFreezeCountdown <=0)\r\n {\r\n //přesun na obrazovku lobby\r\n this.updateGamePhase(gamePhaseEnum.LOBBY);\r\n }\r\n }\r\n\r\n\r\n if(!this.pause){\r\n\r\n //mazání starých portálů\r\n for (let p = 0; p < this.portals.length; p++) {\r\n if(this.portals[p].permanent === false && this.portals[p].portalDuration <=0)\r\n {\r\n this.portals.splice(p,1);\r\n //console.log('mažu portál');\r\n break;\r\n }\r\n }\r\n\r\n\r\n //update portálů\r\n for (let p = 0; p < this.portals.length; p++) {\r\n this.portals[p].update();\r\n\r\n if(this.targetCodeChangingCountdown <=0){\r\n //update adresy jedno uza 10s\r\n this.portals[p].changeTargetCode();\r\n }\r\n }\r\n\r\n\r\n //mazání starých propojení\r\n for (let c = 0; c < this.connections.length; c++) {\r\n if(this.connections[c].conectionDuration <=0)\r\n {\r\n this.connections.splice(c,1);\r\n //console.log('mažu spojení');\r\n break;\r\n }\r\n }\r\n\r\n //update propojení\r\n for (let c = 0; c < this.connections.length; c++) {\r\n this.connections[c].update();\r\n }\r\n\r\n\r\n //mazání starých speciálních zón\r\n for (let z = 0; z < this.zones.length; z++) {\r\n \r\n if(this.zones[z].toErase)\r\n {\r\n this.zones.splice(z,1);\r\n //console.log('mažu zónu');\r\n break;\r\n }\r\n }\r\n\r\n //update propojení\r\n for (let z = 0; z < this.zones.length; z++) {\r\n this.zones[z].update();\r\n }\r\n\r\n\r\n //mazání starých explozí\r\n for (let e = 0; e < this.explosions.length; e++) {\r\n if(this.explosions[e].duration <=0)\r\n {\r\n this.explosions.splice(e,1);\r\n break;\r\n }\r\n }\r\n\r\n //update explozí\r\n for (let e = 0; e < this.explosions.length; e++) {\r\n this.explosions[e].update();\r\n }\r\n\r\n\r\n //mazání starých bonusů\r\n for (let b = 0; b < this.bonusPoints.length; b++) {\r\n if(this.bonusPoints[b].permanent !== true && this.bonusPoints[b].duration <=0)\r\n {\r\n this.bonusPoints.splice(b,1);\r\n break;\r\n }\r\n }\r\n\r\n //update bonusů\r\n for (let b = 0; b < this.bonusPoints.length; b++) {\r\n this.bonusPoints[b].update();\r\n }\r\n\r\n //mazání starých rotátorů\r\n for (let r = 0; r < this.rotators.length; r++) {\r\n if(this.rotators[r].permanent !== true && this.rotators[r].duration <=0)\r\n {\r\n this.rotators.splice(r,1);\r\n break;\r\n }\r\n }\r\n\r\n //update rotátorů\r\n for (let r = 0; r < this.rotators.length; r++) {\r\n this.rotators[r].update();\r\n }\r\n }\r\n };\r\n\r\n\r\n /**\r\n * vrátí existující uložený mapping gamepadu, nebo null, pokud takový mapping neexistuje\r\n * @param {*} gamapadIdName \r\n */\r\n loadMapping(gamapadIdName) {\r\n\r\n //struktura dat je pole, kde každý záznam má vždy klíč: \"gamapadIdName\" a data \"mappingArray\"\r\n let storageKeyGamepadsMappings = 'GamepadsMappings';\r\n\r\n \r\n if (typeof localStorage[storageKeyGamepadsMappings] !== 'undefined') {\r\n //načtení mappingů\r\n this.gamepadsMappingsArray = JSON.parse(localStorage[storageKeyGamepadsMappings]);\r\n }\r\n\r\n //pokud nebylo načteno, použije se przdné pole (viz konstruktor)\r\n let mapping = this.gamepadsMappingsArray.find(ma=>ma.gamapadIdName === gamapadIdName);\r\n\r\n if(mapping!== undefined && mapping!==null)\r\n {\r\n //vrátí uložené mapování\r\n return mapping.mappingArray;\r\n }\r\n \r\n return null;\r\n }\r\n\r\n /**\r\n * uloží, nebo aktualizuje uložený mapping gamepadu\r\n * @param {*} gamapadIdName \r\n * @param {*} mappingArray \r\n */\r\n saveOrUpdateMapping(gamapadIdName, mappingArray){\r\n\r\n //struktura dat je pole, kde každý záznam má vždy klíč: \"gamapadIdName\" a data \"mappingArray\"\r\n //this.gamepadsMappingsArray = [];\r\n let storageKeyGamepadsMappings = 'GamepadsMappings';\r\n\r\n if (typeof localStorage[storageKeyGamepadsMappings] !== 'undefined') {\r\n //načtení všech uložených mappingů\r\n this.gamepadsMappingsArray = JSON.parse(localStorage[storageKeyGamepadsMappings]);\r\n }\r\n\r\n //vyhledání mapingu a jeho update, nebo zapsání\r\n //pokud nebylo načteno, použije se przdné pole (viz konstruktor)\r\n let mapping = this.gamepadsMappingsArray.find(ma=>ma.gamapadIdName === gamapadIdName);\r\n \r\n if(mapping!== undefined && mapping!==null)\r\n {\r\n //UPDATE mappingu\r\n mapping.mappingArray = mappingArray;\r\n }\r\n else\r\n {\r\n //INSERT nového mapingu, objekt sestavuju až zde (pro jednoduchost)\r\n this.gamepadsMappingsArray.push({gamapadIdName:gamapadIdName, mappingArray: mappingArray});\r\n }\r\n\r\n \r\n //update hodnot do storage\r\n localStorage[storageKeyGamepadsMappings] = JSON.stringify(this.gamepadsMappingsArray);\r\n }\r\n\r\n\r\n\r\n\r\n //smazání celého canvasu\r\n clearAllCanvas()\r\n {\r\n //přemazání info canvasu\r\n this.infoctx.clearRect(0, 0, this.infocanvas.width, this.infocanvas.height);\r\n\r\n //přemazání info canvasu\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n\r\n\r\n\r\n draw () {\r\n\r\n //přemazání info canvasu\r\n this.infoctx.clearRect(0, 0, this.infocanvas.width, this.infocanvas.height);\r\n\r\n\r\n //vykreslování hráčů\r\n for (let p = 0; p < this.players.length; p++) {\r\n this.players[p].draw();\r\n }\r\n\r\n //vykreslování propojení\r\n for (let c = 0; c < this.connections.length; c++) {\r\n this.connections[c].draw();\r\n }\r\n\r\n //kreslení bonusů\r\n for (let b = 0; b < this.bonusPoints.length; b++) {\r\n this.bonusPoints[b].draw();\r\n }\r\n\r\n //vykreslení zóny\r\n for (let z = 0; z < this.zones.length; z++) {\r\n this.zones[z].draw();\r\n }\r\n\r\n //vykreslování portálů (nad zónami)\r\n for (let p = 0; p < this.portals.length; p++) {\r\n this.portals[p].draw();\r\n }\r\n\r\n\r\n //vykreslení explozí\r\n for (let e = 0; e < this.explosions.length; e++) {\r\n this.explosions[e].draw();\r\n }\r\n\r\n //kreslení rotátorů\r\n for (let r = 0; r < this.rotators.length; r++) {\r\n this.rotators[r].draw();\r\n }\r\n\r\n };\r\n\r\n\r\n //přehrání samostatného zvuku\r\n playSound (soundIndex, distance) {\r\n \r\n if (this.soundEnabled) {\r\n \r\n //hlasitost podle vvzdálenosti od objektu\r\n var volumeNew = 1 - (0.3 * distance);\r\n if (volumeNew <= 0) volumeNew = 0;\r\n if (volumeNew > 1) volumeNew = 1;\r\n\r\n //volba aktuálního přehrávače kvůli rozložení množství naráz přehrávaných zvuků\r\n var actPlayer = null;\r\n if (this.soundPlayer1.paused) {\r\n actPlayer = this.soundPlayer1;\r\n }\r\n else if (this.soundPlayer2.paused) {\r\n actPlayer = this.soundPlayer2;\r\n }\r\n else if (this.soundPlayer3.paused) {\r\n actPlayer = this.soundPlayer3;\r\n }\r\n else if (this.soundPlayer4.paused) {\r\n actPlayer = this.soundPlayer4;\r\n }\r\n else if (this.soundPlayer5.paused) {\r\n actPlayer = this.soundPlayer5;\r\n }\r\n\r\n if (actPlayer !== null && !isNaN(actPlayer.duration)) {\r\n actPlayer.volume = volumeNew;\r\n\r\n actPlayer.currentTime = this.soundPositions[soundIndex][1];\r\n\r\n //console.log(Date.now());\r\n actPlayer.play();\r\n\r\n //nastavíme pauzu\r\n var k = setInterval(\r\n function (player) {\r\n player.pause();\r\n clearInterval(k);\r\n\r\n }, (this.soundPositions[soundIndex][2] - this.soundPositions[soundIndex][1]) * 1000, actPlayer\r\n );\r\n }\r\n }\r\n };\r\n\r\n\r\n //pauzování hry\r\n pauseGame(){\r\n \r\n //pauzovat se dá akorát hra, v loby pauza nebude fungovat\r\n if(!this.pause && (this.state.gamePhase === gamePhaseEnum.GAME)){\r\n this.pause = true;\r\n this.updateGamePhase(gamePhaseEnum.PAUSE);\r\n }\r\n\r\n //z tutorialu přecházím pouze do pauzy\r\n if((this.state.gamePhase === gamePhaseEnum.TUTORIAL)){\r\n this.updateGamePhase(gamePhaseEnum.PAUSE);\r\n }\r\n }\r\n\r\n\r\n //zobrazení tutorialu hry\r\n tutorial(){\r\n\r\n this.updateGamePhase(gamePhaseEnum.TUTORIAL);\r\n console.log('tutorial');\r\n }\r\n\r\n\r\n runLoop() {\r\n\r\n window.requestAnimationFrame(step);\r\n\r\n var self = this;\r\n\r\n function step() {\r\n\r\n self.update();\r\n self.draw();\r\n\r\n window.requestAnimationFrame(step);\r\n }\r\n };\r\n\r\n //změny na velikosti okna\r\n updateCanvasSize(){\r\n\r\n if(this.canvas.width !== window.innerWidth || this.canvas.height !== window.innerHeight)\r\n {\r\n //jen při změnách velikosti - canvas size\r\n this.canvas.width = window.innerWidth;\r\n this.canvas.height = window.innerHeight;\r\n\r\n this.infocanvas.width = window.innerWidth;\r\n this.infocanvas.height = window.innerHeight;\r\n\r\n this.bgcanvas.width = this.canvas.width / 4;\r\n this.bgcanvas.height = this.canvas.height / 4;\r\n\r\n //stredy canvasu\r\n this.stredx = Math.round(this.canvas.width / 2);\r\n this.stredy = Math.round(this.canvas.height / 2);\r\n this.bgstredx = Math.round(this.bgcanvas.width / 2);\r\n this.bgstredy = Math.round(this.bgcanvas.height / 2);\r\n }\r\n\r\n //vždy - update zakázané oblasti\r\n this.setState({\r\n canvasSize :{width: window.innerWidth, height: window.innerHeight}\r\n ,bottomHudsHeight: this.hudsRef.current.clientHeight\r\n }, ()=> {\r\n\r\n //update portálů\r\n this.reCreateBasicPortals();\r\n });\r\n \r\n }\r\n\r\n\r\n \r\n /**\r\n * Přepíná okno hry do full screenu, volitelně umí také udělat full screen nad vybraným elementem.\r\n */\r\n toggleFullScreen() {\r\n if (!document.fullscreenElement) {\r\n document.documentElement.requestFullscreen();\r\n } else {\r\n if (document.exitFullscreen) {\r\n document.exitFullscreen(); \r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n componentDidMount(){\r\n\r\n //úprava velikosti canvasu\r\n this.canvas.width = this.state.canvasSize.width;\r\n this.canvas.height = this.state.canvasSize.height;\r\n\r\n //úprava velikosti canvasu\r\n this.infocanvas.width = this.state.canvasSize.width;\r\n this.infocanvas.height = this.state.canvasSize.height;\r\n\r\n //úprava velikosti canvasu v pozadí\r\n this.bgcanvas.width = this.state.canvasSize.width /4;\r\n this.bgcanvas.height = this.state.canvasSize.height /4;\r\n\r\n //stredy canvasu\r\n this.stredx = Math.round(this.canvas.width / 2);\r\n this.stredy = Math.round(this.canvas.height / 2);\r\n this.bgstredx = Math.round(this.bgcanvas.width / 2);\r\n this.bgstredy = Math.round(this.bgcanvas.height / 2);\r\n\r\n //kontexty canvasů\r\n this.ctx = this.canvas.getContext('2d');\r\n this.infoctx = this.infocanvas.getContext('2d');\r\n this.bgctx = this.bgcanvas.getContext('2d'); \r\n \r\n //přidám demo hráče\r\n this.addAI(this.AIDemoPlayers);\r\n \r\n //listener na resize\r\n window.addEventListener(\"resize\", this.updateCanvasSize.bind(this));\r\n this.updateCanvasSize();\r\n\r\n ReactGA.initialize('UA-27542164-3');\r\n\r\n //načtení hry\r\n ReactGA.event({\r\n category: 'game',\r\n action: 'load',\r\n label: 'info'\r\n });\r\n\r\n this.runLoop();\r\n }\r\n\r\n\r\n \r\n //vrací aktuální výšku zakázáné oblasti\r\n getBottomHudsHeight()\r\n {\r\n return this.state.bottomHudsHeight;\r\n }\r\n\r\n //aktualizace service workera\r\n updateServiceWorker (){\r\n const serviceWorkerRegistration = this.state.serviceWorkerRegistration;\r\n\r\n if(serviceWorkerRegistration)\r\n {\r\n const registrationWaiting = serviceWorkerRegistration.waiting;\r\n\r\n if (registrationWaiting) {\r\n registrationWaiting.postMessage({ type: 'SKIP_WAITING' });\r\n registrationWaiting.addEventListener('statechange', e => {\r\n if (e.target.state === 'activated') {\r\n window.location.reload();\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n updateSW (){\r\n this.updateServiceWorker();\r\n };\r\n\r\n setSW (){\r\n this.setServiceWorkerUpdated(false,null);\r\n };\r\n\r\n \r\n render() {\r\n\r\n const { t } = this.props;\r\n\r\n const phase = this.state.gamePhase;\r\n const serviceWorkerUpdated = this.state.serviceWorkerUpdated;\r\n\r\n return(\r\n
\r\n\r\n
\r\n
\r\n\r\n this.bgcanvas = bgcanvas} >\r\n this.canvas = canvas}>\r\n this.infocanvas = infocanvas}>\r\n\r\n (this.playerRef = ref)} />\r\n\r\n {serviceWorkerUpdated && \r\n
\r\n
this.updateSW()}>{t('game.updateNow')}
\r\n
this.setSW()}>{t('game.updateLater')}
\r\n
}\r\n\r\n\r\n\r\n {phase !== gamePhaseEnum.GAME && phase!== gamePhaseEnum.TUTORIAL &&\r\n
\r\n

\r\n Cybertracers\r\n

\r\n\r\n #devbobcz 2020\r\n
}\r\n\r\n
\r\n {(phase === gamePhaseEnum.LOBBY || phase === gamePhaseEnum.PAUSE) && \r\n }\r\n\r\n {phase === gamePhaseEnum.RESULTS && \r\n } \r\n
\r\n\r\n {(phase === gamePhaseEnum.GAME || phase === gamePhaseEnum.PAUSE || this.state.countDownVisible) && \r\n <>\r\n \r\n
\r\n \"powerup\r\n  \r\n {t('tutorial.tutorialShow')}\r\n
\r\n \r\n }\r\n\r\n {phase === gamePhaseEnum.TUTORIAL &&\r\n }\r\n\r\n
\r\n {phase === gamePhaseEnum.GAME && this.state.playersInfo.map( pi=> { \r\n return (\r\n \r\n );\r\n })\r\n }\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withTranslation('common')(App);\r\n","import translation_en from \"./translations/en/common.json\";\r\nimport translation_cs from \"./translations/cs/common.json\";\r\n\r\nimport i18n from 'i18next';\r\nimport { initReactI18next } from 'react-i18next';\r\n\r\nimport Backend from 'i18next-http-backend';\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\n// not like to use this?\r\n// have a look at the Quick start guide \r\n// for passing in lng and translations on init\r\n\r\ni18n\r\n // load translation using http -> see /public/locales (i.e. https://github.com/i18next/react-i18next/tree/master/example/react/public/locales)\r\n // learn more: https://github.com/i18next/i18next-http-backend\r\n .use(Backend)\r\n // detect user language\r\n // learn more: https://github.com/i18next/i18next-browser-languageDetector\r\n .use(LanguageDetector)\r\n // pass the i18n instance to react-i18next.\r\n .use(initReactI18next)\r\n // init i18next\r\n // for all options read: https://www.i18next.com/overview/configuration-options\r\n .init({\r\n fallbackLng: 'en',\r\n debug: true,\r\n\r\n interpolation: {\r\n escapeValue: false, // not needed for react as it escapes by default\r\n },\r\n react: {\r\n useSuspense: false,\r\n wait: false,\r\n },\r\n resources: {\r\n en: {\r\n common: translation_en // 'common' is our custom namespace\r\n },\r\n cs: {\r\n common: translation_cs\r\n },\r\n }\r\n });\r\n\r\n\r\nexport default i18n;","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\n\r\nimport './index.css';\r\nimport './i18n';\r\n\r\n\r\n\r\nReactDOM.render(\r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n"],"sourceRoot":""}