samedi, avril 28, 2012

SUB or not SUB ?

When I started working on SEDS, most widget was supposed to be on a very specific screen. I now have 4 tools that share the same "GUI engine" and widget library (libgeds), and some will sometimes be on the "main" screen on the DS and sometimes on the "sub" screen. Which screen is rendered where (top/bottom) can be easily swapped by the hardware, but the video memory dedicated to one of the screen cannot. When you put colours in BG_PALETTE_SUB, only one screen can use them.

Rhaa! Je sais que j'avais trouvé un truc pour que les widgets à l'écran puissent choisir d'eux-même s'ils étaient sur l'écran principal ou l'écran secondaire, mais impossible de me souvenir d'où j'avais fait ça ... Je sors mon casque de mineur des vivres pour 3 jours ... si je ne suis pas revenu du SVN à la fin de la semaine, appelez les secours

"vr" is your vram location computed by Window, btw
Là! Ça y est! le petit curseur de SEDS dont j'avais eu besoin dans LEDS pour la sélection du tile courant et dans AnimEDS pour enregistrer une animation. Ouf.

I finally found a trick to let the widget automatically allocate the proper resources (sprites, tiles, colours) depending on which window hosts it, by delaying the allocation to "widget placement" time... well, the trick is roughly one year old, now. No wonder why I had a hard time to remember on which widget I prototyped it :P

Sinon, comment vous trouvez le premier jet du décor de fond pour la bibliothèque ?
Oh, yeah, and that's a first draft of the new intended background for the library in the school zone. Do you like it ?

jeudi, avril 26, 2012

A la défense du Gameplay

The following is a translation and summary of 3 posts by Kirby Kid on Critical-Gaming blog, so that French-only readers can follow when I'll make reference to it in my own game design analysis.

De nos jours, les joueurs préfèrent les autres éléments (graphismes, histoire, interactivité) au gameplay d'un jeu. Le Gameplay est défini par KK sur base du fait qu'un jeu a des règles, et qu'il peut être gagné ou perdu. Le gameplay, c'est la partie de l'interactivité qui permet d'avoir un effet direct sur l'issue du jeu. L'interactivité est généralement plus large que le gameplay: elle englobe les menus, etc. Si on souhaite que le jeu soit riche, qu'il puisse communiquer des idées relativement complexes, alors le gameplay lui-même est nécessairement complexe.

L'idée centrale de l'article de KK, c'est que la complexité du gameplay doit être intégrée par le joueur au cours d'une phase d'apprentissage, phase qui est généralement longue, demande des efforts et de la concentration de la part du joueur. Le reste de l'environnement du jeu peut nous mettre dans un état émotionnel qui facilite l'apprentissage, mais il reste toujours là. (NB: d'une certaine manière, le retro-gaming permet de court-circuiter cet apprentissage lorsque l'on rejoue à un jeu dont on a déjà appris les éléments fondateurs, ou qui se concentre sur des aptitudes maîtrisées depuis longtemps)

Les "phases tutorielles" présentes dans de nombreux jeux sont l'équivalent des exercices de gammes/arpège auquel devra se plier un joueur d'instrument avant d'avoir la technique nécessaire pour aborder les "grands morceaux dont il rève". Il n'est pas possible de "comprimer" la complexité: ce sont nos attentes vis-à-vis de nos capacités qui doivent être comprimées (ouais, bin je vais déjà essayer de terminer le jeu, on verra plus tard pour ce qui est de trouver tous les bonus en une seule vie). Un autre élément ? Eh bien, les gens n'aiment pas perdre, ni accepter que perdre est de leur faute. Celà rend le jeu stressant, l'apprentissage pénible au risque de lasser le joueur avant qu'il ne soit en mesure d'apprécier le jeu. Pour vraiment apprécier le gameplay, le joueur doit accepter que l'apprentissage est crucial et fait partie du jeu. Les erreurs, les échecs sont naturels.

Mais visiblement, ça ne suffit plus. Pour la plupart des joueurs, l'apprentissage du gameplay n'est plus suffisamment amusant et perd de sa valeur intrinsèque. Il s'efface au profit des graphismes dont l'animation ne dépend plus que modérément des actions du joueur, de la musique, etc. Soit que les joueurs du début ont vieilli, soit qu'ils ne représentent plus qu'une faible frange parmi ceux qui ont moins d'expérience, de patience et de temps. D'où un grand nombre de "jeux d'action" qui se consomment plus comme un James Bond que comme un Mega Man.

