pikario.fr

Five Nights at Super Toboggan

J'ai eu une idée. Un spin off d'horreur FNAF-like à Super Toboggan 3D (oui). Je vais tenter de le rélaiser en pas trop longtemps, et donc voilà le devlog ! Cette fois-ci il sera purement chronologique.
Aussi si vous lisez ça gardez en tête que c'est une exploration et que peut-être ça n'aboutira pas.

L'idée

Depuis le dévloppement de Super Toboggan 3D je trouve qu'il y a quelque chose de vertigineux quand je vois le toboggan seul dans le noir (notamment quand je debug). J'ai essayé de faire ressentir ça dans le mode MADNESS (que personne n'a débloqué pour le moment si j'en crois les scoreboards, INSANE est peut-être trop difficile), mais j'aimerai aller plus loin. Dans FNAST (nom de code), on joue un agent qui doit s'occuper du bon fonctionnement et de la protection du Super Toboggan.

Mercredi 15 juillet 2026

21h

Début du projet, je vais partir de Mini3D+ non modifié, le fork sur github et je clone en local. J'hésitais à partir de ST3D mais j'ai trop modifié le moteur de rendu je pense, et j'ai envie d'une page blanche. Mais là je vais jouer avec des ami.es donc ce sera tout pour le moment.

Vendredi 17 juillet 2026

14h16

J'aimerai donc avoir une base 3D sur laquelle m'appuyer et pouvoir faire des transitions de caméra, et je rajouterai des détails en 2D. Mais donc pour pouvoir itérer sur la scène, ce serait chouette d'avoir un importeur de mesh. Je vais voir si je peux trouver ça pour de l'obj ou du gtlf en C.

Lundi 20 juillet 2026

12h12

J'ai trouvé une bliothèque C pour importer de l'obj, elle a l'air légère et rapide. Par contre elle ne marche pas direct, il faut j'arrive à lui passer l'allocateur de l'API playdate. Pareil pour l'accès au système de fichiers.

16h19

Ok ça compile! Maintenant j'essaye de charger un obj que j'ai fait dans blender (un cylidnre). À priori ça marche, maintenant il faut que je transforme ça en une shape Mini3D.

19h24

C'est bon j'ai réussi ! Voilà un cube moche (les vertex sont probablement pas dans le bon sens), mais il vient d'un OBJ ! La suite plus tard, j'arrête pour aujourd'hui.

La première image du projet, pour la postérité
La première image du projet, pour la postérité

Mercredi 22 juillet 2026

14h53

Je vais débugger le rendu des triangles voir si je fais les choses correctement ou pas. Dac j'ai enfin compris la structure que me passe la lib pour faire de l'obj ! J'ai un cylindre !

Waaaah
Waaaah

Prochaine étape : faire la scène que je veux dans blender et l'afficher sur playdate!

Jeudi 23 juillet 2026

18h05

C'est parti pour le modèle 3D du bureau, j'ai fait un premier jet et il est pété quand je le met en jeu (les triangles...), je vais voir si c'est l'export de blender ou ma lecture de l'obj. C'était l'export, je force à ce que soit triangulé à l'export comme ça toutes mes faces font 3.

21h58

J'essaie de gérer la couleur des faces directement dans blender que à l'import de transformer ça en noir et blanc pour la playdate. J'y suis presque, je creuse le fonctionnement de fichiers mtl.
Aucun rapport, mais à chaque fois je me fais avoir que la valeur de roation de la crank soit en degré et pas en radian....
J'ai réussi, c'est cool, une bonne base sur laquelle s'appuyer!

Mon mesh blender dans ma playdate!

Lundi 27 juillet 2026

18h49

Je travaille sur les transitions de caméra entre les différents postes. Je veux un poste central de travail où il faut se concentrer, un poste en bas où il faut surveiller le toboggan, et un poste de chaque côté où il faut surveiller des créatures qui tentent d'entrer. Mais avant de faire quoi que ce soit, il faut que j'ai un système de transition de caméra, avec de l'easing si possible.

