25 juin 2025

Game dev #08: sauver Lampyre

 Salutations voyageur ! 

 

 

DÉJÀ DE RETOUR ! Comme prévu, ce segment allait soit être très long, soit rester bref. Après avoir passé le mois de juin à poncer la documentation et faire rouler les écrans de chargement, nous avons désormais notre système de sauvegarde planifié.

 

 La note de patch

1) "Ce sera un menu interactif avec des easters eggs je vous jure, mais en attendant c'est un écran fixe avec quatre boutons.": Lampyre a désormais un menu principal tout ce qu'il y a de plus classique ! Il vous permettra au choix de créer une nouvelle partie ou d'en charger une existante. La seule originalité sera un outil de gestion de vos personnages pré-créés - il vous sera en effet possible de préparer des vyrrlins sur mesure qui pourront apparaître dans vos parties, et dans les rôles que vous souhaitez.

2) Vous vous souvenez de l'écran de chargement de Black and White 2 avec le logo Lionhead Studios ? Moi oui: autre point technique sensible, j'ai appris comment pré-charger les changements de scène et lancer des fonctions sur des threads secondaires. En affichant une petite transition et un icône de chargement fluide, cela permet de patienter en attendant la mise en place du niveau.

3) Pour une plantation de radis sauvages presque fluide: cette astuce me permet de générer une nouvelle carte de jeu sans bloquer l'application (la répartition procédurale des biomes, ainsi que l'instanciation de tous les nœuds essentiels au bon fonctionnement du jeu comme le soleil, la lune, l'UI générale...). Malheureusement, la dissémination des ressources bloque encore le thread principal pour quelques secondes sans que je n'ai réussi à en isoler la cause exacte.

4) Je m'en souviens très précisément: j'ai implémenté deux ressources de sauvegarde qui me permettront d'encoder toutes les informations nécessaires à la reconstruction d'une partie, d'une carte ou d'un personnage. Elles sont écrites avec succès sur le disque utilisateur et peuvent être chargées pour en récupérer les données. Entre l'écriture JSON, binaire ou le système de Ressources, j'ai jeté mon dévolu sur ce dernier pour sa grande simplicité. Son seul inconvénient étant un manque léger de fiabilité, car sur Godot 4.1 ces ressources peuvent être utilisées pour exécuter du code néfaste sur votre ordinateur. Mais est-ce que j'ai l'air d'être du genre à installer des logiciels espions sur votre machine ? (ceux qui ont répondu oui auront une version spéciale de l'exécutable qui lancera Rick Roll à la place des crédits de développement)

5) Tu charges, ou tu pointes cong ?: que l'on entre sur la carte pour la toute première fois, ou que l'on charge une sauvegarde, la scène de jeu est la même et les nœuds sont initialisés indépendamment et proprement. Une fois l'initialisation générale effectuée, le jeu va, au choix, disséminer les ressources procéduralement, ou lire une sauvegarde pour recréer à l'identique un paysage existant (ce dernier point étant laissé en suspens, voir le paragraphe ci-dessous).

 

Le commentaire du développeur en bois

Le résumé de tout ça, c'est que je dors désormais sur mes deux oreilles tel un rat repu de Big Mac rance dans mon coin d'égout car la fonctionnalité de sauvegarde était un obstacle qui m'effrayait beaucoup, et on l'a complètement démystifiée. CEPENDANT. Comme anticipé, encoder une sauvegarde, c'est choisir ce que l'on veut et ce que l'on doit restituer sur une carte. Je me suis bien amusée à enregistrer / charger l'emplacement du joueur en temps réel, mais au final, ce sera l'intégralité de l'état des ressources, des bâtiments, des inventaires, des créatures et des paramètres de partie qu'il faudra préserver.

Si je peux me permettre une métaphore, sauvegarder, c'est un peu prendre les photos pour la visite virtuelle de la maison. Il faut le faire lorsque l'ouvrage est terminé, décoré, meublé - pas quand la pelleteuse commence à creuser sur le terrain vague. Je pourrais implémenter la sauvegarde des végétaux, mais je ne suis pas certaine que leurs caractéristiques restent 100% à l'identique dans le futur (spoiler: non, il y aura quelques changements connexes sur les ressources quand on ajoutera le restant des minerais, les bâtiments de production...). 