La difficulté minimale du jeu (le "skill floor") est nettement plus bas qu'il ne l'était dans les années nonantes: revu sur DSi, Rayman 1 peut aller jusqu'à 12 points de vie (contre 5), propose des points de sauvegarde plus fréquents et d'avantage de bonus remplissant la barre de vie -- certains apparaissant même pendant les combats contre les boss. Pour que le joueur qui a déjà un niveau suffisant y trouve son compte, on saupoudre "d'achievements", supposés démontrer que le joueur a un niveau supérieur à la moyenne ... parfois en allant carrément piocher dans la psychologie de l'addiction pour le forcer à continuer à jouer. -- cet article est essentiellement un condensé de 3 articles écrits par Kirby Kid pour le Critical-Gaming Network.

mercredi, avril 25, 2012

Blador stepping

Well, I've got dumblador stepping properly, but I still have a couple of things to fix before it can actually "walk" on the floor of the school zone. My next target will be to ensure it *is* on the floor, and not "hovering" as it currently is. That requires:
  • [MEDS] defining the desired "floor position" in the animation (and thus the size of the bounding box) - done;
  • [MEDS] possibly also define the (0,0) position of the gob, against which other elements are positioned - done;
  • [GEDS] make sure the game engine can accomodate with that parameter (it worked only with 16x16 and 32x32 so far, iirc)
  • [LEDS] allow auto-alignment of the GOB so that feet can be aligned on the ground.
Bien, j'ai mon dumblador qui apparaît dans la school zone avec son animation complète (et plus un demi-pas). Maintenant, reste à faire en sorte qu'il soit sur le sol ... puis qu'il marche sur le sol. Après avoir fait un petit tour dans le code, c'est essentiellement au niveau des "cando()" qu'on se sert des paramètres hbox, vbox. La zone de collision principale commence donc d'office en (0,0), et il faudra ajuster les coordonnées relatives des "membres" du sprites par rapport à cette zone, et non l'inverse. Du travail pour AnimEDS, tout ça ...

dimanche, avril 22, 2012

Catching the eye

