frogratto platforms

Je vous avait déjà rapidement parlé de frogatto, un très sympathique jeu de plate-forme aux musiques envoûtantes qui (mal?)heureusement plante chaque fois que je meurs … Il est sous linux en open-source, donc faisons-y un petit tour. Les programmeurs de Frogatto ont (c’est devenu une approche majoritaire) un bonne partie de la logique du jeu sous la forme de scripts. Ils utilisent leur propre dialecte plutôt que de se rabattre sur Lua ou d’utiliser du scheme. On verra au niveau de la communauté si ça les sert ou non.

On a donc différents objets (p.ex. “woodplatform.cfg”) qui servent à définir l’image et certains propriétés élémentaires (dimensions) d’une variante particulière d’un “objet-modèle” (prototype/platform.cfg). On a là essentiellement un système clé-valeur classique où certaines clés sont des noms d’évènements (on_process, on_start_level) et certaines valeurs sont des formules fonctionnelles (mais pouvant faire appel à des primitives du genre “set_variable”). La logique du jeu va essentiellement chercher après certaines clés (get_int, has_attr, etc.) dans les différents blocs analysés (les “noeuds”) et utiliser les valeurs récupérées dans des constructeurs, pour construire la représentation de travail du contenu du jeu.

create_object_platform_maps()

  • called from solid_info::create_platform to fill a vector of solid_map related to a specific “wml::node”
  • the solid_info is a part of the custom_object_type
  • custom_object_type est une bonne vieille (et énorme) classe C++ avec des champs pour tous les types de comportements possibles: plate-forme, véhicule, largeur des pieds, direction de téléportation, etc. Assez effrayant. Le RTTI coûterait donc si cher !?

point_standable(level, entity, x, y, &info) @collisions_utils.cpp

  • appelé depuis custom_object::is_standing(). A noter que les coordonnées du “hotspot” sont ici gérées par “has_feet(), feet_x() et feet_y()”.
  • implique level::standable(x,y,…) et level::solid(x,y) … je comprends mal pourquoi on a quand-même besoin d’un code qui parcours le résultat de lvl.get_solid_chars() pour en tester les platform_rect() …
  • se “contente” de rapporter l’objet et certains paramètres (friction, traction, adjust_y) si l’objet est trouvé.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.