Skip to content

Commit

Permalink
Merge pull request #25 from SBD1/feat/finish-battle
Browse files Browse the repository at this point in the history
Feat/finish battle
  • Loading branch information
PedroLimass authored Dec 12, 2023
2 parents b084c74 + 6f18cc7 commit 1c76a3f
Show file tree
Hide file tree
Showing 13 changed files with 409 additions and 88 deletions.
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
build:
docker-compose -f game/docker-compose.yml up -d
docker-compose -f game/docker-compose.yml up -d
cd game/FrontEnd && npm install
stop:
docker-compose -f game/docker-compose.yml stop
down:
Expand Down
54 changes: 53 additions & 1 deletion game/Backend/postgres/migrations/2_functions.sql
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ BEGIN

-- Insere um torso para o novo personagem
INSERT INTO parte (idPersonagem, tipoParte, hpMax, hpAtual, probAcerto)
VALUES (NEW.id_personagem, 'Torso', 200, 200, 0.5);
VALUES (NEW.id_personagem, 'Torso', 150, 150, 0.5);

-- Insere uma cabeça para o novo personagem
INSERT INTO parte (idPersonagem, tipoParte, hpMax, hpAtual, probAcerto)
Expand All @@ -177,3 +177,55 @@ CREATE TRIGGER trigger_criar_partes_personagem
AFTER INSERT ON Personagem
FOR EACH ROW
EXECUTE FUNCTION criar_partes_personagem();


CREATE OR REPLACE FUNCTION atualizar_hp_personagem_jogavel()
RETURNS TRIGGER AS $$
DECLARE
somaHp NUMERIC;
somaPeso NUMERIC;
hpPonderado NUMERIC;
hpCabeça INTEGER;
hpTorso INTEGER;
BEGIN
-- Verificar se o hpAtual do torso ou da cabeça é zero
SELECT
MAX(CASE WHEN tipoParte = 'Cabeça' THEN hpAtual ELSE NULL END),
MAX(CASE WHEN tipoParte = 'Torso' THEN hpAtual ELSE NULL END)
INTO hpCabeça, hpTorso
FROM parte
WHERE idPersonagem = NEW.idPersonagem;

IF hpCabeça = 0 OR hpTorso = 0 THEN
-- Se a cabeça ou o torso estiver em 0, definir hpAtual do personagem para 0
UPDATE personagem_jogavel SET hpAtual = 0 WHERE id_personagem = NEW.idPersonagem;
ELSE
-- Calcular a soma ponderada dos hps e dos pesos das partes do corpo
SELECT SUM(hpAtual * peso), SUM(peso)
INTO somaHp, somaPeso
FROM (
SELECT hpAtual, CASE
WHEN tipoParte IN ('Perna') THEN 2
WHEN tipoParte IN ('Braço') THEN 1
WHEN tipoParte IN ('Cabeça', 'Torso') THEN 4
END as peso
FROM parte
WHERE idPersonagem = NEW.idPersonagem
) AS subquery;

-- Calcular a média ponderada do HP
hpPonderado := somaHp / somaPeso;

-- Atualiza hpAtual do personagem jogável com a média ponderada calculada
UPDATE personagem_jogavel SET hpAtual = hpPonderado WHERE id_personagem = NEW.idPersonagem;
END IF;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_atualizar_hp_personagem_jogavel
AFTER UPDATE ON parte
FOR EACH ROW
EXECUTE FUNCTION atualizar_hp_personagem_jogavel();

38 changes: 33 additions & 5 deletions game/Backend/postgres/migrations/3_data.sql
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ VALUES
'Floresta',
'O bosque que fica ao redor da cidade.',
FALSE
);
),
('Calabouços de Eldor', 'Os calabouços antigos abaixo da cidade, dizem que são amaldiçoados pelos espíritos dos antigos prisioneiros.', TRUE),
('Torre do Mago', 'Uma torre misteriosa onde um mago poderoso realiza seus estudos e experimentos mágicos.', FALSE);


