mercredi, avril 30, 2014

Streaming to SPRITE_GFX

It's a tiny and modest commit to my source code, but with last Sunday's revision, I open up a new animation approach in my game engine: RAM-to-VRAM streaming.
For instance, I can have Bilou's head (when idle) replaced by some animated ink wavelet without requiring additional room in video memory: at every animation step, the proper data block is blitted to VRAM during the blanking period.

Un modeste pas de plus vers l'encre-qui-monte: je peux réutiliser le même système d'animation à base de copie RAM-vers-VRAM sur les sprites composant les personnages. Je pourrais aussi m'en servir pour synchroniser toutes les animations "à l'arrêt" de Inkjet pour récupérer un peu de place dans la mémoire des sprites. En poussant un peu plus l'intégration, je pourrais faire en sorte qu'AnimEDS puisse utiliser le contenu des pages marquées "anim" et ordonne des copies là où il y avait précédemment un simple déplacement d'une "tête de lecture" dans la mémoire vidéo.

Granted, that's totally useless in that way, but applied to inkjet, it could turn a 12K footprint into 4K, at the cost of having all the inkjets waving synchronously. If integrated to AnimEDS (e.g. automatically opting for a I_STREAM instruction instead of I_SPRNO), it could also significantly extend the range of animations for Bilou and make him use less than 1K for his head ... just like Donkey Kong only used a few slots in VRAM in DKC.

dimanche, avril 27, 2014

Un petit pas de plus

Rien de bien impressionnant à montrer, mais le système d'animation des blocs de l'encre (entre autres) vient d'être revu pour éviter une copie supplémentaire de la "page" de graphisme sur laquelle l'animation se trouve. Pas grand-chose mais c'était un point de passage obligé pour pouvoir faire pareil vers un élémént situé dans la mémoire utilisée par les sprites.

No fancy screenshot yet, but I've got rid of an extra copy of animations in the the block-animation engine. Something I wanted to cleanup long ago but that now becomes mandatory to apply the same kind of animation to sprites ... which will ultimately allow ink moving up and down. Once again, my cybook proved very useful to dig in that dusty part of the game engine.

samedi, avril 19, 2014

La p'tite encre qui monte, qui monte ...

