dok/routes/arena.route.js
2026-04-09 08:53:51 +01:00

208 lines
5.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const express = require("express");
const router = express.Router();
const db = require("../database/database");
/* ========================
Login Middleware (lokal)
======================== */
function requireLogin(req, res, next) {
if (!req.session.user) {
return res.status(401).json({ error: "Nicht eingeloggt" });
}
next();
}
/* ========================
HELPER: Spieler-Stats laden
======================== */
async function getPlayerStats(userId) {
let hp = 20, mana = 3;
try {
const [[charStats]] = await db.query(
"SELECT hp, mana FROM characters WHERE account_id = ?",
[userId]
);
if (charStats) {
hp = charStats.hp || 20;
mana = charStats.mana || 3;
}
} catch {
// Tabelle existiert evtl. noch nicht Defaults verwenden
}
return { hp, mana };
}
/* ================================
Arena Übersicht
GET /arena
================================ */
router.get("/", (req, res) => {
res.render("arena", {
title: "Kampfarena",
});
});
/* ========================
GET /arena/me
Eigene Spielerdaten für Matchmaking
======================== */
router.get("/me", requireLogin, async (req, res) => {
try {
const [[account]] = await db.query(
"SELECT id, ingame_name, level FROM accounts WHERE id = ?",
[req.session.user.id]
);
if (!account) {
return res.status(404).json({ error: "Spieler nicht gefunden" });
}
res.json({
id: account.id,
name: account.ingame_name || "Unbekannter Held",
level: account.level || 1,
});
} catch (err) {
console.error("[Arena /me]", err);
res.status(500).json({ error: "Datenbankfehler" });
}
});
/* ================================
1v1 Spielfeld
GET /arena/1v1
================================ */
router.get("/1v1", requireLogin, async (req, res) => {
const userId = req.session.user.id;
const { match: matchId, slot } = req.query;
// Kein matchId → direkte Vorschau ohne Matchmaking (z.B. für Tests)
if (!matchId) {
return res.render("1v1-battlefield", {
title: "1v1 Kampf",
matchId: null,
mySlot: "player1",
player1: req.session?.user?.ingame_name || "Spieler 1",
player2: "Gegner",
player1hp: 20,
player1mana: 3,
player2hp: 20,
player2mana: 3,
});
}
try {
const [[me]] = await db.query("SELECT ingame_name FROM accounts WHERE id = ?", [userId]);
const { hp, mana } = await getPlayerStats(userId);
const isPlayer1 = slot === "player1";
res.render("1v1-battlefield", {
title: "⚔️ 1v1 Kampf",
matchId,
mySlot: slot || "player1",
player1: isPlayer1 ? (me?.ingame_name || "Du") : "Gegner",
player2: isPlayer1 ? "Gegner" : (me?.ingame_name || "Du"),
player1hp: isPlayer1 ? hp : 20,
player1mana: isPlayer1 ? mana : 3,
player2hp: isPlayer1 ? 20 : hp,
player2mana: isPlayer1 ? 3 : mana,
});
} catch (err) {
console.error("[Arena /1v1]", err);
res.status(500).send("Fehler beim Laden des Spielfelds.");
}
});
/* ================================
2v2 Spielfeld
GET /arena/2v2
================================ */
router.get("/2v2", requireLogin, async (req, res) => {
const userId = req.session.user.id;
const { match: matchId, slot } = req.query;
if (!matchId) {
return res.render("1v1-battlefield", {
title: "2v2 Kampf",
matchId: null,
mySlot: "team1_player1",
player1: req.session?.user?.ingame_name || "Spieler 1",
player2: "Gegner",
player1hp: 20,
player1mana: 3,
player2hp: 20,
player2mana: 3,
});
}
try {
const [[me]] = await db.query("SELECT ingame_name FROM accounts WHERE id = ?", [userId]);
const { hp, mana } = await getPlayerStats(userId);
res.render("1v1-battlefield", {
title: "⚔️ 2v2 Kampf",
matchId,
mySlot: slot || "team1_player1",
player1: me?.ingame_name || "Du",
player2: "Gegner",
player1hp: hp,
player1mana: mana,
player2hp: 20,
player2mana: 3,
});
} catch (err) {
console.error("[Arena /2v2]", err);
res.status(500).send("Fehler beim Laden des Spielfelds.");
}
});
/* ================================
4v4 Spielfeld
GET /arena/4v4
================================ */
router.get("/4v4", requireLogin, async (req, res) => {
const userId = req.session.user.id;
const { match: matchId, slot } = req.query;
if (!matchId) {
return res.render("1v1-battlefield", {
title: "4v4 Kampf",
matchId: null,
mySlot: "team1_player1",
player1: req.session?.user?.ingame_name || "Spieler 1",
player2: "Gegner",
player1hp: 20,
player1mana: 3,
player2hp: 20,
player2mana: 3,
});
}
try {
const [[me]] = await db.query("SELECT ingame_name FROM accounts WHERE id = ?", [userId]);
const { hp, mana } = await getPlayerStats(userId);
res.render("1v1-battlefield", {
title: "⚔️ 4v4 Kampf",
matchId,
mySlot: slot || "team1_player1",
player1: me?.ingame_name || "Du",
player2: "Gegner",
player1hp: hp,
player1mana: mana,
player2hp: 20,
player2mana: 3,
});
} catch (err) {
console.error("[Arena /4v4]", err);
res.status(500).send("Fehler beim Laden des Spielfelds.");
}
});
module.exports = router;