From d4dcc1e7594e340a0fd18d853eb8acd3a265ad8b Mon Sep 17 00:00:00 2001 From: Aelita4 Date: Fri, 24 Jan 2025 16:22:27 +0100 Subject: [PATCH] Implement basic energy system --- public/images/resources/energy.png | Bin 0 -> 399 bytes src/components/NavBar.astro | 9 +- src/components/ResourceBar.astro | 17 +- src/lib/classes/Building.ts | 6 +- .../classes/managers/PlanetEnergyManager.ts | 29 ++++ src/lib/classes/managers/PlanetManager.ts | 2 + .../classes/managers/SystemEnergyManager.ts | 26 +++ src/lib/classes/managers/SystemManager.ts | 10 +- .../managers/abstract/EnergyManager.ts | 14 ++ src/pages/api/build/createBuilding.ts | 1 + src/pages/game/energy.astro | 162 ++++++++++++++++++ src/types/db/DBPlanet.ts | 2 +- 12 files changed, 271 insertions(+), 7 deletions(-) create mode 100644 public/images/resources/energy.png create mode 100644 src/lib/classes/managers/PlanetEnergyManager.ts create mode 100644 src/lib/classes/managers/SystemEnergyManager.ts create mode 100644 src/lib/classes/managers/abstract/EnergyManager.ts create mode 100644 src/pages/game/energy.astro diff --git a/public/images/resources/energy.png b/public/images/resources/energy.png new file mode 100644 index 0000000000000000000000000000000000000000..5a3f886a5c786796f88ea5551b0555291bf39cf0 GIT binary patch literal 399 zcmV;A0dW3_P)4)6?Q-&eF4}{a4P?FANAg zI7`o(2sE6f=VSy4+@gc~mmQIKQ8nzEGazvr+kn83 z?+jyb7A^b~)4(@X)+jtQaL@06R^1J)KQ|6vYe?XF%}JfPn8B zeDo=CXbm2;aH7rphi<@AYj76L|3XWDX%)_*`By{uqjh*_U_h;JssYm0;j;!Z{4M)x t;>bFj#lKzJ134#fmS4x7GkBtZt2y?F?NvkR`ttw)002ovPDHLkV1ko!uGs(p literal 0 HcmV?d00001 diff --git a/src/components/NavBar.astro b/src/components/NavBar.astro index b38b04a..1dda2db 100644 --- a/src/components/NavBar.astro +++ b/src/components/NavBar.astro @@ -67,13 +67,20 @@ const listOfElements: Array = [{ url: "/register", show: "notLoggedInOnly", position: "bottom" -},{ +}, { id: "overview", title: getName(lang, "general", "nav-overview"), type: "simple", url: "/game", show: "loggedInOnly", position: "bottom" +}, { + id: "energy", + title: getName(lang, "general", "nav-energy"), + type: "simple", + url: "/game/energy", + show: "loggedInOnly", + position: "bottom" }, { id: "buildings", title: getName(lang, "general", "nav-buildings"), diff --git a/src/components/ResourceBar.astro b/src/components/ResourceBar.astro index 9a04107..c4d367e 100644 --- a/src/components/ResourceBar.astro +++ b/src/components/ResourceBar.astro @@ -53,8 +53,21 @@ if(!(planet instanceof SystemManager)) { } ---
+ +
+ energy +
+ Energy + planet.energy.production ? "prod-full" : planet.energy.consumption >= (planet.energy.production * 0.9) ? "prod-almost-full" : ""}`}>{planet.energy.consumption}/{planet.energy.production} +
+
+ {getName(lang, 'general', 'production')}{planet.energy.production} + {getName(lang, 'general', 'consumption')}{planet.energy.consumption} + {getName(lang, 'general', 'balance')} planet.energy.production ? "prod-full" : planet.energy.consumption >= (planet.energy.production * 0.9) ? "prod-almost-full" : ""}`}>{planet.energy.production - planet.energy.consumption} +
+
{resourceArray.map(res => -
x.id === res.id)?.type ?? "solid"} data-res-id={res.id} data-res-amount={res.amount} @@ -227,7 +240,7 @@ if(!(planet instanceof SystemManager)) { } function init() { - const resourcebarItems = document.getElementById('resourcebar')?.querySelectorAll('.resourcebar-item'); + const resourcebarItems = document.getElementById('resourcebar')?.querySelectorAll('.resourcebar-iterable'); resourcebarItems?.forEach((item: any) => { const resourceAmount = parseFloat(item.dataset.resAmount ?? '0'); const miningRate = parseInt(item.dataset.resMiningRate ?? '0') / 3600; diff --git a/src/lib/classes/Building.ts b/src/lib/classes/Building.ts index 34392b6..991618a 100644 --- a/src/lib/classes/Building.ts +++ b/src/lib/classes/Building.ts @@ -5,11 +5,13 @@ export default class Building { manager: BuildingManager data: DBBuilding; level: number; + activePercent: number = 100; - constructor(manager: BuildingManager, data: DBBuilding, level: number) { + constructor(manager: BuildingManager, data: DBBuilding, level: number, activePercent?: number) { this.manager = manager; this.data = data; this.level = level; + if(activePercent !== undefined) this.activePercent = activePercent; } async checkRequiredResources(level: number): Promise { @@ -38,7 +40,7 @@ export default class Building { const playerBuildings = this.manager.buildings; let playerBuildingsCanBuild = { canBuild: true, missing: "" }; this.data.requirements.buildings.forEach((buildingReq: any) => { - if(playerBuildings.filter((building) => building.data.id === buildingReq.id)[0]?.level ?? 0 < buildingReq.level) { + if((playerBuildings.filter((building) => building.data.id === buildingReq.id)[0]?.level ?? 0) < buildingReq.level) { playerBuildingsCanBuild = { canBuild: false, missing: `${buildingReq.id} level ${buildingReq.level} required, found ${playerBuildings.filter((building) => building.data.id === buildingReq.id)[0]?.level ?? 0}` }; return; } diff --git a/src/lib/classes/managers/PlanetEnergyManager.ts b/src/lib/classes/managers/PlanetEnergyManager.ts new file mode 100644 index 0000000..c7c153e --- /dev/null +++ b/src/lib/classes/managers/PlanetEnergyManager.ts @@ -0,0 +1,29 @@ +import { Planet } from "./PlanetManager"; +import EnergyManager from "./abstract/EnergyManager"; + +export default class PlanetEnergyManager extends EnergyManager { + constructor(system: Planet) { + super(system); + } + + get manager() { + return this._manager as Planet; + } + + update() { + const buildings = this.manager.buildings.buildings; + + this.production = 0; + this.consumption = 0; + + for(const building of buildings) { + if(building.data.category === "power-plants") { + this.production += (building.data.energy * building.level); + } else { + this.consumption += (building.data.energy * building.level); + } + } + + return this; + } +} \ No newline at end of file diff --git a/src/lib/classes/managers/PlanetManager.ts b/src/lib/classes/managers/PlanetManager.ts index d51e085..8963557 100644 --- a/src/lib/classes/managers/PlanetManager.ts +++ b/src/lib/classes/managers/PlanetManager.ts @@ -4,6 +4,7 @@ import PlanetResourceManager from "./PlanetResourceManager"; import ShipManager from "./PlanetShipManager"; import SystemManager from "./SystemManager"; import PlanetDefenseManager from "./PlanetDefenseManager"; +import PlanetEnergyManager from "./PlanetEnergyManager"; export type Planet = { _id: ObjectId; @@ -14,4 +15,5 @@ export type Planet = { buildings: BuildingManager; ships: ShipManager; defenses: PlanetDefenseManager; + energy: PlanetEnergyManager; } \ No newline at end of file diff --git a/src/lib/classes/managers/SystemEnergyManager.ts b/src/lib/classes/managers/SystemEnergyManager.ts new file mode 100644 index 0000000..6ddc183 --- /dev/null +++ b/src/lib/classes/managers/SystemEnergyManager.ts @@ -0,0 +1,26 @@ +import EnergyManager from "./abstract/EnergyManager"; +import SystemManager from "./SystemManager"; + +export default class SystemEnergyManager extends EnergyManager { + constructor(system: SystemManager) { + super(system); + } + + get manager() { + return this._manager as SystemManager; + } + + update() { + const structures = this.manager.structures.structures; + + for(const structure of structures) { + if(structure.data.id === "dyson-sphere") { + this.production += (structure.data.energy * structure.level); + } else { + this.consumption += (structure.data.energy * structure.level); + } + } + + return this; + } +} \ No newline at end of file diff --git a/src/lib/classes/managers/SystemManager.ts b/src/lib/classes/managers/SystemManager.ts index f8d0750..5ff07ea 100644 --- a/src/lib/classes/managers/SystemManager.ts +++ b/src/lib/classes/managers/SystemManager.ts @@ -12,6 +12,8 @@ import SystemResourceManager from "./SystemResourceManager"; import SystemShipManager from "./SystemShipManager"; import PlanetDefenseManager from "./PlanetDefenseManager"; import SystemDefenseManager from "./SystemDefenseManager"; +import SystemEnergyManager from "./SystemEnergyManager"; +import PlanetEnergyManager from "./PlanetEnergyManager"; export type System = { _id: ObjectId, @@ -31,6 +33,7 @@ export default class SystemManager { resources: SystemResourceManager; ships: SystemShipManager; defenses: SystemDefenseManager; + energy: SystemEnergyManager; data: System; constructor(data: System) { @@ -39,6 +42,7 @@ export default class SystemManager { this.resources = new SystemResourceManager(this); this.ships = new SystemShipManager(this); this.defenses = new SystemDefenseManager(this); + this.energy = new SystemEnergyManager(this); } async fillData(systemData: DBSystem) { @@ -46,6 +50,7 @@ export default class SystemManager { await this.resources.init(systemData.resources); await this.ships.init(systemData.ships); await this.defenses.init(systemData.defenses); + this.energy.update(); await Promise.all(systemData.planets.map(async planetId => { const planet = await getPlanetById(planetId); @@ -62,13 +67,16 @@ export default class SystemManager { //@ts-ignore ships: null, //@ts-ignore - defenses: null + defenses: null, + //@ts-ignore + energy: null } planetObject.resources = await new PlanetResourceManager(planetObject).init(planet.resources); planetObject.buildings = await new BuildingManager(planetObject).init(planet.buildings); planetObject.ships = await new PlanetShipManager(planetObject).init(planet.ships); planetObject.defenses = await new PlanetDefenseManager(planetObject).init(planet.defenses); + planetObject.energy = new PlanetEnergyManager(planetObject).update(); this.planets.push(planetObject); })); diff --git a/src/lib/classes/managers/abstract/EnergyManager.ts b/src/lib/classes/managers/abstract/EnergyManager.ts new file mode 100644 index 0000000..18dd6d9 --- /dev/null +++ b/src/lib/classes/managers/abstract/EnergyManager.ts @@ -0,0 +1,14 @@ +import { Planet } from "../PlanetManager"; +import SystemManager from "../SystemManager"; + +export default abstract class EnergyManager { + protected _manager: Planet | SystemManager; + production: number = 0; + consumption: number = 0; + + constructor(manager: Planet | SystemManager) { + this._manager = manager; + } + + abstract update(): this; +} \ No newline at end of file diff --git a/src/pages/api/build/createBuilding.ts b/src/pages/api/build/createBuilding.ts index 93ee57c..69909e8 100644 --- a/src/pages/api/build/createBuilding.ts +++ b/src/pages/api/build/createBuilding.ts @@ -115,6 +115,7 @@ export const POST: APIRoute = async({ request }) => { await userPlanet.buildings.sync(); await userPlanet.resources.sync(); + userPlanet.energy.update(); return new Response( JSON.stringify({ diff --git a/src/pages/game/energy.astro b/src/pages/game/energy.astro new file mode 100644 index 0000000..201d1e3 --- /dev/null +++ b/src/pages/game/energy.astro @@ -0,0 +1,162 @@ +--- +import LoggedIn from '../../layouts/LoggedIn.astro'; +import { Planet } from '../../lib/classes/managers/PlanetManager'; +import SystemManager from '../../lib/classes/managers/SystemManager'; + +const { token, lang } = Astro.locals; +const active: SystemManager | Planet = Astro.locals.active; + +if(active instanceof SystemManager) { + return Astro.redirect('/game'); +} + +if(Astro.request.method === "POST") { + const body = await Astro.request.formData(); + + for(const [key, value] of body.entries()) { + console.log(key, value); + } + + return Astro.redirect('/game/energy'); +} + +const buildingsList = { + "mines": active.buildings.buildings.filter(building => building.data.category === "mines"), + "powerPlants": active.buildings.buildings.filter(building => building.data.category === "power-plants"), + "utilities": active.buildings.buildings.filter(building => building.data.category === "utilities"), + "storage": active.buildings.buildings.filter(building => building.data.category === "storage") +} +--- + +
+ + + + + + + + + + {buildingsList.mines.map(building => + + + + + + )} + + {buildingsList.powerPlants.map(building => + + + + + + )} + + {buildingsList.utilities.map(building => + + + + + + )} + + {buildingsList.storage.map(building => + + + + + + )} +
Building nameLevelProduction %Production per hourEnergy usage
Mines
{building.data.id}{building.level}15-{building.level * building.data.energy}
Power plants
{building.data.id}{building.level}+{building.level * building.data.energy}
Utilities
{building.data.id}{building.level}-{building.level * building.data.energy}
Storage
{building.data.id}{building.level}-{building.level * building.data.energy}
+ +
+
+ \ No newline at end of file diff --git a/src/types/db/DBPlanet.ts b/src/types/db/DBPlanet.ts index aabe0e0..69c12c4 100644 --- a/src/types/db/DBPlanet.ts +++ b/src/types/db/DBPlanet.ts @@ -6,7 +6,7 @@ export default interface DBPlanet { owner: ObjectId; // shouldn't be here fields: number; resources: Array<{ id: string, amount: number, lastUpdated: Date, perHourMiningRate: number }>; - buildings: Array<{ id: string, level: number }>; + buildings: Array<{ id: string, level: number, activePercent?: number }>; ships: Array<{ id: string, amount: number }>; defenses: Array<{ id: string, amount: number }>; } \ No newline at end of file