INSERT INTO
Expand Down Expand Up @@ -70,13 +72,26 @@ VALUES
'Interior',
'À medida que se adentra mais profundamente, a trilha se torna mais sinuosa e menos definida, levando os visitantes a um labirinto de sombras e incertezas. A floresta parece guardar segredos antigos e histórias esquecidas, onde cada sussurro do vento e movimento furtivo nas sombras pode ser o prenúncio de horrores ocultos. Neste cenário, a entrada da floresta é mais do que um simples começo de trilha; é um convite ao coração de um pesadelo natural, onde o medo e o fascínio caminham lado a lado.'
);


INSERT INTO local (idRegiao, nomeL, imgTexto)
VALUES
(4, 'Cela Subterrânea', 'Uma pequena cela dentro dos calabouços, escurecida e úmida, com marcas de luta nas paredes.'),
(4, 'Laboratório Secreto', 'O laboratório secreto do mago, cheio de pergaminhos, poções e instrumentos mágicos.');



-- Primeiro, inserimos um personagem que será jogável
INSERT INTO
personagem (nome, idLocal, tipoP, dinheiro, atq)
VALUES
('Jogador Heroico', 1, 'personagem_jogavel', 1000, 20) RETURNING id_personagem;
('Jogador Heroico', 1, 'personagem_jogavel', 800, 30) RETURNING id_personagem;


INSERT INTO personagem (nome, idLocal, tipoP, dinheiro, atq, agilidade, defesaM, defesa)
VALUES
('Cavaleiro Errante', 1, 'personagem_jogavel', 1000, 30, 15, 10, 40),
('Mago Ancestral', 1, 'personagem_jogavel', 1500, 40, 20, 30, 50) RETURNING id_personagem;

-- Suponha que o ID retornado seja 1, usamos esse ID para inserir na tabela PersonagemJogavel
INSERT INTO
Expand All @@ -100,22 +115,35 @@ VALUES
'Cota de Malha'
);

INSERT INTO personagem_jogavel (id_personagem, hpAtual, hpMax, menteAtual, menteMax, arma, armadura)
VALUES
(2, 100, 100, 30, 30, 'Espada Bastarda', 'Armadura Completa'),
(3, 100, 100, 100, 100, 'Cajado de Cristal', 'Túnica de Seda');

-- Inserir NPCs na tabela personagem
-- Suponha que os IDs de Local correspondam aos inseridos anteriormente nas tabelas de Região e Local
INSERT INTO
personagem (nome, idLocal, tipoP, dinheiro)
VALUES
('Lojista da Fonte', 1, 'personagem_nao_jogavel', 0),
('Ermitão da Praça', 2, 'personagem_nao_jogavel', 0)
('Ermitão da Praça', 2, 'personagem_nao_jogavel', 0),
('Bandido da Floresta', 3, 'personagem_nao_jogavel', 0),
('Espectro do Cemitério', 3, 'personagem_nao_jogavel', 0),
('Golem de Pedra', 4, 'personagem_nao_jogavel', 0),
('Feiticeira Sombria', 4, 'personagem_nao_jogavel', 0)
RETURNING id_personagem;

-- Inserir detalhes dos NPCs na tabela personagem_nao_jogavel
-- Suponha que os IDs retornados correspondam aos nomes dos NPCs acima
INSERT INTO
personagem_nao_jogavel (id_personagem, descricao, fala, imgTexto, tipoPnj)
VALUES
(2, 'O guardião eterno da fonte, observa e cuida dela.', 'As águas ainda fluem puras...', null, 'Lojista'),
(3, 'Uma sombra ameaçadora que assombra os limites da praça. ', 'Encontre seu caminho ou perca-se tentando...', null, 'Inimigo');
(4, 'O guardião eterno da fonte, observa e cuida dela.', 'As águas ainda fluem puras...', null, 'Lojista'),
(5, 'Uma sombra ameaçadora que assombra os limites da praça. ', 'Encontre seu caminho ou perca-se tentando...', null, 'Inimigo'),
(6, 'Um bandido que assalta viajantes na floresta.', 'Isso é um assalto! Passa tudo!', null, 'Inimigo'),
(7, 'Uma alma penada que assombra o cemitério local.', 'Oooooooh... Deixe-me descansar!', null, 'Inimigo'),
(8, 'Uma criatura mágica feita de pedra e terra.', '... ... ...', null, 'Inimigo'),
(9, 'Uma feiticeira que pratica artes obscuras.', 'Você não sabe com o que está lidando!', null, 'Inimigo');


