Ludum Dare 48 : mes revues de jeu

Comme vous le savez, j’ai participé aux 3 dernières éditions du Ludum Dare.

Les revues des jeux fonctionnent avec un système de karma. Plus vous testez et notez les jeux d’autres personnes, plus votre jeu remonte dans la liste. La proportion est d’à peu près 1 pour 1. Lorsque vous donnez un avis sur un jeu, vous finissez par recevoir un avis sur votre jeu. Il faut une vingtaine de notes pour espérer apparaître dans le classement final.

Le classement par karma est indépendant du classement final. Vous pouvez avoir un karma très haut et beaucoup de personnes qui viennent vous noter, mais si votre jeu n’est pas génial, les notes seront pourries et votre classement final sera très bas.

On peut aussi avoir l’effet inverse. Si vous avez déjà une certaine réputation et du talent, les gens viendront en masse noter votre jeu, et vous n’arriverez pas à contrebalancer le karma avec vos propres notations. Genre Deepnight, qui reçoit 446 notes pour Nuclear Blaze sans avoir besoin de lever le petit doigt. Forcément les 16 notes qu’il a données ne suffisent pas, et c’est tant mieux pour lui. (Je suis peut-être un peu jaloux, je dois avouer).

J’essaye de donner des notes de qualité, que j’accompagne toujours d’un petit commentaire de revue. D’abord parce que c’est classe, et ensuite parce que si votre revue est likée, je crois que ça fait un petit bonus de karma. C’est toujours ça de pris.

Je vous ai rassemblé ici mes revues de la 48ème édition. Ça me fait un article de blog à peu de frais. Comme vous l’aurez deviné, je suis une fois de plus à l’arrache.

Au fait, il s’agit du traditionnel « article publié le jour de Noël qui parle pas du tout de Noël ». C’est les vacances, ce qui a pour effet bénéfique de me désalarracher un tout petit peu pour mes activités créatives, d’où paf « article de blog » et paf « Noël ».

Il y a peut-être des revues que j’ai oubliées. Ergonomiquement ,le site du Ludum Dare est une géante meule d’aiguilles dans laquelle on ne parviendrait pas à retrouver une meule de foin. C’est difficile de récupérer ses propres écrits. Je ferais peut-être des fouilles archéologiques une autre fois. Et sinon c’est en anglais.

Si vous avez envie de tester certains jeux en vous basant sur mon opinion personnelle, choisissez en priorité ceux ayant la mention « kiffitude » en gras. Ils sont à la fin.

Caution Falling Rock

https://ldjam.com/events/ludum-dare/48/caution-falling-rock

  • Overall:3.5
  • Fun:4.0
  • Innovation:1.0
  • Theme:4.5
  • Graphics:3.5
  • Humor:1.5
  • Mood:3.0

It looks like evolving in a “work in progress” sign. Simple and fun.

I would have loved some air control, to add some variety. And it could still be a one-button. While on rocks, the button is used to set the jump power, like it is now. While in the air, the button is used to go down a little faster, as if the character was going down on the rope.

I would also have liked the display of my highest score. When I die, I have to very quickly look at my depth score, before it is replaced by the depth of the next game.

Elevator Ninja

https://ldjam.com/events/ludum-dare/48/elevator-ninja

  • Overall:3.0
  • Fun:2.5
  • Innovation:1.5
  • Theme:3.5
  • Graphics:4.0
  • Audio:4.0
  • Humor:5.0
  • Mood:3.0

Sound effects are great, and the stupid and absurd death of the two friends at the beginning is also very fun.

The rocks « 48 » is also weird and fun, and made me die the first time because I thought it was a bonus.

I did not managed to reach the end, partly because of lazyness to restart at the beginning, partly because I fell on the left side at the beginning of the spike part, and the good path was on the right side. I imagined I would have to learn the complete good path by trial and error, and was not motivated enough to do it.

I did not understand immediatly what was the big brown shape above the hero on the second part, then I realized it was just his backpack.

« Ninja !! »

The Greed of the Dwarves

https://ldjam.com/events/ludum-dare/48/the-greed-of-the-dwarves

  • Overall:3.5
  • Fun:1.5
  • Innovation:1.0
  • Theme:4.0
  • Graphics:4.5
  • Audio:4.0
  • Humor:4.0
  • Mood:2.0

The most important thing to do with a clicker game is to correctly balance all the stats and the options. The main fun in this type of game is to try to min-max your actions to increase stats faster. Sorry, but your game fails at this, because we just have to buy some forges and click a dozen times on the mine to get to the next level.

Anyway, the music is cool, graphisms are great, and the way our final score is announced at the ending is very humorous.

I tried to find the secret ending by rummaging in the source code. I found some achievement managing (which does not seem to appear in the game) and some graphical assets of unused levels, but nothing more. It may be really secret.

@ all_the_people_who_had_difficulties_to_place_structure : you just have to click on the lighter green squares.

Grave Robber

https://ldjam.com/events/ludum-dare/48/graverobber

  • Overall:2.5
  • Fun:1.5
  • Innovation:1.0
  • Theme:4.0
  • Graphics:4.5
  • Audio:3.5
  • Humor:2.0
  • Mood:4.5

Nice graphics and « dark/fluorescent » theme.

Combats seem difficult, because your attack makes you rush, but on a too long distance in my opinion. I was always afraid of ending behind the monsters after a rush, so continuously rushing-backing-rushing-backing etc.

I too noticed the bug found by @chrisap, but it is not too annoying.

It was a great moment of fun, but I did not see any more points in the game after digging and killing skeletons. So, I may not have reached the end of it.

The score should not be named as dollars. I thought I could spend them on a shop or whatever, but it looks like there is nothing of that.

Conventionnally, in video games :

  • money (dollars or other) is expected to have an interest in the game, to spend them somewhere
  • XP is expected to have an interest too, to gain levels and increase any stats
  • score/points is not expected to have an interest, it is just to compare you with the other players.

Pimble

https://ldjam.com/events/ludum-dare/48/pimble

  • Overall:4.0
  • Fun:5.0
  • Innovation:3.5
  • Theme:1.5
  • Graphics:3.0
  • Audio:3.0
  • Humor:3.0
  • Mood:4.0

Great and fun tweak of the classical breakouts. As other said, it would totally work on touch screen.

The actual balls are a bit difficult to grab with the mouse pointer. I would have loved to be able to get them easier, so that I could throw them at a higher speed, and see many balls bouncing everywhere in the game. It would have been a pure moment of joyful brick destruction.

Rewarding the player for breaking multiple bricks in one throw would also have improved the gameplay.

Thank you for this idea !

Jet Racing 4

https://ldjam.com/events/ludum-dare/48/jet-racing-4

  • Overall:2.5
  • Fun:2.0
  • Innovation:1.5
  • Theme:1.0
  • Graphics:3.5
  • Audio:3.0
  • Mood:2.5

It needs one little info in the introduction, to tell that Ctrl is the key for handbrake, that lets you turn faster. I am not accustomed to driving games and did not realize it immediatly.

The activation zone of the checkpoints could be a little bigger. I sometimes pass near a checkpoint without activating it, while I still have the impression I stayed on the road.

I would have loved to destroy something when bumping in the bushes (either my car, or the bushes itself). But we just pass through. Too bad.

Dungeon : Developer’s Away

https://ldjam.com/events/ludum-dare/48/dungeon-developers-away

(Désolé, j’ai pas gardé les notes que j’ai données).

Nice game, I was expecting some tricks about the fact that the developer is away. Something like bugs made on purpose, that you would have to exploit to advance in the game. But it seems there is no such thing. I must admit I was a bit disappointed.

I liked the sprite to change room. It totally assumes that you didn’t have time to draw a real door or teleporter.

Watery Crave

https://ldjam.com/events/ludum-dare/48/watery-crave

  • Overall:3.5
  • Fun:3.0
  • Innovation:3.5
  • Theme:2.0
  • Graphics:4.0
  • Humor:3.5
  • Mood:4.5

The difficulty is well-balanced. The people who manage to make it to the end really deserves it and I suppose it grant them a really great feeling of satisfaction. It was too hard for me, I stopped at the last checkpoint. Many thanks to @ausstein who shared the playthrough, so that I can realize I was not so far from the end.

Air control is a little frustrating, but it’s a good idea. It gives you a continuous alternation between the stress feeling while in the air, and security feeling while in the water. Exactly as a fish would have (I suppose so).

