From bc95ec70a3613592d14647b968d306f5926b60d0 Mon Sep 17 00:00:00 2001 From: Arthur Carneiro Trindade Date: Mon, 9 Sep 2024 12:59:01 -0300 Subject: [PATCH] =?UTF-8?q?organiza=C3=A7=C3=A3o=20de=20arquivos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/game/player_actions.py | 11 +-- db/dml.sql | 156 +++++---------------------------- db/dml_inst.sql | 4 +- db/trigger_SP.sql | 155 ++++++++++++++++++++++++++++---- 4 files changed, 169 insertions(+), 157 deletions(-) diff --git a/app/src/game/player_actions.py b/app/src/game/player_actions.py index 6f6d5b2..8751911 100644 --- a/app/src/game/player_actions.py +++ b/app/src/game/player_actions.py @@ -297,12 +297,13 @@ def mostrar_mapa(cursor, nomeUser): bioma = bioma_data[0] if bioma_data else "Desconhecido" # Verifica se é o chunk atual do jogador - if chunk_id == chunkAtual: - print(f"{Back.RED} {Style.RESET_ALL}", end="") - elif bioma in bioma_cores: - print(f"{bioma_cores[bioma][0]} {Style.RESET_ALL}", end="") + if bioma in bioma_cores: + if chunk_id == chunkAtual: + print(f"{Back.RED} {Style.RESET_ALL}", end="") + else: + print(f"{bioma_cores[bioma][0]} {Style.RESET_ALL}", end="") else: - print(f"{Back.BLACK} {Style.RESET_ALL}", end="") # Fora dos limites ou desconhecido em preto + print(f"{Back.BLACK} {Style.RESET_ALL}", end="") # Fora dos limites ou desconhecido em preto else: print(f"{Back.BLACK} {Style.RESET_ALL}", end="") # Fora dos limites, em preto diff --git a/db/dml.sql b/db/dml.sql index f8f93d1..fcdadc2 100644 --- a/db/dml.sql +++ b/db/dml.sql @@ -35,7 +35,7 @@ VALUES -- Inserindo Chunks do mapa Superfície INSERT INTO Chunk (numero, nome_bioma, nome_mapa) VALUES --- Inserindo Chunks do mapa Superfície + -- Inserindo Chunks do mapa Superfície (1, 'Planície', 'Superfície'), (2, 'Deserto', 'Superfície'), (3, 'Deserto', 'Superfície'), @@ -10037,7 +10037,7 @@ VALUES (9999, 'Planície', 'Superfície'), (10000, 'Planície', 'Superfície'), --- Inserindo Chunks do mapa Cavernas + -- Inserindo Chunks do mapa Cavernas (2, 'Caverna', 'Cavernas'), (3, 'Caverna', 'Cavernas'), (6, 'Caverna', 'Cavernas'), @@ -15017,7 +15017,7 @@ VALUES (9999, 'Caverna', 'Cavernas'), (10000, 'Caverna', 'Cavernas'), --- Inserindo Chunks do mapa Nether + -- Inserindo Chunks do mapa Nether (1, 'Floresta distorcida', 'Nether'), (2, 'Descampado', 'Nether'), (3, 'Descampado', 'Nether'), @@ -15919,7 +15919,7 @@ VALUES (899, 'Floresta distorcida', 'Nether'), (900, 'Descampado', 'Nether'), --- Inserindo Chunks do mapa Fim + -- Inserindo Chunks do mapa Fim (35, 'Ilha do fim', 'Fim'), (36, 'Ilha do fim', 'Fim'), (44, 'Ilha do fim', 'Fim'), @@ -16276,26 +16276,27 @@ VALUES CALL inserir_mob('Urso', 'agressivo', FALSE, 20, 30); -- Agressivos (impulsivo = TRUE) - CALL inserir_mob('Creeper', 'agressivo', TRUE, 50, 20); - CALL inserir_mob('Zumbi', 'agressivo', TRUE, 15, 25); - CALL inserir_mob('Aranha', 'agressivo', TRUE, 10, 16); - CALL inserir_mob('Esqueleto', 'agressivo', TRUE, 10, 20); - CALL inserir_mob('Bruxa', 'agressivo', TRUE, 12, 26); - CALL inserir_mob('Guardião', 'agressivo', TRUE, 30, 30); - CALL inserir_mob('Pilhador', 'agressivo', TRUE, 20, 24); + CALL inserir_mob('Creeper', 'agressivo', TRUE, 20, 20); + CALL inserir_mob('Zumbi', 'agressivo', TRUE, 3, 25); + CALL inserir_mob('Aranha', 'agressivo', TRUE, 2, 16); + CALL inserir_mob('Esqueleto', 'agressivo', TRUE, 3, 20); + CALL inserir_mob('Bruxa', 'agressivo', TRUE, 5, 26); + CALL inserir_mob('Guardião', 'agressivo', TRUE, 6, 30); + CALL inserir_mob('Saqueador', 'agressivo', TRUE, 5, 24); -- Nether (impulsivo = TRUE) - CALL inserir_mob('Piglin Zumbi', 'agressivo', FALSE, 10, 20); - CALL inserir_mob('Piglin', 'agressivo', FALSE, 16, 16); - CALL inserir_mob('Hoglin', 'agressivo', TRUE, 25, 40); - CALL inserir_mob('Ghast', 'agressivo', TRUE, 50, 10); - CALL inserir_mob('Esqueleto Wither', 'agressivo', TRUE, 40, 20); - CALL inserir_mob('Blaze', 'agressivo', TRUE, 20, 20); + CALL inserir_mob('Piglin Zumbi', 'agressivo', FALSE, 8, 20); + CALL inserir_mob('Piglin', 'agressivo', FALSE, 6, 16); + CALL inserir_mob('Hoglin', 'agressivo', TRUE, 10, 40); + CALL inserir_mob('Ghast', 'agressivo', TRUE, 10, 10); + CALL inserir_mob('Esqueleto Wither', 'agressivo', TRUE, 9, 20); + CALL inserir_mob('Blaze', 'agressivo', TRUE, 6, 20); -- Bosses (impulsivo = TRUE) - CALL inserir_mob('Dragão Ender', 'agressivo', TRUE, 100, 200); - CALL inserir_mob('Wither', 'agressivo', TRUE, 50, 300); - CALL inserir_mob('Warden', 'agressivo', TRUE, 80, 500); + CALL inserir_mob('Dragão Ender', 'agressivo', TRUE, 7, 200); + CALL inserir_mob('Wither', 'agressivo', TRUE, 5, 300); + CALL inserir_mob('Warden', 'agressivo', TRUE, 12, 500); + CALL inserir_mob('Herobrine', 'agressivo', TRUE, 999, 999); -- Tabela Estrutura INSERT INTO Estrutura (nome, probabilidade) @@ -16337,9 +16338,9 @@ VALUES ('Esqueleto', 'Osso', 75.00, 1), ('Esqueleto', 'Flecha', 80.00, 2), ('Esqueleto', 'Arco', 10.00, 1), - ('Pilhador', 'Arco', 10.00, 1), - ('Pilhador', 'Flecha', 60.00, 2), - ('Pilhador', 'Bússola', 10.0, 1), + ('Saqueador', 'Arco', 10.00, 1), + ('Saqueador', 'Flecha', 60.00, 2), + ('Saqueador', 'Bússola', 10.0, 1), -- Pacíficos ('Galinha', 'Pena', 70.00, 1), @@ -16524,115 +16525,6 @@ VALUES ('Machado de Diamante', 'Campo de Cana de Açúcar'), ('Machado de Netherita', 'Campo de Cana de Açúcar'); --- Spawnar mobs agressivos em cada chunk -CREATE OR REPLACE PROCEDURE spawn_mobs_agressivos() LANGUAGE plpgsql AS $$ -DECLARE - chunk_rec RECORD; - rand_num FLOAT; -BEGIN - -- Iterando por todos os chunks no mapa "Superfície" para spawnar mobs agressivos à noite - FOR chunk_rec IN - SELECT numero, nome_bioma - FROM Chunk - WHERE nome_mapa = 'Superfície' - LOOP - -- Zumbi (spawn em Planície, Floresta, Pântano e Deserto) - IF chunk_rec.nome_bioma IN ('Planície', 'Floresta', 'Pântano', 'Deserto') THEN - rand_num := random() * 100; - IF rand_num <= 70.00 THEN - CALL inserir_inst_mob('Zumbi', 20, chunk_rec.numero, 'Superfície', NULL); - END IF; - END IF; - - -- Esqueleto (spawn em Planície, Montanha, Floresta e Deserto) - IF chunk_rec.nome_bioma IN ('Planície', 'Montanha', 'Floresta', 'Deserto') THEN - rand_num := random() * 100; - IF rand_num <= 60.00 THEN - CALL inserir_inst_mob('Esqueleto', 20, chunk_rec.numero, 'Superfície', NULL); - END IF; - END IF; - - -- Aranha (spawn em Floresta, Pântano e Deserto) - IF chunk_rec.nome_bioma IN ('Floresta', 'Pântano', 'Deserto') THEN - rand_num := random() * 100; - IF rand_num <= 50.00 THEN - CALL inserir_inst_mob('Aranha', 16, chunk_rec.numero, 'Superfície', NULL); - END IF; - END IF; - - -- Enderman (spawn em Planície, Deserto) - IF chunk_rec.nome_bioma IN ('Planície', 'Deserto') THEN - rand_num := random() * 100; - IF rand_num <= 10.00 THEN - CALL inserir_inst_mob('Enderman', 40, chunk_rec.numero, 'Superfície', NULL); - END IF; - END IF; - - -- Creeper (spawn em Floresta, Planície e Deserto) - IF chunk_rec.nome_bioma IN ('Floresta', 'Planície', 'Deserto') THEN - rand_num := random() * 100; - IF rand_num <= 30.00 THEN - CALL inserir_inst_mob('Creeper', 20, chunk_rec.numero, 'Superfície', NULL); - END IF; - END IF; - - -- Bruxa (spawn em Pântano) - IF chunk_rec.nome_bioma = 'Pântano' THEN - rand_num := random() * 100; - IF rand_num <= 7.00 THEN - CALL inserir_inst_mob('Bruxa', 26, chunk_rec.numero, 'Superfície', NULL); - END IF; - END IF; - - -- Pilhador (spawn em Planície, Montanha e Deserto) - IF chunk_rec.nome_bioma IN ('Planície', 'Montanha', 'Deserto') THEN - rand_num := random() * 100; - IF rand_num <= 10.00 THEN - CALL inserir_inst_mob('Pilhador', 24, chunk_rec.numero, 'Superfície', NULL); - END IF; - END IF; - - END LOOP; -END; -$$; - --- Remover mobs da Superfície quando ficar de dia, apenas mobs que não estão em estruturas -CREATE OR REPLACE PROCEDURE despawn_mobs_agressivos() LANGUAGE plpgsql AS $$ -BEGIN - DELETE FROM InstanciaMob - WHERE nome_mob IN ('Zumbi', 'Esqueleto', 'Aranha', 'Enderman', 'Creeper', 'Bruxa', 'Pilhador') - AND nome_mapa = 'Superfície' - AND id_estrutura IS NULL; -END; -$$; - --- Criação da stored procedure para atualizar a hora -CREATE OR REPLACE PROCEDURE atualizar_ciclo_dia() LANGUAGE plpgsql AS -$$ -DECLARE - hora_atual ciclo_dia; -- Declara uma variável para armazenar o valor atual da hora -BEGIN - -- Atualiza o ciclo do dia apenas para o mapa 'Superficie' - UPDATE Mapa - SET hora = CASE - WHEN hora = 'dia' THEN 'tarde'::ciclo_dia - WHEN hora = 'tarde' THEN 'noite'::ciclo_dia - WHEN hora = 'noite' THEN 'dia'::ciclo_dia - ELSE 'dia'::ciclo_dia - END - WHERE nome = 'Superfície' - RETURNING hora INTO hora_atual; -- Armazena a hora atualizada na variável - - -- Verifica o novo ciclo do dia e executa as ações apropriadas - IF hora_atual = 'noite' THEN - -- Se for noite, spawna mobs agressivos - CALL spawn_mobs_agressivos(); - ELSIF hora_atual = 'dia' THEN - -- Se for dia, remove mobs agressivos - CALL despawn_mobs_agressivos(); - END IF; -END; -$$; -- Agendamento da stored procedure para rodar a cada 10 minutos SELECT cron.schedule( diff --git a/db/dml_inst.sql b/db/dml_inst.sql index 1413ea6..e022a0a 100644 --- a/db/dml_inst.sql +++ b/db/dml_inst.sql @@ -108,8 +108,8 @@ BEGIN 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('Pilhador', 24, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id); - CALL inserir_inst_mob('Pilhador', 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); + CALL inserir_inst_mob('Saqueador', 24, chunk_rec.numero, chunk_rec.nome_mapa, nova_estrutura_id); CONTINUE; END IF; diff --git a/db/trigger_SP.sql b/db/trigger_SP.sql index 21a76d3..efb4330 100644 --- a/db/trigger_SP.sql +++ b/db/trigger_SP.sql @@ -1,5 +1,5 @@ -------------------------------------------------------------------------------------------------------- --------------------------------- Generalização/Especialização dos itens -------------------------------- +-------------------------------- GENERALIZAÇÃO/ESPECIALIZAÇÃO DE ITENS --------------------------------- -------------------------------------------------------------------------------------------------------- --- REMOVE A PERMISSÃO DE INSERIR DIRETAMENTE NAS TABELAS @@ -174,7 +174,7 @@ BEFORE UPDATE ON Craftavel FOR EACH ROW EXECUTE PROCEDURE prevencao_update_tipo_item_craftavel(); -------------------------------------------------------------------------------------------------------- --------------------------------- Generalização/Especialização dos mobs -------------------------------- +-------------------------------- GENERALIZAÇÃO/ESPECIALIZAÇÃO DE MOBS ---------------------------------- -------------------------------------------------------------------------------------------------------- --- REMOVE A PERMISSÃO DE INSERIR DIRETAMENTE NAS TABELAS @@ -358,6 +358,7 @@ BEFORE INSERT ON Pacifico FOR EACH ROW EXECUTE PROCEDURE check_existe_agressivo(); --- CHECAR INSERÇÃO DA VIDA DO MOB NA TABELA + CREATE OR REPLACE FUNCTION checar_vida_mob() RETURNS trigger AS $checar_vida_mob$ BEGIN @@ -410,9 +411,29 @@ BEFORE INSERT OR UPDATE ON InstanciaMob FOR EACH ROW EXECUTE FUNCTION checar_vida_mob(); +-------------------------------------------------------------------------------------------------------- +---------------------------------- MANIPULAÇÃO DE TABELAS INSTÂNCIA ------------------------------------ +-------------------------------------------------------------------------------------------------------- +--- INSERIR INSTÂNCIA DE MOB + +CREATE OR REPLACE PROCEDURE inserir_inst_mob( + nome_mob VARCHAR, + vida_atual INT, + numero_chunk INT, + nome_mapa VARCHAR, + id_estrutura INT +) +LANGUAGE plpgsql +AS $$ +BEGIN + -- Inserir o mob na tabela InstanciaMob + INSERT INTO InstanciaMob (nome_mob, vida_atual, numero_chunk, nome_mapa, id_estrutura) + VALUES (nome_mob, vida_atual, numero_chunk, nome_mapa, id_estrutura); +END; +$$; --- ANALISAR COM BRUNO DEPOIS +--- INSERIR INSTÂNCIA DE ESTRUTURA CREATE OR REPLACE PROCEDURE inserir_inst_estrutura( nome_estrutura VARCHAR, @@ -431,21 +452,7 @@ BEGIN END; $$; -CREATE OR REPLACE PROCEDURE inserir_inst_mob( - nome_mob VARCHAR, - vida_atual INT, - numero_chunk INT, - nome_mapa VARCHAR, - id_estrutura INT -) -LANGUAGE plpgsql -AS $$ -BEGIN - -- Inserir o mob na tabela InstanciaMob - INSERT INTO InstanciaMob (nome_mob, vida_atual, numero_chunk, nome_mapa, id_estrutura) - VALUES (nome_mob, vida_atual, numero_chunk, nome_mapa, id_estrutura); -END; -$$; +--- INSERIR INSTÂNCIA DE FONTE CREATE OR REPLACE PROCEDURE inserir_inst_fonte( nome_fonte VARCHAR, @@ -461,6 +468,8 @@ BEGIN END; $$; +--- INSERIR INSTÂNCIA DE CONSTRUÍVEL + CREATE OR REPLACE PROCEDURE inserir_inst_construivel( nome_construivel VARCHAR, numero_chunk INT, @@ -479,6 +488,116 @@ $$; ------------------------------------ PROCEDURES PARA A GAMEPLAY --------------------------------------- -------------------------------------------------------------------------------------------------------- +--- SPAWN DE MOBS AGRESSIVOS NA SUPERFÍCIE AO ANOITECER +CREATE OR REPLACE PROCEDURE spawn_mobs_agressivos() LANGUAGE plpgsql AS $$ +DECLARE + chunk_rec RECORD; + rand_num FLOAT; +BEGIN + -- Iterando por todos os chunks no mapa "Superfície" para spawnar mobs agressivos à noite + FOR chunk_rec IN + SELECT numero, nome_bioma + FROM Chunk + WHERE nome_mapa = 'Superfície' + LOOP + -- Zumbi (spawn em Planície, Floresta, Pântano e Deserto) + IF chunk_rec.nome_bioma IN ('Planície', 'Floresta', 'Pântano', 'Deserto') THEN + rand_num := random() * 100; + IF rand_num <= 70.00 THEN + CALL inserir_inst_mob('Zumbi', 20, chunk_rec.numero, 'Superfície', NULL); + END IF; + END IF; + + -- Esqueleto (spawn em Planície, Montanha, Floresta e Deserto) + IF chunk_rec.nome_bioma IN ('Planície', 'Montanha', 'Floresta', 'Deserto') THEN + rand_num := random() * 100; + IF rand_num <= 60.00 THEN + CALL inserir_inst_mob('Esqueleto', 20, chunk_rec.numero, 'Superfície', NULL); + END IF; + END IF; + + -- Aranha (spawn em Floresta, Pântano e Deserto) + IF chunk_rec.nome_bioma IN ('Floresta', 'Pântano', 'Deserto') THEN + rand_num := random() * 100; + IF rand_num <= 50.00 THEN + CALL inserir_inst_mob('Aranha', 16, chunk_rec.numero, 'Superfície', NULL); + END IF; + END IF; + + -- Enderman (spawn em Planície, Deserto) + IF chunk_rec.nome_bioma IN ('Planície', 'Deserto') THEN + rand_num := random() * 100; + IF rand_num <= 10.00 THEN + CALL inserir_inst_mob('Enderman', 40, chunk_rec.numero, 'Superfície', NULL); + END IF; + END IF; + + -- Creeper (spawn em Floresta, Planície e Deserto) + IF chunk_rec.nome_bioma IN ('Floresta', 'Planície', 'Deserto') THEN + rand_num := random() * 100; + IF rand_num <= 30.00 THEN + CALL inserir_inst_mob('Creeper', 20, chunk_rec.numero, 'Superfície', NULL); + END IF; + END IF; + + -- Bruxa (spawn em Pântano) + IF chunk_rec.nome_bioma = 'Pântano' THEN + rand_num := random() * 100; + IF rand_num <= 7.00 THEN + CALL inserir_inst_mob('Bruxa', 26, chunk_rec.numero, 'Superfície', NULL); + END IF; + END IF; + + -- Saqueador (spawn em Planície, Montanha e Deserto) + IF chunk_rec.nome_bioma IN ('Planície', 'Montanha', 'Deserto') THEN + rand_num := random() * 100; + IF rand_num <= 10.00 THEN + CALL inserir_inst_mob('Saqueador', 24, chunk_rec.numero, 'Superfície', NULL); + END IF; + END IF; + + END LOOP; +END; +$$; + +--- DESPAWN DE MOBS AGRESSIVOS NA SUPERFÍCIE AO AMANHECER, APENAS MOBS FORA DE ESTRUTURAS +CREATE OR REPLACE PROCEDURE despawn_mobs_agressivos() LANGUAGE plpgsql AS $$ +BEGIN + DELETE FROM InstanciaMob + WHERE nome_mob IN ('Zumbi', 'Esqueleto', 'Aranha', 'Enderman', 'Creeper', 'Bruxa', 'Saqueador') + AND nome_mapa = 'Superfície' + AND id_estrutura IS NULL; +END; +$$; + +-- ATUALIZAÇÃO DO CICLO DO DIA +CREATE OR REPLACE PROCEDURE atualizar_ciclo_dia() LANGUAGE plpgsql AS +$$ +DECLARE + hora_atual ciclo_dia; -- Declara uma variável para armazenar o valor atual da hora +BEGIN + -- Atualiza o ciclo do dia apenas para o mapa 'Superficie' + UPDATE Mapa + SET hora = CASE + WHEN hora = 'dia' THEN 'tarde'::ciclo_dia + WHEN hora = 'tarde' THEN 'noite'::ciclo_dia + WHEN hora = 'noite' THEN 'dia'::ciclo_dia + ELSE 'dia'::ciclo_dia + END + WHERE nome = 'Superfície' + RETURNING hora INTO hora_atual; -- Armazena a hora atualizada na variável + + -- Verifica o novo ciclo do dia e executa as ações apropriadas + IF hora_atual = 'noite' THEN + -- Se for noite, spawna mobs agressivos + CALL spawn_mobs_agressivos(); + ELSIF hora_atual = 'dia' THEN + -- Se for dia, remove mobs agressivos + CALL despawn_mobs_agressivos(); + END IF; +END; +$$; + --- FUNCTION PARA MOVER JOGADOR CREATE OR REPLACE FUNCTION mover_jogador(