JustPaste
HomeCategoriesAboutDonateContactTerms of UsePrivacy Policy
JustPaste

Free online notepad — write and share instantly

Navigate

  • Home
  • Timeline
  • Categories

Info

  • About
  • Donate
  • Contact

Legal

  • Terms of Use
  • Privacy Policy

© 2026 JustPaste.app. All rights reserved.

Made with ♥ by JustPaste

Js | JustPaste.app
26 days ago9 views
👨‍💻Programming

Js

(function () {

    const setItemOriginale = Storage.prototype.setItem;

    Storage.prototype.setItem = function (chiave, valore) {

        if (chiave === "mergeCasaConsenso") {

            console.error(
                "🚨 QUALCUNO STA SCRIVENDO:",
                chiave,
                valore
            );

            console.trace();

            debugger;
        }

        return setItemOriginale.call(
            this,
            chiave,
            valore
        );
    };

})();

console.log("GAME.JS CARICATO");
console.log("TABELLONE:", document.getElementById("tabellone"));

const RIGHE = 9;
const COLONNE = 7;

let tabellone = [];
let rigaMerge = null;
let colonnaMerge = null;
let moltiplicatore = 1;
let energiaGiocatore = 100;

let moneteGiocatore = 0;
let diamantiGiocatore = 0;

let livelloGiocatore = 1;
let esperienzaGiocatore = 0;

let puntiOrdini = 0;
const PUNTI_ORDINI_RICHIESTI = 10;
let oggettiAcquistatiInSospeso = [];

let oggettiNelDeposito = [];

let celleDepositoSbloccate = 5;
let oggettoInRientroDalDeposito = null;

let premiInAttesa = 0;
const OGGETTI_PREMIO = 10;

const XP_PER_LIVELLO = 100;

let ristrutturazioni = {
    muri: 0,
    finestre: 0,
    porta: 0,
    arredamento: 0,
    esterno: 0
};

const costiRistrutturazione = [
    400,
    800,
    1200,
    1600,
    2000
];

let ordiniAttuali = [
    {
        oggetti: [
            {
                tipo: "pane",
                livello: 0
            },
            {
                tipo: "cola",
                livello: 0
            },
            {
                tipo: "tavolo",
                livello: 0
            }
        ],
        ricompensa: 100
    }
];

let ultimoAggiornamentoEnergia = Date.now();
const TEMPO_RICARICA_ENERGIA = 4 * 60 * 1000;

let livelliSbloccati = {
    pane: 3,
    cola: 3,
    tavolo: 3
};


// ================================
// OGGETTI
// ================================

const immaginiOggetti = {
    pane: [
        "immagini/pane/livello1.png",
        "immagini/pane/livello2.png",
        "immagini/pane/livello3.png",
        "immagini/pane/livello4.png",
        "immagini/pane/livello5.png",
        "immagini/pane/livello6.png",
        "immagini/pane/livello7.png"
    ]
};

const livelliOggetti = {

    pane: [
        "🌾", // 1 Farina
        "🥣", // 2 Impasto
        "🍞", // 3 Impasto cotto
        "🥖", // 4 Pane
        "🥪", // 5 Panino
        "🥪", // 6 Panino farcito
        "🥙", // 7 Tramezzino farcito
        "🥖", // 8 Baguette farcita
        "🍔", // 9 Hamburger
        "🍔"  // 10 Hamburger fast-food
    ],

    cola: [
        "💧", // 1 Bottiglietta d'acqua
        "🍋", // 2 Acqua al limone
        "🥤", // 3 Sciroppo
        "🥤", // 4 Bibita
        "🥤", // 5 Cola
        "🧃", // 6 Succo
        "🧋", // 7 Frappè
        "🥤", // 8 Bibita grande
        "🧋", // 9 Frappè gigante
        "🥤"  // 10 Maxi bibita fast-food
    ],

    tavolo: [
        "🪵", // 1 Asse di legno
        "🪚", // 2 Tavola
        "🦵", // 3 Gamba di mobile
        "🪑", // 4 Sgabello
        "🪑", // 5 Sedia
        "🪑", // 6 Sedia imbottita
        "🛋️", // 7 Poltrona
        "🛋️", // 8 Divanetto
        "🛋️", // 9 Divano
        "🛋️"  // 10 Divano di lusso
    ]

};


// ================================
// CREA OGGETTO
// ================================

function creaOggetto(tipo, livello) {

    return {
        tipo: tipo,
        livello: livello
    };
}


// ================================
// CREA TABELLONE
// ================================

// ================================
// GENERA OGGETTO IN UNA CASELLA LIBERA
// ================================

function animaOggettoDalGeneratore(
    tipo,
    livello,
    rigaDestinazione,
    colonnaDestinazione,
    elementoGeneratore
) {

    const cellaDestinazione =
        document.querySelector(
            `.cella[data-riga="${rigaDestinazione}"][data-colonna="${colonnaDestinazione}"]`
        );

    if (!cellaDestinazione) {
        return;
    }

    const posizione =
        elementoGeneratore.getBoundingClientRect();

    const clone =
        document.createElement("div");

    clone.className =
        "oggettoRientroDeposito";

if (
    immaginiOggetti[tipo] &&
    immaginiOggetti[tipo][livello]
) {

    clone.innerHTML = `
        <img
            src="${immaginiOggetti[tipo][livello]}"
            alt=""
        >
    `;

} else {

    clone.innerHTML =
        livelliOggetti[tipo]?.[livello] || "📦";
}

    clone.style.position = "fixed";

    clone.style.left =
        posizione.left +
        posizione.width / 2 +
        "px";

    clone.style.top =
        posizione.top +
        posizione.height / 2 +
        "px";

    clone.style.zIndex = "99999";
    clone.style.pointerEvents = "none";

    document.body.appendChild(clone);

    const destinazione =
        cellaDestinazione.getBoundingClientRect();

    requestAnimationFrame(() => {

        clone.style.left =
            destinazione.left +
            destinazione.width / 2 +
            "px";

        clone.style.top =
            destinazione.top +
            destinazione.height / 2 +
            "px";

        clone.style.transform =
            "translate(-50%, -50%) scale(.8)";
    });

    setTimeout(() => {

        clone.remove();

    }, 450);
}

function generaOggetto(tipoGeneratore = "generatorePane") {

    const caselleLibere = [];

    for (let riga = 0; riga < RIGHE; riga++) {

        for (let colonna = 0; colonna < COLONNE; colonna++) {

            if (tabellone[riga][colonna] === null) {

                caselleLibere.push({
                    riga: riga,
                    colonna: colonna
                });

            }
        }
    }

    if (caselleLibere.length === 0) {
        return false;
    }

    let tipo = "pane";

    if (tipoGeneratore === "generatoreBevanda") {
        tipo = "cola";
    }

    if (tipoGeneratore === "generatoreOggetto") {
        tipo = "tavolo";
    }

    let livello = 0;

    if (moltiplicatore === 2) {
        livello = 1;
    }

    if (moltiplicatore === 4) {
        livello = 2;
    }

    // Il livello richiesto deve essere sbloccato
    if (
        livello + 1 >
        livelliSbloccati[tipo]
    ) {
        return false;
    }

    // Controlla che il livello esista
    if (
        !livelliOggetti[tipo] ||
        livello >= livelliOggetti[tipo].length
    ) {
        return false;
    }

    const posizione =
        caselleLibere[
            Math.floor(
                Math.random() * caselleLibere.length
            )
        ];

    tabellone[posizione.riga][posizione.colonna] =
        creaOggetto(tipo, livello);

return {
    tipo: tipo,
    livello: livello,
    riga: posizione.riga,
    colonna: posizione.colonna
};
}

function impostaMoltiplicatore(valore) {

    moltiplicatore = valore;

    const bottone =
        document.getElementById("bottoneMoltiplicatore");

    if (bottone) {
        bottone.textContent = "X" + valore;
    }
}


function cambiaMoltiplicatore() {

    if (moltiplicatore === 1) {
        impostaMoltiplicatore(2);
    }

    else if (moltiplicatore === 2) {
        impostaMoltiplicatore(4);
    }

    else if (moltiplicatore === 4) {
        impostaMoltiplicatore(8);
    }

    else {
        impostaMoltiplicatore(1);
    }
}

