samedi, octobre 31, 2015

Undefined behaviour ...

Adding a few sound samples for Bilou's jumps shouldn't have led the game to crash. Really. It shouldn't have. And yet, it had. And with a flavour of deja-vu ...

I was using the back() of a std::vector while there was nothing pushed yet. And this is undefined behaviour. My C++ skills still need training. It coud explain my un-ability to produce .nds files working on real hardware when building them out of the good-old-directory.


Oh, le vilain bug que nous avons là. Un pointeur négatif ? Alors qu'il devrait provenir d'un vecteur de régions allouées précédemment ?_? Le vrai hardware de la DS n'aime pas du tout ça, bien sûr. Ce désassemblage a un air de déjà-vu, et pourtant, je suis surpris de ne pas avoir trouvé la raison du problème jusqu'ici, tant c'était évident. Enfin, une fois qu'on a pris le temps d'aller lire la doc de vector::back() et qu'on a souligné trois fois en rouge "comportement indéterminé" dans sa tête.

En clair, "comportement indéterminé" signifie que le résultat va dépendre d'autre chose que juste le code que vous avez écrit. Il peut s'agir de l'emplacement précis où le code se trouve, de ce que fopen a mangé ce matin, de l'âge du cache-pitaine ... n'importe quoi. Et donc on peut très bien avoir un nouveau sample dans les effets sonores qui tout à coup fait crasher le jeu.

Vous me pardonnerez le côté auto-flagellation de ce post: j'ai besoin de pouvoir me le rappeler à mon moi-du-futur.

dimanche, octobre 25, 2015

segfault.

J'ai tenté une des deux approches me permettant d'avoir une animation d'attente pendant le chargement des niveaux. Et c'est un échec. L'émulateur se plante sur une instruction non-définie en cours de chargement du niveau 1. Le débuggeur fait crasher complètement l'émulateur avant même d'avoir atteint cette instruction.

Failed attempt to have some background task running while level loading is in progress. Something simple like moving some sprite on the bottom screen, playing samples to count the score, etc. But it changes quite a lot the execution context for the loading, and as of writing, it makes the emulator crash when loading level 1 and the debugger makes it crash even earlier. That's a job for some automated testing and I have plans to bring such techniques to my DS development since I had the opportunity to see it in action at work.

Je pense que ce serait un cas de figure à étudier avec l'approche de tests automatique inspirée de mes travaux au boulot, avec une couche d'abstraction du matériel pour que le test se passe en natif sur le PC. Mais c'est un peu gros à mettre en place: je préfèrerais que ce genre de développement ne mette pas en attente le jeu "school rush". Il me reste une deuxième piste à explorer succeptible de tout simplement raccourcir les temps de chargement: permettre de réinitialiser la map et la position des ennemis sans ré-interpréter l'entièreté des machines d'état.

Yet, I have another approach I could follow, which would make the whole loading process faster. I think I will try this first, and fall back to the auto-testing system if that doesn't work either.

PS: bonne nouvelle pour les lecteurs francophones: le message sur les bonus a été traduit.

samedi, octobre 24, 2015

Pourquoi des bonus ?

They are good-looking, they balance the colours of the level while giving the golds some good reason to attract player's eyes. They are the bonuses. They make friendly sound when you collect them, but as of writing, that's pretty much it. In the previous "anniversary level" game, bonuses had a puprose: they measured how well the player explored the game and rewarded her with a deving history treasure.

There are too many of them in School Rush to keep that "completion gameplay" idea. The game is too large, too. The "completion goal" was inspired by Prehistorik 2 one-level demo and how having hidden bonuses and a completion percentage at the end of the level kept us playing the same 5-minute level for days and days.


Ils sont bien brillants, d'un joli jaune qui attire l'oeil et complète le spectre des couleurs du jeu School Rush, et sont plutôt plaisants à ramasser. Il s'agit bien sûr des lettres-bonus. Pourtant, à l'heure actuelle, ça s'arrête plus ou moins là. Si dans le niveau anniversaire ils permettaient au joueur de découvrir une image plus ou moins vieille selon le niveau d'exploration et d'exécution atteint (un rôle inspiré de la démo de Prehistorik 2), je ne sais plus rien mettre de tel ici: les bonus et les vies sont trop nombreux(es) pour que ça puisse avoir un sens. Le jeu est trop long, aussi. Alors bien sûr, le jeu étant exempt de 1-UP secret, je peux proposer le classique "100 lettres contre une vie", mais j'ai envie d'aller un peu plus loin que ça quand-même. 

With only 3 lives at the start of the game and no 1-UP hidden, they could receive the obvious purpose of granting one-ups if you collect enough of them, but I wanted to offer a little bit more than this. Chatting a bit with my brother -- who suggested that they could slow down ink rise, and possibly even inverse its flow -- lead me to thinking that they would indeed turn 'cool' if they allow to counter something that the player could think "unfair" from the game.

