diff --git a/staff/marti-herms/project/dodge/data/index.js b/staff/marti-herms/project/dodge/data/index.js new file mode 100644 index 000000000..eb68aee11 --- /dev/null +++ b/staff/marti-herms/project/dodge/data/index.js @@ -0,0 +1,9 @@ +import player from './player.js' +import obstacles from './obstacles.js' + +const data = { + player, + obstacles +} + +export default data \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/data/obstacles.js b/staff/marti-herms/project/dodge/data/obstacles.js new file mode 100644 index 000000000..485ce58c8 --- /dev/null +++ b/staff/marti-herms/project/dodge/data/obstacles.js @@ -0,0 +1,70 @@ +import randomNumberGenerator from '../util/randomNumberGenerator.js' +import { SCREEN_WIDTH, SCREEN_HEIGHT } from '../util/constants' + +import player from './player.js' + +class Obstacle { + constructor(id) { + this.id = id + const type = randomNumberGenerator(1, 3) + const side = randomNumberGenerator(1, 4) + + switch (type) { + case 1: + this.width = 15 + this.height = 15 + this.color = 'blue' + break + case 2: + this.width = 25 + this.height = 25 + this.color = 'red' + break + case 3: + this.width = 35 + this.height = 35 + this.color = 'purple' + break + default: + break + } + + switch (side) { + case 1: + this.top = randomNumberGenerator(50, SCREEN_HEIGHT - this.height - 50) + this.left = 50 + break + case 2: + this.top = 50 + this.left = randomNumberGenerator(50, SCREEN_WIDTH - this.width - 50) + break + case 3: + this.top = SCREEN_HEIGHT - this.height - 50 + this.left = randomNumberGenerator(50, SCREEN_WIDTH - this.width - 50) + break + case 4: + this.top = randomNumberGenerator(50, SCREEN_HEIGHT - this.height - 50) + this.left = SCREEN_WIDTH - this.width - 50 + break + default: + break + } + + const dirY = player.item.top - this.top + const dirX = player.item.left - this.left + + const magnitude = Math.sqrt(dirY ** 2 + dirX ** 2) + + this.yMovement = dirY / magnitude + this.xMovement = dirX / magnitude + } +} + +const obstacles = { + items: [], + addObstacle: function (id) { this.items.push(new Obstacle(id)) }, + removeObstacle: function (id) { this.items = this.items.filter(obstacle => obstacle.id !== id) }, + clear: function () { this.items = [] } +} + +export default obstacles \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/data/player.js b/staff/marti-herms/project/dodge/data/player.js new file mode 100644 index 000000000..72c1b6bbe --- /dev/null +++ b/staff/marti-herms/project/dodge/data/player.js @@ -0,0 +1,18 @@ +import { SCREEN_WIDTH, SCREEN_HEIGHT } from '../util/constants' + +class Player { + constructor() { + this.width = 25 + this.height = 25 + this.top = (SCREEN_HEIGHT - 25) / 2 + this.left = (SCREEN_WIDTH - 25) / 2 + this.points = 0 + } +} + +const player = { + item: new Player(), + clear: function () { this.item = new Player() } +} + +export default player \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/index.html b/staff/marti-herms/project/dodge/index.html index 8e1e7c09e..878152065 100644 --- a/staff/marti-herms/project/dodge/index.html +++ b/staff/marti-herms/project/dodge/index.html @@ -4,7 +4,7 @@ - Space Invaders + Dodge diff --git a/staff/marti-herms/project/dodge/logic/checkCollision.js b/staff/marti-herms/project/dodge/logic/checkCollision.js new file mode 100644 index 000000000..8a866528a --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/checkCollision.js @@ -0,0 +1,27 @@ +import data from '../data' + +import { OBS_SIZE, PLAYER_SIZE } from '../util/constants' + +export default () => { + const boolean = data.obstacles.items.some(obstacle => { + const obsTop = obstacle.top + const obsLeft = obstacle.left + const obsRight = obstacle.left + obstacle.width + const obsBottom = obstacle.top + obstacle.height + + const playerTop = data.player.item.top + const playerLeft = data.player.item.left + const playerRight = data.player.item.left + PLAYER_SIZE + const playerBottom = data.player.item.top + PLAYER_SIZE + + if (obsTop > playerTop && obsTop < playerBottom && obsLeft > playerLeft && obsLeft < playerRight || + obsBottom > playerTop && obsBottom < playerBottom && obsLeft > playerLeft && obsLeft < playerRight || + obsTop > playerTop && obsTop < playerBottom && obsRight > playerLeft && obsRight < playerRight || + obsBottom > playerTop && obsBottom < playerBottom && obsRight > playerLeft && obsRight < playerRight) { + return true + } + return false + }) + + return boolean +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/checkOutOfBounds.js b/staff/marti-herms/project/dodge/logic/checkOutOfBounds.js new file mode 100644 index 000000000..f028f40c6 --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/checkOutOfBounds.js @@ -0,0 +1,12 @@ +import data from '../data' + +import { SCREEN_WIDTH, SCREEN_HEIGHT } from '../util/constants' + +export default (id) => { + const obstacle = data.obstacles.items.find(obstacle => obstacle.id === id) + + if (obstacle.top >= SCREEN_HEIGHT - obstacle.height - 10 || obstacle.top < 0 || obstacle.left >= SCREEN_WIDTH - obstacle.width - 10 || obstacle.left < 0) { + return true + } + return false +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/clearObstacles.js b/staff/marti-herms/project/dodge/logic/clearObstacles.js new file mode 100644 index 000000000..a6c3a81e6 --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/clearObstacles.js @@ -0,0 +1,5 @@ +import data from '../data' + +export default () => { + data.obstacles.clear() +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/clearPlayer.js b/staff/marti-herms/project/dodge/logic/clearPlayer.js new file mode 100644 index 000000000..8833b7adb --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/clearPlayer.js @@ -0,0 +1,5 @@ +import data from '../data' + +export default () => { + data.player.clear() +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/createObstacle.js b/staff/marti-herms/project/dodge/logic/createObstacle.js new file mode 100644 index 000000000..67ecfa1bf --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/createObstacle.js @@ -0,0 +1,5 @@ +import data from '../data' + +export default (id) => { + data.obstacles.addObstacle(id) +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/getObstacles.js b/staff/marti-herms/project/dodge/logic/getObstacles.js new file mode 100644 index 000000000..e779b3c5f --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/getObstacles.js @@ -0,0 +1,5 @@ +import data from '../data' + +export default () => { + return data.obstacles.items +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/getPlayer.js b/staff/marti-herms/project/dodge/logic/getPlayer.js new file mode 100644 index 000000000..add98ca79 --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/getPlayer.js @@ -0,0 +1,5 @@ +import data from '../data' + +export default () => { + return data.player.item +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/getPoints.js b/staff/marti-herms/project/dodge/logic/getPoints.js new file mode 100644 index 000000000..69ace4615 --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/getPoints.js @@ -0,0 +1,5 @@ +import data from '../data' + +export default () => { + return data.player.item.points +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/index.js b/staff/marti-herms/project/dodge/logic/index.js new file mode 100644 index 000000000..03c08e648 --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/index.js @@ -0,0 +1,29 @@ +import getPlayer from './getPlayer' +import movePlayer from './movePlayer' +import createObstacle from './createObstacle' +import clearPlayer from './clearPlayer' +import clearObstacles from './clearObstacles' +import removeObstacle from './removeObstacle' +import getObstacles from './getObstacles' +import checkCollision from './checkCollision' +import moveObstacles from './moveObstacles' +import checkOutOfBounds from './checkOutOfBounds' +import getPoints from './getPoints' +import setPoints from './setPoints' + +const logic = { + movePlayer, + getPlayer, + createObstacle, + clearObstacles, + clearPlayer, + removeObstacle, + getObstacles, + checkCollision, + moveObstacles, + checkOutOfBounds, + getPoints, + setPoints +} + +export default logic \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/moveObstacles.js b/staff/marti-herms/project/dodge/logic/moveObstacles.js new file mode 100644 index 000000000..a1e4a886b --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/moveObstacles.js @@ -0,0 +1,12 @@ +import data from '../data' + +import { OBS_PACE } from '../util/constants' + +export default () => { + data.obstacles.items = data.obstacles.items.map(obstacle => { + obstacle.top += obstacle.yMovement * OBS_PACE + obstacle.left += obstacle.xMovement * OBS_PACE + + return obstacle + }) +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/movePlayer.js b/staff/marti-herms/project/dodge/logic/movePlayer.js new file mode 100644 index 000000000..6800141f0 --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/movePlayer.js @@ -0,0 +1,61 @@ +import data from '../data' + +import { SCREEN_WIDTH, SCREEN_HEIGHT } from '../util/constants' + +export default (e) => { + const moveUp = () => { + data.player.item.top = Math.max(0, data.player.item.top - 10) + } + + const moveLeft = () => { + data.player.item.left = Math.max(0, data.player.item.left - 10) + } + + const moveRight = () => { + data.player.item.left = Math.min(SCREEN_WIDTH - 25, data.player.item.left + 10) + } + + const moveDown = () => { + data.player.item.top = Math.min(SCREEN_HEIGHT - 25, data.player.item.top + 10) + } + + if (typeof e === 'object') + switch (e.key) { + case 'ArrowUp': + case 'w': + moveUp() + break + case 'ArrowLeft': + case 'a': + moveLeft() + break + case 'ArrowRight': + case 'd': + moveRight() + break + case 'ArrowDown': + case 's': + moveDown() + break + default: + break + } + else { + switch (e) { + case 'up': + moveUp() + break + case 'left': + moveLeft() + break + case 'right': + moveRight() + break + case 'down': + moveDown() + break + default: + break + } + } +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/removeObstacle.js b/staff/marti-herms/project/dodge/logic/removeObstacle.js new file mode 100644 index 000000000..e42862d4c --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/removeObstacle.js @@ -0,0 +1,5 @@ +import data from '../data' + +export default (id) => { + data.obstacles.removeObstacle(id) +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/logic/setPoints.js b/staff/marti-herms/project/dodge/logic/setPoints.js new file mode 100644 index 000000000..ba540ccf6 --- /dev/null +++ b/staff/marti-herms/project/dodge/logic/setPoints.js @@ -0,0 +1,18 @@ +import data from '../data' + +export default (seconds) => { + if (seconds === 0) + data.player.item.points = 0 + else if (seconds < 20) + data.player.item.points += 1 + else if (seconds < 30) + data.player.item.points += 5 + else if (seconds < 60) + data.player.item.points += 10 + else if (seconds < 120) + data.player.item.points += 20 + else if (seconds < 240) + data.player.item.points += 40 + else if (seconds >= 240) + data.player.item.points += 100 +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/package-lock.json b/staff/marti-herms/project/dodge/package-lock.json index b1a566d42..08f553d10 100644 --- a/staff/marti-herms/project/dodge/package-lock.json +++ b/staff/marti-herms/project/dodge/package-lock.json @@ -1,11 +1,11 @@ { - "name": "space_invaders", + "name": "dodge", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "space_invaders", + "name": "dodge", "version": "0.0.0", "dependencies": { "@emotion/react": "^11.13.3", @@ -68,9 +68,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -106,12 +106,18 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "version": "7.25.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", + "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", "dependencies": { - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.4", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -241,11 +247,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", + "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", "dependencies": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.25.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -285,9 +291,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.4.tgz", + "integrity": "sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -309,15 +315,15 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", + "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", + "@babel/generator": "^7.25.4", + "@babel/parser": "^7.25.4", "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", + "@babel/types": "^7.25.4", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -325,18 +331,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", + "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", "dependencies": { "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", @@ -364,22 +362,6 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@emotion/cache": { "version": "11.13.1", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", @@ -910,6 +892,21 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/js": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", @@ -1094,11 +1091,6 @@ } } }, - "node_modules/@mui/material/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, "node_modules/@mui/private-theming": { "version": "5.16.6", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", @@ -1237,11 +1229,6 @@ } } }, - "node_modules/@mui/utils/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1904,22 +1891,6 @@ "npm": ">=6" } }, - "node_modules/babel-plugin-macros/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2029,9 +2000,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "version": "1.0.30001653", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", + "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", "dev": true, "funding": [ { @@ -2061,6 +2032,14 @@ "node": ">=4" } }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -2134,10 +2113,9 @@ "dev": true }, "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cosmiconfig": { "version": "7.1.0", @@ -2154,14 +2132,6 @@ "node": ">=10" } }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2313,15 +2283,15 @@ "dev": true }, "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/dom-helpers": { @@ -2565,11 +2535,14 @@ } }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { @@ -2672,14 +2645,43 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.10.tgz", - "integrity": "sha512-I39s6G9We7ZxbCRxTTM5XX4KJV2cfWhFbHF4kTuL0ygdEVdQXtCNGqUQ43sBOCbTC/N6dEZXoQKFHr8gp1VHrQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.11.tgz", + "integrity": "sha512-wrAKxMbVr8qhXTtIKfXqAn5SAtRZt0aXxe5P23Fh4pUAdC6XEsybGLB8P0PI4j1yYqOgUEUlzKAGDfo7rJOjcw==", "dev": true, "peerDependencies": { "eslint": ">=7" } }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", @@ -2757,25 +2759,16 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/eslint/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3120,20 +3113,21 @@ } }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3151,43 +3145,12 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/globalthis": { @@ -3311,6 +3274,11 @@ "react-is": "^16.7.0" } }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3464,9 +3432,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { "hasown": "^2.0.2" }, @@ -3963,9 +3931,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { "braces": "^3.0.3", @@ -4406,23 +4374,6 @@ "postcss": "^8.0.0" } }, - "node_modules/postcss-import/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/postcss-js": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", @@ -4489,6 +4440,18 @@ "url": "https://github.com/sponsors/antonk52" } }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/postcss-nested": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", @@ -4552,6 +4515,11 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4613,9 +4581,9 @@ } }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/react-refresh": { "version": "0.14.2", @@ -4737,10 +4705,9 @@ } }, "node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -4787,27 +4754,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", @@ -5232,6 +5178,50 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5291,23 +5281,6 @@ "node": ">=14.0.0" } }, - "node_modules/tailwindcss/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5820,15 +5793,11 @@ "dev": true }, "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "engines": { - "node": ">= 14" + "node": ">= 6" } }, "node_modules/yocto-queue": { diff --git a/staff/marti-herms/project/dodge/package.json b/staff/marti-herms/project/dodge/package.json index 2944d8c36..c01f03e5b 100644 --- a/staff/marti-herms/project/dodge/package.json +++ b/staff/marti-herms/project/dodge/package.json @@ -10,9 +10,6 @@ "preview": "vite preview" }, "dependencies": { - "@emotion/react": "^11.13.3", - "@emotion/styled": "^11.13.0", - "@mui/material": "^5.16.7", "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.3.0", diff --git a/staff/marti-herms/project/dodge/src/game/Controller.jsx b/staff/marti-herms/project/dodge/src/game/Controller.jsx index ed65ccce9..0ff7b38fa 100644 --- a/staff/marti-herms/project/dodge/src/game/Controller.jsx +++ b/staff/marti-herms/project/dodge/src/game/Controller.jsx @@ -4,52 +4,41 @@ import { FaArrowDown, FaArrowLeft, FaArrowRight, FaArrowUp } from 'react-icons/f import Container from '../library/Container' import Button from '../library/Button' -export default function Controller({ position, setPosition }) { +import logic from '../../logic' + +export default function Controller({ setPlayer, pause, end }) { useEffect(() => { - window.addEventListener('keydown', handleKeyDown) - return () => { - window.removeEventListener('keydown', handleKeyDown) - } - }, [position]) - - const handleKeyDown = (e) => { - switch (e.key) { - case 'ArrowUp': - case 'w': - handleUp() - break - case 'ArrowLeft': - case 'a': - handleLeft() - break - case 'ArrowRight': - case 'd': - handleRight() - break - case 'ArrowDown': - case 's': - handleDown() - break - default: - break + if (!pause && !end) { + window.addEventListener('keydown', handleMovement) + + return () => window.removeEventListener('keydown', handleMovement) + } else if (end) { + logic.clearPlayer() } + }, [pause, end]) + + const handleMovement = (event) => { + logic.movePlayer(event) + + const player = logic.getPlayer() + + setPlayer(prev => ({ ...prev, top: player.top, left: player.left })) } const handleUp = () => { - setPosition({ top: Math.max(0, position.top - 10), left: position.left }) + handleMovement('up') } const handleLeft = () => { - setPosition({ top: position.top, left: Math.max(0, position.left - 10) }) + handleMovement('left') } const handleRight = () => { - setPosition({ top: position.top, left: Math.min(window.innerWidth - 25, position.left + 10) }) + handleMovement('right') } const handleDown = () => { - setPosition({ top: Math.min(window.innerHeight - 25, position.top + 10), left: position.left }) - + handleMovement('down') } return diff --git a/staff/marti-herms/project/dodge/src/game/GameOver.jsx b/staff/marti-herms/project/dodge/src/game/GameOver.jsx index 1efabc7c8..1b783aa44 100644 --- a/staff/marti-herms/project/dodge/src/game/GameOver.jsx +++ b/staff/marti-herms/project/dodge/src/game/GameOver.jsx @@ -1,14 +1,17 @@ import Container from '../library/Container' import Button from '../library/Button' -export default function GameOver({ points, onHomeClick }) { +import logic from '../../logic' + +export default function GameOver({ onHomeClick, onRestartClick }) { return <>

GAME OVER

-

Points: {points}

+

Points: {logic.getPoints()}

+
diff --git a/staff/marti-herms/project/dodge/src/game/Obstacle.jsx b/staff/marti-herms/project/dodge/src/game/Obstacle.jsx index 92e0fa4b8..9902cabee 100644 --- a/staff/marti-herms/project/dodge/src/game/Obstacle.jsx +++ b/staff/marti-herms/project/dodge/src/game/Obstacle.jsx @@ -1,68 +1,20 @@ -import { useEffect, useState } from 'react' +import { useEffect } from 'react' import Container from '../library/Container' -import { OBS_PACE, OBS_RATE, OBS_SIZE, PLAYER_SIZE } from '../../util/constants.js' - -export default function Obstacle({ playerPosition, obstacle, pause, onOutOfBounds, setEnd, clearField }) { - const [obstaclePosition, setObstaclePosition] = useState({ top: obstacle.top, left: obstacle.left }) - const [intervalId, setIntervalId] = useState(null) - const [moveY] = useState(playerPosition.top - obstaclePosition.top) - const [moveX] = useState(playerPosition.left - obstaclePosition.left) - - const obsTop = obstaclePosition.top - const obsLeft = obstaclePosition.left - const obsRight = obstaclePosition.left + OBS_SIZE - const obsBottom = obstaclePosition.top + OBS_SIZE - - const playerTop = playerPosition.top - const playerLeft = playerPosition.left - const playerRight = playerPosition.left + PLAYER_SIZE - const playerBottom = playerPosition.top + PLAYER_SIZE - - const modifier = Math.abs(moveX) / Math.abs(moveY) +import logic from '../../logic/index.js' +export default function Obstacle({ player, obstacle, onOutOfBounds, setEnd }) { useEffect(() => { - if (pause) - clearInterval(intervalId) - else - handleMovement() - }, [pause]) - - useEffect(() => { - if (obstaclePosition.top >= window.innerHeight - OBS_SIZE - 10 || obstaclePosition.top < 0 || obstaclePosition.left >= window.innerWidth - OBS_SIZE - 10 || obstaclePosition.left < 0) { - obstacle.top = obstaclePosition.top - obstacle.left = obstaclePosition.left - onOutOfBounds(obstacle) + if (logic.checkOutOfBounds(obstacle.id)) { + onOutOfBounds(obstacle.id) } - }, [obstaclePosition]) + }, [obstacle.top, obstacle.left]) useEffect(() => { - if (obsTop > playerTop && obsTop < playerBottom && obsLeft > playerLeft && obsLeft < playerRight || - obsBottom > playerTop && obsBottom < playerBottom && obsLeft > playerLeft && obsLeft < playerRight || - obsTop > playerTop && obsTop < playerBottom && obsRight > playerLeft && obsRight < playerRight || - obsBottom > playerTop && obsBottom < playerBottom && obsRight > playerLeft && obsRight < playerRight) { + if (logic.checkCollision()) setEnd(true) - clearField() - } - }, [obstaclePosition, playerPosition]) - - const handleMovement = () => { - if (intervalId) - clearInterval(intervalId) - - setIntervalId(setInterval(() => { - modifier >= 1 ? - setObstaclePosition(prev => ({ - top: moveY > 0 ? prev.top + Math.floor(OBS_PACE * (1 / modifier)) : prev.top - Math.floor(OBS_PACE * (1 / modifier)), - left: moveX > 0 ? prev.left + Math.floor(OBS_PACE * (1 - (1 / modifier))) : prev.left - Math.floor(OBS_PACE * (1 - (1 / modifier))) - })) : - setObstaclePosition(prev => ({ - top: moveY > 0 ? prev.top + Math.floor(OBS_PACE * (1 - modifier)) : prev.top - Math.floor(OBS_PACE * (1 - modifier)), - left: moveX > 0 ? prev.left + Math.floor(OBS_PACE * modifier) : prev.left - Math.floor(OBS_PACE * modifier) - })) - }, OBS_RATE)) - } + }, [obstacle.top, obstacle.left, player.top, player.left]) - return {obstacle.id} + return {obstacle.id} } \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/src/game/Obstacles.jsx b/staff/marti-herms/project/dodge/src/game/Obstacles.jsx new file mode 100644 index 000000000..2c6a294b9 --- /dev/null +++ b/staff/marti-herms/project/dodge/src/game/Obstacles.jsx @@ -0,0 +1,77 @@ +import { useEffect, useState } from 'react' + +import Obstacle from './Obstacle' + +import logic from '../../logic' + +import { SPAWN_RATE, OBS_RATE } from '../../util/constants.js' + +let obstacleCount = 0 + +export default function Obstacles({ player, pause, end, setEnd }) { + const [obstacles, setObstacles] = useState([]) + const [spawnIntervalId, setSpawnIntervalId] = useState(null) + const [movementIntervalId, setMovementIntervalId] = useState(null) + + useEffect(() => { + if (end) { + clearInterval(spawnIntervalId) + clearInterval(movementIntervalId) + clearField() + obstacleCount = 0 + } else if (pause) { + clearInterval(spawnIntervalId) + clearInterval(movementIntervalId) + } else { + handleSpawn() + handleMovement() + } + }, [pause, end]) + + const handleSpawn = () => { + setSpawnIntervalId(setInterval(() => { + logic.createObstacle(obstacleCount++) + + const items = logic.getObstacles() + + setObstacles(prev => ([...items])) + }, SPAWN_RATE)) + } + + const handleMovement = () => { + if (movementIntervalId) + clearInterval(movementIntervalId) + + setMovementIntervalId(setInterval(() => { + logic.moveObstacles() + + const items = logic.getObstacles() + + setObstacles(prev => ([...items])) + }, OBS_RATE)) + } + + const handleOutOfBounds = (id) => { + logic.removeObstacle(id) + + const items = logic.getObstacles() + + setObstacles(prev => [...items]) + } + + const clearField = () => { + clearInterval(spawnIntervalId) + logic.clearObstacles() + setObstacles([]) + } + + return <> + {obstacles.map(obstacle => + )} + +} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/src/game/PauseMenu.jsx b/staff/marti-herms/project/dodge/src/game/PauseMenu.jsx index 6d9c6f0de..daf67119c 100644 --- a/staff/marti-herms/project/dodge/src/game/PauseMenu.jsx +++ b/staff/marti-herms/project/dodge/src/game/PauseMenu.jsx @@ -1,14 +1,16 @@ import Container from '../library/Container' import Button from '../library/Button' -export default function PauseMenu({ points, onResumeClick, onHomeClick }) { +import logic from '../../logic' + +export default function PauseMenu({ onResumeClick, onHomeClick }) { return <>

PAUSE

-

Points: {points}

+

Points: {logic.getPoints()}

diff --git a/staff/marti-herms/project/dodge/src/game/Player.jsx b/staff/marti-herms/project/dodge/src/game/Player.jsx index 463033397..bb5098aaf 100644 --- a/staff/marti-herms/project/dodge/src/game/Player.jsx +++ b/staff/marti-herms/project/dodge/src/game/Player.jsx @@ -2,6 +2,8 @@ import Container from '../library/Container' import { PLAYER_SIZE } from '../../util/constants.js' -export default function Player({ position }) { - return +export default function Player({ player }) { + // console.log(player.top, player.left) + + return } \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/src/game/Screen.jsx b/staff/marti-herms/project/dodge/src/game/Screen.jsx deleted file mode 100644 index 2e4dc26bc..000000000 --- a/staff/marti-herms/project/dodge/src/game/Screen.jsx +++ /dev/null @@ -1,82 +0,0 @@ -import { useEffect, useState } from 'react' - -import Container from '../library/Container' - -import Player from './Player' -import Controller from './Controller' -import Obstacle from './Obstacle' - -import randomNumberGenerator from '../../util/randomNumberGenerator.js' -import { SPAWN_RATE } from '../../util/constants.js' - -let obstacleCount = 0 - -export default function Screen({ pause, end, setEnd }) { - const [position, setPosition] = useState({ top: window.innerHeight / 2 - 25, left: window.innerWidth / 2 - 25 }) - const [obstacles, setObstacles] = useState([]) - const [intervalId, setIntervalId] = useState(null) - - useEffect(() => { - if (end) { - clearInterval(intervalId) - obstacleCount = 0 - } else if (pause) { - clearInterval(intervalId) - } else { - handleSpawn() - } - }, [pause, end]) - - const handleOutOfBounds = (obstacle) => { - const newArray = obstacles.filter(_obstacle => _obstacle.id !== obstacle.id) - - setObstacles(newArray) - } - - const clearField = () => { - setObstacles([]) - } - - const handleSpawn = () => { - setIntervalId(setInterval(() => { - const side = randomNumberGenerator(1, 4) - let x, y - switch (side) { - case 1: - x = randomNumberGenerator(50, 700) - y = 50 - break - case 2: - x = 50 - y = randomNumberGenerator(50, 300) - break - case 3: - x = 700 - y = randomNumberGenerator(50, 300) - break - case 4: - x = randomNumberGenerator(50, 700) - y = 300 - break - default: - break - } - - setObstacles(prev => ([...prev, { top: y, left: x, id: obstacleCount++ }])) - }, SPAWN_RATE)) - } - - return - {obstacles.map(obstacle => - )} - - - -} \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/src/game/Timer.jsx b/staff/marti-herms/project/dodge/src/game/Timer.jsx index 5340061a3..aba462e4e 100644 --- a/staff/marti-herms/project/dodge/src/game/Timer.jsx +++ b/staff/marti-herms/project/dodge/src/game/Timer.jsx @@ -1,23 +1,45 @@ -import { useEffect } from 'react' +import { useEffect, useState } from 'react' -import { TIME } from '../../util/constants.js' +import logic from '../../logic/index.js' + +export default function Timer({ pause, end }) { + const [seconds, setSeconds] = useState(0) + const [points, setPoints] = useState(0) -export default function Timer({ pause, seconds, setSeconds, end }) { useEffect(() => { let intervalId = null - if (!pause && !end) { - intervalId = setInterval(() => { - setSeconds((prevSeconds) => prevSeconds + 1) - }, 1000) - } else if (pause && seconds !== 0) { - clearInterval(intervalId) - } else if (end) { - clearInterval(intervalId) + try { + if (!pause && !end) { + intervalId = setInterval(() => { + setSeconds((prevSeconds) => prevSeconds + 1) + }, 1000) + } else if (pause && seconds !== 0) { + clearInterval(intervalId) + } else if (end) { + setSeconds(0) + setPoints(logic.getPoints()) + clearInterval(intervalId) + } + + return () => clearInterval(intervalId) + } catch (error) { + console.error } + }, [pause, end]) - return () => clearInterval(intervalId) - }, [pause, seconds, end]) + useEffect(() => { + try { + logic.setPoints(seconds) + + setPoints(logic.getPoints()) + } catch (error) { + console.error(error) + } + }, [seconds]) - return
Time: {seconds}
+ return <> +

Points: {points}

+
Time: {seconds}
+ } \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/src/game/index.jsx b/staff/marti-herms/project/dodge/src/game/index.jsx index d24a0d655..1d5288629 100644 --- a/staff/marti-herms/project/dodge/src/game/index.jsx +++ b/staff/marti-herms/project/dodge/src/game/index.jsx @@ -2,33 +2,19 @@ import { useState, useEffect } from 'react' import Button from '../library/Button' -import Screen from './Screen' +import Player from './Player' +import Controller from './Controller' +import Obstacles from './Obstacles' import Timer from './Timer' import PauseMenu from './PauseMenu' import GameOver from './GameOver' +import logic from '../../logic' + export default function Game({ username, onHomeClick }) { const [pause, setPause] = useState(false) - const [seconds, setSeconds] = useState(0) - const [points, setPoints] = useState(0) const [end, setEnd] = useState(false) - - useEffect(() => { - if (seconds === 0) - setPoints(0) - else if (seconds < 20) - setPoints(prev => (prev + 1)) - else if (seconds < 30) - setPoints(prev => (prev + 5)) - else if (seconds < 60) - setPoints(prev => (prev + 10)) - else if (seconds < 120) - setPoints(prev => (prev + 20)) - else if (seconds < 240) - setPoints(prev => (prev + 40)) - else if (seconds >= 240) - setPoints(prev => (prev + 100)) - }, [seconds]) + const [player, setPlayer] = useState(logic.getPlayer()) const handleHomeClick = () => { sessionStorage.username = '' @@ -40,12 +26,17 @@ export default function Game({ username, onHomeClick }) { setPause(!pause) } + const handleRestartClick = () => { + setEnd(false) + + setPlayer(prev => (logic.getPlayer())) + } + return <>

{username}

-

Points: {points}

- +
@@ -54,10 +45,11 @@ export default function Game({ username, onHomeClick }) {
- {pause && } - {end && } - + {pause && } + {end && } + + +
- } \ No newline at end of file diff --git a/staff/marti-herms/project/dodge/util/constants.js b/staff/marti-herms/project/dodge/util/constants.js index 566068258..c4a4b17ce 100644 --- a/staff/marti-herms/project/dodge/util/constants.js +++ b/staff/marti-herms/project/dodge/util/constants.js @@ -1,9 +1,11 @@ const TIME = 10000 -const OBS_PACE = 5 -const OBS_RATE = 50 +const OBS_PACE = 2 +const OBS_RATE = 1000 / 60 // => 60 fps const PLAYER_SIZE = 25 const OBS_SIZE = 35 -const SPAWN_RATE = 1000 +const SPAWN_RATE = 5000 +const SCREEN_WIDTH = window.innerWidth +const SCREEN_HEIGHT = window.innerHeight export { TIME, @@ -11,5 +13,7 @@ export { OBS_RATE, PLAYER_SIZE, OBS_SIZE, - SPAWN_RATE + SPAWN_RATE, + SCREEN_WIDTH, + SCREEN_HEIGHT } \ No newline at end of file