änderungen hud 7
This commit is contained in:
parent
8e71687799
commit
8211e56cb4
4
app.js
4
app.js
@ -165,7 +165,7 @@ app.get("/api/hud", requireLogin, async (req, res) => {
|
|||||||
[userId],
|
[userId],
|
||||||
);
|
);
|
||||||
const [[currency]] = await db.query(
|
const [[currency]] = await db.query(
|
||||||
"SELECT silver, gold, gems FROM account_currency WHERE account_id = ?",
|
"SELECT silver, gold, gems, wood, stone FROM account_currency WHERE account_id = ?",
|
||||||
[userId],
|
[userId],
|
||||||
);
|
);
|
||||||
res.json({
|
res.json({
|
||||||
@ -173,6 +173,8 @@ app.get("/api/hud", requireLogin, async (req, res) => {
|
|||||||
silver: currency?.silver || 0,
|
silver: currency?.silver || 0,
|
||||||
gold: currency?.gold || 0,
|
gold: currency?.gold || 0,
|
||||||
gems: currency?.gems || 0,
|
gems: currency?.gems || 0,
|
||||||
|
wood: currency?.wood || 0,
|
||||||
|
stone: currency?.stone || 0,
|
||||||
});
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
|
|||||||
@ -170,8 +170,8 @@
|
|||||||
|
|
||||||
#hud-currency {
|
#hud-currency {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
flex-direction: column;
|
||||||
gap: 8px;
|
gap: 4px;
|
||||||
|
|
||||||
background: linear-gradient(
|
background: linear-gradient(
|
||||||
135deg,
|
135deg,
|
||||||
@ -191,6 +191,12 @@
|
|||||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.7);
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hud-res-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Einzelne Währung */
|
/* Einzelne Währung */
|
||||||
|
|
||||||
.hud-res {
|
.hud-res {
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { showNotification } from "../notification.js";
|
import { showNotification } from "../notification.js";
|
||||||
|
import { refreshHud } from "../hud.js";
|
||||||
|
|
||||||
export async function loadMine(buildingId) {
|
export async function loadMine(buildingId) {
|
||||||
const actionsTab = document.getElementById("tab-actions");
|
const actionsTab = document.getElementById("tab-actions");
|
||||||
@ -22,49 +23,75 @@ async function renderMineStatus(buildingId) {
|
|||||||
const minutesLeft = Math.floor(data.next_cycle_in_seconds / 60);
|
const minutesLeft = Math.floor(data.next_cycle_in_seconds / 60);
|
||||||
const secondsLeft = data.next_cycle_in_seconds % 60;
|
const secondsLeft = data.next_cycle_in_seconds % 60;
|
||||||
|
|
||||||
const resourceRows = data.available.map((r) => {
|
const resourceRows = data.available
|
||||||
|
.map((r) => {
|
||||||
const icon = resourceIcon(r.resource);
|
const icon = resourceIcon(r.resource);
|
||||||
const label = resourceLabel(r.resource);
|
const label = resourceLabel(r.resource);
|
||||||
return (
|
return (
|
||||||
"<div class='mine-resource-row " + (data.ready ? "mine-resource-ready" : "") + "'>" +
|
"<div class='mine-resource-row " +
|
||||||
"<span class='mine-resource-icon'>" + icon + "</span>" +
|
(data.ready ? "mine-resource-ready" : "") +
|
||||||
"<span class='mine-resource-label'>" + label + "</span>" +
|
"'>" +
|
||||||
"<span class='mine-resource-amount'>" + r.amount + "</span>" +
|
"<span class='mine-resource-icon'>" +
|
||||||
|
icon +
|
||||||
|
"</span>" +
|
||||||
|
"<span class='mine-resource-label'>" +
|
||||||
|
label +
|
||||||
|
"</span>" +
|
||||||
|
"<span class='mine-resource-amount'>" +
|
||||||
|
r.amount +
|
||||||
|
"</span>" +
|
||||||
"</div>"
|
"</div>"
|
||||||
);
|
);
|
||||||
}).join("");
|
})
|
||||||
|
.join("");
|
||||||
|
|
||||||
actionsTab.innerHTML =
|
actionsTab.innerHTML =
|
||||||
"<div class='mine-panel'>" +
|
"<div class='mine-panel'>" +
|
||||||
"<div class='mine-header-row'>" +
|
"<div class='mine-header-row'>" +
|
||||||
"<span class='mine-level-badge'>Level " + data.level + "</span>" +
|
"<span class='mine-level-badge'>Level " +
|
||||||
"<span class='mine-cycles'>" + (data.cycles > 0 ? data.cycles + "x Zyklus abgeschlossen" : "Laeuft...") + "</span>" +
|
data.level +
|
||||||
|
"</span>" +
|
||||||
|
"<span class='mine-cycles'>" +
|
||||||
|
(data.cycles > 0 ? data.cycles + "x Zyklus abgeschlossen" : "Laeuft...") +
|
||||||
|
"</span>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class='mine-divider'></div>" +
|
"<div class='mine-divider'></div>" +
|
||||||
"<p class='mine-section-title'>Abgebaut</p>" +
|
"<p class='mine-section-title'>Abgebaut</p>" +
|
||||||
"<div class='mine-resources'>" + resourceRows + "</div>" +
|
"<div class='mine-resources'>" +
|
||||||
|
resourceRows +
|
||||||
|
"</div>" +
|
||||||
"<div class='mine-divider'></div>" +
|
"<div class='mine-divider'></div>" +
|
||||||
"<div class='mine-timer-row'>" +
|
"<div class='mine-timer-row'>" +
|
||||||
"<span class='mine-timer-label'>Naechster Zyklus in</span>" +
|
"<span class='mine-timer-label'>Naechster Zyklus in</span>" +
|
||||||
"<span class='mine-timer' id='mine-countdown' data-seconds='" + data.next_cycle_in_seconds + "'>" +
|
"<span class='mine-timer' id='mine-countdown' data-seconds='" +
|
||||||
minutesLeft + "m " + secondsLeft + "s" +
|
data.next_cycle_in_seconds +
|
||||||
|
"'>" +
|
||||||
|
minutesLeft +
|
||||||
|
"m " +
|
||||||
|
secondsLeft +
|
||||||
|
"s" +
|
||||||
"</span>" +
|
"</span>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"<div class='mine-actions'>" +
|
"<div class='mine-actions'>" +
|
||||||
"<button class='mine-btn-collect " + (data.ready ? "" : "mine-btn-disabled") + "'" +
|
"<button class='mine-btn-collect " +
|
||||||
|
(data.ready ? "" : "mine-btn-disabled") +
|
||||||
|
"'" +
|
||||||
" id='mine-collect-btn'" +
|
" id='mine-collect-btn'" +
|
||||||
" data-building='" + buildingId + "'" +
|
" data-building='" +
|
||||||
(data.ready ? "" : " disabled") + ">" +
|
buildingId +
|
||||||
|
"'" +
|
||||||
|
(data.ready ? "" : " disabled") +
|
||||||
|
">" +
|
||||||
(data.ready ? "Abholen" : "Noch nicht bereit") +
|
(data.ready ? "Abholen" : "Noch nicht bereit") +
|
||||||
"</button>" +
|
"</button>" +
|
||||||
"</div>" +
|
"</div>" +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
startCountdown(buildingId);
|
startCountdown(buildingId);
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("Mine Fehler:", err);
|
console.error("Mine Fehler:", err);
|
||||||
actionsTab.innerHTML = "<p class='mine-error'>Fehler beim Laden der Mineninfo.</p>";
|
actionsTab.innerHTML =
|
||||||
|
"<p class='mine-error'>Fehler beim Laden der Mineninfo.</p>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,32 +104,46 @@ document.addEventListener("click", async (e) => {
|
|||||||
btn.textContent = "Wird abgeholt...";
|
btn.textContent = "Wird abgeholt...";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await fetch("/api/mine/" + buildingId + "/collect", { method: "POST" });
|
const res = await fetch("/api/mine/" + buildingId + "/collect", {
|
||||||
|
method: "POST",
|
||||||
|
});
|
||||||
if (!res.ok) throw new Error("API Fehler");
|
if (!res.ok) throw new Error("API Fehler");
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
|
|
||||||
if (data.error) {
|
if (data.error) {
|
||||||
showNotification(
|
showNotification(
|
||||||
data.ready_in_display
|
data.ready_in_display
|
||||||
? "Die Mine ist noch nicht bereit.\nBereit in: " + data.ready_in_display
|
? "Die Mine ist noch nicht bereit.\nBereit in: " +
|
||||||
|
data.ready_in_display
|
||||||
: data.error,
|
: data.error,
|
||||||
"Mine",
|
"Mine",
|
||||||
"⛏️"
|
"⛏️",
|
||||||
);
|
);
|
||||||
await renderMineStatus(buildingId);
|
await renderMineStatus(buildingId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const lines = data.collected
|
const lines = data.collected
|
||||||
.map((c) => resourceIcon(c.resource) + " " + resourceLabel(c.resource) + ": +" + c.amount)
|
.map(
|
||||||
|
(c) =>
|
||||||
|
resourceIcon(c.resource) +
|
||||||
|
" " +
|
||||||
|
resourceLabel(c.resource) +
|
||||||
|
": +" +
|
||||||
|
c.amount,
|
||||||
|
)
|
||||||
.join("\n");
|
.join("\n");
|
||||||
|
|
||||||
showNotification("Erfolgreich abgeholt!\n\n" + lines, "Mine", "⛏️");
|
showNotification("Erfolgreich abgeholt!\n\n" + lines, "Mine", "⛏️");
|
||||||
await renderMineStatus(buildingId);
|
await renderMineStatus(buildingId);
|
||||||
|
await refreshHud();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("Abholen Fehler:", err);
|
console.error("Abholen Fehler:", err);
|
||||||
showNotification("Fehler beim Abholen. Bitte erneut versuchen.", "Fehler", "⚠️");
|
showNotification(
|
||||||
|
"Fehler beim Abholen. Bitte erneut versuchen.",
|
||||||
|
"Fehler",
|
||||||
|
"⚠️",
|
||||||
|
);
|
||||||
await renderMineStatus(buildingId);
|
await renderMineStatus(buildingId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -114,7 +155,10 @@ function startCountdown(buildingId) {
|
|||||||
|
|
||||||
countdownInterval = setInterval(() => {
|
countdownInterval = setInterval(() => {
|
||||||
const el = document.getElementById("mine-countdown");
|
const el = document.getElementById("mine-countdown");
|
||||||
if (!el) { clearInterval(countdownInterval); return; }
|
if (!el) {
|
||||||
|
clearInterval(countdownInterval);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let secs = parseInt(el.dataset.seconds, 10) - 1;
|
let secs = parseInt(el.dataset.seconds, 10) - 1;
|
||||||
if (secs < 0) secs = 0;
|
if (secs < 0) secs = 0;
|
||||||
@ -129,11 +173,25 @@ function startCountdown(buildingId) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function resourceIcon(resource) {
|
function resourceIcon(resource) {
|
||||||
const map = { gold: "🪙", copper: "🟤", silver: "⚪", iron: "⚙️", stone: "🪨", wood: "🪵" };
|
const map = {
|
||||||
|
gold: "🪙",
|
||||||
|
copper: "🟤",
|
||||||
|
silver: "⚪",
|
||||||
|
iron: "⚙️",
|
||||||
|
stone: "🪨",
|
||||||
|
wood: "🪵",
|
||||||
|
};
|
||||||
return map[resource] || "📦";
|
return map[resource] || "📦";
|
||||||
}
|
}
|
||||||
|
|
||||||
function resourceLabel(resource) {
|
function resourceLabel(resource) {
|
||||||
const map = { gold: "Gold", copper: "Kupfer", silver: "Silber", iron: "Eisen", stone: "Stein", wood: "Holz" };
|
const map = {
|
||||||
|
gold: "Gold",
|
||||||
|
copper: "Kupfer",
|
||||||
|
silver: "Silber",
|
||||||
|
iron: "Eisen",
|
||||||
|
stone: "Stein",
|
||||||
|
wood: "Holz",
|
||||||
|
};
|
||||||
return map[resource] || resource;
|
return map[resource] || resource;
|
||||||
}
|
}
|
||||||
@ -2,25 +2,47 @@
|
|||||||
HUD – Charakter & Währungsanzeige
|
HUD – Charakter & Währungsanzeige
|
||||||
================================ */
|
================================ */
|
||||||
|
|
||||||
export async function loadHud() {
|
async function fetchHud() {
|
||||||
try {
|
|
||||||
const res = await fetch("/api/hud");
|
const res = await fetch("/api/hud");
|
||||||
if (!res.ok) throw new Error("HUD API Fehler");
|
if (!res.ok) throw new Error("HUD API Fehler");
|
||||||
const data = await res.json();
|
return await res.json();
|
||||||
|
}
|
||||||
|
|
||||||
// Name
|
function applyHudData(data) {
|
||||||
document.getElementById("hud-name").textContent = data.name;
|
const set = (id, val) => {
|
||||||
|
const el = document.getElementById(id);
|
||||||
|
if (el) el.textContent = formatNumber(val);
|
||||||
|
};
|
||||||
|
|
||||||
// Währungen
|
const nameEl = document.getElementById("hud-name");
|
||||||
document.getElementById("hud-silver").textContent = formatNumber(data.silver);
|
if (nameEl) nameEl.textContent = data.name;
|
||||||
document.getElementById("hud-gold").textContent = formatNumber(data.gold);
|
|
||||||
document.getElementById("hud-gems").textContent = formatNumber(data.gems);
|
|
||||||
|
|
||||||
|
set("hud-silver", data.silver);
|
||||||
|
set("hud-gold", data.gold);
|
||||||
|
set("hud-gems", data.gems);
|
||||||
|
set("hud-wood", data.wood);
|
||||||
|
set("hud-stone", data.stone);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function loadHud() {
|
||||||
|
try {
|
||||||
|
const data = await fetchHud();
|
||||||
|
applyHudData(data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("HUD Fehler:", err);
|
console.error("HUD Fehler:", err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Wird von mine.js nach dem Abholen aufgerufen
|
||||||
|
export async function refreshHud() {
|
||||||
|
try {
|
||||||
|
const data = await fetchHud();
|
||||||
|
applyHudData(data);
|
||||||
|
} catch (err) {
|
||||||
|
console.error("HUD Refresh Fehler:", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function formatNumber(n) {
|
function formatNumber(n) {
|
||||||
if (n === undefined || n === null) return "0";
|
if (n === undefined || n === null) return "0";
|
||||||
return Number(n).toLocaleString("de-DE");
|
return Number(n).toLocaleString("de-DE");
|
||||||
|
|||||||
@ -287,6 +287,7 @@
|
|||||||
|
|
||||||
<!-- Währungs Panel -->
|
<!-- Währungs Panel -->
|
||||||
<div id="hud-currency">
|
<div id="hud-currency">
|
||||||
|
<div class="hud-res-row">
|
||||||
<div class="hud-res">
|
<div class="hud-res">
|
||||||
<span class="hud-res-icon">⚪</span>
|
<span class="hud-res-icon">⚪</span>
|
||||||
<span class="hud-res-value" id="hud-silver">0</span>
|
<span class="hud-res-value" id="hud-silver">0</span>
|
||||||
@ -303,6 +304,19 @@
|
|||||||
</div>
|
</div>
|
||||||
<button id="hud-gold-btn">Gold</button>
|
<button id="hud-gold-btn">Gold</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="hud-res-row">
|
||||||
|
<div class="hud-res">
|
||||||
|
<span class="hud-res-icon">🪵</span>
|
||||||
|
<span class="hud-res-value" id="hud-wood">0</span>
|
||||||
|
</div>
|
||||||
|
<div class="hud-sep"></div>
|
||||||
|
<div class="hud-res">
|
||||||
|
<span class="hud-res-icon">🪨</span>
|
||||||
|
<span class="hud-res-value" id="hud-stone">0</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- ================================
|
<!-- ================================
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user