Pular para conteúdo

dml_inst

Código

-- Tabela Instância Estrutura
DO
$$
DECLARE
    chunk_rec RECORD;
    rand_num FLOAT;
    estrutura_existente INTEGER;
    nova_estrutura_id INTEGER;
BEGIN
    -- Iterando por todos os chunks em todos os mapas
    FOR chunk_rec IN 
        SELECT numero, nome_bioma, nome_mapa 
        FROM Chunk
    LOOP
        -- Verifica se o chunk já possui uma estrutura
        SELECT COUNT(*) INTO estrutura_existente
        FROM InstanciaEstrutura
        WHERE numero_chunk = chunk_rec.numero
        AND nome_mapa = chunk_rec.nome_mapa;

        -- Se já houver uma estrutura, pula para o próximo chunk
        IF estrutura_existente > 0 THEN
            CONTINUE;
        END IF;

        -- Superfície
        IF chunk_rec.nome_mapa = 'Superfície' THEN
            -- Templo da Selva
            IF chunk_rec.nome_bioma = 'Selva' THEN
                rand_num := random() * 100;
                IF rand_num <= 5.00 THEN
                    -- Chamar stored procedure para inserir a estrutura
                    CALL inserir_inst_estrutura('Templo da Selva', chunk_rec.nome_bioma, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    -- Chamar stored procedure para inserir mobs na estrutura
                    CALL inserir_inst_mob('Zumbi', 25, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);
                    CALL inserir_inst_mob('Esqueleto', 20, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    CONTINUE;
                END IF;
            END IF;

            -- Templo do Deserto
            IF chunk_rec.nome_bioma = 'Deserto' THEN
                rand_num := random() * 100;
                IF rand_num <= 5.00 THEN
                    -- Chamar stored procedure para inserir a estrutura
                    CALL inserir_inst_estrutura('Templo do Deserto', chunk_rec.nome_bioma, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    -- Chamar stored procedure para inserir mobs na estrutura
                    CALL inserir_inst_mob('Zumbi', 25, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);
                    CALL inserir_inst_mob('Zumbi', 25, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    CONTINUE;
                END IF;
            END IF;

            -- Cabana da Bruxa
            IF chunk_rec.nome_bioma = 'Pântano' THEN
                rand_num := random() * 100;
                IF rand_num <= 7.00 THEN
                    -- Chamar stored procedure para inserir a estrutura
                    CALL inserir_inst_estrutura('Cabana da Bruxa', chunk_rec.nome_bioma, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    -- Chamar stored procedure para inserir mob na Cabana da Bruxa
                    CALL inserir_inst_mob('Bruxa', 26, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    CONTINUE;
                END IF;
            END IF;

            -- Portal em Ruínas
            IF chunk_rec.nome_bioma IN ('Deserto', 'Planície', 'Floresta', 'Selva', 'Pântano', 'Montanha', 'Neve') THEN
                rand_num := random() * 100;
                IF rand_num <= 10.00 THEN
                    -- Chamar stored procedure para inserir a estrutura
                    CALL inserir_inst_estrutura('Portal em Ruínas', chunk_rec.nome_bioma, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    -- Chamar stored procedure para inserir mob no Portal em Ruínas
                    CALL inserir_inst_mob('Piglin', 16, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);
                    CALL inserir_inst_mob('Piglin Zumbi', 20, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    CONTINUE;
                END IF;
            END IF;

            -- Vila
            IF chunk_rec.nome_bioma IN ('Deserto', 'Planície', 'Floresta', 'Montanha', 'Neve') THEN
                rand_num := random() * 100;
                IF rand_num <= 20.00 THEN
                    -- Chamar stored procedure para inserir a estrutura
                    CALL inserir_inst_estrutura('Vila', chunk_rec.nome_bioma, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    -- Chamar stored procedure para inserir NPCs na Vila
                    CALL inserir_inst_mob('Aldeão', 20, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);
                    CALL inserir_inst_mob('Aldeão', 20, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);
                    CALL inserir_inst_mob('Golem de Ferro', 100, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    CONTINUE;
                END IF;
            END IF;

            -- Posto Avançado
            IF chunk_rec.nome_bioma IN ('Planície', 'Deserto', 'Montanha') THEN
                rand_num := random() * 100;
                IF rand_num <= 8.00 THEN
                    -- Chamar stored procedure para inserir a estrutura
                    CALL inserir_inst_estrutura('Posto Avançado', chunk_rec.nome_bioma, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    -- Chamar stored procedure para inserir mobs no Posto Avançado
                    CALL inserir_inst_mob('Saqueador', 24, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);
                    CALL inserir_inst_mob('Saqueador', 24, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    CONTINUE;
                END IF;
            END IF;
        END IF;

        -- Cavernas
        IF chunk_rec.nome_mapa = 'Cavernas' THEN
            -- Fortaleza do Fim
            IF chunk_rec.nome_bioma = 'Fortaleza' THEN
                rand_num := random() * 100;
                IF rand_num <= 5.00 THEN
                    -- Chamar stored procedure para inserir a estrutura
                    CALL inserir_inst_estrutura('Fortaleza do Fim', chunk_rec.nome_bioma, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    -- Chamar stored procedure para inserir mobs na Fortaleza do Fim
                    CALL inserir_inst_mob('Esqueleto', 20, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);
                    CALL inserir_inst_mob('Blaze', 20, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    CONTINUE;
                END IF;
            END IF;

            -- Mina Abandonada
            IF chunk_rec.nome_bioma = 'Caverna' THEN
                rand_num := random() * 100;
                IF rand_num <= 10.00 THEN
                    -- Chamar stored procedure para inserir a estrutura
                    CALL inserir_inst_estrutura('Mina Abandonada', chunk_rec.nome_bioma, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    -- Chamar stored procedure para inserir mobs na Mina Abandonada
                    CALL inserir_inst_mob('Aranha', 16, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    CONTINUE;
                END IF;
            END IF;
        END IF;

        -- Nether
        IF chunk_rec.nome_mapa = 'Nether' THEN
            -- Bastião em Ruínas
            IF chunk_rec.nome_bioma = 'Descampado' THEN
                rand_num := random() * 100;
                IF rand_num <= 3.00 THEN
                    -- Chamar stored procedure para inserir a estrutura
                    CALL inserir_inst_estrutura('Bastião em Ruínas', chunk_rec.nome_bioma, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    -- Chamar stored procedure para inserir mobs no Bastião em Ruínas
                    CALL inserir_inst_mob('Piglin', 16, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);
                    CALL inserir_inst_mob('Piglin Zumbi', 20, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);
                    CALL inserir_inst_mob('Esqueleto Wither', 20, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id);

                    CONTINUE;
                END IF;
            END IF;
        END IF;

    END LOOP;
END
$$;

-- Tabela Instância Mob
DO
$$
DECLARE
    chunk_rec RECORD;
    rand_num FLOAT;
BEGIN
    -- Iterando por todos os chunks na tabela Chunk
    FOR chunk_rec IN 
        SELECT numero, nome_bioma, nome_mapa 
        FROM Chunk
    LOOP
        -- Superfície
        IF chunk_rec.nome_mapa = 'Superfície' THEN
            -- Galinha (spawn em Planície, Floresta)
            IF chunk_rec.nome_bioma IN ('Planície', 'Floresta') THEN
                rand_num := random() * 100;
                IF rand_num <= 45.00 THEN
                    CALL inserir_inst_mob('Galinha', 5, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
            END IF;

            -- Vaca e Porco (spawn em Planície)
            IF chunk_rec.nome_bioma = 'Planície' THEN
                rand_num := random() * 100;
                IF rand_num <= 45.00 THEN
                    CALL inserir_inst_mob('Vaca', 10, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;

                rand_num := random() * 100;
                IF rand_num <= 35.00 THEN
                    CALL inserir_inst_mob('Porco', 10, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
            END IF;

            -- Ovelha (spawn em Planície, Montanha)
            IF chunk_rec.nome_bioma IN ('Planície', 'Montanha') THEN
                rand_num := random() * 100;
                IF rand_num <= 30.00 THEN
                    CALL inserir_inst_mob('Ovelha', 8, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
            END IF;

            -- Peixe, Golfinho e Guardião (spawn em Lago)
            IF chunk_rec.nome_bioma = 'Lago' THEN
                rand_num := random() * 100;
                IF rand_num <= 30.00 THEN
                    CALL inserir_inst_mob('Peixe', 3, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;

                rand_num := random() * 100;
                IF rand_num <= 10.00 THEN
                    CALL inserir_inst_mob('Golfinho', 10, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;

                rand_num := random() * 100;
                IF rand_num <= 5.00 THEN
                    CALL inserir_inst_mob('Guardião', 30, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
            END IF;

            -- Urso e Golem de Neve (spawn em Neve)
            IF chunk_rec.nome_bioma = 'Neve' THEN
                rand_num := random() * 100;
                IF rand_num <= 25.00 THEN
                    CALL inserir_inst_mob('Urso', 30, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;

                rand_num := random() * 100;
                IF rand_num <= 15.00 THEN
                    CALL inserir_inst_mob('Golem de Neve', 4, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
            END IF;
        END IF;

        -- Cavernas
        IF chunk_rec.nome_mapa = 'Cavernas' THEN
            -- Mobs hostis (spawn em Caverna)
            IF chunk_rec.nome_bioma IN ('Caverna', 'Fortaleza') THEN
                rand_num := random() * 100;
                IF rand_num <= 40.00 THEN
                    CALL inserir_inst_mob('Esqueleto', 20, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;

                rand_num := random() * 100;
                IF rand_num <= 40.00 THEN
                    CALL inserir_inst_mob('Creeper', 20, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;

                rand_num := random() * 100;
                IF rand_num <= 50.00 THEN
                    CALL inserir_inst_mob('Zumbi', 25, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;

                rand_num := random() * 100;
                IF rand_num <= 30.00 THEN
                    CALL inserir_inst_mob('Aranha', 16, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;

                rand_num := random() * 100;
                IF rand_num <= 20.00 THEN
                    CALL inserir_inst_mob('Enderman', 26, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;

                rand_num := random() * 100;
                IF rand_num <= 10.00 THEN
                    CALL inserir_inst_mob('Bruxa', 26, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
            END IF;

            -- Warden (spawn em Cidade ancestral)
            IF chunk_rec.nome_bioma = 'Cidade ancestral' THEN
                rand_num := random() * 100;
                IF rand_num <= 5.00 THEN
                    CALL inserir_inst_mob('Warden', 500, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
            END IF;
        END IF;

        -- Nether
        IF chunk_rec.nome_mapa = 'Nether' THEN
            -- Piglin e Hoglin (spawn em Floresta carmesim)
            IF chunk_rec.nome_bioma = 'Floresta carmesim' THEN
                rand_num := random() * 100;
                IF rand_num <= 45.00 THEN
                    CALL inserir_inst_mob('Piglin', 16, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
                IF rand_num <= 40.00 THEN
                    CALL inserir_inst_mob('Hoglin', 40, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
            END IF;

            -- Ghast e Piglin Zumbi (spawn em Descampado)
            IF chunk_rec.nome_bioma = 'Descampado' THEN
                rand_num := random() * 100;
                IF rand_num <= 35.00 THEN
                    CALL inserir_inst_mob('Ghast', 10, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;

                rand_num := random() * 100;
                IF rand_num <= 50.00 THEN
                    CALL inserir_inst_mob('Piglin Zumbi', 20, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
            END IF;

            -- Enderman (spawn em Floresta distorcida)
            IF chunk_rec.nome_bioma = 'Floresta distorcida' THEN
                rand_num := random() * 100;
                IF rand_num <= 90.00 THEN
                    CALL inserir_inst_mob('Enderman', 40, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
            END IF;
        END IF;

        -- Fim
        IF chunk_rec.nome_mapa = 'Fim' THEN
            IF chunk_rec.nome_bioma = 'Ilha do fim' THEN
                rand_num := random() * 100;
                IF rand_num <= 90.00 THEN
                    CALL inserir_inst_mob('Enderman', 40, chunk_rec.numero, chunk_rec.nome_mapa, NULL);
                END IF;
            END IF;
        END IF;

    END LOOP;
END
$$;

-- Tabela Instância Fonte
DO
$$
DECLARE
    chunk_rec RECORD;
    rand_num FLOAT;
BEGIN
    -- Iterando por todos os chunks na tabela Chunk
    FOR chunk_rec IN 
        SELECT numero, nome_bioma, nome_mapa 
        FROM Chunk
    LOOP
        -- Superfície
        IF chunk_rec.nome_mapa = 'Superfície' THEN
            -- Árvore (gerada em Floresta e Selva, raramente em Planícies)
            IF chunk_rec.nome_bioma IN ('Floresta', 'Selva') THEN
                rand_num := random() * 100;
                IF rand_num <= 70.00 THEN
                    CALL inserir_inst_fonte('Árvore', 24, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;
            ELSIF chunk_rec.nome_bioma = 'Planície' THEN
                rand_num := random() * 100;
                IF rand_num <= 10.00 THEN
                    CALL inserir_inst_fonte('Árvore', 24, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;
            END IF;

            -- Pedreira (gerada raramente em todos os biomas, mais comumente em Montanhas)
            rand_num := random() * 100;
            IF chunk_rec.nome_bioma = 'Montanha' THEN
                IF rand_num <= 50.00 THEN
                    CALL inserir_inst_fonte('Pedreira', 16, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;
            ELSE
                IF rand_num <= 15.00 THEN  -- Raramente em outros biomas
                    CALL inserir_inst_fonte('Pedreira', 16, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;
            END IF;

            -- Duna e Campo de Cana de Açúcar (gerada no Deserto)
            IF chunk_rec.nome_bioma = 'Deserto' THEN
                rand_num := random() * 100;
                IF rand_num <= 50.00 THEN
                    CALL inserir_inst_fonte('Duna', 16, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;

                rand_num := random() * 100;
                IF rand_num <= 30.00 THEN
                    CALL inserir_inst_fonte('Campo de Cana de Açúcar', 5, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;
            END IF;

            -- Cardume (gerado no Lago)
            IF chunk_rec.nome_bioma = 'Lago' THEN
                rand_num := random() * 100;
                IF rand_num <= 60.00 THEN
                    CALL inserir_inst_fonte('Cardume', 5, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;
            END IF;

            -- Jazida de Carvão (gerada nas Montanhas)
            IF chunk_rec.nome_bioma = 'Montanha' THEN
                rand_num := random() * 100;
                IF rand_num <= 35.00 THEN
                    CALL inserir_inst_fonte('Jazida de Carvão', 24, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;
            END IF;

        -- Cavernas
        ELSIF chunk_rec.nome_mapa = 'Cavernas' THEN
            IF chunk_rec.nome_bioma != 'Cidade ancestral' THEN
                -- Jazida de Carvão
                rand_num := random() * 100;
                IF rand_num <= 40.00 THEN
                    CALL inserir_inst_fonte('Jazida de Carvão', 24, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;

                -- Jazida de Ferro
                rand_num := random() * 100;
                IF rand_num <= 50.00 THEN
                    CALL inserir_inst_fonte('Jazida de Ferro', 10, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;

                -- Depósito de Redstone
                rand_num := random() * 100;
                IF rand_num <= 25.00 THEN
                    CALL inserir_inst_fonte('Depósito de Redstone', 16, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;

                -- Jazida de Ouro
                rand_num := random() * 100;
                IF rand_num <= 20.00 THEN
                    CALL inserir_inst_fonte('Jazida de Ouro', 8, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;

                -- Veio de Diamante
                rand_num := random() * 100;
                IF rand_num <= 10.00 THEN
                    CALL inserir_inst_fonte('Veio de Diamante', 5, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;
            END IF;

        -- Nether
        ELSIF chunk_rec.nome_mapa = 'Nether' THEN
            IF chunk_rec.nome_bioma = 'Descampado' THEN
                -- Depósito de Netherita
                rand_num := random() * 100;
                IF rand_num <= 5.00 THEN
                    CALL inserir_inst_fonte('Depósito de Netherita', 5, chunk_rec.numero, chunk_rec.nome_mapa);
                END IF;
            END IF;
        END IF;
    END LOOP;
END
$$;


-- Tabela Instância Contruivel
DO
$$
DECLARE
    chunk_rec RECORD;
    rand_num FLOAT;
    vila_existente INTEGER;
BEGIN
    -- Iterando por todos os chunks na tabela Chunk
    FOR chunk_rec IN 
        SELECT numero, nome_bioma, nome_mapa 
        FROM Chunk
    LOOP
        -- Verificar se existe uma Vila no chunk
        SELECT COUNT(*) INTO vila_existente
        FROM InstanciaEstrutura
        WHERE nome_estrutura = 'Vila' AND numero_chunk = chunk_rec.numero AND nome_mapa = chunk_rec.nome_mapa;

        -- Se houver uma Vila no chunk
        IF vila_existente > 0 THEN
            -- Fazenda
            rand_num := random() * 100;
            IF rand_num <= 30.00 THEN
                CALL inserir_inst_construivel('Fazenda', chunk_rec.numero, chunk_rec.nome_mapa);
            END IF;

            -- Fornalha
            rand_num := random() * 100;
            IF rand_num <= 10.00 THEN
                CALL inserir_inst_construivel('Fornalha', chunk_rec.numero, chunk_rec.nome_mapa);
            END IF;

            -- Biblioteca
            rand_num := random() * 100;
            IF rand_num <= 7.00 THEN
                CALL inserir_inst_construivel('Biblioteca', chunk_rec.numero, chunk_rec.nome_mapa);
            END IF;
        END IF;

        -- Portais de Viagem
        rand_num := random() * 100;
        IF rand_num <= 1.00 THEN  -- probabilidade extremamente rara
            CALL inserir_inst_construivel('Portal de Viagem', chunk_rec.numero, chunk_rec.nome_mapa);
        END IF;

    END LOOP;
END
$$;