Et voila un premier jet!
Et voila un premier jet!

Mecredi 29 juillet 2026

16h08

Maintenant l'étape d'après c'est de comprendre comment marchent les imposteurs de Mini3D+, ça va me permettre d'afficher un version image du toboggan par la fenêtre (car oui ce serait pas rentable en terme de perf de reprendre l'affichage 3D de ST3D je pense). Pour ça faut que je prendre une capture de ST3D depuis l'extérieur et de côté, je rouvre le projet.
J'ai une image, mais du coup je ne sais pas si je vais utiliser les imposteurs ou carrément direct passer par une texture sur un plane, puisque ça me seriva pour le reste.

01h

De retour après avoir vu Spiderman Brand New Day au ciné (il est très bien !). En fait il faut que je fasse une shape par mesh dans mon blend original pour pouvoir texturer correctement (pour l'instant je mettais tout dans la même shape, comme pour ST3D), du coup je change mon code de loading de l'obj en shape(s).
Après avoir réécrit l'import, tout fonctionne comme avant, mais je n'ai encore aucune texture qui s'affiche (au moins je n'ai pas de crash déjà...), ça fait juste du noir. Je vais dormir j'investiguerai ça demain.

Jeudi 30 juillet 2026

14h

J'ai redémarré mon PC donc j'ai du relancer le simulateur, et le jeu crash au démarrage... Probablement un pointeur pas alloué, j'investigue.

Vendredi 31 juillet 2026

18h

Je suis toujours sur le crash, je n'ai pas trouvé de solution hier. Il faudrait que j'utilise un debuggeur en fait (oui je n'en pas de setup ^^' ST3D a été fait 100% sans), je regarde s'il y a des resources sur le forum de la playdate. J'ai réussi à utiliser gdb avec le simulateur, en fait c'était vraiment pas dur, ça m'aurait sûrement fait gagner du temps sur ST3D x)
Enfin bref, ça vient de render_range de Mini3D+, les fonctions qui sont illisible tellement y'a de macro partout, les noms de variables sont pas explicites non plus :/ C'est trop compliqué à debug T.T Je tente le lancer la démo de Mini3D+ officielle avec ma texture pour voir si déjà c'est pas ma texture le problème. Ce n'est pas ça, ça réduit le debug, ça veut dire y'a un truc que je dois pas initialiser correctement. Mais ce n'est pas facile de comparer avec la démo de Mini3D+ puisqu'elle est faite en lua.

Dimanche 2 aout 2026

01h33

En relisant point par point l'initialisation d'une shape dans la démo de Mini3D+ je me suis rendu compte que la texture que je passais n'étais pas la bonne (juste pas le bon bon type...), d'où le crash. Ça vient notamment du fait que dans Mini3D+ une texture c'est juste un pointeur sur void, donc le compilateur ne me fait pas d'erreur, ce qui fait que je n'ai rien remarqué. J'ai réglé en passant le bon type et une texture apparait ! Par contre je n'ai pas les bons UVs mais c'est parce que je charge mal ceux de l'OBJ, prochaine chose à régler mais là je vais me coucher.

Premier affichage (cassé) d'une texture !
Premier affichage (cassé) d'une texture !

Mardi 4 aout 2026

03h08