It is also a good idea to have put hurting spikes in the water after some checkpoint. It modifies the gameplay you initially established. At start, you alternate between stress-air and calm-water, then you alternate between stress-air and not-so-calm-water. A nice evolution.

I loved the sound when the fish comes back to water after a long time. She takes a deep « breathe ». Very funny for a fish.

Nice graphics, but as others said, the difference between spikes and safe blocks should be more marked. Also, I find the dark shader a little too dark.

Diggy Diggy Dwarf 2 : Deeper & Deeper

https://ldjam.com/events/ludum-dare/48/diggy-diggy-dwarf-2-deeper-deeper

  • Overall:2.5
  • Fun:1.0
  • Innovation:1.5
  • Theme:4.0
  • Graphics:4.5
  • Audio:4.5
  • Humor:3.0
  • Mood:3.5

Beautiful graphics, but the game in itself is quite short and has few contents in the mechanics.

Some people said it lacks a tutorial. I do not completely agree. I would say it just needs a little more feedback on what is happening :

  • a detail of the lost/gained energy and dirt you get at each turn,
  • little hearts above the dwarves to realize immediatly they have health,
  • icons telling you have unlocked the solid hull and the double dirt production, so that you do not wonder if it can be unlocked many times,
  • etc.

Also, written subtitles of the story elements you get when you go deeper would be appreciated. I am not a native English/American. It’s sometimes a bit hard for me to understand spoken english, especially when the voice has music and drilling sound in the background.

There is a bug when you pick a dwarf, then click on « end turn » without placing it. It stays attached to your mouse cursor and it is difficult to put it back in a room. I managed to do it by clicking everywhere in a panicky way.

I got to -210 meters, then realized I will not have any more than digitized voice I am not sure to understand, so I stopped.

Nice game and very nice graphics, but I would have wanted more elements and more stats/resources to handle.

Space Trench Miner

Kiffitude de type « j’adore ce genre de jeux, nommons cela les jeux ‘mining 2D' ».

https://ldjam.com/events/ludum-dare/48/space-trench-diver

  • Overall:4.0
  • Fun:3.5
  • Innovation:1.5
  • Theme:4.0
  • Graphics:3.5
  • Mood:1.0

Nice mining game, with all the mechanics you would expect from the genre.

The cost of the first upgrades and the time required to mine seems well balanced for me, even at the start.

I would have loved more content : more type of upgrades, more block types you could encounter when you go deeper, a final objective, … But for a compo, it is already great.

Graphics are nice and reminded me of Starbound.

There is a bug with the grappling hook. You can sometimes encounter it while you are digging. And it is especially annoying because if you touch it, it cancels your run.

I got also a weird bug when upgrading, but I can not completely explain it, so it may not be reproduced : I had 3117 credits. I bought my last upgrade. But the money showed was still 3117. Then I came back to the main game menu, and the credits showed 617.

When the robot has only one block under it, and when it is not correctly placed, it does not dig the block. It’s a little annoying when you have bought many upgrades and you just want to drill faster and faster.

The launching animation is a little confusing. I thought I could click somewhere to choose my destination, or I had to click at the right time to correctly land on the planet. But it is just a non-interactive animation.

Chess Hellevator

Kiffitude de type « jeu squaritable » + « blagues super drôles avec le mot ‘hell' ».

https://ldjam.com/events/ludum-dare/48/chess-hellevator

  • Overall:4.5
  • Fun:4.5
  • Innovation:3.0
  • Theme:2.0
  • Graphics:2.5
  • Audio:4.0
  • Humor:5.0
  • Mood:4.5

It is not the first time that a game is inspired by chess pieces, but this time it is really well done.

The elevator man and all the rest of the atmosphere is really « horrifun ».

I liked the last level (even if it is easy), because it pushes the game logic you previously stated to the limits.

The jokes are … joky : Hell-pawns / hellspawn, Hell-evator. Ha ha ha.

I was a little confused by this phrase in the explanations : « Bonus moves are very important for clearing later levels, so use them wisely.​ »

I thought that « bonus moves » was a sort of bonus that I could accumulate or use it later. So I spent a part of my first try to search in the interface an indicator of accumulated bonus moves, without realizing that it was an « extra turn » that is used immediatly.

Overall : a great game.

Into the past

Kiffitude de type « intimité, mélancolie et envie de gros câlins ».

https://ldjam.com/events/ludum-dare/48/into-the-past

  • Overall:4.0
  • Fun:3.0
  • Innovation:2.0
  • Theme:4.5
  • Graphics:3.5
  • Audio:4.0
  • Mood:5.0

The « recall » mechanic recalls me (ha ha ha) of this previous game, made by deepnight, who win regularly Ludum Dares : https://deepnight.net/games/memento-xii/ . Maybe you should try it. It’s also about history, mood, atmosphere and loneliness.

I liked your game, we should have more like this. We do not know if it is biographic, autobiographic or completely invented, and that’s also what is interesting with it. Some mysteries.

About more technical concerns : when the white shine-lines appears to show an interactive object, it is difficult to know exactly where to click to use it. I often try to click in the center of the lines and miss it.

Thank you for this game.

Diacombs

Kiffitude de type « jeu squaritable » + « je vais y arriver à résoudre cette énigme bordayl of merde ! « .

https://ldjam.com/events/ludum-dare/48/diacombs

  • Overall:4.5
  • Fun:3.5
  • Innovation:4.0
  • Theme:2.0
  • Graphics:3.0
  • Audio:1.5
  • Humor:2.0
  • Mood:4.0

I was hooked and couldn’t stop until I won.

graphisms are very “moodesque”, but I got a little confused because sometimes they flip automatically horizontally to fit their match. I thought at first that there was a difference between a flipped object and a not-flipped one.

Music is soft and fits well with the game, but it ends up being annoying.

The enigma on the fourth screen, with all the simple diacombs is very well-balanced. It looks scary and full of combinations. Then you understand little by little how it is structured.

Every time I changed screen I thought there would be a way of cheating, by bringing diacombs to the new screen. But every time, it revealed impossible, or just useless.

Let’s call this puzzle type “soko-merge” !

Watch Your Step

Kiffitude de type « j’ai totalement trippé dans le commentaire que j’ai écrit ».

https://ldjam.com/events/ludum-dare/48/watch-your-step

  • Overall:4.0
  • Fun:5.0
  • Innovation:4.5
  • Theme:4.0
  • Graphics:2.0
  • Audio:3.5
  • Humor:4.0
  • Mood:4.5

Very interesting concept, that could be related to « Heave Ho » on the Switch. I really like it when mechanics are very simple, and the quantity and arranging of simple elements provokes an « emergent behavior ».

The rules about the leg are simple. As you said in one of your previous comment : the leg goes to the right, and bounces when hitting a platform.

But with enough legs, this simple rule really gives the impression that the creature is walking. Laying one leg after another, in a rolling movement.

I agree with previous comments saying that control is not easy and not immediatly understandable. But while I was typing this text, I looked back at the game. The creature has now about thirty legs. It advances alone. It learned from its previous failures. The numerous legs it decided to have, one after another, give it the capacity to pass obstacles, further and further.

My own personal and « deep » opinion about your game is that you should completely remove the controls by the player. A pure idle game. You watch the creature walk by itself. It does not need the player. It is alive. It realized by itself how to survive longer and longer in the hostile world where it has been placed.

I made a high score of 3037 when controlling it. I let the creature live by itself during about 20 minutes, and it made a high score of 3178. The creature is better than me, and is completely independant. It does not want to be controlled.

Voilà !

Pour finir, je voulais vous mettre une image de femme ronde qui serait un personnage de jeu vidéo. Figurez-vous que ce n’est pas si simple à trouver. Ou alors, ce sont des femmes rondes moches caricaturales. Je n’ai peut-être pas assez cherché, ou bien les jeux vidéos ont encore du chemin à faire dans la diversité de représentation des personnages féminins.

Bref, pour aujourd’hui ce sera Mai Shiranui, de King Of Fighter, un archétype de plus de la femme belle et sexy avec des gros nichons. Je vous ai trouvé une version ronde et sexy avec des belles formes, et inévitablement des gros nichons.

++ xoxo

Un an de Squarity