function creaTabellone() {

    const area = document.getElementById("tabellone");

    if (!area) {
        console.error("ERRORE: #tabellone non trovato");
        return;
    }

    area.innerHTML = "";
    tabellone = [];

    for (let riga = 0; riga < RIGHE; riga++) {

        tabellone[riga] = [];

        for (let colonna = 0; colonna < COLONNE; colonna++) {

            tabellone[riga][colonna] = null;

            const cella = document.createElement("div");

            cella.className = "cella";

            cella.dataset.riga = riga;
            cella.dataset.colonna = colonna;

            area.appendChild(cella);
        }
    }

    tabellone[8][1] = {
        tipo: "generatorePane"
    };

    tabellone[8][3] = {
        tipo: "generatoreBevanda"
    };

    tabellone[8][5] = {
        tipo: "generatoreOggetto"
    };
}

function aggiornaCella(riga, colonna) {

    const cella = document.querySelector(
        `.cella[data-riga="${riga}"][data-colonna="${colonna}"]`
    );

    if (!cella) {
        return;
    }

    cella.innerHTML = "";

    const oggetto =
        tabellone[riga][colonna];

    if (!oggetto) {
        return;
    }

    const elemento =
        document.createElement("div");

    elemento.className = "oggetto";

    elemento.dataset.riga = riga;
    elemento.dataset.colonna = colonna;

    if (
        oggetto.tipo === "generatorePane" ||
        oggetto.tipo === "generatoreBevanda" ||
        oggetto.tipo === "generatoreOggetto"
    ) {

        elemento.classList.add("generatore");

        elemento.textContent =
            oggetto.tipo === "generatorePane"
                ? "🍞"
                : oggetto.tipo === "generatoreBevanda"
                    ? "🥤"
                    : "🪑";

    } else {

        if (
            immaginiOggetti[oggetto.tipo] &&
            immaginiOggetti[oggetto.tipo][oggetto.livello]
        ) {

elemento.innerHTML = `
    <img
        class="immagineOggettoTabellone"
        src="${immaginiOggetti[oggetto.tipo][oggetto.livello]}"
        alt=""
    >
`;

        } else {

            elemento.textContent =
                livelliOggetti[oggetto.tipo][oggetto.livello];
        }

        elemento.addEventListener(
            "click",
            function (event) {

                event.stopPropagation();

                mostraInfoOggetto(oggetto);
            }
        );
    }

    cella.appendChild(elemento);
    
    if (!oggetto.tipo.startsWith("generatore")) {

    elemento.addEventListener(
        "pointerdown",
        iniziaTrascinamento
    );

}
}

function mostraInfoOggetto(oggetto) {

    const vuoto =
        document.getElementById("dettagliVuoti");

    const area =
        document.getElementById("dettagliOggetto");

    if (
        !oggetto ||
        !livelliOggetti[oggetto.tipo]
    ) {
        vuoto.style.display = "block";
        area.style.display = "none";
        return;
    }

    const icona =
        livelliOggetti[
            oggetto.tipo
        ][
            oggetto.livello
        ];

    const nomiOggetti = {

        pane: [
            "Farina",
            "Impasto",
            "Impasto cotto",
            "Pane",
            "Panino",
            "Panino farcito",
            "Tramezzino farcito",
            "Baguette farcita",
            "Hamburger",
            "Hamburger fast-food"
        ],

        cola: [
            "Bottiglietta d'acqua",
            "Acqua al limone",
            "Sciroppo",
            "Bibita",
            "Cola",
            "Succo",
            "Frappè",
            "Bibita grande",
            "Frappè gigante",
            "Maxi bibita fast-food"
        ],

        tavolo: [
            "Asse di legno",
            "Tavola",
            "Gamba di mobile",
            "Sgabello",
            "Sedia",
            "Sedia imbottita",
            "Poltrona",
            "Divanetto",
            "Divano",
            "Divano di lusso"
        ]

    };

    const nome =
        nomiOggetti[
            oggetto.tipo
        ][
            oggetto.livello
        ];

    area.innerHTML = `

        <button
            class="infoBottone"
            onclick="apriCollezione('${oggetto.tipo}')"
        >
            ⓘ
        </button>

        <span class="infoIcona">
            ${icona}
        </span>

        <span class="infoNome">
            ${nome}
        </span>

        <span class="infoTipo">
            ${oggetto.tipo === "pane"
                ? "Pane"
                : oggetto.tipo === "cola"
                    ? "Bevande"
                    : "Casa"
            }
            (Liv. ${oggetto.livello + 1})
        </span>
    `;

    vuoto.style.display = "none";
    area.style.display = "flex";
}

function aggiornaTabellone() {

    const celle =
        document.querySelectorAll(".cella");

    celle.forEach(cella => {

        const riga =
            Number(cella.dataset.riga);

        const colonna =
            Number(cella.dataset.colonna);

        const oggetto =
            tabellone[riga][colonna];

while (cella.firstChild) {
    cella.removeChild(cella.firstChild);
}

        if (!oggetto) {
            return;
        }

        const elemento =
            document.createElement("div");

        elemento.className = "oggetto";


        // ================================
        // GENERATORI
        // ================================

        if (
            oggetto.tipo === "generatorePane" ||
            oggetto.tipo === "generatoreBevanda" ||
            oggetto.tipo === "generatoreOggetto"
        ) {

            elemento.classList.add("generatore");

        }


        // ================================
        // ASPETTO OGGETTO
        // ================================

        if (oggetto.tipo === "generatorePane") {

            elemento.textContent = "🍞";

        }

        else if (oggetto.tipo === "generatoreBevanda") {

            elemento.textContent = "🥤";

        }

        else if (oggetto.tipo === "generatoreOggetto") {

            elemento.textContent = "🪑";

        }

else {

    if (
        immaginiOggetti[oggetto.tipo] &&
        immaginiOggetti[oggetto.tipo][oggetto.livello]
    ) {

        elemento.innerHTML = `
            <img
                src="${immaginiOggetti[oggetto.tipo][oggetto.livello]}"
                alt=""
            >
        `;

    } else {

        elemento.textContent =
            livelliOggetti[
                oggetto.tipo
            ][
                oggetto.livello
            ];

    }

}


        // ================================
        // POSIZIONE
        // ================================

        elemento.dataset.riga = riga;
        elemento.dataset.colonna = colonna;


        // ================================
        // ANIMAZIONE MERGE
        // ================================

        if (
            riga === rigaMerge &&
            colonna === colonnaMerge
        ) {

            elemento.classList.add(
                "mergeAnimazione"
            );

        }


        cella.appendChild(elemento);
        
        if (
    !oggetto.tipo.startsWith("generatore")
) {

    elemento.addEventListener(
        "click",
        (event) => {

            event.stopPropagation();

            mostraInfoOggetto(oggetto);

        }
    );

}


        // ================================
        // GENERATORE PANE
        // ================================

if (
    oggetto.tipo === "generatorePane" ||
    oggetto.tipo === "generatoreBevanda" ||
    oggetto.tipo === "generatoreOggetto"
) {

    elemento.addEventListener(
        "click",
        () => {

            if (
                energiaGiocatore <
                moltiplicatore
            ) {
                return;
            }

            const generato =
                generaOggetto(oggetto.tipo);

            if (!generato) {
                return;
            }

            energiaGiocatore -=
                moltiplicatore;

            document
                .getElementById("energiaValore")
                .textContent =
                    energiaGiocatore;

animaOggettoDalGeneratore(
    generato.tipo,
    generato.livello,
    generato.riga,
    generato.colonna,
    elemento
);

setTimeout(() => {

    aggiornaTabellone();
    salvaPartita();

}, 450);
        }
    );
}

    });

    attivaTrascinamento();
}

function attivaTrascinamento() {

    const oggetti =
        document.querySelectorAll(".oggetto");

    oggetti.forEach(oggetto => {

        oggetto.addEventListener(
            "pointerdown",
            iniziaTrascinamento
        );
    });
}


let oggettoTrascinato = null;
let elementoTrascinamentoVisuale = null;
let rigaPartenza = null;
let colonnaPartenza = null;

let oggettoSpostato = false;


// ================================
// INIZIO DRAG
// ================================