Après quelques essaies/erreurs j'ai réussi à avoir les bonnes coordonnées de texture à passer à mini3D+ pour chaque face. Par contre ma texture ne s'affiche toujours pas correctement. J'ai par contre essayé avec celle "1234" de la démo, et elle s'affiche, je me demande si c'est quelque chose avec l'encodage (ne sauvagarder qu'en noir-et-blanc?), ou alors c'est la taille qui doit avoir un certain ratio? J'essaye de voir mes options avec Gimp.
On dirait que 256 c'est la valeur max de hauteur et de largeur pour l'image (la mienne originale faisait 400x240, une capture d'écran de Playdate), j'essaye de comprendre en lisant dans le code. Oui c'est bien ça, et c'est hard codé :/ Bon on va dire que c'est une contrainte de plus, et si c'est trop limitant je me renseignerai pour trouver une autre lib mais c'est beaucoup de taff après pour l'interfacer avec mini3D+.
J'ai un premier jet avec une texture en 256 par 256 (à peu près), il a fallut que je tweak le noir (car une capture playdate c'est pas du vrai noir pur) pour avoir le bon effet, et la texture est à l'envers (va savoir pourquoi), mais je progresse vers ce que je veux !

La texture du toboggan par la fenêtre !
La texture du toboggan par la fenêtre !

19h03

Je me suis couché beaucoup trop tard hier... Bref, je suis en train de rajouter le fait de pouvoir set les normales des faces dans Mini3D+, elles sont dans mon obj, autant les utiliser et ça me permet de les inverser dans Blender au besoin. Vu que ça risque de se répéter, je vais faire comme les vertex : avoir un tableau de normales et chaque face ne stocke qu'un id.
Après quelques heures de travail, ça ne marche pas très bien, en fait chaque frame les normales sont recalculées par mini3D en fonction du transform actuel, et j'ai du mal à m'interfacer là-dedans. Je met de côté pour le moment, je vais voir ce que je peux faire en gardant les normales automatique déjà en terme d'ambiance.

Lundi 10 aout 2026

13h47

Je reprends le projet aprs du temps passé à patcher ST3D et préparer la sortie sur itch. Aujourd'hui je veux voir si je peux facielment animer les textures (juste en mettant des images différentes). J'ai tenté l'approche naive de refaire un setTexture, ce n'est pas si simple que ça, je crois qu'il va falloir aussi que je la remplace dans les FaceInstance. Bon le crash venait juste d'un pointeur que j'avais mal initialisé, du coup juste ça n'update pas le visuel quand j'essaye de changer. En fait c'est bon ça fonctionne, je ne sais juste pas coder. C'est cool ! Par contre mes UV sont toujours inversés et je ne sais pas pourquoi. J'ai inversé le plan en attendant de comprendre. J'ai fait une petite animation.

Je suis content, c'est une première preuve de concept!
Je suis content, c'est une première preuve de concept!

23h44

Je vais améliorer un peu la scène pour la rapprocher de ce que je veux, notamment avec la vue bureau (en plus de la fenêtre et des deux portes). J'ai mis un ordinateur sur la table et je me rend compte que mon modèlé est inversé c'est bien ça, et je ne sais pas pourquoi. J'ai aussi un soucis avec le culling il est trop proche, la table et l'ordinateur y passe dès que j'approche la caméra.
Pour le mesh en mirroir, j'inverse toutes les valeurs de x au chargement (chut, ça reste entre nous!). Et pour le clipping j'ai trouvé comment changer le zoom de la caméra avec la valeur de scale, je met ma cam à un endroit et ensuite je joue avec ça. Je vais ajouter un state NOTHING en plus de WORK qui a plus de recul et qui sert de state par défaut. Le state TOBOGGAN va servir à réagir quand le monstre apparaitra dessus. Ça fait qu'il y a NOTHING au centre et un state dans chaque direction, ça parait pas mal.

Les différents states de caméra !
Les différents states de caméra !

Mardi 18 aout 2026

17h04

Je n'ai pas pu me consacrer au projet depuis presque une semaine, je reprend un peu ajourd'hui. Je vais me concetrer sur la partie mini-jeu sur l'ordinateur je pense, il s'agit pour lea joueureuse de vérifier les highscores (valider ou non si le nouveau score est supérieur au précédent).
J'ai mis en place un système d'UI (draw du texte, j'ai choisi une font) et j'ai un premier affichage sur l'écran du PC, il faut que je regarde sur playdate elle-même, ça va peut-être être trop petit.

Ça me fait penser à Severance
Ça me fait penser à Severance

Mardi 25 aout 2026

01h20

Déjà une semaine sans travailler sur le jeu... J'ai été occupé à d'autres projets et activitées. Néanmoins j'ai eu le temps de décrire FNAST à ma partenaire, je lui avais vaguement évoqué un FNAF sur playdate jusqu'à présent et sans dire que ce serait lié à l'univers de Super Toboggan 3D. L'idée d'un FNAF-like lui plait que le setup et le fait de le lier à ST3D moins. Cela m'a fait beaucoup hésiter, et j'ai commencé à avoir des idées autour un autre jeu dans le même principe mais non lié à ST3D, notamment qui reprendrait le principe des caméra à régarder de FNAF (élément que ma partnaire m'a pointé comme étant important dans l'éxpérience du premier FNAF). Dans cette phase de doute j'ai aussi regardé à nouveau le début du Findings sur FNAF... On est quelques jours après ces réflexions et j'abouti au fait que ça parait une bonne idée et qu'il y a matière à faire un autre jeu que décrit ici jusqu'à présent, mais je pense qu'il mérite plus de temps de gestation, notamment autour de son contexte (vu que ce ne serait pas ST3D), un musée peut-être ?
En parallèle je me rend compte que ça m'attriste de laisser l'idée d'un spin-off à ST3D derrière, donc je vais le finir ! Mine de rien il me motive toujours, et j'ai toujours voulu que ce soit un projet court. Et il pourra servir de base techniqueet design à un futur projet d'horreur sur le même principe.

02h39

J'ai continué la mise en place du travail sur ordinateur avec des highscores à valider et un premier de jet validation en utilisant la crank. Il faut faire un geste de compostage pour soumettre la série qu'on vient de faire (j'aurai bien voulu le montrer mais OBS est à nouveau cassé à cause des portals de wayland...).

14h34

J'ai une ptite demi-heure, je vais tenter de faire un modèle 3D de crank pour la mettre à côté de l'écran, pour le feedback de validation. Il faut que j'en fasse un objet séparé de l'ordinateur pour pouvoir ensuite l'animer avec le système de nodes de Mini3D+.

Mon mesh de manivelle dans blender
Mon mesh de manivelle dans blender

18h55

J'ai fais un premier mesh tout à l'heure, je n'ai encore pas beaucoup de temps mais maintenant j'essaye de faire tourner le mesh de crank pour la preuve de concept. Pour ça il faut que je fasse une fonction qui créé une matrice de rotation (je n'en trouve pas dans l'API de Mini3D+). Bon alors j'arrive à le faire tourner mais le pivot n'est pas le bon, et Mini3D+ n'a pas l'air de permettre de changer le pivot, il va falloir que je le fasse moi-même. Je dois y aller, je verra ça plus tard.

02h35

De retour. Oui c'est bien ça l'obj ne supporte pas les pivots qui ne sont pas à zéro. Je pense je vais partir sur la solution de le set moi-même en code.

Jeudi 27 aout

04h12

Plusieurs heures que he me casse la tête sur de la trigonométrie, j'y suis presque, mais là je vais me coucher.

14h55

Depuis une heure j'essaye une autre approche où je déclare un pivot et je décale tous les points par rapport à ça, pour ensuite mettre le node à la position du pivot. Mais ça ne marche pas mieux...
Ça me saoule Scene3DNode_addShapeWithTransform ne fait pas la même chose que Scene3DNode_addShape puis Scene3DNode_setTransform, et je ne comprend pas pourquoi T.T
J'en ai marre des matrices.
ALORS, en fait aucun de mes essais ne fonctionnaient pas parce que j'avais oublié que le forward n'est pas le même entre blender et mini3D+... du coup c'est bon.

Une vidéo du rendu sur playdate elle-même