diff --git a/public/js/buildings/arena.js b/public/js/buildings/arena.js index 510fd49..08989e8 100644 --- a/public/js/buildings/arena.js +++ b/public/js/buildings/arena.js @@ -1,4 +1,5 @@ -export async function loadArena() { +export async function loadArena(options = {}) { + const { dailyOnly = false, onMatchComplete = null } = options; const ui = document.querySelector(".building-ui"); ui.innerHTML = ` @@ -15,6 +16,7 @@ export async function loadArena() {
`;
+ if (!isFront) return `
`;
// image zuerst, dann icon als Fallback
const imgFile = card?.image || card?.icon || null;
- const img = imgFile
- ? `/images/cards/${imgFile}`
- : "/images/items/rueckseite.png";
+ const img = imgFile ? `/images/cards/${imgFile}` : "/images/items/rueckseite.png";
return `
-
+
`;
- body
- .querySelector(`#booster-slot-${i}`)
- .classList.remove("revealed", "spinning");
+ body.querySelector(`#booster-slot-${i}`).classList.remove("revealed", "spinning");
}
const stapel = body.querySelector("#booster-stapel");
stapel.classList.remove("used");
stapel.style.opacity = "1";
- stapel.style.cursor = "pointer";
+ stapel.style.cursor = "pointer";
body.querySelector("#booster-hint").textContent = "Klicken zum Öffnen";
preloadCards();
}
@@ -369,7 +334,7 @@ export async function loadEvents() {
/* ── Slot drehen – 350ms, damit man die Karten erkennt ── */
function startSpinSlot(index) {
slotLocked[index] = false;
- const slot = body.querySelector(`#booster-slot-${index}`);
+ const slot = body.querySelector(`#booster-slot-${index}`);
const inner = slot.querySelector(".booster-slot-inner");
slot.classList.add("spinning");
@@ -384,13 +349,13 @@ export async function loadEvents() {
/* ── Slot enthüllen – Sperre setzen BEVOR clearInterval ── */
function revealSlot(index, card) {
- slotLocked[index] = true; // zuerst sperren
+ slotLocked[index] = true; // zuerst sperren
clearInterval(spinIntervals[index]); // dann stoppen
delete spinIntervals[index];
console.log(`[Booster] Slot ${index} enthüllt:`, card);
- const slot = body.querySelector(`#booster-slot-${index}`);
+ const slot = body.querySelector(`#booster-slot-${index}`);
const inner = slot.querySelector(".booster-slot-inner");
slot.classList.remove("spinning");
slot.classList.add("revealed");
@@ -415,17 +380,17 @@ export async function loadEvents() {
const stapel = body.querySelector("#booster-stapel");
stapel.classList.add("used");
stapel.style.opacity = "0.35";
- stapel.style.cursor = "default";
+ stapel.style.cursor = "default";
body.querySelector("#booster-hint").textContent = "Wird gezogen...";
// Zurück-Button während der Animation sperren
const backBtn = body.querySelector("#booster-back-btn");
backBtn.style.opacity = "0.35";
- backBtn.style.cursor = "not-allowed";
+ backBtn.style.cursor = "not-allowed";
let drawnCards = [];
try {
- const res = await fetch("/api/booster/open", { method: "POST" });
+ const res = await fetch("/api/booster/open", { method: "POST" });
const text = await res.text();
console.log("[Booster] API Antwort raw:", text);
const data = JSON.parse(text);
@@ -444,37 +409,32 @@ export async function loadEvents() {
setTimeout(() => revealSlot(i, drawnCards[i]), (i + 1) * 5000);
}
- setTimeout(
- async () => {
- body.querySelector("#booster-hint").textContent =
- "Karten werden gespeichert...";
- isSpinning = false;
+ setTimeout(async () => {
+ body.querySelector("#booster-hint").textContent = "Karten werden gespeichert...";
+ isSpinning = false;
- // Karten in user_cards speichern
- try {
- const cardIds = drawnCards.map((c) => c.id);
- const saveRes = await fetch("/api/booster/save", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ cardIds }),
- });
- if (!saveRes.ok) throw new Error(saveRes.status);
- } catch (e) {
- console.error("Karten speichern fehlgeschlagen", e);
- }
+ // Karten in user_cards speichern
+ try {
+ const cardIds = drawnCards.map(c => c.id);
+ const saveRes = await fetch("/api/booster/save", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ cardIds }),
+ });
+ if (!saveRes.ok) throw new Error(saveRes.status);
+ } catch (e) {
+ console.error("Karten speichern fehlgeschlagen", e);
+ }
- // Booster-Daily als erledigt markieren (event_id = 1)
- await markDailyComplete(1);
+ // Booster-Daily als erledigt markieren (event_id = 1)
+ await markDailyComplete(1);
- allRevealed = true;
- body.querySelector("#booster-hint").textContent =
- "Alle Karten erhalten! ✓";
- const backBtn = body.querySelector("#booster-back-btn");
- backBtn.style.opacity = "1";
- backBtn.style.cursor = "pointer";
- },
- 5 * 5000 + 500,
- );
+ allRevealed = true;
+ body.querySelector("#booster-hint").textContent = "Alle Karten erhalten! ✓";
+ const backBtn = body.querySelector("#booster-back-btn");
+ backBtn.style.opacity = "1";
+ backBtn.style.cursor = "pointer";
+ }, 5 * 5000 + 500);
});
preloadCards();
@@ -482,19 +442,19 @@ export async function loadEvents() {
/* ================================
Holz-Spenden Zustand
================================ */
- let isWoodSpinning = false;
- let woodRevealed = false;
- let woodIntervals = {};
- let woodLocked = {};
- let rarity3Cards = [];
+ let isWoodSpinning = false;
+ let woodRevealed = false;
+ let woodIntervals = {};
+ let woodLocked = {};
+ let rarity3Cards = [];
async function preloadRarity3() {
if (rarity3Cards.length) return;
try {
const res = await fetch("/api/booster/cards");
if (!res.ok) throw new Error(res.status);
- const all = await res.json();
- rarity3Cards = all.filter((c) => parseInt(c.rarity) === 3);
+ const all = await res.json();
+ rarity3Cards = all.filter(c => parseInt(c.rarity) === 3);
// Fallback: wenn keine rarity-3 vorhanden alle nehmen
if (!rarity3Cards.length) rarity3Cards = all;
} catch (e) {
@@ -503,25 +463,25 @@ export async function loadEvents() {
}
function clearWoodIntervals() {
- Object.values(woodIntervals).forEach((id) => clearInterval(id));
+ Object.values(woodIntervals).forEach(id => clearInterval(id));
woodIntervals = {};
- woodLocked = {};
+ woodLocked = {};
}
function resetWood() {
clearWoodIntervals();
isWoodSpinning = false;
- woodRevealed = false;
+ woodRevealed = false;
const inner = body.querySelector(`#wood-slot-0 .booster-slot-inner`);
inner.innerHTML = `
`;
body.querySelector(`#wood-slot-0`).classList.remove("revealed", "spinning");
- const btn = body.querySelector("#wood-btn");
+ const btn = body.querySelector("#wood-btn");
const stamp = body.querySelector("#wood-stamp");
btn.classList.remove("used");
btn.style.opacity = "1";
- btn.style.cursor = "pointer";
+ btn.style.cursor = "pointer";
if (stamp) stamp.style.display = "";
body.querySelector("#wood-hint").textContent = "100 Holz spenden";
preloadRarity3();
@@ -529,7 +489,7 @@ export async function loadEvents() {
function startWoodSlot(index) {
woodLocked[index] = false;
- const slot = body.querySelector(`#wood-slot-${index}`);
+ const slot = body.querySelector(`#wood-slot-${index}`);
const inner = slot.querySelector(".booster-slot-inner");
slot.classList.add("spinning");
@@ -547,14 +507,13 @@ export async function loadEvents() {
clearInterval(woodIntervals[index]);
delete woodIntervals[index];
- const slot = body.querySelector(`#wood-slot-${index}`);
+ const slot = body.querySelector(`#wood-slot-${index}`);
const inner = slot.querySelector(".booster-slot-inner");
slot.classList.remove("spinning");
slot.classList.add("revealed");
inner.innerHTML = cardHTML(card, true);
setTimeout(() => {
- if (slot.classList.contains("revealed"))
- inner.innerHTML = cardHTML(card, true);
+ if (slot.classList.contains("revealed")) inner.innerHTML = cardHTML(card, true);
}, 100);
}
@@ -565,31 +524,31 @@ export async function loadEvents() {
isWoodSpinning = true;
- const btn = body.querySelector("#wood-btn");
+ const btn = body.querySelector("#wood-btn");
const stamp = body.querySelector("#wood-stamp");
btn.classList.add("used");
- btn.style.opacity = "0.35";
- btn.style.cursor = "default";
+ btn.style.opacity = "0.35";
+ btn.style.cursor = "default";
if (stamp) stamp.style.display = "none";
body.querySelector("#wood-hint").textContent = "Wird verarbeitet...";
const backBtn = body.querySelector("#wood-back-btn");
backBtn.style.opacity = "0.35";
- backBtn.style.cursor = "not-allowed";
+ backBtn.style.cursor = "not-allowed";
// API aufrufen – 100 Holz abziehen + Karte ziehen
let drawnCard = null;
try {
- const res = await fetch("/api/booster/wood-donate", { method: "POST" });
+ const res = await fetch("/api/booster/wood-donate", { method: "POST" });
const data = await res.json();
if (!res.ok) {
body.querySelector("#wood-hint").textContent = data.error || "Fehler";
isWoodSpinning = false;
btn.classList.remove("used");
btn.style.opacity = "1";
- btn.style.cursor = "pointer";
+ btn.style.cursor = "pointer";
backBtn.style.opacity = "1";
- backBtn.style.cursor = "pointer";
+ backBtn.style.cursor = "pointer";
return;
}
drawnCard = data.card;
@@ -608,12 +567,12 @@ export async function loadEvents() {
body.querySelector("#wood-hint").textContent = "Karte erhalten! ✓";
isWoodSpinning = false;
- woodRevealed = true;
+ woodRevealed = true;
markDailyComplete(4);
backBtn.style.opacity = "1";
- backBtn.style.cursor = "pointer";
+ backBtn.style.cursor = "pointer";
}, 5000);
});
@@ -623,30 +582,30 @@ export async function loadEvents() {
Gold-Spenden Zustand
================================ */
let isGoldSpinning = false;
- let goldRevealed = false;
- let goldIntervals = {};
- let goldLocked = {};
+ let goldRevealed = false;
+ let goldIntervals = {};
+ let goldLocked = {};
function clearGoldIntervals() {
- Object.values(goldIntervals).forEach((id) => clearInterval(id));
+ Object.values(goldIntervals).forEach(id => clearInterval(id));
goldIntervals = {};
- goldLocked = {};
+ goldLocked = {};
}
function resetGold() {
clearGoldIntervals();
isGoldSpinning = false;
- goldRevealed = false;
+ goldRevealed = false;
const inner = body.querySelector(`#gold-slot-0 .booster-slot-inner`);
inner.innerHTML = `
`;
body.querySelector(`#gold-slot-0`).classList.remove("revealed", "spinning");
- const btn = body.querySelector("#gold-btn");
+ const btn = body.querySelector("#gold-btn");
const stamp = body.querySelector("#gold-stamp");
btn.classList.remove("used");
btn.style.opacity = "1";
- btn.style.cursor = "pointer";
+ btn.style.cursor = "pointer";
if (stamp) stamp.style.display = "";
body.querySelector("#gold-hint").textContent = "100 Gold spenden";
preloadRarity3();
@@ -654,7 +613,7 @@ export async function loadEvents() {
function startGoldSlot(index) {
goldLocked[index] = false;
- const slot = body.querySelector(`#gold-slot-${index}`);
+ const slot = body.querySelector(`#gold-slot-${index}`);
const inner = slot.querySelector(".booster-slot-inner");
slot.classList.add("spinning");
@@ -672,14 +631,13 @@ export async function loadEvents() {
clearInterval(goldIntervals[index]);
delete goldIntervals[index];
- const slot = body.querySelector(`#gold-slot-${index}`);
+ const slot = body.querySelector(`#gold-slot-${index}`);
const inner = slot.querySelector(".booster-slot-inner");
slot.classList.remove("spinning");
slot.classList.add("revealed");
inner.innerHTML = cardHTML(card, true);
setTimeout(() => {
- if (slot.classList.contains("revealed"))
- inner.innerHTML = cardHTML(card, true);
+ if (slot.classList.contains("revealed")) inner.innerHTML = cardHTML(card, true);
}, 100);
}
@@ -690,31 +648,31 @@ export async function loadEvents() {
isGoldSpinning = true;
- const btn = body.querySelector("#gold-btn");
+ const btn = body.querySelector("#gold-btn");
const stamp = body.querySelector("#gold-stamp");
btn.classList.add("used");
- btn.style.opacity = "0.35";
- btn.style.cursor = "default";
+ btn.style.opacity = "0.35";
+ btn.style.cursor = "default";
if (stamp) stamp.style.display = "none";
body.querySelector("#gold-hint").textContent = "Wird verarbeitet...";
const backBtn = body.querySelector("#gold-back-btn");
backBtn.style.opacity = "0.35";
- backBtn.style.cursor = "not-allowed";
+ backBtn.style.cursor = "not-allowed";
let drawnCard = null;
try {
- const res = await fetch("/api/booster/gold-donate", { method: "POST" });
+ const res = await fetch("/api/booster/gold-donate", { method: "POST" });
const data = await res.json();
if (!res.ok) {
body.querySelector("#gold-hint").textContent = data.error || "Fehler";
isGoldSpinning = false;
btn.classList.remove("used");
btn.style.opacity = "1";
- btn.style.cursor = "pointer";
+ btn.style.cursor = "pointer";
if (stamp) stamp.style.display = "";
backBtn.style.opacity = "1";
- backBtn.style.cursor = "pointer";
+ backBtn.style.cursor = "pointer";
return;
}
drawnCard = data.card;
@@ -730,10 +688,10 @@ export async function loadEvents() {
revealGoldSlot(0, drawnCard);
body.querySelector("#gold-hint").textContent = "Karte erhalten! ✓";
isGoldSpinning = false;
- goldRevealed = true;
+ goldRevealed = true;
markDailyComplete(5);
backBtn.style.opacity = "1";
- backBtn.style.cursor = "pointer";
+ backBtn.style.cursor = "pointer";
}, 5000);
});
}