And at the time, the most unfair thing I can think of is the fact that falling in the ink make you lose all the power-ups you had collected, so because the coins are preserved from level to levels and even through failure (Kirby Kid call that suspension), they can be used in a sort of shop where the player can re-fill her stock of power-ups.

When can we enter that "shop" ? When can the player use what she "purchased". This will have an important result on how valuable the 'shop' feature (and thus, the letters themselves) are to the player.

Mon frère m'avait suggérer de ralentir l'encre en fonction du nombre de bonus récupéré. Je n'ai accroché qu'à moitié, mais il y a là-dedans un point essentiel: faire en sorte que les bonus donne au joueur la sensation que le jeu est moins injuste quand il en ramasse que quand il les ignore. Et quoi de plus injuste dans le "School Rush" actuel que de perdre tous les power-ups durement  gagnés parce qu'on est tombé dans l'encre. Le nombre de lettres ramassées, lui, est préservé à travers les niveaux et les échecs, au même titre que les pièces d'or de Super Mario. Pourquoi donc ne pas en faire une monnaie d'échange pour que le joueur puisse récupérer certains power-ups entre deux essais ? Reste à déterminer quand et comment.

  • I want something that allows me to definitely remove the "auto-granted power-ups" from the title screen, as they proved perplexing for the players.
  • I opt for some inter-mission shop. Trading level-collected bonuses against level-useful power-ups takes place between play sessions, as a way for the player to take a break.
  • I opt for something that is not automatic: the player can chose not to receive a 1-UP and save her letters for more power-ups for the later levels as she thinks it would be a better strategy.
  • I opt for something where the player doesn't need to _beat_ the level to enter the shop. It's there between play sessions, not between levels. I feel it essential so that the player gets the indemnity feeling after a mistake.

Je sais que je veux permettre au joueur de choisir sa stratégie. Pas de vie supplémentaire automatique: on doit pouvoir garder ses 100 lettres pour s'offrir plus de power-up dans le dernier niveau si c'est de ça dont on a besoin pour finir le jeu. Je veux aussi que l'on ne fasse l'échange qu'en dehors des niveaux, mais qu'il soit possible de "racheter" des power-up même quand on a raté le niveau, pas uniquement quand on en change.

L'habillage de ce "magasin à power-up" est venu par après. J'ai bien ri en moi-même comme j'imaginais Bilou pendu à un marque-ta-page, nourrissant le livre de lettres pour atteindre l'élément convoité. Il ne restait plus qu'à trouver une disposition livre/marque-ta-page/bonus/Bilou qui soit telle que le joueur comprenne immédiatement qu'il ne peut y avoir qu'un seul achat par choix.

Voilà pour l'idée. Maintenant je dois coder tout ça.

I started considering what the 'shop' should look like in a big laugh, as I visualized in a flash Bilou hanging at a bookmark, feeding the book with collected letters to make the bookmark move and reach the selected item. While peeling vegetables, if you ask. If you're serious about game design, make sure you have vegetables to peel. A lot of them.

This had to be refined. For the player to accept this idea, it must be obvious that only "paying back" the book is the only way to reach the bonus. It must be obvious that there's a choice to do, and that no smart movement should allow to grab several items at once it physically impossible, not an arbitrary restriction. Having the bookmark dragging Bilou upwards, for instance, doesn't work well, because Bilou has the Jump Power and reaching items hidden high is something he's got many options to do.

Now I have to address the technical aspect of it:

  • [todo] the action must take place while the next level is being re-loaded. 
  • [todo] Animation is involved
  • [todo] player clicks what she wants
  • [wish] letters flowing to the book are the ones you collected in the level

samedi, octobre 17, 2015

Palettes fix

With this fix to GameScript's graphic chip initialization, SchoolZone's colours are back to normal despite the new ink pipes tiles that use the same colour numbers as the browns used for "owl background". I thought at first that I was using a too small memory bank for extended palettes, but no. VRAM_E_LCD is 64K and only 32K are used when mapping as VRAM_E_EXT_PALETTES. But I wrongly set "BG_WRAP" while tile planes are always wrapping (unlike bitmap planes), and for the plane used for the owl background, it forces sharing of the palettes of the playground plane.

Voilà. Une vieille erreur dans l'initialisation des plans de décor de corrigée, et mes couleurs sont enfin comme elles le doivent sans "couleur interdite" pour l'avant plan. Je vais pouvoir passer à la programmation des bouchons et des vaguelettes.

Et au passage, je retombe sur un outil en ligne de planification pour la mémoire vidéo de la NintendoDS assez pratique. Voir dans les commentaires pour ce qui me semble le plus intéressant pour la suite du programme.

samedi, octobre 10, 2015

School Rush Story

Bon, mon jeu n'a pas la reconnaissance de Rick Dangerous, mais il y a une ressemblance amusante avec les croquis de Simon Phipps.

