diff --git a/src/scenes/story/directory_search.py b/src/scenes/story/directory_search.py index 97f171e..1e13ce4 100644 --- a/src/scenes/story/directory_search.py +++ b/src/scenes/story/directory_search.py @@ -2,7 +2,10 @@ Scène du jeu dans lequel Windows Defender se cache de Edmond dans les dossiers. """ -from engine import Scene +import random +from plugins.animation import Animation +from plugins.coroutine import Coroutine, wait +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 @@ -79,6 +82,18 @@ class SearchingDirectory: """ +class SearchedDirectoryAlert: + """ + Composant marquant une entité comme etant un dossier etant dans la recherche plus tard. + """ + + +class SearchedDirectoryAlertPosition(Vec2): + """ + Composant marquant une entité comme etant la position d'un dossier dans la recherche plus tard. + """ + + class DirectoryName: """ Composant marquant une entité comme étant le nom d'un dossier. @@ -156,6 +171,84 @@ def __initialize(world: World): DirectoryName(entity), ) + # Lancement de la boucle de jeu + world.new_entity().set(Coroutine(__game_loop(world))) + + +def __game_loop(world: World): + """ + La boucle principale de la scene. + """ + yield wait(5.0) + for _ in range(5): + __spawn_search_alert(world, 5) + yield wait(5.0) + __spawn_search_directory(world) + __delete_search_alert(world) + yield wait(5.0) + __delete_search_directory(world) + yield wait(1.0) + + +def __delete_search_directory(world: World): + for entity in world.query(Directory, SearchingDirectory): + del entity[SearchingDirectory] + del entity[Animation] + print("c'est bon ?") + + +def __spawn_search_directory(world: World): + for search_alert in world.query( + SearchedDirectoryAlert, SearchedDirectoryAlertPosition + ): + for entity in world.query(Directory, DirectoryPosition): + if ( + entity[DirectoryPosition] + == search_alert[SearchedDirectoryAlertPosition] + ): + if DefenderDirectory in entity: + entity.set( + SearchingDirectory(), + Animation("search_directory_failed", callback=__game_over), + ) + break + entity.set(SearchingDirectory(), Animation("search_directory")) + break + + +def __game_over(world: World, _entity: Entity): + world[CurrentScene] = SCENE + + +def __delete_search_alert(world: World): + for search_alert in world.query( + SearchedDirectoryAlert, SearchedDirectoryAlertPosition + ): + search_alert[Animation] = Animation( + "search_alert/despawn", callback=lambda _, entity: entity.destroy() + ) + + +def __spawn_search_alert(world: World, nb_alerts: int): + """ + Spawn une alerte de recherche. + """ + entities = world.query(Directory, DirectoryPosition, without=[BlockedDirectory]) + + for entity in random.sample(list(entities), nb_alerts): + position = entity[DirectoryPosition] + world.new_entity().set( + Animation("search_alert/spawn"), + Sprite( + world[Assets].error_texture, + position.screen_position(), + origin=Vec2(0.5), + order=2, + ), + SearchedDirectoryAlert(), + SearchedDirectoryAlertPosition(position), + ) + def __control_directories(world: World): """