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
|
|
======================== */
|
|
|
|
/* 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.");
|
|
}
|
|
});
|
|
|
|
/* ================================
|
|
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;
|