Skip to content

Commit

Permalink
Avancées sur antoinech2#5 : espaces & sauts de ligne
Browse files Browse the repository at this point in the history
  • Loading branch information
fmkr-project committed Jul 13, 2023
1 parent f41f59a commit 9335720
Show file tree
Hide file tree
Showing 19 changed files with 320 additions and 41 deletions.
10 changes: 10 additions & 0 deletions src/bag.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

import numpy as np



class Bag():
"""Classe du Sac du joueur"""
def __init__(self, save):
Expand All @@ -20,11 +22,13 @@ def __init__(self, save):
contents.reverse() # Conservation de l'ordre précédent
self.contents = dict(contents) if contents != [] else {}


def pickup_object(self, mapobject):
"""Incrémentation de la quantité d'un objet lorsqu'il est ramassé"""
self.increment_item(mapobject.parent.id, 1) # Augmentation de la quantité de 1
mapobject.exists = False


def increment_item(self, object_id, qty):
"""Incrémentation de la quantité d'un objet désigné par son identifiant"""
if not object_id in self.contents:
Expand All @@ -34,26 +38,32 @@ def increment_item(self, object_id, qty):
if self.contents[object_id] <= 0:
self.contents[object_id] = 0 # Plus d'objets de ce type


def save(self):
"""Sauvegarde le contenu du sac dans la base de données"""
for item, count in self.contents.items():
self.save_db.cursor().execute("INSERT OR REPLACE INTO bag VALUES (?, ?)", (int(item), int(count)))
self.save_db.commit()


def separate(self, interval):
"""Séparation du contenu du Sac en groupes (listes)"""
print(self.contents)
objects = list(self.contents.keys())
amounts = list(self.contents.values())
corrected_obj = []
corrected_amt = []

# Gestion des qtés à 0
for obj in range(len(objects)):
if amounts[obj] != 0:
corrected_obj.append(objects[obj])
corrected_amt.append(amounts[obj])
objects, amounts = corrected_obj, corrected_amt
groups = []
current_group = []

# Séparation des groupes
while objects != []:
current_group.append((objects[0], amounts[0]))
if len(current_group) >= interval:
Expand Down
4 changes: 4 additions & 0 deletions src/debug.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
FONT = "consolas"
FONT_SIZE = 18



def show_debug_menu(game):
text = f"Debug menu (F3) \n\
==== GAME ==== \n\
Expand Down Expand Up @@ -37,11 +39,13 @@ def show_debug_menu(game):
for (number, cur_text) in enumerate(splited_text):
game.screen.blit(pg.font.SysFont(FONT, FONT_SIZE).render(cur_text, True, (255, 255, 0)), (0, number*(FONT_SIZE + 5)))


def reset_config(game):
shutil.rmtree("stg")
game.is_running = False
game.restart = True


def reset_save(game):
game.save.close()
shutil.rmtree("sav")
Expand Down
39 changes: 29 additions & 10 deletions src/dialogue.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,21 @@
import sqlite3 as sql
import numpy as np

import locale
import locales



class Dialogue():
TALKBOX_TEX_LOCATION = "res/textures/talk_box_next.png"
INFOBOX_TEX_LOCATION = "res/textures/infobox.png"

SOUND_LOCATION = "res/sounds/fx/typewriter.wav"
NAMETAG_POSITION = (30, 45)
TEXT_POSITION = (30, 100)
SOUND_LOCATION = "res/sounds/fx/typewriter.wav" # Chemin vers l'effet sonore de la boîte de texte
NAMETAG_POSITION = (30, 45) # Position du nom du PNJ
TEXT_POSITION = (30, 100) # Position de la boîte de texte
FONT = "consolas" # TODO Appel de la police depuis menu
FONT_SIZE = 16


def __init__(self, game, npc, is_infobox, dialogue_id = 2, infobox_text = []):
# Objets liés
self.game = game
Expand Down Expand Up @@ -55,41 +57,48 @@ def __init__(self, game, npc, is_infobox, dialogue_id = 2, infobox_text = []):
# Texte
self.texts = []
if self.is_infobox:
# Obtention des lignes de texte depuis le fichier infobox / en dur
for line in infobox_text:
if type(line) == int: # Chaîne du fichier locale
self.texts.append(locale.get_substring("infobox", line))
self.texts.append(locales.get_substring("infobox", line))
if type(line) == str: # Chaîne en brut
self.texts.append(line)
else:
# Obtention des lignes de dialogue depuis la BDD
self.texts = self.game.game_data_db.execute("SELECT text_id FROM npc_dialogue WHERE id_npc = ? AND id_dialogue = ? ORDER BY ligne_dialogue ASC", (self.current_npc.id, self.dialogue_id)).fetchall()
for id in range(len(self.texts)):
text = locale.get_substring("dialogue", self.texts[id][0])
self.texts[id] = text # Conversion de l'ID en texte
if len(self.texts) == 0: # Le dialogue demandé n'existe pas
text = locales.get_substring("dialogue", self.texts[id][0])
self.texts[id] = text # Conversion de l'ID en texte
if len(self.texts) == 0: # Le dialogue demandé n'existe pas
raise ValueError(f"Erreur : le dialogue d'ID {self.dialogue_id} du NPC {self.current_npc.id} n'existe pas ou est vide")

