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 ! 

2 juin 2025

Game dev #07: le peuple des noix

 Salutations, voyageur !

Nous restons dans notre course paisible au développement de Lampyre, en achevant ce segment en tout juste quatre mois ! Et quel bloc c'était. Définitivement un peu plus charnu que prévu - mais les résultats sont là. Nous avons maintenant tout notre écosystème végétal et notre arbre liandre fonctionne à merveille.

 La note de patch

1) Il était une fois, le temps: pour faire pousser des plantes, et passer les saisons, il faut une échelle de temps (omg, incroyable, je sais). Pour l'instant matérialisé par un simple texte, le calendrier de l'UI vous indiquera l'heure (grossière) de la journée, la saison et le nombre de jour qui s'y sont déjà écoulés.

Pour les vyrrlins, le temps est rythmé par la course du soleil. À cause des ombres, l'aube et le crépuscule revêtent une importance capitale. Les équinoxes et les solstices, eux, font souvent l'objet de fêtes ou de cérémonies, car ils sont les marqueurs de changements dans la durée des jours de l'année.

2) Cycle de pousse complet: les plantes avaient déjà une croissance présente, mais désormais, elles sont correctement représentées dans toutes leurs étapes de pousse (graine, herbe, buisson et arbre si applicable). Elles apparaissent avec une échelle et un score de pousse légèrement variables qui affecteront la quantité de produits qu'elles pourront donner (grosse plante = grosse récolte, zOMG). Leurs matériaux apparaissent progressivement et elles peuvent régénérer leur vie, à condition que le soleil brille. Une fois arrivées au bout de leur espérance de vie, elles pourrissent et disparaissent. Mais, le plus important reste qu'elles peuvent désormais se multiplier de façon autonome si leurs fruits sont laissés tranquilles !

Un script de régulation saisonnière permettra aussi à la majorité des essences de repeupler votre carte si vous les avez décimées (ce n'est pas très rapide mais cela vous évite d'être bloqué au moyen-terme). 

3) Le système de symbiose: certaines plantes ont des effets sur leurs consœurs alentours. Ils peuvent être bénéfiques (pousse améliorée, davantage de fleurs et de fruits produits, protection contre les ronces) ou néfastes, comme c'est le cas pour la ronce pyrope (qui ralentit la croissance des voisines). Vous pourrez exploiter ces symbioses lorsque vous définirez des zones de plantation. Il y aura ainsi un intérêt à planter certaines fleurs au milieu de vos buissons de baies ou de vos légumes-racines.

Encore plus important, ces symbioses fonctionnent sur...

4) L'arbre liandre (liandraastvay): au cœur de votre enclave se trouve un arbre très spécial, dont les tubercules et les fruits peuvent vous purifier de la corruption. Trouver cet arbre est d'ailleurs la raison pour laquelle votre personnage, d'abord errant, devient jouable.

L'arbre liandre n'a nul besoin d'être arrosé et ne peut pas être multiplié. Au fur et à mesure de sa pousse, il développera une quantité croissante de bulbes, de fragments d'écorce et de fruits que vous pourrez récolter pour votre village. Il sera également victime de la pousse de plantes indésirables qui, si elles ne sont pas retirées, ralentiront la production de ces denrées (sarments, mousse, lierre). Et surtout, il pourra recevoir les effets bénéfiques d'autres plantes symbiotes ! Les alentours de votre arbre-liandre risqueront de ressembler à un jardin sauvage... comme cela se fait dans la plupart des hameaux vyrrlins. 

5) De savoureux champignons: trois espèces de champignons pourront pousser dans divers biomes de votre carte. Leur récolte est très simple et ils constitueront des ingrédients de choix pour la cuisine et l'alchimie. Les polypores charnus poussent en plus grand nombre sur les souches et les troncs d'arbre en décomposition. Alors, vous aurez peut-être intérêt à laisser quelques arbres morts en paix.