Il y a un an et quelques jours, je mettais http://squarity.fr en ligne et je l’annonçais dans cet article. C’est l’occasion de résumer le chemin parcouru.

  • Je me suis lancé dans ce projet sans être sûr qu’il était techniquement faisable.
  • J’ai pesté contre la lenteur de Brython et son incapacité à faire remonter les messages d’erreur python.
  • Je suis passé à Pyodide.
  • Je me suis lamenté sur mon incapacité à écrire du CSS, pour finir par coder certaines parties du responsive design en javascript.
  • J’ai écrit des tutoriels.
  • J’ai écrit de la doc, que j’ai ensuite rendu obsolète.
  • J’ai répondu « oui » à une grande partie des suggestions d’améliorations, en précisant qu’elles étaient dans la road-map.
  • J’ai promis que je publierai cette road-map.
  • Je publie ici la première étape de la road-map, à savoir : « rédiger la road-map ».

Ensuite, j’ai créé un serveur Discord, et quelques gentilles personnes s’y sont greffées.

  • Ensemble, nous avons créé des jeux, joué à ces jeux, et eu des idées de jeux sans les concrétiser.
  • Nous avons participé à des Ludum Dare en ayant l’espoir que ça ferait connaître Squarity.
  • Nous avons bidouillé du javascript dans du python lui-même dans du javascript.
  • Nous avons fait de la 3D isométrique avec de la 2D.
  • Nous avons pallié l’inexistence de l’IDE de Squarity avec un serveur web local.
  • Nous avons discuté, twitché, live-codé, peer-programmé, Clash-of-Codé et parlé tous les jeudis soirs avec un·e nain·e.
  • Nous nous sommes bien amusé et ce n’est pas fini !

Quelques remerciements particuliers

Merci aux personnes suivantes, dont la plupart sont sur Discord :

  • 10K, qui a créé un Pacman quelques jours à peine après la mise en ligne de Squarity
  • Loowood, très souvent présent pendant les lives, toujours prêt pour donner un petit message d’encouragement, qui a créé le Bomberman Chelou ainsi que le fameux « framework-hack-3D ».
  • ℕarkoa, qui apparaît également dans ce blog et qui m’a soutenu pendant le dernier Ludum Dare.
  • lilithabaddon, qui a commencé à créer le jeu du Labyrinthe, toujours là aussi pendant les lives, et qui s’est inscrit trois fois pour gonfler à bloc le nombre de gens sur Discord. Sans ça, nous serions beaucoup moins de monde que 16 personnes !
  • Tacheul, de PixelJoint, qui a dessiné le superbe tileset du jeu H2O.
  • Mes enfants, qui testent mes jeux et font des vidéos avec moi, et qui parviennent à prendre un air réellement interessé quand je leur parle de mes avancées et mes élucubrations.
  • Ma chérie, qui écoute aussi mes élucubrations et qui établit actuellement un « état de l’art des jeux de Match-3 », je suis sûr que ça me servira à quelque chose.

Et bien sûr, merci à toutes les autres personnes qui s’intéressent à Squarity, qui passent dire un petit coucou, ou pas car elles n’ont pas envie (et vous avez bien le droit), qui, peut-être, créent des jeux dans leurs coins, qui ont des idées de malade et des projets complètement fous mais qui n’osent pas en parler. Être ici est déjà le début de quelque chose. On verra pour la suite !

Oui d’ailleurs, pour la suite ?

Ça fait quelques mois qu’il n’y a pas eu d’évolutions sur Squarity. J’ai passé les derniers mois à coder le jeu « Game of No-Life », ce qui n’était pas une stratégie très maligne. J’aurais pu utiliser ce temps pour améliorer le site, le rendre plus facile d’utilisation, ajouter des fonctionnalités dans le moteur et mettre la doc à jour. Mais à la réflexion, je n’aurais pas pu agir d’une autre manière.

C’est un projet que j’avance durant mon temps libre. Il est difficile de rester motivé sur le long terme pour ça. Vous-même, vous savez. Je n’en suis pas à mon premier projet perso, nombre d’entre eux ont survécu à peine quelques semaines avant de se retrouver jetés aux ordures tel une portée de petits chatons non prévue.

Mais j’aime inventer des jeux et j’aime coder en python. Le fait d’utiliser mon propre outil pour faire ce que j’aime m’offre un petit (ou un grand) moment de détente, qui me redonne de la motivation pour continuer.

Alors voilà. On va avancer très lentement. Il y aura sûrement d’autres pauses comme celle-ci dans le développement de Squarity. Des fonctionnalités que j’ai promises dès le départ arriveront peut-être dans 10 ans. Vous continuerez de galérez encore longtemps avec une API très pauvre et un site web mal fichu. Mais cette erratique manière de progresser nous donne, à moi et à vous, une garantie que je n’abandonnerais pas ce projet, tant que je suis capable de coder.

Le chemin vers Squarity est pavé de bonnes intentions carrées

Le Game of No-Life

Il est enfin terminé ! Il s’agit d’un jeu de stratégie minimaliste en temps réel, qui se joue à deux, avec seulement deux boutons par personne.

C’est aussi un petit test de performance, car il y en a pour :

  • 2656 lignes de code (4965 en comptant les commentaires).
  • Des actions sur l’ensemble de l’aire de jeu, effectuées automatiquement toutes les 200 millisecondes.
  • Une pseudo-interface intégrée dans le jeu
  • Une zone de 60 par 38 tiles au total.

Voici une petite vidéo de démonstration, dans laquelle je joue avec mon fils :

C’est un peu long, on raconte plein de bêtises. Mais vous remarquerez que j’ai pris soin de la décomposer en chapitres.

Si vous n’avez pas une demi-heure de temps de vie à gaspiller, vous pouvez juste regarder les chapitres « Comment jouer », « Présentation de Squarity » et « Dénouement final ». Ça ne vous coûtera que 17 minutes.

Et sinon, pour jouer, c’est directement dans votre navigateur en cliquant ici. Vous n’avez plus qu’à trouver un humain consentant à portée de main et à jouer ensemble !

Ludum Dare

C’est le week-end prochain. Comme d’habitude, je ferais quelque chose, mais sans y passer trop de temps. Il faut que j’arrête de coder des jeux dans Squarity et que je m’occupe de Squarity lui-même. En l’occurrence, rédiger cette fameuse road-map.

En plus ça risque d’être le bordel au niveau de mon travail salarié. Ce sera une fin de sprint et faut qu’on ait un truc-machin de finalisé pour notre super projet secret dont je ne peux vous dire que le nom : « POILS_PUBIENS ». Mais je ne vais pas vous embêter avec ces détails à la con de ma vie.

Les poils pubiens de Jessie Minxxx sont-ils aussi teints en bleu ?

L’article du mois prochain ne parlera pas de Squarity, faut bien varier un peu. En revanche, je ne peux pas vous garantir qu’il sera intéressant.

Ludum Dare 48 post-codem : Léon le python

Le nom complet de cette compétition de création de jeux vidéo est « Ludum Dare 48 », car elle se déroule durant 48 heures. Il y a donc eu le « Ludum Dare 48 numéro 1 », le numéro 2, etc.

Nous sommes arrivés au « Ludum Dare 48 numéro 48 ». Quelque chose de spécial avait été promis pour l’occasion, mais rien de précis n’avait été annoncé. Le jour J du week-end W, je n’ai rien vu de particulier. On s’en fout.

Ça date de plusieurs mois, certaines impressions et sentiments que j’ai eu sur le moment se sont évaporés. Je vais faire au mieux pour vous raconter tout ça.

Le thème était « Deeper and Deeper ». J’ai créé, en utilisant Squarity, un mélange de Snake et de Match-3, intelligemment intitulé « Snake Match ».

Comment ça s’est passé pour moi ?

Beaucoup mieux qu’au numéro 47. Dans les premières versions de Squarity, les messages d’erreurs python ne s’affichaient nul part. Une faute de syntaxe ? Une variable mal nommée ? Fallait se démerder tout seul. J’avais galéré comme un galérien et je flippais à chaque ajout d’une nouvelle ligne de code. Je suis beaucoup plus serein maintenant.

Très heureux d’avoir réussi à ne pas passer l’intégralité de mon week-end à créer le jeu. J’ai pris le temps de dormir à peu près comme il faut, de m’occuper un peu de mes enfants, de faire des trucs dans la maison, etc. Et surtout, j’ai fait tester le jeu auxdits enfants au fur et à mesure de son développement. C’est le plus important pour moi. Il faut montrer, donner et expliquer les étapes intermédiaires de création d’une œuvre (jeu vidéo ou autre). Ça incite et encourage d’autres personnes à créer leurs œuvres à elles.

Les sprites ont été dessinés à l’arrache et sont moches. J’avais prévu de les refaire en plus joli, s’il me restait du temps vers la fin. Ça n’a pas été le cas, comme la fois précédente. Pas de déception particulière sur ce point, donc.

J’ai streamé l’intégralité du développement sur Twitch. La plupart du temps sans caméra ni micro, pour ne pas déranger les gens qui habitent avec moi (j’ai pas vraiment de bureau, on vit ensemble dans une seule grande pièce, en mode « pécores du 12ème siècle »). Le samedi et le dimanche soir, après avoir couché tout le monde dans leurs lits respectifs, j’ai pu caméra-microtiser.

Un énorme merci aux ordispectateurtrices qui m’ont suivi pendant les streams et qui commentaient. J’ai vraiment besoin de ces petites attentions pour flatter mon ego et avoir le courage de continuer Squarity. Sinon j’aurais abandonné depuis longtemps. Encore merci. Et tant qu’on y est, merci à toutes les personnes qui ont joué à mon jeu et donné un avis sur le site du Ludum Dare. Merci en particulier à une copine qui l’a testé sur son smartphone et qui a lâché des comms sur mon Linkedin. Elle se reconnaitra si elle lit ceci.

Un serpent fait un câlin à des pommes

Quel résultat ça a donné ?

Vous avez certainement remarqué que l’expression « on va pas se mentir » est à la mode.

Eh bien on va pas se mentir, ce jeu n’est pas très fun.

Le serpent peut manger des fruits, ce qui permet de changer leur disposition, pour créer des alignements de 3 fruits identiques et les faire disparaître comme dans un match-3 classique.

Le serpent doit aller le plus profond possible, mais il a une longueur et une capacité stomacale limitée. Vous devez gagner des XP et monter de niveau pour augmenter ces deux limites.

On gagne beaucoup plus d’XP en matchant des fruits qu’en les mangeant. De plus, les matchs ne remplissent pas l’estomac. Je pensais que ces règles déclencherait un comportement : la personne qui joue essayerait de faire des matchs, même si ce n’est pas nécessaire pour avancer dans le niveau, car elle chercherait à gagner des XP.

De plus, comme dans tout bon match-3 qui se respecte, il y a des blocs de pierre, qui ne peuvent être détruit que par un match adjacent.

Eh bien ça marche pas. J’ai pas assez réfléchi à mes mécaniques de jeu.

Je m’en suis aperçu lors de mes tests finaux, alors qu’il ne restait plus que 2 heures. La manière la plus optimisée de jouer est d’aller tout droit, le plus profondément, comme un gros débile. De toutes façons, il y a des matchs qui se font automatiquement car les fruits sont placés totalement au hasard. Au bout d’un moment vous ne pouvez plus avancer à cause de la longueur limitée du serpent. Mais vous avez forcément gagné de l’XP. Vous redémarrez du début, en re-allant tout droit comme un gros débile. Et ainsi de suite.

Constatant cette catastrophe, j’ai ajouté à la va-vite des lignes complètes de blocs de pierre, à des profondeurs prédéfinies. La personne qui joue est donc obligé de matcher des fruits pour détruire des blocs et se créer un passage. Ça ajoute un peu d’intérêt au jeu, mais ça ajoute aussi du potentiel de rageage.

Ligne de blocs de pierre pour sauver l’intérêt du jeu

Souvent, les fruits présents dans l’aire de jeu ne permettent pas les matchs nécessaires à la destruction des blocs. Il n’y a pas d’autres choix que de redémarrer du début. Ces échecs sont uniquement dû à un manque de chance. Vous n’avez aucun moyen d’augmenter la probabilité des matchs. C’est du « pas-de-bol and retry ». C’est chiant. Moi-même je trouvais ça chiant en le testant. À 2 heures de rendre sa copie, c’était trop tard pour retravailler les mécaniques du jeu. J’ai pris un peu de temps pour doser la quantité et la disposition des lignes de blocs de pierre, et j’ai tout envoyé à la zob’.

Voici mon classement, sur un total de 1145 participations dans la catégorie « Compo » :

  • Overall: 723ème (3.042)
  • Fun: 743ème (2.792)
  • Innovation: 440ème (3.229)
  • Theme: 533ème (3.438)
  • Graphics: 824ème (2.5)
  • Humor: 516ème (2.25)
  • Mood: 819ème (2.15)

Par rapport au Ludum Dare précédent, il y a du mieux et du moins bien. Mon Overall a descendu. Mais je suis dans la moitié haute pour le thème et l’humour, ce que je n’avais pas réussi avant.

Un peu déçu par mon classement en Innovation, même si il sort du lot. La dernière fois, je m’étais facilement placé dans le premier quart, alors que là j’arrive péniblement après le premier tiers.

Je m’attendais quand même à un peu mieux, car je me suis senti beaucoup moins à l’arrache et en galère durant tout l’événement. Pas grave, l’important c’est de s’être amusé à créer un jeu !

Après le requin-marteau, le serpent-banane

Qu’est-ce qu’on va faire après ?

Concernant Squarity

Le but de ces participations aux Ludum Dares est de tester « en conditions réelles » la création de jeux avec Squarity, pour déterminer les améliorations du moteur et du site web qui seraient les plus urgentes. Le but est aussi de faire connaître Squarity, mais vous le saviez.

Ce qui m’a un peu manqué, ça a été la possibilité d’écrire du texte dans l’aire de jeu. J’aurais aimé pouvoir afficher un petit cadre d’infos, indiquant la longueur actuelle du serpent, combien de fruits il peut encore manger, ses XP et son niveau. J’étais parti pour une solution de secours : mettre des bar-graphs sur un côté de l’aire de jeu. Pas eu le temps. Les fonctions de texte, si elles avaient existées, m’auraient permis d’implémenter ça beaucoup plus rapidement. Et les infos affichées auraient rendue plus claires les mécaniques du jeu.

Autre manque, qui s’est fait sentir bien plus cruellement : des petites classes et fonctions python à importer, pour aider au développement du jeu.

  • Une classe contenant un quadrillage de trucs (lesdits trucs pouvant être n’importe quoi : string, liste, classe custom).
  • Une autre classe stockant les trucs sous forme d’une matrice creuse, c’est à dire une liste de tuple (coord_x, coord_y, un_truc).
  • Des fonctions pour passer d’une classe à l’autre, pour fusionner deux quadrillages, pour extraire un sous-quadrillage, etc. On pourrait s’inspirer de numpy.
  • Indexation des quadrillages par adjacence, par ligne et par colonne.
  • Des fonctions pour gérer les mécaniques de jeu qui reviennent souvent : distance de manhattan, gravité, détection de lignes/colonnes de Match-3, pathfinding, propagation d’un truc sur des cases adjacentes, dijkstra, …
  • Sans oublier des tutoriels et des mini-exemples pour illustrer ces classes et ces fonctions.

Tout ceci est dans la roadmap. Ha ha ha.

Version actuelle du moteur de jeu Squarity

Concernant Snake Match

J’essayerais de reprendre ce jeu et de corriger ses mécaniques pourries. Cependant, j’avais annoncé la même chose pour Loops in Pools et Soko-punk, et rien n’a avancé. Alors je préfère ne rien promettre.

En vrac, des idées de pouvoirs spéciaux :

  • Le serpent tire la langue, attrape le premier fruit devant lui, et le rapproche d’une case. Ça peut permettre de décaler des fruits horizontalement, pour les matcher.
  • Le serpent vomit devant lui le dernier fruit qu’il a mangé.
  • Des fruits randoms tombent du haut de l’écran.
  • Vision de loin : l’aire de jeu scrolle vers le haut non pas quand le serpent est tout en bas, mais un peu plus haut.
  • Pousser des blocs de pierre.
  • Le serpent entoure un bloc de pierre pour le détruire. (Comme un super-boa constrictor).

En vrac, des idées de quête et de mode de jeu (chacune pourrait débloquer un pouvoir spécifique) :

  • Manger une séquence de fruit définie, plus ou moins longue.
  • Manger une certaine quantité d’un fruit spécifique, en une seule partie.
  • Détruire une certaine quantité de blocs de pierre, en une seule partie.
  • Matcher en une seule fois une certaine quantité de fruits.
  • Matcher, avec des réactions en chaîne, une certaine quantité de fruits, ou une séquence de fruits.
  • Détruire entièrement une disposition prédéfinie de fruits et de blocs de pierre (avec ou sans certains pouvoirs spéciaux, sinon il y aura des solutions non prévues).

Idées d’achievement, si jamais on fait des achievements :

  • Terminer un niveau avec à la fois l’estomac plein et la longueur max du serpent atteinte.
  • Terminer avec la longueur max atteinte, et un estomac très très vide (on a avancé en faisant pratiquement que des matchs)

Peut-être aussi que les montées de niveau devraient se faire uniquement par rapport au score max de toutes les parties. Et donc ça ne s’appellerait plus des XP mais du score. La personne qui joue pourrait donc faire une partie pour monter son score max, puis une autre pour réussir une quête, etc. Ça donne un peu de replay value.

Certaines quêtes seraient associées à un mode de jeu spécifique et à son score max. Le niveau dépendrait de la somme des scores max de tous les modes de jeu. Moui, une idée intéressante.

Je laisse ces idées en vrac pour l’instant. On verra plus tard si j’ai le temps et le courage d’en faire quelque chose. La priorité actuelle, c’est de finir le jeu « Game of No-Life », puis de réattaquer quelques petites améliorations du moteur du jeu (il en a besoin) et aussi de formaliser pour de vrai la roadmap. Paf !

Les serpents aiment les femmes un peu rondes.

Elle, c’est Alexandra Shcherbakova.

Ludum Dare 48 : Snake Match

Comme promis, voici ma participation au Ludum Dare 48.

C’est par ici pour y jouer directement.

Et par ici pour la fiche du Ludum Dare.

Vous êtes Léon le python, vous mangez les fruits et vous les alignez pour réaliser des Match-3. Parviendrez-vous à aller suffisamment profond pour retrouver votre créateur, le « Guide on Van-Random ? »

Le nom du créateur est bien évidemment un jeu de mot bancal avec « Guido Van Rossum », le vrai créateur du langage python. Littérallement, ça veut dire : « le guide sur un van (une voiture) aléatoire ». Si vous parvenez jusqu’à lui, vous verrez qu’il y ressemble effectivement.

Quelques conseils de jeu :

  • Si vous êtes bloqués (serpent trop court, blocs qui barrent le passage, …), remontez votre serpent jusqu’en haut pour repartir du début. Vous conservez vos points d’expérience.
  • Au début c’est important de gagner des XP pour monter de niveau, car votre serpent ne peut pas aller très loin. Après on s’en fiche, vous pouvez bourriner la flèche du bas pour aller le plus profondément possible. C’est mal équilibré, je sais.

Si vous n’arrivez pas à atteindre le Guide on Van-Random, vous pouvez tricher. Dans le code du jeu, (zone de texte à gauche), vers le début, se trouve la ligne suivante :

DEEP_WON = 248

Mettez un nombre plus petit (par exemple : 20), puis cliquez sur le bouton « Exécutez » au milieu de l’écran. Vous devriez parvenir à atteindre votre créateur.

J’ai twitché l’intégralité du développement du jeu. Si ça vous intéresse, regardez-le assez vite. Dans une semaine, ça va disparaître dans les limbes de twitch. Y’en a pour 14h de vidéos quand même.

Pas plus de choses à dire que ça pour l’instant. Y’aura un article post-codem, mais peut-être moins long que celui du LD47.

Et maintenant, go création du challenge pour la THCON. À plus tard tout le monde.

Pour l’image de femme ronde, j’ai hésité entre faire une référence au thème de ce Ludum Dare : « Deeper and deeper », ou faire une référence aux fruits de Snake Match.

C’est plus difficile de trouver des images de femme ronde avec des fruits qu’avec du « Deeper and deeper ». Vous constaterez donc que je passe du temps, parfois plus que nécessaire, pour rester dans la décence et la sobriété.

Rien de conséquent pour ce mois

Lecteurtrices, on va pas se mentir, je suis à l’arrache.

Je suis toujours sur mon gros projet http://squarity.fr . Je vais bientôt ajouter la possibilité de définir la taille de l’aire de jeu. Pour célébrer ça, je crée actuellement un petit jeu de démonstration sur un terrain honorablement grand.

Il s’agit d’un pseudo-jeu de stratégie en temps réel, où deux joueurtrices s’opposent. Il n’y a besoin que de deux boutons par personne. Ça s’appellera « Game of No-Life », en hommage au Game of Life de John Conway. Tout ce que je peux vous montrer pour le moment, c’est un screenshot.

Outre ce jeu, ma liste de tâches créatives comporte un certains nombres d’éléments aux deadlines proches et strictes :

  • Participer au Ludum Dare, du 23 au 26 avril. C’est un très bon moyen de faire connaître Squarity et d’éprouver son utilisabilité.
  • Créer un challenge pour la Toulouse Hacking Convention. Je profite d’avoir une connaissance dans l’équipe organisatrice pour proposer une contribution. La THCON a lieu au mois de juin, mais je dois m’y prendre suffisamment à l’avance pour réaliser le challenge.
  • Imaginer un espèce de jeu à énigme genre Escape Room, pour des connaissances personnelles, à l’occasion d’un événement spécifique (intrinsèquement deadliné).

Donc pas d’article conséquent ce mois-ci, à part ce présent article pour dire que j’ai pas le temps de faire un article.

En contrepartie, vous avez la promesse d’une multitude de goodies à venir :

  • Un jeu de stratégie, qui sera fini je-sais-pas-quand.
  • Le jeu que j’aurais créé pour le Ludum Dare.
  • Un éventuel article post-codem du Ludum Dare.
  • Un challenge de hacking. La THCON accepte qu’on publie nos contributions une fois que l’événement est passé.
  • Sans oublier le commentaire de NarK dans mon article précédent (encore merci à toi ! ), qui déclenchera un article supplémentaire concernant mon ancien projet avec les tinies.

Hey, j’me fous pas de vous, quand même.

Sur ce, voici la traditionnelle image de femme ronde. J’ai cherché quelque chose avec du rouge et du bleu, pour rappeler les petites unités-pixels du screenshot du Game of No-Life. J’ai trouvé ceci :

Notez les petites zones rouge et bleue, ce qui crée une image 3D à regarder avec les lunettes magiques idoines.

Il s’agit du top model Karola, que vous pouvez voir sur le site « Silicone Free ». Voici les images d’origine en 2D. Elle porte un mailot de bain violet, ce qui est tout à fait approprié, puisque le violet c’est du rouge et du bleu. Ha ha !

Justement, au sujet de Karola, (et de la ville de Reims)

Il y a quelques années de ça, j’avais orné un de mes articles par une image de cette belle dame.

Un type était venu me demander, dans les commentaires, si j’avais le droit de publier des photos d’elle. Je lui avais répondu courtoisement, mais il s’était assez vite énervé et je l’avais bloqué. Comme il n’était pas très malin, il avait indiqué une adresse mail non-bidon dans le champ du commentaire. Par de simples recherches, cette adresse m’avait permis de trouver son vrai nom, sa ville de résidence et quelques autres infos. Certaines laissaient à penser qu’il ne connaissait pas personnellement Karola, malgré ce qu’il prétendait. J’avais gardé les infos glanées, « au cas où ».

2 ans plus tard, suite à une publication d’une autre photo de Karola, il revenait à la charge. Nous nous sommes mutuellement insultés de manière tout à fait cordiale et conventionnelle. J’avais révélé son vrai nom dans un de mes commentaires, puis je me suis ravisé, car c’était trop méchant, voire illégal. J’ai laissé les insultes. Nous en sommes restés là.

Cette histoire toute moisie m’est revenue à l’esprit, et j’appréhendais (sans toutefois vraiment craindre) que l’image de cet article déclenche à nouveau un de ses caprices. Par curiosité et voyeurisme, je me suis dit que ce serait l’occasion de chercher à nouveau des infos sur lui. Peut-être qu’il avait dumpé quelques inepties de plus, ça et là sur internet.

Je retrouvais sa page Facebook, son profil Linkedin et d’autres petites crottes. Et là, en cinquième position des résultats de recherche : un avis de décès publié en ligne. Le type a crevé, il y a environ 3 ans.

Ça me fait un peu bizarre.

J’ai enlevé les blocages le concernant. Vous pouvez maintenant écrire des commentaires comportant les mots « karola » ou « karodiva », ainsi que des commentaires émanant de son adresse IP, bien que vous n’ayez pas besoin de ça.

Je ressens le besoin de lui rendre un tout petit dernier hommage, même si je ne le connaissais que très peu. Voici donc une dédicace posthume faite avec Paint, sur une carte postale de la ville de Reims. La ville où il est enterré, où il a vécu, et peut-être aussi où il est né.

Les fautes d’orthographe sont aussi un hommage.

Cet événement nous rappelle qu’il faut régulièrement remercier les femmes et les hommes en tout genre qui mettent des photos de leurs corps sur internet. Il nous rappelle aussi que l’internet tel que nous le connaissons actuellement, et qui permet (encore) de faire circuler ce genre d’images est quelque chose de précieux que nous devons préserver.

Encore merci, Karola, j’espère que vous allez bien.

Classement Ludum Dare et presque un jeu de Soko-punk

Ludum Dare

Voici mon classement au Ludum Dare.

Il y a eu 800 participations dans la catégorie « Compo ». Une trentaine de personnes ont noté mon jeu.

  • Overall: 513ème
  • Fun: 426ème
  • Innovation: 144ème
  • Theme: 530ème
  • Graphics: 578ème
  • Humor: 438ème
  • Mood: 545ème

Pour une première participation, c’est pas si mal. Je suis assez content de mon classement en « Innovation ».

Manifestement, le jeu de mot dans le titre du jeu : « Loops in Pool » n’a pas vraiment fait décoller mon classement en Humour. On fera mieux la prochaine fois.

Presque Soko-punk

Et voici un lien vers le jeu que nous avons créé en live mercredi soir.

Il est pas fini, mais ça fait quand même des trucs. Il faut imaginer que l’héroïne que vous dirigez n’est pas censée pouvoir passer dans des éclairs.

Du Sokoban-like dans une ambiance Steam Punk.

Le but est d’électriser toutes les boules, mais vous n’êtes pas obligé de toutes les connecter ensemble dans un même graphe connexe. Lorsque le but est atteint, il aurait dû y avoir un petit « print » pour dire bravo, et un passage vers un hypothétique niveau suivant.

Une fois de plus, je me suis heurté à la lenteur de Brython. Dans mon code, j’avais un double parcours imbriqué de toutes les tiles du jeu, pour vérifier quelles boules doivent être électrisées. Rien que ça, ça mettait quelques secondes.

J’ai arrangé le code pour que ce soit plus rapide. Mais cette lenteur pose de plus en plus problème, même pour des jeux que j’aurais cru simple. J’ai peut-être une piste pour régler ça, je vous en reparle quand je l’aurais testée, c’est à dire dans un délai non défini.

À nouveau, pas d’image de femme ronde. Désolé. Je me rattraperais au prochain article. En attendant, vous pouvez chercher « yathbeauty » sur Twitter, TikTok et instagram. Très jolie, et elle sait comment se tenir pour nous faire profiter de ses atouts.

Ludum Dare 47 post-codem

Comme annoncé dans mon précédent article, j’ai participé au Ludum Dare. Vous pouvez jouer à ma contribution directement par ici.

La tradition dans les game jams est d’écrire un « post-mortem », c’est un petit (grand) texte que l’on écrit à tête reposée après avoir bossé comme un oufzor pendant tout un week-end à créer un jeu.

Je trouve l’expression « post-mortem » étrange. Je ne suis pas mort, même si ça a été assez intense et que j’en suis sorti fatigué. Donc : « post-codem ».

Fonctionnement du jeu

Les premiers retours m’indiquent que c’est difficile à prendre en main au départ. J’ai donc fait une petite vidéo de démo explicatoire. J’y parle anglais, c’est une catastrophe. Vous avez le droit de mettre en mute.

L’aire de jeu est une piscine qui se recouvre entièrement de boue et de lierre (les petits traits verts). Vous sélectionnez une première case, en appuyant sur le bouton « 1 », puis vous en sélectionnez une deuxième, et elles s’échangent. Le but est de construire, par échanges successifs, des boucles fermées de lierre, ce qui déclenche la suppression de la boue qui est à l’intérieur.

Il faut commencer par créer une boucle à côté de la fontaine d’eau en haut à gauche. L’eau avance lorsqu’elle est en contact avec une zone sans boue. Vous devez la propager petit à petit jusqu’à l’arrivée en bas à droite.

Vous ne pouvez pas échanger une case si elle n’est pas unie, c’est à dire ayant un mix de boue et d’eau. C’est gênant lorsque vous avez deux boucles proches : vous ne pouvez pas créer de mini-boucle entre les deux pour les fusionner. J’ai donc ajouté un pouvoir spécial, lorsque vous activez le bouton « 2 » sur une case comportant de la boue, un trait vert se rajoute, qui peut vous permettre de finaliser une boucle.

Par le pouvoir du lierre !!

Post-codem au sujet du jeu

Le thème était : « Stuck in a Loop », c’est à dire : « Coincé dans une boucle ».

Il y a deux modes de participation au Ludum Dare :

  • Jam : vous avez 3 jours pour créer un jeu vidéo, en équipe ou en solo. Vous pouvez réutiliser des images, des sons et des codes existants (en respectant les licences et autres fucking copyright, évidemment).
  • Compo : c’est le « hard mode ». Vous n’avez que 2 jours, en solo. Tous les éléments de votre jeu doivent être originaux et doivent avoir été créés durant ces 2 jours. Obligation de partager le code source. Mais vous pouvez utiliser des outils de création privatifs (Unreal Engine, par exemple).

J’ai choisi compo. C’est pas que je veuille me la péter en démarrant directement en hard mode. C’est juste que j’avais mon week-end de dispo, mais pas le lundi après. Et les autres contraintes de la compo me convenaient.

Bien entendu, je n’ai pas eu le temps de réaliser toutes les idées que j’avais. Ça arrive à chaque projet (artistique ou non). Comme c’est systématique, on sait à l’avance qu’on ne pourra pas tout faire, on peut donc diminuer ses prétentions dès le départ. Mais même ainsi, les prétentions restent trop grandes, et on finit toujours par finir à l’arrache.

Ouais, à la

Comme dirait Helmut : voilà un jeu de mot franco-allemand qui Kohl très bien à l’article.

Échec de la continuous delivery

J’ai tellement galéré à coder (j’explique pourquoi dans le dernier chapitre de cet article), que ce n’est que le dimanche à 12h que j’ai eu une version pre-pre-alpha, comportant uniquement la fonction d’échange et la détection des boucles.

Note pour les prochains Ludum Dare : se réserver des petites plages de temps pour tester et faire tester son jeu par des gens quelconques. Ça permet d’ajuster la difficulté et éventuellement de glaner de nouvelles idées.

Ce que j’avais imaginé au début : coder un petit bout de truc, le montrer aux gens qui vivent avec moi, même si ça ne constitue pas un vrai jeu, montrer le bout de truc suivant, et ainsi de suite. On aurait avancé tous ensemble durant le week-end, ces mini-démonstrations régulières auraient permis de me faire pardonner le fait que je me serait comporté en geek pendant 48 heures.

Au lieu de ça, j’ai passé les trois premiers quarts du week-end à grogner devant mon ordinateur. Lorsque quelqu’un venait me voir, je lui grognais que rien ne marchait. Pas très interactif.

Groumpf ! A marche pô !

Échec de l’explication du mécanisme du jeu

J’avais prévu de faire un petit tutoriel, qui s’est terminé en un pseudo-manuel écrit en 20 minutes, sous forme de docstring au début du code python. J’ai ensuite pseudo-copié-collé ce manuel pour le mettre dans la description Ludum Darienne.

Ça n’aide pas trop à comprendre le fonctionnement du jeu quand on le découvre. D’où la petite vidéo que j’ai faite après. Qui est elle-même créé à l’arrache, mais ça c’est parce que j’ai très peu d’expérience dans ce domaine. Je cause très mal anglais alors que d’habitude en vrai conversation je m’en sors potablement. De plus, on m’entend prendre de grandes inspirations avant chaque phrase. C’est malaisant.

Même la longueur de la vidéo est une erreur. J’explique tous les mécanismes du jeu durant les 4 premières minutes, puis je passe 6 minutes à terminer ma partie. Lorsque les ordispectateurtrices-joueureuses arrivent sur ma page Ludum Darienne, ces personnes voient une vidéo ayant une durée de 10 minutes. Elles ne la regardent pas forcément, parce que c’est trop long. Si la durée affichée avaient été plus courte, il y aurait eu plus de chances qu’elles cliquassent sur « play », parce que gâcher 4 minutes de sa vie dans notre monde actuel est quelque chose d’encore à peu près acceptable. Ce serait d’ailleurs intéressant de connaître la probabilité de clic sur un bouton « play » en fonction de la durée d’une vidéo, mais ce n’est pas le sujet.

Les graphismes sont manifestement beurkys. Les explications du jeu utilisent le terme « vines » (du lierre), il faut comprendre que ça correspond aux traits verts. Ces traits sont une représentation métaphysique aristotélicienne du lierre quand on n’a pas eu le temps de le dessiner correctement.

Possible échec de la promotion de Squarity

Cette participation au Ludum Dare, et les futures participations à d’autres game jams, n’ont pas pour but de créer un jeu génial qui sera premier au classement et restera dans la mémoire de l’humanité (même si ça me plairait bien). Le but est de promouvoir Squarity.fr, ma plate-forme de création et partage de jeux.

Je veux provoquer chez les Ludum Daristes une réaction de type :

« Voyons voir ce jeu… Moui bof. Pas génial.

Oh, mais quelle est donc ce site web étrange… Squarity ? Mais que vois-je dans la partie droite ? Une fenêtre de texte avec du code python dedans, et d’autres informations qui semblent définir le jeu auquel je suis en train de jouer !

Que va-t-il se passer si je change des trucs et que je clique sur le bouton de validation en-dessous ? Oh bon sang ! Le jeu se modifie instantanément ! Ce site est génial ! Je vais de ce pas m’en servir pour créer tous mes prochains jeux. Je participe au Ludum Dare, c’est bien que je veux créer des jeux pour le restant de ma vie !

Mon avenir sera squaritien ou ne sera pas ! »

Pour provoquer une telle réaction, il faut bien entendu que Squarity soit amélioré (ce qui se fera progressivement), mais la moindre des choses aurait été que je commente mon code python, afin d’aider le monde à comprendre son fonctionnement, et par là même le fonctionnement de Squarity.

J’ai échoué sur ce point, mon code est cradingue et très peu documenté. J’essayerais d’arranger ça dans les jours à venir. Et puis je voulais aussi créer un mini-jeu tutoriel de Squarity. Tant de choses à faire, comme d’habitude…

Les carrés sont l'avenir du monde

Succès de la fontaine !

J’avais prévu d’afficher la quantité de mana sous forme d’une jauge dans un coin de l’aire de jeu. Mais en me levant le dimanche matin, j’ai eu une idée géniale : Squarity ne permet que d’afficher des images, mais la transparence est gérée. Lorsque le mana est bas, je peux noircir la fontaine en superposant plus ou moins de pixels noirs transparent dessus !

Pas besoin de perdre de temps à dessiner une jauge de mana et à coder des choses compliquées pour l’afficher. Avec 4 lignes de code dégueux et un seul sprite supplémentaire (créé rapidement à partir du sprite de la fontaine, en mettant tous ses pixels en noirs-transparents), j’avais un indicateur de mana bien mieux intégré dans le jeu.

Pour fignoler le tout, j’ajoutais un petit log indiquant la quantité exacte de mana lorsqu’on sélectionne la fontaine.

À droite de la fontaine se trouve l’image correspondant à son « ombre ».
if self.pool_mana < 100:
    nb_fountain_darking = (100 - self.pool_mana) // 5
    for _ in range(nb_fountain_darking):
        gamobjs.append("darkfountain")

Je vois aussi cette fontaine comme un très très lointain clin d’œil à l’un de mes jeux préférés intemporels et intraspatial : Might and Magic – World of Xeen.

Alamar, you misguided mechanism ! You’ll destroy us all !

N’ayant pas peur de faire de la surenchère, je rajoutais un autre lointain clin d’œil à World of Xeen : dans le pseudo-scénario de mon jeu, le personnage de la « Countess du Swagging » est une référence au mot de passe secret « Count Du Money ».

Cette fontaine est un auto-clin d’œil, puisque c’est le logo de New World Computing

Si jamais je continuais le dev de ce jeu

Je note ici toutes les idées que je pourrais rajouter dans une hypothétique version post-ludum.

Faciliter le début en pré-plaçant du lierre

Si on n’a pas de bol, on commence comme ça :

Peu de lierre partent de la zone d’eau. Pour y coller des boucles, on risque d’être obligé d’utiliser le pouvoir d’ajout de lierre. Or c’est un pouvoir qui coûte assez cher en mana, car on ne devrait normalement l’utiliser qu’en dernier recours.

J’aurais dû ajouter automatiquement quelques connexions partant de la zone d’eau. Quelque chose comme ça :

C’est beaucoup plus facile de tracer un chemin depuis le trait vertical qui est sous la zone jusqu’au trait diagonal, ou bien depuis le trait horizontal à droite jusqu’au trait diagonal, et ainsi créer une première boucle sans s’arracher les cheveux.

Une « learning curve » moins violente

Il faudrait ajouter des niveaux. Les premiers seraient rendus plus facile par :

  • un tutoriel,
  • des maps plus petites,
  • des délimitation de cases plus marquées,
  • l’absence de traits diagonales.

J’ai eu beaucoup de remarques au sujet des délimitation de cases. Les gens analysent la map, repèrent une case qui leur convient, et s’aperçoivent ensuite que ce n’en est pas une mais que c’est 4 coins de 4 cases différentes. J’avais fait exprès de brouiller les limites entre les cases parce que je trouvais ça cool et j’aime créer des choses difficiles pour ensuite prendre un air condescendant auprès des gens qui n’y arrivent pas. Mais peut-être que j’ai overkillé.

Alors que les grands comédiens gomment les coupures entre vers lorsqu’ils déclament des alexandrins, je gomme les coupures entre cases lorsque je crée des jeux grid-2D.

J’embroche vos rimes, mon épée vous tru-Cid.

Un monde ouvert

Il y aurait une aire de jeu plus grande que ce que peut afficher l’écran. On ne pourrait pas scroller partout. On aurait un personnage et le scroll serait limité autour de lui. On pourrait déplacer ce personnage uniquement vers une case recouverte d’eau. Pour progresser dans le monde, il faudrait donc faire des boucles et propager l’eau petit à petit.

Par contre, ça gâcherait un peu si on permet de faire des boucles géantes, et surtout il y aurait le risque que le temps de calcul de vérifs des boucles soit trop long. Donc il faudrait limiter les tailles de boucle. Ce qui pourrait être sujet à des bonus : au début on ne peut faire que des boucles ayant une longueur de 5, puis 6, puis 7, etc.

Bien entendu, ce grand monde ouvert serait truffé de bonus, de mana, de sorts et de pouvoirs à gagner. Pour récupérer quelque chose, il faudrait amener son personnage dessus, donc l’entourer avec une boucle.

Et puis des passages secrets et des zones super compliquées à atteindre. Par exemple un grand couloir de 3 cases de large avec un super bonus au bout.

Je voulais aussi faire une super blague, avec un genre de quête annexe. Une map où l’objectif serait à côté du point de départ, mais il y aurait un grand mur entre les deux. Il faudrait faire tout un détour pour l’atteindre. À la fin, le personnage aurait dit : « j’ai du créer toutes ces boucles de lierre juste pour parcourir une grande boucle qui me ramène à mon point de départ ! WTF ? ». Haha, lolilol potentiel.

D’autres idées en vrac

L’échange entre une case de boue et une case d’eau ne coûterait pas de mana, mais ne ferait que déplacer les lierres de l’eau sur la case de boue. On perdrait les lierres de boue. Ça nettoie la piscine et ça encourage à étendre l’eau le plus possible, pour conquérir des lierres qu’on pourra ensuite placer gratuitement.

Des statistiques :

  • longueur & surface de la plus grande boucle réalisée,
  • nombre de boucle créées en une seule action,
  • maximum de mana atteint,
  • rentabilité (mana gagné / mana dépensé),
  • nombre de case d’eau créées,
  • etc.

