From 5cfccbeabe17617182859b96c182184c5aed4846 Mon Sep 17 00:00:00 2001 From: Leonardo Bonetti Date: Sun, 8 Sep 2024 16:40:14 -0300 Subject: [PATCH] Adicao de triggers e adicao do pp --- docker-compose.yml | 7 ++-- docs/sql/ddl/ddl.sql | 2 + docs/sql/dml/dml.sql | 24 +++++------ docs/sql/trigger_procedure/trigger.sql | 58 ++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 15 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index bc4a071..a7d036d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,9 +4,10 @@ services: image: postgres:16.2 volumes: - db-pokemon-data:/var/lib/postgresql/data - - ./docs/sql/ddl/ddl.sql:/docker-entrypoint-initdb.d/ddl.sql - - ./docs/sql/dml/dml.sql:/docker-entrypoint-initdb.d/dml.sql - - ./python/scripts_de_api/cidade.sql:/docker-entrypoint-initdb.d/z.sql + - ./docs/sql/ddl/ddl.sql:/docker-entrypoint-initdb.d/a.sql + - ./docs/sql/dml/dml.sql:/docker-entrypoint-initdb.d/b.sql + - ./python/scripts_de_api/cidade.sql:/docker-entrypoint-initdb.d/c.sql + - ./docs/sql/trigger_procedure/trigger.sql:/docker-entrypoint-initdb.d/d.sql environment: POSTGRES_USER: "pokemon" POSTGRES_PASSWORD: "123456" diff --git a/docs/sql/ddl/ddl.sql b/docs/sql/ddl/ddl.sql index 03c0b01..0c24f05 100644 --- a/docs/sql/ddl/ddl.sql +++ b/docs/sql/ddl/ddl.sql @@ -53,6 +53,7 @@ CREATE TABLE habilidade acuracia INT NOT NULL, nome_efeito VARCHAR, tipo_elemental VARCHAR, + pp INT NOT NULL, FOREIGN KEY (nome_efeito) REFERENCES efeito (nome), FOREIGN KEY (tipo_elemental) REFERENCES tipo_elemental (nome) @@ -192,6 +193,7 @@ CREATE TABLE pokemon_habilidade id_pokemon_habilidade SERIAL PRIMARY KEY, id_pokemon INT, id_habilidade INT, + pp_restante INT, FOREIGN KEY (id_pokemon) REFERENCES pokemon (id_pokemon), FOREIGN KEY (id_habilidade) REFERENCES habilidade (id_habilidade) diff --git a/docs/sql/dml/dml.sql b/docs/sql/dml/dml.sql index 752c055..0b59f11 100644 --- a/docs/sql/dml/dml.sql +++ b/docs/sql/dml/dml.sql @@ -87,12 +87,12 @@ VALUES -- Inserindo dados na tabela 'habilidade' -INSERT INTO habilidade (nome, dano, acuracia, nome_efeito, tipo_elemental) -VALUES ('Lança Chamas', 70, 90, 'queimadura', 'fire'); -INSERT INTO habilidade (nome, dano, acuracia, nome_efeito, tipo_elemental) -VALUES ('Hidro Bomba', 80, 85, 'confusão', 'water'); -INSERT INTO habilidade (nome, dano, acuracia, nome_efeito, tipo_elemental) -VALUES ('Choque do Trovão', 60, 95, 'paralisia', 'electric'); +INSERT INTO habilidade (nome, dano, acuracia, nome_efeito, tipo_elemental, pp) +VALUES ('Lança Chamas', 70, 90, 'queimadura', 'fire', 10); +INSERT INTO habilidade (nome, dano, acuracia, nome_efeito, tipo_elemental, pp) +VALUES ('Hidro Bomba', 80, 85, 'confusão', 'water', 15); +INSERT INTO habilidade (nome, dano, acuracia, nome_efeito, tipo_elemental, pp) +VALUES ('Choque do Trovão', 60, 95, 'paralisia', 'electric', 5); -- Inserindo dados na tabela 'interacao' INSERT INTO interacao (valor, tipo_atacante, tipo_defensor) @@ -443,12 +443,12 @@ INSERT INTO instancia_missao (id_missao, id_jogador, concluida) VALUES (1, 3, false); -- Inserindo dados na tabela 'pokemon_habilidade' -INSERT INTO pokemon_habilidade (id_pokemon, id_habilidade) -VALUES (1, 1); -INSERT INTO pokemon_habilidade (id_pokemon, id_habilidade) -VALUES (2, 2); -INSERT INTO pokemon_habilidade (id_pokemon, id_habilidade) -VALUES (3, 3); +INSERT INTO pokemon_habilidade (id_pokemon, id_habilidade, pp_restante) +VALUES (1, 1, 0); +INSERT INTO pokemon_habilidade (id_pokemon, id_habilidade, pp_restante) +VALUES (2, 2, 1); +INSERT INTO pokemon_habilidade (id_pokemon, id_habilidade, pp_restante) +VALUES (3, 3, 2); -- Inserindo dados na tabela 'terreno_loot' INSERT INTO terreno_loot (id_terreno, id_loot) diff --git a/docs/sql/trigger_procedure/trigger.sql b/docs/sql/trigger_procedure/trigger.sql index 587d7ae..1ceb167 100644 --- a/docs/sql/trigger_procedure/trigger.sql +++ b/docs/sql/trigger_procedure/trigger.sql @@ -104,5 +104,63 @@ CREATE TRIGGER trigger_check_jogador BEFORE UPDATE OR INSERT ON npc FOR EACH ROW EXECUTE PROCEDURE check_jogador(); +-- Trigger para verificar apos o movimento se o jogador está envenenado e se ele se moveu e diminuir a vida +CREATE OR REPLACE FUNCTION verifica_movimento_veneno() +RETURNS TRIGGER AS $$ +BEGIN + IF NEW.status = 'Envenenado' THEN + IF (NEW.posicao <> OLD.posicao) THEN + UPDATE jogador j SET vida = vida-1 WHERE j.id_jogador = NEW.id_jogador; + RAISE NOTICE 'Jogador % perdeu 1 de vida por estar envenenado.', NEW.id_jogador; + END IF; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE TRIGGER trigger_verifica_movimento_veneno +AFTER UPDATE OF posicao ON jogador +FOR EACH ROW +EXECUTE FUNCTION verifica_movimento_veneno(); + +--Trigger para verificar antes de usar um golpe se a habilidade tem PP suficiente +CREATE OR REPLACE FUNCTION verifica_pp_habilidade() +RETURNS TRIGGER AS $$ +BEGIN + IF NEW.pp_restante < 0 THEN + RAISE EXCEPTION 'Habilidade sem PP suficiente para ser usada.'; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE TRIGGER trigger_verifica_pp_habilidade +BEFORE UPDATE OF pp_restante ON pokemon_habilidade +FOR EACH ROW +EXECUTE FUNCTION verifica_pp_habilidade(); + +--Trigger para verificar se o pp_restante ultrapassou que o pp máximo da habilidade +CREATE OR REPLACE FUNCTION verifica_pp_habilidade_maximo() RETURNS TRIGGER AS +$$ +DECLARE + pp_maximo INT; +BEGIN + SELECT pp + INTO pp_maximo + FROM pokemon_habilidade ph + JOIN habilidade h ON h.id_habilidade = ph.id_habilidade + WHERE ph.id_habilidade = NEW.id_habilidade; + IF NEW.pp_restante > pp_maximo THEN + RAISE EXCEPTION 'Não é possível adicionar mais PP do que o máximo.'; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE TRIGGER trigger_verifica_pp_habilidade_maximo +BEFORE UPDATE OF pp_restante ON pokemon_habilidade +FOR EACH ROW +EXECUTE FUNCTION verifica_pp_habilidade_maximo(); +