208 lines
5.5 KiB
JavaScript
208 lines
5.5 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
|
||
======================== */
|
||
|
||
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;
|