The idea of "turning off the ink" starts to get real. With some details on the level design, I hope to be able to explain "why is there so many ink here", and "what happened to turn something normal into something dangerous. Time for some more Pixel art ...

edit: Got fair art drawn, but unfortunately, I'm using the few 16 colors (same as the inkjets), which happen to be trashed by the background art in the current code. There is no good reason for this to happen, given that we have now extended palettes (16*256 colors for every individual plane). I'll have some code-digging and potenially refactory time ahead.

Edit: ok. Cork switch closes the level. It doesn't let you see ink draining away from the pipe, though.

mardi, octobre 06, 2015

pixel art waterfall

I will need something that shows where all that ink comes from, and build a story about getting the School Zone a dry place again. It is not so easy to come with pixel art liquid flow, but I know from a while that iSohei did a great job drawing some. In my case, the narrow and straight flow is possibly the best choice.

The flow is rendered here by a highlight area in curvy and noisy v-shape that twists left to right as it moves down. The picture here shows the individual frames of the animation when vertical movement is canceled.

I could have that with a sprite shot from the top of the waterfall over some otherwise static ink area. I could shoot _two_ of them simultaneously, but that moves down at slightly different speed so that you get the illusion of a wave that widens as it falls down, too.
well ... now it's analyzed. Let's make it so.


Bon, j'ai fait une première tentative désastreuse pour animer une chute d'encre (indispensable pour le dernier niveau de School Rush). Puis une deuxième encore pire... alors je retourne chercher une référence de "Pixel art waterfall" pour voir ce que je peux faire. Le mieux, ce serait sans doute d'appliquer la même technique que iSohei pour sa troisième cascade: un sprite en forme de v qui se tortille en descendant. L'avantage c'est que je pourrai alors utiliser un vrai sprite et avoir une animation d'autant plus fluide.

Edit: coding attempt: having the falling wavelet 'rewind' to the top of the fall/pipe when reaching the ink is nice, but is not sufficient because 'the ink' is actually there only when the 'inkfall' is on-screen. Remember ? ink waves GOBs follow the camera.

samedi, octobre 03, 2015

Confirmation pour Double-B(ig-punch)

Petite soirée chez les parents de JB, console en poche. J'y retrouve N, A et L de la S-team, mon équipe de beta-testeurs attitrés. La nouvelle technique de "planer en gardant le bouton enfoncé" est adoptée par tous. Les nouvelles trajectoires pour le lancer n'ont perturbé personne et ont permis aux nouveaux-venus de récupérer pas mal de power-ups alors que jusque là, les P-UPs laissaient plutôt les joueurs indifférents.

Presque tous les plus jeunes, à l'instar de Zim, essaient de continuer à ramasser des taille-crayons même après avoir gagné "Big Punch". Ils se placent juste sur le blador et appuient sur B encore et encore, ajustant leur position. Mais sans se rendre compte que Bilou ne ramasse plus rien dans ce cas-là. Inévitablement, les pieds du blador se rapprochent, il se réveille et blesse Bilou, souvent plusieurs fois d'affilée le temps que le joueur comprenne ce qui lui arrive.

Je peux soit faire en sorte que un coup de poing nécessite un double-B ou veiller à ce que donner un coup de poing dans un blador assomé le ramasse ... mais il faut que je fasse quelque-chose.

S'accrocher aux éponges est passé pas trop mal chez le nouveau joueur après que je lui ait dit que

  • oui, on peut grimper dessus
  • tu tiendrais mieux dessus si tu t'accroches
  • j'ai dis "tenir dessus". Là, tu essaies de l'attraper par en bas. 
Il y a un petit coin du niveau 1 ou j'ai placé quelques lettres qui mênent du balancer d'une éponge à une plate-forme en hauteur, c'est un bon moyen pour aider un joueur inexpérimenté à réussir cette action pourtant fort délicate.

This week-end featured some social beta-testing session with kids between 7 and 15, including the S-team. Compared to earlier release of the game, the power-ups were much more used and seeked by the players. The "straight-throw" mechanism was set as default throw and it pleased the players. Only the eldest player asked me how the former "ballistic-throw" could be achieved and used it in a few place when short distance was preferred.

I take note that young players will tend to stick on "pick up bladors" even though they gathered a BigPunch power-up. With the current mechanics, however, they will stun the blador again and again with no effect, wondering why they can't pick up that blador now, getting closer, and completely missing the facts that blador's feet are getting dangerously near. When the blador finally wakes up, odds are high that Bilou will be recovering a BigPunch blow and that he'll get hit by the blador's move, no matter how fast they spam the B button. I think this stems for BigPunch invoked by a Double-B mechanic while single-B remains "pick up" through the whole game.

The alternative would be to ensure that punching a stunned blador means you pick it up. It sounds both more perplexing (you lose the mechanic's individuality, which is an important factor of cleanness)