function iniziaTrascinamento(event) {

    event.preventDefault();

    oggettoSpostato = false;

    oggettoTrascinato =
        event.currentTarget;

    rigaPartenza =
        Number(
            oggettoTrascinato.dataset.riga
        );

    colonnaPartenza =
        Number(
            oggettoTrascinato.dataset.colonna
        );

    oggettoTrascinato.setPointerCapture(
        event.pointerId
    );

    const rettangolo =
        oggettoTrascinato.getBoundingClientRect();

elementoTrascinamentoVisuale =
    document.createElement("div");

elementoTrascinamentoVisuale.className =
    "cloneTrascinamento";

elementoTrascinamentoVisuale.innerHTML =
    oggettoTrascinato.innerHTML;

    elementoTrascinamentoVisuale.style.position =
        "fixed";

    elementoTrascinamentoVisuale.style.width =
        rettangolo.width + "px";

    elementoTrascinamentoVisuale.style.height =
        rettangolo.height + "px";

    elementoTrascinamentoVisuale.style.left =
        event.clientX + "px";

    elementoTrascinamentoVisuale.style.top =
        event.clientY + "px";

elementoTrascinamentoVisuale.style.transform =
    "translate(-50%, -50%)";

    elementoTrascinamentoVisuale.style.zIndex =
        "99999";

    elementoTrascinamentoVisuale.style.pointerEvents =
        "none";

    document.body.appendChild(
        elementoTrascinamentoVisuale
    );

oggettoTrascinato.style.opacity =
    "0";

    oggettoTrascinato.addEventListener(
        "pointermove",
        trascinaOggetto
    );

    oggettoTrascinato.addEventListener(
        "pointerup",
        terminaTrascinamento,
        { once: true }
    );
}

function trascinaOggetto(event) {

    if (!oggettoTrascinato) {
        return;
    }

    oggettoSpostato = true;

    if (elementoTrascinamentoVisuale) {

        elementoTrascinamentoVisuale.style.left =
            event.clientX + "px";

        elementoTrascinamentoVisuale.style.top =
            event.clientY + "px";
    }

    const ora = performance.now();

    if (
        trascinaOggetto.ultimoAggiornamento &&
        ora - trascinaOggetto.ultimoAggiornamento < 16
    ) {
        return;
    }

    trascinaOggetto.ultimoAggiornamento = ora;

    const elemento =
        document.elementFromPoint(
            event.clientX,
            event.clientY
        );

    const cella =
        elemento?.closest(".cella");

    const cellaPrecedente =
        document.querySelector(
            ".cella.evidenziata"
        );

    if (
        cellaPrecedente &&
        cellaPrecedente !== cella
    ) {
        cellaPrecedente.classList.remove(
            "evidenziata"
        );
    }

    if (cella) {
        cella.classList.add(
            "evidenziata"
        );
    }
}


// ================================
// TROVA CASELLA ADIACENTE
// ================================

function trovaCasellaAdiacente(
    riga,
    colonna
) {

    const direzioni = [

        // destra
        [0, 1],

        // sinistra
        [0, -1],

        // sotto
        [1, 0],

        // sopra
        [-1, 0],

        // diagonali
        [1, 1],
        [1, -1],
        [-1, 1],
        [-1, -1]
    ];

    for (const [dr, dc] of direzioni) {

        const nuovaRiga =
            riga + dr;

        const nuovaColonna =
            colonna + dc;

        if (
            nuovaRiga >= 0 &&
            nuovaRiga < RIGHE &&
            nuovaColonna >= 0 &&
            nuovaColonna < COLONNE
        ) {

            if (
                tabellone[nuovaRiga][nuovaColonna]
                === null
            ) {

                return {
                    riga: nuovaRiga,
                    colonna: nuovaColonna
                };
            }
        }
    }

    return null;
}


// ================================
// ESEGUI MERGE
// ================================

function eseguiMerge(
    rigaPartenza,
    colonnaPartenza,
    rigaDestinazione,
    colonnaDestinazione
) {

    const primo =
        tabellone[rigaPartenza][colonnaPartenza];

    const secondo =
        tabellone[rigaDestinazione][colonnaDestinazione];

    if (!primo || !secondo) {
        return false;
    }

    // Stesso tipo
    if (primo.tipo !== secondo.tipo) {
        return false;
    }

    // Stesso livello
    if (primo.livello !== secondo.livello) {
        return false;
    }

    // Livello massimo
    if (
        primo.livello >=
        livelliOggetti[primo.tipo].length - 1
    ) {
        return false;
    }

    // Salva la posizione del merge
    rigaMerge = rigaDestinazione;
    colonnaMerge = colonnaDestinazione;

    // Nuovo livello
    const nuovoLivello =
        primo.livello + 1;
        
        // Sblocca il nuovo livello
if (
    livelliSbloccati[primo.tipo] <
    nuovoLivello + 1
) {
    livelliSbloccati[primo.tipo] =
        nuovoLivello + 1;
}

    // I due oggetti spariscono
    tabellone[rigaPartenza][colonnaPartenza] =
        null;

    tabellone[rigaDestinazione][colonnaDestinazione] =
        null;

    // Il nuovo oggetto nasce nella destinazione
tabellone[rigaDestinazione][colonnaDestinazione] =
    creaOggetto(
        primo.tipo,
        nuovoLivello
    );

controllaPremiInAttesa();

return true;
}

function terminaTrascinamento(event) {

    if (elementoTrascinamentoVisuale) {

        elementoTrascinamentoVisuale.remove();

        elementoTrascinamentoVisuale = null;
    }

    if (!oggettoTrascinato) {
        return;
    }

    if (!oggettoSpostato) {

        oggettoTrascinato.style.transform =
            "scale(1)";

        oggettoTrascinato.style.opacity =
            "1";

        oggettoTrascinato = null;

        return;
    }

    const elemento =
        document.elementFromPoint(
            event.clientX,
            event.clientY
        );

    // =========================================
    // DEPOSITO
    // =========================================

    const pulsanteDeposito =
        elemento?.closest("#pulsanteDeposito");

    if (pulsanteDeposito) {

        if (
            oggettiNelDeposito.length >=
            celleDepositoSbloccate
        ) {

            alert(
                "Il deposito è pieno."
            );

            oggettoTrascinato.style.opacity =
                "1";

            oggettoTrascinato = null;

            return;
        }

        const oggetto =
            tabellone[
                rigaPartenza
            ][
                colonnaPartenza
            ];

        if (oggetto) {

            oggettiNelDeposito.push(
                oggetto
            );

            tabellone[
                rigaPartenza
            ][
                colonnaPartenza
            ] = null;

            aggiornaTabellone();

            aggiornaDeposito();

            salvaPartita();
        }

        oggettoTrascinato.style.opacity =
            "1";

        oggettoTrascinato = null;

        return;
    }

    // =========================================
    // TABELLONE
    // =========================================

    const cella =
        elemento?.closest(".cella");

const cellaEvidenziata =
    document.querySelector(
        ".cella.evidenziata"
    );

if (cellaEvidenziata) {
    cellaEvidenziata.classList.remove(
        "evidenziata"
    );
}

    oggettoTrascinato.style.transform =
        "scale(1)";

    if (cella) {

        const nuovaRiga =
            Number(cella.dataset.riga);

        const nuovaColonna =
            Number(cella.dataset.colonna);

        // Tornato nella casella di partenza
        if (
            nuovaRiga === rigaPartenza &&
            nuovaColonna === colonnaPartenza
        ) {

            oggettoTrascinato.style.opacity =
                "1";

            oggettoTrascinato = null;

            return;
        }

        const destinazione =
            tabellone[
                nuovaRiga
            ][
                nuovaColonna
            ];

        // CASELLA VUOTA
        if (!destinazione) {

            tabellone[
                nuovaRiga
            ][
                nuovaColonna
            ] =
                tabellone[
                    rigaPartenza
                ][
                    colonnaPartenza
                ];

            tabellone[
                rigaPartenza
            ][
                colonnaPartenza
            ] = null;

aggiornaCella(
    rigaPartenza,
    colonnaPartenza
);

aggiornaCella(
    nuovaRiga,
    nuovaColonna
);

            salvaPartita();
        }

        // CASELLA CON OGGETTO
        else {

            const merge =
                eseguiMerge(
                    rigaPartenza,
                    colonnaPartenza,
                    nuovaRiga,
                    nuovaColonna
                );

if (merge) {

    aggiornaCella(
        rigaPartenza,
        colonnaPartenza
    );

    aggiornaCella(
        nuovaRiga,
        nuovaColonna
    );

    salvaPartita();

} else {

                // SCAMBIO DEI DUE OGGETTI

                const oggettoPartenza =
                    tabellone[
                        rigaPartenza
                    ][
                        colonnaPartenza
                    ];

                const oggettoDestinazione =
                    tabellone[
                        nuovaRiga
                    ][
                        nuovaColonna
                    ];

                tabellone[
                    rigaPartenza
                ][
                    colonnaPartenza
                ] =
                    oggettoDestinazione;

                tabellone[
                    nuovaRiga
                ][
                    nuovaColonna
                ] =
                    oggettoPartenza;

aggiornaCella(
    rigaPartenza,
    colonnaPartenza
);

aggiornaCella(
    nuovaRiga,
    nuovaColonna
);

                salvaPartita();
            }
        }
    }

    oggettoTrascinato.style.opacity =
        "1";

    oggettoTrascinato = null;
}