Donc, j'ai préféré tout planifier et me laisser cela de côté pour y revenir quand on codera notre sauvegarde définitive ! Tout sera alors plus clair et on ne la programmera pas pour rien. 

Dans le même genre, on touche quasiment le Graal du doigt avec un chargement de carte fluide, à l'exception de la génération initiale des plantes. Je ne sais pas encore ce qui bloque le thread principal mais j'aurais l'occasion de l'identifier précisément quand je vais disséquer la fonction pour l'adapter au chargement de fichier. Mon rêve serait d'afficher un petit visuel interactif stylisé pendant le chargement de carte ! Mais pour que cela fonctionne, l'application ne doit jamais devenir irresponsive (pour information, des jeux AAA comme Monster Hunter Wilds SONT irresponsive pendant une dizaine de secondes à leur lancement sans que je n'en sois jamais outrée - mais ce ne sont souvent pas de bons exemples d'optimisation).

Dans l'ensemble, je suis très contente d'avoir fait ce bloc maintenant. L'objectif est totalement rempli et on peut foncer sereinement sur la suite du développement.

 

La suite

Nous allons respecter nos plans et nous intéresser aux premières minutes de jeu et aux conditions de victoire (l'artisanat arrive juste après, bear with me). Ce que je veux, c'est qu'on se lance doucement sur la pente d'un véritable jeu et qu'on déroule les premières accroches de gameplay. 

Pensez au dernier jeu de survie ou de construction que vous avez découvert. On vous a peut-être lâché dans la pampa, vous avez commencé à bouger autour de vous. Woah, une pierre, je la ramasse ! Ok, j'ai un inventaire. Je vois que j'ai aussi un menu de fabrication. Tous ces plans à débloquer ! Obtenir un outil de base me permet de récolter de nouvelles ressources. C'est fort plaisant d'éclater ces ennemis aux alentours, est-ce qu'on peut le faire plus efficacement ? etc... Bref, du game design pur et dur. Présenter les moyens de jeu de façon habile au joueur et les rendre attachantes et attirantes à expérimenter ! Quelle que soit la complexité de Lampyre, les premiers instants doivent immédiatement donner envie d'en faire plus.

Ce bloc numéro neuf est d'ambition moyenne dit-elle avant de manger ses cinq mois de dev et voici ses objectifs: 

- implémenter la collision et les facteurs de variations complets du linceul d'ombre sur la carte de jeu (déplacer sa collision sur le PhysicsServer3D pour des questions de performance et rendre sa forme bien plus organique, à la différence du carré sommaire que l'on a actuellement)

- placer les couvoirs d'ombre au sein des zones de linceul, et faire en sorte que la partie soit gagnée s'ils sont détruits

- refondre rapidement nos objets de type Lumière et déplacer leurs zones de collision sur le PhysicsServer3D

- mettre en place l'état initial de l'autel, de l'arbre-liandre et du joueur en début de partie ; le déblaiement de l'autel abandonné débloque les premières fonctionnalités de construction, et les tous premiers plans

- en bonus, j'aimerais aussi poser la première brique du système d'expérience et de découverte de nouveaux plans pour que notre initiation soit complète ! 

Vous comprendrez qu'une fois que cette boucle sera initiée, l'objectif suivant sera d'implémenter toute la chaine technologique qui vous fera acquérir armes et armures afin de tabasser les couvoirs d'ombre et de gagner la partie.

 

Les visuels du schnaps

Ce segment peut être résumé par un seul GIF ! Celui qui montre l'arrivée sur le menu principal, la génération d'une carte et le temps de chargement d'entrée en jeu. Notez le blocage de la fenêtre de jeu sur l'étape de génération de la végétation (qui occupe 99% du temps de chargement total). Étant donné que celle-ci pourrait durer plusieurs secondes supplémentaires dans le cas de grandes cartes, j'aimerais beaucoup la rendre totalement fluide pour ne pas inquiéter le joueur qui attend le chargement.

 


 

Et voilà pour cet interlude technique, on fonce poursuivre la construction du jeu. Prenez soin de vous ! 

Aucun commentaire: