ecs #58
BIN
assets/story/directory_search/heart.png
Normal file
BIN
assets/story/directory_search/heart.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.6 KiB |
|
@ -9,7 +9,7 @@ from engine.math import Vec2
|
||||||
from plugins import assets as plugin_assets, render, smooth
|
from plugins import assets as plugin_assets, render, smooth
|
||||||
from plugins.animation import Animation
|
from plugins.animation import Animation
|
||||||
from plugins.coroutine import Coroutine, wait
|
from plugins.coroutine import Coroutine, wait
|
||||||
from plugins.click import Clicked
|
from plugins.click import Clickable, Clicked
|
||||||
from plugins.inputs import Held, MousePosition
|
from plugins.inputs import Held, MousePosition
|
||||||
from plugins.assets import Assets
|
from plugins.assets import Assets
|
||||||
from plugins.render import Sprite
|
from plugins.render import Sprite
|
||||||
|
@ -52,12 +52,6 @@ class SearchedDirectoryAlert:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
class SearchedDirectoryAlertPosition(Vec2):
|
|
||||||
"""
|
|
||||||
Composant marquant une entité comme etant la position d'un dossier dans la recherche plus tard.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class DirectoryName:
|
class DirectoryName:
|
||||||
"""
|
"""
|
||||||
Composant marquant une entité comme étant le nom d'un dossier.
|
Composant marquant une entité comme étant le nom d'un dossier.
|
||||||
|
@ -174,91 +168,35 @@ def __initialize(world: World):
|
||||||
# Lancement de la boucle de jeu
|
# Lancement de la boucle de jeu
|
||||||
world.new_entity().set(Coroutine(__game_loop(world)))
|
world.new_entity().set(Coroutine(__game_loop(world)))
|
||||||
|
|
||||||
|
# Code cool
|
||||||
|
world.new_entity().set(Coroutine(__lamour_et_le_bonheur(world)))
|
||||||
|
|
||||||
|
|
||||||
def __game_loop(world: World):
|
def __game_loop(world: World):
|
||||||
"""
|
"""
|
||||||
La boucle principale de la scène
|
La boucle principale de la scène
|
||||||
"""
|
"""
|
||||||
yield wait(5.0) # On attend 5 secondes le temps de mettre le joueur dans le jeu
|
|
||||||
for _ in range(5): # On fait 5 dossiers (niveau facile)
|
|
||||||
__spawn_search_alert(world, 5) # On fait 5 alertes de recherche
|
|
||||||
yield wait(5.0)
|
yield wait(5.0)
|
||||||
__spawn_search_directory(
|
for i in range(10):
|
||||||
world
|
if i % 2 == 1:
|
||||||
) # On fait apparaître le dossier en cours de recherche
|
__block_directory(world)
|
||||||
__delete_search_alert(world) # On supprime les alertes
|
__spawn_search_alerts(world, int(i / 1.5) + 1)
|
||||||
|
yield wait(5.0 - (i * 0.4))
|
||||||
|
__spawn_search_directory(world)
|
||||||
yield wait(5.0)
|
yield wait(5.0)
|
||||||
__delete_search_directory(world) # On supprime le dossier en cours de recherche
|
print("BRABO BG !")
|
||||||
yield wait(1.0)
|
|
||||||
|
|
||||||
|
|
||||||
def __delete_search_directory(world: World):
|
def __spawn_search_alerts(world: World, nb_alerts: int):
|
||||||
"""
|
"""
|
||||||
Supprime le dossier en cours de recherche
|
Spawn les alertes de recherche
|
||||||
"""
|
|
||||||
for entity in world.query(
|
|
||||||
Directory, SearchingDirectory
|
|
||||||
): # Pour tous les dossiers recherchés et les remet à leur état de base
|
|
||||||
del entity[SearchingDirectory]
|
|
||||||
del entity[Animation]
|
|
||||||
|
|
||||||
|
|
||||||
def __spawn_search_directory(world: World):
|
|
||||||
"""
|
|
||||||
Fait apparaître le dossier en cours de recherche
|
|
||||||
"""
|
|
||||||
for search_alert in world.query(
|
|
||||||
SearchedDirectoryAlert, SearchedDirectoryAlertPosition
|
|
||||||
):
|
|
||||||
for entity in world.query(Directory, DirectoryPosition):
|
|
||||||
if (
|
|
||||||
entity[DirectoryPosition]
|
|
||||||
== search_alert[SearchedDirectoryAlertPosition]
|
|
||||||
): # Si le dossier va être recherché
|
|
||||||
if DefenderDirectory in entity: # Si le dossier est un défenseur
|
|
||||||
# On joue une animation d'échec
|
|
||||||
entity.set(
|
|
||||||
SearchingDirectory(),
|
|
||||||
Animation("search_directory_failed", callback=__game_over),
|
|
||||||
)
|
|
||||||
break
|
|
||||||
# On joue l'animation de recherche
|
|
||||||
entity.set(SearchingDirectory(), Animation("search_directory"))
|
|
||||||
break
|
|
||||||
|
|
||||||
|
|
||||||
def __game_over(world: World, _entity: Entity):
|
|
||||||
"""
|
|
||||||
Fonction lancée quand on perd le jeu
|
|
||||||
"""
|
|
||||||
world[CurrentScene] = SCENE # On relance le jeu
|
|
||||||
|
|
||||||
|
|
||||||
def __delete_search_alert(world: World):
|
|
||||||
"""
|
|
||||||
Supprime les alertes de recherche
|
|
||||||
"""
|
|
||||||
for search_alert in world.query(
|
|
||||||
SearchedDirectoryAlert, SearchedDirectoryAlertPosition
|
|
||||||
):
|
|
||||||
# On joue l'animation de suppression
|
|
||||||
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])
|
entities = world.query(Directory, DirectoryPosition, without=[BlockedDirectory])
|
||||||
|
entities.difference_update(world.query(DefenderDirectory))
|
||||||
for entity in random.sample(
|
for entity in random.sample(list(entities), nb_alerts - 1) + list(
|
||||||
list(entities), nb_alerts
|
world.query(DefenderDirectory)
|
||||||
): # On tire aléatoirement des dossiers
|
):
|
||||||
# On crée l'alerte
|
|
||||||
position = entity[DirectoryPosition]
|
position = entity[DirectoryPosition]
|
||||||
# On crée l'entité de l'alerte
|
|
||||||
world.new_entity().set(
|
world.new_entity().set(
|
||||||
Animation("search_alert/spawn"),
|
Animation("search_alert/spawn"),
|
||||||
Sprite(
|
Sprite(
|
||||||
|
@ -268,10 +206,75 @@ def __spawn_search_alert(world: World, nb_alerts: int):
|
||||||
order=2,
|
order=2,
|
||||||
),
|
),
|
||||||
SearchedDirectoryAlert(),
|
SearchedDirectoryAlert(),
|
||||||
SearchedDirectoryAlertPosition(position),
|
DirectoryPosition(position),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def __block_directory(world: World):
|
||||||
|
"""
|
||||||
|
Bloque un dossier.
|
||||||
|
"""
|
||||||
|
entity = random.choice(
|
||||||
|
list(world.query(Directory, without=(BlockedDirectory, DefenderDirectory)))
|
||||||
|
)
|
||||||
|
entity.set(BlockedDirectory(), Animation("directory_to_blocked"))
|
||||||
|
|
||||||
|
|
||||||
|
def __spawn_search_directory(world: World):
|
||||||
|
"""
|
||||||
|
Fait apparaître le dossier en cours de recherche
|
||||||
|
"""
|
||||||
|
for search_alert in world.query(SearchedDirectoryAlert, DirectoryPosition):
|
||||||
|
# On joue l'animation de suppression
|
||||||
|
search_alert[Animation] = Animation(
|
||||||
|
"search_alert/despawn", callback=lambda _, entity: entity.destroy()
|
||||||
|
)
|
||||||
|
|
||||||
|
for search_alert in world.query(SearchedDirectoryAlert, DirectoryPosition):
|
||||||
|
for entity in world.query(Directory, DirectoryPosition):
|
||||||
|
if entity[DirectoryPosition] == search_alert[DirectoryPosition]:
|
||||||
|
if DefenderDirectory in entity:
|
||||||
|
# On joue une animation d'échec
|
||||||
|
entity.set(
|
||||||
|
SearchingDirectory(),
|
||||||
|
Animation(
|
||||||
|
"search_directory_failed",
|
||||||
|
callback=lambda world, _: world.new_entity().set(
|
||||||
|
Sprite(
|
||||||
|
world[Assets].get_texture("restart"),
|
||||||
|
Vec2(render.WIDTH / 2, 900),
|
||||||
|
10,
|
||||||
|
origin=Vec2(0.5),
|
||||||
|
),
|
||||||
|
Clickable(
|
||||||
|
lambda world, _: world.set(
|
||||||
|
CurrentScene(__new_game_scene())
|
||||||
|
)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
entity[Sprite].order = 5
|
||||||
|
for entity in world.query(Coroutine): # On arrete la boucle de jeu
|
||||||
|
entity.destroy()
|
||||||
|
continue
|
||||||
|
|
||||||
|
# On joue l'animation de recherche
|
||||||
|
entity.set(
|
||||||
|
SearchingDirectory(),
|
||||||
|
Animation("search_directory", callback=__stop_search),
|
||||||
|
)
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
def __stop_search(world: World, entity: Entity):
|
||||||
|
"""
|
||||||
|
Change la texture du dossier a la fin de sa recherche.
|
||||||
|
"""
|
||||||
|
entity.remove(SearchingDirectory)
|
||||||
|
entity[Sprite].texture = world[Assets].get_texture("directory")
|
||||||
|
|
||||||
|
|
||||||
def __control_directories(world: World):
|
def __control_directories(world: World):
|
||||||
"""
|
"""
|
||||||
Ce système gère les déplacements de dossiers fais par l'utilisateur.
|
Ce système gère les déplacements de dossiers fais par l'utilisateur.
|
||||||
|
@ -357,12 +360,63 @@ def __update_graphics(world: World):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
SCENE = plugin_assets.loading_scene(
|
def __lamour_et_le_bonheur(world: World):
|
||||||
|
"""
|
||||||
|
Une fonction qui créer le bonheur et le amour.
|
||||||
|
"""
|
||||||
|
while True:
|
||||||
|
yield wait(0.5)
|
||||||
|
# Code lugubre tkt c'est un bon code
|
||||||
|
i_love = None
|
||||||
|
my_amor = None
|
||||||
|
for entity in world.query(Text, DirectoryName):
|
||||||
|
if entity[Text].text == "Je t'aime":
|
||||||
|
i_love = entity[DirectoryName].entity[DirectoryPosition]
|
||||||
|
if entity[Text].text == "Mon Amour":
|
||||||
|
my_amor = entity[DirectoryName].entity[DirectoryPosition]
|
||||||
|
if (
|
||||||
|
i_love is not None
|
||||||
|
and my_amor is not None
|
||||||
|
and i_love + Vec2(1, 0) == my_amor
|
||||||
|
):
|
||||||
|
entity = world.new_entity()
|
||||||
|
x = random.randint(0, render.WIDTH)
|
||||||
|
entity.set(
|
||||||
|
Sprite(
|
||||||
|
world[Assets].get_texture("heart"),
|
||||||
|
Vec2(x, -100),
|
||||||
|
10,
|
||||||
|
origin=Vec2(0.5),
|
||||||
|
),
|
||||||
|
smooth.Target(x, render.HEIGHT + 100),
|
||||||
|
smooth.Speed(1),
|
||||||
|
Coroutine(__despawn_after(entity)),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def __despawn_after(entity: Entity):
|
||||||
|
"""
|
||||||
|
Détruit l'entité après 5 secondes.
|
||||||
|
"""
|
||||||
|
yield wait(5.0)
|
||||||
|
entity.destroy()
|
||||||
|
|
||||||
|
|
||||||
|
def __new_game_scene() -> Scene:
|
||||||
|
"""
|
||||||
|
Créer une nouvelle scène
|
||||||
|
"""
|
||||||
|
return (
|
||||||
Scene(
|
Scene(
|
||||||
[__initialize],
|
[__initialize],
|
||||||
[__control_directories, __update_graphics],
|
[__control_directories, __update_graphics],
|
||||||
[],
|
[],
|
||||||
)
|
)
|
||||||
+ smooth.PLUGIN,
|
+ smooth.PLUGIN
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
SCENE = plugin_assets.loading_scene(
|
||||||
|
__new_game_scene(),
|
||||||
"story/directory_search",
|
"story/directory_search",
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue