diff --git a/src/components/ResourceBar.astro b/src/components/ResourceBar.astro
index 8388ec6..a24ec39 100644
--- a/src/components/ResourceBar.astro
+++ b/src/components/ResourceBar.astro
@@ -19,43 +19,12 @@ if(!planet) return;
await planet.resources.calculateCurrentAvailableResources();
-const resourceArray: (Resource & { capacity: number })[] = [];
+const miningRate = planet.resources.getPerHourMiningRate();
+const storage = planet.resources.getStorageCapacities();
+
+const resourceArray: (Resource & { capacity: number, rate: number })[] = [];
for(const key of planet.resources.resources) {
- resourceArray.push({ ...key, capacity: 10_000 });
-}
-
-if(!(planet instanceof SystemManager)) {
- const mapStorageToResource: { [key: string]: string } = {
- "coal-storage": "coal",
- "iron-storage": "iron",
- "gold-storage": "gold",
- "water-tank": "water",
- "acid-tank": "sulfuric-acid",
- "nitrogen-tank": "liquid-nitrogen",
- "hydrogen-tank": "hydrogen",
- "oxygen-tank": "oxygen",
- "helium3-tank": "helium-3",
- "uranium-container": "uranium",
- "oil-tank": "oil",
- "diesel-tank": "diesel",
- "kerosene-tank": "kerosene",
- "deuterium-tank": "deuterium",
- "tritium-tank": "tritium",
- }
-
- resourceArray.forEach(res => {
- res.capacity = 10_000;
- });
-
- for(const building of planet.buildings.buildings) {
- if(building.data.category === 'storage') {
- const resource = mapStorageToResource[building.data.id];
- if(resource) {
- const res = resourceArray.find(x => x.id === resource);
- if(res) res.capacity += building.level * 10_000;
- }
- }
- }
+ resourceArray.push({ ...key, capacity: storage.find(r => r.id === key.id)?.capacity ?? 10_000, rate: miningRate.find(x => x.id === key.id)?.rate ?? 0 });
}
---
@@ -83,7 +52,7 @@ if(!(planet instanceof SystemManager)) {
data-res-type={resourceTypes.find(x => x.id === res.id)?.type ?? "solid"}
data-res-id={res.id}
data-res-amount={res.amount}
- data-res-mining-rate={res.amount >= res.capacity ? 0 : res.perHourMiningRate}
+ data-res-mining-rate={res.amount >= res.capacity ? 0 : res.rate}
data-res-capacity={res.capacity}
>
x.id === res.id)?.icon ?? "#"} alt={res.id} class="icon" width={32} height={32} />
@@ -91,7 +60,7 @@ if(!(planet instanceof SystemManager)) {
{getName(lang, 'resources', res.data.id)}
{getName(lang, 'general', 'avaliable')}{Math.floor(res.amount).toString()}
- {getName(lang, 'general', 'production')}= res.capacity ? "prod-full" : res.amount >= (res.capacity * 0.9) ? "prod-almost-full" : ""}`}>{res.amount >= res.capacity ? "0" : res.perHourMiningRate.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") ?? "0"}
+ {getName(lang, 'general', 'production')}= res.capacity ? "prod-full" : res.amount >= (res.capacity * 0.9) ? "prod-almost-full" : ""}`}>{res.amount >= res.capacity ? "0" : res.rate.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") ?? "0"}
{getName(lang, 'general', 'capacity')}{res.capacity.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}
diff --git a/src/lib/classes/managers/PlanetResourceManager.ts b/src/lib/classes/managers/PlanetResourceManager.ts
index 8f37f0f..1bddcdc 100644
--- a/src/lib/classes/managers/PlanetResourceManager.ts
+++ b/src/lib/classes/managers/PlanetResourceManager.ts
@@ -11,7 +11,7 @@ export default class PlanetResourceManager extends ResourceManager {
this.planet = planet;
}
- async init(resourceData: { id: string, amount: number, lastUpdated: Date, perHourMiningRate: number }[]) {
+ async init(resourceData: { id: string, amount: number, lastUpdated: Date }[]) {
const resources = await getAllResources();
this.resourcesDB = resources;
@@ -21,56 +21,47 @@ export default class PlanetResourceManager extends ResourceManager {
{
id: "coal",
amount: 11,
- lastUpdated: new Date(),
- perHourMiningRate: 11
+ lastUpdated: new Date()
},
{
id: "iron",
amount: 22,
- lastUpdated: new Date(),
- perHourMiningRate: 22
+ lastUpdated: new Date()
},
{
id: "gold",
amount: 33,
- lastUpdated: new Date(),
- perHourMiningRate: 33
+ lastUpdated: new Date()
},
{
id: "water",
amount: 44,
- lastUpdated: new Date(),
- perHourMiningRate: 44
+ lastUpdated: new Date()
},
{
id: "sulfuric-acid",
amount: 55,
- lastUpdated: new Date(),
- perHourMiningRate: 55
+ lastUpdated: new Date()
},
{
id: "liquid-nitrogen",
amount: 66,
- lastUpdated: new Date(),
- perHourMiningRate: 66
+ lastUpdated: new Date()
},
{
id: "hydrogen",
amount: 77,
- lastUpdated: new Date(),
- perHourMiningRate: 77
+ lastUpdated: new Date()
},
{
id: "oxygen",
amount: 88,
- lastUpdated: new Date(),
- perHourMiningRate: 88
+ lastUpdated: new Date()
},
{
id: "helium-3",
amount: 99,
- lastUpdated: new Date(),
- perHourMiningRate: 99
+ lastUpdated: new Date()
}
];
@@ -83,7 +74,6 @@ export default class PlanetResourceManager extends ResourceManager {
id: resource.id,
amount: resource.amount,
lastUpdated: resource.lastUpdated,
- perHourMiningRate: resource.perHourMiningRate,
data: resFromDB
})
});
@@ -102,6 +92,12 @@ export default class PlanetResourceManager extends ResourceManager {
"hydrogen-tank": "hydrogen",
"oxygen-tank": "oxygen",
"helium3-tank": "helium-3",
+ "uranium-container": "uranium",
+ "oil-tank": "oil",
+ "diesel-tank": "diesel",
+ "kerosene-tank": "kerosene",
+ "deuterium-tank": "deuterium",
+ "tritium-tank": "tritium",
}
const output: { id: string, capacity: number }[] = [];
@@ -118,13 +114,36 @@ export default class PlanetResourceManager extends ResourceManager {
return output;
}
+ getPerHourMiningRate() {
+ const mapMinerToResource: { [key: string]: string } = {
+ "coal-mine": "coal",
+ "iron-mine": "iron",
+ "gold-mine": "gold"
+ }
+
+ const output = [];
+ const buildings = this.planet.buildings.buildings;
+
+ for(const building of buildings) {
+ if(Object.keys(mapMinerToResource).includes(building.data.id)) {
+ const miningRate = 20 * Math.pow(building.level, 2) + 40 * building.level + 15;
+
+ output.push({
+ id: mapMinerToResource[building.data.id],
+ rate: miningRate
+ });
+ }
+ }
+
+ return output;
+ }
+
async sync() {
await updatePlanetResources(this.planet._id, this.resources.map(res => {
return {
id: res.id,
amount: res.amount,
lastUpdated: res.lastUpdated,
- perHourMiningRate: res.perHourMiningRate
}
}));
}
diff --git a/src/lib/classes/managers/SystemResourceManager.ts b/src/lib/classes/managers/SystemResourceManager.ts
index ac5ce52..73d0d66 100644
--- a/src/lib/classes/managers/SystemResourceManager.ts
+++ b/src/lib/classes/managers/SystemResourceManager.ts
@@ -65,7 +65,6 @@ export default class SystemResourceManager extends ResourceManager {
id: resource.id,
amount: resource.amount,
lastUpdated: null,
- perHourMiningRate: 0,
data: resFromDB
})
});
@@ -74,21 +73,74 @@ export default class SystemResourceManager extends ResourceManager {
}
getStorageCapacities(): { id: string; capacity: number; }[] {
- return this.resources.map(res => {
- return {
- id: res.id,
- capacity: 10_000 //TODO: add structure for storage
+ const output: { id: string, capacity: number }[] = [
+ {
+ id: "coal",
+ capacity: 10_000
+ }, {
+ id: "iron",
+ capacity: 10_000
+ }, {
+ id: "gold",
+ capacity: 10_000
+ }, {
+ id: "water",
+ capacity: 10_000
+ }, {
+ id: "sulfuric-acid",
+ capacity: 10_000
+ }, {
+ id: "liquid-nitrogen",
+ capacity: 10_000
+ }, {
+ id: "hydrogen",
+ capacity: 10_000
+ }, {
+ id: "oxygen",
+ capacity: 10_000
+ }, {
+ id: "helium-3",
+ capacity: 10_000
+ }, {
+ id: "uranium",
+ capacity: 10_000
+ }, {
+ id: "oil",
+ capacity: 10_000
+ }, {
+ id: "diesel",
+ capacity: 10_000
+ }, {
+ id: "kerosene",
+ capacity: 10_000
+ }, {
+ id: "deuterium",
+ capacity: 10_000
+ }, {
+ id: "tritium",
+ capacity: 10_000
}
- });
+ ];
+
+ const storageStation = this.system.structures.structures.find(s => s.data.id === 'storage-station');
+
+ if(typeof storageStation !== 'undefined') {
+ output.forEach(res => {
+ res.capacity += storageStation.level * 40_000;
+ });
+ }
+
+ return output;
}
+ getPerHourMiningRate() { return []; }
+
async sync() {
await updateSystemResources(this.system.data._id, this.resources.map(res => {
return {
id: res.id,
amount: res.amount,
lastUpdated: res.lastUpdated,
- perHourMiningRate: res.perHourMiningRate
}
}));
}
diff --git a/src/lib/classes/managers/abstract/ResourceManager.ts b/src/lib/classes/managers/abstract/ResourceManager.ts
index 28fe504..d376d1d 100644
--- a/src/lib/classes/managers/abstract/ResourceManager.ts
+++ b/src/lib/classes/managers/abstract/ResourceManager.ts
@@ -4,7 +4,6 @@ export type Resource = {
id: string,
amount: number,
lastUpdated: Date | null,
- perHourMiningRate: number,
data: DBResource
}
@@ -13,7 +12,7 @@ export default abstract class ResourceManager {
resourcesDB: DBResource[] = [];
abstract sync(): Promise;
-
+ abstract getPerHourMiningRate(): { id: string, rate: number }[];
abstract getStorageCapacities(): { id: string, capacity: number }[];
getResourceById(resId: string) {
@@ -22,13 +21,16 @@ export default abstract class ResourceManager {
async calculateCurrentAvailableResources() {
const storage = this.getStorageCapacities();
+ const miningRates = this.getPerHourMiningRate();
for(const res of this.resources) {
- if(!res.lastUpdated || !res.perHourMiningRate) continue;
+ if(!res.lastUpdated) continue;
+
+ const miningRate = miningRates.find(r => r.id === res.id)?.rate ?? 0;
const maxStorage = 10_000 + (storage.find(s => s.id === res.id)?.capacity ?? 0);
const timeDiff = Math.abs((new Date()).getTime() - res.lastUpdated.getTime());
const hours = timeDiff / (1000 * 60 * 60);
- let amountToAdd = hours * res.perHourMiningRate;
+ let amountToAdd = hours * miningRate;
if(res.amount + amountToAdd > maxStorage) amountToAdd = Math.max(0, maxStorage - res.amount);
res.amount += amountToAdd;
@@ -50,7 +52,6 @@ export default abstract class ResourceManager {
id: res.id,
amount: res.amount - currentRes.amount,
lastUpdated: res.lastUpdated,
- perHourMiningRate: res.perHourMiningRate,
data: res.data
});
else difference.push(res);
@@ -76,7 +77,6 @@ export default abstract class ResourceManager {
id: res.id,
amount: res.amount,
lastUpdated: new Date(),
- perHourMiningRate: 0,
data: this.resourcesDB.find(r => r.id === res.id) as DBResource
});
}
@@ -90,7 +90,6 @@ export default abstract class ResourceManager {
id: res.id,
amount: res.amount,
lastUpdated: new Date(),
- perHourMiningRate: 0,
data: this.resourcesDB.find(r => r.id === res.id) as DBResource
});
}
diff --git a/src/pages/api/build/createBuilding.ts b/src/pages/api/build/createBuilding.ts
index 69909e8..bb835e4 100644
--- a/src/pages/api/build/createBuilding.ts
+++ b/src/pages/api/build/createBuilding.ts
@@ -89,29 +89,12 @@ export const POST: APIRoute = async({ request }) => {
id: res.id,
amount: res.amount,
lastUpdated: res.lastUpdated,
- perHourMiningRate: res.perHourMiningRate,
data
}
});
userPlanet.resources.setAmount(resourcesAfter.map(res => { return { id: res.id, amount: res.amount } }));
userPlanet.buildings.addBuilding(building);
- if(building.data.category === "mines") {
- switch(building.data.id) {
- case 'coal-mine':
- const coalResource = userPlanet.resources.resources.find(r => r.id === "coal");
- if(coalResource) coalResource.perHourMiningRate += 10;
- break;
- case 'iron-mine':
- const ironResource = userPlanet.resources.resources.find(r => r.id === "iron");
- if(ironResource) ironResource.perHourMiningRate += 10;
- break;
- case 'gold-mine':
- const goldResource = userPlanet.resources.resources.find(r => r.id === "gold");
- if(goldResource) goldResource.perHourMiningRate += 10;
- break;
- }
- }
await userPlanet.buildings.sync();
await userPlanet.resources.sync();
diff --git a/src/pages/api/defenses/add.ts b/src/pages/api/defenses/add.ts
index 5c9a705..72fe692 100644
--- a/src/pages/api/defenses/add.ts
+++ b/src/pages/api/defenses/add.ts
@@ -126,7 +126,6 @@ export const POST: APIRoute = async({ request }) => {
id: res.id,
amount: res.amount,
lastUpdated: res.lastUpdated,
- perHourMiningRate: res.perHourMiningRate,
data
}
});
diff --git a/src/pages/api/ships/addShip.ts b/src/pages/api/ships/addShip.ts
index 86d884f..9360160 100644
--- a/src/pages/api/ships/addShip.ts
+++ b/src/pages/api/ships/addShip.ts
@@ -110,7 +110,6 @@ export const POST: APIRoute = async({ request }) => {
id: res.id,
amount: res.amount,
lastUpdated: res.lastUpdated,
- perHourMiningRate: res.perHourMiningRate,
data
}
});
diff --git a/src/pages/api/structures/createStructure.ts b/src/pages/api/structures/createStructure.ts
index 6ae2660..5ad9de2 100644
--- a/src/pages/api/structures/createStructure.ts
+++ b/src/pages/api/structures/createStructure.ts
@@ -60,46 +60,45 @@ export const POST: APIRoute = async({ request }) => {
const structure = new Structure(userSystem.structures, structureObj, 1);
- // const requirements = await structure.checkRequirements();
- // const resources = await building.checkRequiredResources((userPlanet.buildings.getBuildingById(buildingId)?.level ?? 0) + 1);
+ const requirements = await structure.checkRequirements();
+ const resources = await structure.checkRequiredResources((userSystem.structures.getStructureById(structureId)?.level ?? 0) + 1);
- // if(!requirements.canBuild || !resources) {
- // return new Response(
- // JSON.stringify({
- // code: 400,
- // message: "Bad Request",
- // error: `${requirements.error} | ${resources ? "" : "Not enough resources"}`
- // }), { status: 400 }
- // )
- // }
+ if(!requirements.canBuild || !resources) {
+ return new Response(
+ JSON.stringify({
+ code: 400,
+ message: "Bad Request",
+ error: `${requirements.error} | ${resources ? "" : "Not enough resources"}`
+ }), { status: 400 }
+ )
+ }
- // const resourcesDiff = await userPlanet.resources.getDifference(building.data.requirements.resources.map(res => {
- // return {
- // id: res.id,
- // amount: Math.pow(building.data.multiplier, (userPlanet.buildings.getBuildingById(buildingId)?.level ?? 0) + 1) * res.amount
- // }
- // }));
+ const resourcesDiff = await userSystem.resources.getDifference(structure.data.requirements.resources.map(res => {
+ return {
+ id: res.id,
+ amount: Math.pow(structure.data.multiplier, (userSystem.structures.getStructureById(structureId)?.level ?? 0) + 1) * res.amount
+ }
+ }));
- // const resourceDB = await getAllResources();
- // const resourcesAfter = resourcesDiff.map(res => {
- // const data = resourceDB.find(r => r.id === res.id);
+ const resourceDB = await getAllResources();
+ const resourcesAfter = resourcesDiff.map(res => {
+ const data = resourceDB.find(r => r.id === res.id);
- // if(!data) throw new Error("Resource not found");
+ if(!data) throw new Error("Resource not found");
- // return {
- // id: res.id,
- // amount: res.amount,
- // lastUpdated: res.lastUpdated,
- // perHourMiningRate: res.perHourMiningRate,
- // data
- // }
- // });
+ return {
+ id: res.id,
+ amount: res.amount,
+ lastUpdated: res.lastUpdated,
+ data
+ }
+ });
- // userPlanet.resources.update(resourcesAfter);
- // userSystem.structures.addStructure(structure);
+ userSystem.resources.setAmount(resourcesAfter.map(res => { return { id: res.id, amount: res.amount } }));
+ userSystem.structures.addStructure(structure);
- // await userSystem.structures.sync();
- // await userPlanet.resources.sync();
+ await userSystem.structures.sync();
+ await userSystem.resources.sync();
return new Response(
JSON.stringify({
diff --git a/src/types/db/DBPlanet.ts b/src/types/db/DBPlanet.ts
index 69c12c4..6bd4a73 100644
--- a/src/types/db/DBPlanet.ts
+++ b/src/types/db/DBPlanet.ts
@@ -5,7 +5,7 @@ export default interface DBPlanet {
name: string;
owner: ObjectId; // shouldn't be here
fields: number;
- resources: Array<{ id: string, amount: number, lastUpdated: Date, perHourMiningRate: number }>;
+ resources: Array<{ id: string, amount: number, lastUpdated: Date }>;
buildings: Array<{ id: string, level: number, activePercent?: number }>;
ships: Array<{ id: string, amount: number }>;
defenses: Array<{ id: string, amount: number }>;