dok/routes/arena.route.js
2026-04-07 15:06:47 +01:00

161 lines
3.9 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();
}
/* ================================
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) => {
const userId = req.session.user.id;
try {
const [[account]] = await db.query(
"SELECT id, ingame_name, level FROM accounts WHERE id = ?",
[userId],
);
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?.character?.name || req.session?.user?.ingame_name || "Spieler 1",
player2: "Gegner",
player1hp: 20,
player1mana: 3,
player2hp: 20,
player2mana: 3,
});
}
try {
// Eigene Spielerdaten laden
const [[me]] = await db.query(
"SELECT ingame_name, level FROM accounts WHERE id = ?",
[userId],
);
// HP + Mana aus Charakter-Tabelle (falls vorhanden, sonst Defaults)
let myHp = 20;
let myMana = 3;
try {
const [[charStats]] = await db.query(
"SELECT hp, mana FROM characters WHERE account_id = ?",
[userId],
);
if (charStats) {
myHp = charStats.hp || 20;
myMana = charStats.mana || 3;
}
} catch {
// Tabelle existiert evtl. noch nicht Defaults verwenden
}
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 ? myHp : 20,
player1mana: isPlayer1 ? myMana : 3,
player2hp: isPlayer1 ? 20 : myHp,
player2mana: isPlayer1 ? 3 : myMana,
});
} catch (err) {
console.error("[Arena /1v1]", err);
res.status(500).send("Fehler beim Laden des Spielfelds.");
}
});
/* ================================
2v2 Spielfeld (Platzhalter)
GET /arena/2v2
================================ */
router.get("/2v2", (req, res) => {
res.render("1v1-battlefield", {
title: "2v2 Kampf",
matchId: null,
mySlot: "player1",
player1: req.session?.character?.name || "Spieler 1",
player2: "Gegner",
player1hp: 20,
player1mana: 3,
player2hp: 20,
player2mana: 3,
});
});
/* ================================
4v4 Spielfeld (Platzhalter)
GET /arena/4v4
================================ */
router.get("/4v4", (req, res) => {
res.render("1v1-battlefield", {
title: "4v4 Kampf",
matchId: null,
mySlot: "player1",
player1: req.session?.character?.name || "Spieler 1",
player2: "Gegner",
player1hp: 20,
player1mana: 3,
player2hp: 20,
player2mana: 3,
});
});
module.exports = router;