Skip to content

Commit 5831b87

Browse files
committed
feature(py): Adding initial spells to every new character
1 parent 50e5da7 commit 5831b87

File tree

3 files changed

+121
-58
lines changed

3 files changed

+121
-58
lines changed

source/create_character.py

+56-32
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
class Character:
3939

40-
def __init__(self, conn, id = None):
40+
def __init__(self, conn, id=None):
4141
self.conn = conn
4242
self.id = None
4343
self.nome = None
@@ -56,8 +56,8 @@ def __init__(self, conn, id = None):
5656
if not id:
5757
self.get_information()
5858
else:
59-
character_info = self.get_character_info(conn, id)
60-
self.id = character_info[0]
59+
character_info = self.get_character_info(conn, id)
60+
self.id = character_info[0]
6161
self.sub_regiao_id = character_info[1]
6262
self.nome = character_info[2]
6363
self.elemento = character_info[3]
@@ -71,63 +71,87 @@ def __init__(self, conn, id = None):
7171
self.inteligencia = character_info[11]
7272
self.moedas = character_info[12]
7373
self.nivel = character_info[13]
74-
75-
def definy_initial_spells(self, conn):
76-
try:
77-
spells = initial_spells[self.elemento]
78-
79-
with conn.cursor() as cur:
80-
for spell in spells:
81-
spell_id = spell[0]
82-
cur.execute(
83-
"""
84-
SELECT aprender_feitico (%s, %s);
85-
""", (self.id, spell_id)
86-
)
87-
88-
debug(f"Initial Spells learned for '{self.nome}' with success")
89-
except Exception as e:
90-
debug(f"Error: {e}")
91-
raise
9274

9375
def get_information(self):
9476
print("\n === Criação de Personagem === ")
9577
self.nome = input("Digite o nome do personagem: ")
96-
78+
9779
def ask():
9880
return input(f"Escolha o elemento ({', '.join(elements)}): ").lower()
99-
81+
10082
elemento = ask()
10183
lower_case_elements = [elemento.lower() for elemento in elements]
10284
while elemento not in lower_case_elements:
10385
print("Elemento inválido.")
10486
elemento = ask()
105-
87+
10688
self.elemento = elemento.capitalize()
107-
# self.definy_initial_spells(self.conn)
10889

10990
def add_database(self):
11091
try:
11192
with self.conn.cursor() as cur:
11293
cur.execute("SELECT criar_personagem(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", (self.sub_regiao_id, self.nome, self.elemento, self.conhecimento_arcano, self.vida, self.vida_maxima, self.xp, self.xp_total, self.energia_arcana, self.energia_arcana_maxima, self.inteligencia, self.moedas, self.nivel))
113-
self.id = cur.fetchone()[0]
114-
self.conn.commit()
115-
116-
debug(f"Character: Personagem '{self.nome}' adicionado com sucesso!")
94+
result = cur.fetchone()
95+
if result:
96+
self.id = result[0]
97+
self.conn.commit()
98+
debug(f"Character: Personagem '{self.id}' '{self.nome}' adicionado com sucesso!")
99+
else:
100+
debug("Character: Não foi retornado um ID após a criação do personagem.")
117101
return self
118102

119103
except Exception as e:
120104
debug(f"Character: Erro ao adicionar personagem: {e}")
121105

122-
def get_character_info(self, conn, id):
106+
def get_character_info(self, conn, id):
123107
with conn.cursor() as cur:
124108
cur.execute("""
125109
SELECT *
126110
FROM personagem
127111
WHERE id = %s
128112
""", (id,))
129-
result = cur.fetchone()
113+
result = cur.fetchone()
130114
return result
131-
132115

116+
def create_inventory_if_not_exists(self, conn):
117+
with conn.cursor() as cur:
118+
cur.execute(
119+
"SELECT id FROM inventario WHERE personagem_id = %s", (self.id,)
120+
)
121+
result = cur.fetchone()
122+
123+
if not result: # Se não existe, cria o inventário
124+
cur.execute(
125+
"INSERT INTO inventario (personagem_id) VALUES (%s) RETURNING id",
126+
(self.id,)
127+
)
128+
inventory_id = cur.fetchone()[0]
129+
conn.commit()
130+
print(f"✅ Inventário criado para {self.nome} (ID {inventory_id})")
131+
else:
132+
inventory_id = result[0]
133+
134+
return inventory_id
135+
136+
137+
def define_initial_spells(self, conn):
138+
print(f"Definindo feitiços iniciais para {self.nome}...")
139+
try:
140+
inventory_id = self.create_inventory_if_not_exists(conn)
141+
spells = initial_spells[self.elemento]
142+
143+
with conn.cursor() as cur:
144+
for spell in spells:
145+
spell_id = spell[0]
146+
# print(f"Inserindo feitiço {spell_id} no inventário {inventory_id}") # Debug
147+
cur.execute(
148+
"""
149+
INSERT INTO feitico_aprendido (inventario_id, feitico_id)
150+
VALUES (%s, %s);
151+
""", (inventory_id, spell_id)
152+
)
153+
conn.commit()
154+
except Exception as e:
155+
print(f"Erro ao definir feitiços iniciais: {e}")
156+
conn.rollback()
133157

source/database/ddl/procedures.sql

+34-24
Original file line numberDiff line numberDiff line change
@@ -451,47 +451,57 @@ DECLARE
451451
v_possui_feitico_atual BOOLEAN;
452452
v_conhecimento_arcano_suficiente BOOLEAN;
453453
BEGIN
454-
SELECT id
455-
INTO v_inventario_id
454+
-- get character inventory
455+
SELECT id INTO v_inventario_id
456456
FROM inventario
457457
WHERE personagem_id = p_personagem_id;
458458

459-
SELECT de_id
460-
INTO v_requisito_id
459+
-- if doesn't have a inventory, return error
460+
IF v_inventario_id IS NULL THEN
461+
RAISE EXCEPTION 'O personagem % não possui inventário.', p_personagem_id;
462+
END IF;
463+
464+
SELECT de_id INTO v_requisito_id
461465
FROM feitico_requerimento
462466
WHERE para_id = p_feitico_id;
463467

