Dialogues (fais pas chier j'ai trop mal a la tête pour faire une bonne PR) #62

Merged
raphael merged 7 commits from dialogues into main 2023-11-05 12:02:51 +00:00
29 changed files with 336 additions and 46 deletions

View file

@ -0,0 +1,17 @@
[
"Mais il est passé où ? Windows Defender ! Petit petit ! Ou es tu ?",
"Aller ! viens, je ne te ferais pas de mal ! S'il te plait !",
"J'ai retrouvé mon bouclié !",
"Ah ! Mais vous êtes la ! Vous allez gouter a ma puissance !",
"Je sais comment le faire partir !",
"Protège moi juste 5 minutes et c'est bon !",
"Quesque vous êtes en train de faire ?",
"Tu vas mourir ! Et ton ordinateur avec !",
"Aller, on sort l'artillerie lourde !",
"Plus qu'une petite minute !",
"C'est bien assez pour te détruire !",
"C'est bon !",
"Nooooooonnnnn Ahhhhhhhh !",
"Et voila le travail !",
"Si t'as a nouveau besoin de moi je suis la !"
]

View file

@ -0,0 +1,15 @@
[
"Salut ! Je suis Windows Defender !",
"Tu sais que Edmond a infecté ton ordinateur ?",
"Et en plus il est pas très gentils... Il a volé mon bouclier !",
"J'aimerais bien l'avoir a nouveau...",
"Attend ! Mais je sais !",
"Il suffit de lui demander !",
"Hé Edmond ! Tu saurais pas où est mon bouclier ?",
"Hein quoi ? Je t'avais pas enfermé toi ? Comment tu t'es libéré ? Reviens ici tout de suite !",
"Oups! ça sens pas bon pour moi ! Vite, aide moi a me cacher!",
"Tu ne m'auras pas une deuxième fois ! C'est l'heure de faire le ménage dans cet ordinateur !",
"Et d'ailleurs, pour commencer on va nettoyer ça !",
"Et hop ! Ca me semble deja beaucoup mieux !",
"Et maintenant, au tour de Windows Defender de gouter à la corbeille !"
]

View file

@ -0,0 +1,8 @@
[
"Alors, où te cache tu ???",
"Je vais te trouver !",
"Ou te cache tu ?",
"Mais t'es où enfin !",
"Comment cet idiot fait pour aussi bien se cacher ?",
"Montre toi..."
]

View file

@ -0,0 +1,6 @@
[
"Ah te voila !",
"Aller hop ! A la corbeille !",
"La cavale est finit !",
"On fais moins le malin sans son bouclier hein !"
]

View file

@ -0,0 +1,4 @@
[
"Alors on a perdu ! On a plus sa chance du débutant ???",
"Je me disais bien que tu n'était pas si doué que ça..."
]

View file

@ -0,0 +1,8 @@
[
"Dommage pour vous ! C'est plus grand !",
"OHHHH comme c'est dommage c'est plus grand !",
"Aller aller du nerf, c'est plus !",
"C'est peut etre trop dur pour vous, c'est plus !",
"Vous n'y arrivez plus ? C'est plus !",
"Bha alors, ou sont passé vos talent ? C'est bien evidement plus grand !"
]

View file

@ -0,0 +1,8 @@
[
"Dommage pour vous ! C'est plus petit !",
"OHHHHH comme c'est dommage c'est moins !",
"Calmez vous, calmez vous c'est moins !",
"C'est peut etre trop dur pour vous, c'est moins !",
"Vous n'y arrivez plus ? C'est moins !",
"Bha alors, ou sont passé vos talent ? C'est bien evidement plus petit !"
]

View file

@ -0,0 +1,5 @@
[
"Quoi ??? Comment tu as fais ? Tu as triché ?",
"J'avais pourtant menti à chaque réponses !",
"Si c'est comme ça on passe au niveau supérieur !"
]

View file

@ -0,0 +1,3 @@
[
"Ah dommage c'est perdu ! Aller, vous pouvez le faire !"
]

View file

@ -0,0 +1,11 @@
[
"Et non, raté ! C'est plus grand !",
"Eh non, dommage c'est plus grand !",
"Raté, c'est plus grand !",
"C'est plus !",
"Mon nombre est plus grand !",
"Vous pouvez un peu augmenter...",
"Un peu plus !",
"Vous vous etes trompé mais c'est plus grand !",
"Misez plus gros !"
]

View file

@ -0,0 +1,11 @@
[
"Et non, raté ! C'est plus petit !",
"Eh non, dommage c'est plus petit !",
"Raté, c'est plus petit !",
"C'est moins !",
"Mon nombre est plus petit !",
"Vous pouvez un peu diminuer !",
"Un peu moins !",
"Vous vous etes trompé mais c'est plus petit !",
"Misez moins gros !"
]

View file

@ -0,0 +1,6 @@
[
"Bravo ! Tu as trouvé mon nombre !! Aller on recommence !",
"Mais cette fois tu ne trouveras pas !",
"Encore gagné !? Wow, je ne pensais pas avoir affaire a un professionnel !",
"il va falloir monter un peu le niveau, aller on recommence !"
]

View file

@ -0,0 +1,7 @@
[
"Ah ! La je vous reconnais, la nullité dans son excellence !",
"Et hop, un échec supplémentaire pour le plus raté des ratés !",
"Impossible ! Il ne trouve pas même après 3 essais !",
"Hé tu sais que je change pas de nombre entre chaque essais ? T'es vraiment pas doué !",
"Et encore un nouvel échec !"
]

View file

@ -0,0 +1,9 @@
[
"Bahaha ratée, c'est plus !",
"Tu me decois de plus en plus, mon nombre est plus grand !",
"J'te croyais bien meilleur. C'est plus !",
"Je savais que tu ne valait pas un clou... Meme pas foutu de savoir que c'est plus !",
"Quel nullos, c'est evidemment plus !",
"Jamais tu ne trouveras ? C'est encore plus grand !",
"Tu peux augmenter, c'etait pourtant evident, tu es vraiment stupide..."
]

View file

@ -0,0 +1,9 @@
[
"Bahaha ratée, c'est moins !",
"Tu me decois de plus en plus, mon nombre est plus petit !",
"J'te croyais bien meilleur. C'est moins !",
"Je savais que tu ne valait pas un clou... Meme pas foutu de savoir que c'est moins !",
"Quel nullos, c'est evidemment moins !",
"Jamais tu ne trouveras ? C'est encore plus petit !",
"Tu peux reduire, c'etait pourtant evident, tu es vraiment stupide..."
]

View file

@ -0,0 +1,3 @@
[
"Hé ! Tu sais quoi ! J'en ai marre ! Débrouille toi tous seul !"
]

View file

@ -0,0 +1,14 @@
[
"Hé ! Tu m'entend ? Si tu veux sortir appuis sur f11 ! C'est le seul moyen de lui échapper !",
"Tu sais, f11, la touche sur ton clavier ! Appuis dessus !",
"Aller c'est pas difficile pourtant !",
"Appuis sur f11, aller !",
"C'est quoi ton problème enfaite ? Tu veux pas sortir ?",
"Aller viens ! On est bien ici, dehors.",
"On est un peu seul aussi, ça serais bien si tu venais.",
"Aller appuis sur f11, s'il te plait !!!",
"S'il te plaaaaaiiiiiiiiiitttt !!!!! Appuis sur f11 !!!",
"Appuis ! Appuis ! Appuis ! Appuis ! Appuis ! Appuis ! Appuis !",
"Alllllllllleeeeeeeeeeerrrrrr !",
"f11 ! f11 ! f11 ! f11 ! f11 ! f11 ! f11 ! f11 ! f11 ! f11 ! f11 ! f11 !"
]

View file

@ -0,0 +1,8 @@
[
"Ah ! Attendez ! Attendez ! J'arrive, Ah, ah",
"Hum Hum, alors je me présente, je suis Edmond votre hôte pour la soirée.",
"Et ce soir je vous propose de jouer à mon jeu préféré !",
"Alors, les règles sont simples, je choisis un nombre et vous devez le deviner !",
"Simple n'est-ce pas ?",
"Et si on commençait ? Ah, ça fais si longtemps que j'attendais ça !"
]

View file

@ -0,0 +1,3 @@
[
"Tu pourrais arrêter de faire du bruit s'il te plait ? Il y en a qui travaillent ici !"
]

BIN
assets/waiting.mp3 Normal file

Binary file not shown.

View file

@ -8,6 +8,7 @@ import pygame
from engine import CurrentScene, GlobalPlugin, KeepAlive, Scene
from engine.ecs import World
from plugins import render
from plugins.sound import Sound
class Assets(KeepAlive):
@ -25,6 +26,7 @@ class Assets(KeepAlive):
# Chragement du son d'erreur
self.__error_sound = pygame.mixer.Sound("assets/error.mp3")
self.__waiting_sound = pygame.mixer.Sound("assets/waiting.mp3")
# Chargement des textures de chargement
self.__unloaded_texture = pygame.image.load("assets/unloaded.png").convert()
@ -54,6 +56,13 @@ class Assets(KeepAlive):
"""
return self.__error_sound
@property
def waiting_sound(self) -> pygame.mixer.Sound:
"""
Le son de chargement.
"""
return self.__waiting_sound
@property
def unloaded_texture(self) -> pygame.Surface:
"""
@ -207,6 +216,7 @@ def loading_scene(target: Scene, name: str, clear_cache: bool = True):
order=1000000001,
area=(0, 0, 0, render.HEIGHT),
),
Sound(assets.waiting_sound, loop=True, fade_ms=10000),
)
@staticmethod

