From 5bb3940088476665cace3c36a49399511c87a051 Mon Sep 17 00:00:00 2001 From: Aelita4 Date: Wed, 3 Apr 2024 23:22:20 +0200 Subject: [PATCH] Add requirements section to buildings and research --- src/lib/data/buildings.json | 96 ++++++++++--------- src/lib/data/research.json | 107 ++++++++++++++++------ src/pages/api/build/createBuilding.ts | 2 +- src/pages/api/research/performResearch.ts | 34 ++++++- src/pages/game/buildings.astro | 10 +- src/pages/game/research.astro | 8 +- 6 files changed, 174 insertions(+), 83 deletions(-) diff --git a/src/lib/data/buildings.json b/src/lib/data/buildings.json index ec0895a..cadb3c4 100644 --- a/src/lib/data/buildings.json +++ b/src/lib/data/buildings.json @@ -4,39 +4,47 @@ "buildings": [ { "id": "iron-mine", - "cost": [ - { - "name": "iron", - "amount": 1 - }, - { - "name": "gold", - "amount": 1 - }, - { - "name": "coal", - "amount": 1 - } - ], + "requirements": { + "buildings": [], + "research": [], + "resources": [ + { + "name": "iron", + "amount": 1 + }, + { + "name": "gold", + "amount": 1 + }, + { + "name": "coal", + "amount": 1 + } + ] + }, "energy": 11, "multiplier": 2 }, { "id": "gold-mine", - "cost": [ - { - "name": "iron", - "amount": 1 - }, - { - "name": "gold", - "amount": 1 - }, - { - "name": "coal", - "amount": 1 - } - ], + "requirements": { + "buildings": [], + "research": [], + "resources": [ + { + "name": "iron", + "amount": 1 + }, + { + "name": "gold", + "amount": 1 + }, + { + "name": "coal", + "amount": 1 + } + ] + }, "energy": 11, "multiplier": 2.5 } @@ -46,20 +54,24 @@ "buildings": [ { "id": "research-lab", - "cost": [ - { - "name": "iron", - "amount": 1 - }, - { - "name": "gold", - "amount": 1 - }, - { - "name": "coal", - "amount": 1 - } - ], + "requirements": { + "buildings": [], + "research": [], + "resources": [ + { + "name": "iron", + "amount": 1 + }, + { + "name": "gold", + "amount": 1 + }, + { + "name": "coal", + "amount": 1 + } + ] + }, "energy": 100, "multiplier": 3 } diff --git a/src/lib/data/research.json b/src/lib/data/research.json index 0cbe805..d741b12 100644 --- a/src/lib/data/research.json +++ b/src/lib/data/research.json @@ -1,61 +1,108 @@ [ { "id": "basic-engine", - "levelRequired": 1, - "requiredResearch": [], - "cost": { - "iron": 1000, - "gold": 500 + "requirements": { + "buildings": [ + { + "id": "research-lab", + "level": 1 + } + ], + "research": [], + "resources": { + "iron": 1000, + "gold": 500 + } }, "time": 60, "multiplier": 2 }, { "id": "advanced-engine", - "levelRequired": 5, - "requiredResearch": ["basic-engine"], - "cost": { - "iron": 2000, - "gold": 1000 + "requirements": { + "buildings": [ + { + "id": "research-lab", + "level": 5 + } + ], + "research": [ + { + "id": "basic-engine", + "level": 1 + } + ], + "resources": { + "iron": 2000, + "gold": 1000 + } }, "time": 120, "multiplier": 3 }, { "id": "combat-utilities", - "levelRequired": 1, - "requiredResearch": [], - "cost": { - "iron": 1000, - "gold": 500 + "requirements": { + "buildings": [ + { + "id": "research-lab", + "level": 1 + } + ], + "research": [], + "resources": { + "iron": 1000, + "gold": 500 + } }, "time": 60, "multiplier": 2 }, { "id": "defensive-utilities", - "levelRequired": 1, - "requiredResearch": [], - "cost": { - "iron": 1000, - "gold": 500 + "requirements": { + "buildings": [ + { + "id": "research-lab", + "level": 1 + } + ], + "research": [], + "resources": { + "iron": 1000, + "gold": 500 + } }, "time": 60, "multiplier": 2 }, { "id": "oxygen-production", - "levelRequired": 1, - "requiredResearch": [], - "cost": { - "iron": 1000, - "gold": 500 + "requirements": { + "buildings": [ + { + "id": "research-lab", + "level": 1 + } + ], + "research": [], + "resources": { + "iron": 1000, + "gold": 500 + } }, "time": 200, "multiplier": 2 }, { "id": "terraforming", - "levelRequired": 7, - "requiredResearch": ["oxygen-production"], - "cost": { - "iron": 2000, - "gold": 1000 + "requirements": { + "buildings": [ + { + "id": "research-lab", + "level": 1 + } + ], + "research": [], + "resources": { + "iron": 1000, + "gold": 500 + } }, "time": 500, "multiplier": 3 diff --git a/src/pages/api/build/createBuilding.ts b/src/pages/api/build/createBuilding.ts index 1272d6f..cab5387 100644 --- a/src/pages/api/build/createBuilding.ts +++ b/src/pages/api/build/createBuilding.ts @@ -23,7 +23,7 @@ export const POST: APIRoute = async({ request }) => { const resources = await getUserResources(user._id); const buildingId = (await request.json()).building; const building = buildings.map(cat => cat.buildings.filter(b => b.id === buildingId))[0][0]; - const balance = calculateAvailableResources(resources, building.cost); + const balance = calculateAvailableResources(resources, building.requirements.resources); return new Response( JSON.stringify({ diff --git a/src/pages/api/research/performResearch.ts b/src/pages/api/research/performResearch.ts index 44383e5..b4216d4 100644 --- a/src/pages/api/research/performResearch.ts +++ b/src/pages/api/research/performResearch.ts @@ -33,14 +33,42 @@ export const POST: APIRoute = async({ request }) => { ) } - // check if user has enough resources - const resources = await getUserResources(user._id); + // check requirements + // buildings + const buildings = user.buildings; + researchData.requirements.buildings.forEach((buildingReq) => { + if(buildings.filter((building) => building.id === buildingReq.id)[0].level < buildingReq.level) { + return new Response( + JSON.stringify({ + code: 400, + message: "Bad Request", + error: `${buildingReq.id} level ${buildingReq.level} required` + }), { status: 400 } + ) + } + }); + + // research const playerResearch = await getUserResearch(user); + researchData.requirements.research.forEach((researchReq) => { + if(playerResearch.filter((research) => research.id === researchReq.id)[0].level < researchReq.level) { + return new Response( + JSON.stringify({ + code: 400, + message: "Bad Request", + error: `${researchReq.id} level ${researchReq.level} required` + }), { status: 400 } + ) + } + }); + + // resources + const resources = await getUserResources(user._id); const playerCurrentResearch = playerResearch.filter((element: any) => element.id === researchId)[0]; const level = playerCurrentResearch ? playerCurrentResearch.level : 0; const newResources = structuredClone(resources); let hasEnoughResources = true; - Object.entries(researchData.cost).forEach(([key, value]) => { + Object.entries(researchData.requirements.resources).forEach(([key, value]) => { const res = resources.filter((element: DBResource) => element.name === key)[0]; const cost = playerCurrentResearch ? value * Math.pow(researchData.multiplier, level) : value; diff --git a/src/pages/game/buildings.astro b/src/pages/game/buildings.astro index 08e79d8..ff6f65b 100644 --- a/src/pages/game/buildings.astro +++ b/src/pages/game/buildings.astro @@ -33,9 +33,13 @@ const langBuildings = await getLocales(locale, 'buildings'); {buildingsList.map(cat => (

{langBuildings[`Label_${cat.category}`]}

- {cat.buildings.map(building => ( -
{langBuildings[`Label_${building.id}`]} - {langResources['Label_iron']}: {building.cost['iron']}, {langResources['Label_gold']}: {building.cost['gold']}, {langResources['Label_coal']}: {building.cost['coal']} | {langGame['Link_build']}
- ))} + {cat.buildings.map(building => ( <> +

{langBuildings[`Label_${building.id}`]}

+ {building.requirements.resources.map(res => ( +
{langResources[`Label_${res.name}`]}: {res.amount}
+ ))} + {langGame['Link_build']} + ))}
))} diff --git a/src/pages/game/research.astro b/src/pages/game/research.astro index 7c1ade8..96ded03 100644 --- a/src/pages/game/research.astro +++ b/src/pages/game/research.astro @@ -7,7 +7,7 @@ import { getUserByAccessToken } from '../../lib/db/users'; import { getHighestWeightedLanguage, getLocales } from '../../lib/lang/langDriver'; import ResourceBar from '../../components/ResourceBar.astro'; -type ResearchDetail = { id: string, level: number, requiredResearch: string[], cost: { [key: string]: number } }; +type ResearchDetail = { id: string, level: number, requiredResearch: { id: string, level: number}[], cost: { [key: string]: number } }; const researchList = (await import('../../lib/data/research.json')).default; @@ -31,11 +31,11 @@ researchList.forEach(element => { const tempResDetails: ResearchDetail = { id: element.id, level: userLevel, - requiredResearch: element.requiredResearch, + requiredResearch: element.requirements.research, cost: {} } - Object.entries(element.cost).forEach(([key, value]) => { + Object.entries(element.requirements.resources).forEach(([key, value]) => { tempResDetails.cost[key] = value * Math.pow(element.multiplier, userLevel); }); researchDetails.push(tempResDetails); @@ -60,7 +60,7 @@ researchList.forEach(element => {
{langResearch['Label_required']}:
{research.requiredResearch.length !== 0 ? research.requiredResearch.map(req => (
- {langResearch[`Label_${req}`].name} + {langResearch[`Label_${req.id}`].name} - {req.level}
)) : langResearch['Label_none']}