export async function loadWohnhaus() { const ui = document.querySelector(".building-ui"); ui.innerHTML = `
Helm
Schulter
Amulett
Handschuhe
Waffe
Gürtel
Schild
Ring
Ring
Stiefel

Inventar

`; await loadInventory(); await loadEquipment(); initDrag(); initSlotDrag(); initDrop(); initInventoryDrop(); } /* ================================ Equipment laden ================================ */ async function loadEquipment() { const res = await fetch("/api/equipment"); const equipment = await res.json(); equipment.forEach((item) => { if (!item.item_id) return; // ← WICHTIG const slot = document.querySelector('.slot[data-slot="' + item.slot + '"]'); if (!slot) return; const label = slot.querySelector(".slot-label"); slot.innerHTML = ` `; if (label) slot.appendChild(label); slot.classList.add("has-item"); }); } /* ================================ Inventar laden ================================ */ async function loadInventory() { const res = await fetch("/api/inventory"); const items = await res.json(); const grid = document.getElementById("inventory-grid"); let html = ""; /* feste 32 slots erzeugen */ const totalSlots = Math.max(32, items.length); for (let i = 0; i < totalSlots; i++) { const item = items[i]; if (item) { const icon = item.icon || "/images/items/default.png"; html += `
`; } else { html += `
`; } } grid.innerHTML = html; } /* ================================ Drag Inventar ================================ */ function initDrag() { document.querySelectorAll(".inventory-slot:not(.empty)").forEach((item) => { item.addEventListener("dragstart", (e) => { e.dataTransfer.setData("itemId", item.dataset.id); e.dataTransfer.setData("itemLevel", item.dataset.level); e.dataTransfer.setData("slot", item.dataset.slot); e.dataTransfer.setData("source", "inventory"); }); }); } /* ================================ Drag Slot ================================ */ function initSlotDrag() { document.querySelectorAll(".slot img").forEach((img) => { img.setAttribute("draggable", "true"); img.addEventListener("dragstart", (e) => { const slot = img.closest(".slot"); e.dataTransfer.setData("itemId", img.dataset.id); e.dataTransfer.setData("itemLevel", img.dataset.level); e.dataTransfer.setData("slot", slot.dataset.slot); e.dataTransfer.setData("source", "slot"); }); }); } /* ================================ Slot Drop ================================ */ function initDrop() { document.querySelectorAll(".slot").forEach((slot) => { slot.addEventListener("dragover", (e) => e.preventDefault()); slot.addEventListener("drop", (e) => { e.preventDefault(); const itemId = e.dataTransfer.getData("itemId"); const itemLevel = e.dataTransfer.getData("itemLevel"); const itemSlot = e.dataTransfer.getData("slot"); const source = e.dataTransfer.getData("source"); const targetSlot = slot.dataset.slot; if (!itemSlot || itemSlot !== targetSlot) return; /* Icon bestimmen */ let icon; if (source === "inventory") { const inventoryItem = document.querySelector( '.inventory-slot[data-id="' + itemId + '"]', ); if (!inventoryItem) return; icon = inventoryItem.querySelector("img").src; /* Slot leeren statt löschen */ inventoryItem.classList.add("empty"); inventoryItem.removeAttribute("data-id"); inventoryItem.removeAttribute("data-level"); inventoryItem.removeAttribute("data-slot"); inventoryItem.innerHTML = ""; } else { const slotItem = document.querySelector( '.slot[data-slot="' + itemSlot + '"] img', ); if (!slotItem) return; icon = slotItem.src; } /* vorhandenes Item zurück ins Inventar */ const existing = slot.querySelector("img"); if (existing) { const grid = document.getElementById("inventory-grid"); const emptySlot = grid.querySelector(".inventory-slot.empty"); if (emptySlot) { emptySlot.classList.remove("empty"); emptySlot.dataset.id = existing.dataset.id; emptySlot.dataset.level = existing.dataset.level; emptySlot.dataset.slot = existing.dataset.slot; emptySlot.setAttribute("draggable", "true"); emptySlot.innerHTML = ``; } } /* neues Item setzen */ const label = slot.querySelector(".slot-label"); slot.innerHTML = ` `; if (label) slot.appendChild(label); slot.classList.add("has-item"); initDrag(); initSlotDrag(); saveEquipment(targetSlot, itemId, itemLevel); }); }); } /* ================================ Drop ins Inventar ================================ */ function initInventoryDrop() { const grid = document.getElementById("inventory-grid"); grid.addEventListener("dragover", (e) => { e.preventDefault(); }); grid.addEventListener("drop", (e) => { e.preventDefault(); const source = e.dataTransfer.getData("source"); if (source !== "slot") return; const itemId = e.dataTransfer.getData("itemId"); const itemLevel = e.dataTransfer.getData("itemLevel"); const slotName = e.dataTransfer.getData("slot"); const slot = document.querySelector('.slot[data-slot="' + slotName + '"]'); if (!slot) return; const img = slot.querySelector("img"); if (!img) return; /* neues Inventar Item */ const newItem = document.createElement("div"); newItem.classList.add("inventory-slot"); newItem.setAttribute("draggable", "true"); newItem.dataset.id = itemId; newItem.dataset.level = itemLevel; newItem.dataset.slot = slotName; newItem.innerHTML = ``; const emptySlot = grid.querySelector(".inventory-slot.empty"); if (emptySlot) { emptySlot.classList.remove("empty"); emptySlot.dataset.id = itemId; emptySlot.dataset.level = itemLevel; emptySlot.dataset.slot = slotName; emptySlot.setAttribute("draggable", "true"); emptySlot.innerHTML = ``; } initDrag(); /* Slot leeren */ const label = slot.querySelector(".slot-label"); slot.innerHTML = ""; if (label) { slot.appendChild(label); } slot.classList.remove("has-item"); saveEquipment(slotName, null, null); /* Drag wieder aktivieren */ initDrag(); initSlotDrag(); }); } /* ================================ DB speichern ================================ */ async function saveEquipment(slot, itemId, itemLevelId) { await fetch("/api/equip", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ slot: slot, itemId: itemId, itemLevelId: itemLevelId, }), }); }