A few month ago, I was questioning the use of plain-dark tiles in game art. Facet pointed out four different ways to "catch the eye" of the player towards the region of the screen where things are "interesting" (and where they should focus to ensure the game is played well. Essentially, I retained level detail, contrast and chroma (color temperature)...

Faut-il nécessairement qu'un jeu ait de grosses zones noires et que seuls les bords soient détaillés ? ça devient trop fréquent à mon goût... A en discuter sur WoTP, Facet met en évidence d'autres façons de guider le regard du joueur: le contraste, le niveau de détail et la "température" des couleurs.

Hmm ... dans la même série, ne pas oublier de relire Sexy Tiles: Sidescrollers by Adam Saltsman

vendredi, avril 06, 2012

Small Little Things

I've been running through a couple of fixes in the Level Editor before I could open .cmd files again ... I also injected the wizardry for guru meditation that I have for runme, which was actually easier than I remembered as there is a C++ standard way to override the "terminator" function for top-level exceptions: std::set_terminate(). (done)

At last, the monsters created with AnimEDS no longer crash the tool, and they do show up ... somehow ... It looks unfortunately like I wrote the wrong tiles in the 'TINY' sections of the .spr file >_<.


Petit retour sur le code: si le moteur de jeu peut maintenant utiliser des animations composées créées avec AnimEDS, en revanche, essayer d'ouvrir un tel niveau pour en éditer la map ou les monstres faisait tout planter. J'ai donc d'abord modifié AnimEDS lui-même pour qu'il sauve des "miniatures affichables" des animations en plus des instructions d'animations (les blocs 'TINY', un héritage des fichiers .LBM de Deluxe Paint ^_^).

Puis il a fallu s'attaquer à LEDS lui-même, pour me rendre compte qu'il plantait maintenant sur tous les niveaux, et d'une bien curieuse manière ... quelque-chose entre le Null Pointer Exception et le buffer overflow. Tout ça parce que j'avais surestimé le niveau de "tests run-time" que C++ effectue lorsqu'on utilise vector[i] >_<

Bref, tout ça est maintenant arrangé, mais l'affichage de dumblador est pour le moins corrupté ... un peu comme si j'avais capturé le contenu de la "limbs table" plutôt que les miniatures d'animations (fix). Mais je devrai regarder ça plus tard: il est temps de me remettre au travail sur ma présentation ou elle ne sera jamais prête pour la conf' à Maui ...

oh, yeah ... and dumblador's animation finally works fine in the game engine. Now, the road ahead:

  • [done] L+Y to clone a frame at the end of the animation in AnimEDS -> full walk
  • [wish(?)] move whole frame / animation around
  • [done] define gob movements in AnimEDS
  • [done] define gob collision boxes in AnimEDS
  • [wish] limb-aligned collision boxes in game engine.
  • [wish] larger TINY images (non-scaled) for small-work-area gobs.
  • [bugfix] make the "zoomed frame editor" work
  • [bugfix] still bugs in the timeline ?

and then more:

  • [done] support iGobController-driven walk
  • [done] also duplicate monsters set-up expression when duplicating GOBs in LEDS;
  • [done] make sure loading an animation in AnimEDS preserves the movement hints;
  • [done] support for full-movement animation (i.e. move on all frame, including the loop).
  • [wish] think about managing the bbox on a large set of animations for a single character;
  • [wish] allow GameScript to ignore '../' headers in .cmd files so that efs-based and fat-based readers can both use the same input script, without requiring conversions.

mercredi, avril 04, 2012

Bravo, Kyle

Bravo, kyle! Ça faisait un moment qu'un jeu ne m'avais pas autant fait de l'oeil ... et ça alors que je viens de découvrir "Squids" ce week-end. Un personnage adorable, une bande son sans reproche et des mécanismes de jeux bien trouvé, Offspring Fling a tout pour plaire ... sauf peut-être un prix un rien élevé (6€ au taux de change actuel) pour un niveau de difficulté présenté comme tenant plus de la promenade de santé et des graphismes qui restent sommaires. Voyons si je parviens à passer le week-end chez mes beaux-parents sans craquer :)

Si j'avais pu mélanger calimero et logic labyrinth, c'est vers qqch comme ça que j'aurais aimé arriver ...

(PS: bande son par le compositeur d'Aquaria: Alec Holowka)

lundi, avril 02, 2012

Ravioli code

RavioliOpen a new terminal, move the ravioli into a heater directory, ./configure --enable-provence-herb and make cook.

To install the tasty-theme, you'll need to interrupt the cooking process and pour crème-fraiche.txt as tolerated by your user quota. Then just resume cooking.

You might prefer to make install in /opt/bowl, as /usr/bin/plates tend to be harder to hold while coding/debugging/cursing on your program.

So now that /dev/stomach is no longer sending seek errors, you can focus e.g. on adding support for compoundGobs in the Level Editor, since it looks like generating 'TINY' thumbnails in AnimEDS worked fine. Beware the potential fork bombs when running the foodware, though.

dimanche, avril 01, 2012

Down in the Ocean ...

My brother asked me some sketches for re-painting the fish-themed bedroom of char*ly. He wanted it with a Bilou-drift so that our favourite hero could be seen swimming along on the walls. I already had some funny characters that could have been injected, but for Bilou, I wanted it to be something more than "an ocean zone, that is underwater" ... fish that can depart from the ordinary fishes, because that's what Donkey Kong Country has already done. And he wanted something more child-friendly, that doesn't trigger any nightmares.

Since my brother is much into music, I somehow came up with the idea of transforming musical instruments into underseas inhabitants ... the french name "Piano à queue" for the Grand Piano may have helped ... or maybe that's just the harp-shape of hippocamps. Anyway, I've got my design and I like it.


And only when I'm done, he comes back with the office's iPad and show me the brilliant, indie-developed Squids RPG/strategy game from the Game Bakers... which happens to take place under water as well (not that surprising ;)

Although the interactions and goal is pretty simple, they managed to keep me playing until the end of the demo (that is, the point where you're prompted to purchase more characters) thanks to that lovely graphics they have. The OST is sure great as well, but it's just harder to focus on the game music with kids playing all around. At some point, I paused the game and picked my pencil to note some graphical tricks, some underwater plants I found interesting, and so on.


edit: pencils have finally discarded some sharp-harps and twisted me towards saxocamps instead. I've got other folks that look like whistling-fishes. Cymbal-manta-ray didn't make it.