@@ -294,230 +294,4 @@ BEGIN
294294END;
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 commit comments