# Police TODO Utilisation de la classe Font (menu)
# Police
# TODO Utilisation de la classe Font (menu)
self.font = pg.font.SysFont(self.FONT, self.FONT_SIZE)
self.font_width = max([metric[1] for metric in self.font.metrics("azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN")]) # Chasse maximale pour la police choisie

self.row_length = self.box_x / self.font_width - 7 # longueur max d'une ligne de texte. TODO enlever le -7, solution temporaire
self.row_height = self.font.get_linesize()
self.text_position = [self.TEXT_POSITION[0], self.TEXT_POSITION[1] + self.current_row * self.row_height] # position du texte à afficher

#Affichage du début du texte
# Affichage du début du texte
self.new_line()


def refresh_text_position(self):
"""Actualisation de la position du texte à afficher"""
self.text_position = [self.TEXT_POSITION[0], self.TEXT_POSITION[1] + self.current_row * self.row_height]


def format(self, text):
"""Découpage d'un texte en plusieurs lignes de taille adéquate"""
formatted_text = []
splitted_text = text.split()
text_line = ""
line_length = 0
while splitted_text != []:
# On coupe le texte selon les mots (espaces)
#? espace insécable
word_length = len(splitted_text[0])
if line_length + word_length > self.row_length:
formatted_text.append(text_line)
Expand All @@ -101,16 +110,19 @@ def format(self, text):
formatted_text.append(text_line)
return(formatted_text)


def empty_box(self):
"""Suppression de tout texte présent dans la boîte de dialogue"""
self.box_img = pg.transform.scale(self.box_surf, (self.box_x, self.box_y))
self.box_img.set_colorkey([255, 255, 255])


def close(self):
"""Fermeture du dialogue"""
self.game.player.can_move = True
self.game.dialogue = None


def update(self):
"""Fonction de mise à jour générale"""
# Affichage de la boîte de dialogue
Expand All @@ -120,11 +132,13 @@ def update(self):
if self.game.internal_clock.ticks_since_epoch % self.lettre_cooldown == 0:
self.new_letter()


def nametag_show(self):
"""Ecrit le nom du NPC dans la case au dessus de la boîte de dialogue"""
self.ecrire(self.current_npc.name, self.NAMETAG_POSITION)
# FIXME : clignotement lors du rafraîchissement de la boîte de dialogue


def next_dialogue(self):
"""Passe au dialogue suivant lorsque le joueur presse la touche"""
# Efface le texte précédent
Expand All @@ -145,6 +159,7 @@ def next_dialogue(self):
# Cas où tout le texte est écrit : on passe au dialogue suivant
self.new_line()


def new_line(self):
"""Passe à la ligne suivante du dialogue"""
# Efface le texte précédent
Expand All @@ -162,6 +177,7 @@ def new_line(self):
# Plus de texte, on ferme la boîte de dialogue
self.close()


def new_letter(self):
"""Affiche une nouvelle lettre du texte"""
if self.current_letter_id < len(self.current_text[self.current_row]) - 1:
Expand All @@ -170,6 +186,7 @@ def new_letter(self):
self.ecrire(self.current_text[self.current_row][:self.current_letter_id+1], self.text_position)

pg.mixer.Sound.play(self.tw_sound)
# Retour en bout de ligne
if self.current_letter_id >= len(self.current_text[self.current_row]) - 1 and self.current_row < len(self.current_text) - 1:
self.current_letter_id = 0
self.current_row += 1
Expand All @@ -179,6 +196,7 @@ def new_letter(self):
self.current_letter_id = -1
self.is_writing = False


def ecrire(self, texte, pos, color=(0, 0, 0)):
"""
Affiche le texte sur le cadre de dialogue
Expand All @@ -187,6 +205,7 @@ def ecrire(self, texte, pos, color=(0, 0, 0)):
text_affiche = self.font.render(texte, True, color)
self.box_img.blit(text_affiche, pos)


def show_box(self):
"""Affichage graphique de la boîte"""
rect = self.box_img.get_rect(center=(self.game.screen.get_size()[0]/2, self.game.screen.get_size()[1]-self.box_img.get_height()/2))
Expand Down
Loading

0 comments on commit 9335720

Please sign in to comment.