Skip to content

Commit 5dc8856

Browse files
committed
feature(py): Adding initial items, fixing trigger to update backpack weight and fixing query to get backpack items
1 parent f0e501a commit 5dc8856

File tree

4 files changed

+72
-13
lines changed

4 files changed

+72
-13
lines changed

source/create_character.py

+33-2
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,14 @@ def create_inventory_if_not_exists(self, conn):
120120
)
121121
result = cur.fetchone()
122122

123-
if not result: # Se não existe, cria o inventário
123+
if not result: # if not exist, create new inventory
124124
cur.execute(
125125
"INSERT INTO inventario (personagem_id) VALUES (%s) RETURNING id",
126126
(self.id,)
127127
)
128128
inventory_id = cur.fetchone()[0]
129129
conn.commit()
130-
print(f"Inventário criado para {self.nome} (ID {inventory_id})")
130+
print(f"Inventário criado para {self.nome} (ID {inventory_id})")
131131
else:
132132
inventory_id = result[0]
133133

@@ -155,3 +155,34 @@ def define_initial_spells(self, conn):
155155
print(f"Erro ao definir feitiços iniciais: {e}")
156156
conn.rollback()
157157

158+
def add_initial_items(self, conn):
159+
try:
160+
inventory_id = self.create_inventory_if_not_exists(conn)
161+
162+
elixir_da_vida_id = 133
163+
mana_liquida_id = 134
164+
165+
with conn.cursor() as cur:
166+
cur.execute("""
167+
INSERT INTO item_instancia (item_id, inventario_id)
168+
VALUES (%s, %s)
169+
RETURNING item_id;
170+
""", (elixir_da_vida_id, inventory_id))
171+
172+
cur.execute("""
173+
INSERT INTO item_instancia (item_id, inventario_id)
174+
VALUES (%s, %s)
175+
RETURNING item_id;
176+
""", (elixir_da_vida_id, inventory_id))
177+
178+
cur.execute("""
179+
INSERT INTO item_instancia (item_id, inventario_id)
180+
VALUES (%s, %s)
181+
RETURNING item_id;
182+
""", (mana_liquida_id, inventory_id))
183+
184+
conn.commit()
185+
print(f"Elixir da Vida e Mana Líquida adicionados ao inventário de {self.nome}.")
186+
except Exception as e:
187+
print(f"Erro ao adicionar itens iniciais: {e}")
188+
conn.rollback()

source/database/ddl/triggers.sql

+18-7
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,29 @@
11
-- PostGreSQL:
22
-- `incrementar_peso_acessorio`:
33
-- when character gets a new `acessorio`, it will increment the `peso` of the `mochila`, and if it surpasses `peso_total`, do not allow.
4+
-- PostGreSQL:
45
CREATE OR REPLACE FUNCTION incrementar_peso_acessorio()
56
RETURNS TRIGGER AS $$
67
BEGIN
7-
UPDATE mochila
8-
SET peso = peso + NEW.peso
9-
WHERE id = NEW.inventario_id;
8+
-- search weight in table 'item' with 'item_id'
9+
DECLARE
10+
item_peso NUMERIC;
11+
BEGIN
12+
-- get item weight
13+
SELECT peso INTO item_peso
14+
FROM item
15+
WHERE id = NEW.item_id;
1016

11-
IF (SELECT peso FROM mochila WHERE id = NEW.inventario_id) > (SELECT peso_total FROM mochila WHERE id = NEW.inventario_id) THEN
12-
RAISE EXCEPTION 'Peso total da mochila excedido';
13-
END IF;
17+
UPDATE mochila
18+
SET peso = peso + item_peso
19+
WHERE id = NEW.inventario_id;
1420

15-
RETURN NEW;
21+
IF (SELECT peso FROM mochila WHERE id = NEW.inventario_id) > (SELECT peso_total FROM mochila WHERE id = NEW.inventario_id) THEN
22+
RAISE EXCEPTION 'Peso total da mochila excedido';
23+
END IF;
24+
25+
RETURN NEW;
26+
END;
1627
END;
1728
$$ LANGUAGE plpgsql;
1829

source/interface.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def inventory(character, conn):
6464
else:
6565
for item in items:
6666
nome, descricao, qtd = item
67-
print(f"- {nome} ({descricao}): {qtd}")
67+
print(f"- {nome} ({descricao}) - {qtd}")
6868

6969
print("-" * 40)
7070

@@ -298,6 +298,7 @@ def game_loop(conn):
298298
character = Character(conn)
299299
character.add_database()
300300
character.define_initial_spells(conn)
301+
character.add_initial_items(conn)
301302
debug(f"Personagem {character.nome} criado com sucesso!")
302303
ok = True
303304

source/queries/query.py

+19-3
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,25 @@ def list_character_id(conn, character_id):
117117

118118
def list_item_inventory(conn, character_id):
119119
with conn.cursor() as cur:
120-
cur.execute(f"SELECT i.nome, i.descricao FROM inventario inv JOIN item_instancia ii ON inv.id = ii.inventario_id JOIN item i ON ii.item_id = i.id WHERE inv.personagem_id = {character_id};")
121-
result = cur.fetchall()
122-
return result
120+
cur.execute("""
121+
SELECT id FROM inventario WHERE personagem_id = %s AND tipo = 'Mochila'
122+
""", (character_id,))
123+
124+
inventarios = cur.fetchall()
125+
126+
items = []
127+
for inventario in inventarios:
128+
inventario_id = inventario[0]
129+
cur.execute("""
130+
SELECT item.nome, item.descricao, COUNT(item_instancia.id) as quantidade
131+
FROM item_instancia
132+
JOIN item ON item_instancia.item_id = item.id
133+
WHERE item_instancia.inventario_id = %s
134+
GROUP BY item.nome, item.descricao
135+
""", (inventario_id,))
136+
137+
items.extend(cur.fetchall())
138+
return items
123139

124140
def get_civilian_info(conn, npc_name):
125141
with conn.cursor() as cur:

0 commit comments

Comments
 (0)