-- Inserting items into the 'item' table
Expand Down
10 changes: 10 additions & 0 deletions game/Backend/src/Services/PersonagemServicesDB.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,13 @@ export const getPartesPersonagem = async (id_personagem) => {
`;
return await getDBConnection(query);
};


export const rewardPersonagem = async (id_personagem) => {
const query = `
UPDATE inventario
SET dinAtual = dinAtual + 100
WHERE id_personagem = ${id_personagem};
`;
return await getDBConnection(query);
};
3 changes: 2 additions & 1 deletion game/Backend/src/Services/compraServiceDB.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export const ItemComprados = async () => {
};

export const putParteAtualizarHP = async (id, hp) => {
const query = `UPDATE parte SET hpAtual = ${hp} WHERE idParte = ${id};`;
const query = `UPDATE parte SET hpAtual = ${hp} WHERE idParte = ${id};
COMMIT;`;
return await getDBConnection(query);
};
13 changes: 13 additions & 0 deletions game/Backend/src/controller/PersonagemController.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
getPersonagensNaoJogaveisPorLocal,
getPersonagensNaoJogaveisPorId,
getPartesPersonagem,
rewardPersonagem,
} from "../Services/PersonagemServicesDB.js";
class PersonagemController {
async getItemPersonagem(req, res) {
Expand Down Expand Up @@ -113,6 +114,18 @@ class PersonagemController {
return res.status(500).json({ error: "Internal Server Error" });
}
}

async rewardPersonagem(req, res) {
try {
const { id_personagem } = req.params;

const response = (await rewardPersonagem(id_personagem)) ?? null;
return res.status(200).json(response);
} catch (error) {
console.error(error.message);
return res.status(500).json({ error: "Internal Server Error" });
}
}
}

export default new PersonagemController();
5 changes: 5 additions & 0 deletions game/Backend/src/routes/routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ routes.get(
PersonagemController.getPersonagensById
);

// Rota para recompensa
routes.put("/personagem/reward/:id_personagem", PersonagemController.rewardPersonagem);

routes.get("/personagem_jogavel", PersonagemController.getPersonagensJogaveis);

routes.get(
Expand Down Expand Up @@ -66,4 +69,6 @@ routes.get("/item", ItensController.getItens);
routes.post("/comprarItem/:idPersonagem/:idItem", CompraController.ComprarItem);
routes.get("/comprarItem/inventario", CompraController.ItemComprados);



export default routes;
5 changes: 5 additions & 0 deletions game/FrontEnd/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import Game from "./pages/Game";
import Home from "./pages/Home";
import Personagem from "./pages/Personagem";
import Regiao from "./pages/Regiao";
import EndGame from "./pages/EndGame";

function App() {
// const [count, setCount] = useState(0);
Expand Down Expand Up @@ -47,6 +48,10 @@ function App() {
path: "/batalha/:idRegiao/:idPersonagemJogavel/:idInimigo",
element: <Batalha />,
},
{
path: "/endgame",
element: <EndGame />,
},
]);

return (
Expand Down
1 change: 1 addition & 0 deletions game/FrontEnd/src/components/InimigoModal/styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export const Body = styled.div`
height: 80%;
justify-content: center;
align-items: center;
gap: 1%;
ul {
display: flex;
Expand Down
Loading

0 comments on commit 1c76a3f

Please sign in to comment.