6) Le trésor de la forêt: plusieurs ruches vont également croître sur des arbres de la carte ! Les abeilles peuvent s'épanouir dans n'importe quel biome, mais elles seront plus fréquentes là où les bois sont denses. En dehors de l'hiver, elles produiront du délicieux miel et il suffira de visiter la ruche pour la récolter.

7) Une séricuci... une sérisicu... UNE SOIE NATURELLE: le mûrier levantin est un arbuste unique qui ne vous donnera ni fleurs, ni fruits. Mais il abrite chaque année des chenilles de papillon de soie qui se nourriront de ses feuilles. En été, vous pourrez récupérer des cocons (à filer en soie brute) et parfois même des papillons pour ensemencer vos propres treillis de sériciculture. C'est moins onéreux d'aller en récolter dans le forêt que de les acheter à des zélotes, ça je vous le garantit.

8) Des plantes mouillées: laissée de côté depuis le segment de génération de carte, la rivière fait son retour. Lorsqu'elle est générée, deux plantes poussent exclusivement sur ses berges: le roseau goujon (source de fibres végétales) et le cresson printanier (délicieux en salade). 

9) Amélioration des commandes de récolte: les raccourcis et les modes de récolte ont été simplifiés pour les herbes et la récupération de produits (fleurs, fruits, champignons, miel). Celle-ci est désormais instantanée pour plus de fluidité ! Tailler des buissons, déterrer des graines ou couper des arbres restent des actions soutenues.

10) Vous êtes maintenant Stéphane Marie: en temps normal, la taille, la forme et la couleur des végétaux vous donnera déjà une bonne idée de leur stade de croissance. Mais pour en savoir plus, il est possible de passer en mode botaniste d'un clic de bouton (ou d'une touche de clavier). Ce mode met en surbrillance toutes les plantes environnantes (y compris les graines encore enfouies), leur essence, leurs détails de croissance et leurs rayons d'effets symbiotiques. C'est aussi avec ce mode que vous aurez l'occasion de déterrer des graines gênantes pour en planter d'autre, ou prévenir l'apparition de plantes indésirables.

11) De quoi faire un bel herbier: nous avons implémenté nos 26 essences végétales et tous leurs produits (bois, brindilles, feuilles, fleurs et fruits) ! Les modèles sont encore sommaires mais en tout cas les performances sont au beau fixe grâce à notre système de MultimeshInstancer et de corps de collision gérés par le PhysicsServer3D (voir le game dev #5 qui nous a coûté une partie de notre santé mentale l'automne dernière).

12) Hé ho ! Hé ho ! Ça coupe du bouleau !: le mini-jeu de bûcheronnage présente maintenant quelques variations en fonction de l'essence de l'arbre que vous essayez d'abattre. Les serres-faux ont elles un tiers de récolte, qui améliore la vitesse à laquelle la barre de matériaux bonus se remplit (en orange). Ce tiers sera important pour exploiter les arbres et les gisements, et insignifiant pour les autres types de récolte.

Comme toujours, ce sont les mécaniques qui sont finales, et pas du tout leur équilibrage ou leurs visuels. Il faudra une UI savamment conçue pour rendre le système de symbioses intuitif et plaisant à utiliser !

 

La suite

Si vous vous souvenez de ce lointain début d'année (ou bien si vous scrollez deux articles plus tôt), vous devriez être en train de vous bondir de votre fauteuil, un petit poing rageur brandi vers le ciel.

"JE SAIS, JE SAIS ! C'EST L'ARTISANAT ENSUITE, JE M'EN SOUVIENS ! À NOUS LA FABRICATION ET LES TIERS TECHNOLOGIQUES BON SANG §§!! LE CRAAAAAAFT -"

Et c'est avec une gravité certaine que je vais devoir vous demander de vous rasseoir et de boire un petit verre d'eau pour vous calmer s'il vous plait. Maintenant que tous ces beaux systèmes commencent à être en place, il nous faut nous occuper d'une fonctionnalité inévitable - avant l'artisanat.

