diff --git a/assets/dialogs/after_search/info.json b/assets/dialogs/after_search/info.json new file mode 100644 index 0000000..25a1126 --- /dev/null +++ b/assets/dialogs/after_search/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/cinematique/info.json b/assets/dialogs/cinematique/info.json new file mode 100644 index 0000000..02a3ba9 --- /dev/null +++ b/assets/dialogs/cinematique/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/directory_search/info.json b/assets/dialogs/directory_search/info.json new file mode 100644 index 0000000..115ea1b --- /dev/null +++ b/assets/dialogs/directory_search/info.json @@ -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..." +] \ No newline at end of file diff --git a/assets/dialogs/directory_search_failed/info.json b/assets/dialogs/directory_search_failed/info.json new file mode 100644 index 0000000..a13dfa1 --- /dev/null +++ b/assets/dialogs/directory_search_failed/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/game_menteur/game_over/info.json b/assets/dialogs/game_menteur/game_over/info.json new file mode 100644 index 0000000..87022b7 --- /dev/null +++ b/assets/dialogs/game_menteur/game_over/info.json @@ -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..." +] \ No newline at end of file diff --git a/assets/dialogs/game_menteur/greater/info.json b/assets/dialogs/game_menteur/greater/info.json new file mode 100644 index 0000000..4662001 --- /dev/null +++ b/assets/dialogs/game_menteur/greater/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/game_menteur/less/info.json b/assets/dialogs/game_menteur/less/info.json new file mode 100644 index 0000000..12d221f --- /dev/null +++ b/assets/dialogs/game_menteur/less/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/game_menteur/victory/info.json b/assets/dialogs/game_menteur/victory/info.json new file mode 100644 index 0000000..45bae60 --- /dev/null +++ b/assets/dialogs/game_menteur/victory/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/game_normal/game_over/info.json b/assets/dialogs/game_normal/game_over/info.json new file mode 100644 index 0000000..53d9db7 --- /dev/null +++ b/assets/dialogs/game_normal/game_over/info.json @@ -0,0 +1,3 @@ +[ + "Ah dommage c'est perdu ! Aller, vous pouvez le faire !" +] \ No newline at end of file diff --git a/assets/dialogs/game_normal/greater/info.json b/assets/dialogs/game_normal/greater/info.json new file mode 100644 index 0000000..46ef5d3 --- /dev/null +++ b/assets/dialogs/game_normal/greater/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/game_normal/less/info.json b/assets/dialogs/game_normal/less/info.json new file mode 100644 index 0000000..8dd01dc --- /dev/null +++ b/assets/dialogs/game_normal/less/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/game_normal/victory/info.json b/assets/dialogs/game_normal/victory/info.json new file mode 100644 index 0000000..216ebf0 --- /dev/null +++ b/assets/dialogs/game_normal/victory/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/game_pi/game_over/info.json b/assets/dialogs/game_pi/game_over/info.json new file mode 100644 index 0000000..b8fa676 --- /dev/null +++ b/assets/dialogs/game_pi/game_over/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/game_pi/greater/info.json b/assets/dialogs/game_pi/greater/info.json new file mode 100644 index 0000000..6a1be41 --- /dev/null +++ b/assets/dialogs/game_pi/greater/info.json @@ -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..." +] \ No newline at end of file diff --git a/assets/dialogs/game_pi/less/info.json b/assets/dialogs/game_pi/less/info.json new file mode 100644 index 0000000..90ad656 --- /dev/null +++ b/assets/dialogs/game_pi/less/info.json @@ -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..." +] \ No newline at end of file diff --git a/assets/dialogs/game_pi/victory/info.json b/assets/dialogs/game_pi/victory/info.json new file mode 100644 index 0000000..4382ed1 --- /dev/null +++ b/assets/dialogs/game_pi/victory/info.json @@ -0,0 +1,3 @@ +[ + "Hé ! Tu sais quoi ! J'en ai marre ! Débrouille toi tous seul !" +] \ No newline at end of file diff --git a/assets/dialogs/get_out/info.json b/assets/dialogs/get_out/info.json new file mode 100644 index 0000000..fddc819 --- /dev/null +++ b/assets/dialogs/get_out/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/intro/info.json b/assets/dialogs/intro/info.json new file mode 100644 index 0000000..a9c5b45 --- /dev/null +++ b/assets/dialogs/intro/info.json @@ -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 !" +] \ No newline at end of file diff --git a/assets/dialogs/work/info.json b/assets/dialogs/work/info.json new file mode 100644 index 0000000..1df9cb5 --- /dev/null +++ b/assets/dialogs/work/info.json @@ -0,0 +1,3 @@ +[ + "Tu pourrais arrêter de faire du bruit s'il te plait ? Il y en a qui travaillent ici !" +] \ No newline at end of file diff --git a/assets/waiting.mp3 b/assets/waiting.mp3 new file mode 100644 index 0000000..f80c643 Binary files /dev/null and b/assets/waiting.mp3 differ diff --git a/src/plugins/assets.py b/src/plugins/assets.py index 188357d..e56176e 100644 --- a/src/plugins/assets.py +++ b/src/plugins/assets.py @@ -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 diff --git a/src/plugins/defaults.py b/src/plugins/defaults.py index 6865776..8545e55 100644 --- a/src/plugins/defaults.py +++ b/src/plugins/defaults.py @@ -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 diff --git a/src/plugins/dialog.py b/src/plugins/dialog.py new file mode 100644 index 0000000..3bc5986 --- /dev/null +++ b/src/plugins/dialog.py @@ -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) diff --git a/src/plugins/multisound.py b/src/plugins/multisound.py new file mode 100644 index 0000000..f42e44b --- /dev/null +++ b/src/plugins/multisound.py @@ -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], + [], +) diff --git a/src/plugins/sound.py b/src/plugins/sound.py index 6bc76b8..06597d7 100644 --- a/src/plugins/sound.py +++ b/src/plugins/sound.py @@ -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) diff --git a/src/scenes/__init__.py b/src/scenes/__init__.py index 83db103..e3b14b0 100644 --- a/src/scenes/__init__.py +++ b/src/scenes/__init__.py @@ -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") diff --git a/src/scenes/menu.py b/src/scenes/menu.py index d3f6917..aa550c4 100644 --- a/src/scenes/menu.py +++ b/src/scenes/menu.py @@ -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 diff --git a/src/scenes/story/directory_search.py b/src/scenes/story/directory_search.py index 83e4fda..52252bc 100644 --- a/src/scenes/story/directory_search.py +++ b/src/scenes/story/directory_search.py @@ -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 @@ -178,9 +178,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) @@ -259,6 +263,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() diff --git a/voice.mp3 b/voice.mp3 new file mode 100644 index 0000000..adf7633 Binary files /dev/null and b/voice.mp3 differ