464-
-- Verifica se já possui o feitiço pré-requisito
465-
SELECT EXISTS (
466-
SELECT 1
467-
FROM feitico_aprendido
468-
WHERE inventario_id = v_inventario_id
469-
AND feitico_id = v_requisito_id
468+
SELECT COALESCE(
469+
(SELECT EXISTS (
470+
SELECT 1 FROM feitico_aprendido
471+
WHERE inventario_id = v_inventario_id AND feitico_id = v_requisito_id
472+
)), TRUE
470473
) INTO v_pre_requisito_aprendido;
471474

472-
-- Verifica se já possui o feitiço atual
473475
SELECT EXISTS (
474-
SELECT 1
475-
FROM feitico_aprendido
476-
WHERE inventario_id = v_inventario_id
477-
AND feitico_id = p_feitico_id
476+
SELECT 1 FROM feitico_aprendido
477+
WHERE inventario_id = v_inventario_id AND feitico_id = p_feitico_id
478478
) INTO v_possui_feitico_atual;
479479

480-
-- Verifica se possui conhecimento arcano suficiente para o feitiço
481-
SELECT (p.conhecimento_arcano >= f.conhecimento_arcano_necessario)
482-
INTO v_conhecimento_arcano_suficiente
480+
SELECT COALESCE(
481+
(p.conhecimento_arcano >= f.conhecimento_arcano_necessario), FALSE
482+
) INTO v_conhecimento_arcano_suficiente
483483
FROM personagem p
484484
JOIN feitico f ON f.id = p_feitico_id
485485
WHERE p.id = p_personagem_id;
486486

487-
-- Só aprende o feitiço se ainda não tiver, já possuir o pré-requisito e tiver conhecimento arcano
488-
IF NOT v_possui_feitico_atual
489-
AND v_pre_requisito_aprendido
490-
AND v_conhecimento_arcano_suficiente THEN
491-
INSERT INTO feitico_aprendido(inventario_id, feitico_id)
492-
VALUES (v_inventario_id, p_feitico_id);
487+
IF v_possui_feitico_atual THEN
488+
RAISE NOTICE 'O personagem % já aprendeu este feitiço.', p_personagem_id;
489+
RETURN p_personagem_id;
493490
END IF;
494491

492+
IF NOT v_pre_requisito_aprendido THEN
493+
RAISE NOTICE 'O personagem % não tem o pré-requisito necessário para este feitiço.', p_personagem_id;
494+
RETURN p_personagem_id;
495+
END IF;
496+
497+
IF NOT v_conhecimento_arcano_suficiente THEN
498+
RAISE NOTICE 'O personagem % não tem conhecimento arcano suficiente para aprender este feitiço.', p_personagem_id;
499+
RETURN p_personagem_id;
500+
END IF;
501+
502+
INSERT INTO feitico_aprendido(inventario_id, feitico_id)
503+
VALUES (v_inventario_id, p_feitico_id);
504+
495505
RETURN p_personagem_id;
496506
END;
497507
$$ LANGUAGE plpgsql;

source/interface.py

+31-2
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,32 @@ def inventory(character, conn):
6868

6969
print("-" * 40)
7070

71+
def list_spells(conn, character_id):
72+
with conn.cursor() as cur:
73+
cur.execute("""
74+
SELECT feitico.descricao, feitico.energia_arcana
75+
FROM inventario
76+
JOIN feitico_aprendido ON inventario.id = feitico_aprendido.inventario_id
77+
JOIN feitico ON feitico_aprendido.feitico_id = feitico.id
78+
WHERE inventario.personagem_id = %s;
79+
""", (character_id,))
80+
81+
spells = cur.fetchall()
82+
83+
clear_screen()
84+
print(Style.BRIGHT + Fore.CYAN + f"\n--- Feitiços Disponíveis ---\n" + Style.RESET_ALL)
85+
86+
if not spells:
87+
print(Fore.RED + "Nenhum feitiço aprendido." + Style.RESET_ALL)
88+
else:
89+
for descricao, custo in spells:
90+
print(Fore.CYAN + f" Custo de energia: {custo}" + Style.RESET_ALL)
91+
print(f" {descricao}")
92+
print("-" * 40)
93+
94+
input("\nPressione Enter para continuar...")
95+
96+
7197
def show_enemies(conn, character):
7298
enemys = list_enemys_subregion(conn, character.sub_regiao_id)
7399
if enemys:
@@ -271,7 +297,7 @@ def game_loop(conn):
271297
elif option == "criar":
272298
character = Character(conn)
273299
character.add_database()
274-
character.definy_initial_spells(conn)
300+
character.define_initial_spells(conn)
275301
debug(f"Personagem {character.nome} criado com sucesso!")
276302
ok = True
277303

@@ -282,7 +308,8 @@ def game_loop(conn):
282308
print("1. Navegar")
283309
print("2. Ver status do personagem")
284310
print("3. Ver Inventário")
285-
print("4. Sair")
311+
print("4. Ver feitiços")
312+
print("5. Sair")
286313

287314
option = input("Escolha uma opção: ").lower()
288315
if option == "1":
@@ -294,6 +321,8 @@ def game_loop(conn):
294321
inventory(character, conn)
295322
input("\nPressione Enter para continuar...")
296323
elif option == "4":
324+
list_spells(conn, character.id)
325+
elif option == "5":
297326
print("Saindo do jogo...")
298327
break
299328
else:

0 commit comments

Comments
 (0)