Quelques notes sur l'encre-qui-monte que je numérise avant de passer à l'implémentation. L'idée étant d'utiliser soit un polygone soit la fonction "fenêtre/cadre de vue" pour la partie noire ("Master Ink" dans mes notes") et des sprites pour la partie animée (les "wavelets").
Si je veux avoir quelque-chose à proposer pour la NeoCompo de l'été, il est temps que je m'y remette, n'en déplaise à Gomez et son fez. Donc:
  • [done] permettre au contenu de la mémoire vidéo des sprites de recevoir des étapes d'animations successives à un seul emplacement (par copie à chaque étape) pour une synchronisation parfaite des ondelettes;
  • [done] ajuster CopyCoords pour que MasterInk ne suive la caméra qu'horizontalement et que les wavelets ne suive MasterInk que verticalement.
  • Mettre en place la machine d'état avec ces éléments-là
  • Faut-il une "caste" spécifique pour les vaguelettes (pour réduire le coût des collisions) ? 


vendredi, avril 11, 2014

Critical Link #1 : replay value.

http://zelda.wikia.com/wiki/Turtle_Rock_%28Link%27s_Awakening%29
Z:LBW (Link Between Worlds, 3DS) étant terminé, ma fille a réclamé à nouveau Z:LA (Link's Awakening, GameBoy). L'occasion pour moi de me donner un défi assez inhabituel pour moi et inspiré de mon analyse de la difficulté de Mario World: terminer le jeu en obtenant le moins d'objets possibles (y compris sans la "master sword" et sans le boomerang capable de transformer les anti-fées en zentilles fées). De quoi redonner un peu de saveur aux donjons 7 et 8, et de me rendre compte que l'Aigle déboule de la gauche quand je me tiens à droite de la tour et vice-versa. Après ça, j'aurai probablement fait le tour des expériences de jeu possible. Celà dit, un bon livre, ça se relit avec plaisir au bout de quelques années.

When a game is story-driven, why would you replay it ? As surprising as it could sound, and despite Z:LA (link's Awakening) is the most scripted Zelda episode ever, it's also the video game I re-played the most. Just like I could read again (and again) a good book, knowing the sequence of elements in Z:LA doesn't prevent me to play it again. Partly because text-reading is nicely balanced with the action. Compared to previous episodes, this purely-guided content was a unique introduction: the original Legend of Zelda had most its overworld open from the start and dungeons could be entered in no specific order.

Z:LA, which item you need for which place.
Z:LA, c'est peut-être le premier zelda où l'ordre des donjons est totalement imposé. En fait, pour pouvoir s'approcher d'un donjon, il faut systématiquement au moins avoir obtenu l'objet du donjon suivant, et les interactions avec les PNJs vont régulièrement imposer d'avoir vaincu un boss pour continuer à avancer.

Z:LTTP (link to the past, SNES) sits somewhere in-between: early dungeons in the Light World must be completed in a specific order, but once you grabbed the hookshot, you can swap dungeons labeled "3" and "4", as well as "5" and "6" can be swapped too. So having all the items and (almost) all the dungeons available thanks to the rent-an-item approach in Z:LBW (Link Between Worlds, 3DS) is more of a "back to the roots" of the series than an absurd gameplay deconstruction. It also means Z:LBW is designed to be played several times. Your first pass in Lorule will mostly be a matter of hazard: you'll enter one of the dungeons fairly blindly and possibly find the hidden item it holds. That (defensive) item will affect how you'll experience the next dungeons: better shield, improved sword or stronger mail ? Chances are that on your next pass, you'll try to optimize that and maybe challenge yourself with a harder dungeon with fewer hitpoints for a higher reward (having the mirror shield as your first Lorule item, for instance).

Only first 3 dungeon give you explorer "keys"
Même dans Z:LTTP (link to the past, SNES), où les donjons du monde des ténèbres ont été numérotés de 1 à 7, l'un ou l'autre peut être attaqué avec de l'avance, et parfois même fini dans le désordre. Chose remarquable, deux des derniers donjons sont accessibles malgré le fait qu'il manquera à Link un objet indispensable pour terminer le donjon en question. Z:LBW est en quelque sortes un retour aux sources: une fois le monde des ténèbres atteint, l'ordre pour attaquer la plupart des donjons est laissé au choix du joueur. Si lors du premier passage, le résultat sera forcément aléatoire et peut-être décevant, celà offre en revanche l'opportunité d'une grande variété de jeu, car si tous les objets "aggressifs" peuvent être loués à tout moment, les objets défensifs, eux, sont cachés dans les donjons, et il se pourrait bien que vous sortiez du donjons sans avoir trouvé le bouclier-si-brillant-qu'on-se-voit-dedans ou la cotte-de-maille-qui-m'aille. Il me manquait d'ailleurs deux minerais de mes deux premiers donjons.

And when you'll consider -- just like I've done last week with Z:LA -- that you would try to speed-run the game and see whether you have the skills to face Ganon with no magic bottle and only your regular (unimproved) master sword and your godfather's shield, remember: the game can also be played in "hard" mode once beaten. Any single ennemy will now cost you two hearts on contact. Yup. Two. And you only have three of them to start with. If you get hurt twice in a row, you're already dead. I guess that will make Z:LBW the most replay-able game of the series.

Enfin, et sauf erreur de ma part, c'est une grande première dans un jeu Nintendo depuis Kirby's Dream Land, pour ceux qui se lasseraient de ré-explorer [lo|hi]rule où que la chasse aux coquillage-surprise avec des 'p'tits gorneaux' dedans laisserait froid, il reste une arme ultime: le mode difficile. Même ennemis, même disposition et tout, mais le moindre contact avec un des monstres qui peuplent la map dès le début du jeu vous coutera désormais deux coeurs. Comme votre barre de vie n'en offre que trois, celà signifie qu'encaisser deux coups successifs se traduira par un game over. Et reprendre un petit coeur ne suffira pas pour vous sauver la mise. En fait, en mode difficile, jusqu'au 2eme donjon, soit on a tous ses coeurs, soit on est à un pas de la tombe.

Read further in "Critical Link": Sword & Overworld ; The Wallmaster

samedi, avril 05, 2014

Collision avec le monde

Au milieu de ma série de scans sur le thème "Critical Link", je retombe sur un diagramme UML représentant la séquence d'action qui découle d'une collision entre un personnage et un bloc spécial. Comme il va prochainement me falloir gérer des collisions entre crayons fixes et taille-crayon, je blog en stock ...

This is how collision between a Game OBject and the tiled world occurs in my current Game Engine for DS library.  Scribbled note next to the dotted line says "collide(c)" and comments "current code enforces
  • block disappears only if extra & 0x80 is set
  • block reacts only with HERO when extra & 0x40 is set.
where "extra" is the  8-bit reconstruction of the free bits in each special tile
.

mercredi, avril 02, 2014

Ça suffit, les crash!

Rhaa! encore une chouette petite animation perdue à cause d'un bug que j'ai tardé à corriger dans AnimEDS! Ça doit bien être la dixième du genre, où je me dis "décidément, c'est bien confortable et rigolo, comme manière d'animer mes personnages" et 30 secondes plus tard, j'ai un gros écran rouge qui bloque tout parce que j'ai mis un pied dans un "comportement non-défini" de la bibliothèque standard.

En plus, comme je suis actuellement franchement patraque, il m'aura fallu pas loin de trois commit pour y parvenir. Donc je vais remettre mon fauteuil en position relax, et on reprendra les animations ce soir.

I hope with today's fix, I won't get such guru-meditation screens for having clicked within the first 8 pixels of the timeline. It's getting on my nerves to lose the most adorable animations I'm working on again and again. (Sorry for such a short english version. Sickness.)