diff --git a/README.md b/README.md index c6c1815..2670368 100644 --- a/README.md +++ b/README.md @@ -48,24 +48,82 @@ yarn coverage ## Roadmap -- [ ] **First version of the frontend**: Register (create + validate email), login, create player, select race, and create research task. Track planet resources and active researches. Show player bonus in the UI -- [ ] **game-api microservice, game-engine & frontend**: Players can build units (ships, troops, defenses & heroes) (research required to unlock units) specials & units from special planets??? -- [ ] **game-api microservice, game-engine & frontend**: Players can deploy fleets (only deploy spaceship units) -- [ ] **game-api microservice, game-engine & frontend**: Players activate specials -- [ ] **game-api & frontend**: Add CDN to store assets like images (profile pics, unit img, race img, research img, specials img, planets img...) update user profile pic flow -- [ ] **frontend && Content**: Add translate support in frontend -- [ ] **Content**: Add all races, units, specials, heroes, special planets ??? -- [ ] **Content**: Players +- [ ] **Authentication flows**: Create Users and update user flows. + - [ ] Register User + - [ ] Validate User (email verification) + - [ ] Login User + - [ ] Auto Refresh session token + - [ ] Change Password + - [ ] Forgot Password + - [ ] Delete User + - [ ] Change User email + - [ ] Change User data +- [ ] **Create Players**: Player Creation flow. + - [ ] Select player universe. + - [ ] Select race. + - [ ] Show player dashboard. + - [ ] Universes as a code. + - [ ] Races as a code. + - [ ] Units as a code. +- [ ] **Build Units**: Players build units: + - [ ] Build race Troops + - [ ] Build race Spaceships + - [ ] Build race Defenses + - [ ] Build race Heroes + - [ ] Build special Units + - [ ] Build special Heroes +- [ ] **Fleets**: Players can crate fleets: + - [ ] Explore planet fleets (create explore reports) + - [ ] Establish planetary base fleets + - [ ] Deploy units fleets (move units and resources) => see all visible fleets in real time in the planet + - [ ] collect resources fleets + - [ ] transport resources/troops/star fighters fleets + - [ ] attack planet fleets + - [ ] conquer planet fleets + - [ ] counter-attack planet fleets + - [ ] pirate attack fleets +- [ ] **Battles**: Players can crate fleets: + - [ ] Battle reports + - [ ] Implement battles + - [ ] Capture units feature +- [ ] **Extra frontend features**: Frontend sections: + - [ ] schedule tasks feature + - [ ] notifications feature + - [ ] favorite planets feature + - [ ] snackbars feature + - [ ] messages in game feature (add a chat?) + - [ ] Game alerts in game feature (example: news, maintenance, bugs etc) + - [ ] Exploration reports feature + - [ ] Battle reports feature + - [ ] Points section + - [ ] Player Task section +- [ ] **Active Specials**: Players enable/disable specials + - [ ] race Specials (researches?) + - [ ] heroe Specials + - [ ] planet Specials +- [ ] **CDN for images and assets**: Add CDN to store assets like images (player profile pics ???) +- [x] **translations**: Add translate support in the Frontend: + - [ ] spanish translations + - [ ] english translations + - [ ] galician translations + - [ ] french translations + - [ ] italian translations + - [ ] german translations +- [ ] **Content**: all content via game migrations + - [ ] Races + - [ ] Units + - [ ] Heroes + - [ ] Specials + - [ ] Planets + - [ ] Special Planets + - [ ] Special Units - [x] **Auth microservice**: Create users, validate email, retrieve user info, and create user sessions (JWT) -- [ ] **Pending Auth microservice endpoints**: Change password, forgot password, reset password, update user data and delete account -- [x] **Auth microservice**: Add unit tests with jest -- [x] **Github actions**: Add Github actions (test, coverage reports with coveralls) -- [ ] **Pending Github actions**: Add Sonar action -- [x] **game-api**: Add migration support -- [x] **game-engine**: Create Universe (define races, planets) -- [x] **game-api microservice**: Create a player (select race & select universe & principal planet) -- [x] **game-engine**: Define task types & processing scheduler -- [x] **game-api microservice**: Players can create tasks -- [ ] **first release**: Release system & dev & prod environments (GitHub actions). -- [ ] **preview PR branches**: (Github actions) +- [ ] **Github actions**: Add Github actions + - [ ] Linter Action + - [ ] Test Action + - [ ] Coverage Action + - [ ] Sonar Action + - [ ] Deploy test branch Action +- [x] **Tests**: Add unit tests with jest +- [ ] **First release**: Release system & dev & prod environments (GitHub actions). - [ ] **Badges**: Add badges in the README.md diff --git a/packages/frontend/public/planets/unexplored_planet.jpeg b/packages/frontend/public/planets/unexplored_planet.jpeg new file mode 100644 index 0000000..73838ac Binary files /dev/null and b/packages/frontend/public/planets/unexplored_planet.jpeg differ diff --git a/packages/frontend/public/units/pirates/spaceships/pirate_scrap_fighter_unit.jpeg b/packages/frontend/public/units/pirates/spaceships/pirate_scrap_fighter_unit.jpeg new file mode 100644 index 0000000..5091785 Binary files /dev/null and b/packages/frontend/public/units/pirates/spaceships/pirate_scrap_fighter_unit.jpeg differ diff --git a/packages/frontend/src/components/active-units-build/ActiveUnitsBuild.tsx b/packages/frontend/src/components/active-units-build/ActiveUnitsBuild.tsx index 969b1b3..adc9d0d 100644 --- a/packages/frontend/src/components/active-units-build/ActiveUnitsBuild.tsx +++ b/packages/frontend/src/components/active-units-build/ActiveUnitsBuild.tsx @@ -54,7 +54,7 @@ function ActiveUnitsBuild({ activeBuild, activeBuildCountdown }: ActiveUnitsBuil return ( - + {/* unit build countdown */} diff --git a/packages/frontend/src/components/build-units-queue/BuildUnitsQueue.tsx b/packages/frontend/src/components/build-units-queue/BuildUnitsQueue.tsx index f98e8f4..9846bc5 100644 --- a/packages/frontend/src/components/build-units-queue/BuildUnitsQueue.tsx +++ b/packages/frontend/src/components/build-units-queue/BuildUnitsQueue.tsx @@ -108,7 +108,7 @@ function QueueItem({ unit, amount, player, index }: QueueItemProps) { onMouseEnter={() => setShowRemoveButton(true)} onMouseLeave={() => setShowRemoveButton(false)} > - + <> {/* Countdown */} diff --git a/packages/frontend/src/components/defenses-label/DefensesLabel.tsx b/packages/frontend/src/components/defenses-label/DefensesLabel.tsx index e458ee3..1bdeb59 100644 --- a/packages/frontend/src/components/defenses-label/DefensesLabel.tsx +++ b/packages/frontend/src/components/defenses-label/DefensesLabel.tsx @@ -58,15 +58,15 @@ function getDefensesInThePlanet(player?: PlayerType, selectedPlanet?: PlanetType return 0 } - const planetFleets = player.fleets.find( - (fleet) => isPlanetCoordinates(fleet.planet, selectedPlanet.coordinates) && !fleet.travel + const unitsInThePlanet = player.units.find(({ planet }) => + isPlanetCoordinates(planet, selectedPlanet.coordinates) ) - if (!planetFleets) { + if (!unitsInThePlanet) { return 0 } - return planetFleets.units.reduce((defenses, { unit, amount }) => { + return unitsInThePlanet.units.reduce((defenses, { unit, amount }) => { if (unit.type === 'DEFENSE') { return defenses + amount } diff --git a/packages/frontend/src/components/dialogs/BuildUnitsDialog.tsx b/packages/frontend/src/components/dialogs/BuildUnitsDialog.tsx index 0e19ff8..b7cc541 100644 --- a/packages/frontend/src/components/dialogs/BuildUnitsDialog.tsx +++ b/packages/frontend/src/components/dialogs/BuildUnitsDialog.tsx @@ -24,7 +24,6 @@ import FortIcon from '@mui/icons-material/Fort' import { UnitType, UnitTypes } from 'game-api-microservice/src/types/Unit' import isHeroAlreadyBuild from 'game-engine/src/engine/units/isHeroAlreadyBuild' import computedBonus from 'game-engine/src/engine/bonus/computedBonus' -import getAmountOfPlayerUnitsInThePlanet from 'game-engine/src/engine/units/getAmountOfPlayerUnitsInThePlanet' import calculateMaxPlayerEnergy from 'game-engine/src/engine/units/calculateMaxPlayerEnergy' import calculateCurrentPlayerEnergy from 'game-engine/src/engine/units/calculateCurrentPlayerEnergy' import calculateCurrentPlayerPopulation from 'game-engine/src/engine/units/calculateCurrentPlayerPopulation' @@ -38,14 +37,14 @@ import { useTranslations } from '../../store/TranslationContext' import formatTimer from '../../utils/formatTimer' import formatNumber from '../../utils/formatNumber' import millisToSeconds from '../../utils/millisToSeconds' -import Image from '../image/Image' import UnitStats from '../unit-stats/UnitStats' import { usePlayerResources } from '../../store/PlayerResourcesContext' import formatCoordinatesLabel from '../../utils/formatPlanetCoordinates' import { useTheme } from '../../store/ThemeContext' import UnitRequirements from '../unit-requirements/UnitRequirements' import UnitBonus from '../unit-bonus/UnitBonus' -import getImage from '../../utils/getImage' +import UnitCard from '../unit-card/UnitCard' +import { useFleet } from '../../store/FleetContext' type BuildUnitDialogProps = { unitToBuild: UnitType @@ -81,13 +80,19 @@ function BuildUnitsDialog({ unitToBuild, isOpen, setUnitToBuild }: BuildUnitDial activeBuildDefenses } = useBuildUnits() + const { unitsInThePlanet } = useFleet() + const UnitIconComponent = unitIcon[unitToBuild.type] const resourceCost = amount * unitToBuild.resourceCost - const currentPopulation = calculateCurrentPlayerPopulation(player!) + const currentPopulation = player + ? calculateCurrentPlayerPopulation(player, player.units, player.fleets) + : 0 const predictedPopulation = currentPopulation + amount const maxPlayerPopulation = calculateMaxPlayerPopulation(player!) - const currentEnergy = calculateCurrentPlayerEnergy(player!) + const currentEnergy = player + ? calculateCurrentPlayerEnergy(player, player.units, player.fleets) + : 0 const predictedEnergy = currentEnergy + unitToBuild.energyCost * amount const maxPlayerEnergy = calculateMaxPlayerEnergy(player!) @@ -131,11 +136,8 @@ function BuildUnitsDialog({ unitToBuild, isOpen, setUnitToBuild }: BuildUnitDial const buildUnitBonus = computedBonus(player!.perks, buildUnitsPerk[unitToBuild.type]) const buildUnitDuration = millisToSeconds(unitToBuild.buildBaseTime * (100 / buildUnitBonus)) - const troopsInThisPlanet = getAmountOfPlayerUnitsInThePlanet( - player!, - selectedPlanet!, - unitToBuild - ) + const amountOfUnitsInThePlanet = + unitsInThePlanet.find(({ unit }) => unit.name === unit.name)?.amount || 0 const error = getErrorLabel({ isValidAmount, @@ -169,73 +171,15 @@ function BuildUnitsDialog({ unitToBuild, isOpen, setUnitToBuild }: BuildUnitDial - - - - - - {translate(unitToBuild.name)} - - {/* Unit name */} - - - - - {unitToBuild.isHero && } - - {translate(unitToBuild.name)} - - - - - - - {/* Amount of units in this planet */} - - - - - - {formatNumber(troopsInThisPlanet)} - - - - - - - + + + @@ -263,6 +207,7 @@ function BuildUnitsDialog({ unitToBuild, isOpen, setUnitToBuild }: BuildUnitDial {/* TODO: ADD TOOLTIP */} + {/* TODO: ADD 25% button... */} @@ -274,7 +219,7 @@ function BuildUnitsDialog({ unitToBuild, isOpen, setUnitToBuild }: BuildUnitDial helperText={showErrorLabel ? error : ''} disabled={unitToBuild.isHero} fullWidth - placeholder="type the amount" + placeholder="type an amount" error={showErrorLabel} value={amount || ''} onChange={(event) => { @@ -351,8 +296,11 @@ function BuildUnitsDialog({ unitToBuild, isOpen, setUnitToBuild }: BuildUnitDial textAlign="center" color={isValidPopulation ? 'textPrimary' : 'error'} > - {calculateCurrentPlayerPopulation(player!) + - (unitToBuild.type === 'TROOP' ? amount : 0)}{' '} + {calculateCurrentPlayerPopulation( + player!, + player!.units, + player!.fleets + ) + (unitToBuild.type === 'TROOP' ? amount : 0)}{' '} / {formatNumber(calculateMaxPlayerPopulation(player!))} @@ -377,7 +325,8 @@ function BuildUnitsDialog({ unitToBuild, isOpen, setUnitToBuild }: BuildUnitDial textAlign="center" color={isValidEnergy ? 'textPrimary' : 'error'} > - {calculateCurrentPlayerEnergy(player!) + amount * unitToBuild.energyCost}{' '} + {calculateCurrentPlayerEnergy(player!, player!.units, player!.fleets) + + amount * unitToBuild.energyCost}{' '} /{formatNumber(calculateMaxPlayerEnergy(player!))} @@ -471,9 +420,7 @@ function BuildUnitsDialog({ unitToBuild, isOpen, setUnitToBuild }: BuildUnitDial ) : (