Elle rôde dans mon esprit depuis le début du projet. Elle hante mes nuits et je vois sa silhouette sous mes paupières quand je cligne des yeux devant mes sessions de Monster Hunter. On a fait des systèmes d'instanciation, du procédural, des textures projetées, et on fera des squelettes, des modèles, des shaders, et des arbres d'animation. Mais ce qui me perturbe appartient à l'inconnu technique. Je veux parler d'un système de sauvegarde et de chargement.

Sauvegarder sa partie, c'est un prérequis obligatoire pour tout jeu persistant. Après moult réflexion, j'ai décidé de m'y mettre maintenant ! On a un personnage, et une carte avec de la végétation qui est générée procéduralement en quelques secondes. C'est déjà plus qu'il n'en faut pour s'initier à la gestion des données de jeu !

Les buts de ce segment de développement sont donc les suivants :

- implémenter une première ébauche de notre menu principal (où l'on peut y créer une nouvelle carte, en charger une ou quitter le jeu)

- mettre en place un écran de chargement pour patienter lors de la génération de la carte

- implémenter notre menu d'options en jeu (on l'on peut sauvegarder sa partie, la charger, revenir au menu principal...)

- sauvegarder une partie et pouvoir la charger pour revenir sur la même carte 

Peut-être que l'implémentation du système de sauvegarde me demandera de réviser un ou deux points de la gestion des ressources (j'ai des références à des RID dans mes scripts et je sens que ça va me retomber sur la mouille). J'ai bon espoir que ce soit un segment plus court que celui que l'on vient de faire, mais sait ce qui se passe quand on est trop optimiste - alors je vais rester humble, et assumer que ça prendra également plusieurs mois. 

Par ailleurs, une fois ce bloc terminé, j'ai aussi décidé de continuer le développement de façon un peu plus organique en construisant les conditions de victoire pour construire le gameplay autour d'un vrai début de jeu. Ne vous en faites pas, après avoir placé les couvoirs d'ombre sur la carte et implémenté un écran de fin de jeu, l'artisanat reste le prochain gros bloc sur la liste.


Les visuels du schnaps

Une galerie de GIF remplie de plantes en forme de cylindre. Qui poussent.

 

 
1) J'ai toujours voulu que mes plantes aient une croissance interpolée, et non saccadée. Pendant mes premiers tests, je les ai initialisées à 100x leur échelle de base pour amorcer leur création. Grave (mais rigolote) erreur. 


2) J'ai eu des petites sueurs froides quand je me suis rendu compte que jusqu'à une certaine croissance, les pousses d'arbres ne devaient PAS bloquer les mouvements des créatures. Mais nous avons séparé les formes de collision de récolte / d'obstacle pour les végétaux qui en ont besoin. Arrivés à une taille suffisante, une seconde collision s'active et met à jour la carte de navigation (grâce à notre beau script optimisé, j'en ai les larmes aux yeux :') ).

 

3) Les essais accélérés de multiplication passive de nos plantes. On peut voir les buissons perdre de la vie car ils avaient encore une espérance de vie epoustouflante de UNE journée, et ils pourrissaient déjà à peine apparus.


4) Récolte instantanée sur sur un buisson encore jeune, contre une récolte soutenue sur un buisson mature. L'idée est simplement de ressentir qu'en poussant, un végétal se pare de bois et devient plus ardu à récolter. Faucher des herbes avec les griffes ou la serre-faux se fera en un petit nombre de mouvements instantanés.


5) Nos premiers champignons, les polypores charnus ! Ils ne poussent que sur un arbre mature, ou sur des troncs et des souches tombés à terre. L'oreille de terre est un grand champignon solitaire, tandis que la brebis-sage forme des bouquets denses en sous-bois.


