Sunday, November 22, 2015

La progression

Peu de chance que je clôture School Rush avant fin 2015. Mais par rapport à ma todo list de janvier, je pense que j'ai plutôt bien avancé. Il reste encore beaucoup à faire, mais le point sur les power-ups touche presque à sa fin. C'est surtout sur le feedback au joueur, et la gestion de l'écran tactile que ça va se jouer, maintenant.

Compared to the state at the start of year 2015, the core game is ready. What still lack is feedback, a bit more of polish on the gameplay and level design ... and integration of the hand-drawn art to bring flesh to the bones with a storyline, an ending and those kind of little things that draws the line between a game and a demo. That's not gonna be packed within a month or two, I'm afraid.

Oh, btw, I wish so much phabricator we use at work could render tasks dependencies on such a graph.


Plus pratiquement, avec la migration d'OS sur mon laptop combinée à la migration de SVN à mercurial, je me retrouve avec 3 ou 4 emplacements sur lesquels les développements se sont étalés. J'ai commencé à rassembler tout ça vers une seule tête. Ça commence à reprendre forme. Heureusement que j'ai eu un bon entrainement sous la houlette de "Hergé et Jigé" (pas les dessinateurs, bien sûr).
With a recent home directory switch and a migration to mercurial, my first task is to bring all those experiments into the tip of the source tree. It wasn't trivial but I think I'm almost done now.

Monday, November 09, 2015

Quelle récompense pour le joueur ?

Dans la série "déterrage de vieux topic", je tombe sur la question de Nawak: comment récompenser le joueur?. , une question qui rejoint la quête du bon power-up et la compréhension des bonus.

Il est facile de donner au joueur des pouvoir supplémentaires. Dans la plupart des jeux que je connais qui utilisent des pouvoirs modulables en intensité ont tendance à les utiliser pour titiller le joueur, comme récompense pour un effort donné, en quelque sortes. Ou du moins, on aimerait le considérer comme tel.

Last week, when I was reading "now try a more difficult quest" on SMB1 end screen, with Mario being kissed by the lady, I thought they meant something metaphorical. Like 'get a life, find your own princess, please her and receive her kiss. Good luck'. A friend's wife completely surprised me talking about a "second quest" in SMB1 where all goombas were turned into fire-proof buzzy beetles. Could I have missed that for that long ?

There was an argument about giving rewards to the players, and whether the power player could feel bored of receiving an additional fire power when she never lose it because she rules at the game. It sounds artificial to say 'well, if she wants a challenge up to her skills, why don't she ignore the fire flower altogether ?'. Switching goombas to buzzy beetles essentially produces the same sort of effect: you still get the power-up, but its use is reduced.