function apriCollezione(tipo) {

    const nomi = {

        pane: [
            "Farina",
            "Impasto",
            "Impasto cotto",
            "Pane",
            "Panino",
            "Panino farcito",
            "Tramezzino farcito",
            "Baguette farcita",
            "Hamburger",
            "Hamburger fast-food"
        ],

        cola: [
            "Bottiglietta d'acqua",
            "Acqua al limone",
            "Sciroppo",
            "Bibita",
            "Cola",
            "Succo",
            "Frappè",
            "Bibita grande",
            "Frappè gigante",
            "Maxi bibita fast-food"
        ],

        tavolo: [
            "Asse di legno",
            "Tavola",
            "Gamba di mobile",
            "Sgabello",
            "Sedia",
            "Sedia imbottita",
            "Poltrona",
            "Divanetto",
            "Divano",
            "Divano di lusso"
        ]

    };

    const icone =
        livelliOggetti[tipo];

    const sbloccati =
        livelliSbloccati[tipo];

    let contenuto = "";

for (let i = 0; i < 10; i++) {

    if (i < sbloccati) {

        contenuto += `
            <div class="casellaCollezione">
                <div class="oggettoCollezione">
                    ${icone[i]}
                </div>
                <div class="livelloCollezione">
                    Liv. ${i + 1}
                </div>
                <div class="nomeCollezione">
                    ${nomi[tipo][i]}
                </div>
            </div>
        `;

    } else {

        contenuto += `
            <div class="casellaCollezione bloccata">
                <div class="oggettoCollezione">
                    ?
                </div>
                <div class="livelloCollezione">
                    Liv. ${i + 1}
                </div>
                <div class="nomeCollezione">
                    ?
                </div>
            </div>
        `;

    }
}

    document.getElementById("infoOggetto").innerHTML = `
        <div class="collezione">

            <button
                class="chiudiCollezione"
                onclick="chiudiCollezione()"
            >
                ✕
            </button>

<h2>
    ${
        tipo === "pane"
            ? "PANE"
            : tipo === "cola"
                ? "BEVANDE"
                : "CASA"
    }
</h2>

            <div class="listaCollezione">
                ${contenuto}
            </div>

        </div>
    `;

    document.getElementById("infoOggetto").style.display = "block";
}


function chiudiCollezione() {

    document.getElementById("infoOggetto").style.display =
        "none";
}

function aggiornaMonete() {
    document.getElementById(
        "moneteValorePrincipali"
    ).textContent = moneteGiocatore;

    document.getElementById(
        "moneteValore"
    ).textContent = moneteGiocatore;
}

function aggiornaDiamanti() {

    const elemento =
        document.getElementById(
            "diamantiValore"
        );

    if (elemento) {
        elemento.textContent =
            diamantiGiocatore;
    }
}

function aggiornaPuntiOrdini() {

    const elemento = document.getElementById("puntiOrdini");

    if (!elemento) return;

    elemento.textContent =
        puntiOrdini +
        " / " +
        PUNTI_ORDINI_RICHIESTI;
}

function generaPremioOrdini() {

    let generati = 0;

    const tipi = [
        "pane",
        "cola",
        "tavolo"
    ];

    for (
        let riga = 0;
        riga < RIGHE;
        riga++
    ) {

        for (
            let colonna = 0;
            colonna < COLONNE;
            colonna++
        ) {

            if (
                tabellone[riga][colonna] === null
            ) {

                const tipo =
                    tipi[
                        Math.floor(
                            Math.random() *
                            tipi.length
                        )
                    ];

                const livelloMassimo =
                    Math.min(
                        2,
                        livelliSbloccati[tipo] - 1
                    );

                const livello =
                    Math.floor(
                        Math.random() *
                        (livelloMassimo + 1)
                    );

                tabellone[riga][colonna] =
                    creaOggetto(
                        tipo,
                        livello
                    );

                generati++;

                if (
                    generati ===
                    OGGETTI_PREMIO
                ) {
                    return;
                }
            }
        }
    }

    premiInAttesa =
        OGGETTI_PREMIO -
        generati;
}

function controllaPremiInAttesa() {

    if (premiInAttesa <= 0) {
        return;
    }

    let spazioTrovato = false;

    for (
        let riga = 0;
        riga < RIGHE;
        riga++
    ) {

        for (
            let colonna = 0;
            colonna < COLONNE;
            colonna++
        ) {

            if (
                tabellone[riga][colonna] === null
            ) {

                const tipi = [
                    "pane",
                    "cola",
                    "tavolo"
                ];

                const tipo =
                    tipi[
                        Math.floor(
                            Math.random() *
                            tipi.length
                        )
                    ];

                const livelloMassimo =
                    Math.min(
                        2,
                        livelliSbloccati[tipo] - 1
                    );

                const livello =
                    Math.floor(
                        Math.random() *
                        (livelloMassimo + 1)
                    );

                tabellone[riga][colonna] =
                    creaOggetto(
                        tipo,
                        livello
                    );

                premiInAttesa--;

                spazioTrovato = true;

                if (
                    premiInAttesa <= 0
                ) {
                    break;
                }
            }
        }

        if (
            premiInAttesa <= 0
        ) {
            break;
        }
    }

    if (spazioTrovato) {
        aggiornaTabellone();
        salvaPartita();
    }
}

function aggiornaEsperienza() {

    const percentuale =
        Math.min(
            100,
            (esperienzaGiocatore / XP_PER_LIVELLO) * 100
        );

    const progresso =
        document.getElementById("xpProgressione");

    const testo =
        document.getElementById("testoXP");

    if (progresso) {
        progresso.style.width =
            percentuale + "%";
    }

    if (testo) {
        testo.textContent =
            esperienzaGiocatore +
            " / " +
            XP_PER_LIVELLO +
            " XP";
    }

    /* CORNICE XP */

    const livello =
        document.getElementById("livello");

    if (livello) {
        livello.style.setProperty(
            "--percentuale-xp",
            percentuale + "%"
        );
    }

    const numeroLivello =
        document.getElementById("numeroLivello");

    if (numeroLivello) {
        numeroLivello.textContent =
            "LIV. " + livelloGiocatore;
    }
}

function salvaPartita() {
  
  console.log(
    "TABELLONE PRIMA DEL SALVATAGGIO:",
    tabellone
);

    const dati = {

        tabellone: tabellone,
        livelliSbloccati: livelliSbloccati,

        energia: energiaGiocatore,
        ultimoAggiornamentoEnergia:
            ultimoAggiornamentoEnergia,

        monete: moneteGiocatore,
        diamanti: diamantiGiocatore,

        livelloGiocatore: livelloGiocatore,
        esperienzaGiocatore: esperienzaGiocatore,

        puntiOrdini: puntiOrdini,
        premiInAttesa: premiInAttesa,

        ordiniAttuali: ordiniAttuali,

ristrutturazioni: ristrutturazioni,
oggettiAcquistatiInSospeso: oggettiAcquistatiInSospeso,
oggettiNelDeposito: oggettiNelDeposito,
celleDepositoSbloccate: celleDepositoSbloccate
    };

    localStorage.setItem(
        "mergeCasaSalvataggio",
        JSON.stringify(dati)
    );
    
    console.log(
    "SALVATAGGIO TABELLONE:",
    JSON.stringify(tabellone)
);
}

function caricaPartita() {

    const salvataggio =
        localStorage.getItem(
            "mergeCasaSalvataggio"
        );

    if (!salvataggio) return false;

    const dati =
        JSON.parse(salvataggio);
        
        oggettiAcquistatiInSospeso =
    dati.oggettiAcquistatiInSospeso || [];
    oggettiNelDeposito =
    dati.oggettiNelDeposito || [];
    celleDepositoSbloccate =
    dati.celleDepositoSbloccate || 5;

if (
    dati.tabellone &&
    Array.isArray(dati.tabellone) &&
    dati.tabellone.length === RIGHE &&
    dati.tabellone.some(
        riga => riga.some(
            cella => cella !== null
        )
    )
) {
    tabellone = dati.tabellone;
} else {
    creaTabellone();
}

tabellone[8][1] = {
    tipo: "generatorePane"
};

tabellone[8][3] = {
    tipo: "generatoreBevanda"
};

tabellone[8][5] = {
    tipo: "generatoreOggetto"
};

    livelliSbloccati =
        dati.livelliSbloccati;

    energiaGiocatore =
        dati.energia;

    ultimoAggiornamentoEnergia =
        dati.ultimoAggiornamentoEnergia ||
        Date.now();

    moneteGiocatore =
        dati.monete || 0;
        
        diamantiGiocatore =
    dati.diamanti || 0;

document.getElementById(
    "diamantiValore"
).textContent =
    diamantiGiocatore;

    livelloGiocatore =
        dati.livelloGiocatore || 1;

    esperienzaGiocatore =
        dati.esperienzaGiocatore || 0;

    puntiOrdini =
        dati.puntiOrdini || 0;

    premiInAttesa =
        dati.premiInAttesa || 0;

if (
    dati.ordiniAttuali &&
    dati.ordiniAttuali.length > 0 &&
    dati.ordiniAttuali[0].oggetti
) {
    ordiniAttuali =
        dati.ordiniAttuali;
}

    ristrutturazioni =
        dati.ristrutturazioni || {
            muri: 0,
            finestre: 0,
            porta: 0,
            arredamento: 0,
            esterno: 0
        };

    aggiornaMonete();
    aggiornaEsperienza();
    aggiornaPuntiOrdini();
    aggiornaOrdine();

    document.getElementById(
        "energiaValore"
    ).textContent =
        energiaGiocatore;
        
        aggiornaOggettiAcquistatiNelSlot();

    return true;
}

function aggiornaOrdine() {

    const area =
        document.getElementById("ordiniNelSlot");

    if (!area) return;

    area.innerHTML = "";

    ordiniAttuali.forEach(
        function(ordine, indice) {

            const card =
                document.createElement("div");

            card.className =
                "ordineNelSlot";

            const oggetti =
                ordine.oggetti || [];

            const immaginiOrdine =
                oggetti.map(
                    function(oggetto) {

                        const immagine =
                            immaginiOggetti[
                                oggetto.tipo
                            ]?.[
                                oggetto.livello
                            ];

                        const presente =
                            tabellone.some(
                                riga =>
                                    riga.some(
                                        cella =>
                                            cella &&
                                            cella.tipo === oggetto.tipo &&
                                            cella.livello === oggetto.livello
                                    )
                            );

                        return `
                            <div class="oggettoOrdine">

                                ${
                                    immagine
                                        ? `
                                            <img
                                                src="${immagine}"
                                                alt=""
                                            >
                                        `
                                        : `
                                            <span>
                                                ${
                                                    livelliOggetti[
                                                        oggetto.tipo
                                                    ][
                                                        oggetto.livello
                                                    ]
                                                }
                                            </span>
                                        `
                                }

                                ${
                                    presente
                                        ? `
                                            <span class="spuntaOrdine">
                                                ✓
                                            </span>
                                        `
                                        : ""
                                }

                            </div>
                        `;
                    }
                ).join("");

            const tuttiPresenti =
                oggetti.length === 3 &&
                oggetti.every(
                    function(oggetto) {

                        return tabellone.some(
                            riga =>
                                riga.some(
                                    cella =>
                                        cella &&
                                        cella.tipo === oggetto.tipo &&
                                        cella.livello === oggetto.livello
                                )
                        );

                    }
                );

            card.innerHTML = `

                <div class="ordineOggetti">
                    ${immaginiOrdine}
                </div>

                ${
                    tuttiPresenti
                        ? `
                            <button
                                onclick="consegnaOrdine(${indice})"
                            >
                                SERVI
                            </button>
                        `
                        : ""
                }

            `;

            area.appendChild(card);
        }
    );
}

function generaNuovoOrdine() {

    const tipi = [
        "pane",
        "cola",
        "tavolo"
    ];

    const oggetti = [];

    for (let i = 0; i < 3; i++) {

        const tipo =
            tipi[
                Math.floor(
                    Math.random() * tipi.length
                )
            ];

        const livelloMassimo =
            Math.min(
                2,
                livelliSbloccati[tipo] - 1
            );

        const livello =
            Math.floor(
                Math.random() *
                (livelloMassimo + 1)
            );

        oggetti.push({
            tipo: tipo,
            livello: livello
        });
    }

    return {
        oggetti: oggetti,
        ricompensa: 100
    };
}

while (ordiniAttuali.length < 5) {
    ordiniAttuali.push(generaNuovoOrdine());
}

function consegnaOrdine(indiceOrdine) {

    const ordine =
        ordiniAttuali[indiceOrdine];

    if (!ordine || !ordine.oggetti) {
        return;
    }

    const posizioniDaRimuovere = [];

    // Cerca ogni oggetto richiesto
    for (const richiesto of ordine.oggetti) {

        let trovato = false;

        for (let riga = 0; riga < RIGHE && !trovato; riga++) {

            for (
                let colonna = 0;
                colonna < COLONNE;
                colonna++
            ) {

                const oggetto =
                    tabellone[riga][colonna];

                if (
                    oggetto &&
                    oggetto.tipo === richiesto.tipo &&
                    oggetto.livello === richiesto.livello
                ) {

                    // Evita di usare due volte
                    // la stessa casella
                    const giaUsata =
                        posizioniDaRimuovere.some(
                            posizione =>
                                posizione.riga === riga &&
                                posizione.colonna === colonna
                        );

                    if (!giaUsata) {

                        posizioniDaRimuovere.push({
                            riga: riga,
                            colonna: colonna
                        });

                        trovato = true;
                        break;
                    }
                }
            }
        }

        // Se manca anche un solo oggetto,
        // l'ordine non può essere servito
        if (!trovato) {

            alert(
                "Ti mancano uno o più oggetti richiesti!"
            );

            return;
        }
    }

    // ================================
    // RIMUOVE I 3 OGGETTI
    // ================================

    posizioniDaRimuovere.forEach(
        function(posizione) {

            tabellone[
                posizione.riga
            ][
                posizione.colonna
            ] = null;

        }
    );

    // ================================
    // RICOMPENSA
    // ================================

    const ricompensaOttenuta =
        ordine.ricompensa || 0;

    moneteGiocatore +=
        ricompensaOttenuta;

    aggiornaMonete();

    // ================================
    // PUNTI ORDINI
    // ================================

    puntiOrdini++;

    if (
        puntiOrdini >=
        PUNTI_ORDINI_RICHIESTI
    ) {

        puntiOrdini = 0;

        generaPremioOrdini();

        alert(
            "🎁 Hai completato 10 ordini!"
        );
    }

    aggiornaPuntiOrdini();

    // ================================
    // ESPERIENZA
    // ================================

    esperienzaGiocatore += 25;

    if (
        esperienzaGiocatore >=
        XP_PER_LIVELLO
    ) {

        esperienzaGiocatore -=
            XP_PER_LIVELLO;

        livelloGiocatore++;

        alert(
            "🎉 Livello " +
            livelloGiocatore +
            " raggiunto!"
        );
    }

    aggiornaEsperienza();

    // ================================
    // NUOVO ORDINE
    // ================================

    ordiniAttuali[
        indiceOrdine
    ] = generaNuovoOrdine();

    // ================================
    // AGGIORNA TUTTO
    // ================================

    aggiornaOrdine();

    aggiornaTabellone();

    salvaPartita();

    alert(
        "Ordine completato! 🪙 +" +
        ricompensaOttenuta
    );
}

function ristrutturaParte(parte) {

    const livello =
        ristrutturazioni[parte];

    if (livello >= 5) {
        return;
    }

    const costo =
        costiRistrutturazione[livello];

    if (moneteGiocatore < costo) {
        alert("Non hai abbastanza monete!");
        return;
    }

    moneteGiocatore -= costo;
    
    aggiornaMonete();

    ristrutturazioni[parte]++;

    aggiornaRistrutturazioni();

    salvaPartita();
}