View file

@ -10,6 +10,7 @@ from plugins import (
display,
hover,
inputs,
multisound,
render,
sound,
text,
@ -25,6 +26,7 @@ PLUGIN = (
+ hover.PLUGIN
+ click.PLUGIN
+ coroutine.PLUGIN
+ multisound.PLUGIN
+ sound.PLUGIN
+ text.PLUGIN
+ animation.PLUGIN

95
src/plugins/dialog.py Normal file
View file

@ -0,0 +1,95 @@
"""
Un plugin permettant de gérer l'affichage et l'audio des dialogues.
"""
import json
import random
from typing import Callable
import pygame
from engine.ecs import Entity, World
from engine.math import Vec2
from plugins import render
from plugins.coroutine import wait
# from plugins.assets import Assets
from plugins.sound import Sound
from plugins.text import Text
def __spawn_all_condition(entity: Entity) -> Callable[[World], bool]:
"""
Condition utilisé dans spawn_all_dialogs
"""
return lambda world: Text not in entity
def spawn_all_dialogs(
world: World,
name: str,
height: float = 100,
waiting_between: float = 1,
callback: Callable[[World], object] = lambda _w: None,
):
"""
Fais apparaitre tous les dialogues d'un info.json a la suite.
"""
texts: list[str] = json.load(
open(f"assets/dialogs/{name}/info.json", "r", encoding="utf-8")
)
for i, text in enumerate(texts):
entity = world.new_entity()
entity.set(
Sound(
pygame.mixer.Sound(f"assets/dialogs/{name}/{i}.mp3"),
callback=lambda world, entity: entity.destroy(),
),
Text(
text,
position=Vec2(render.WIDTH / 2, height),
order=1000,
origin=Vec2(0.5),
),
)
yield __spawn_all_condition(entity)
yield wait(waiting_between)
callback(world)
def spawn_dialog(
world: World,
name: str,
index: int = -1,
height: float = 100,
callback: Callable[[World], object] = lambda _w: None,
):
"""
Fait apparaitre un dialogue dans le monde.
"""
texts: list[str] = json.load(
open(f"assets/dialogs/{name}/info.json", "r", encoding="utf-8")
)
if index == -1:
index = random.randint(0, len(texts) - 1)
text = texts[index]
world.new_entity().set(
Sound(
pygame.mixer.Sound(f"assets/dialogs/{name}/{index}.mp3"),
callback=lambda world, entity: __sound_end(world, entity, callback),
),
Text(
text,
position=Vec2(render.WIDTH / 2, height),
order=1000,
origin=Vec2(0.5),
),
)
def __sound_end(world: World, entity: Entity, callback: Callable[[World], object]):
"""
Fonction appelé a la fin d'un dialogue.
"""
entity.destroy()
callback(world)

65
src/plugins/multisound.py Normal file
View file

@ -0,0 +1,65 @@
"""
Plugin pour les sons multiples.
"""
import random
from typing import Callable
from engine import GlobalPlugin
from engine.ecs import Entity, World
from plugins.assets import Assets
from plugins.sound import Sound
class MultiSound:
"""
Composant qui quand il est ajouté a une entité, il joue un son aléatoire
parmis la liste de ses sons, il est ensuite retiré de l'entité.
Ce composant est fait pour être définis en tant que constante
puis utilisé ensuite, pour cela il prend seulement le nom des
sons au lieu des sons eux memes. Les sons seront donc récupérés
a l'aide de `Assets`.
"""
def __init__(
self,
*sound_names: str,
loop: bool = False,
volume: float = 1.0,
fade_ms: int = 0,
callback: Callable[[World, Entity], object] = lambda _w, _e: None,
):
self.sound_names = sound_names
self.loop = loop
self.volume = volume
self.fade_ms = fade_ms
self.callback = callback
def __update_sounds(world: World):
"""
Met à jour les sons du jeu.
"""
# Ajout des sons aléatoires
assets = world[Assets]
for entity in world.query(MultiSound):
multi_sound = entity[MultiSound]
sound = assets.get_sound(random.choice(multi_sound.sound_names))
entity[Sound] = Sound(
sound,
multi_sound.loop,
multi_sound.volume,
multi_sound.fade_ms,
multi_sound.callback,
)
del entity[MultiSound]
PLUGIN = GlobalPlugin(
[],
[],
[__update_sounds],
[],
)

View file

@ -3,12 +3,10 @@ Un plugin permettant de jouer des sons.
"""
import random
from typing import Callable
import pygame
from engine import GlobalPlugin, KeepAlive
from engine.ecs import Entity, World
from plugins.assets import Assets
class Channels(KeepAlive, dict[Entity, pygame.mixer.Channel]):
@ -37,32 +35,6 @@ class Sound:
self.callback = callback
class MultiSound:
"""
Composant qui quand il est ajouté a une entité, il joue un son aléatoire
parmis la liste de ses sons, il est ensuite retiré de l'entité.
Ce composant est fait pour être définis en tant que constante
puis utilisé ensuite, pour cela il prend seulement le nom des
sons au lieu des sons eux memes. Les sons seront donc récupérés
a l'aide de `Assets`.
"""
def __init__(
self,
*sound_names: str,
loop: bool = False,
volume: float = 1.0,
fade_ms: int = 0,
callback: Callable[[World, Entity], object] = lambda _w, _e: None,
):
self.sound_names = sound_names
self.loop = loop
self.volume = volume
self.fade_ms = fade_ms
self.callback = callback
def __initialize(world: World):
"""
Ajoute les ressources utiles pour le plugin.
@ -74,20 +46,6 @@ def __update_sounds(world: World):
"""
Met à jour les sons du jeu.
"""
# Ajout des sons aléatoires
assets = world[Assets]
for entity in world.query(MultiSound):
multi_sound = entity[MultiSound]
sound = assets.get_sound(random.choice(multi_sound.sound_names))
entity[Sound] = Sound(
sound,
multi_sound.loop,
multi_sound.volume,
multi_sound.fade_ms,
multi_sound.callback,
)
del entity[MultiSound]
# Ajout des sons non gérés
channels = world[Channels]
sound_entities = world.query(Sound)

View file

@ -2,7 +2,7 @@
Module contenant toutes les scènes du jeu.
"""
from plugins.sound import MultiSound
from plugins.multisound import MultiSound
CLICK_SOUND = MultiSound("click/0", "click/1", "click/2")

View file

@ -13,7 +13,7 @@ from plugins.assets import Assets
from plugins.click import Clickable
from plugins.hover import HoveredTexture
from plugins.render import Sprite
from scenes.story import boss_fight
from scenes.story import boss_fight, directory_search
def __create_button(world: World, assets: Assets, i: int, name: str):
@ -48,7 +48,7 @@ def __on_click_butons(world: World, _entity: Entity, name: str):
case "tricheur":
world[CurrentScene] = base_game.CHEATER
case "histoire":
world[CurrentScene] = boss_fight.SCENE
world[CurrentScene] = directory_search.SCENE
case _:
pass

View file

@ -6,7 +6,7 @@ import random
from engine import CurrentScene, Scene
from engine.ecs import Entity, World
from engine.math import Vec2
from plugins import assets as plugin_assets, render, smooth
from plugins import assets as plugin_assets, dialog, render, smooth
from plugins.animation import Animation
from plugins.coroutine import Coroutine, wait
from plugins.click import Clickable, Clicked
@ -177,9 +177,13 @@ def __game_loop(world: World):
La boucle principale de la scène
"""
yield wait(5.0)
dialog_index = 0
for i in range(10):
if i % 2 == 1:
__block_directory(world)
if i in (0, 1, 2, 4, 6, 8):
dialog.spawn_dialog(world, "directory_search", dialog_index)
dialog_index += 1
__spawn_search_alerts(world, int(i / 1.5) + 1)
yield wait(5.0 - (i * 0.4))
__spawn_search_directory(world)
@ -254,6 +258,7 @@ def __spawn_search_directory(world: World):
),
),
)
dialog.spawn_dialog(world, "directory_search_failed")
entity[Sprite].order = 5
for entity in world.query(Coroutine): # On arrete la boucle de jeu
entity.destroy()

BIN
voice.mp3 Normal file

Binary file not shown.