From 07da6edcc1c8f8f6ce9ff1f0cf30859f57bbce77 Mon Sep 17 00:00:00 2001 From: cay Date: Sun, 29 Mar 2026 13:22:35 +0100 Subject: [PATCH] e657 --- app.js | 79 ++++++++++++++++++++++++++++++++++++++++++++- public/js/map-ui.js | 70 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 145 insertions(+), 4 deletions(-) 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 = ` - - + + + + `; } catch (error) { @@ -139,6 +155,54 @@ document.querySelector(".popup-close").onclick = () => { popup.classList.remove("active"); }; +/* ================================ + Upgrade Button +================================ */ + +document.addEventListener("click", async (e) => { + const btn = e.target.closest("#upgrade-btn"); + if (!btn || btn.disabled) return; + + const buildingId = btn.dataset.building; + + btn.disabled = true; + btn.textContent = "Wird durchgeführt..."; + + try { + const res = await fetch("/api/building/" + buildingId + "/upgrade", { + method: "POST", + }); + + const data = await res.json(); + + if (!res.ok || data.error) { + window.showNotification(data.error || "Upgrade fehlgeschlagen.", "Upgrade", "⚒️"); + btn.disabled = false; + btn.textContent = "⚒ UPGRADE STARTEN ⚒"; + return; + } + + window.showNotification( + `Upgrade erfolgreich!\nNeues Level: ${data.newLevel}\n\nKosten: ${data.cost.wood} Holz, ${data.cost.stone} Stein, ${data.cost.gold} Gold`, + "Upgrade", + "⚒️" + ); + + // Popup neu laden mit aktualisierten Daten + const building = document.querySelector(`.building[href="/building/${buildingId}"]`); + if (building) building.dispatchEvent(new MouseEvent("click", { bubbles: true })); + + // HUD aktualisieren + import("/js/hud.js").then(({ loadHud }) => loadHud()); + + } catch (err) { + console.error("Upgrade Fehler:", err); + window.showNotification("Fehler beim Upgrade. Bitte erneut versuchen.", "Fehler", "⚠️"); + btn.disabled = false; + btn.textContent = "⚒ UPGRADE STARTEN ⚒"; + } +}); + /* ================================ Tooltip ================================ */