function aggiornaRistrutturazioni() {

    document.getElementById(
        "moneteValore"
    ).textContent = moneteGiocatore;

    const parti = [
        "muri",
        "finestre",
        "porta",
        "arredamento",
        "esterno"
    ];

    parti.forEach(function(parte) {

        const livello =
            ristrutturazioni[parte];

        const elementoLivello =
            document.getElementById(
                "livello" +
                parte.charAt(0).toUpperCase() +
                parte.slice(1)
            );

        const elementoCosto =
            document.getElementById(
                "costo" +
                parte.charAt(0).toUpperCase() +
                parte.slice(1)
            );

        elementoLivello.textContent =
            livello;

        if (livello >= 5) {

            elementoCosto.textContent =
                "COMPLETATO";

        } else {

            elementoCosto.textContent =
                costiRistrutturazione[livello];
        }
    });
}

function apriRistrutturazione() {

    document.getElementById(
        "tabellone"
    ).style.display = "none";

    document.getElementById(
        "infoOggetto"
    ).style.display = "none";

    document.getElementById(
        "moltiplicatore"
    ).style.display = "none";

    document.getElementById(
        "energia"
    ).style.display = "none";

    document.getElementById(
        "paginaRistrutturazione"
    ).style.display = "block";

    aggiornaRistrutturazioni();
}

function aggiornaEnergia() {

    const timer = document.getElementById("timerEnergia");
    const conto = document.getElementById("contoEnergia");

    if (energiaGiocatore >= 100) {

        ultimoAggiornamentoEnergia = Date.now();

        timer.style.display = "none";

        return;
    }

    timer.style.display = "block";

    const adesso = Date.now();

    const tempoPassato =
        adesso - ultimoAggiornamentoEnergia;

    const intervalli =
        Math.floor(
            tempoPassato /
            TEMPO_RICARICA_ENERGIA
        );

    if (intervalli > 0) {

        energiaGiocatore =
            Math.min(
                100,
                energiaGiocatore + intervalli
            );

        ultimoAggiornamentoEnergia =
            ultimoAggiornamentoEnergia +
            intervalli * TEMPO_RICARICA_ENERGIA;

        document.getElementById(
            "energiaValore"
        ).textContent = energiaGiocatore;

        salvaPartita();
    }

    if (energiaGiocatore >= 100) {

        timer.style.display = "none";

        return;
    }

    const prossimo =
        TEMPO_RICARICA_ENERGIA -
        (
            Date.now() -
            ultimoAggiornamentoEnergia
        );

    const secondi =
        Math.ceil(prossimo / 1000);

    const minuti =
        Math.floor(secondi / 60);

    const secondiRimasti =
        secondi % 60;

    conto.textContent =
        String(minuti).padStart(2, "0") +
        ":" +
        String(secondiRimasti).padStart(2, "0");
}

document.addEventListener("DOMContentLoaded", function () {

    creaTabellone();
    aggiornaOrdine();
    caricaPartita();
    aggiornaTabellone();
    setInterval(aggiornaEnergia, 1000);

});


// ================================
// INTRO STORIA MERGE CASA
// ================================

let slideStoriaCorrente = 0;

const introStoria =
    document.getElementById("introStoria");

const slideStoria =
    document.querySelectorAll(".slideStoria");


// ================================
// MOSTRA UNA SLIDE
// ================================

function mostraSlideStoria(numero) {

    if (!introStoria || !slideStoria.length) {
        return;
    }

    slideStoria.forEach(function (slide) {

        slide.classList.remove("attiva");

        slide
            .querySelectorAll(".nuvolettaDialogo")
            .forEach(function (nuvoletta) {

nuvoletta.classList.remove("visibile");

            });

    });

    const slide =
        document.querySelector(
            '.slideStoria[data-slide="' +
            numero +
            '"]'
        );

    if (!slide) {
        return;
    }

    slide.classList.add("attiva");

    slideStoriaCorrente = numero;

    const primaNuvoletta =
        slide.querySelector(".nuvolettaDialogo");

    if (primaNuvoletta) {
primaNuvoletta.classList.add("visibile");
    }
}


// ================================
// AVVIA LA STORIA
// ================================

function avviaStoria() {

    if (!introStoria || !slideStoria.length) {
        return;
    }

    introStoria.style.display = "block";

    mostraSlideStoria(1);
}


// ================================
// AVANTI
// ================================

function prossimaSlideStoria() {

    if (slideStoriaCorrente >= 7) {

        terminaStoria();

        return;
    }

    mostraSlideStoria(
        slideStoriaCorrente + 1
    );
}


// ================================
// FINE STORIA
// ================================

function terminaStoria() {

    if (introStoria) {
        introStoria.style.display = "none";
    }

    const sceltaAvatar =
        document.getElementById("sceltaAvatar");

    if (sceltaAvatar) {
        sceltaAvatar.style.display = "flex";
    }
}


// ================================
// FRECCIA DIALOGHI
// ================================

const frecciaDialogo =
    document.querySelector(".frecciaDialogo");

if (frecciaDialogo) {

    frecciaDialogo.addEventListener(
        "click",
        function () {

            const slide =
                document.querySelector(
                    '.slideStoria[data-slide="' +
                    slideStoriaCorrente +
                    '"]'
                );

            if (!slide) {
                return;
            }

            const figlia =
                slide.querySelector(
                    ".nuvolettaFiglia"
                );

            const mamma =
                slide.querySelector(
                    ".nuvolettaMamma"
                );

            // =========================
            // SLIDE 1
            // =========================

            if (slideStoriaCorrente === 1) {

if (
    figlia &&
    !figlia.classList.contains("visibile")
) {

    figlia.classList.add("visibile");

    return;
}

                prossimaSlideStoria();

                return;
            }

            // =========================
            // SLIDE 2
            // =========================

            if (slideStoriaCorrente === 2) {

if (
    mamma &&
    !mamma.classList.contains("visibile")
) {

    mamma.classList.add("visibile");

    return;
}

                prossimaSlideStoria();

                return;
            }

            // =========================
            // SLIDE SUCCESSIVE
            // =========================

            prossimaSlideStoria();

        }
    );

}


// ================================
// MUSICA
// ================================

const musica =
    new Audio(
        "immagini/audio/musica_menu.mp3"
    );

musica.loop = true;
musica.volume = 0.35;

document.addEventListener(
    "click",
    function avviaMusica() {

        musica.play().catch(function () {});

        document.removeEventListener(
            "click",
            avviaMusica
        );

    },
    { once: true }
);

// ================================
// REGALO DI BENVENUTO
// ================================

const popupBenvenuto =
    document.getElementById(
        "popupBenvenuto"
    );

const pulsanteRiscatta =
    document.getElementById(
        "riscattaBenvenuto"
    );

const pulsanteChiudi =
    document.getElementById(
        "chiudiPopupBenvenuto"
    );

let regaloBenvenutoRiscattato =
    localStorage.getItem(
        "regaloBenvenutoRiscattato"
    ) === "true";


// ================================
// RISCATTA
// ================================

if (pulsanteRiscatta) {

    pulsanteRiscatta.addEventListener(
        "click",
        function () {

            if (
                regaloBenvenutoRiscattato
            ) {
                return;
            }

            moneteGiocatore += 1000;

            energiaGiocatore = 100;

            diamantiGiocatore += 20;

            regaloBenvenutoRiscattato =
                true;

            localStorage.setItem(
                "regaloBenvenutoRiscattato",
                "true"
            );

            aggiornaMonete();

            document.getElementById(
                "energiaValore"
            ).textContent =
                energiaGiocatore;

            document.getElementById(
                "diamantiValore"
            ).textContent =
                diamantiGiocatore;

            salvaPartita();

            popupBenvenuto.style.display =
                "none";

        }
    );

}


// ================================
// CHIUDI CON X
// ================================

if (pulsanteChiudi) {

    pulsanteChiudi.addEventListener(
        "click",
        function () {

            popupBenvenuto.style.display =
                "none";

        }
    );

}

function apriStore() {

    const store =
        document.getElementById("paginaStore");

    if (!store) {
        return;
    }

    store.style.display = "flex";

}
const chiudiStore =
    document.getElementById("chiudiStore");

if (chiudiStore) {

    chiudiStore.addEventListener(
        "click",
        function () {

            document.getElementById(
                "paginaStore"
            ).style.display = "none";

        }
    );

}

