diff --git a/app.js b/app.js index 47da7de..1c8dc37 100644 --- a/app.js +++ b/app.js @@ -148,7 +148,84 @@ app.get("/api/building/:id", requireLogin, async (req, res) => { nextLevelPoints: nextLevel[0]?.required_points || null, description: info[0].description, history: info[0].history, - upgradeCost: `${nextLevel[0]?.wood} Holz, ${nextLevel[0]?.stone} Stein, ${nextLevel[0]?.gold} Gold`, + upgradeCost: nextLevel[0] + ? `${nextLevel[0].wood} Holz, ${nextLevel[0].stone} Stein, ${nextLevel[0].gold} Gold` + : "Max Level erreicht", + upgradeWood: nextLevel[0]?.wood ?? null, + upgradeStone: nextLevel[0]?.stone ?? null, + upgradeGold: nextLevel[0]?.gold ?? null, + }); + } catch (err) { + console.error(err); + res.status(500).json({ error: "DB Fehler" }); + } +}); + +/* ======================== + Route für Gebäude Upgrade +======================== */ + +app.post("/api/building/:id/upgrade", requireLogin, async (req, res) => { + const buildingId = req.params.id; + const userId = req.session.user.id; + + try { + // Aktuelles Level holen + const [[userBuilding]] = await db.query( + "SELECT id, level FROM user_buildings WHERE user_id = ? AND building_id = ?", + [userId, buildingId], + ); + + if (!userBuilding) { + return res.status(404).json({ error: "Gebäude nicht gefunden" }); + } + + const nextLevel = userBuilding.level + 1; + + // Upgrade-Kosten für nächstes Level holen + const [[levelData]] = await db.query( + "SELECT required_points, wood, stone, gold FROM building_levels WHERE building_id = ? AND level = ?", + [buildingId, nextLevel], + ); + + if (!levelData) { + return res.status(400).json({ error: "Maximales Level bereits erreicht" }); + } + + // Ressourcen des Spielers prüfen + const [[currency]] = await db.query( + "SELECT wood, stone, gold FROM account_currency WHERE account_id = ?", + [userId], + ); + + if (!currency) { + return res.status(400).json({ error: "Keine Währungsdaten gefunden" }); + } + + if (currency.wood < levelData.wood || currency.stone < levelData.stone || currency.gold < levelData.gold) { + return res.status(400).json({ + error: "Nicht genügend Ressourcen", + required: { wood: levelData.wood, stone: levelData.stone, gold: levelData.gold }, + current: { wood: currency.wood, stone: currency.stone, gold: currency.gold }, + }); + } + + // Ressourcen abziehen + await db.query( + "UPDATE account_currency SET wood = wood - ?, stone = stone - ?, gold = gold - ? WHERE account_id = ?", + [levelData.wood, levelData.stone, levelData.gold, userId], + ); + + // Level erhöhen, Punkte zurücksetzen + await db.query( + "UPDATE user_buildings SET level = ?, points = 0 WHERE id = ?", + [nextLevel, userBuilding.id], + ); + + res.json({ + success: true, + newLevel: nextLevel, + cost: { wood: levelData.wood, stone: levelData.stone, gold: levelData.gold }, }); } catch (err) { console.error(err); diff --git a/public/js/map-ui.js b/public/js/map-ui.js index fcd00d0..4b6b8e0 100644 --- a/public/js/map-ui.js +++ b/public/js/map-ui.js @@ -89,8 +89,19 @@ document.querySelectorAll(".building").forEach((building) => { const buildingType = Number(data.type); if (buildingModules[buildingType]) { if (keepTabsVisible.has(buildingType)) { - // Tabs sichtbar lassen (z.B. Mine) — Info-Tab bleibt aktiv + // Tabs sichtbar lassen (z.B. Mine) tabs.style.display = "flex"; + // Aktionen-Tab aktivieren + document + .querySelectorAll(".tab") + .forEach((t) => t.classList.remove("active")); + document + .querySelectorAll(".tab-content") + .forEach((c) => c.classList.remove("active")); + document + .querySelector(".tab[data-tab='actions']") + .classList.add("active"); + document.getElementById("tab-actions").classList.add("active"); } else { // Tabs ausblenden, eigenes Voll-UI (Wohnhaus, Schwarzmarkt) tabs.style.display = "none"; @@ -102,8 +113,13 @@ document.querySelectorAll(".building").forEach((building) => { document.getElementById("tab-upgrade").innerHTML = `