Here be Goombas.
Pourtant, si je prends SMB1 ou SMW, le bon joueur est récompensé par ... un jeu plus dur. Voire (dans le cas de SMB1) une variante du jeu où un des power-ups les plus puissants devient inefficaces sur les ennemis les plus communs, les goombas étant mués en tortues ignifugées (merci à l'épouse de JB pour le tuyau ^^"). Et si on y réfléchit bien, ils sont légions les jeux 8-bit et 16-bits où les niveaux "bonus" étaient bien plus durs que les niveaux "normaux". On se voit par contre assez mal placer dans un recoin du niveau un switch qui fait tomber des ennemis pour "récompenser le bon joueur avec un challenge plus à sa hauteur".

Double-checking the level layout of SMB1 levels, however, make me doubt about the whole idea that "power-up are a reward to the dare player". Coins do have this effect. But power ups ? When there is some risk in going for the power-up, it is in the sense that you may encounter ennemies crawling on the ground, and could have gone over the collection of blocks safely otherwise. Compared to Commander Keen's "dare-to-catch-bonuses", this is almost a joke. I don't see it much more "risk/reward" in world 5. Simply that the amount of P-UP to find is strongly reduced.



C'est vrai qu'augmenter la puissance de l'avatar ne marche qu'un temps ... avec le joueur qui n'a pas le niveau requis pour battre le jeu, en fait. Quelqu'un qui termine SMB1 en une vie en petit Mario n'a que faire des fleurs de feu, des pièces d'or ou des 1-UP. Est-ce à dire qu'il ne jouera plus au jeu ? Pas forcément.

De même que le fait de bien maîtriser un morceau de musique sur un instrument ne veut pas dire que vous ne le jouerez plus. C'est plus ou moins la raison d'être du speedrun.

Pour donner envie au joueur -- même aguerri -- de prendre un risque pour atteindre un power-up, on peut faire en sorte que les power-ups soient d'office limités dans le temps, celà dit, au même titre que la super-étoile. SMB3 va un cran plus loin dans cette idée avec les étoiles que l'on peut enchaîner sur toute la durée du niveau à condition d'avancer suffisamment vite.

J'avais déjà noté que donner plus de contrôle au moment où le power-up est utilisé. Ce petit détail qui fait que l'objet le plus recherché dans l'univers de Zelda est peut-être bien ... un flacon de verre. Eh oui, le Félix Félicis serait de bien faible utilité si on avait pas le choix du moment où on le boit...

La réflexion n'est pas achevée, donc en guise de conclusion, je dirais "le joueur est là pour s'amuser. Si tu veux le récompenser, donne-lui du fun". Ce n'est pas tant les 10 pièces d'or d'une cachette qui rend les tuyaux secrets intéressants dans SMB1: c'est le fait de pouvoir les chercher. Si on veut récompenser un joueur pour avoir trouvé le passage-secret-dans-le-passage-secret, le mieux sera de faire en sorte qu'il ait l'impression que l'endroit qu'il vient de dénicher est spécial. Pas forcément parce qu'il contient une vie, mais par son look-même. Je pense à la pyramide interdite de Keen. Et pour les nouveaux Mario, c'est aux pièces étoiles et aux pièces rouges qu'est attribuées la mission de récompenser le joueur audacieux, certainement pas aux power-ups.

Friday, November 06, 2015

... interlude ...

Bon, j'avoue ça n'avance pas très vite ces derniers temps. Une petite modif' par-ci par-là pour les animations de l'encre qui tombe. C'est à peu près tout. C'est que je me suis senti interpelé par les citations de Level Up du genre

« Le temps et le travail qu'un RPG demande explique pourquoi la plupart des jeux amateurs ou indépendants sont des jeux principalement d'action, de plate-forme, de réflexion, bien plus faciles à gérer. » - Zim
ou
« Ce jeune a compris en quelques jours ce que certains mettront des années à accepter : il est quasiment impossible de créer en amateur un bon rpg. »  - Gaetz


Du coup, j'ai eu envie de comprendre: qu'est-ce qui fait qu'un RPG est un RPG et qu'on y joue (ou pas) comme à un RPG? Qu'elle est la quintessence d'un RPG ?

Je n'ai pas la réponse ultime, mais j'ai au moins compris quelque-chose qui me semble fondamental: c'est le temps perdu pour son avatar qui le rend si important au yeux du joueur.
Dans un Zelda/metroïd/mario, on sera attaché à l'emplacement jusqu'où on est allé, mais on ne se retrouvera probablement pas dans la situation de se dire "wow. J'avais jamais eu d'aussi bonnes armes dans ce jeu" si on l'a déjà fini.

Par son côté aléatoire et le fait que les caractéristiques du héro découlent des choix du joueur, le RPG peut rendre le héro unique et précieux au yeux du joueur. Enfin je crois.

Every new visit on the 'Level Up' forums greets me with a quote. And the one about "RPG requires so much time and work. This is why most amateur or indie games are mostly action, platforming or puzzles, which are much easier to manage" pushed me into introspection mode. In many short-development projects, being succesful implies capturing the _essence_ of the corresponding gameplay, and focusing on what's part of this essence. But what is the essence of RPGs ? My deepest thought so far is St-Exupery-like: 'the time you lost for your avatar is what makes your avatar so precious to your heart'. That makes it apart from zedla/metroid/mario games where the _place we reached_ is what we value, not the state of the ever-dying-and-respawning avatar.

edit: just stumbled upon ihobo's blog post of 2015 who seem to be talking of the same issue. 

@Anokolisa's project
edit++: Anokolisa might have just captured it by shrinking navigation and scenery to a connected network of locations where things occur, and giving just a little of lookahead/look-aside to allow for planning.

That will still require plenty of art to be drawn for the various encounters and collectibles, of course.

Saturday, October 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.

Sunday, October 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.

Saturday, October 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

Saturday, October 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.