6) Une ruche accrochée à un pin de cendre. Essayer de couper l'arbre alors que des abeilles nichent dessus vous inflige des dégâts, car elles défendent leur hôte. Il faudra détruire la ruche (en récupérant quelques rayons de miel) pour pouvoir récupérer le bois.


7) Une roncières de pyropes. Les ronces pyropes tendent à pousser en groupe. Elles ne vivent qu'une seule année, mais se multiplient plutôt vite. Et surtout, elles ralentissent la pousse des autres végétaux autour d'elles. Les pyropes sont une bonne source de tiges, de fleurs et de fruits, alors pas de gâchis en les coupant !


8) L'arbre liandre derrière l'autel de l'enclave. En bleu luminescent, ce sont tous les produits de liandre qu'il fera éventuellement pousser (les tubercules au sol, les fragments d'écorce sur son tronc et les fruits dans sa cime). Sont également présents des sarments (les arceaux rouges) et des paquets de mousse (les sphères vertes) qui elles, ralentissent la croissance des produits associés. Les désherber vous donne du très bon combustible et restaure la croissance du liandre.


9) Le miladrea doux est un buisson qui a la capacité de bloquer la pousse des ronces pyropes environnantes, et de les faire se faner. L'une des deux essences végétales avec cet effet, qu'il sera intéressant de garder près de ses cultures et de son arbre liandre. 


10) Le mode botaniste. Les graines que vous portez dans votre inventaire s'affiche et cliquer dessus vous permet de les planter. Passer le curseur sur les plantes vous permet d'afficher leur description, et les rayons d'action des essences symbiotiques s'affiche (ici dans sa première version un peu fouillis).


11) Pour remédier aux zones d'influence illisibles qui se chevauchaient, j'ai cuisiné un shader maison à partir de deux scripts libres de droits créés par arlez80 et abSpaghetti. Dans la version finale du jeu, je pense que ces zones seront pleines mais transparentes et légèrement luminescentes. Mais en attendant, il est parfait et on va s'en resservir.


12) Le semis de graines ! Une fois dans le mode botaniste et les graines de l'essence sélectionnée, on peut soit semer les végétaux un à un, soit en jeter une poignée aléatoirement autour de nous. Attention - comme dans la réalité, toutes les graines ne parviennent pas forcément à germer.

 

13) Le mode botaniste permet aussi d'inspecter l'arbre liandre pour voir son stade de croissance et les effets qui lui sont appliqués (ici, sa pousse est ralentie par de multiples indésirables ainsi qu'une ronce pyrope).

 

14) Le mûrier levantin (oui, c'est encore un plot) ! Ses "fruits" sont les cocons de soie des papillons qui ont grandi dans son feuillage. Il n'y en a qu'un seul par carte, et il ne repousse pas si vous le coupez. Il sera toujours possible d'en acheter une pousse aux caravanes, mais il restera rare et exceptionnellement onéreux.

 

15) Un petit visuel du plaisir, avec plusieurs essences de prairies visibles. J'imagine la frondaison des arbres bien plus haute, et de l'herbe couvrant tout le sol nu. Ça va être vraiment chouette.


 

16) Le mode botaniste vous permet de voir les graines encore enfouies dans le sol, et de les enlever. Vous ne récupérez aucune ressource en le faisant.


17) Deux exemples de variations de mini-jeu de bûcheronnage. Le premier arbre est un saule des marais, et d'épaisses plaques de mousse vont gêner la visibilité de la zone cible ! Le second est un pin de cendre, qui affiche une poche de résine qu'il ne faut pas heurter sous peine de faire reculer le score de récolte.

 

Comme toujours, je poste des mises à jour régulières sur @Ariatowl. L'écriture du roman avance bien, même si je ne suis pas spécialement en avance. Je vous dis à la prochaine pour pouvoir continuer une sauvegarde sur Lampyre.

Prenez soin de vous !