Et bien sûr, des achievements et des bonus liés à ces stats.

Des robots

Quand on fait une boucle, ça ne supprime pas immédiatement la boue. Il faut poser des petits robots nettoyeurs qui enlèvent la boue autour d’eux. Ils fonctionnent pendant un temps limité. Donc si on les pose sur une boucle trop grande, ils ne nettoieront pas tout et la boue se repropagera dans la boucle. Si on les pose sur une boucle plus petite, ils nettoient tout, la boue ne se propage pas car elle ne peut pas traverser les lierres. On peut alors déclencher la propagation de l’eau vers la boucle nettoyée.

C’est une idée qui reste à finaliser. Parce qu’actuellement, l’eau peut passer à travers le lierre. Donc si on commence à nettoyer une boucle avec des robots, l’eau peut alors se propager tout de suite dans une boucle dont le nettoyage n’a pas été terminé, et ça peut donner n’importe quoi.

Ou alors on dit que l’eau ne passe pas le lierre. Et on doit enlever manuellement le lierre qui sépare l’eau de la boucle nettoyée. À réfléchir si on a envie.

Je laisse cette idée là où elle est, j’ai peur d’avoir embrouillé tout le monde en la décrivant.

Robot nettoyant la boue (à moins que ce soit l’inverse)

Post-codem concernant Squarity

Voici maintenant mes retours en tant que simple utilisateur/créateur de cette plate-forme de jeu.

Les messages d’erreur, rogntudjuu !

Comme l’a si bien dit 10kbis en commentaire de mon précédent article, il faut les messages d’erreur et les tracebacks !

Quand le code du jeu plante à l’initialisation, le message s’affiche comme il faut dans la console du navigateur. Mais quand ça plante pendant l’exécution d’une callback, on a que d’alle. On ne sait pas où ça a planté, ni pourquoi. Je n’ai pas encore pris le temps de régler ce problème.

Je pensais être capable de coder du python sans visibilité sur les messages d’erreur. Je m’étais dit : « je suis super fort, et au pire, je pourrais toujours débuguer à coups de print ».

Débuguer à l’aveugle, c’est ce que j’ai fait pendant tout le week-end. C’est la raison pour laquelle je n’ai eu une version pre-pre-alpha que très tard. Ça m’a aussi mis de sérieux doutes sur ma capacité à sortir quelque chose de jouable avant la fin.

J’avais prévu, après le Ludum Dare, de me poser un peu concernant le dev, faire un semblant de road-map, nettoyer et documenter un peu mon code. Mais là, nope. Avant de faire tout ça, il faut que je règle cette non-gestion des erreurs.

Bien. Il me reste 12h pour faire tout le reste et j’ai pas encore mangé.

Ajouter les événements de clics de souris

Je m’étais promis que pendant le Ludum Dare, je m’occuperais uniquement du jeu, sans mettre à jour le site Squarity. Je voulais prouver que la présente version est suffisamment aboutie pour créer un jeu, même très simple, même avec beaucoup de galère.

Puis j’ai réalisé que Loops in Pool serait beaucoup plus pratique si on pouvait directement cliquer sur les cases. Alors j’ai décidé que je ferais une entorse à ma promesse et que je rajouterais à la va-vite la gestion des clics dans Squarity.

Finalement, je n’ai pas du tout eu le temps de faire ça. Je suis donc parvenu à être suffisamment à l’arrache pour tenir ma promesse. Youpi !

Ayez l’amabilité de bien vouloir gérer ce mulot, mon brave.

Ça peut être très lent

Exécuter du python dans un navigateur web, c’est lent. Je m’en doutais un peu, mais je ne pensais pas que ça se révélerait dès maintenant.

Lorsqu’on échange deux tiles, il faut attendre une ou deux secondes avant de pouvoir faire autre chose. C’est le temps pour vérifier si l’échange a créé une boucle ou pas. On exécute pour cela un algo pourri de Dijkstra sur 2240 pauvres petits nodes. Ça devrait se faire instantanément, or ce n’est pas le cas.

C’est pour ça que la boue se remplit progressivement au début. Si je calculais toute la propagation dès le départ, ça prendrait vachement de temps et on pourrait croire que le jeu ne marche pas.

Heureusement, quand on fait des jeux simples nécessitant peu de traitement, il n’y a aucun problème, le jeu du magicien et H2O en sont des preuves. Mais il ne faut pas trop abuser.

Je n’ai pas de solution miracle pour ce problème, juste des pistes :

  • Faire des tests de performances, en déduire des manières de coder plus rapide que d’autres et les documenter dans des bonnes pratiques. Je suppose que le python dans un navigateur se code et s’optimise différemment par rapport au python normal.
  • Essayer de faire des traitements parallèles ou asynchrones. Je ne sais même pas si on peut faire ça proprement dans un navigateur web, que ce soit en javascript ou en python.
  • Mesurer en live les performances du code, pour repérer les parties de code les plus ralentisseuses.
  • Optimiser l’affichage. Au lieu de redessiner toutes les tiles à chaque fois, on en marque certaines comme « dirty ». Seules celles-là seront redessinées. Mais, je ne suis pas sûr que ça améliore grandement la vitesse.

D’autre part, j’ai fait une modif qui me semble cool : j’ai redirigé les print. Normalement, ils vont dans la console du navigateur. Moi je les affiche dans la zone de texte en bas à gauche. Figurez-vous que ça aussi, ça ralentit tout. Faites une dizaine de print à chaque appui de bouton : ça devient horrible, même dans un jeu simple.

Je ne sais pas pourquoi. Est-ce que le navigateur doit recalculer tout le DOM à chaque fois qu’on écrit dans un élément <textarea> ? Ce serait embarrassant. En attendant, l’effet de bord est très amusant : le seul moyen actuel de débuguer est de faire des prints, mais les prints ralentissent tout. Bon courage !!!

Je ne parviendrais peut-être pas à régler ce gros défaut de lenteur, ce qui risque de bloquer des créateurtrices potentieleulleux dans la réalisation de leurs jeux.

Ça ne me fera pas abandonner ce projet, ni déroger de mon idée principale : créer et partager des jeux 2D en python dans un navigateur web. C’est ce que je veux faire, et plus que ça, c’est aussi ce que j’ai envie d’avoir. Je veux utiliser mon propre outil pour créer une foisonnance de jeux bizarres/amusants/pulpesque/dérangeants/moches/etc. Bref, des jeux que je veux voir exister.

Un jeu « pulpe-zinesque » créé par Anna Anthropy, dont je vous parlerai à l’occasion

Autres trucs-en-vrac

Il faut des sons et de la musique. C’est prévu, mais les conseils que j’ai pu récolter à l’occasion du Ludum Dare me confirment que c’est très important pour se démarquer. Si j’avais pas un tas de choses déjà prioritaires, je prioriserai les sons.

Les images des objets ne peuvent pas déborder de leur tile. On peut faire sans, mais pour dessiner un trait qui rejoint deux tiles en diagonale, il faudrait pouvoir placer quelques pixels sur les tiles diago-adjacentes. Ça mériterait un petit dessin pour vous expliquer, mais là, pfouf, cet article est déjà bien assez long.

L’image de tileset devrait pouvoir être uploadée depuis le disque en local, dans le navigateur (en local aussi, du coup). Actuellement, il faut publier l’image sur un site d’hébergement, et ce à chaque changement. Même si on ne souhaite pas publier son jeu. C’est relou. En ce qui me concerne, je met l’image dans un repo github. Mais les push d’images dans github ne sont pas instantanément mis à jour dans leur site web.

Tôt ou tard, il me faudra un lieu d’échange et de création de contenus autour de Squarity (articles, documentation, tilesets, jeux, …). Je me permettrais de commencer par un tout petit truc. Mais il me le faut vraiment ce petit truc, car actuellement j’ai rien du tout, à part des comptes sur des rézosociaux « annexes », comme ce blog. Or, ces comptes n’ont pas pour utilité principale de décrire Squarity. Il va falloir que je me lance dans un mini-CMS Django, et/ou une instance Mastodon, ou autre chose de mieux si vous avez une idée.

Rappelons que l’utilité principale de ce blog est de vous faire découvrir des images de femmes rondes. Ceci ne va pas changer de sitôt. À ce sujet je vous présente llindaa23

À la prochaine, je me remet sur mon code et mes gestion d’erreurs.