Skip to content

Commit b8ea5bb

Browse files
committed
video da entrega
1 parent 47f75c8 commit b8ea5bb

23 files changed

+2
-226
lines changed

docs/entrega3/scripts/DDL.sql

Lines changed: 0 additions & 226 deletions
Original file line numberDiff line numberDiff line change
@@ -294,230 +294,4 @@ BEGIN
294294
END;
295295
$$ LANGUAGE plpgsql;
296296

297-
-- Cria o trigger para chamar a função após UPDATE no tipo_item
298-
CREATE TRIGGER trg_atualiza_equipado_tipoitem
299-
AFTER UPDATE OF item_tipo ON tipo_item
300-
FOR EACH ROW
301-
EXECUTE FUNCTION atualiza_equipado_apos_tipoitem_update();
302-
303-
304-
CREATE OR REPLACE PROCEDURE criar_estudante(
305-
p_nome CHAR(100),
306-
p_vida INT,
307-
p_estresse INT,
308-
p_dinheiro INT,
309-
p_id_sala INT
310-
)
311-
LANGUAGE plpgsql
312-
AS $$
313-
DECLARE
314-
v_id_estudante INT;
315-
BEGIN
316-
-- Verifica se a sala existe
317-
IF NOT EXISTS (SELECT 1 FROM sala_comum WHERE id_sala = p_id_sala) THEN
318-
RAISE EXCEPTION 'Sala com id % não existe.', p_id_sala;
319-
END IF;
320-
321-
-- Insere o estudante
322-
INSERT INTO estudante (nome, vida, estresse, total_dinheiro, id_sala)
323-
VALUES (p_nome, p_vida, p_estresse, p_dinheiro, p_id_sala)
324-
RETURNING id_estudante INTO v_id_estudante;
325-
326-
-- Inicializa afinidades com todos os temas
327-
INSERT INTO afinidade (id_estudante, id_tema, xp_atual, nivel_atual)
328-
SELECT v_id_estudante, id_tema, 0, 1 FROM tema;
329-
330-
RAISE NOTICE 'Estudante criado com id % e afinidades configuradas.', v_id_estudante;
331-
END;
332-
$$;
333-
334-
-- registro de vitoria monstro
335-
CREATE OR REPLACE PROCEDURE registrar_vitoria_monstro(
336-
p_id_estudante INT,
337-
p_id_monstro INT
338-
)
339-
LANGUAGE plpgsql
340-
AS $$
341-
DECLARE
342-
v_tema_id INT;
343-
v_xp_ganho INT;
344-
v_moedas INT;
345-
v_xp_atual INT;
346-
v_nivel_atual INT;
347-
BEGIN
348-
-- Obtém o tema do monstro via habilidades
349-
SELECT COALESCE(a.id_tema, c.id_tema, d.id_tema)
350-
INTO v_tema_id
351-
FROM habilidade_criatura hc
352-
LEFT JOIN Ataque a ON hc.id_habilidade = a.id_habilidade
353-
LEFT JOIN Cura c ON hc.id_habilidade = c.id_habilidade
354-
LEFT JOIN Defesa d ON hc.id_habilidade = d.id_habilidade
355-
WHERE hc.id_criatura = p_id_monstro
356-
LIMIT 1;
357-
358-
-- XP e moedas do monstro
359-
SELECT xp_tema, qtd_moedas INTO v_xp_ganho, v_moedas
360-
FROM monstro_simples
361-
WHERE id_criatura = p_id_monstro;
362-
363-
-- XP atual
364-
SELECT xp_atual, nivel_atual INTO v_xp_atual, v_nivel_atual
365-
FROM afinidade
366-
WHERE id_estudante = p_id_estudante AND id_tema = v_tema_id;
367-
368-
-- Atualiza XP e nível
369-
v_xp_atual := v_xp_atual + v_xp_ganho;
370-
WHILE v_xp_atual >= v_nivel_atual * 100 LOOP
371-
v_xp_atual := v_xp_atual - v_nivel_atual * 100;
372-
v_nivel_atual := v_nivel_atual + 1;
373-
END LOOP;
374-
375-
UPDATE afinidade
376-
SET xp_atual = v_xp_atual, nivel_atual = v_nivel_atual
377-
WHERE id_estudante = p_id_estudante AND id_tema = v_tema_id;
378-
379-
-- Atualiza moedas
380-
UPDATE estudante
381-
SET total_dinheiro = total_dinheiro + v_moedas
382-
WHERE id_estudante = p_id_estudante;
383-
END;
384-
$$;
385-
386-
-- dropa reliquia boss
387-
CREATE OR REPLACE PROCEDURE dropar_reliquia_boss(
388-
p_id_estudante INT,
389-
p_id_boss INT
390-
)
391-
LANGUAGE plpgsql
392-
AS $$
393-
DECLARE
394-
v_id_reliquia INT;
395-
v_ja_possui BOOLEAN;
396-
BEGIN
397-
-- Obtém relíquia do boss
398-
SELECT id_reliquia INTO v_id_reliquia
399-
FROM boss
400-
WHERE id_criatura = p_id_boss;
401-
402-
IF v_id_reliquia IS NULL THEN
403-
RAISE EXCEPTION 'Boss com id % não possui relíquia.', p_id_boss;
404-
END IF;
405-
406-
-- Verifica posse
407-
SELECT EXISTS (
408-
SELECT 1 FROM instancia_de_item
409-
WHERE id_estudante = p_id_estudante AND id_item = v_id_reliquia
410-
) INTO v_ja_possui;
411-
412-
IF v_ja_possui THEN
413-
RAISE NOTICE 'Estudante % já possui a relíquia %.', p_id_estudante, v_id_reliquia;
414-
RETURN;
415-
END IF;
416-
417-
-- Entrega relíquia
418-
INSERT INTO instancia_de_item (id_item, id_estudante)
419-
VALUES (v_id_reliquia, p_id_estudante);
420-
421-
RAISE NOTICE 'Relíquia % entregue ao estudante %.', v_id_reliquia, p_id_estudante;
422-
END;
423-
$$;
424-
425-
-- valida sala de estudante
426-
CREATE OR REPLACE FUNCTION validar_sala_estudante()
427-
RETURNS TRIGGER AS $$
428-
BEGIN
429-
IF NOT EXISTS (SELECT 1 FROM sala_comum WHERE id_sala = NEW.id_sala) THEN
430-
RAISE EXCEPTION 'A sala com id % não existe.', NEW.id_sala;
431-
END IF;
432-
RETURN NEW;
433-
END;
434-
$$ LANGUAGE plpgsql;
435-
436-
CREATE TRIGGER trg_valida_sala_estudante
437-
BEFORE INSERT OR UPDATE ON estudante
438-
FOR EACH ROW
439-
EXECUTE FUNCTION validar_sala_estudante();
440-
441-
442-
-- checagem de criatura unica
443-
CREATE OR REPLACE FUNCTION check_criatura_unica()
444-
RETURNS TRIGGER AS $$
445-
BEGIN
446-
IF EXISTS (SELECT 1 FROM boss WHERE id_criatura = NEW.id_criatura)
447-
AND TG_TABLE_NAME = 'monstro_simples' THEN
448-
RAISE EXCEPTION 'Essa criatura já é um boss. Não pode ser monstro simples.';
449-
ELSIF EXISTS (SELECT 1 FROM monstro_simples WHERE id_criatura = NEW.id_criatura)
450-
AND TG_TABLE_NAME = 'boss' THEN
451-
RAISE EXCEPTION 'Essa criatura já é um monstro simples. Não pode ser boss.';
452-
END IF;
453-
RETURN NEW;
454-
END;
455-
$$ LANGUAGE plpgsql;
456-
457-
CREATE TRIGGER trg_check_criatura_boss
458-
BEFORE INSERT OR UPDATE ON boss
459-
FOR EACH ROW EXECUTE FUNCTION check_criatura_unica();
460-
461-
CREATE TRIGGER trg_check_criatura_monstro
462-
BEFORE INSERT OR UPDATE ON monstro_simples
463-
FOR EACH ROW EXECUTE FUNCTION check_criatura_unica();
464-
465-
466-
-- checagem de item
467-
CREATE OR REPLACE FUNCTION check_item_equipavel()
468-
RETURNS TRIGGER AS $$
469-
DECLARE
470-
v_tipo CHAR(10);
471-
BEGIN
472-
SELECT item_tipo INTO v_tipo
473-
FROM tipo_item
474-
WHERE id_item = NEW.id_item;
475-
476-
IF v_tipo <> 'Equipável' AND NEW.equipado IS NOT NULL THEN
477-
RAISE EXCEPTION 'Apenas itens equipáveis podem ter valor em "equipado".';
478-
END IF;
479-
480-
RETURN NEW;
481-
END;
482-
$$ LANGUAGE plpgsql;
483-
484-
CREATE TRIGGER trg_check_equipado
485-
486-
CREATE OR REPLACE PROCEDURE usar_item_consumivel(p_id_estudante INT, p_id_item INT)
487-
LANGUAGE plpgsql
488-
AS $$
489-
DECLARE
490-
v_efeito FLOAT;
491-
v_vida_atual INT;
492-
BEGIN
493-
-- Verifica se o item é consumível
494-
IF NOT EXISTS (
495-
SELECT 1 FROM consumivel WHERE id_item = p_id_item
496-
) THEN
497-
RAISE EXCEPTION 'O item % não é consumível ou não existe.', p_id_item;
498-
END IF;
499-
500-
-- Pega o efeito do item
501-
SELECT efeito INTO v_efeito FROM consumivel WHERE id_item = p_id_item;
502-
503-
-- Pega vida atual
504-
SELECT vida INTO v_vida_atual FROM estudante WHERE id_estudante = p_id_estudante;
505-
506-
-- Aplica o efeito (cura)
507-
UPDATE estudante
508-
SET vida = LEAST(v_vida_atual + v_efeito, 100)
509-
WHERE id_estudante = p_id_estudante;
510-
511-
-- Remove o item consumido
512-
DELETE FROM instancia_de_item
513-
WHERE id_item = p_id_item AND id_estudante = p_id_estudante
514-
LIMIT 1; -- se tiver mais de um item igual, remove só um
515-
516-
RAISE NOTICE 'Item % usado. % pontos de vida recuperados.', p_id_item, v_efeito;
517-
END;
518-
$$;
519-
520-
BEFORE INSERT OR UPDATE ON instancia_de_item
521-
FOR EACH ROW EXECUTE FUNCTION check_item_equipavel();
522297

523-
--
0 Bytes
Binary file not shown.
Binary file not shown.
0 Bytes
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)