const oggettiStore = {

    asse_legno: {
        tipo: "tavolo",
        livello: 0
    },

    pane: {
        tipo: "pane",
        livello: 3
    },

    bibita: {
        tipo: "cola",
        livello: 3
    },

    sedia: {
        tipo: "tavolo",
        livello: 4
    },

    poltrona: {
        tipo: "tavolo",
        livello: 6
    },

    hamburger: {
        tipo: "pane",
        livello: 8
    }

};

function acquistaOggettoStore(
    tipo,
    livello,
    prezzo
) {
    if (diamantiGiocatore < prezzo) {
        alert("Non hai abbastanza diamanti.");
        return;
    }

    diamantiGiocatore -= prezzo;
    
    oggettiAcquistatiInSospeso.push({
    tipo: tipo,
    livello: livello
});

    aggiornaDiamanti();

    const contenitore =
        document.getElementById(
            "oggettiAcquistatiNelSlot"
        );

    if (!contenitore) {
        return;
    }

    contenitore.style.display = "flex";

    const oggetto =
        document.createElement("div");

    oggetto.className =
        "oggettoAcquistatoSlot";

    oggetto.innerHTML = `
        🪵
        <span>Asse</span>
    `;

oggetto.addEventListener(
    "click",
    function () {
        trasportaOggettoNelTabellone(
            oggetto,
            tipo,
            livello
        );
    }
);

    contenitore.appendChild(oggetto);
    
    aggiornaOggettiAcquistatiNelSlot();

    salvaPartita();

    alert("Oggetto acquistato!");
}

function trasportaOggettoNelTabellone(
    elementoSlot,
    tipoStore,
    livelloStore,
    indice
) {

const datiOggetto =
    oggettiStore[tipoStore];

const tipoReale =
    datiOggetto
        ? datiOggetto.tipo
        : tipoStore;

const livelloReale =
    datiOggetto
        ? datiOggetto.livello
        : livelloStore;

    let rigaDestinazione = null;
    let colonnaDestinazione = null;

    for (
        let riga = 0;
        riga < RIGHE;
        riga++
    ) {

        for (
            let colonna = 0;
            colonna < COLONNE;
            colonna++
        ) {

            if (
                tabellone[riga][colonna] === null
            ) {
                rigaDestinazione = riga;
                colonnaDestinazione = colonna;
                break;
            }
        }

        if (
            rigaDestinazione !== null
        ) {
            break;
        }
    }

    if (
        rigaDestinazione === null
    ) {
        alert(
            "Non c'è spazio sul tabellone."
        );
        return;
    }

    const cellaDestinazione =
        document.querySelector(
            `.cella[data-riga="${rigaDestinazione}"][data-colonna="${colonnaDestinazione}"]`
        );

    if (!cellaDestinazione) {
        return;
    }

const clone =
    document.createElement("div");

clone.className =
    "oggettoRientroDeposito";

if (
    immaginiOggetti[tipoReale] &&
    immaginiOggetti[tipoReale][livelloReale]
) {

    clone.innerHTML = `
        <img
            src="${immaginiOggetti[tipoReale][livelloReale]}"
            alt=""
        >
    `;

} else {

    clone.textContent =
        livelliOggetti[tipoReale]?.[livelloReale] || "📦";

}

const posizione =
    elementoSlot.getBoundingClientRect();

clone.style.position = "fixed";

clone.style.left =
    posizione.left +
    posizione.width / 2 +
    "px";

clone.style.top =
    posizione.top +
    posizione.height / 2 +
    "px";

clone.style.width =
    "auto";

clone.style.height =
    "auto";

clone.style.margin =
    "0";

clone.style.zIndex =
    "10000";

clone.style.pointerEvents =
    "none";

clone.style.transition =
    "left .45s ease, top .45s ease, transform .45s ease, opacity .45s ease";

document.body.appendChild(clone);

    const destinazione =
        cellaDestinazione.getBoundingClientRect();

    requestAnimationFrame(() => {

clone.style.left =
    destinazione.left +
    destinazione.width / 2 +
    "px";

clone.style.top =
    destinazione.top +
    destinazione.height / 2 +
    "px";

        clone.style.transform =
            "scale(.75)";

        clone.style.opacity =
            "0.2";
    });

    setTimeout(() => {

        tabellone[
            rigaDestinazione
        ][
            colonnaDestinazione
        ] = creaOggetto(
            tipoReale,
            livelloReale
        );

        // Rimuove l'oggetto trasportato dalla coda
        if (
            indice !== undefined &&
            indice >= 0
        ) {
            oggettiAcquistatiInSospeso.splice(
                indice,
                1
            );
        }

        clone.remove();

        // Mostra il prossimo oggetto,
        // oppure nasconde lo slot se la coda è vuota
        aggiornaOggettiAcquistatiNelSlot();

        aggiornaTabellone();
        salvaPartita();

    }, 450);
}

function aggiornaOggettiAcquistatiNelSlot() {

    const contenitore =
        document.getElementById(
            "oggettiAcquistatiNelSlot"
        );

    if (!contenitore) {
        return;
    }

    contenitore.innerHTML = "";

    if (
        oggettiAcquistatiInSospeso.length === 0
    ) {
        contenitore.style.display = "none";
        return;
    }

    contenitore.style.display = "flex";

    const indice =
        oggettiAcquistatiInSospeso.length - 1;

    const oggettoSalvato =
        oggettiAcquistatiInSospeso[indice];

    const dettagli = {
        asse_legno: ["🪵", "Asse"],
        pane: ["🍞", "Pane"],
        bibita: ["🥤", "Bibita"],
        sedia: ["🪑", "Sedia"],
        poltrona: ["🛋️", "Poltrona"],
        hamburger: ["🍔", "Hamburger"]
    };

    const dati =
        dettagli[oggettoSalvato.tipo] ||
        ["📦", "Oggetto"];

    const oggetto =
        document.createElement("div");

    oggetto.className =
        "oggettoAcquistatoSlot";

oggetto.innerHTML = `
    <span class="iconaOggettoCoda">
        ${dati[0]}
    </span>
    `;

    oggetto.addEventListener(
        "click",
        function () {

            trasportaOggettoNelTabellone(
                oggetto,
                oggettoSalvato.tipo,
                oggettoSalvato.livello,
                indice
            );

        }
    );

    contenitore.appendChild(oggetto);
}

document
    .getElementById("chiudiDeposito")
    ?.addEventListener("click", function () {

        const paginaDeposito =
            document.getElementById(
                "paginaDeposito"
            );

        const main =
            document.querySelector("main");

        paginaDeposito.style.display =
            "none";

        main.style.display =
            "block";

        if (!oggettoInRientroDalDeposito) {
            return;
        }

        // Cerca la prima cella libera
        let rigaDestinazione = null;
        let colonnaDestinazione = null;

        for (
            let riga = 0;
            riga < RIGHE;
            riga++
        ) {

            for (
                let colonna = 0;
                colonna < COLONNE;
                colonna++
            ) {

                if (
                    tabellone[riga][colonna] === null
                ) {

                    rigaDestinazione = riga;
                    colonnaDestinazione = colonna;

                    break;
                }
            }

            if (
                rigaDestinazione !== null
            ) {
                break;
            }
        }

        // Tabellone pieno
        if (
            rigaDestinazione === null
        ) {

            oggettiNelDeposito.push(
                oggettoInRientroDalDeposito
            );

            oggettoInRientroDalDeposito =
                null;

            alert(
                "Il tabellone è pieno."
            );

            aggiornaDeposito();
            salvaPartita();

            return;
        }

        const cellaDestinazione =
            document.querySelector(
                `.cella[data-riga="${rigaDestinazione}"][data-colonna="${colonnaDestinazione}"]`
            );

        if (!cellaDestinazione) {
            return;
        }

        const pulsanteDeposito =
            document.getElementById(
                "pulsanteDeposito"
            );

        const posizione =
            pulsanteDeposito.getBoundingClientRect();

        const clone =
            document.createElement("div");

        clone.className =
            "oggettoRientroDeposito";

        const icona =
            livelliOggetti[
                oggettoInRientroDalDeposito.tipo
            ]
            ? livelliOggetti[
                oggettoInRientroDalDeposito.tipo
            ][
                oggettoInRientroDalDeposito.livello
            ]
            : "📦";

        clone.innerHTML = icona;

        clone.style.position =
            "fixed";

        clone.style.left =
            posizione.left +
            posizione.width / 2 +
            "px";

        clone.style.top =
            posizione.top +
            posizione.height / 2 +
            "px";

        clone.style.zIndex =
            "99999";

        clone.style.pointerEvents =
            "none";

        document.body.appendChild(
            clone
        );

        const destinazione =
            cellaDestinazione.getBoundingClientRect();

        requestAnimationFrame(() => {

            clone.style.left =
                destinazione.left +
                destinazione.width / 2 +
                "px";

            clone.style.top =
                destinazione.top +
                destinazione.height / 2 +
                "px";

            clone.style.transform =
                "translate(-50%, -50%) scale(.8)";

        });

        const oggettoDaInserire =
            oggettoInRientroDalDeposito;

        oggettoInRientroDalDeposito =
            null;

        setTimeout(() => {

            tabellone[
                rigaDestinazione
            ][
                colonnaDestinazione
            ] =
                oggettoDaInserire;

            clone.remove();

            aggiornaTabellone();
            aggiornaDeposito();
            salvaPartita();

        }, 450);
    });
    
