dok/routes/arena.route.js
2026-04-14 06:53:49 +01:00

164 lines
4.3 KiB
JavaScript

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
======================== */
/* HP-Formel: 20 + (level-1)*2 | Level 1=20, Level 50=118 */
function calcAvatarHp(level) {
return 20 + (Math.max(1, Math.min(50, level || 1)) - 1) * 2;
}
async function getPlayerStats(userId) {
try {
const [[acc]] = await db.query(
"SELECT level FROM accounts WHERE id = ?",
[userId]
);
return { hp: calcAvatarHp(acc?.level ?? 1), mana: 3 };
} catch {
return { hp: 20, mana: 3 };
}
}
/* ================================
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.");
}
});
module.exports = router;