From b1a21b6bb59c0a3ea7d713a4b1f54b574deaf123 Mon Sep 17 00:00:00 2001 From: ian13456 <21ianh1@tas.tw> Date: Sun, 29 Sep 2019 23:31:56 +0800 Subject: [PATCH] Updates --- asset-manifest.json | 6 +++--- index.html | 2 +- ... precache-manifest.a8701b271e3b009e20cdece295190304.js | 8 ++++---- service-worker.js | 2 +- static/js/main.bd72e617.chunk.js.map | 1 - .../js/{main.bd72e617.chunk.js => main.f3ac5b48.chunk.js} | 4 ++-- static/js/main.f3ac5b48.chunk.js.map | 1 + 7 files changed, 12 insertions(+), 12 deletions(-) rename precache-manifest.d4912b87e5e4603870c768a090ac0e3e.js => precache-manifest.a8701b271e3b009e20cdece295190304.js (88%) delete mode 100644 static/js/main.bd72e617.chunk.js.map rename static/js/{main.bd72e617.chunk.js => main.f3ac5b48.chunk.js} (99%) create mode 100644 static/js/main.f3ac5b48.chunk.js.map diff --git a/asset-manifest.json b/asset-manifest.json index 92cb3fa..4c31f88 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,14 +1,14 @@ { "files": { "main.css": "/the-room/static/css/main.340c2443.chunk.css", - "main.js": "/the-room/static/js/main.bd72e617.chunk.js", - "main.js.map": "/the-room/static/js/main.bd72e617.chunk.js.map", + "main.js": "/the-room/static/js/main.f3ac5b48.chunk.js", + "main.js.map": "/the-room/static/js/main.f3ac5b48.chunk.js.map", "runtime~main.js": "/the-room/static/js/runtime~main.8897cd81.js", "runtime~main.js.map": "/the-room/static/js/runtime~main.8897cd81.js.map", "static/js/2.d0fff31e.chunk.js": "/the-room/static/js/2.d0fff31e.chunk.js", "static/js/2.d0fff31e.chunk.js.map": "/the-room/static/js/2.d0fff31e.chunk.js.map", "index.html": "/the-room/index.html", - "precache-manifest.d4912b87e5e4603870c768a090ac0e3e.js": "/the-room/precache-manifest.d4912b87e5e4603870c768a090ac0e3e.js", + "precache-manifest.a8701b271e3b009e20cdece295190304.js": "/the-room/precache-manifest.a8701b271e3b009e20cdece295190304.js", "service-worker.js": "/the-room/service-worker.js", "static/css/main.340c2443.chunk.css.map": "/the-room/static/css/main.340c2443.chunk.css.map", "static/media/13_vortex_spritesheet.png": "/the-room/static/media/13_vortex_spritesheet.a8c4d5d4.png", diff --git a/index.html b/index.html index 6669491..faa3966 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -The Room
\ No newline at end of file +The Room
\ No newline at end of file diff --git a/precache-manifest.d4912b87e5e4603870c768a090ac0e3e.js b/precache-manifest.a8701b271e3b009e20cdece295190304.js similarity index 88% rename from precache-manifest.d4912b87e5e4603870c768a090ac0e3e.js rename to precache-manifest.a8701b271e3b009e20cdece295190304.js index a165236..3f0a3e4 100644 --- a/precache-manifest.d4912b87e5e4603870c768a090ac0e3e.js +++ b/precache-manifest.a8701b271e3b009e20cdece295190304.js @@ -1,10 +1,10 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ { - "revision": "fbac60b145758a8ac643aa1646e6d02c", + "revision": "41df16df2c63201ef333dd72a9449114", "url": "/the-room/index.html" }, { - "revision": "4fe2abb1d4409fb3c082", + "revision": "1c9edfa543ab581866fb", "url": "/the-room/static/css/main.340c2443.chunk.css" }, { @@ -12,8 +12,8 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/the-room/static/js/2.d0fff31e.chunk.js" }, { - "revision": "4fe2abb1d4409fb3c082", - "url": "/the-room/static/js/main.bd72e617.chunk.js" + "revision": "1c9edfa543ab581866fb", + "url": "/the-room/static/js/main.f3ac5b48.chunk.js" }, { "revision": "1dab862c71e9a0946b93", diff --git a/service-worker.js b/service-worker.js index b319059..2951b0a 100644 --- a/service-worker.js +++ b/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); importScripts( - "/the-room/precache-manifest.d4912b87e5e4603870c768a090ac0e3e.js" + "/the-room/precache-manifest.a8701b271e3b009e20cdece295190304.js" ); self.addEventListener('message', (event) => { diff --git a/static/js/main.bd72e617.chunk.js.map b/static/js/main.bd72e617.chunk.js.map deleted file mode 100644 index 2d41df2..0000000 --- a/static/js/main.bd72e617.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../config/index.js","../assets/gui/logo.png","../assets/music/Trouble-Is-Brewing.mp3","../assets/sprites/Owlet_Monster_Walk_6.png","../assets/sprites/Owlet_Monster_Idle_4.png","../assets/sprites/Dungeon_Tileset.png","../assets/sprites/7_firespin_spritesheet.png","../assets/sprites/8_protectioncircle_spritesheet.png","../assets/sprites/13_vortex_spritesheet.png","../assets/sprites/18_midnight_spritesheet.png","../assets/music/Dark-Fog.mp3","../config/config.js","containers/Home/Home.js","../core/modules/interfaces/playerSprite/playerSprite.js","../core/utils/helpers.js","../core/modules/app/player/controls.js","../core/modules/app/player/player.js","../core/modules/app/room/room.js","../core/modules/interfaces/mapSprite/mapSprite.js","../core/modules/app/map/map.js","../core/modules/app/enemy/enemy.js","../core/modules/interfaces/spotlight/spotlight.js","../core/modules/interfaces/effects/effects.js","../core/game.js","containers/Game/Game.js","containers/Main.js","serviceWorker.js","index.js"],"names":["module","exports","require","Config","window","width","height","game","render","viewportPadding","player","acc","vertical","horizontal","light","far","near","sprite","map","enemyIncrement","room","radius","gridVals","empty","enemy","end","redPotion","bluePotion","yellowPotion","greenPotion","padding","px","nx","py","ny","floorSize","vertWallSize","horzWallSize","monsterGridTimeoutConstant","levelEnemyInterval","powerups","red","duration","probability","gridVal","description","blue","playerSpeed","yellow","lightFar","lightNear","green","enemySpeed","speed","levelUpFactor","Wrapper","styled","div","AppLogo","img","StartButton","button","Home","useEffect","bgm","Audio","TroubleIsBrewing","play","onended","currentTime","pause","src","logo","alt","to","SPRITE_WIDTH","PlayerSprite","p","loadSprite","walkingImgs","idleImgs","loadImage","PlayerWalkImg","i","pos","get","push","PlayerIdleImg","draw","windowPos","wx","x","wy","y","rectMode","CENTER","fill","length","isFlipped","scale","frameCount","isIdle","Math","floor","imageMode","image","rect","pop","flipLeft","flipRight","this","isSetup","MAP_WIDTH","MAP_HEIGHT","Helpers","element","styles","getComputedStyle","clientWidth","parseFloat","paddingLeft","paddingRight","clientHeight","paddingTop","paddingBottom","random","getAscii","c","charCodeAt","getRoomRep","relativeToGlobal","globalToRelative","mapGlobalToPlayerViewport","roomGlobalPos","controls","globalPos","pGlobalX","pGlobalY","mapPlayerToRoomNumber","playerX","playerY","round","getRoomBoundaries","roomGlobal","minX","TOTAL_ROOM_DIMENSION","minY","maxX","maxY","getHallwayBoundaries","roomBoundaries","direction","Number","MAX_VALUE","MIN_VALUE","isBetween","min","val","max","epsilon","VERT_ACC","HORZ_ACC","ROOM_BORDER_PADDING_PX","ROOM_BORDER_PADDING_PY","ROOM_BORDER_PADDING_NX","ROOM_BORDER_PADDING_NY","VIEWPORT_PADDING","BLUE_POWERUP_SPEED","Controls","tick","handleInputAndCollision","deltaFactor","deltaTime","VERT_DELTA","HORZ_DELTA","UP_PRESSED","keyIsDown","UP_ARROW","DOWN_PRESSED","DOWN_ARROW","LEFT_PRESSED","LEFT_ARROW","RIGHT_PRESSED","RIGHT_ARROW","currRoom","getRoomByCoords","hMinY","hMaxY","hMinX","hMaxX","playerMoved","top","bottom","left","right","playerMove","registerMap","getPosData","ROOM_WIDTH","ROOM_HEIGHT","Player","update","getRoomNRoomCoords","relativeCoords","rooms","EMPTY_CELL_VAL","ENEMY_CELL_VAL","END_CELL_VAL","ROOM_RADIUS","MONSTER_GRID_TIMEOUT_CONSTANT","LEVEL_ENEMY_INTERVAL","Room","updateGrid","prevVal","grid","timeout","setTimeout","clearTimeout","level","updateTunnels","n","gridTunnels","getVal","getValTunnels","generatePowerup","potionGridVal","Array","floorGrid","r","floorGridTunnels","FLOOR_SIZE","VERT_WALL_SIZE","HORZ_WALL_SIZE","ENEMY_GRID_VAL","END_GRID_VAL","RED_POTION_GRID_VAL","BLUE_POTION_GRID_VAL","YELLOW_POTION_GRID_VAL","GREEN_POTION_GRID_VAL","MapSprite","WallTilesImg","vertWall","vertWallT","horzWall","horzWallB","corner","cornerB","floors","bones","Object","keys","forEach","roomCoords","drawRoom","GLOBAL_COORDS","WINDOW_COORDS","POWERUPS","Map","initiateRooms","startingRoom","paths","roomsStrings","temp","splice","newRoom","getOppositeDir","newPaths","getSurroundings","newPath","newRoomRep","powerupColor","powerup","endingRooms","trueEndingRoom","endingGlobalCoords","isRoomExists","dir","Enemy","move","surroundings","dist","getDist","newPosition","tempDist","coords","translations","translation","newCoords","abs","p1","p2","sqrt","generateRandomEnemyPos","LIGHT_FAR","LIGHT_NEAR","SPOTLIGHT_SIZE","YELLOW_POWERUP","SPOTLIGHT_SIZE_YELLOW_POWERUP","Spotlight","spotlight","document","getElementById","getSpotlight","getPlayer","prototype","playerRef","style","backgroundImage","Effects","effects","sprites","loadSprites","YellowEffectImg","posR","posC","BlueEffectImg","GreenEffectImg","RedEffectImg","addEffect","name","removeEffect","totalString","key","join","innerHTML","YELLOW","BLUE","GREEN","RED","spriteIndex","cos","sin","PI","ENEMY_SPEED","ENEMY_LEVEL_UP","RED_POWERUP","BLUE_POWERUP","GREEN_POWERUP","ENEMY_INC","Game","container","effectIndicator","enemiesMove","enemies","e","checkPlayerPos","gameOver","levelUp","redPotionPowerup","bluePotionPowerup","yellowPotionPowerup","greenPotionPowerup","roomNRoomCoords","enemyCount","initiateEnemyMovement","gameover","p5instance","noLoop","powerupConsumed","redPotionTimeout","undefined","console","log","bluePotionTimeout","yellowPotionTimeout","clearInterval","monsterInterval","setInterval","greenPotionTimeout","interval","terminate","remove","sketch","preload","setup","createCanvas","getElementWidth","getElementHeight","parent","textFont","textAlign","smooth","background","windowResized","resizeCanvas","p5","DebugWrapper","SpotlightWrapper","EffectWrapper","GameOverWrapper","HomeButton","LevelWrapper","GameWrapper","mount","useRef","title","DarkFog","TheRoom","current","id","ref","withRouter","path","component","Boolean","location","hostname","match","main","ReactDOM","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.bd72e617.chunk.js","sourcesContent":["module.exports = require('./config')\n","module.exports = __webpack_public_path__ + \"static/media/logo.dc65f600.png\";","module.exports = __webpack_public_path__ + \"static/media/Trouble-Is-Brewing.671462cd.mp3\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAAAgCAMAAABzRoe3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRDQjRBRTVCQjA0QjExRTlBNDkxRjY5NDU3QTBCQ0M4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjRDQjRBRTVDQjA0QjExRTlBNDkxRjY5NDU3QTBCQ0M4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NENCNEFFNTlCMDRCMTFFOUE0OTFGNjk0NTdBMEJDQzgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NENCNEFFNUFCMDRCMTFFOUE0OTFGNjk0NTdBMEJDQzgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4x6wuAAAAAHlBMVEVeLCkcEhscGjD9ohb8UAOUoLoqME5mcpH8/v4AAACcma48AAAACnRSTlP///////////8AsswszwAAAd9JREFUeNrsmNGOhCAMRauztPj/P7wwoCC2xWB5mESSzT7ceri3IozC9uMD3gBvgDeA3cDvmGeW44OdQUQfhxuPMMIHK4NZjQUOJzRA4oORwaRSGg7NGyDywcbgSSZC6wbIfDjhRw1mc1HBr468/Ql8aArGDB7zY4J4lK4350N1vQio+KzBoq+aPoUPDZ8DVPram2BdaVloPfV4Kn8PQKUg/rtMQIrBWEBlhSyh4BJgGh/y/qwBsOiswVih6h3+9oS/70JOBdzTcwHi4PVDfKhWmQbwusETgHTZlg82BitAOKikfXIGH2wMlq0knrROkGfwwcjghgCqbMAHTgYjg+F6F6aAoDrg9Wf8PMGFD72E1UbQNUgpBP9j7mED0gSJz/+cFhL2AKc1Hv7+Ph/HFxSDEkBtQJ6g5cNNgyKgOU2TLj2ku0FB1xvA69AiQgHJS2Q0QH6GD50t0BpwJwA9CZBP+3APnRMPMm8QIPKFZ0APEHTaDfKvtZgDEPPeG7V0F4QAnQYc87t2E66XUNyk/Q2Dmu6Rl2MoLeGZL+/D+X1CfAa82IBcgCTJpUD8KJEdqjqq0ysBdh1JtPj9KNIPIH8WSgXYkVG5wbjpATCtNdJMKGoK2AswKO9q823pX4ABAOiAwdSdaMECAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAgCAMAAADt/IAXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYxMkYwQTE5QjA0QjExRTk4MTNCQjE0Q0UxMEM4NkYyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYxMkYwQTFBQjA0QjExRTk4MTNCQjE0Q0UxMEM4NkYyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjEyRjBBMTdCMDRCMTFFOTgxM0JCMTRDRTEwQzg2RjIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjEyRjBBMThCMDRCMTFFOTgxM0JCMTRDRTEwQzg2RjIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7gOi3WAAAAHlBMVEVeLCkcEhv9ohYcGjD8UAOUoLoqME5mcpH8/v4AAAAD02/MAAAACnRSTlP///////////8AsswszwAAAWdJREFUeNrsltFuwyAMRW+aYZP//+FBQgkZNjZs0l7ql0o9zvEVARQc/1z4BPgEmGmms9a5GWAsIIq5gtZhcdkPr6DQ3BBogWt+OAUX5auEBourfvgED8w8z1U/XIKSPhM6Oa3yzo8JQQaXJZI2f8RFPyYECewSb/wW7/1wCHIDF77vvG28P15Sfn6C558+wEjQBMi1pYbngFRO3vvhEBwWTx1hlWNCUBqIBB4dfBjAEDwM6kXAxjmW/JgZcG3QEFa55IdTUI9Kvkr1u1rlqh/eAQdhiC2u+eEfEJAq0QB5wM1ZWiHIfrgF5xKePeob4lh4vwkTl/1wDqi31dfrFbQ9Ft/8p+F9l98BlVNQBfoEmbsCtLw2zARoBKThk5MY4OZagMGAZkKQzzlx3WPcf1hS5SVgF+BIfzYCYQ8YvCyzHK/ZByUgCcfQJTB4+d6YeB5zAiINT3AzgC6g43dc8ONPByzwbwEGAG2MgKLG/4p7AAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/Dungeon_Tileset.d30c4780.png\";","module.exports = __webpack_public_path__ + \"static/media/7_firespin_spritesheet.c9ef197f.png\";","module.exports = __webpack_public_path__ + \"static/media/8_protectioncircle_spritesheet.c304a897.png\";","module.exports = __webpack_public_path__ + \"static/media/13_vortex_spritesheet.a8c4d5d4.png\";","module.exports = __webpack_public_path__ + \"static/media/18_midnight_spritesheet.f7d9be13.png\";","module.exports = __webpack_public_path__ + \"static/media/Dark-Fog.e45428b9.mp3\";","const Config = {\n window: {\n width: 1000,\n height: 800\n },\n game: {\n render: {\n viewportPadding: 100\n },\n player: {\n acc: {\n vertical: 5,\n horizontal: 5\n },\n light: {\n far: 100, // px\n near: 40\n },\n sprite: {\n width: 32,\n height: 32\n }\n },\n map: {\n width: 5000,\n height: 3000,\n enemyIncrement: 5 // every 4 levels\n },\n room: {\n width: 9,\n height: 9,\n radius: 4,\n gridVals: {\n empty: 0,\n enemy: 1,\n end: 2,\n redPotion: 3,\n bluePotion: 4,\n yellowPotion: 5,\n greenPotion: 6\n },\n padding: {\n px: 20,\n nx: 24,\n py: 28,\n ny: 20\n },\n floorSize: 16,\n vertWallSize: 7,\n horzWallSize: 16,\n monsterGridTimeoutConstant: 3000, // 1s\n levelEnemyInterval: 200\n },\n powerups: {\n red: {\n duration: 5000,\n probability: 0.05,\n // probability: 1,\n gridVal: 3,\n description: 'Invincibility'\n },\n blue: {\n playerSpeed: 7,\n duration: 5000,\n probability: 0.1,\n // probability: 1,\n gridVal: 4,\n description: 'Speed'\n },\n yellow: {\n duration: 5000,\n probability: 0.1,\n // probability: 1,\n gridVal: 5,\n lightFar: 200,\n lightNear: 80,\n description: 'Night Vision'\n },\n green: {\n enemySpeed: 1000,\n duration: 5000,\n probability: 0.5,\n // probability: 1,\n gridVal: 6,\n description: 'Necromancer'\n }\n },\n enemy: {\n speed: 500,\n levelUpFactor: 0.95\n }\n }\n}\n\nexport default Config\n","import logo from 'assets/gui/logo.png'\nimport React, { useEffect } from 'react'\nimport styled from 'styled-components'\nimport { Link } from 'react-router-dom'\nimport TroubleIsBrewing from 'assets/music/Trouble-Is-Brewing.mp3'\n\nconst color = '#1D1F27'\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: ${color};\n`\n\nconst AppLogo = styled.img`\n width: 60%;\n`\n\nconst StartButton = styled.button`\n margin: 1em 1em;\n padding: 0.25em 1em;\n border: 2px solid white;\n border-radius: 10px;\n background: transparent;\n color: white;\n font-size: 200%;\n\n &:active {\n outline: none;\n }\n`\n\nfunction Home() {\n useEffect(() => {\n const bgm = new Audio(TroubleIsBrewing)\n bgm.play()\n\n bgm.onended = () => {\n bgm.currentTime = 0\n }\n\n return () => {\n bgm.pause()\n bgm.currentTime = 0\n }\n })\n\n return (\n \n \n \n START\n \n \n )\n}\n\nexport default Home\n","import PlayerWalkImg from 'assets/sprites/Owlet_Monster_Walk_6.png'\nimport PlayerIdleImg from 'assets/sprites/Owlet_Monster_Idle_4.png'\nimport Config from 'config'\n\n// change every 5 frames\nconst SPRITE_CHANGE_IDLE_FRAME = 5\nconst SPRITE_CHANGE_WALK_FRAME = 2\nconst SPRITE_WIDTH = Config.game.player.sprite.width\n\nclass PlayerSprite {\n constructor(p, player) {\n this.p = p\n this.player = player\n\n this.isFlipped = false\n this.isSetup = false\n }\n\n loadSprite = () => {\n this.walkingImgs = []\n this.idleImgs = []\n\n this.p.loadImage(PlayerWalkImg, img => {\n for (let i = 0; i < 6; i++) {\n const pos = i * 32\n const sprite = img.get(pos, 0, 32, 32)\n this.walkingImgs.push(sprite)\n }\n })\n\n this.p.loadImage(PlayerIdleImg, img => {\n for (let i = 0; i < 4; i++) {\n const pos = i * 32\n const sprite = img.get(pos, 0, 32, 32)\n this.idleImgs.push(sprite)\n }\n })\n }\n\n draw = windowPos => {\n const { x: wx, y: wy } = windowPos\n\n /* -------------------------------------------------------------------------- */\n /* DRAW PLAYER HERE */\n /* -------------------------------------------------------------------------- */\n\n this.p.push()\n this.p.rectMode(this.p.CENTER)\n this.p.fill('#eae7af')\n if (this.walkingImgs.length) {\n if (this.isFlipped) this.p.scale(-1, 1)\n\n const { frameCount } = this.p\n const sprite = this.player.isIdle\n ? this.idleImgs[Math.floor(frameCount / SPRITE_CHANGE_IDLE_FRAME) % 3]\n : this.walkingImgs[\n Math.floor(frameCount / SPRITE_CHANGE_WALK_FRAME) % 5\n ]\n\n this.p.imageMode(this.p.CENTER)\n this.p.image(\n sprite,\n (wx + SPRITE_WIDTH / 4) * (this.isFlipped ? -1 : 1),\n wy\n )\n } else this.p.rect(wx, wy, 20, 20)\n this.p.pop()\n }\n\n flipLeft = () => (this.isFlipped = true)\n\n flipRight = () => (this.isFlipped = false)\n}\n\nexport default PlayerSprite\n","import Config from 'config'\n\nconst MAP_WIDTH = Config.game.map.width\nconst MAP_HEIGHT = Config.game.map.height\nconst TOTAL_ROOM_DIMENSION = 176\nconst SIDE_WALL_DIMENSION = 66\n\nexport default class Helpers {\n static getAscii = c => c.charCodeAt(0)\n\n static getRoomRep = (x, y) => `${x},${y}`\n\n // GET GLOBAL POSITION FOR A ROOM\n static relativeToGlobal = (x, y) => {\n // 0 should be MAP WIDTH/HEIGHT / 2\n const CENTER_X = MAP_WIDTH / 2\n const CENTER_Y = MAP_HEIGHT / 2\n\n const deltaX = x * TOTAL_ROOM_DIMENSION\n const deltaY = y * TOTAL_ROOM_DIMENSION\n\n return { x: CENTER_X + deltaX, y: CENTER_Y + deltaY }\n }\n\n static globalToRelative = (x, y) => {\n // 0 should be MAP WIDTH/HEIGHT / 2\n const CENTER_X = MAP_WIDTH / 2\n const CENTER_Y = MAP_HEIGHT / 2\n\n return {\n x: (x - CENTER_X) / TOTAL_ROOM_DIMENSION,\n y: (y - CENTER_Y) / TOTAL_ROOM_DIMENSION\n }\n }\n\n static mapGlobalToPlayerViewport = (roomGlobalPos, player) => {\n const { x, y } = roomGlobalPos\n\n const { x: pGlobalX, y: pGlobalY } = player.controls.globalPos\n const { x: pWindowX, y: pWindowY } = player.controls.windowPos\n\n const roomGDeltaXToPlayer = x - pGlobalX\n const roomGDeltaYToPlayer = y - pGlobalY\n\n return {\n x: pWindowX + roomGDeltaXToPlayer,\n y: pWindowY + roomGDeltaYToPlayer\n }\n }\n\n static mapPlayerToRoomNumber = ({ x, y }) => {\n const playerX = x - MAP_WIDTH / 2\n const playerY = y - MAP_HEIGHT / 2\n\n const roomX = Math.round(playerX / TOTAL_ROOM_DIMENSION)\n const roomY = Math.round(playerY / TOTAL_ROOM_DIMENSION)\n\n return { x: roomX, y: roomY }\n }\n\n // ROOM X and Y\n static getRoomBoundaries = (x, y) => {\n const roomGlobal = Helpers.relativeToGlobal(x, y)\n return {\n minX: roomGlobal.x - TOTAL_ROOM_DIMENSION / 2,\n minY: roomGlobal.y - TOTAL_ROOM_DIMENSION / 2,\n maxX: roomGlobal.x + TOTAL_ROOM_DIMENSION / 2,\n maxY: roomGlobal.y + TOTAL_ROOM_DIMENSION / 2\n }\n }\n\n static getHallwayBoundaries = (roomBoundaries, direction) => {\n switch (direction) {\n case 'horizontal':\n return {\n minX: roomBoundaries.minX + SIDE_WALL_DIMENSION,\n maxX: roomBoundaries.maxX - SIDE_WALL_DIMENSION\n }\n\n case 'vertical':\n return {\n minY: roomBoundaries.minY + SIDE_WALL_DIMENSION,\n maxY: roomBoundaries.maxY - SIDE_WALL_DIMENSION\n }\n default:\n return {\n minY: Number.MAX_VALUE,\n maxY: Number.MIN_VALUE\n }\n }\n }\n\n static isBetween = (min, val, max, epsilon = 0.1) =>\n min + epsilon <= val && val <= max - epsilon\n\n static getElementWidth(element) {\n const styles = getComputedStyle(element)\n\n return (\n element.clientWidth -\n parseFloat(styles.paddingLeft) -\n parseFloat(styles.paddingRight)\n )\n }\n\n static getElementHeight(element) {\n const styles = getComputedStyle(element)\n\n return (\n element.clientHeight -\n parseFloat(styles.paddingTop) -\n parseFloat(styles.paddingBottom)\n )\n }\n\n static generateRandomEnemyPos() {\n return {\n x: (Math.random() > 0.5 ? 1 : -1) * (Math.floor(2 * Math.random()) + 3),\n y: (Math.random() > 0.5 ? 1 : -1) * (Math.floor(2 * Math.random()) + 3)\n }\n }\n}\n","import Helpers from '../../../utils/helpers'\n\nimport Config from 'config'\n\nconst MAP_WIDTH = Config.game.map.width\nconst MAP_HEIGHT = Config.game.map.height\nconst VERT_ACC = Config.game.player.acc.vertical\nconst HORZ_ACC = Config.game.player.acc.horizontal\nconst ROOM_BORDER_PADDING_PX = Config.game.room.padding.px\nconst ROOM_BORDER_PADDING_PY = Config.game.room.padding.py\nconst ROOM_BORDER_PADDING_NX = Config.game.room.padding.nx\nconst ROOM_BORDER_PADDING_NY = Config.game.room.padding.ny\nconst VIEWPORT_PADDING = Config.game.render.viewportPadding\nconst BLUE_POWERUP_SPEED = Config.game.powerups.blue.playerSpeed\n\nexport default class Controls {\n constructor(p, player) {\n this.p = p\n this.player = player\n\n this.globalPos = null\n this.windowPos = null\n }\n\n tick = () => {\n /* -------------------------------------------------------------------------- */\n /* SETUP ONCE CANVAS READY */\n /* -------------------------------------------------------------------------- */\n if (!this.player.isSetup) {\n this.globalPos = { x: MAP_WIDTH / 2, y: MAP_HEIGHT / 2 }\n this.windowPos = { x: this.p.width / 2, y: this.p.height / 2 }\n this.player.isSetup = true\n }\n\n this.handleInputAndCollision()\n }\n\n handleInputAndCollision = () => {\n const deltaFactor = this.p.deltaTime / 50\n\n const VERT_DELTA =\n (this.player.powerups.blue ? BLUE_POWERUP_SPEED : VERT_ACC) * deltaFactor\n const HORZ_DELTA =\n (this.player.powerups.blue ? BLUE_POWERUP_SPEED : HORZ_ACC) * deltaFactor\n\n const UP_PRESSED =\n this.p.keyIsDown(Helpers.getAscii('W')) ||\n this.p.keyIsDown(this.p.UP_ARROW)\n const DOWN_PRESSED =\n this.p.keyIsDown(Helpers.getAscii('S')) ||\n this.p.keyIsDown(this.p.DOWN_ARROW)\n const LEFT_PRESSED =\n this.p.keyIsDown(Helpers.getAscii('A')) ||\n this.p.keyIsDown(this.p.LEFT_ARROW)\n const RIGHT_PRESSED =\n this.p.keyIsDown(Helpers.getAscii('D')) ||\n this.p.keyIsDown(this.p.RIGHT_ARROW)\n\n const { x, y } = Helpers.mapPlayerToRoomNumber(this.globalPos)\n const currRoom = this.map.getRoomByCoords(x, y)\n\n if (!currRoom) return\n\n const roomBoundaries = Helpers.getRoomBoundaries(x, y)\n\n const { minY: hMinY, maxY: hMaxY } = Helpers.getHallwayBoundaries(\n roomBoundaries,\n 'vertical'\n )\n const { minX: hMinX, maxX: hMaxX } = Helpers.getHallwayBoundaries(\n roomBoundaries,\n 'horizontal'\n )\n\n if (UP_PRESSED) {\n let playerMoved = false\n if (\n this.globalPos.y - VERT_DELTA <\n roomBoundaries.minY + ROOM_BORDER_PADDING_NY\n ) {\n if (currRoom.top) {\n if (Helpers.isBetween(hMinX, this.globalPos.x, hMaxX)) {\n this.globalPos.y -= VERT_DELTA\n playerMoved = true\n }\n }\n } else {\n this.globalPos.y -= VERT_DELTA\n playerMoved = true\n }\n\n if (playerMoved && this.windowPos.y - VERT_DELTA >= VIEWPORT_PADDING) {\n this.windowPos.y -= VERT_DELTA\n }\n }\n\n if (DOWN_PRESSED) {\n let playerMoved = false\n if (\n this.globalPos.y - VERT_DELTA >\n roomBoundaries.maxY - ROOM_BORDER_PADDING_PY\n ) {\n if (currRoom.bottom) {\n if (Helpers.isBetween(hMinX, this.globalPos.x, hMaxX)) {\n this.globalPos.y += VERT_DELTA\n playerMoved = true\n }\n }\n } else {\n this.globalPos.y += VERT_DELTA\n playerMoved = true\n }\n\n if (\n playerMoved &&\n this.windowPos.y + VERT_DELTA <= this.p.height - VIEWPORT_PADDING\n ) {\n this.windowPos.y += VERT_DELTA\n }\n }\n\n if (LEFT_PRESSED) {\n let playerMoved = false\n if (\n this.globalPos.x - HORZ_DELTA <\n roomBoundaries.minX + ROOM_BORDER_PADDING_NX\n ) {\n if (currRoom.left) {\n if (Helpers.isBetween(hMinY, this.globalPos.y, hMaxY)) {\n this.globalPos.x -= HORZ_DELTA\n playerMoved = true\n }\n }\n } else {\n this.globalPos.x -= HORZ_DELTA\n playerMoved = true\n }\n\n if (playerMoved && this.windowPos.x - HORZ_DELTA >= VIEWPORT_PADDING) {\n this.windowPos.x -= HORZ_DELTA\n }\n\n this.player.sprite.flipLeft()\n }\n\n if (RIGHT_PRESSED) {\n let playerMoved = false\n if (\n this.globalPos.x + HORZ_DELTA >\n roomBoundaries.maxX - ROOM_BORDER_PADDING_PX\n ) {\n if (currRoom.right) {\n if (Helpers.isBetween(hMinY, this.globalPos.y, hMaxY)) {\n this.globalPos.x += HORZ_DELTA\n playerMoved = true\n }\n }\n } else {\n this.globalPos.x += HORZ_DELTA\n playerMoved = true\n }\n\n if (\n playerMoved &&\n this.windowPos.x + HORZ_DELTA <= this.p.width - VIEWPORT_PADDING\n ) {\n this.windowPos.x += HORZ_DELTA\n }\n\n this.player.sprite.flipRight()\n }\n\n if (!UP_PRESSED && !DOWN_PRESSED && !LEFT_PRESSED && !RIGHT_PRESSED)\n this.player.isIdle = true\n else this.player.isIdle = false\n this.player.playerMove()\n }\n\n registerMap = map => (this.map = map)\n\n /* -------------------------------------------------------------------------- */\n /* GETTERS */\n /* -------------------------------------------------------------------------- */\n getPosData = () => {\n return [this.windowPos, this.globalPos]\n }\n}\n","import PlayerSprite from '../../interfaces/playerSprite/playerSprite'\nimport Helpers from '../../../utils/helpers'\n\nimport Controls from './controls'\n\nimport Config from 'config'\n\nconst ROOM_WIDTH = Config.game.room.width\nconst ROOM_HEIGHT = Config.game.room.height\n\nexport default class Player {\n constructor(p, playerMove) {\n this.playerMove = playerMove\n this.controls = new Controls(p, this)\n\n this.sprite = new PlayerSprite(p, this)\n\n this.powerups = { red: false, blue: false, yellow: false, green: false }\n }\n\n registerMap = map => {\n this.map = map\n\n this.controls.registerMap(map)\n }\n\n update = () => {\n this.controls.tick()\n this.sprite.draw(...this.controls.getPosData())\n }\n\n getRoomNRoomCoords = () => {\n const relativeCoords = Helpers.globalToRelative(\n this.controls.globalPos.x,\n this.controls.globalPos.y\n )\n const room = this.map.rooms[\n Helpers.getRoomRep(\n Math.round(relativeCoords.x),\n Math.round(relativeCoords.y)\n )\n ]\n const roomCoords = {\n x: Math.round((relativeCoords.x - room.x) * (ROOM_WIDTH + 2)),\n y: Math.round((relativeCoords.y - room.y) * (ROOM_HEIGHT + 2))\n }\n return [room, roomCoords]\n }\n}\n","import Config from 'config'\n\nconst EMPTY_CELL_VAL = Config.game.room.gridVals.empty\nconst ENEMY_CELL_VAL = Config.game.room.gridVals.enemy\nconst END_CELL_VAL = Config.game.room.gridVals.end\nconst ROOM_WIDTH = Config.game.room.width\nconst ROOM_HEIGHT = Config.game.room.height\nconst ROOM_RADIUS = Config.game.room.radius\nconst MONSTER_GRID_TIMEOUT_CONSTANT =\n Config.game.room.monsterGridTimeoutConstant\nconst LEVEL_ENEMY_INTERVAL = Config.game.room.levelEnemyInterval\n\nclass Room {\n constructor(x, y, map) {\n this.x = x\n this.y = y\n\n this.map = map\n\n this.grid = new Array(ROOM_WIDTH)\n for (let i = 0; i < ROOM_WIDTH; i++) {\n this.grid[i] = new Array(ROOM_HEIGHT)\n }\n // [TOP,BOTTOM,LEFT,RIGHT] NEGATIVE -> POSITIVE\n this.gridTunnels = new Array(4)\n for (let i = 0; i < 4; i++) {\n this.gridTunnels[i] = new Array(3)\n }\n\n this.floorGrid = new Array(ROOM_WIDTH)\n for (let r = 0; r < ROOM_WIDTH; r++) {\n this.floorGrid[r] = new Array(ROOM_HEIGHT)\n for (let c = 0; c < ROOM_HEIGHT; c++) {\n this.floorGrid[r][c] = Math.floor(Math.random() * 12)\n }\n }\n // [TOP,BOTTOM,LEFT,RIGHT] NEGATIVE -> POSITIVE\n this.floorGridTunnels = new Array(4)\n for (let i = 0; i < 4; i++) {\n this.floorGridTunnels[i] = new Array(3)\n for (let n = 0; n < 3; n++) {\n this.floorGridTunnels[i][n] = Math.floor(Math.random() * 12)\n }\n }\n this.end = true\n }\n\n updateGrid = (x, y, val) => {\n const prevVal = this.grid[y + ROOM_RADIUS][x + ROOM_RADIUS]\n this.grid[y + ROOM_RADIUS][x + ROOM_RADIUS] = val\n\n if (val === ENEMY_CELL_VAL) {\n const timeout = setTimeout(() => {\n this.grid[y + ROOM_RADIUS][x + ROOM_RADIUS] =\n prevVal === END_CELL_VAL ? END_CELL_VAL : EMPTY_CELL_VAL\n clearTimeout(timeout)\n }, MONSTER_GRID_TIMEOUT_CONSTANT + this.map.level * LEVEL_ENEMY_INTERVAL)\n }\n }\n\n updateTunnels = (n, i, val) => {\n this.gridTunnels[n][i] = val\n\n if (val === ENEMY_CELL_VAL) {\n const timeout = setTimeout(() => {\n this.gridTunnels[n][i] = EMPTY_CELL_VAL\n clearTimeout(timeout)\n }, MONSTER_GRID_TIMEOUT_CONSTANT + this.map.level * LEVEL_ENEMY_INTERVAL)\n }\n }\n\n getVal = (x, y) => this.grid[y + ROOM_RADIUS][x + ROOM_RADIUS]\n\n getValTunnels = (n, i) => this.gridTunnels[n][i]\n\n generatePowerup = potionGridVal => {\n this.updateGrid(\n Math.floor(Math.random() * (ROOM_WIDTH - 2)) - ROOM_RADIUS + 1,\n Math.floor(Math.random() * (ROOM_HEIGHT - 2)) - ROOM_RADIUS + 1,\n potionGridVal\n )\n }\n}\n\nexport default Room\n","import Helpers from '../../../utils/helpers'\n\nimport WallTilesImg from 'assets/sprites/Dungeon_Tileset.png'\nimport Config from 'config'\n\nconst FLOOR_SIZE = Config.game.room.floorSize\nconst VERT_WALL_SIZE = Config.game.room.vertWallSize\nconst HORZ_WALL_SIZE = Config.game.room.horzWallSize\nconst ROOM_WIDTH = Config.game.room.width\nconst ROOM_HEIGHT = Config.game.room.height\nconst ROOM_RADIUS = Config.game.room.radius\nconst ENEMY_GRID_VAL = Config.game.room.gridVals.enemy\nconst END_GRID_VAL = Config.game.room.gridVals.end\nconst RED_POTION_GRID_VAL = Config.game.room.gridVals.redPotion\nconst BLUE_POTION_GRID_VAL = Config.game.room.gridVals.bluePotion\nconst YELLOW_POTION_GRID_VAL = Config.game.room.gridVals.yellowPotion\nconst GREEN_POTION_GRID_VAL = Config.game.room.gridVals.greenPotion\n\nclass MapSprite {\n constructor(p, player) {\n this.p = p\n this.player = player\n }\n\n loadSprite = () => {\n this.p.loadImage(WallTilesImg, img => {\n this.vertWall = img.get(9, 16, 7, 16)\n this.vertWallT = img.get(9, 32, 7, 16)\n this.horzWall = img.get(16, 0, 16, 16)\n this.horzWallB = img.get(16, 64, 16, 16)\n this.corner = img.get(9, 0, 7, 16)\n this.cornerB = img.get(9, 64, 7, 16)\n this.floors = [\n img.get(96, 0, 16, 16),\n img.get(112, 0, 16, 16),\n img.get(128, 0, 16, 16),\n img.get(144, 0, 16, 16),\n img.get(96, 16, 16, 16),\n img.get(112, 16, 16, 16),\n img.get(128, 16, 16, 16),\n img.get(144, 16, 16, 16),\n img.get(96, 32, 16, 16),\n img.get(112, 32, 16, 16),\n img.get(128, 32, 16, 16),\n img.get(144, 32, 16, 16)\n ]\n this.end = img.get(64, 128, 16, 16)\n this.bones = img.get(112, 112, 16, 16)\n this.redPotion = img.get(144, 128, 16, 16)\n this.bluePotion = img.get(112, 144, 16, 16)\n this.yellowPotion = img.get(96, 144, 16, 16)\n this.greenPotion = img.get(96, 128, 16, 16)\n })\n }\n\n draw = map => {\n this.p.push()\n this.p.rectMode(this.p.CENTER)\n\n this.p.fill('#eae7af')\n Object.keys(map).forEach(roomCoords => {\n const room = map[roomCoords]\n\n // NO NEED TO EXTRACT. IT'S PASS BY REFERENCE\n this.drawRoom(room, room.x, room.y)\n })\n\n this.p.pop()\n }\n\n drawRoom = (room, x, y) => {\n if (!this.player.isSetup) return\n\n const GLOBAL_COORDS = Helpers.relativeToGlobal(x, y)\n const WINDOW_COORDS = Helpers.mapGlobalToPlayerViewport(\n GLOBAL_COORDS,\n this.player\n )\n\n // DRAW CORNERS\n this.p.image(\n this.corner,\n WINDOW_COORDS.x -\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE -\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n WINDOW_COORDS.y - (ROOM_RADIUS + 0.5) * FLOOR_SIZE - HORZ_WALL_SIZE / 2\n )\n this.p.image(\n this.corner,\n WINDOW_COORDS.x +\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE +\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n WINDOW_COORDS.y - (ROOM_RADIUS + 0.5) * FLOOR_SIZE - HORZ_WALL_SIZE / 2\n )\n this.p.image(\n this.cornerB,\n WINDOW_COORDS.x -\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE -\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n WINDOW_COORDS.y + (ROOM_RADIUS + 0.5) * FLOOR_SIZE + HORZ_WALL_SIZE / 2\n )\n this.p.image(\n this.cornerB,\n WINDOW_COORDS.x +\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE +\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n WINDOW_COORDS.y + (ROOM_RADIUS + 0.5) * FLOOR_SIZE + HORZ_WALL_SIZE / 2\n )\n // WALLS AND FLOOR\n for (let c = 0; c < ROOM_WIDTH; c++) {\n this.p.image(\n this.vertWall,\n WINDOW_COORDS.x -\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE -\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n (c - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n this.p.image(\n this.vertWall,\n WINDOW_COORDS.x +\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE +\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n (c - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n\n for (let r = 0; r < ROOM_HEIGHT; r++) {\n if (c === 0) {\n this.p.image(\n this.horzWall,\n (r - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y -\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE -\n HORZ_WALL_SIZE / 2\n )\n this.p.image(\n this.horzWallB,\n (r - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y +\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE +\n HORZ_WALL_SIZE / 2\n )\n }\n this.p.image(\n this.floors[room.floorGrid[r][c]],\n (r - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.x,\n (c - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n let img = null\n switch (room.getVal(r - ROOM_RADIUS, c - ROOM_RADIUS)) {\n case ENEMY_GRID_VAL:\n img = this.bones\n break\n case END_GRID_VAL:\n img = this.end\n break\n case RED_POTION_GRID_VAL:\n img = this.redPotion\n break\n case BLUE_POTION_GRID_VAL:\n img = this.bluePotion\n break\n case YELLOW_POTION_GRID_VAL:\n img = this.yellowPotion\n break\n case GREEN_POTION_GRID_VAL:\n img = this.greenPotion\n break\n default:\n break\n }\n if (img) {\n this.p.image(\n img,\n (r - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.x,\n (c - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n }\n }\n }\n // TUNNELS\n if (room.top) {\n for (let n = 0; n < 3; n++) {\n this.p.image(\n this.floors[room.floorGridTunnels[0][n]],\n WINDOW_COORDS.x + FLOOR_SIZE * (n - 1),\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n }\n for (let i = -1; i < 2; i++) {\n if (room.getValTunnels(0, i + 1) === ENEMY_GRID_VAL) {\n this.p.push()\n this.p.imageMode(this.p.CENTER)\n this.p.image(\n this.bones,\n WINDOW_COORDS.x + FLOOR_SIZE * i + FLOOR_SIZE / 2,\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y + FLOOR_SIZE / 2\n )\n this.p.pop()\n }\n }\n }\n if (room.bottom) {\n for (let n = 0; n < 3; n++) {\n this.p.image(\n this.floors[room.floorGridTunnels[1][n]],\n WINDOW_COORDS.x + FLOOR_SIZE * (n - 1),\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n }\n this.p.image(\n this.vertWallT,\n -FLOOR_SIZE * 2 +\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2 +\n 1 +\n WINDOW_COORDS.x,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n this.p.image(\n this.vertWallT,\n FLOOR_SIZE * 2 -\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2 -\n 1 +\n WINDOW_COORDS.x,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n for (let i = -1; i < 2; i++) {\n if (room.getValTunnels(1, i + 1) === ENEMY_GRID_VAL) {\n this.p.push()\n this.p.imageMode(this.p.CENTER)\n this.p.image(\n this.bones,\n WINDOW_COORDS.x + FLOOR_SIZE * i + FLOOR_SIZE / 2,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y + FLOOR_SIZE / 2\n )\n this.p.pop()\n }\n }\n }\n\n if (room.left) {\n for (let n = 0; n < 3; n++) {\n this.p.image(\n this.floors[room.floorGridTunnels[2][n]],\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y + FLOOR_SIZE * (n - 1)\n )\n }\n this.p.image(\n this.horzWall,\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y - HORZ_WALL_SIZE - FLOOR_SIZE\n )\n this.p.image(\n this.horzWallB,\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y + HORZ_WALL_SIZE + FLOOR_SIZE\n )\n this.p.image(\n this.vertWall,\n WINDOW_COORDS.x -\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE -\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n FLOOR_SIZE + WINDOW_COORDS.y + FLOOR_SIZE\n )\n for (let i = -1; i < 2; i++) {\n if (room.getValTunnels(2, i + 1) === ENEMY_GRID_VAL) {\n this.p.push()\n this.p.imageMode(this.p.CENTER)\n this.p.image(\n this.bones,\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x + FLOOR_SIZE / 2,\n WINDOW_COORDS.y + FLOOR_SIZE * i + FLOOR_SIZE / 2\n )\n this.p.pop()\n }\n }\n }\n if (room.right) {\n for (let n = 0; n < 3; n++) {\n this.p.image(\n this.floors[room.floorGridTunnels[3][n]],\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y + FLOOR_SIZE * (n - 1)\n )\n }\n this.p.image(\n this.horzWall,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y - HORZ_WALL_SIZE - FLOOR_SIZE\n )\n this.p.image(\n this.horzWallB,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y + HORZ_WALL_SIZE + FLOOR_SIZE\n )\n this.p.image(\n this.vertWall,\n WINDOW_COORDS.x +\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE +\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n FLOOR_SIZE + WINDOW_COORDS.y + FLOOR_SIZE\n )\n for (let i = -1; i < 2; i++) {\n if (room.getValTunnels(3, i + 1) === ENEMY_GRID_VAL) {\n this.p.push()\n this.p.imageMode(this.p.CENTER)\n this.p.image(\n this.bones,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x + FLOOR_SIZE / 2,\n WINDOW_COORDS.y + FLOOR_SIZE * i + FLOOR_SIZE / 2\n )\n this.p.pop()\n }\n }\n }\n // TEST\n\n // const roomCoords = this.player.getRoomNRoomCoords()[1]\n\n // this.p.rect(\n // roomCoords.x * FLOOR_SIZE + WINDOW_COORDS.x + FLOOR_SIZE / 2,\n // roomCoords.y * FLOOR_SIZE + WINDOW_COORDS.y + FLOOR_SIZE / 2,\n // 16,\n // 16\n // )\n }\n}\n\nexport default MapSprite\n","import Room from '../room/room'\nimport MapSprite from '../../interfaces/mapSprite/mapSprite'\nimport Helpers from '../../../utils/helpers'\n\nimport Config from 'config'\n\nconst POWERUPS = Config.game.powerups\n\nclass Map {\n constructor(p, player) {\n this.level = 1\n\n this.player = player\n\n this.sprite = new MapSprite(p, player)\n\n this.initiateRooms()\n }\n\n initiateRooms = () => {\n this.startingRoom = new Room(0, 0, this)\n this.rooms = { '0,0': this.startingRoom }\n const paths = [\n [0, 1, this.startingRoom, 'top'],\n [1, 0, this.startingRoom, 'left'],\n [0, -1, this.startingRoom, 'bottom'],\n [-1, 0, this.startingRoom, 'right']\n ]\n const roomsStrings = ['0,0']\n const rooms = [this.startingRoom]\n for (let i = 0; i < this.level; i++) {\n const temp = paths.splice(Math.floor(Math.random() * paths.length), 1)[0]\n if (!this.rooms[Helpers.getRoomRep(temp[0], temp[1])]) {\n temp[2].end = false\n const newRoom = new Room(temp[0], temp[1], this)\n // eslint-disable-next-line prefer-destructuring\n newRoom[temp[3]] = temp[2]\n temp[2][this.getOppositeDir(temp[3])] = newRoom\n const newPaths = this.getSurroundings(newRoom)\n for (let n = 0; n < newPaths.length; n++) {\n const newPath = newPaths[n]\n if (!this.rooms[Helpers.getRoomRep(newPath[0], newPath[1])]) {\n paths.push(newPath)\n }\n }\n rooms.push(newRoom)\n\n const newRoomRep = Helpers.getRoomRep(newRoom.x, newRoom.y)\n this.rooms[newRoomRep] = newRoom\n roomsStrings.push(newRoomRep)\n\n Object.keys(POWERUPS).forEach(powerupColor => {\n const powerup = POWERUPS[powerupColor]\n if (Math.random() < powerup.probability) {\n newRoom.generatePowerup(powerup.gridVal)\n }\n })\n } else {\n i -= 1\n }\n }\n\n const endingRooms = []\n\n for (let i = 0; i < rooms.length; i++) {\n const room = rooms[i]\n if (room.end) {\n endingRooms.push(room)\n }\n }\n\n const trueEndingRoom =\n endingRooms[Math.floor(Math.random() * endingRooms.length)]\n\n trueEndingRoom.updateGrid(0, 0, 2)\n\n this.endingGlobalCoords = Helpers.relativeToGlobal(\n trueEndingRoom.x,\n trueEndingRoom.y\n )\n }\n\n update = () => {\n this.sprite.draw(this.rooms)\n }\n\n isRoomExists = (x, y) => !!this.rooms[Helpers.getRoomRep(x, y)]\n\n getSurroundings = room => {\n return [\n [room.x, room.y + 1, room, 'top'],\n [room.x + 1, room.y, room, 'left'],\n [room.x, room.y - 1, room, 'bottom'],\n [room.x - 1, room.y, room, 'right']\n ]\n }\n\n getOppositeDir = dir => {\n switch (dir) {\n case 'bottom':\n return 'top'\n case 'left':\n return 'right'\n case 'top':\n return 'bottom'\n case 'right':\n return 'left'\n default:\n return ''\n }\n }\n\n getRoomByCoords = (x, y) => this.rooms[Helpers.getRoomRep(x, y)]\n}\n\nexport default Map\n","import Helpers from '../../../utils/helpers'\n\nimport Config from 'config'\n\nconst ROOM_WIDTH = Config.game.room.width\nconst ROOM_HEIGHT = Config.game.room.height\nconst ROOM_RADIUS = Config.game.room.radius\nconst ENEMY_GRID_VAL = Config.game.room.gridVals.enemy\n\nclass Enemy {\n constructor(room) {\n this.room = room\n this.roomCoords = Helpers.generateRandomEnemyPos()\n }\n\n move = player => {\n const surroundings = this.getSurroundings(this.roomCoords)\n let dist = this.getDist(\n Helpers.relativeToGlobal(\n this.room.x + this.roomCoords.x / (ROOM_WIDTH + 1),\n this.room.y + this.roomCoords.y / (ROOM_HEIGHT + 1)\n ),\n player.controls.globalPos\n )\n let newPosition = this.roomCoords\n for (let i = 0; i < surroundings.length; i++) {\n const tempDist = this.getDist(\n Helpers.relativeToGlobal(\n this.room.x + surroundings[i].x / (ROOM_WIDTH + 1),\n this.room.y + surroundings[i].y / (ROOM_HEIGHT + 1)\n ),\n player.controls.globalPos\n )\n if (tempDist < dist) {\n newPosition = surroundings[i]\n dist = tempDist\n }\n }\n\n if (newPosition.y === -ROOM_RADIUS - 1) {\n this.room.updateTunnels(0, newPosition.x + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n } else if (newPosition.y === ROOM_RADIUS + 1) {\n this.room.updateTunnels(1, newPosition.x + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n } else if (newPosition.x === -ROOM_RADIUS - 1) {\n this.room.updateTunnels(2, newPosition.y + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n } else if (newPosition.x === ROOM_RADIUS + 1) {\n this.room.updateTunnels(3, newPosition.y + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n } else if (newPosition.y < -ROOM_RADIUS - 1) {\n this.room = this.room.top\n this.room.updateTunnels(1, newPosition.x + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n this.roomCoords.y = ROOM_RADIUS + 1\n } else if (newPosition.y > ROOM_RADIUS + 1) {\n this.room = this.room.bottom\n this.room.updateTunnels(0, newPosition.x + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n this.roomCoords.y = -ROOM_RADIUS - 1\n } else if (newPosition.x < -ROOM_RADIUS - 1) {\n this.room = this.room.left\n this.room.updateTunnels(3, newPosition.y + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n this.roomCoords.x = ROOM_RADIUS + 1\n } else if (newPosition.x > ROOM_RADIUS + 1) {\n this.room = this.room.right\n this.room.updateTunnels(2, newPosition.y + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n this.roomCoords.x = -ROOM_RADIUS - 1\n } else {\n this.room.updateGrid(newPosition.x, newPosition.y, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n }\n }\n\n getSurroundings = coords => {\n const translations = [\n { x: 0, y: +1 },\n { x: 1, y: 0 },\n { x: 0, y: -1 },\n { x: -1, y: 0 }\n ]\n\n const surroundings = []\n\n for (let n = 0; n < translations.length; n++) {\n const translation = translations[n]\n const newCoords = {\n x: coords.x + translation.x,\n y: coords.y + translation.y\n }\n if (\n Math.abs(newCoords.x) <= ROOM_RADIUS &&\n Math.abs(newCoords.y) <= ROOM_RADIUS\n ) {\n surroundings.push(newCoords)\n } else if (\n newCoords.x <= -ROOM_RADIUS - 1 &&\n Math.abs(newCoords.y) <= 1 &&\n this.room.left\n ) {\n surroundings.push(newCoords)\n } else if (\n newCoords.x >= ROOM_RADIUS + 1 &&\n Math.abs(newCoords.y) <= 1 &&\n this.room.right\n ) {\n surroundings.push(newCoords)\n } else if (\n newCoords.y <= -ROOM_RADIUS - 1 &&\n Math.abs(newCoords.x) <= 1 &&\n this.room.top\n ) {\n surroundings.push(newCoords)\n } else if (\n newCoords.y >= ROOM_RADIUS + 1 &&\n Math.abs(newCoords.x) <= 1 &&\n this.room.bottom\n ) {\n surroundings.push(newCoords)\n }\n }\n return surroundings\n }\n\n getDist = (p1, p2) => Math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2)\n}\n\nexport default Enemy\n","import Config from 'config'\n\nconst LIGHT_FAR = Config.game.player.light.far\nconst LIGHT_NEAR = Config.game.player.light.near\nconst SPOTLIGHT_SIZE = `transparent ${LIGHT_NEAR}px, rgba(0, 0, 0) ${LIGHT_FAR}px)`\nconst YELLOW_POWERUP = Config.game.powerups.yellow\nconst SPOTLIGHT_SIZE_YELLOW_POWERUP = `transparent ${YELLOW_POWERUP.lightNear}px, rgba(0, 0, 0) ${YELLOW_POWERUP.lightFar}px)`\n\nfunction Spotlight(player) {\n const spotlight = document.getElementById('spotlight')\n\n this.getSpotlight = () => spotlight\n this.getPlayer = () => player\n}\n\nSpotlight.prototype.update = function() {\n const spotlight = this.getSpotlight()\n const playerRef = this.getPlayer()\n\n const { x, y } = playerRef.controls.windowPos\n\n spotlight.style.backgroundImage = `radial-gradient(circle at ${x}px ${y}px, ${\n playerRef.powerups.yellow ? SPOTLIGHT_SIZE_YELLOW_POWERUP : SPOTLIGHT_SIZE\n }`\n}\n\nexport default Spotlight\n","import YellowEffectImg from 'assets/sprites/7_firespin_spritesheet.png'\nimport GreenEffectImg from 'assets/sprites/8_protectioncircle_spritesheet.png'\nimport RedEffectImg from 'assets/sprites/13_vortex_spritesheet.png'\nimport BlueEffectImg from 'assets/sprites/18_midnight_spritesheet.png'\n\nconst SPRITE_OFFSET_X = 8\nconst SPRITE_OFFSET_Y = 0\nconst SPRITE_INTERVAL = 2\nconst REVOLVE_INTERVAL = 16\nconst REVOLVE_RADIUS = 30\nconst SPRITE_DIMENSION = 40\n\nfunction Effects(p, player) {\n this.p = p\n this.player = player\n\n this.element = document.getElementById('effect')\n\n this.effects = {}\n this.sprites = {}\n}\n\nEffects.prototype.loadSprites = function() {\n this.sprites.yellow = []\n this.p.loadImage(YellowEffectImg, img => {\n for (let r = 0; r < 8; r++) {\n const posR = r * 100\n for (let c = 0; c < (r === 7 ? 5 : 8); c++) {\n const posC = c * 100\n const sprite = img.get(posR, posC, 100, 100)\n this.sprites.yellow.push(sprite)\n }\n }\n })\n\n this.sprites.blue = []\n this.p.loadImage(BlueEffectImg, img => {\n for (let r = 0; r < 8; r++) {\n const posR = r * 100\n for (let c = 0; c < (r === 7 ? 5 : 8); c++) {\n const posC = c * 100\n const sprite = img.get(posR, posC, 100, 100)\n this.sprites.blue.push(sprite)\n }\n }\n })\n\n this.sprites.green = []\n this.p.loadImage(GreenEffectImg, img => {\n for (let r = 0; r < 8; r++) {\n const posR = r * 100\n for (let c = 0; c < (r === 7 ? 5 : 8); c++) {\n const posC = c * 100\n const sprite = img.get(posR, posC, 100, 100)\n this.sprites.green.push(sprite)\n }\n }\n })\n\n this.sprites.red = []\n this.p.loadImage(RedEffectImg, img => {\n for (let r = 0; r < 8; r++) {\n const posR = r * 100\n for (let c = 0; c < (r === 7 ? 5 : 8); c++) {\n const posC = c * 100\n const sprite = img.get(posR, posC, 100, 100)\n this.sprites.red.push(sprite)\n }\n }\n })\n}\n\nEffects.prototype.addEffect = function(name, description) {\n this.effects[name] = description\n}\n\nEffects.prototype.removeEffect = function(name) {\n delete this.effects[name]\n}\n\nEffects.prototype.draw = function() {\n const totalString = Object.keys(this.effects)\n .map(key => `${this.effects[key]}
`)\n .join(' ')\n\n this.element.innerHTML = totalString\n\n const { YELLOW, BLUE, GREEN, RED } = this.effects\n const { x, y } = this.player.controls.windowPos\n const spriteIndex = Math.floor(this.p.frameCount / SPRITE_INTERVAL) % 61\n\n this.p.push()\n this.p.imageMode(this.p.CENTER)\n if (YELLOW) {\n this.p.image(\n this.sprites.yellow[spriteIndex],\n x +\n SPRITE_OFFSET_X +\n Math.cos(this.p.frameCount / REVOLVE_INTERVAL) * REVOLVE_RADIUS,\n y +\n SPRITE_OFFSET_Y +\n Math.sin(this.p.frameCount / REVOLVE_INTERVAL) * REVOLVE_RADIUS,\n SPRITE_DIMENSION,\n SPRITE_DIMENSION\n )\n }\n\n if (BLUE) {\n this.p.image(\n this.sprites.blue[spriteIndex],\n x +\n SPRITE_OFFSET_X +\n Math.cos(this.p.frameCount / REVOLVE_INTERVAL + Math.PI / 2) *\n REVOLVE_RADIUS,\n y +\n SPRITE_OFFSET_Y +\n Math.sin(this.p.frameCount / REVOLVE_INTERVAL + Math.PI / 2) *\n REVOLVE_RADIUS,\n SPRITE_DIMENSION,\n SPRITE_DIMENSION\n )\n }\n\n if (GREEN) {\n this.p.image(\n this.sprites.green[spriteIndex],\n x +\n SPRITE_OFFSET_X +\n Math.cos(this.p.frameCount / REVOLVE_INTERVAL + Math.PI) *\n REVOLVE_RADIUS,\n y +\n SPRITE_OFFSET_Y +\n Math.sin(this.p.frameCount / REVOLVE_INTERVAL + Math.PI) *\n REVOLVE_RADIUS,\n SPRITE_DIMENSION,\n SPRITE_DIMENSION\n )\n }\n\n if (RED) {\n this.p.image(\n this.sprites.red[spriteIndex],\n x +\n SPRITE_OFFSET_X +\n Math.cos(this.p.frameCount / REVOLVE_INTERVAL - Math.PI / 2) *\n REVOLVE_RADIUS,\n y +\n SPRITE_OFFSET_Y +\n Math.sin(this.p.frameCount / REVOLVE_INTERVAL - Math.PI / 2) *\n REVOLVE_RADIUS,\n SPRITE_DIMENSION,\n SPRITE_DIMENSION\n )\n }\n\n this.p.pop()\n}\n\nexport default Effects\n","import { Player, Map, Enemy } from './modules/app'\nimport Spotlight from './modules/interfaces/spotlight/spotlight'\nimport Effects from './modules/interfaces/effects/effects'\nimport Helpers from './utils/helpers'\n\nimport Config from 'config'\nimport p5 from 'p5'\n\nconst MAP_WIDTH = Config.game.map.width\nconst MAP_HEIGHT = Config.game.map.height\nconst ROOM_RADIUS = Config.game.room.radius\nconst ENEMY_GRID_VAL = Config.game.room.gridVals.enemy\nconst END_GRID_VAL = Config.game.room.gridVals.end\nconst RED_POTION_GRID_VAL = Config.game.room.gridVals.redPotion\nconst BLUE_POTION_GRID_VAL = Config.game.room.gridVals.bluePotion\nconst YELLOW_POTION_GRID_VAL = Config.game.room.gridVals.yellowPotion\nconst GREEN_POTION_GRID_VAL = Config.game.room.gridVals.greenPotion\nconst ENEMY_SPEED = Config.game.enemy.speed\nconst ENEMY_LEVEL_UP = Config.game.enemy.levelUpFactor\nconst RED_POWERUP = Config.game.powerups.red\nconst BLUE_POWERUP = Config.game.powerups.blue\nconst YELLOW_POWERUP = Config.game.powerups.yellow\nconst GREEN_POWERUP = Config.game.powerups.green\nconst ENEMY_INC = Config.game.map.enemyIncrement\n\nclass Game {\n constructor(container) {\n this.sketch = p => {\n this.player = new Player(p, this.playerMove)\n this.map = new Map(p, this.player)\n this.enemies = [new Enemy(this.map.startingRoom)]\n this.player.registerMap(this.map)\n\n // this.debug = new Debug(this.player, this.map)\n this.spotlight = new Spotlight(this.player)\n\n this.effectIndicator = new Effects(p, this.player)\n\n p.preload = () => {\n this.map.sprite.loadSprite()\n this.player.sprite.loadSprite()\n this.effectIndicator.loadSprites()\n }\n\n p.setup = () => {\n const myCanvas = p.createCanvas(\n Helpers.getElementWidth(container),\n Helpers.getElementHeight(container)\n )\n\n myCanvas.parent(container)\n\n p.textFont('Helvetica')\n p.textAlign(p.CENTER, p.CENTER)\n p.smooth()\n }\n\n p.draw = () => {\n p.background('#160f30')\n this.update()\n }\n\n p.windowResized = () => {\n p.resizeCanvas(\n Helpers.getElementWidth(container),\n Helpers.getElementHeight(container)\n )\n }\n this.initiateEnemyMovement()\n }\n\n // eslint-disable-next-line new-cap\n this.p5instance = new p5(this.sketch)\n }\n\n update = () => {\n this.map.update()\n this.player.update()\n this.spotlight.update()\n this.effectIndicator.draw()\n // this.debug.update()\n }\n\n enemiesMove = () => {\n this.enemies.forEach(e => e.move(this.player))\n if (this.checkPlayerPos() === ENEMY_GRID_VAL) {\n this.gameOver()\n }\n }\n\n playerMove = () => {\n switch (this.checkPlayerPos()) {\n case ENEMY_GRID_VAL:\n this.gameOver()\n break\n case END_GRID_VAL:\n this.levelUp()\n break\n case RED_POTION_GRID_VAL:\n this.redPotionPowerup()\n break\n case BLUE_POTION_GRID_VAL:\n this.bluePotionPowerup()\n break\n case YELLOW_POTION_GRID_VAL:\n this.yellowPotionPowerup()\n break\n case GREEN_POTION_GRID_VAL:\n this.greenPotionPowerup()\n break\n default:\n break\n }\n }\n\n checkPlayerPos = () => {\n const roomNRoomCoords = this.player.getRoomNRoomCoords()\n const room = roomNRoomCoords[0]\n const roomCoords = roomNRoomCoords[1]\n let gridVal = 0\n if (\n Math.abs(roomCoords.x) <= ROOM_RADIUS &&\n Math.abs(roomCoords.y) <= ROOM_RADIUS\n ) {\n gridVal = room.getVal(roomCoords.x, roomCoords.y)\n } else if (\n roomCoords.x <= -ROOM_RADIUS - 1 &&\n Math.abs(roomCoords.y) <= 1 &&\n room.left\n ) {\n gridVal = room.getValTunnels(2, roomCoords.y + 1)\n } else if (\n roomCoords.x >= ROOM_RADIUS + 1 &&\n Math.abs(roomCoords.y) <= 1 &&\n room.right\n ) {\n gridVal = room.getValTunnels(3, roomCoords.y + 1)\n } else if (\n roomCoords.y <= -ROOM_RADIUS - 1 &&\n Math.abs(roomCoords.x) <= 1 &&\n room.top\n ) {\n gridVal = room.getValTunnels(0, roomCoords.x + 1)\n } else if (\n roomCoords.y >= ROOM_RADIUS + 1 &&\n Math.abs(roomCoords.x) <= 1 &&\n room.bottom\n ) {\n gridVal = room.getValTunnels(1, roomCoords.x + 1)\n }\n\n return gridVal\n }\n\n levelUp = () => {\n this.map.level += 1\n this.map.initiateRooms()\n this.player.controls.globalPos = { x: MAP_WIDTH / 2, y: MAP_HEIGHT / 2 }\n this.player.controls.windowPos = {\n x: this.player.controls.p.width / 2,\n y: this.player.controls.p.height / 2\n }\n\n const enemyCount = Math.floor(this.map.level / ENEMY_INC) + 1\n this.enemies = []\n for (let i = 0; i < enemyCount; i++)\n this.enemies.push(new Enemy(this.map.startingRoom))\n\n this.initiateEnemyMovement(ENEMY_SPEED * ENEMY_LEVEL_UP ** this.map.level)\n\n const level = document.getElementById('score')\n if (level) level.innerHTML = `Level ${this.map.level}`\n }\n\n gameOver = () => {\n if (!this.player.powerups.red) {\n const gameover = document.getElementById('gameover')\n if (gameover) gameover.style.top = '50%'\n this.p5instance.noLoop()\n }\n }\n\n redPotionPowerup = () => {\n this.powerupConsumed()\n this.player.powerups.red = true\n\n if (this.redPotionTimeout) clearTimeout(this.redPotionTimeout)\n\n this.effectIndicator.addEffect('RED', RED_POWERUP.description)\n\n setTimeout(() => {\n this.player.powerups.red = false\n this.redPotionTimeout = undefined\n this.effectIndicator.removeEffect('RED')\n }, RED_POWERUP.duration)\n }\n\n bluePotionPowerup = () => {\n this.powerupConsumed()\n this.player.powerups.blue = true\n console.log('BLUE POWERUP UP')\n\n if (this.bluePotionTimeout) clearTimeout(this.bluePotionTimeout)\n\n this.effectIndicator.addEffect('BLUE', BLUE_POWERUP.description)\n\n this.bluePotionTimeout = setTimeout(() => {\n console.log('BLUE POWERUP DOWN')\n this.player.powerups.blue = false\n this.bluePotionTimeout = undefined\n this.effectIndicator.removeEffect('BLUE')\n }, BLUE_POWERUP.duration)\n }\n\n yellowPotionPowerup = () => {\n this.powerupConsumed()\n this.player.powerups.yellow = true\n console.log('YELLOW POWERUP UP')\n\n if (this.yellowPotionTimeout) clearTimeout(this.yellowPotionTimeout)\n\n this.effectIndicator.addEffect('YELLOW', YELLOW_POWERUP.description)\n\n this.yellowPotionTimeout = setTimeout(() => {\n console.log('YELLOW POWERUP DOWN')\n this.player.powerups.yellow = false\n this.yellowPotionTimeout = undefined\n this.effectIndicator.removeEffect('YELLOW')\n }, YELLOW_POWERUP.duration)\n }\n\n greenPotionPowerup = () => {\n this.powerupConsumed()\n this.player.powerups.green = true\n console.log('GREEN POWERUP UP')\n\n clearInterval(this.monsterInterval)\n\n this.monsterInterval = setInterval(\n this.enemiesMove,\n GREEN_POWERUP.enemySpeed\n )\n\n if (this.greenPotionTimeout) clearTimeout(this.greenPotionTimeout)\n\n this.effectIndicator.addEffect('GREEN', GREEN_POWERUP.description)\n\n this.greenPotionTimeout = setTimeout(() => {\n console.log('GREEN POWERUP DOWN')\n clearInterval(this.monsterInterval)\n this.initiateEnemyMovement()\n this.greenPotionTimeout = undefined\n this.effectIndicator.removeEffect('GREEN')\n }, GREEN_POWERUP.duration)\n }\n\n powerupConsumed = () => {\n const roomNRoomCoords = this.player.getRoomNRoomCoords()\n const room = roomNRoomCoords[0]\n const roomCoords = roomNRoomCoords[1]\n room.updateGrid(roomCoords.x, roomCoords.y, 0)\n }\n\n initiateEnemyMovement = (interval = ENEMY_SPEED) => {\n clearInterval(this.monsterInterval)\n this.monsterInterval = setInterval(this.enemiesMove, interval)\n }\n\n terminate = () => {\n this.p5instance.remove()\n\n clearInterval(this.monsterInterval)\n }\n}\n\nexport default Game\n","import React, { useRef, useEffect } from 'react'\nimport styled from 'styled-components'\nimport TheRoom from 'core/game'\nimport { Link } from 'react-router-dom'\nimport DarkFog from 'assets/music/Dark-Fog.mp3'\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: radial-gradient(#003, #000);\n`\n\nconst DebugWrapper = styled.div`\n position: fixed;\n top: 0;\n left: 0;\n`\n\nconst SpotlightWrapper = styled.div`\n position: absolute;\n width: 100%;\n height: 100%;\n background-image: radial-gradient(\n circle,\n transparent 160px,\n rgba(0, 0, 0) 200px\n );\n transition: 0.5s ease-in all;\n`\n\nconst EffectWrapper = styled.div`\n position: absolute;\n z-index: 20;\n bottom: 0;\n left: 0;\n margin: 15px;\n color: #eae7af;\n font-family: 'Gayathri', sans-serif;\n font-size: 24px;\n`\n\nconst GameOverWrapper = styled.div`\n display: flex;\n position: absolute;\n z-index: 10;\n top: -20%;\n left: 50%;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n border: 10px solid #160f30;\n border-radius: 5px;\n background: #01024e;\n color: #eae7af;\n font-size: 50px;\n transform: translate(-50%, -50%);\n transition: 0.2s ease all;\n`\n\nconst HomeButton = styled.button`\n width: 50px;\n height: 25px;\n margin: 5px;\n border: 1px solid #eae7af;\n border-radius: 5px;\n background: transparent;\n color: #eae7af;\n font-size: 16px;\n font-weight: 100;\n`\n\nconst LevelWrapper = styled.div`\n margin: 20px;\n border-bottom: 3px solid #eae7af;\n color: #eae7af;\n font-family: 'Lexend Zetta', sans-serif;\n font-size: 40px;\n`\n\nconst GameWrapper = styled.div`\n position: relative;\n width: 80%;\n height: 60%;\n border: 25px solid #b88846;\n border-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='75' height='75'%3E%3Cg fill='none' stroke='%23B88846' stroke-width='2'%3E%3Cpath d='M1 1h73v73H1z'/%3E%3Cpath d='M8 8h59v59H8z'/%3E%3Cpath d='M8 8h16v16H8zM51 8h16v16H51zM51 51h16v16H51zM8 51h16v16H8z'/%3E%3C/g%3E%3Cg fill='%23B88846'%3E%3Ccircle cx='16' cy='16' r='2'/%3E%3Ccircle cx='59' cy='16' r='2'/%3E%3Ccircle cx='59' cy='59' r='2'/%3E%3Ccircle cx='16' cy='59' r='2'/%3E%3C/g%3E%3C/svg%3E\")\n 25;\n`\n\nconst Game = () => {\n const mount = useRef(null)\n\n useEffect(() => {\n document.title = 'The Room'\n\n const bgm = new Audio(DarkFog)\n bgm.play()\n\n bgm.onended = () => {\n bgm.currentTime = 0\n }\n\n // eslint-disable-next-line no-unused-vars\n const game = new TheRoom(mount.current)\n\n return () => {\n bgm.pause()\n bgm.currentTime = 0\n game.terminate()\n }\n }, [mount])\n\n return (\n \n \n GAME OVER\n \n Home\n \n \n \n Level 1\n \n \n \n \n \n )\n}\n\nexport default Game\n","import Home from './Home/Home'\nimport Game from './Game/Game'\n\nimport { Route, Switch, withRouter, Redirect } from 'react-router-dom'\nimport React from 'react'\n\nconst Main = () => {\n return (\n \n \n \n } />\n \n )\n}\n\nexport default withRouter(Main)\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n)\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href)\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config)\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n )\n })\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config)\n }\n })\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing\n if (installingWorker == null) {\n return\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n )\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration)\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.')\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration)\n }\n }\n }\n }\n }\n })\n .catch(error => {\n console.error('Error during service worker registration:', error)\n })\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type')\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload()\n })\n })\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config)\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n )\n })\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister()\n })\n }\n}\n","import './index.css'\nimport Main from './containers/Main'\nimport * as serviceWorker from './serviceWorker'\n\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { HashRouter } from 'react-router-dom'\n\nconst main = (\n \n
\n \n)\n\n// document.getElementById('audio').play()\n\nReactDOM.render(main, document.getElementById('root'))\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister()\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.bd72e617.chunk.js b/static/js/main.f3ac5b48.chunk.js similarity index 99% rename from static/js/main.bd72e617.chunk.js rename to static/js/main.f3ac5b48.chunk.js index 159c1b2..a0c501c 100644 --- a/static/js/main.bd72e617.chunk.js +++ b/static/js/main.f3ac5b48.chunk.js @@ -1,2 +1,2 @@ -(this["webpackJsonpthe-room"]=this["webpackJsonpthe-room"]||[]).push([[0],[,function(e,t,o){e.exports=o(49)},,,,,,,,,,,,,,,,,,,,function(e,t,o){e.exports=o.p+"static/media/logo.dc65f600.png"},function(e,t,o){e.exports=o.p+"static/media/Trouble-Is-Brewing.671462cd.mp3"},,,,,function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAAAgCAMAAABzRoe3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRDQjRBRTVCQjA0QjExRTlBNDkxRjY5NDU3QTBCQ0M4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjRDQjRBRTVDQjA0QjExRTlBNDkxRjY5NDU3QTBCQ0M4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NENCNEFFNTlCMDRCMTFFOUE0OTFGNjk0NTdBMEJDQzgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NENCNEFFNUFCMDRCMTFFOUE0OTFGNjk0NTdBMEJDQzgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4x6wuAAAAAHlBMVEVeLCkcEhscGjD9ohb8UAOUoLoqME5mcpH8/v4AAACcma48AAAACnRSTlP///////////8AsswszwAAAd9JREFUeNrsmNGOhCAMRauztPj/P7wwoCC2xWB5mESSzT7ceri3IozC9uMD3gBvgDeA3cDvmGeW44OdQUQfhxuPMMIHK4NZjQUOJzRA4oORwaRSGg7NGyDywcbgSSZC6wbIfDjhRw1mc1HBr468/Ql8aArGDB7zY4J4lK4350N1vQio+KzBoq+aPoUPDZ8DVPram2BdaVloPfV4Kn8PQKUg/rtMQIrBWEBlhSyh4BJgGh/y/qwBsOiswVih6h3+9oS/70JOBdzTcwHi4PVDfKhWmQbwusETgHTZlg82BitAOKikfXIGH2wMlq0knrROkGfwwcjghgCqbMAHTgYjg+F6F6aAoDrg9Wf8PMGFD72E1UbQNUgpBP9j7mED0gSJz/+cFhL2AKc1Hv7+Ph/HFxSDEkBtQJ6g5cNNgyKgOU2TLj2ku0FB1xvA69AiQgHJS2Q0QH6GD50t0BpwJwA9CZBP+3APnRMPMm8QIPKFZ0APEHTaDfKvtZgDEPPeG7V0F4QAnQYc87t2E66XUNyk/Q2Dmu6Rl2MoLeGZL+/D+X1CfAa82IBcgCTJpUD8KJEdqjqq0ysBdh1JtPj9KNIPIH8WSgXYkVG5wbjpATCtNdJMKGoK2AswKO9q823pX4ABAOiAwdSdaMECAAAAAElFTkSuQmCC"},function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAgCAMAAADt/IAXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYxMkYwQTE5QjA0QjExRTk4MTNCQjE0Q0UxMEM4NkYyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYxMkYwQTFBQjA0QjExRTk4MTNCQjE0Q0UxMEM4NkYyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjEyRjBBMTdCMDRCMTFFOTgxM0JCMTRDRTEwQzg2RjIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjEyRjBBMThCMDRCMTFFOTgxM0JCMTRDRTEwQzg2RjIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7gOi3WAAAAHlBMVEVeLCkcEhv9ohYcGjD8UAOUoLoqME5mcpH8/v4AAAAD02/MAAAACnRSTlP///////////8AsswszwAAAWdJREFUeNrsltFuwyAMRW+aYZP//+FBQgkZNjZs0l7ql0o9zvEVARQc/1z4BPgEmGmms9a5GWAsIIq5gtZhcdkPr6DQ3BBogWt+OAUX5auEBourfvgED8w8z1U/XIKSPhM6Oa3yzo8JQQaXJZI2f8RFPyYECewSb/wW7/1wCHIDF77vvG28P15Sfn6C558+wEjQBMi1pYbngFRO3vvhEBwWTx1hlWNCUBqIBB4dfBjAEDwM6kXAxjmW/JgZcG3QEFa55IdTUI9Kvkr1u1rlqh/eAQdhiC2u+eEfEJAq0QB5wM1ZWiHIfrgF5xKePeob4lh4vwkTl/1wDqi31dfrFbQ9Ft/8p+F9l98BlVNQBfoEmbsCtLw2zARoBKThk5MY4OZagMGAZkKQzzlx3WPcf1hS5SVgF+BIfzYCYQ8YvCyzHK/ZByUgCcfQJTB4+d6YeB5zAiINT3AzgC6g43dc8ONPByzwbwEGAG2MgKLG/4p7AAAAAElFTkSuQmCC"},,function(e,t,o){e.exports=o.p+"static/media/Dungeon_Tileset.d30c4780.png"},function(e,t,o){e.exports=o.p+"static/media/7_firespin_spritesheet.c9ef197f.png"},function(e,t,o){e.exports=o.p+"static/media/8_protectioncircle_spritesheet.c304a897.png"},function(e,t,o){e.exports=o.p+"static/media/13_vortex_spritesheet.a8c4d5d4.png"},function(e,t,o){e.exports=o.p+"static/media/18_midnight_spritesheet.f7d9be13.png"},,function(e,t,o){e.exports=o.p+"static/media/Dark-Fog.e45428b9.mp3"},,,,,function(e,t,o){e.exports=o(53)},function(e,t,o){},,,,,,,function(e,t,o){"use strict";o.r(t);t.default={window:{width:1e3,height:800},game:{render:{viewportPadding:100},player:{acc:{vertical:5,horizontal:5},light:{far:100,near:40},sprite:{width:32,height:32}},map:{width:5e3,height:3e3,enemyIncrement:5},room:{width:9,height:9,radius:4,gridVals:{empty:0,enemy:1,end:2,redPotion:3,bluePotion:4,yellowPotion:5,greenPotion:6},padding:{px:20,nx:24,py:28,ny:20},floorSize:16,vertWallSize:7,horzWallSize:16,monsterGridTimeoutConstant:3e3,levelEnemyInterval:200},powerups:{red:{duration:5e3,probability:.05,gridVal:3,description:"Invincibility"},blue:{playerSpeed:7,duration:5e3,probability:.1,gridVal:4,description:"Speed"},yellow:{duration:5e3,probability:.1,gridVal:5,lightFar:200,lightNear:80,description:"Night Vision"},green:{enemySpeed:1e3,duration:5e3,probability:.5,gridVal:6,description:"Necromancer"}},enemy:{speed:500,levelUpFactor:.95}}}},,,,function(e,t,o){"use strict";o.r(t);o(42);var n=o(5),r=o(21),a=o.n(r),i=o(0),l=o.n(i),s=o(6),p=o(10),m=o(22),c=o.n(m);function g(){var e=Object(n.a)(["\n margin: 1em 1em;\n padding: 0.25em 1em;\n border: 2px solid white;\n border-radius: 10px;\n background: transparent;\n color: white;\n font-size: 200%;\n\n &:active {\n outline: none;\n }\n"]);return g=function(){return e},e}function u(){var e=Object(n.a)(["\n width: 60%;\n"]);return u=function(){return e},e}function d(){var e=Object(n.a)(["\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: ",";\n"]);return d=function(){return e},e}var h=s.a.div(d(),"#1D1F27"),f=s.a.img(u()),y=s.a.button(g());var v=function(){return Object(i.useEffect)(function(){var e=new Audio(c.a);return e.play(),e.onended=function(){e.currentTime=0},function(){e.pause(),e.currentTime=0}}),l.a.createElement(h,null,l.a.createElement(f,{src:a.a,alt:"logo"}),l.a.createElement(p.b,{to:"/game"},l.a.createElement(y,null,"START")))},w=o(2),b=o(38),x=o(27),E=o.n(x),A=o(28),P=o.n(A),M=o(1),R=o.n(M),T=R.a.game.player.sprite.width,I=function e(t,o){var n=this;Object(w.a)(this,e),this.loadSprite=function(){n.walkingImgs=[],n.idleImgs=[],n.p.loadImage(E.a,function(e){for(var t=0;t<6;t++){var o=32*t,r=e.get(o,0,32,32);n.walkingImgs.push(r)}}),n.p.loadImage(P.a,function(e){for(var t=0;t<4;t++){var o=32*t,r=e.get(o,0,32,32);n.idleImgs.push(r)}})},this.draw=function(e){var t=e.x,o=e.y;if(n.p.push(),n.p.rectMode(n.p.CENTER),n.p.fill("#eae7af"),n.walkingImgs.length){n.isFlipped&&n.p.scale(-1,1);var r=n.p.frameCount,a=n.player.isIdle?n.idleImgs[Math.floor(r/5)%3]:n.walkingImgs[Math.floor(r/2)%5];n.p.imageMode(n.p.CENTER),n.p.image(a,(t+T/4)*(n.isFlipped?-1:1),o)}else n.p.rect(t,o,20,20);n.p.pop()},this.flipLeft=function(){return n.isFlipped=!0},this.flipRight=function(){return n.isFlipped=!1},this.p=t,this.player=o,this.isFlipped=!1,this.isSetup=!1},C=o(29),B=R.a.game.map.width,G=R.a.game.map.height,N=function(){function e(){Object(w.a)(this,e)}return Object(C.a)(e,null,[{key:"getElementWidth",value:function(e){var t=getComputedStyle(e);return e.clientWidth-parseFloat(t.paddingLeft)-parseFloat(t.paddingRight)}},{key:"getElementHeight",value:function(e){var t=getComputedStyle(e);return e.clientHeight-parseFloat(t.paddingTop)-parseFloat(t.paddingBottom)}},{key:"generateRandomEnemyPos",value:function(){return{x:(Math.random()>.5?1:-1)*(Math.floor(2*Math.random())+3),y:(Math.random()>.5?1:-1)*(Math.floor(2*Math.random())+3)}}}]),e}();N.getAscii=function(e){return e.charCodeAt(0)},N.getRoomRep=function(e,t){return"".concat(e,",").concat(t)},N.relativeToGlobal=function(e,t){return{x:B/2+176*e,y:G/2+176*t}},N.globalToRelative=function(e,t){return{x:(e-B/2)/176,y:(t-G/2)/176}},N.mapGlobalToPlayerViewport=function(e,t){var o=e.x,n=e.y,r=t.controls.globalPos,a=r.x,i=r.y,l=t.controls.windowPos;return{x:l.x+(o-a),y:l.y+(n-i)}},N.mapPlayerToRoomNumber=function(e){var t=e.x,o=e.y,n=t-B/2,r=o-G/2;return{x:Math.round(n/176),y:Math.round(r/176)}},N.getRoomBoundaries=function(e,t){var o=N.relativeToGlobal(e,t);return{minX:o.x-88,minY:o.y-88,maxX:o.x+88,maxY:o.y+88}},N.getHallwayBoundaries=function(e,t){switch(t){case"horizontal":return{minX:e.minX+66,maxX:e.maxX-66};case"vertical":return{minY:e.minY+66,maxY:e.maxY-66};default:return{minY:Number.MAX_VALUE,maxY:Number.MIN_VALUE}}},N.isBetween=function(e,t,o){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:.1;return e+n<=t&&t<=o-n};var O=R.a.game.map.width,j=R.a.game.map.height,k=R.a.game.player.acc.vertical,W=R.a.game.player.acc.horizontal,D=R.a.game.room.padding.px,z=R.a.game.room.padding.py,V=R.a.game.room.padding.nx,S=R.a.game.room.padding.ny,Y=R.a.game.render.viewportPadding,U=R.a.game.powerups.blue.playerSpeed,Q=function e(t,o){var n=this;Object(w.a)(this,e),this.tick=function(){n.player.isSetup||(n.globalPos={x:O/2,y:j/2},n.windowPos={x:n.p.width/2,y:n.p.height/2},n.player.isSetup=!0),n.handleInputAndCollision()},this.handleInputAndCollision=function(){var e=n.p.deltaTime/50,t=(n.player.powerups.blue?U:k)*e,o=(n.player.powerups.blue?U:W)*e,r=n.p.keyIsDown(N.getAscii("W"))||n.p.keyIsDown(n.p.UP_ARROW),a=n.p.keyIsDown(N.getAscii("S"))||n.p.keyIsDown(n.p.DOWN_ARROW),i=n.p.keyIsDown(N.getAscii("A"))||n.p.keyIsDown(n.p.LEFT_ARROW),l=n.p.keyIsDown(N.getAscii("D"))||n.p.keyIsDown(n.p.RIGHT_ARROW),s=N.mapPlayerToRoomNumber(n.globalPos),p=s.x,m=s.y,c=n.map.getRoomByCoords(p,m);if(c){var g=N.getRoomBoundaries(p,m),u=N.getHallwayBoundaries(g,"vertical"),d=u.minY,h=u.maxY,f=N.getHallwayBoundaries(g,"horizontal"),y=f.minX,v=f.maxX;if(r){var w=!1;n.globalPos.y-t=Y&&(n.windowPos.y-=t)}if(a){var b=!1;n.globalPos.y-t>g.maxY-z?c.bottom&&N.isBetween(y,n.globalPos.x,v)&&(n.globalPos.y+=t,b=!0):(n.globalPos.y+=t,b=!0),b&&n.windowPos.y+t<=n.p.height-Y&&(n.windowPos.y+=t)}if(i){var x=!1;n.globalPos.x-o=Y&&(n.windowPos.x-=o),n.player.sprite.flipLeft()}if(l){var E=!1;n.globalPos.x+o>g.maxX-D?c.right&&N.isBetween(d,n.globalPos.y,h)&&(n.globalPos.x+=o,E=!0):(n.globalPos.x+=o,E=!0),E&&n.windowPos.x+o<=n.p.width-Y&&(n.windowPos.x+=o),n.player.sprite.flipRight()}n.player.isIdle=!(r||a||i||l),n.player.playerMove()}},this.registerMap=function(e){return n.map=e},this.getPosData=function(){return[n.windowPos,n.globalPos]},this.p=t,this.player=o,this.globalPos=null,this.windowPos=null},Z=R.a.game.room.width,F=R.a.game.room.height,H=function e(t,o){var n=this;Object(w.a)(this,e),this.registerMap=function(e){n.map=e,n.controls.registerMap(e)},this.update=function(){var e;n.controls.tick(),(e=n.sprite).draw.apply(e,Object(b.a)(n.controls.getPosData()))},this.getRoomNRoomCoords=function(){var e=N.globalToRelative(n.controls.globalPos.x,n.controls.globalPos.y),t=n.map.rooms[N.getRoomRep(Math.round(e.x),Math.round(e.y))];return[t,{x:Math.round((e.x-t.x)*(Z+2)),y:Math.round((e.y-t.y)*(F+2))}]},this.playerMove=o,this.controls=new Q(t,this),this.sprite=new I(t,this),this.powerups={red:!1,blue:!1,yellow:!1,green:!1}},L=R.a.game.room.gridVals.empty,J=R.a.game.room.gridVals.enemy,X=R.a.game.room.gridVals.end,K=R.a.game.room.width,q=R.a.game.room.height,_=R.a.game.room.radius,$=R.a.game.room.monsterGridTimeoutConstant,ee=R.a.game.room.levelEnemyInterval,te=function e(t,o,n){var r=this;Object(w.a)(this,e),this.updateGrid=function(e,t,o){var n=r.grid[t+_][e+_];if(r.grid[t+_][e+_]=o,o===J)var a=setTimeout(function(){r.grid[t+_][e+_]=n===X?X:L,clearTimeout(a)},$+r.map.level*ee)},this.updateTunnels=function(e,t,o){if(r.gridTunnels[e][t]=o,o===J)var n=setTimeout(function(){r.gridTunnels[e][t]=L,clearTimeout(n)},$+r.map.level*ee)},this.getVal=function(e,t){return r.grid[t+_][e+_]},this.getValTunnels=function(e,t){return r.gridTunnels[e][t]},this.generatePowerup=function(e){r.updateGrid(Math.floor(Math.random()*(K-2))-_+1,Math.floor(Math.random()*(q-2))-_+1,e)},this.x=t,this.y=o,this.map=n,this.grid=new Array(K);for(var a=0;axe+1?(o.room=o.room.bottom,o.room.updateTunnels(0,r.x+1,Ee),o.roomCoords=r,o.roomCoords.y=-xe-1):r.x<-xe-1?(o.room=o.room.left,o.room.updateTunnels(3,r.y+1,Ee),o.roomCoords=r,o.roomCoords.x=xe+1):r.x>xe+1?(o.room=o.room.right,o.room.updateTunnels(2,r.y+1,Ee),o.roomCoords=r,o.roomCoords.x=-xe-1):(o.room.updateGrid(r.x,r.y,Ee),o.roomCoords=r)},this.getSurroundings=function(e){for(var t=[{x:0,y:1},{x:1,y:0},{x:0,y:-1},{x:-1,y:0}],n=[],r=0;r=xe+1&&Math.abs(i.y)<=1&&o.room.right?n.push(i):i.y<=-xe-1&&Math.abs(i.x)<=1&&o.room.top?n.push(i):i.y>=xe+1&&Math.abs(i.x)<=1&&o.room.bottom&&n.push(i)}return n},this.getDist=function(e,t){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},this.room=t,this.roomCoords=N.generateRandomEnemyPos()},Pe=R.a.game.player.light.far,Me=R.a.game.player.light.near,Re="transparent ".concat(Me,"px, rgba(0, 0, 0) ").concat(Pe,"px)"),Te=R.a.game.powerups.yellow,Ie="transparent ".concat(Te.lightNear,"px, rgba(0, 0, 0) ").concat(Te.lightFar,"px)");function Ce(e){var t=document.getElementById("spotlight");this.getSpotlight=function(){return t},this.getPlayer=function(){return e}}Ce.prototype.update=function(){var e=this.getSpotlight(),t=this.getPlayer(),o=t.controls.windowPos,n=o.x,r=o.y;e.style.backgroundImage="radial-gradient(circle at ".concat(n,"px ").concat(r,"px, ").concat(t.powerups.yellow?Ie:Re)};var Be=Ce,Ge=o(31),Ne=o.n(Ge),Oe=o(32),je=o.n(Oe),ke=o(33),We=o.n(ke),De=o(34),ze=o.n(De);function Ve(e,t){this.p=e,this.player=t,this.element=document.getElementById("effect"),this.effects={},this.sprites={}}Ve.prototype.loadSprites=function(){var e=this;this.sprites.yellow=[],this.p.loadImage(Ne.a,function(t){for(var o=0;o<8;o++)for(var n=100*o,r=0;r<(7===o?5:8);r++){var a=100*r,i=t.get(n,a,100,100);e.sprites.yellow.push(i)}}),this.sprites.blue=[],this.p.loadImage(ze.a,function(t){for(var o=0;o<8;o++)for(var n=100*o,r=0;r<(7===o?5:8);r++){var a=100*r,i=t.get(n,a,100,100);e.sprites.blue.push(i)}}),this.sprites.green=[],this.p.loadImage(je.a,function(t){for(var o=0;o<8;o++)for(var n=100*o,r=0;r<(7===o?5:8);r++){var a=100*r,i=t.get(n,a,100,100);e.sprites.green.push(i)}}),this.sprites.red=[],this.p.loadImage(We.a,function(t){for(var o=0;o<8;o++)for(var n=100*o,r=0;r<(7===o?5:8);r++){var a=100*r,i=t.get(n,a,100,100);e.sprites.red.push(i)}})},Ve.prototype.addEffect=function(e,t){this.effects[e]=t},Ve.prototype.removeEffect=function(e){delete this.effects[e]},Ve.prototype.draw=function(){var e=this,t=Object.keys(this.effects).map(function(t){return"".concat(e.effects[t],"
")}).join(" ");this.element.innerHTML=t;var o=this.effects,n=o.YELLOW,r=o.BLUE,a=o.GREEN,i=o.RED,l=this.player.controls.windowPos,s=l.x,p=l.y,m=Math.floor(this.p.frameCount/2)%61;this.p.push(),this.p.imageMode(this.p.CENTER),n&&this.p.image(this.sprites.yellow[m],s+8+30*Math.cos(this.p.frameCount/16),p+0+30*Math.sin(this.p.frameCount/16),40,40),r&&this.p.image(this.sprites.blue[m],s+8+30*Math.cos(this.p.frameCount/16+Math.PI/2),p+0+30*Math.sin(this.p.frameCount/16+Math.PI/2),40,40),a&&this.p.image(this.sprites.green[m],s+8+30*Math.cos(this.p.frameCount/16+Math.PI),p+0+30*Math.sin(this.p.frameCount/16+Math.PI),40,40),i&&this.p.image(this.sprites.red[m],s+8+30*Math.cos(this.p.frameCount/16-Math.PI/2),p+0+30*Math.sin(this.p.frameCount/16-Math.PI/2),40,40),this.p.pop()};var Se=Ve,Ye=o(35),Ue=o.n(Ye),Qe=R.a.game.map.width,Ze=R.a.game.map.height,Fe=R.a.game.room.radius,He=R.a.game.room.gridVals.enemy,Le=R.a.game.room.gridVals.end,Je=R.a.game.room.gridVals.redPotion,Xe=R.a.game.room.gridVals.bluePotion,Ke=R.a.game.room.gridVals.yellowPotion,qe=R.a.game.room.gridVals.greenPotion,_e=R.a.game.enemy.speed,$e=R.a.game.enemy.levelUpFactor,et=R.a.game.powerups.red,tt=R.a.game.powerups.blue,ot=R.a.game.powerups.yellow,nt=R.a.game.powerups.green,rt=R.a.game.map.enemyIncrement,at=function e(t){var o=this;Object(w.a)(this,e),this.update=function(){o.map.update(),o.player.update(),o.spotlight.update(),o.effectIndicator.draw()},this.enemiesMove=function(){o.enemies.forEach(function(e){return e.move(o.player)}),o.checkPlayerPos()===He&&o.gameOver()},this.playerMove=function(){switch(o.checkPlayerPos()){case He:o.gameOver();break;case Le:o.levelUp();break;case Je:o.redPotionPowerup();break;case Xe:o.bluePotionPowerup();break;case Ke:o.yellowPotionPowerup();break;case qe:o.greenPotionPowerup()}},this.checkPlayerPos=function(){var e=o.player.getRoomNRoomCoords(),t=e[0],n=e[1],r=0;return Math.abs(n.x)<=Fe&&Math.abs(n.y)<=Fe?r=t.getVal(n.x,n.y):n.x<=-Fe-1&&Math.abs(n.y)<=1&&t.left?r=t.getValTunnels(2,n.y+1):n.x>=Fe+1&&Math.abs(n.y)<=1&&t.right?r=t.getValTunnels(3,n.y+1):n.y<=-Fe-1&&Math.abs(n.x)<=1&&t.top?r=t.getValTunnels(0,n.x+1):n.y>=Fe+1&&Math.abs(n.x)<=1&&t.bottom&&(r=t.getValTunnels(1,n.x+1)),r},this.levelUp=function(){o.map.level+=1,o.map.initiateRooms(),o.player.controls.globalPos={x:Qe/2,y:Ze/2},o.player.controls.windowPos={x:o.player.controls.p.width/2,y:o.player.controls.p.height/2};var e=Math.floor(o.map.level/rt)+1;o.enemies=[];for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:_e;clearInterval(o.monsterInterval),o.monsterInterval=setInterval(o.enemiesMove,e)},this.terminate=function(){o.p5instance.remove(),clearInterval(o.monsterInterval)},this.sketch=function(e){o.player=new H(e,o.playerMove),o.map=new ve(e,o.player),o.enemies=[new Ae(o.map.startingRoom)],o.player.registerMap(o.map),o.spotlight=new Be(o.player),o.effectIndicator=new Se(e,o.player),e.preload=function(){o.map.sprite.loadSprite(),o.player.sprite.loadSprite(),o.effectIndicator.loadSprites()},e.setup=function(){e.createCanvas(N.getElementWidth(t),N.getElementHeight(t)).parent(t),e.textFont("Helvetica"),e.textAlign(e.CENTER,e.CENTER),e.smooth()},e.draw=function(){e.background("#160f30"),o.update()},e.windowResized=function(){e.resizeCanvas(N.getElementWidth(t),N.getElementHeight(t))},o.initiateEnemyMovement()},this.p5instance=new Ue.a(this.sketch)},it=o(36),lt=o.n(it);function st(){var e=Object(n.a)(["\n position: relative;\n width: 80%;\n height: 60%;\n border: 25px solid #b88846;\n border-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='75' height='75'%3E%3Cg fill='none' stroke='%23B88846' stroke-width='2'%3E%3Cpath d='M1 1h73v73H1z'/%3E%3Cpath d='M8 8h59v59H8z'/%3E%3Cpath d='M8 8h16v16H8zM51 8h16v16H51zM51 51h16v16H51zM8 51h16v16H8z'/%3E%3C/g%3E%3Cg fill='%23B88846'%3E%3Ccircle cx='16' cy='16' r='2'/%3E%3Ccircle cx='59' cy='16' r='2'/%3E%3Ccircle cx='59' cy='59' r='2'/%3E%3Ccircle cx='16' cy='59' r='2'/%3E%3C/g%3E%3C/svg%3E\")\n 25;\n"]);return st=function(){return e},e}function pt(){var e=Object(n.a)(["\n margin: 20px;\n border-bottom: 3px solid #eae7af;\n color: #eae7af;\n font-family: 'Lexend Zetta', sans-serif;\n font-size: 40px;\n"]);return pt=function(){return e},e}function mt(){var e=Object(n.a)(["\n width: 50px;\n height: 25px;\n margin: 5px;\n border: 1px solid #eae7af;\n border-radius: 5px;\n background: transparent;\n color: #eae7af;\n font-size: 16px;\n font-weight: 100;\n"]);return mt=function(){return e},e}function ct(){var e=Object(n.a)(["\n display: flex;\n position: absolute;\n z-index: 10;\n top: -20%;\n left: 50%;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n border: 10px solid #160f30;\n border-radius: 5px;\n background: #01024e;\n color: #eae7af;\n font-size: 50px;\n transform: translate(-50%, -50%);\n transition: 0.2s ease all;\n"]);return ct=function(){return e},e}function gt(){var e=Object(n.a)(["\n position: absolute;\n z-index: 20;\n bottom: 0;\n left: 0;\n margin: 15px;\n color: #eae7af;\n font-family: 'Gayathri', sans-serif;\n font-size: 24px;\n"]);return gt=function(){return e},e}function ut(){var e=Object(n.a)(["\n position: absolute;\n width: 100%;\n height: 100%;\n background-image: radial-gradient(\n circle,\n transparent 160px,\n rgba(0, 0, 0) 200px\n );\n transition: 0.5s ease-in all;\n"]);return ut=function(){return e},e}function dt(){var e=Object(n.a)(["\n position: fixed;\n top: 0;\n left: 0;\n"]);return dt=function(){return e},e}function ht(){var e=Object(n.a)(["\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: radial-gradient(#003, #000);\n"]);return ht=function(){return e},e}var ft=s.a.div(ht()),yt=s.a.div(dt()),vt=s.a.div(ut()),wt=s.a.div(gt()),bt=s.a.div(ct()),xt=s.a.button(mt()),Et=s.a.div(pt()),At=s.a.div(st()),Pt=function(){var e=Object(i.useRef)(null);return Object(i.useEffect)(function(){document.title="The Room";var t=new Audio(lt.a);t.play(),t.onended=function(){t.currentTime=0};var o=new at(e.current);return function(){t.pause(),t.currentTime=0,o.terminate()}},[e]),l.a.createElement(ft,null,l.a.createElement(bt,{id:"gameover"},"GAME OVER",l.a.createElement(p.b,{to:"/home"},l.a.createElement(xt,null,"Home"))),l.a.createElement(yt,{id:"debug"}),l.a.createElement(Et,{id:"score"},"Level 1"),l.a.createElement(At,{ref:e},l.a.createElement(wt,{id:"effect"}),l.a.createElement(vt,{id:"spotlight"})))},Mt=o(9),Rt=Object(Mt.g)(function(){return l.a.createElement(Mt.d,null,l.a.createElement(Mt.b,{path:"/home",component:v}),l.a.createElement(Mt.b,{path:"/game",component:Pt}),l.a.createElement(Mt.b,{path:"/",component:function(){return l.a.createElement(Mt.a,{to:"/home"})}}))});Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));var Tt=o(37),It=o.n(Tt),Ct=l.a.createElement(p.a,null,l.a.createElement(Rt,null));It.a.render(Ct,document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then(function(e){e.unregister()})}],[[41,1,2]]]); -//# sourceMappingURL=main.bd72e617.chunk.js.map \ No newline at end of file +(this["webpackJsonpthe-room"]=this["webpackJsonpthe-room"]||[]).push([[0],[,function(e,t,o){e.exports=o(49)},,,,,,,,,,,,,,,,,,,,function(e,t,o){e.exports=o.p+"static/media/logo.dc65f600.png"},function(e,t,o){e.exports=o.p+"static/media/Trouble-Is-Brewing.671462cd.mp3"},,,,,function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAAAgCAMAAABzRoe3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRDQjRBRTVCQjA0QjExRTlBNDkxRjY5NDU3QTBCQ0M4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjRDQjRBRTVDQjA0QjExRTlBNDkxRjY5NDU3QTBCQ0M4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NENCNEFFNTlCMDRCMTFFOUE0OTFGNjk0NTdBMEJDQzgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NENCNEFFNUFCMDRCMTFFOUE0OTFGNjk0NTdBMEJDQzgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4x6wuAAAAAHlBMVEVeLCkcEhscGjD9ohb8UAOUoLoqME5mcpH8/v4AAACcma48AAAACnRSTlP///////////8AsswszwAAAd9JREFUeNrsmNGOhCAMRauztPj/P7wwoCC2xWB5mESSzT7ceri3IozC9uMD3gBvgDeA3cDvmGeW44OdQUQfhxuPMMIHK4NZjQUOJzRA4oORwaRSGg7NGyDywcbgSSZC6wbIfDjhRw1mc1HBr468/Ql8aArGDB7zY4J4lK4350N1vQio+KzBoq+aPoUPDZ8DVPram2BdaVloPfV4Kn8PQKUg/rtMQIrBWEBlhSyh4BJgGh/y/qwBsOiswVih6h3+9oS/70JOBdzTcwHi4PVDfKhWmQbwusETgHTZlg82BitAOKikfXIGH2wMlq0knrROkGfwwcjghgCqbMAHTgYjg+F6F6aAoDrg9Wf8PMGFD72E1UbQNUgpBP9j7mED0gSJz/+cFhL2AKc1Hv7+Ph/HFxSDEkBtQJ6g5cNNgyKgOU2TLj2ku0FB1xvA69AiQgHJS2Q0QH6GD50t0BpwJwA9CZBP+3APnRMPMm8QIPKFZ0APEHTaDfKvtZgDEPPeG7V0F4QAnQYc87t2E66XUNyk/Q2Dmu6Rl2MoLeGZL+/D+X1CfAa82IBcgCTJpUD8KJEdqjqq0ysBdh1JtPj9KNIPIH8WSgXYkVG5wbjpATCtNdJMKGoK2AswKO9q823pX4ABAOiAwdSdaMECAAAAAElFTkSuQmCC"},function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAgCAMAAADt/IAXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYxMkYwQTE5QjA0QjExRTk4MTNCQjE0Q0UxMEM4NkYyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYxMkYwQTFBQjA0QjExRTk4MTNCQjE0Q0UxMEM4NkYyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjEyRjBBMTdCMDRCMTFFOTgxM0JCMTRDRTEwQzg2RjIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjEyRjBBMThCMDRCMTFFOTgxM0JCMTRDRTEwQzg2RjIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7gOi3WAAAAHlBMVEVeLCkcEhv9ohYcGjD8UAOUoLoqME5mcpH8/v4AAAAD02/MAAAACnRSTlP///////////8AsswszwAAAWdJREFUeNrsltFuwyAMRW+aYZP//+FBQgkZNjZs0l7ql0o9zvEVARQc/1z4BPgEmGmms9a5GWAsIIq5gtZhcdkPr6DQ3BBogWt+OAUX5auEBourfvgED8w8z1U/XIKSPhM6Oa3yzo8JQQaXJZI2f8RFPyYECewSb/wW7/1wCHIDF77vvG28P15Sfn6C558+wEjQBMi1pYbngFRO3vvhEBwWTx1hlWNCUBqIBB4dfBjAEDwM6kXAxjmW/JgZcG3QEFa55IdTUI9Kvkr1u1rlqh/eAQdhiC2u+eEfEJAq0QB5wM1ZWiHIfrgF5xKePeob4lh4vwkTl/1wDqi31dfrFbQ9Ft/8p+F9l98BlVNQBfoEmbsCtLw2zARoBKThk5MY4OZagMGAZkKQzzlx3WPcf1hS5SVgF+BIfzYCYQ8YvCyzHK/ZByUgCcfQJTB4+d6YeB5zAiINT3AzgC6g43dc8ONPByzwbwEGAG2MgKLG/4p7AAAAAElFTkSuQmCC"},,function(e,t,o){e.exports=o.p+"static/media/Dungeon_Tileset.d30c4780.png"},function(e,t,o){e.exports=o.p+"static/media/7_firespin_spritesheet.c9ef197f.png"},function(e,t,o){e.exports=o.p+"static/media/8_protectioncircle_spritesheet.c304a897.png"},function(e,t,o){e.exports=o.p+"static/media/13_vortex_spritesheet.a8c4d5d4.png"},function(e,t,o){e.exports=o.p+"static/media/18_midnight_spritesheet.f7d9be13.png"},,function(e,t,o){e.exports=o.p+"static/media/Dark-Fog.e45428b9.mp3"},,,,,function(e,t,o){e.exports=o(53)},function(e,t,o){},,,,,,,function(e,t,o){"use strict";o.r(t);t.default={window:{width:1e3,height:800},game:{render:{viewportPadding:100},player:{acc:{vertical:5,horizontal:5},light:{far:100,near:40},sprite:{width:32,height:32}},map:{width:5e3,height:3e3,enemyIncrement:5},room:{width:9,height:9,radius:4,gridVals:{empty:0,enemy:1,end:2,redPotion:3,bluePotion:4,yellowPotion:5,greenPotion:6},padding:{px:20,nx:24,py:28,ny:20},floorSize:16,vertWallSize:7,horzWallSize:16,monsterGridTimeoutConstant:3e3,levelEnemyInterval:200},powerups:{red:{duration:5e3,probability:.05,gridVal:3,description:"Invincibility"},blue:{playerSpeed:7,duration:5e3,probability:.1,gridVal:4,description:"Speed"},yellow:{duration:5e3,probability:.1,gridVal:5,lightFar:200,lightNear:80,description:"Night Vision"},green:{enemySpeed:1e3,duration:5e3,probability:.5,gridVal:6,description:"Necromancer"}},enemy:{speed:500,levelUpFactor:.95}}}},,,,function(e,t,o){"use strict";o.r(t);o(42);var n=o(5),r=o(21),a=o.n(r),i=o(0),l=o.n(i),s=o(6),p=o(10),m=o(22),c=o.n(m);function g(){var e=Object(n.a)(["\n margin: 1em 1em;\n padding: 0.25em 1em;\n border: 2px solid white;\n border-radius: 10px;\n background: transparent;\n color: white;\n font-size: 200%;\n\n &:active {\n outline: none;\n }\n"]);return g=function(){return e},e}function u(){var e=Object(n.a)(["\n width: 60%;\n"]);return u=function(){return e},e}function d(){var e=Object(n.a)(["\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: ",";\n"]);return d=function(){return e},e}var h=s.a.div(d(),"#1D1F27"),f=s.a.img(u()),y=s.a.button(g());var v=function(){return Object(i.useEffect)(function(){var e=new Audio(c.a);return e.play(),e.onended=function(){e.currentTime=0},function(){e.pause(),e.currentTime=0}}),l.a.createElement(h,null,l.a.createElement(f,{src:a.a,alt:"logo"}),l.a.createElement(p.b,{to:"/game"},l.a.createElement(y,null,"START")))},w=o(2),b=o(38),x=o(27),E=o.n(x),A=o(28),P=o.n(A),M=o(1),R=o.n(M),T=R.a.game.player.sprite.width,I=function e(t,o){var n=this;Object(w.a)(this,e),this.loadSprite=function(){n.walkingImgs=[],n.idleImgs=[],n.p.loadImage(E.a,function(e){for(var t=0;t<6;t++){var o=32*t,r=e.get(o,0,32,32);n.walkingImgs.push(r)}}),n.p.loadImage(P.a,function(e){for(var t=0;t<4;t++){var o=32*t,r=e.get(o,0,32,32);n.idleImgs.push(r)}})},this.draw=function(e){var t=e.x,o=e.y;if(n.p.push(),n.p.rectMode(n.p.CENTER),n.p.fill("#eae7af"),n.walkingImgs.length){n.isFlipped&&n.p.scale(-1,1);var r=n.p.frameCount,a=n.player.isIdle?n.idleImgs[Math.floor(r/5)%3]:n.walkingImgs[Math.floor(r/2)%5];n.p.imageMode(n.p.CENTER),n.p.image(a,(t+T/4)*(n.isFlipped?-1:1),o)}else n.p.rect(t,o,20,20);n.p.pop()},this.flipLeft=function(){return n.isFlipped=!0},this.flipRight=function(){return n.isFlipped=!1},this.p=t,this.player=o,this.isFlipped=!1,this.isSetup=!1},C=o(29),B=R.a.game.map.width,G=R.a.game.map.height,N=function(){function e(){Object(w.a)(this,e)}return Object(C.a)(e,null,[{key:"getElementWidth",value:function(e){var t=getComputedStyle(e);return e.clientWidth-parseFloat(t.paddingLeft)-parseFloat(t.paddingRight)}},{key:"getElementHeight",value:function(e){var t=getComputedStyle(e);return e.clientHeight-parseFloat(t.paddingTop)-parseFloat(t.paddingBottom)}},{key:"generateRandomEnemyPos",value:function(){return{x:(Math.random()>.5?1:-1)*(Math.floor(2*Math.random())+3),y:(Math.random()>.5?1:-1)*(Math.floor(2*Math.random())+3)}}}]),e}();N.getAscii=function(e){return e.charCodeAt(0)},N.getRoomRep=function(e,t){return"".concat(e,",").concat(t)},N.relativeToGlobal=function(e,t){return{x:B/2+176*e,y:G/2+176*t}},N.globalToRelative=function(e,t){return{x:(e-B/2)/176,y:(t-G/2)/176}},N.mapGlobalToPlayerViewport=function(e,t){var o=e.x,n=e.y,r=t.controls.globalPos,a=r.x,i=r.y,l=t.controls.windowPos;return{x:l.x+(o-a),y:l.y+(n-i)}},N.mapPlayerToRoomNumber=function(e){var t=e.x,o=e.y,n=t-B/2,r=o-G/2;return{x:Math.round(n/176),y:Math.round(r/176)}},N.getRoomBoundaries=function(e,t){var o=N.relativeToGlobal(e,t);return{minX:o.x-88,minY:o.y-88,maxX:o.x+88,maxY:o.y+88}},N.getHallwayBoundaries=function(e,t){switch(t){case"horizontal":return{minX:e.minX+66,maxX:e.maxX-66};case"vertical":return{minY:e.minY+66,maxY:e.maxY-66};default:return{minY:Number.MAX_VALUE,maxY:Number.MIN_VALUE}}},N.isBetween=function(e,t,o){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:.1;return e+n<=t&&t<=o-n};var O=R.a.game.map.width,j=R.a.game.map.height,k=R.a.game.player.acc.vertical,W=R.a.game.player.acc.horizontal,D=R.a.game.room.padding.px,z=R.a.game.room.padding.py,V=R.a.game.room.padding.nx,S=R.a.game.room.padding.ny,Y=R.a.game.render.viewportPadding,U=R.a.game.powerups.blue.playerSpeed,Q=function e(t,o){var n=this;Object(w.a)(this,e),this.tick=function(){n.player.isSetup||(n.globalPos={x:O/2,y:j/2},n.windowPos={x:n.p.width/2,y:n.p.height/2},n.player.isSetup=!0),n.handleInputAndCollision()},this.handleInputAndCollision=function(){var e=n.p.deltaTime/50,t=(n.player.powerups.blue?U:k)*e,o=(n.player.powerups.blue?U:W)*e,r=n.p.keyIsDown(N.getAscii("W"))||n.p.keyIsDown(n.p.UP_ARROW),a=n.p.keyIsDown(N.getAscii("S"))||n.p.keyIsDown(n.p.DOWN_ARROW),i=n.p.keyIsDown(N.getAscii("A"))||n.p.keyIsDown(n.p.LEFT_ARROW),l=n.p.keyIsDown(N.getAscii("D"))||n.p.keyIsDown(n.p.RIGHT_ARROW),s=N.mapPlayerToRoomNumber(n.globalPos),p=s.x,m=s.y,c=n.map.getRoomByCoords(p,m);if(c){var g=N.getRoomBoundaries(p,m),u=N.getHallwayBoundaries(g,"vertical"),d=u.minY,h=u.maxY,f=N.getHallwayBoundaries(g,"horizontal"),y=f.minX,v=f.maxX;if(r){var w=!1;n.globalPos.y-t=Y&&(n.windowPos.y-=t)}if(a){var b=!1;n.globalPos.y-t>g.maxY-z?c.bottom&&N.isBetween(y,n.globalPos.x,v)&&(n.globalPos.y+=t,b=!0):(n.globalPos.y+=t,b=!0),b&&n.windowPos.y+t<=n.p.height-Y&&(n.windowPos.y+=t)}if(i){var x=!1;n.globalPos.x-o=Y&&(n.windowPos.x-=o),n.player.sprite.flipLeft()}if(l){var E=!1;n.globalPos.x+o>g.maxX-D?c.right&&N.isBetween(d,n.globalPos.y,h)&&(n.globalPos.x+=o,E=!0):(n.globalPos.x+=o,E=!0),E&&n.windowPos.x+o<=n.p.width-Y&&(n.windowPos.x+=o),n.player.sprite.flipRight()}n.player.isIdle=!(r||a||i||l),n.player.playerMove()}},this.registerMap=function(e){return n.map=e},this.getPosData=function(){return[n.windowPos,n.globalPos]},this.p=t,this.player=o,this.globalPos=null,this.windowPos=null},Z=R.a.game.room.width,F=R.a.game.room.height,H=function e(t,o){var n=this;Object(w.a)(this,e),this.registerMap=function(e){n.map=e,n.controls.registerMap(e)},this.update=function(){var e;n.controls.tick(),(e=n.sprite).draw.apply(e,Object(b.a)(n.controls.getPosData()))},this.getRoomNRoomCoords=function(){var e=N.globalToRelative(n.controls.globalPos.x,n.controls.globalPos.y),t=n.map.rooms[N.getRoomRep(Math.round(e.x),Math.round(e.y))];return[t,{x:Math.round((e.x-t.x)*(Z+2)),y:Math.round((e.y-t.y)*(F+2))}]},this.playerMove=o,this.controls=new Q(t,this),this.sprite=new I(t,this),this.powerups={red:!1,blue:!1,yellow:!1,green:!1}},L=R.a.game.room.gridVals.empty,J=R.a.game.room.gridVals.enemy,X=R.a.game.room.gridVals.end,K=R.a.game.room.width,q=R.a.game.room.height,_=R.a.game.room.radius,$=R.a.game.room.monsterGridTimeoutConstant,ee=R.a.game.room.levelEnemyInterval,te=function e(t,o,n){var r=this;Object(w.a)(this,e),this.updateGrid=function(e,t,o){var n=r.grid[t+_][e+_];if(r.grid[t+_][e+_]=o,o===J)var a=setTimeout(function(){r.grid[t+_][e+_]=n===X?X:L,clearTimeout(a)},$+r.map.level*ee)},this.updateTunnels=function(e,t,o){if(r.gridTunnels[e][t]=o,o===J)var n=setTimeout(function(){r.gridTunnels[e][t]=L,clearTimeout(n)},$+r.map.level*ee)},this.getVal=function(e,t){return r.grid[t+_][e+_]},this.getValTunnels=function(e,t){return r.gridTunnels[e][t]},this.generatePowerup=function(e){r.updateGrid(Math.floor(Math.random()*(K-2))-_+1,Math.floor(Math.random()*(q-2))-_+1,e)},this.x=t,this.y=o,this.map=n,this.grid=new Array(K);for(var a=0;axe+1?(o.room=o.room.bottom,o.room.updateTunnels(0,r.x+1,Ee),o.roomCoords=r,o.roomCoords.y=-xe-1):r.x<-xe-1?(o.room=o.room.left,o.room.updateTunnels(3,r.y+1,Ee),o.roomCoords=r,o.roomCoords.x=xe+1):r.x>xe+1?(o.room=o.room.right,o.room.updateTunnels(2,r.y+1,Ee),o.roomCoords=r,o.roomCoords.x=-xe-1):(o.room.updateGrid(r.x,r.y,Ee),o.roomCoords=r)},this.getSurroundings=function(e){for(var t=[{x:0,y:1},{x:1,y:0},{x:0,y:-1},{x:-1,y:0}],n=[],r=0;r=xe+1&&Math.abs(i.y)<=1&&o.room.right?n.push(i):i.y<=-xe-1&&Math.abs(i.x)<=1&&o.room.top?n.push(i):i.y>=xe+1&&Math.abs(i.x)<=1&&o.room.bottom&&n.push(i)}return n},this.getDist=function(e,t){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},this.room=t,this.roomCoords=N.generateRandomEnemyPos()},Pe=R.a.game.player.light.far,Me=R.a.game.player.light.near,Re="transparent ".concat(Me,"px, rgba(0, 0, 0) ").concat(Pe,"px)"),Te=R.a.game.powerups.yellow,Ie="transparent ".concat(Te.lightNear,"px, rgba(0, 0, 0) ").concat(Te.lightFar,"px)");function Ce(e){var t=document.getElementById("spotlight");this.getSpotlight=function(){return t},this.getPlayer=function(){return e}}Ce.prototype.update=function(){var e=this.getSpotlight(),t=this.getPlayer(),o=t.controls.windowPos,n=o.x,r=o.y;e.style.backgroundImage="radial-gradient(circle at ".concat(n,"px ").concat(r,"px, ").concat(t.powerups.yellow?Ie:Re)};var Be=Ce,Ge=o(31),Ne=o.n(Ge),Oe=o(32),je=o.n(Oe),ke=o(33),We=o.n(ke),De=o(34),ze=o.n(De);function Ve(e,t){this.p=e,this.player=t,this.element=document.getElementById("effect"),this.effects={},this.sprites={}}Ve.prototype.loadSprites=function(){var e=this;this.sprites.yellow=[],this.p.loadImage(Ne.a,function(t){for(var o=0;o<8;o++)for(var n=100*o,r=0;r<(7===o?5:8);r++){var a=100*r,i=t.get(n,a,100,100);e.sprites.yellow.push(i)}}),this.sprites.blue=[],this.p.loadImage(ze.a,function(t){for(var o=0;o<8;o++)for(var n=100*o,r=0;r<(7===o?5:8);r++){var a=100*r,i=t.get(n,a,100,100);e.sprites.blue.push(i)}}),this.sprites.green=[],this.p.loadImage(je.a,function(t){for(var o=0;o<8;o++)for(var n=100*o,r=0;r<(7===o?5:8);r++){var a=100*r,i=t.get(n,a,100,100);e.sprites.green.push(i)}}),this.sprites.red=[],this.p.loadImage(We.a,function(t){for(var o=0;o<8;o++)for(var n=100*o,r=0;r<(7===o?5:8);r++){var a=100*r,i=t.get(n,a,100,100);e.sprites.red.push(i)}})},Ve.prototype.addEffect=function(e,t){this.effects[e]=t},Ve.prototype.removeEffect=function(e){delete this.effects[e]},Ve.prototype.draw=function(){var e=this,t=Object.keys(this.effects).map(function(t){return"".concat(e.effects[t],"
")}).join(" ");this.element.innerHTML=t;var o=this.effects,n=o.YELLOW,r=o.BLUE,a=o.GREEN,i=o.RED,l=this.player.controls.windowPos,s=l.x,p=l.y,m=Math.floor(this.p.frameCount/2)%61;this.p.push(),this.p.imageMode(this.p.CENTER),n&&this.p.image(this.sprites.yellow[m],s+8+30*Math.cos(this.p.frameCount/16),p+0+30*Math.sin(this.p.frameCount/16),40,40),r&&this.p.image(this.sprites.blue[m],s+8+30*Math.cos(this.p.frameCount/16+Math.PI/2),p+0+30*Math.sin(this.p.frameCount/16+Math.PI/2),40,40),a&&this.p.image(this.sprites.green[m],s+8+30*Math.cos(this.p.frameCount/16+Math.PI),p+0+30*Math.sin(this.p.frameCount/16+Math.PI),40,40),i&&this.p.image(this.sprites.red[m],s+8+30*Math.cos(this.p.frameCount/16-Math.PI/2),p+0+30*Math.sin(this.p.frameCount/16-Math.PI/2),40,40),this.p.pop()};var Se=Ve,Ye=o(35),Ue=o.n(Ye),Qe=R.a.game.map.width,Ze=R.a.game.map.height,Fe=R.a.game.room.radius,He=R.a.game.room.gridVals.enemy,Le=R.a.game.room.gridVals.end,Je=R.a.game.room.gridVals.redPotion,Xe=R.a.game.room.gridVals.bluePotion,Ke=R.a.game.room.gridVals.yellowPotion,qe=R.a.game.room.gridVals.greenPotion,_e=R.a.game.enemy.speed,$e=R.a.game.enemy.levelUpFactor,et=R.a.game.powerups.red,tt=R.a.game.powerups.blue,ot=R.a.game.powerups.yellow,nt=R.a.game.powerups.green,rt=R.a.game.map.enemyIncrement,at=function e(t){var o=this;Object(w.a)(this,e),this.update=function(){o.map.update(),o.player.update(),o.spotlight.update(),o.effectIndicator.draw()},this.enemiesMove=function(){o.enemies.forEach(function(e){return e.move(o.player)}),o.checkPlayerPos()===He&&o.gameOver()},this.playerMove=function(){switch(o.checkPlayerPos()){case He:o.gameOver();break;case Le:o.levelUp();break;case Je:o.redPotionPowerup();break;case Xe:o.bluePotionPowerup();break;case Ke:o.yellowPotionPowerup();break;case qe:o.greenPotionPowerup()}},this.checkPlayerPos=function(){var e=o.player.getRoomNRoomCoords(),t=e[0],n=e[1],r=0;return Math.abs(n.x)<=Fe&&Math.abs(n.y)<=Fe?r=t.getVal(n.x,n.y):n.x<=-Fe-1&&Math.abs(n.y)<=1&&t.left?r=t.getValTunnels(2,n.y+1):n.x>=Fe+1&&Math.abs(n.y)<=1&&t.right?r=t.getValTunnels(3,n.y+1):n.y<=-Fe-1&&Math.abs(n.x)<=1&&t.top?r=t.getValTunnels(0,n.x+1):n.y>=Fe+1&&Math.abs(n.x)<=1&&t.bottom&&(r=t.getValTunnels(1,n.x+1)),r},this.levelUp=function(){o.map.level+=1,o.map.initiateRooms(),o.player.controls.globalPos={x:Qe/2,y:Ze/2},o.player.controls.windowPos={x:o.player.controls.p.width/2,y:o.player.controls.p.height/2};var e=Math.floor(o.map.level/rt)+1;o.enemies=[];for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:_e;clearInterval(o.monsterInterval),o.monsterInterval=setInterval(o.enemiesMove,e)},this.terminate=function(){o.p5instance.remove(),clearInterval(o.monsterInterval)},this.sketch=function(e){o.player=new H(e,o.playerMove),o.map=new ve(e,o.player),o.enemies=[new Ae(o.map.startingRoom)],o.player.registerMap(o.map),o.spotlight=new Be(o.player),o.effectIndicator=new Se(e,o.player),e.preload=function(){o.map.sprite.loadSprite(),o.player.sprite.loadSprite(),o.effectIndicator.loadSprites()},e.setup=function(){e.createCanvas(N.getElementWidth(t),N.getElementHeight(t)).parent(t),e.textFont("Helvetica"),e.textAlign(e.CENTER,e.CENTER),e.smooth(),o.initiateEnemyMovement()},e.draw=function(){e.background("#160f30"),o.update()},e.windowResized=function(){e.resizeCanvas(N.getElementWidth(t),N.getElementHeight(t))}},this.p5instance=new Ue.a(this.sketch)},it=o(36),lt=o.n(it);function st(){var e=Object(n.a)(["\n position: relative;\n width: 80%;\n height: 60%;\n border: 25px solid #b88846;\n border-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='75' height='75'%3E%3Cg fill='none' stroke='%23B88846' stroke-width='2'%3E%3Cpath d='M1 1h73v73H1z'/%3E%3Cpath d='M8 8h59v59H8z'/%3E%3Cpath d='M8 8h16v16H8zM51 8h16v16H51zM51 51h16v16H51zM8 51h16v16H8z'/%3E%3C/g%3E%3Cg fill='%23B88846'%3E%3Ccircle cx='16' cy='16' r='2'/%3E%3Ccircle cx='59' cy='16' r='2'/%3E%3Ccircle cx='59' cy='59' r='2'/%3E%3Ccircle cx='16' cy='59' r='2'/%3E%3C/g%3E%3C/svg%3E\")\n 25;\n"]);return st=function(){return e},e}function pt(){var e=Object(n.a)(["\n margin: 20px;\n border-bottom: 3px solid #eae7af;\n color: #eae7af;\n font-family: 'Lexend Zetta', sans-serif;\n font-size: 40px;\n"]);return pt=function(){return e},e}function mt(){var e=Object(n.a)(["\n width: 50px;\n height: 25px;\n margin: 5px;\n border: 1px solid #eae7af;\n border-radius: 5px;\n background: transparent;\n color: #eae7af;\n font-size: 16px;\n font-weight: 100;\n"]);return mt=function(){return e},e}function ct(){var e=Object(n.a)(["\n display: flex;\n position: absolute;\n z-index: 10;\n top: -20%;\n left: 50%;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n border: 10px solid #160f30;\n border-radius: 5px;\n background: #01024e;\n color: #eae7af;\n font-size: 50px;\n transform: translate(-50%, -50%);\n transition: 0.2s ease all;\n"]);return ct=function(){return e},e}function gt(){var e=Object(n.a)(["\n position: absolute;\n z-index: 20;\n bottom: 0;\n left: 0;\n margin: 15px;\n color: #eae7af;\n font-family: 'Gayathri', sans-serif;\n font-size: 24px;\n"]);return gt=function(){return e},e}function ut(){var e=Object(n.a)(["\n position: absolute;\n width: 100%;\n height: 100%;\n background-image: radial-gradient(\n circle,\n transparent 160px,\n rgba(0, 0, 0) 200px\n );\n transition: 0.5s ease-in all;\n"]);return ut=function(){return e},e}function dt(){var e=Object(n.a)(["\n position: fixed;\n top: 0;\n left: 0;\n"]);return dt=function(){return e},e}function ht(){var e=Object(n.a)(["\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: radial-gradient(#003, #000);\n"]);return ht=function(){return e},e}var ft=s.a.div(ht()),yt=s.a.div(dt()),vt=s.a.div(ut()),wt=s.a.div(gt()),bt=s.a.div(ct()),xt=s.a.button(mt()),Et=s.a.div(pt()),At=s.a.div(st()),Pt=function(){var e=Object(i.useRef)(null);return Object(i.useEffect)(function(){document.title="The Room";var t=new Audio(lt.a);t.play(),t.onended=function(){t.currentTime=0};var o=new at(e.current);return function(){t.pause(),t.currentTime=0,o.terminate()}},[e]),l.a.createElement(ft,null,l.a.createElement(bt,{id:"gameover"},"GAME OVER",l.a.createElement(p.b,{to:"/home"},l.a.createElement(xt,null,"Home"))),l.a.createElement(yt,{id:"debug"}),l.a.createElement(Et,{id:"score"},"Level 1"),l.a.createElement(At,{ref:e},l.a.createElement(wt,{id:"effect"}),l.a.createElement(vt,{id:"spotlight"})))},Mt=o(9),Rt=Object(Mt.g)(function(){return l.a.createElement(Mt.d,null,l.a.createElement(Mt.b,{path:"/home",component:v}),l.a.createElement(Mt.b,{path:"/game",component:Pt}),l.a.createElement(Mt.b,{path:"/",component:function(){return l.a.createElement(Mt.a,{to:"/home"})}}))});Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));var Tt=o(37),It=o.n(Tt),Ct=l.a.createElement(p.a,null,l.a.createElement(Rt,null));It.a.render(Ct,document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then(function(e){e.unregister()})}],[[41,1,2]]]); +//# sourceMappingURL=main.f3ac5b48.chunk.js.map \ No newline at end of file diff --git a/static/js/main.f3ac5b48.chunk.js.map b/static/js/main.f3ac5b48.chunk.js.map new file mode 100644 index 0000000..8fc18c8 --- /dev/null +++ b/static/js/main.f3ac5b48.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../config/index.js","../assets/gui/logo.png","../assets/music/Trouble-Is-Brewing.mp3","../assets/sprites/Owlet_Monster_Walk_6.png","../assets/sprites/Owlet_Monster_Idle_4.png","../assets/sprites/Dungeon_Tileset.png","../assets/sprites/7_firespin_spritesheet.png","../assets/sprites/8_protectioncircle_spritesheet.png","../assets/sprites/13_vortex_spritesheet.png","../assets/sprites/18_midnight_spritesheet.png","../assets/music/Dark-Fog.mp3","../config/config.js","containers/Home/Home.js","../core/modules/interfaces/playerSprite/playerSprite.js","../core/utils/helpers.js","../core/modules/app/player/controls.js","../core/modules/app/player/player.js","../core/modules/app/room/room.js","../core/modules/interfaces/mapSprite/mapSprite.js","../core/modules/app/map/map.js","../core/modules/app/enemy/enemy.js","../core/modules/interfaces/spotlight/spotlight.js","../core/modules/interfaces/effects/effects.js","../core/game.js","containers/Game/Game.js","containers/Main.js","serviceWorker.js","index.js"],"names":["module","exports","require","Config","window","width","height","game","render","viewportPadding","player","acc","vertical","horizontal","light","far","near","sprite","map","enemyIncrement","room","radius","gridVals","empty","enemy","end","redPotion","bluePotion","yellowPotion","greenPotion","padding","px","nx","py","ny","floorSize","vertWallSize","horzWallSize","monsterGridTimeoutConstant","levelEnemyInterval","powerups","red","duration","probability","gridVal","description","blue","playerSpeed","yellow","lightFar","lightNear","green","enemySpeed","speed","levelUpFactor","Wrapper","styled","div","AppLogo","img","StartButton","button","Home","useEffect","bgm","Audio","TroubleIsBrewing","play","onended","currentTime","pause","src","logo","alt","to","SPRITE_WIDTH","PlayerSprite","p","loadSprite","walkingImgs","idleImgs","loadImage","PlayerWalkImg","i","pos","get","push","PlayerIdleImg","draw","windowPos","wx","x","wy","y","rectMode","CENTER","fill","length","isFlipped","scale","frameCount","isIdle","Math","floor","imageMode","image","rect","pop","flipLeft","flipRight","this","isSetup","MAP_WIDTH","MAP_HEIGHT","Helpers","element","styles","getComputedStyle","clientWidth","parseFloat","paddingLeft","paddingRight","clientHeight","paddingTop","paddingBottom","random","getAscii","c","charCodeAt","getRoomRep","relativeToGlobal","globalToRelative","mapGlobalToPlayerViewport","roomGlobalPos","controls","globalPos","pGlobalX","pGlobalY","mapPlayerToRoomNumber","playerX","playerY","round","getRoomBoundaries","roomGlobal","minX","TOTAL_ROOM_DIMENSION","minY","maxX","maxY","getHallwayBoundaries","roomBoundaries","direction","Number","MAX_VALUE","MIN_VALUE","isBetween","min","val","max","epsilon","VERT_ACC","HORZ_ACC","ROOM_BORDER_PADDING_PX","ROOM_BORDER_PADDING_PY","ROOM_BORDER_PADDING_NX","ROOM_BORDER_PADDING_NY","VIEWPORT_PADDING","BLUE_POWERUP_SPEED","Controls","tick","handleInputAndCollision","deltaFactor","deltaTime","VERT_DELTA","HORZ_DELTA","UP_PRESSED","keyIsDown","UP_ARROW","DOWN_PRESSED","DOWN_ARROW","LEFT_PRESSED","LEFT_ARROW","RIGHT_PRESSED","RIGHT_ARROW","currRoom","getRoomByCoords","hMinY","hMaxY","hMinX","hMaxX","playerMoved","top","bottom","left","right","playerMove","registerMap","getPosData","ROOM_WIDTH","ROOM_HEIGHT","Player","update","getRoomNRoomCoords","relativeCoords","rooms","EMPTY_CELL_VAL","ENEMY_CELL_VAL","END_CELL_VAL","ROOM_RADIUS","MONSTER_GRID_TIMEOUT_CONSTANT","LEVEL_ENEMY_INTERVAL","Room","updateGrid","prevVal","grid","timeout","setTimeout","clearTimeout","level","updateTunnels","n","gridTunnels","getVal","getValTunnels","generatePowerup","potionGridVal","Array","floorGrid","r","floorGridTunnels","FLOOR_SIZE","VERT_WALL_SIZE","HORZ_WALL_SIZE","ENEMY_GRID_VAL","END_GRID_VAL","RED_POTION_GRID_VAL","BLUE_POTION_GRID_VAL","YELLOW_POTION_GRID_VAL","GREEN_POTION_GRID_VAL","MapSprite","WallTilesImg","vertWall","vertWallT","horzWall","horzWallB","corner","cornerB","floors","bones","Object","keys","forEach","roomCoords","drawRoom","GLOBAL_COORDS","WINDOW_COORDS","POWERUPS","Map","initiateRooms","startingRoom","paths","roomsStrings","temp","splice","newRoom","getOppositeDir","newPaths","getSurroundings","newPath","newRoomRep","powerupColor","powerup","endingRooms","trueEndingRoom","endingGlobalCoords","isRoomExists","dir","Enemy","move","surroundings","dist","getDist","newPosition","tempDist","coords","translations","translation","newCoords","abs","p1","p2","sqrt","generateRandomEnemyPos","LIGHT_FAR","LIGHT_NEAR","SPOTLIGHT_SIZE","YELLOW_POWERUP","SPOTLIGHT_SIZE_YELLOW_POWERUP","Spotlight","spotlight","document","getElementById","getSpotlight","getPlayer","prototype","playerRef","style","backgroundImage","Effects","effects","sprites","loadSprites","YellowEffectImg","posR","posC","BlueEffectImg","GreenEffectImg","RedEffectImg","addEffect","name","removeEffect","totalString","key","join","innerHTML","YELLOW","BLUE","GREEN","RED","spriteIndex","cos","sin","PI","ENEMY_SPEED","ENEMY_LEVEL_UP","RED_POWERUP","BLUE_POWERUP","GREEN_POWERUP","ENEMY_INC","Game","container","effectIndicator","enemiesMove","enemies","e","checkPlayerPos","gameOver","levelUp","redPotionPowerup","bluePotionPowerup","yellowPotionPowerup","greenPotionPowerup","roomNRoomCoords","enemyCount","initiateEnemyMovement","gameover","p5instance","noLoop","powerupConsumed","redPotionTimeout","undefined","console","log","bluePotionTimeout","yellowPotionTimeout","clearInterval","monsterInterval","setInterval","greenPotionTimeout","interval","terminate","remove","sketch","preload","setup","createCanvas","getElementWidth","getElementHeight","parent","textFont","textAlign","smooth","background","windowResized","resizeCanvas","p5","DebugWrapper","SpotlightWrapper","EffectWrapper","GameOverWrapper","HomeButton","LevelWrapper","GameWrapper","mount","useRef","title","DarkFog","TheRoom","current","id","ref","withRouter","path","component","Boolean","location","hostname","match","main","ReactDOM","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.f3ac5b48.chunk.js","sourcesContent":["module.exports = require('./config')\n","module.exports = __webpack_public_path__ + \"static/media/logo.dc65f600.png\";","module.exports = __webpack_public_path__ + \"static/media/Trouble-Is-Brewing.671462cd.mp3\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAAAgCAMAAABzRoe3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRDQjRBRTVCQjA0QjExRTlBNDkxRjY5NDU3QTBCQ0M4IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjRDQjRBRTVDQjA0QjExRTlBNDkxRjY5NDU3QTBCQ0M4Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NENCNEFFNTlCMDRCMTFFOUE0OTFGNjk0NTdBMEJDQzgiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NENCNEFFNUFCMDRCMTFFOUE0OTFGNjk0NTdBMEJDQzgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4x6wuAAAAAHlBMVEVeLCkcEhscGjD9ohb8UAOUoLoqME5mcpH8/v4AAACcma48AAAACnRSTlP///////////8AsswszwAAAd9JREFUeNrsmNGOhCAMRauztPj/P7wwoCC2xWB5mESSzT7ceri3IozC9uMD3gBvgDeA3cDvmGeW44OdQUQfhxuPMMIHK4NZjQUOJzRA4oORwaRSGg7NGyDywcbgSSZC6wbIfDjhRw1mc1HBr468/Ql8aArGDB7zY4J4lK4350N1vQio+KzBoq+aPoUPDZ8DVPram2BdaVloPfV4Kn8PQKUg/rtMQIrBWEBlhSyh4BJgGh/y/qwBsOiswVih6h3+9oS/70JOBdzTcwHi4PVDfKhWmQbwusETgHTZlg82BitAOKikfXIGH2wMlq0knrROkGfwwcjghgCqbMAHTgYjg+F6F6aAoDrg9Wf8PMGFD72E1UbQNUgpBP9j7mED0gSJz/+cFhL2AKc1Hv7+Ph/HFxSDEkBtQJ6g5cNNgyKgOU2TLj2ku0FB1xvA69AiQgHJS2Q0QH6GD50t0BpwJwA9CZBP+3APnRMPMm8QIPKFZ0APEHTaDfKvtZgDEPPeG7V0F4QAnQYc87t2E66XUNyk/Q2Dmu6Rl2MoLeGZL+/D+X1CfAa82IBcgCTJpUD8KJEdqjqq0ysBdh1JtPj9KNIPIH8WSgXYkVG5wbjpATCtNdJMKGoK2AswKO9q823pX4ABAOiAwdSdaMECAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAgCAMAAADt/IAXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYxMkYwQTE5QjA0QjExRTk4MTNCQjE0Q0UxMEM4NkYyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYxMkYwQTFBQjA0QjExRTk4MTNCQjE0Q0UxMEM4NkYyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjEyRjBBMTdCMDRCMTFFOTgxM0JCMTRDRTEwQzg2RjIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjEyRjBBMThCMDRCMTFFOTgxM0JCMTRDRTEwQzg2RjIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7gOi3WAAAAHlBMVEVeLCkcEhv9ohYcGjD8UAOUoLoqME5mcpH8/v4AAAAD02/MAAAACnRSTlP///////////8AsswszwAAAWdJREFUeNrsltFuwyAMRW+aYZP//+FBQgkZNjZs0l7ql0o9zvEVARQc/1z4BPgEmGmms9a5GWAsIIq5gtZhcdkPr6DQ3BBogWt+OAUX5auEBourfvgED8w8z1U/XIKSPhM6Oa3yzo8JQQaXJZI2f8RFPyYECewSb/wW7/1wCHIDF77vvG28P15Sfn6C558+wEjQBMi1pYbngFRO3vvhEBwWTx1hlWNCUBqIBB4dfBjAEDwM6kXAxjmW/JgZcG3QEFa55IdTUI9Kvkr1u1rlqh/eAQdhiC2u+eEfEJAq0QB5wM1ZWiHIfrgF5xKePeob4lh4vwkTl/1wDqi31dfrFbQ9Ft/8p+F9l98BlVNQBfoEmbsCtLw2zARoBKThk5MY4OZagMGAZkKQzzlx3WPcf1hS5SVgF+BIfzYCYQ8YvCyzHK/ZByUgCcfQJTB4+d6YeB5zAiINT3AzgC6g43dc8ONPByzwbwEGAG2MgKLG/4p7AAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/Dungeon_Tileset.d30c4780.png\";","module.exports = __webpack_public_path__ + \"static/media/7_firespin_spritesheet.c9ef197f.png\";","module.exports = __webpack_public_path__ + \"static/media/8_protectioncircle_spritesheet.c304a897.png\";","module.exports = __webpack_public_path__ + \"static/media/13_vortex_spritesheet.a8c4d5d4.png\";","module.exports = __webpack_public_path__ + \"static/media/18_midnight_spritesheet.f7d9be13.png\";","module.exports = __webpack_public_path__ + \"static/media/Dark-Fog.e45428b9.mp3\";","const Config = {\n window: {\n width: 1000,\n height: 800\n },\n game: {\n render: {\n viewportPadding: 100\n },\n player: {\n acc: {\n vertical: 5,\n horizontal: 5\n },\n light: {\n far: 100, // px\n near: 40\n },\n sprite: {\n width: 32,\n height: 32\n }\n },\n map: {\n width: 5000,\n height: 3000,\n enemyIncrement: 5 // every 4 levels\n },\n room: {\n width: 9,\n height: 9,\n radius: 4,\n gridVals: {\n empty: 0,\n enemy: 1,\n end: 2,\n redPotion: 3,\n bluePotion: 4,\n yellowPotion: 5,\n greenPotion: 6\n },\n padding: {\n px: 20,\n nx: 24,\n py: 28,\n ny: 20\n },\n floorSize: 16,\n vertWallSize: 7,\n horzWallSize: 16,\n monsterGridTimeoutConstant: 3000, // 1s\n levelEnemyInterval: 200\n },\n powerups: {\n red: {\n duration: 5000,\n probability: 0.05,\n // probability: 1,\n gridVal: 3,\n description: 'Invincibility'\n },\n blue: {\n playerSpeed: 7,\n duration: 5000,\n probability: 0.1,\n // probability: 1,\n gridVal: 4,\n description: 'Speed'\n },\n yellow: {\n duration: 5000,\n probability: 0.1,\n // probability: 1,\n gridVal: 5,\n lightFar: 200,\n lightNear: 80,\n description: 'Night Vision'\n },\n green: {\n enemySpeed: 1000,\n duration: 5000,\n probability: 0.5,\n // probability: 1,\n gridVal: 6,\n description: 'Necromancer'\n }\n },\n enemy: {\n speed: 500,\n levelUpFactor: 0.95\n }\n }\n}\n\nexport default Config\n","import logo from 'assets/gui/logo.png'\nimport React, { useEffect } from 'react'\nimport styled from 'styled-components'\nimport { Link } from 'react-router-dom'\nimport TroubleIsBrewing from 'assets/music/Trouble-Is-Brewing.mp3'\n\nconst color = '#1D1F27'\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: ${color};\n`\n\nconst AppLogo = styled.img`\n width: 60%;\n`\n\nconst StartButton = styled.button`\n margin: 1em 1em;\n padding: 0.25em 1em;\n border: 2px solid white;\n border-radius: 10px;\n background: transparent;\n color: white;\n font-size: 200%;\n\n &:active {\n outline: none;\n }\n`\n\nfunction Home() {\n useEffect(() => {\n const bgm = new Audio(TroubleIsBrewing)\n bgm.play()\n\n bgm.onended = () => {\n bgm.currentTime = 0\n }\n\n return () => {\n bgm.pause()\n bgm.currentTime = 0\n }\n })\n\n return (\n \n \n \n START\n \n \n )\n}\n\nexport default Home\n","import PlayerWalkImg from 'assets/sprites/Owlet_Monster_Walk_6.png'\nimport PlayerIdleImg from 'assets/sprites/Owlet_Monster_Idle_4.png'\nimport Config from 'config'\n\n// change every 5 frames\nconst SPRITE_CHANGE_IDLE_FRAME = 5\nconst SPRITE_CHANGE_WALK_FRAME = 2\nconst SPRITE_WIDTH = Config.game.player.sprite.width\n\nclass PlayerSprite {\n constructor(p, player) {\n this.p = p\n this.player = player\n\n this.isFlipped = false\n this.isSetup = false\n }\n\n loadSprite = () => {\n this.walkingImgs = []\n this.idleImgs = []\n\n this.p.loadImage(PlayerWalkImg, img => {\n for (let i = 0; i < 6; i++) {\n const pos = i * 32\n const sprite = img.get(pos, 0, 32, 32)\n this.walkingImgs.push(sprite)\n }\n })\n\n this.p.loadImage(PlayerIdleImg, img => {\n for (let i = 0; i < 4; i++) {\n const pos = i * 32\n const sprite = img.get(pos, 0, 32, 32)\n this.idleImgs.push(sprite)\n }\n })\n }\n\n draw = windowPos => {\n const { x: wx, y: wy } = windowPos\n\n /* -------------------------------------------------------------------------- */\n /* DRAW PLAYER HERE */\n /* -------------------------------------------------------------------------- */\n\n this.p.push()\n this.p.rectMode(this.p.CENTER)\n this.p.fill('#eae7af')\n if (this.walkingImgs.length) {\n if (this.isFlipped) this.p.scale(-1, 1)\n\n const { frameCount } = this.p\n const sprite = this.player.isIdle\n ? this.idleImgs[Math.floor(frameCount / SPRITE_CHANGE_IDLE_FRAME) % 3]\n : this.walkingImgs[\n Math.floor(frameCount / SPRITE_CHANGE_WALK_FRAME) % 5\n ]\n\n this.p.imageMode(this.p.CENTER)\n this.p.image(\n sprite,\n (wx + SPRITE_WIDTH / 4) * (this.isFlipped ? -1 : 1),\n wy\n )\n } else this.p.rect(wx, wy, 20, 20)\n this.p.pop()\n }\n\n flipLeft = () => (this.isFlipped = true)\n\n flipRight = () => (this.isFlipped = false)\n}\n\nexport default PlayerSprite\n","import Config from 'config'\n\nconst MAP_WIDTH = Config.game.map.width\nconst MAP_HEIGHT = Config.game.map.height\nconst TOTAL_ROOM_DIMENSION = 176\nconst SIDE_WALL_DIMENSION = 66\n\nexport default class Helpers {\n static getAscii = c => c.charCodeAt(0)\n\n static getRoomRep = (x, y) => `${x},${y}`\n\n // GET GLOBAL POSITION FOR A ROOM\n static relativeToGlobal = (x, y) => {\n // 0 should be MAP WIDTH/HEIGHT / 2\n const CENTER_X = MAP_WIDTH / 2\n const CENTER_Y = MAP_HEIGHT / 2\n\n const deltaX = x * TOTAL_ROOM_DIMENSION\n const deltaY = y * TOTAL_ROOM_DIMENSION\n\n return { x: CENTER_X + deltaX, y: CENTER_Y + deltaY }\n }\n\n static globalToRelative = (x, y) => {\n // 0 should be MAP WIDTH/HEIGHT / 2\n const CENTER_X = MAP_WIDTH / 2\n const CENTER_Y = MAP_HEIGHT / 2\n\n return {\n x: (x - CENTER_X) / TOTAL_ROOM_DIMENSION,\n y: (y - CENTER_Y) / TOTAL_ROOM_DIMENSION\n }\n }\n\n static mapGlobalToPlayerViewport = (roomGlobalPos, player) => {\n const { x, y } = roomGlobalPos\n\n const { x: pGlobalX, y: pGlobalY } = player.controls.globalPos\n const { x: pWindowX, y: pWindowY } = player.controls.windowPos\n\n const roomGDeltaXToPlayer = x - pGlobalX\n const roomGDeltaYToPlayer = y - pGlobalY\n\n return {\n x: pWindowX + roomGDeltaXToPlayer,\n y: pWindowY + roomGDeltaYToPlayer\n }\n }\n\n static mapPlayerToRoomNumber = ({ x, y }) => {\n const playerX = x - MAP_WIDTH / 2\n const playerY = y - MAP_HEIGHT / 2\n\n const roomX = Math.round(playerX / TOTAL_ROOM_DIMENSION)\n const roomY = Math.round(playerY / TOTAL_ROOM_DIMENSION)\n\n return { x: roomX, y: roomY }\n }\n\n // ROOM X and Y\n static getRoomBoundaries = (x, y) => {\n const roomGlobal = Helpers.relativeToGlobal(x, y)\n return {\n minX: roomGlobal.x - TOTAL_ROOM_DIMENSION / 2,\n minY: roomGlobal.y - TOTAL_ROOM_DIMENSION / 2,\n maxX: roomGlobal.x + TOTAL_ROOM_DIMENSION / 2,\n maxY: roomGlobal.y + TOTAL_ROOM_DIMENSION / 2\n }\n }\n\n static getHallwayBoundaries = (roomBoundaries, direction) => {\n switch (direction) {\n case 'horizontal':\n return {\n minX: roomBoundaries.minX + SIDE_WALL_DIMENSION,\n maxX: roomBoundaries.maxX - SIDE_WALL_DIMENSION\n }\n\n case 'vertical':\n return {\n minY: roomBoundaries.minY + SIDE_WALL_DIMENSION,\n maxY: roomBoundaries.maxY - SIDE_WALL_DIMENSION\n }\n default:\n return {\n minY: Number.MAX_VALUE,\n maxY: Number.MIN_VALUE\n }\n }\n }\n\n static isBetween = (min, val, max, epsilon = 0.1) =>\n min + epsilon <= val && val <= max - epsilon\n\n static getElementWidth(element) {\n const styles = getComputedStyle(element)\n\n return (\n element.clientWidth -\n parseFloat(styles.paddingLeft) -\n parseFloat(styles.paddingRight)\n )\n }\n\n static getElementHeight(element) {\n const styles = getComputedStyle(element)\n\n return (\n element.clientHeight -\n parseFloat(styles.paddingTop) -\n parseFloat(styles.paddingBottom)\n )\n }\n\n static generateRandomEnemyPos() {\n return {\n x: (Math.random() > 0.5 ? 1 : -1) * (Math.floor(2 * Math.random()) + 3),\n y: (Math.random() > 0.5 ? 1 : -1) * (Math.floor(2 * Math.random()) + 3)\n }\n }\n}\n","import Helpers from '../../../utils/helpers'\n\nimport Config from 'config'\n\nconst MAP_WIDTH = Config.game.map.width\nconst MAP_HEIGHT = Config.game.map.height\nconst VERT_ACC = Config.game.player.acc.vertical\nconst HORZ_ACC = Config.game.player.acc.horizontal\nconst ROOM_BORDER_PADDING_PX = Config.game.room.padding.px\nconst ROOM_BORDER_PADDING_PY = Config.game.room.padding.py\nconst ROOM_BORDER_PADDING_NX = Config.game.room.padding.nx\nconst ROOM_BORDER_PADDING_NY = Config.game.room.padding.ny\nconst VIEWPORT_PADDING = Config.game.render.viewportPadding\nconst BLUE_POWERUP_SPEED = Config.game.powerups.blue.playerSpeed\n\nexport default class Controls {\n constructor(p, player) {\n this.p = p\n this.player = player\n\n this.globalPos = null\n this.windowPos = null\n }\n\n tick = () => {\n /* -------------------------------------------------------------------------- */\n /* SETUP ONCE CANVAS READY */\n /* -------------------------------------------------------------------------- */\n if (!this.player.isSetup) {\n this.globalPos = { x: MAP_WIDTH / 2, y: MAP_HEIGHT / 2 }\n this.windowPos = { x: this.p.width / 2, y: this.p.height / 2 }\n this.player.isSetup = true\n }\n\n this.handleInputAndCollision()\n }\n\n handleInputAndCollision = () => {\n const deltaFactor = this.p.deltaTime / 50\n\n const VERT_DELTA =\n (this.player.powerups.blue ? BLUE_POWERUP_SPEED : VERT_ACC) * deltaFactor\n const HORZ_DELTA =\n (this.player.powerups.blue ? BLUE_POWERUP_SPEED : HORZ_ACC) * deltaFactor\n\n const UP_PRESSED =\n this.p.keyIsDown(Helpers.getAscii('W')) ||\n this.p.keyIsDown(this.p.UP_ARROW)\n const DOWN_PRESSED =\n this.p.keyIsDown(Helpers.getAscii('S')) ||\n this.p.keyIsDown(this.p.DOWN_ARROW)\n const LEFT_PRESSED =\n this.p.keyIsDown(Helpers.getAscii('A')) ||\n this.p.keyIsDown(this.p.LEFT_ARROW)\n const RIGHT_PRESSED =\n this.p.keyIsDown(Helpers.getAscii('D')) ||\n this.p.keyIsDown(this.p.RIGHT_ARROW)\n\n const { x, y } = Helpers.mapPlayerToRoomNumber(this.globalPos)\n const currRoom = this.map.getRoomByCoords(x, y)\n\n if (!currRoom) return\n\n const roomBoundaries = Helpers.getRoomBoundaries(x, y)\n\n const { minY: hMinY, maxY: hMaxY } = Helpers.getHallwayBoundaries(\n roomBoundaries,\n 'vertical'\n )\n const { minX: hMinX, maxX: hMaxX } = Helpers.getHallwayBoundaries(\n roomBoundaries,\n 'horizontal'\n )\n\n if (UP_PRESSED) {\n let playerMoved = false\n if (\n this.globalPos.y - VERT_DELTA <\n roomBoundaries.minY + ROOM_BORDER_PADDING_NY\n ) {\n if (currRoom.top) {\n if (Helpers.isBetween(hMinX, this.globalPos.x, hMaxX)) {\n this.globalPos.y -= VERT_DELTA\n playerMoved = true\n }\n }\n } else {\n this.globalPos.y -= VERT_DELTA\n playerMoved = true\n }\n\n if (playerMoved && this.windowPos.y - VERT_DELTA >= VIEWPORT_PADDING) {\n this.windowPos.y -= VERT_DELTA\n }\n }\n\n if (DOWN_PRESSED) {\n let playerMoved = false\n if (\n this.globalPos.y - VERT_DELTA >\n roomBoundaries.maxY - ROOM_BORDER_PADDING_PY\n ) {\n if (currRoom.bottom) {\n if (Helpers.isBetween(hMinX, this.globalPos.x, hMaxX)) {\n this.globalPos.y += VERT_DELTA\n playerMoved = true\n }\n }\n } else {\n this.globalPos.y += VERT_DELTA\n playerMoved = true\n }\n\n if (\n playerMoved &&\n this.windowPos.y + VERT_DELTA <= this.p.height - VIEWPORT_PADDING\n ) {\n this.windowPos.y += VERT_DELTA\n }\n }\n\n if (LEFT_PRESSED) {\n let playerMoved = false\n if (\n this.globalPos.x - HORZ_DELTA <\n roomBoundaries.minX + ROOM_BORDER_PADDING_NX\n ) {\n if (currRoom.left) {\n if (Helpers.isBetween(hMinY, this.globalPos.y, hMaxY)) {\n this.globalPos.x -= HORZ_DELTA\n playerMoved = true\n }\n }\n } else {\n this.globalPos.x -= HORZ_DELTA\n playerMoved = true\n }\n\n if (playerMoved && this.windowPos.x - HORZ_DELTA >= VIEWPORT_PADDING) {\n this.windowPos.x -= HORZ_DELTA\n }\n\n this.player.sprite.flipLeft()\n }\n\n if (RIGHT_PRESSED) {\n let playerMoved = false\n if (\n this.globalPos.x + HORZ_DELTA >\n roomBoundaries.maxX - ROOM_BORDER_PADDING_PX\n ) {\n if (currRoom.right) {\n if (Helpers.isBetween(hMinY, this.globalPos.y, hMaxY)) {\n this.globalPos.x += HORZ_DELTA\n playerMoved = true\n }\n }\n } else {\n this.globalPos.x += HORZ_DELTA\n playerMoved = true\n }\n\n if (\n playerMoved &&\n this.windowPos.x + HORZ_DELTA <= this.p.width - VIEWPORT_PADDING\n ) {\n this.windowPos.x += HORZ_DELTA\n }\n\n this.player.sprite.flipRight()\n }\n\n if (!UP_PRESSED && !DOWN_PRESSED && !LEFT_PRESSED && !RIGHT_PRESSED)\n this.player.isIdle = true\n else this.player.isIdle = false\n this.player.playerMove()\n }\n\n registerMap = map => (this.map = map)\n\n /* -------------------------------------------------------------------------- */\n /* GETTERS */\n /* -------------------------------------------------------------------------- */\n getPosData = () => {\n return [this.windowPos, this.globalPos]\n }\n}\n","import PlayerSprite from '../../interfaces/playerSprite/playerSprite'\nimport Helpers from '../../../utils/helpers'\n\nimport Controls from './controls'\n\nimport Config from 'config'\n\nconst ROOM_WIDTH = Config.game.room.width\nconst ROOM_HEIGHT = Config.game.room.height\n\nexport default class Player {\n constructor(p, playerMove) {\n this.playerMove = playerMove\n this.controls = new Controls(p, this)\n\n this.sprite = new PlayerSprite(p, this)\n\n this.powerups = { red: false, blue: false, yellow: false, green: false }\n }\n\n registerMap = map => {\n this.map = map\n\n this.controls.registerMap(map)\n }\n\n update = () => {\n this.controls.tick()\n this.sprite.draw(...this.controls.getPosData())\n }\n\n getRoomNRoomCoords = () => {\n const relativeCoords = Helpers.globalToRelative(\n this.controls.globalPos.x,\n this.controls.globalPos.y\n )\n const room = this.map.rooms[\n Helpers.getRoomRep(\n Math.round(relativeCoords.x),\n Math.round(relativeCoords.y)\n )\n ]\n const roomCoords = {\n x: Math.round((relativeCoords.x - room.x) * (ROOM_WIDTH + 2)),\n y: Math.round((relativeCoords.y - room.y) * (ROOM_HEIGHT + 2))\n }\n return [room, roomCoords]\n }\n}\n","import Config from 'config'\n\nconst EMPTY_CELL_VAL = Config.game.room.gridVals.empty\nconst ENEMY_CELL_VAL = Config.game.room.gridVals.enemy\nconst END_CELL_VAL = Config.game.room.gridVals.end\nconst ROOM_WIDTH = Config.game.room.width\nconst ROOM_HEIGHT = Config.game.room.height\nconst ROOM_RADIUS = Config.game.room.radius\nconst MONSTER_GRID_TIMEOUT_CONSTANT =\n Config.game.room.monsterGridTimeoutConstant\nconst LEVEL_ENEMY_INTERVAL = Config.game.room.levelEnemyInterval\n\nclass Room {\n constructor(x, y, map) {\n this.x = x\n this.y = y\n\n this.map = map\n\n this.grid = new Array(ROOM_WIDTH)\n for (let i = 0; i < ROOM_WIDTH; i++) {\n this.grid[i] = new Array(ROOM_HEIGHT)\n }\n // [TOP,BOTTOM,LEFT,RIGHT] NEGATIVE -> POSITIVE\n this.gridTunnels = new Array(4)\n for (let i = 0; i < 4; i++) {\n this.gridTunnels[i] = new Array(3)\n }\n\n this.floorGrid = new Array(ROOM_WIDTH)\n for (let r = 0; r < ROOM_WIDTH; r++) {\n this.floorGrid[r] = new Array(ROOM_HEIGHT)\n for (let c = 0; c < ROOM_HEIGHT; c++) {\n this.floorGrid[r][c] = Math.floor(Math.random() * 12)\n }\n }\n // [TOP,BOTTOM,LEFT,RIGHT] NEGATIVE -> POSITIVE\n this.floorGridTunnels = new Array(4)\n for (let i = 0; i < 4; i++) {\n this.floorGridTunnels[i] = new Array(3)\n for (let n = 0; n < 3; n++) {\n this.floorGridTunnels[i][n] = Math.floor(Math.random() * 12)\n }\n }\n this.end = true\n }\n\n updateGrid = (x, y, val) => {\n const prevVal = this.grid[y + ROOM_RADIUS][x + ROOM_RADIUS]\n this.grid[y + ROOM_RADIUS][x + ROOM_RADIUS] = val\n\n if (val === ENEMY_CELL_VAL) {\n const timeout = setTimeout(() => {\n this.grid[y + ROOM_RADIUS][x + ROOM_RADIUS] =\n prevVal === END_CELL_VAL ? END_CELL_VAL : EMPTY_CELL_VAL\n clearTimeout(timeout)\n }, MONSTER_GRID_TIMEOUT_CONSTANT + this.map.level * LEVEL_ENEMY_INTERVAL)\n }\n }\n\n updateTunnels = (n, i, val) => {\n this.gridTunnels[n][i] = val\n\n if (val === ENEMY_CELL_VAL) {\n const timeout = setTimeout(() => {\n this.gridTunnels[n][i] = EMPTY_CELL_VAL\n clearTimeout(timeout)\n }, MONSTER_GRID_TIMEOUT_CONSTANT + this.map.level * LEVEL_ENEMY_INTERVAL)\n }\n }\n\n getVal = (x, y) => this.grid[y + ROOM_RADIUS][x + ROOM_RADIUS]\n\n getValTunnels = (n, i) => this.gridTunnels[n][i]\n\n generatePowerup = potionGridVal => {\n this.updateGrid(\n Math.floor(Math.random() * (ROOM_WIDTH - 2)) - ROOM_RADIUS + 1,\n Math.floor(Math.random() * (ROOM_HEIGHT - 2)) - ROOM_RADIUS + 1,\n potionGridVal\n )\n }\n}\n\nexport default Room\n","import Helpers from '../../../utils/helpers'\n\nimport WallTilesImg from 'assets/sprites/Dungeon_Tileset.png'\nimport Config from 'config'\n\nconst FLOOR_SIZE = Config.game.room.floorSize\nconst VERT_WALL_SIZE = Config.game.room.vertWallSize\nconst HORZ_WALL_SIZE = Config.game.room.horzWallSize\nconst ROOM_WIDTH = Config.game.room.width\nconst ROOM_HEIGHT = Config.game.room.height\nconst ROOM_RADIUS = Config.game.room.radius\nconst ENEMY_GRID_VAL = Config.game.room.gridVals.enemy\nconst END_GRID_VAL = Config.game.room.gridVals.end\nconst RED_POTION_GRID_VAL = Config.game.room.gridVals.redPotion\nconst BLUE_POTION_GRID_VAL = Config.game.room.gridVals.bluePotion\nconst YELLOW_POTION_GRID_VAL = Config.game.room.gridVals.yellowPotion\nconst GREEN_POTION_GRID_VAL = Config.game.room.gridVals.greenPotion\n\nclass MapSprite {\n constructor(p, player) {\n this.p = p\n this.player = player\n }\n\n loadSprite = () => {\n this.p.loadImage(WallTilesImg, img => {\n this.vertWall = img.get(9, 16, 7, 16)\n this.vertWallT = img.get(9, 32, 7, 16)\n this.horzWall = img.get(16, 0, 16, 16)\n this.horzWallB = img.get(16, 64, 16, 16)\n this.corner = img.get(9, 0, 7, 16)\n this.cornerB = img.get(9, 64, 7, 16)\n this.floors = [\n img.get(96, 0, 16, 16),\n img.get(112, 0, 16, 16),\n img.get(128, 0, 16, 16),\n img.get(144, 0, 16, 16),\n img.get(96, 16, 16, 16),\n img.get(112, 16, 16, 16),\n img.get(128, 16, 16, 16),\n img.get(144, 16, 16, 16),\n img.get(96, 32, 16, 16),\n img.get(112, 32, 16, 16),\n img.get(128, 32, 16, 16),\n img.get(144, 32, 16, 16)\n ]\n this.end = img.get(64, 128, 16, 16)\n this.bones = img.get(112, 112, 16, 16)\n this.redPotion = img.get(144, 128, 16, 16)\n this.bluePotion = img.get(112, 144, 16, 16)\n this.yellowPotion = img.get(96, 144, 16, 16)\n this.greenPotion = img.get(96, 128, 16, 16)\n })\n }\n\n draw = map => {\n this.p.push()\n this.p.rectMode(this.p.CENTER)\n\n this.p.fill('#eae7af')\n Object.keys(map).forEach(roomCoords => {\n const room = map[roomCoords]\n\n // NO NEED TO EXTRACT. IT'S PASS BY REFERENCE\n this.drawRoom(room, room.x, room.y)\n })\n\n this.p.pop()\n }\n\n drawRoom = (room, x, y) => {\n if (!this.player.isSetup) return\n\n const GLOBAL_COORDS = Helpers.relativeToGlobal(x, y)\n const WINDOW_COORDS = Helpers.mapGlobalToPlayerViewport(\n GLOBAL_COORDS,\n this.player\n )\n\n // DRAW CORNERS\n this.p.image(\n this.corner,\n WINDOW_COORDS.x -\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE -\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n WINDOW_COORDS.y - (ROOM_RADIUS + 0.5) * FLOOR_SIZE - HORZ_WALL_SIZE / 2\n )\n this.p.image(\n this.corner,\n WINDOW_COORDS.x +\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE +\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n WINDOW_COORDS.y - (ROOM_RADIUS + 0.5) * FLOOR_SIZE - HORZ_WALL_SIZE / 2\n )\n this.p.image(\n this.cornerB,\n WINDOW_COORDS.x -\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE -\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n WINDOW_COORDS.y + (ROOM_RADIUS + 0.5) * FLOOR_SIZE + HORZ_WALL_SIZE / 2\n )\n this.p.image(\n this.cornerB,\n WINDOW_COORDS.x +\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE +\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n WINDOW_COORDS.y + (ROOM_RADIUS + 0.5) * FLOOR_SIZE + HORZ_WALL_SIZE / 2\n )\n // WALLS AND FLOOR\n for (let c = 0; c < ROOM_WIDTH; c++) {\n this.p.image(\n this.vertWall,\n WINDOW_COORDS.x -\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE -\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n (c - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n this.p.image(\n this.vertWall,\n WINDOW_COORDS.x +\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE +\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n (c - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n\n for (let r = 0; r < ROOM_HEIGHT; r++) {\n if (c === 0) {\n this.p.image(\n this.horzWall,\n (r - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y -\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE -\n HORZ_WALL_SIZE / 2\n )\n this.p.image(\n this.horzWallB,\n (r - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y +\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE +\n HORZ_WALL_SIZE / 2\n )\n }\n this.p.image(\n this.floors[room.floorGrid[r][c]],\n (r - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.x,\n (c - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n let img = null\n switch (room.getVal(r - ROOM_RADIUS, c - ROOM_RADIUS)) {\n case ENEMY_GRID_VAL:\n img = this.bones\n break\n case END_GRID_VAL:\n img = this.end\n break\n case RED_POTION_GRID_VAL:\n img = this.redPotion\n break\n case BLUE_POTION_GRID_VAL:\n img = this.bluePotion\n break\n case YELLOW_POTION_GRID_VAL:\n img = this.yellowPotion\n break\n case GREEN_POTION_GRID_VAL:\n img = this.greenPotion\n break\n default:\n break\n }\n if (img) {\n this.p.image(\n img,\n (r - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.x,\n (c - ROOM_RADIUS) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n }\n }\n }\n // TUNNELS\n if (room.top) {\n for (let n = 0; n < 3; n++) {\n this.p.image(\n this.floors[room.floorGridTunnels[0][n]],\n WINDOW_COORDS.x + FLOOR_SIZE * (n - 1),\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n }\n for (let i = -1; i < 2; i++) {\n if (room.getValTunnels(0, i + 1) === ENEMY_GRID_VAL) {\n this.p.push()\n this.p.imageMode(this.p.CENTER)\n this.p.image(\n this.bones,\n WINDOW_COORDS.x + FLOOR_SIZE * i + FLOOR_SIZE / 2,\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y + FLOOR_SIZE / 2\n )\n this.p.pop()\n }\n }\n }\n if (room.bottom) {\n for (let n = 0; n < 3; n++) {\n this.p.image(\n this.floors[room.floorGridTunnels[1][n]],\n WINDOW_COORDS.x + FLOOR_SIZE * (n - 1),\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n }\n this.p.image(\n this.vertWallT,\n -FLOOR_SIZE * 2 +\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2 +\n 1 +\n WINDOW_COORDS.x,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n this.p.image(\n this.vertWallT,\n FLOOR_SIZE * 2 -\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2 -\n 1 +\n WINDOW_COORDS.x,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y\n )\n for (let i = -1; i < 2; i++) {\n if (room.getValTunnels(1, i + 1) === ENEMY_GRID_VAL) {\n this.p.push()\n this.p.imageMode(this.p.CENTER)\n this.p.image(\n this.bones,\n WINDOW_COORDS.x + FLOOR_SIZE * i + FLOOR_SIZE / 2,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.y + FLOOR_SIZE / 2\n )\n this.p.pop()\n }\n }\n }\n\n if (room.left) {\n for (let n = 0; n < 3; n++) {\n this.p.image(\n this.floors[room.floorGridTunnels[2][n]],\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y + FLOOR_SIZE * (n - 1)\n )\n }\n this.p.image(\n this.horzWall,\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y - HORZ_WALL_SIZE - FLOOR_SIZE\n )\n this.p.image(\n this.horzWallB,\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y + HORZ_WALL_SIZE + FLOOR_SIZE\n )\n this.p.image(\n this.vertWall,\n WINDOW_COORDS.x -\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE -\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n FLOOR_SIZE + WINDOW_COORDS.y + FLOOR_SIZE\n )\n for (let i = -1; i < 2; i++) {\n if (room.getValTunnels(2, i + 1) === ENEMY_GRID_VAL) {\n this.p.push()\n this.p.imageMode(this.p.CENTER)\n this.p.image(\n this.bones,\n -(ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x + FLOOR_SIZE / 2,\n WINDOW_COORDS.y + FLOOR_SIZE * i + FLOOR_SIZE / 2\n )\n this.p.pop()\n }\n }\n }\n if (room.right) {\n for (let n = 0; n < 3; n++) {\n this.p.image(\n this.floors[room.floorGridTunnels[3][n]],\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y + FLOOR_SIZE * (n - 1)\n )\n }\n this.p.image(\n this.horzWall,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y - HORZ_WALL_SIZE - FLOOR_SIZE\n )\n this.p.image(\n this.horzWallB,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x,\n WINDOW_COORDS.y + HORZ_WALL_SIZE + FLOOR_SIZE\n )\n this.p.image(\n this.vertWall,\n WINDOW_COORDS.x +\n (ROOM_RADIUS + 0.5) * FLOOR_SIZE +\n VERT_WALL_SIZE / 2 +\n (HORZ_WALL_SIZE - VERT_WALL_SIZE) / 2,\n FLOOR_SIZE + WINDOW_COORDS.y + FLOOR_SIZE\n )\n for (let i = -1; i < 2; i++) {\n if (room.getValTunnels(3, i + 1) === ENEMY_GRID_VAL) {\n this.p.push()\n this.p.imageMode(this.p.CENTER)\n this.p.image(\n this.bones,\n (ROOM_RADIUS + 1) * FLOOR_SIZE + WINDOW_COORDS.x + FLOOR_SIZE / 2,\n WINDOW_COORDS.y + FLOOR_SIZE * i + FLOOR_SIZE / 2\n )\n this.p.pop()\n }\n }\n }\n // TEST\n\n // const roomCoords = this.player.getRoomNRoomCoords()[1]\n\n // this.p.rect(\n // roomCoords.x * FLOOR_SIZE + WINDOW_COORDS.x + FLOOR_SIZE / 2,\n // roomCoords.y * FLOOR_SIZE + WINDOW_COORDS.y + FLOOR_SIZE / 2,\n // 16,\n // 16\n // )\n }\n}\n\nexport default MapSprite\n","import Room from '../room/room'\nimport MapSprite from '../../interfaces/mapSprite/mapSprite'\nimport Helpers from '../../../utils/helpers'\n\nimport Config from 'config'\n\nconst POWERUPS = Config.game.powerups\n\nclass Map {\n constructor(p, player) {\n this.level = 1\n\n this.player = player\n\n this.sprite = new MapSprite(p, player)\n\n this.initiateRooms()\n }\n\n initiateRooms = () => {\n this.startingRoom = new Room(0, 0, this)\n this.rooms = { '0,0': this.startingRoom }\n const paths = [\n [0, 1, this.startingRoom, 'top'],\n [1, 0, this.startingRoom, 'left'],\n [0, -1, this.startingRoom, 'bottom'],\n [-1, 0, this.startingRoom, 'right']\n ]\n const roomsStrings = ['0,0']\n const rooms = [this.startingRoom]\n for (let i = 0; i < this.level; i++) {\n const temp = paths.splice(Math.floor(Math.random() * paths.length), 1)[0]\n if (!this.rooms[Helpers.getRoomRep(temp[0], temp[1])]) {\n temp[2].end = false\n const newRoom = new Room(temp[0], temp[1], this)\n // eslint-disable-next-line prefer-destructuring\n newRoom[temp[3]] = temp[2]\n temp[2][this.getOppositeDir(temp[3])] = newRoom\n const newPaths = this.getSurroundings(newRoom)\n for (let n = 0; n < newPaths.length; n++) {\n const newPath = newPaths[n]\n if (!this.rooms[Helpers.getRoomRep(newPath[0], newPath[1])]) {\n paths.push(newPath)\n }\n }\n rooms.push(newRoom)\n\n const newRoomRep = Helpers.getRoomRep(newRoom.x, newRoom.y)\n this.rooms[newRoomRep] = newRoom\n roomsStrings.push(newRoomRep)\n\n Object.keys(POWERUPS).forEach(powerupColor => {\n const powerup = POWERUPS[powerupColor]\n if (Math.random() < powerup.probability) {\n newRoom.generatePowerup(powerup.gridVal)\n }\n })\n } else {\n i -= 1\n }\n }\n\n const endingRooms = []\n\n for (let i = 0; i < rooms.length; i++) {\n const room = rooms[i]\n if (room.end) {\n endingRooms.push(room)\n }\n }\n\n const trueEndingRoom =\n endingRooms[Math.floor(Math.random() * endingRooms.length)]\n\n trueEndingRoom.updateGrid(0, 0, 2)\n\n this.endingGlobalCoords = Helpers.relativeToGlobal(\n trueEndingRoom.x,\n trueEndingRoom.y\n )\n }\n\n update = () => {\n this.sprite.draw(this.rooms)\n }\n\n isRoomExists = (x, y) => !!this.rooms[Helpers.getRoomRep(x, y)]\n\n getSurroundings = room => {\n return [\n [room.x, room.y + 1, room, 'top'],\n [room.x + 1, room.y, room, 'left'],\n [room.x, room.y - 1, room, 'bottom'],\n [room.x - 1, room.y, room, 'right']\n ]\n }\n\n getOppositeDir = dir => {\n switch (dir) {\n case 'bottom':\n return 'top'\n case 'left':\n return 'right'\n case 'top':\n return 'bottom'\n case 'right':\n return 'left'\n default:\n return ''\n }\n }\n\n getRoomByCoords = (x, y) => this.rooms[Helpers.getRoomRep(x, y)]\n}\n\nexport default Map\n","import Helpers from '../../../utils/helpers'\n\nimport Config from 'config'\n\nconst ROOM_WIDTH = Config.game.room.width\nconst ROOM_HEIGHT = Config.game.room.height\nconst ROOM_RADIUS = Config.game.room.radius\nconst ENEMY_GRID_VAL = Config.game.room.gridVals.enemy\n\nclass Enemy {\n constructor(room) {\n this.room = room\n this.roomCoords = Helpers.generateRandomEnemyPos()\n }\n\n move = player => {\n const surroundings = this.getSurroundings(this.roomCoords)\n let dist = this.getDist(\n Helpers.relativeToGlobal(\n this.room.x + this.roomCoords.x / (ROOM_WIDTH + 1),\n this.room.y + this.roomCoords.y / (ROOM_HEIGHT + 1)\n ),\n player.controls.globalPos\n )\n let newPosition = this.roomCoords\n for (let i = 0; i < surroundings.length; i++) {\n const tempDist = this.getDist(\n Helpers.relativeToGlobal(\n this.room.x + surroundings[i].x / (ROOM_WIDTH + 1),\n this.room.y + surroundings[i].y / (ROOM_HEIGHT + 1)\n ),\n player.controls.globalPos\n )\n if (tempDist < dist) {\n newPosition = surroundings[i]\n dist = tempDist\n }\n }\n\n if (newPosition.y === -ROOM_RADIUS - 1) {\n this.room.updateTunnels(0, newPosition.x + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n } else if (newPosition.y === ROOM_RADIUS + 1) {\n this.room.updateTunnels(1, newPosition.x + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n } else if (newPosition.x === -ROOM_RADIUS - 1) {\n this.room.updateTunnels(2, newPosition.y + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n } else if (newPosition.x === ROOM_RADIUS + 1) {\n this.room.updateTunnels(3, newPosition.y + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n } else if (newPosition.y < -ROOM_RADIUS - 1) {\n this.room = this.room.top\n this.room.updateTunnels(1, newPosition.x + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n this.roomCoords.y = ROOM_RADIUS + 1\n } else if (newPosition.y > ROOM_RADIUS + 1) {\n this.room = this.room.bottom\n this.room.updateTunnels(0, newPosition.x + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n this.roomCoords.y = -ROOM_RADIUS - 1\n } else if (newPosition.x < -ROOM_RADIUS - 1) {\n this.room = this.room.left\n this.room.updateTunnels(3, newPosition.y + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n this.roomCoords.x = ROOM_RADIUS + 1\n } else if (newPosition.x > ROOM_RADIUS + 1) {\n this.room = this.room.right\n this.room.updateTunnels(2, newPosition.y + 1, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n this.roomCoords.x = -ROOM_RADIUS - 1\n } else {\n this.room.updateGrid(newPosition.x, newPosition.y, ENEMY_GRID_VAL)\n this.roomCoords = newPosition\n }\n }\n\n getSurroundings = coords => {\n const translations = [\n { x: 0, y: +1 },\n { x: 1, y: 0 },\n { x: 0, y: -1 },\n { x: -1, y: 0 }\n ]\n\n const surroundings = []\n\n for (let n = 0; n < translations.length; n++) {\n const translation = translations[n]\n const newCoords = {\n x: coords.x + translation.x,\n y: coords.y + translation.y\n }\n if (\n Math.abs(newCoords.x) <= ROOM_RADIUS &&\n Math.abs(newCoords.y) <= ROOM_RADIUS\n ) {\n surroundings.push(newCoords)\n } else if (\n newCoords.x <= -ROOM_RADIUS - 1 &&\n Math.abs(newCoords.y) <= 1 &&\n this.room.left\n ) {\n surroundings.push(newCoords)\n } else if (\n newCoords.x >= ROOM_RADIUS + 1 &&\n Math.abs(newCoords.y) <= 1 &&\n this.room.right\n ) {\n surroundings.push(newCoords)\n } else if (\n newCoords.y <= -ROOM_RADIUS - 1 &&\n Math.abs(newCoords.x) <= 1 &&\n this.room.top\n ) {\n surroundings.push(newCoords)\n } else if (\n newCoords.y >= ROOM_RADIUS + 1 &&\n Math.abs(newCoords.x) <= 1 &&\n this.room.bottom\n ) {\n surroundings.push(newCoords)\n }\n }\n return surroundings\n }\n\n getDist = (p1, p2) => Math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2)\n}\n\nexport default Enemy\n","import Config from 'config'\n\nconst LIGHT_FAR = Config.game.player.light.far\nconst LIGHT_NEAR = Config.game.player.light.near\nconst SPOTLIGHT_SIZE = `transparent ${LIGHT_NEAR}px, rgba(0, 0, 0) ${LIGHT_FAR}px)`\nconst YELLOW_POWERUP = Config.game.powerups.yellow\nconst SPOTLIGHT_SIZE_YELLOW_POWERUP = `transparent ${YELLOW_POWERUP.lightNear}px, rgba(0, 0, 0) ${YELLOW_POWERUP.lightFar}px)`\n\nfunction Spotlight(player) {\n const spotlight = document.getElementById('spotlight')\n\n this.getSpotlight = () => spotlight\n this.getPlayer = () => player\n}\n\nSpotlight.prototype.update = function() {\n const spotlight = this.getSpotlight()\n const playerRef = this.getPlayer()\n\n const { x, y } = playerRef.controls.windowPos\n\n spotlight.style.backgroundImage = `radial-gradient(circle at ${x}px ${y}px, ${\n playerRef.powerups.yellow ? SPOTLIGHT_SIZE_YELLOW_POWERUP : SPOTLIGHT_SIZE\n }`\n}\n\nexport default Spotlight\n","import YellowEffectImg from 'assets/sprites/7_firespin_spritesheet.png'\nimport GreenEffectImg from 'assets/sprites/8_protectioncircle_spritesheet.png'\nimport RedEffectImg from 'assets/sprites/13_vortex_spritesheet.png'\nimport BlueEffectImg from 'assets/sprites/18_midnight_spritesheet.png'\n\nconst SPRITE_OFFSET_X = 8\nconst SPRITE_OFFSET_Y = 0\nconst SPRITE_INTERVAL = 2\nconst REVOLVE_INTERVAL = 16\nconst REVOLVE_RADIUS = 30\nconst SPRITE_DIMENSION = 40\n\nfunction Effects(p, player) {\n this.p = p\n this.player = player\n\n this.element = document.getElementById('effect')\n\n this.effects = {}\n this.sprites = {}\n}\n\nEffects.prototype.loadSprites = function() {\n this.sprites.yellow = []\n this.p.loadImage(YellowEffectImg, img => {\n for (let r = 0; r < 8; r++) {\n const posR = r * 100\n for (let c = 0; c < (r === 7 ? 5 : 8); c++) {\n const posC = c * 100\n const sprite = img.get(posR, posC, 100, 100)\n this.sprites.yellow.push(sprite)\n }\n }\n })\n\n this.sprites.blue = []\n this.p.loadImage(BlueEffectImg, img => {\n for (let r = 0; r < 8; r++) {\n const posR = r * 100\n for (let c = 0; c < (r === 7 ? 5 : 8); c++) {\n const posC = c * 100\n const sprite = img.get(posR, posC, 100, 100)\n this.sprites.blue.push(sprite)\n }\n }\n })\n\n this.sprites.green = []\n this.p.loadImage(GreenEffectImg, img => {\n for (let r = 0; r < 8; r++) {\n const posR = r * 100\n for (let c = 0; c < (r === 7 ? 5 : 8); c++) {\n const posC = c * 100\n const sprite = img.get(posR, posC, 100, 100)\n this.sprites.green.push(sprite)\n }\n }\n })\n\n this.sprites.red = []\n this.p.loadImage(RedEffectImg, img => {\n for (let r = 0; r < 8; r++) {\n const posR = r * 100\n for (let c = 0; c < (r === 7 ? 5 : 8); c++) {\n const posC = c * 100\n const sprite = img.get(posR, posC, 100, 100)\n this.sprites.red.push(sprite)\n }\n }\n })\n}\n\nEffects.prototype.addEffect = function(name, description) {\n this.effects[name] = description\n}\n\nEffects.prototype.removeEffect = function(name) {\n delete this.effects[name]\n}\n\nEffects.prototype.draw = function() {\n const totalString = Object.keys(this.effects)\n .map(key => `${this.effects[key]}
`)\n .join(' ')\n\n this.element.innerHTML = totalString\n\n const { YELLOW, BLUE, GREEN, RED } = this.effects\n const { x, y } = this.player.controls.windowPos\n const spriteIndex = Math.floor(this.p.frameCount / SPRITE_INTERVAL) % 61\n\n this.p.push()\n this.p.imageMode(this.p.CENTER)\n if (YELLOW) {\n this.p.image(\n this.sprites.yellow[spriteIndex],\n x +\n SPRITE_OFFSET_X +\n Math.cos(this.p.frameCount / REVOLVE_INTERVAL) * REVOLVE_RADIUS,\n y +\n SPRITE_OFFSET_Y +\n Math.sin(this.p.frameCount / REVOLVE_INTERVAL) * REVOLVE_RADIUS,\n SPRITE_DIMENSION,\n SPRITE_DIMENSION\n )\n }\n\n if (BLUE) {\n this.p.image(\n this.sprites.blue[spriteIndex],\n x +\n SPRITE_OFFSET_X +\n Math.cos(this.p.frameCount / REVOLVE_INTERVAL + Math.PI / 2) *\n REVOLVE_RADIUS,\n y +\n SPRITE_OFFSET_Y +\n Math.sin(this.p.frameCount / REVOLVE_INTERVAL + Math.PI / 2) *\n REVOLVE_RADIUS,\n SPRITE_DIMENSION,\n SPRITE_DIMENSION\n )\n }\n\n if (GREEN) {\n this.p.image(\n this.sprites.green[spriteIndex],\n x +\n SPRITE_OFFSET_X +\n Math.cos(this.p.frameCount / REVOLVE_INTERVAL + Math.PI) *\n REVOLVE_RADIUS,\n y +\n SPRITE_OFFSET_Y +\n Math.sin(this.p.frameCount / REVOLVE_INTERVAL + Math.PI) *\n REVOLVE_RADIUS,\n SPRITE_DIMENSION,\n SPRITE_DIMENSION\n )\n }\n\n if (RED) {\n this.p.image(\n this.sprites.red[spriteIndex],\n x +\n SPRITE_OFFSET_X +\n Math.cos(this.p.frameCount / REVOLVE_INTERVAL - Math.PI / 2) *\n REVOLVE_RADIUS,\n y +\n SPRITE_OFFSET_Y +\n Math.sin(this.p.frameCount / REVOLVE_INTERVAL - Math.PI / 2) *\n REVOLVE_RADIUS,\n SPRITE_DIMENSION,\n SPRITE_DIMENSION\n )\n }\n\n this.p.pop()\n}\n\nexport default Effects\n","import { Player, Map, Enemy } from './modules/app'\nimport Spotlight from './modules/interfaces/spotlight/spotlight'\nimport Effects from './modules/interfaces/effects/effects'\nimport Helpers from './utils/helpers'\n\nimport Config from 'config'\nimport p5 from 'p5'\n\nconst MAP_WIDTH = Config.game.map.width\nconst MAP_HEIGHT = Config.game.map.height\nconst ROOM_RADIUS = Config.game.room.radius\nconst ENEMY_GRID_VAL = Config.game.room.gridVals.enemy\nconst END_GRID_VAL = Config.game.room.gridVals.end\nconst RED_POTION_GRID_VAL = Config.game.room.gridVals.redPotion\nconst BLUE_POTION_GRID_VAL = Config.game.room.gridVals.bluePotion\nconst YELLOW_POTION_GRID_VAL = Config.game.room.gridVals.yellowPotion\nconst GREEN_POTION_GRID_VAL = Config.game.room.gridVals.greenPotion\nconst ENEMY_SPEED = Config.game.enemy.speed\nconst ENEMY_LEVEL_UP = Config.game.enemy.levelUpFactor\nconst RED_POWERUP = Config.game.powerups.red\nconst BLUE_POWERUP = Config.game.powerups.blue\nconst YELLOW_POWERUP = Config.game.powerups.yellow\nconst GREEN_POWERUP = Config.game.powerups.green\nconst ENEMY_INC = Config.game.map.enemyIncrement\n\nclass Game {\n constructor(container) {\n this.sketch = p => {\n this.player = new Player(p, this.playerMove)\n this.map = new Map(p, this.player)\n this.enemies = [new Enemy(this.map.startingRoom)]\n this.player.registerMap(this.map)\n\n // this.debug = new Debug(this.player, this.map)\n this.spotlight = new Spotlight(this.player)\n\n this.effectIndicator = new Effects(p, this.player)\n\n p.preload = () => {\n this.map.sprite.loadSprite()\n this.player.sprite.loadSprite()\n this.effectIndicator.loadSprites()\n }\n\n p.setup = () => {\n const myCanvas = p.createCanvas(\n Helpers.getElementWidth(container),\n Helpers.getElementHeight(container)\n )\n\n myCanvas.parent(container)\n\n p.textFont('Helvetica')\n p.textAlign(p.CENTER, p.CENTER)\n p.smooth()\n\n this.initiateEnemyMovement()\n }\n\n p.draw = () => {\n p.background('#160f30')\n this.update()\n }\n\n p.windowResized = () => {\n p.resizeCanvas(\n Helpers.getElementWidth(container),\n Helpers.getElementHeight(container)\n )\n }\n }\n\n // eslint-disable-next-line new-cap\n this.p5instance = new p5(this.sketch)\n }\n\n update = () => {\n this.map.update()\n this.player.update()\n this.spotlight.update()\n this.effectIndicator.draw()\n // this.debug.update()\n }\n\n enemiesMove = () => {\n this.enemies.forEach(e => e.move(this.player))\n if (this.checkPlayerPos() === ENEMY_GRID_VAL) {\n this.gameOver()\n }\n }\n\n playerMove = () => {\n switch (this.checkPlayerPos()) {\n case ENEMY_GRID_VAL:\n this.gameOver()\n break\n case END_GRID_VAL:\n this.levelUp()\n break\n case RED_POTION_GRID_VAL:\n this.redPotionPowerup()\n break\n case BLUE_POTION_GRID_VAL:\n this.bluePotionPowerup()\n break\n case YELLOW_POTION_GRID_VAL:\n this.yellowPotionPowerup()\n break\n case GREEN_POTION_GRID_VAL:\n this.greenPotionPowerup()\n break\n default:\n break\n }\n }\n\n checkPlayerPos = () => {\n const roomNRoomCoords = this.player.getRoomNRoomCoords()\n const room = roomNRoomCoords[0]\n const roomCoords = roomNRoomCoords[1]\n let gridVal = 0\n if (\n Math.abs(roomCoords.x) <= ROOM_RADIUS &&\n Math.abs(roomCoords.y) <= ROOM_RADIUS\n ) {\n gridVal = room.getVal(roomCoords.x, roomCoords.y)\n } else if (\n roomCoords.x <= -ROOM_RADIUS - 1 &&\n Math.abs(roomCoords.y) <= 1 &&\n room.left\n ) {\n gridVal = room.getValTunnels(2, roomCoords.y + 1)\n } else if (\n roomCoords.x >= ROOM_RADIUS + 1 &&\n Math.abs(roomCoords.y) <= 1 &&\n room.right\n ) {\n gridVal = room.getValTunnels(3, roomCoords.y + 1)\n } else if (\n roomCoords.y <= -ROOM_RADIUS - 1 &&\n Math.abs(roomCoords.x) <= 1 &&\n room.top\n ) {\n gridVal = room.getValTunnels(0, roomCoords.x + 1)\n } else if (\n roomCoords.y >= ROOM_RADIUS + 1 &&\n Math.abs(roomCoords.x) <= 1 &&\n room.bottom\n ) {\n gridVal = room.getValTunnels(1, roomCoords.x + 1)\n }\n\n return gridVal\n }\n\n levelUp = () => {\n this.map.level += 1\n this.map.initiateRooms()\n this.player.controls.globalPos = { x: MAP_WIDTH / 2, y: MAP_HEIGHT / 2 }\n this.player.controls.windowPos = {\n x: this.player.controls.p.width / 2,\n y: this.player.controls.p.height / 2\n }\n\n const enemyCount = Math.floor(this.map.level / ENEMY_INC) + 1\n this.enemies = []\n for (let i = 0; i < enemyCount; i++)\n this.enemies.push(new Enemy(this.map.startingRoom))\n\n this.initiateEnemyMovement(ENEMY_SPEED * ENEMY_LEVEL_UP ** this.map.level)\n\n const level = document.getElementById('score')\n if (level) level.innerHTML = `Level ${this.map.level}`\n }\n\n gameOver = () => {\n if (!this.player.powerups.red) {\n const gameover = document.getElementById('gameover')\n if (gameover) gameover.style.top = '50%'\n this.p5instance.noLoop()\n }\n }\n\n redPotionPowerup = () => {\n this.powerupConsumed()\n this.player.powerups.red = true\n\n if (this.redPotionTimeout) clearTimeout(this.redPotionTimeout)\n\n this.effectIndicator.addEffect('RED', RED_POWERUP.description)\n\n setTimeout(() => {\n this.player.powerups.red = false\n this.redPotionTimeout = undefined\n this.effectIndicator.removeEffect('RED')\n }, RED_POWERUP.duration)\n }\n\n bluePotionPowerup = () => {\n this.powerupConsumed()\n this.player.powerups.blue = true\n console.log('BLUE POWERUP UP')\n\n if (this.bluePotionTimeout) clearTimeout(this.bluePotionTimeout)\n\n this.effectIndicator.addEffect('BLUE', BLUE_POWERUP.description)\n\n this.bluePotionTimeout = setTimeout(() => {\n console.log('BLUE POWERUP DOWN')\n this.player.powerups.blue = false\n this.bluePotionTimeout = undefined\n this.effectIndicator.removeEffect('BLUE')\n }, BLUE_POWERUP.duration)\n }\n\n yellowPotionPowerup = () => {\n this.powerupConsumed()\n this.player.powerups.yellow = true\n console.log('YELLOW POWERUP UP')\n\n if (this.yellowPotionTimeout) clearTimeout(this.yellowPotionTimeout)\n\n this.effectIndicator.addEffect('YELLOW', YELLOW_POWERUP.description)\n\n this.yellowPotionTimeout = setTimeout(() => {\n console.log('YELLOW POWERUP DOWN')\n this.player.powerups.yellow = false\n this.yellowPotionTimeout = undefined\n this.effectIndicator.removeEffect('YELLOW')\n }, YELLOW_POWERUP.duration)\n }\n\n greenPotionPowerup = () => {\n this.powerupConsumed()\n this.player.powerups.green = true\n console.log('GREEN POWERUP UP')\n\n clearInterval(this.monsterInterval)\n\n this.monsterInterval = setInterval(\n this.enemiesMove,\n GREEN_POWERUP.enemySpeed\n )\n\n if (this.greenPotionTimeout) clearTimeout(this.greenPotionTimeout)\n\n this.effectIndicator.addEffect('GREEN', GREEN_POWERUP.description)\n\n this.greenPotionTimeout = setTimeout(() => {\n console.log('GREEN POWERUP DOWN')\n clearInterval(this.monsterInterval)\n this.initiateEnemyMovement()\n this.greenPotionTimeout = undefined\n this.effectIndicator.removeEffect('GREEN')\n }, GREEN_POWERUP.duration)\n }\n\n powerupConsumed = () => {\n const roomNRoomCoords = this.player.getRoomNRoomCoords()\n const room = roomNRoomCoords[0]\n const roomCoords = roomNRoomCoords[1]\n room.updateGrid(roomCoords.x, roomCoords.y, 0)\n }\n\n initiateEnemyMovement = (interval = ENEMY_SPEED) => {\n clearInterval(this.monsterInterval)\n this.monsterInterval = setInterval(this.enemiesMove, interval)\n }\n\n terminate = () => {\n this.p5instance.remove()\n\n clearInterval(this.monsterInterval)\n }\n}\n\nexport default Game\n","import React, { useRef, useEffect } from 'react'\nimport styled from 'styled-components'\nimport TheRoom from 'core/game'\nimport { Link } from 'react-router-dom'\nimport DarkFog from 'assets/music/Dark-Fog.mp3'\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n background: radial-gradient(#003, #000);\n`\n\nconst DebugWrapper = styled.div`\n position: fixed;\n top: 0;\n left: 0;\n`\n\nconst SpotlightWrapper = styled.div`\n position: absolute;\n width: 100%;\n height: 100%;\n background-image: radial-gradient(\n circle,\n transparent 160px,\n rgba(0, 0, 0) 200px\n );\n transition: 0.5s ease-in all;\n`\n\nconst EffectWrapper = styled.div`\n position: absolute;\n z-index: 20;\n bottom: 0;\n left: 0;\n margin: 15px;\n color: #eae7af;\n font-family: 'Gayathri', sans-serif;\n font-size: 24px;\n`\n\nconst GameOverWrapper = styled.div`\n display: flex;\n position: absolute;\n z-index: 10;\n top: -20%;\n left: 50%;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n border: 10px solid #160f30;\n border-radius: 5px;\n background: #01024e;\n color: #eae7af;\n font-size: 50px;\n transform: translate(-50%, -50%);\n transition: 0.2s ease all;\n`\n\nconst HomeButton = styled.button`\n width: 50px;\n height: 25px;\n margin: 5px;\n border: 1px solid #eae7af;\n border-radius: 5px;\n background: transparent;\n color: #eae7af;\n font-size: 16px;\n font-weight: 100;\n`\n\nconst LevelWrapper = styled.div`\n margin: 20px;\n border-bottom: 3px solid #eae7af;\n color: #eae7af;\n font-family: 'Lexend Zetta', sans-serif;\n font-size: 40px;\n`\n\nconst GameWrapper = styled.div`\n position: relative;\n width: 80%;\n height: 60%;\n border: 25px solid #b88846;\n border-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='75' height='75'%3E%3Cg fill='none' stroke='%23B88846' stroke-width='2'%3E%3Cpath d='M1 1h73v73H1z'/%3E%3Cpath d='M8 8h59v59H8z'/%3E%3Cpath d='M8 8h16v16H8zM51 8h16v16H51zM51 51h16v16H51zM8 51h16v16H8z'/%3E%3C/g%3E%3Cg fill='%23B88846'%3E%3Ccircle cx='16' cy='16' r='2'/%3E%3Ccircle cx='59' cy='16' r='2'/%3E%3Ccircle cx='59' cy='59' r='2'/%3E%3Ccircle cx='16' cy='59' r='2'/%3E%3C/g%3E%3C/svg%3E\")\n 25;\n`\n\nconst Game = () => {\n const mount = useRef(null)\n\n useEffect(() => {\n document.title = 'The Room'\n\n const bgm = new Audio(DarkFog)\n bgm.play()\n\n bgm.onended = () => {\n bgm.currentTime = 0\n }\n\n // eslint-disable-next-line no-unused-vars\n const game = new TheRoom(mount.current)\n\n return () => {\n bgm.pause()\n bgm.currentTime = 0\n game.terminate()\n }\n }, [mount])\n\n return (\n \n \n GAME OVER\n \n Home\n \n \n \n Level 1\n \n \n \n \n \n )\n}\n\nexport default Game\n","import Home from './Home/Home'\nimport Game from './Game/Game'\n\nimport { Route, Switch, withRouter, Redirect } from 'react-router-dom'\nimport React from 'react'\n\nconst Main = () => {\n return (\n \n \n \n } />\n \n )\n}\n\nexport default withRouter(Main)\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n)\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href)\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config)\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n )\n })\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config)\n }\n })\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing\n if (installingWorker == null) {\n return\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n )\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration)\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.')\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration)\n }\n }\n }\n }\n }\n })\n .catch(error => {\n console.error('Error during service worker registration:', error)\n })\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type')\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload()\n })\n })\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config)\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n )\n })\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister()\n })\n }\n}\n","import './index.css'\nimport Main from './containers/Main'\nimport * as serviceWorker from './serviceWorker'\n\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { HashRouter } from 'react-router-dom'\n\nconst main = (\n \n
\n \n)\n\n// document.getElementById('audio').play()\n\nReactDOM.render(main, document.getElementById('root'))\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister()\n"],"sourceRoot":""} \ No newline at end of file