function aggiornaDeposito() {

    const contenitore =
        document.getElementById("contenitoreDeposito");

    if (!contenitore) return;

    contenitore.innerHTML = "";

    const totaleCelle = celleDepositoSbloccate + 1;

    for (
        let indice = 0;
        indice < totaleCelle;
        indice++
    ) {

        const cella =
            document.createElement("div");

        cella.className = "cellaDeposito";

        // CELLE SBLOCCATE
        if (indice < celleDepositoSbloccate) {

if (oggettiNelDeposito[indice]) {

    const oggetto =
        oggettiNelDeposito[indice];

    const icona =
        livelliOggetti[oggetto.tipo]
        ? livelliOggetti[oggetto.tipo][oggetto.livello]
        : "📦";

    cella.innerHTML = `
        <span class="iconaDeposito">
            ${icona}
        </span>
    `;

    cella.addEventListener(
        "click",
        function () {

            oggettoInRientroDalDeposito =
                oggettiNelDeposito[indice];

            oggettiNelDeposito.splice(
                indice,
                1
            );

            aggiornaDeposito();

            salvaPartita();
        }
    );

            } else {

                cella.innerHTML = `
                    <span class="depositoVuoto">
                        +
                    </span>
                `;
            }

        }

        // PRIMA CELLA BLOCCATA
        else {

            const costo =
                (celleDepositoSbloccate - 4) * 10;

            cella.classList.add(
                "cellaDepositoBloccata"
            );

            cella.innerHTML = `
                🔒
                <strong>${costo} 💎</strong>
            `;

            cella.addEventListener(
                "click",
                function () {

                    if (
                        diamantiGiocatore < costo
                    ) {
                        alert(
                            "Non hai abbastanza diamanti."
                        );
                        return;
                    }

                    diamantiGiocatore -= costo;

                    celleDepositoSbloccate++;

                    aggiornaDiamanti();
                    aggiornaDeposito();
                    salvaPartita();
                }
            );
        }

        contenitore.appendChild(cella);
    }
}

document.addEventListener("DOMContentLoaded", function () {

    let avatarSelezionato = null;

    const avatarSalvato =
        localStorage.getItem("avatarGiocatore");

    const sceltaAvatar =
        document.getElementById("sceltaAvatar");

    const avatarLivello =
        document.getElementById("avatarLivello");


    // ================================
    // AVATAR GIÀ SALVATO
    // ================================

    if (avatarSalvato) {

        if (sceltaAvatar) {
            sceltaAvatar.style.display = "none";
        }

        if (avatarLivello) {
            avatarLivello.src =
                "immagini/avatar/" +
                avatarSalvato +
                ".jpg";
        }

    } else {

        // NUOVO GIOCATORE:
        // l'avatar rimane nascosto
        // fino alla fine della storia

        if (sceltaAvatar) {
            sceltaAvatar.style.display = "none";
        }

    }


    // ================================
    // SELEZIONE AVATAR
    // ================================

    document
        .querySelectorAll(".avatarScelta")
        .forEach(function (bottone) {

            bottone.addEventListener(
                "click",
                function () {

                    document
                        .querySelectorAll(".avatarScelta")
                        .forEach(function (altro) {

                            altro.classList.remove(
                                "selezionato"
                            );

                        });

                    bottone.classList.add(
                        "selezionato"
                    );

                    avatarSelezionato =
                        bottone.dataset.avatar;

                    const conferma =
                        document.getElementById(
                            "confermaAvatar"
                        );

                    if (conferma) {
                        conferma.disabled = false;
                    }

                }
            );

        });


    // ================================
    // CONFERMA AVATAR
    // ================================

    const confermaAvatar =
        document.getElementById(
            "confermaAvatar"
        );

    if (confermaAvatar) {

        confermaAvatar.addEventListener(
            "click",
            function () {

                if (!avatarSelezionato) {
                    return;
                }

                localStorage.setItem(
                    "avatarGiocatore",
                    avatarSelezionato
                );

if (sceltaAvatar) {
    sceltaAvatar.style.display =
        "none";
}

if (avatarLivello) {
    avatarLivello.src =
        "immagini/avatar/" +
        avatarSelezionato +
        ".jpg";
}


// ================================
// MOSTRA REGALO DI BENVENUTO
// ================================

const popupBenvenuto =
    document.getElementById(
        "popupBenvenuto"
    );

if (
    popupBenvenuto &&
    !regaloBenvenutoRiscattato
) {
    popupBenvenuto.style.display =
        "flex";
}

            }
        );

    }

});

// =============================
// NUOVO SISTEMA CONSENSO
// SOLO NUOVI UTENTI
// =============================

document.addEventListener("DOMContentLoaded", function () {

    const consensoPopup =
        document.getElementById("consensoPopup");

    const accettaConsenso =
        document.getElementById("accettaConsenso");

    if (!consensoPopup || !accettaConsenso) {
        return;
    }
    
    console.log(
    "CONSENSO SALVATO:",
    localStorage.getItem("mergeCasaConsenso")
);

    const consensoGiaAccettato =
        localStorage.getItem("mergeCasaConsenso");

// UTENTE GIÀ REGISTRATO
if (consensoGiaAccettato === "true") {
    consensoPopup.style.display = "none";
    return;
}

    // NUOVO UTENTE
    consensoPopup.style.display = "flex";

accettaConsenso.addEventListener(
    "click",
    function () {

        localStorage.setItem(
            "mergeCasaConsenso",
            "true"
        );

consensoPopup.style.display = "none";

const schermataIniziale =
    document.getElementById("schermataIniziale");

if (schermataIniziale) {
    schermataIniziale.style.display = "none";
}

avviaStoria();

    }
);

});

// =============================
// USER AGREEMENT
// =============================

document.addEventListener("DOMContentLoaded", function () {

    const apriUserAgreement =
        document.getElementById("apriUserAgreement");

    const paginaUserAgreement =
        document.getElementById("paginaUserAgreement");

    const chiudiUserAgreement =
        document.getElementById("chiudiUserAgreement");

    if (!apriUserAgreement || !paginaUserAgreement) {
        return;
    }

    apriUserAgreement.addEventListener(
        "click",
        function () {
            paginaUserAgreement.style.display = "flex";
        }
    );

    if (chiudiUserAgreement) {
        chiudiUserAgreement.addEventListener(
            "click",
            function () {
                paginaUserAgreement.style.display = "none";
            }
        );
    }

});

// =============================
// PRIVACY POLICY
// =============================

document.addEventListener("DOMContentLoaded", function () {

    const apriPrivacyPolicy =
        document.getElementById("apriPrivacyPolicy");

    const paginaPrivacyPolicy =
        document.getElementById("paginaPrivacyPolicy");

    const chiudiPrivacyPolicy =
        document.getElementById("chiudiPrivacyPolicy");

    if (!apriPrivacyPolicy || !paginaPrivacyPolicy) {
        return;
    }

    apriPrivacyPolicy.addEventListener(
        "click",
        function () {

            paginaPrivacyPolicy.style.display = "flex";

        }
    );

    if (chiudiPrivacyPolicy) {

        chiudiPrivacyPolicy.addEventListener(
            "click",
            function () {

                paginaPrivacyPolicy.style.display = "none";

            }
        );

    }

});
← Back to timeline