diff --git a/public/css/building.css b/public/css/building.css
index 810eacb..278aaa2 100644
--- a/public/css/building.css
+++ b/public/css/building.css
@@ -529,3 +529,43 @@ body {
transform: translate(-50%, -50%);
}
}
+
+/* =========================
+ Schwarzmarkt
+========================= */
+#market-pages {
+ display: flex;
+ flex-direction: column;
+
+ gap: 8px;
+
+ margin-top: 15px;
+}
+
+.market-page {
+ padding: 8px 12px;
+
+ border: 1px solid #8b6a3c;
+
+ background: rgba(0, 0, 0, 0.15);
+}
+
+.market-page.owned {
+ color: #3cff3c;
+}
+
+.market-page.buy {
+ cursor: pointer;
+
+ background: #6b4b2a;
+
+ color: white;
+}
+
+.market-page.buy:hover {
+ background: #8b6a3c;
+}
+
+.market-page.locked {
+ opacity: 0.4;
+}
diff --git a/public/js/buildings/schwarzmarkt.js b/public/js/buildings/schwarzmarkt.js
index 3eef8a0..42de1f3 100644
--- a/public/js/buildings/schwarzmarkt.js
+++ b/public/js/buildings/schwarzmarkt.js
@@ -4,28 +4,51 @@ export async function loadSchwarzmarkt() {
ui.innerHTML = `
Schwarzmarkt
-
-
-
+
`;
- loadMarketInfo();
+ loadPages();
}
-async function loadMarketInfo() {
+async function loadPages() {
const res = await fetch("/api/blackmarket/pages");
const data = await res.json();
- const info = document.getElementById("market-info");
+ const container = document.getElementById("market-pages");
- info.innerHTML = `
-Freigeschaltete Seiten: ${data.ownedPages} / ${data.maxPages}
-Inventarslots: ${data.slots}
+ let html = "";
+
+ for (let i = 1; i <= 8; i++) {
+ if (data.ownedPages.includes(i)) {
+ html += `
+
+Seite ${i} ✔
+
`;
+ } else {
+ const price = data.prices.find((p) => p.page === i);
+
+ if (price) {
+ html += `
+
+Seite ${i} Kaufen (${price.price} Gold)
+
+`;
+ } else {
+ html += `
+
+Seite ${i} 🔒
+
+`;
+ }
+ }
+ }
+
+ container.innerHTML = html;
}
document.addEventListener("click", async (e) => {
- if (e.target.id !== "buy-page") return;
+ if (!e.target.classList.contains("buy")) return;
const res = await fetch("/api/blackmarket/buy-page", {
method: "POST",
@@ -40,5 +63,5 @@ document.addEventListener("click", async (e) => {
alert("Seite " + data.page + " freigeschaltet!");
- location.reload();
+ loadPages();
});
diff --git a/routes/blackmarket.js b/routes/blackmarket.js
index 9e1ef82..43d7686 100644
--- a/routes/blackmarket.js
+++ b/routes/blackmarket.js
@@ -3,4 +3,104 @@ const router = express.Router();
const db = require("../database/database");
const auth = require("../middleware/auth");
+router.get("/pages", auth, async (req, res) => {
+ const userId = req.session.user.id;
+
+ try {
+ const [owned] = await db.query(
+ `
+ SELECT page
+ FROM user_inventory_pages
+ WHERE user_id = ?
+ ORDER BY page
+ `,
+ [userId],
+ );
+
+ const [prices] = await db.query(`
+ SELECT page, price
+ FROM inventory_page_prices
+ ORDER BY page
+ `);
+
+ res.json({
+ ownedPages: owned.map((p) => p.page),
+ prices: prices,
+ });
+ } catch (err) {
+ console.error(err);
+ res.status(500).json({ error: "DB Fehler" });
+ }
+});
+
+router.post("/buy-page", auth, async (req, res) => {
+ const userId = req.session.user.id;
+
+ try {
+ const [[maxPage]] = await db.query(
+ `
+ SELECT MAX(page) AS page
+ FROM user_inventory_pages
+ WHERE user_id = ?
+ `,
+ [userId],
+ );
+
+ const nextPage = (maxPage.page || 1) + 1;
+
+ const [[priceRow]] = await db.query(
+ `
+ SELECT price
+ FROM inventory_page_prices
+ WHERE page = ?
+ `,
+ [nextPage],
+ );
+
+ if (!priceRow) {
+ return res.json({ error: "Max Seiten erreicht" });
+ }
+
+ const price = priceRow.price;
+
+ const [[account]] = await db.query(
+ `
+ SELECT gold
+ FROM accounts
+ WHERE id = ?
+ `,
+ [userId],
+ );
+
+ if (account.gold < price) {
+ return res.json({ error: "Nicht genug Gold" });
+ }
+
+ await db.query(
+ `
+ UPDATE accounts
+ SET gold = gold - ?
+ WHERE id = ?
+ `,
+ [price, userId],
+ );
+
+ await db.query(
+ `
+ INSERT INTO user_inventory_pages (user_id,page)
+ VALUES (?,?)
+ `,
+ [userId, nextPage],
+ );
+
+ res.json({
+ success: true,
+ page: nextPage,
+ });
+ } catch (err) {
+ console.error(err);
+ res.status(500).json({ error: "DB Fehler" });
+ }
+});
+
module.exports = router;