Saturday, October 31, 2020

Cancelled refactoring

I had a checkbox in my notebook asking whether BlockArea really needs to be a full-fledged GameObject or could be something simpler. So I started to refactor things and see whether we couldn't have more features moved from GameObject into CommonGob instead.

Yeah, I know. You're lost. 

Let's start with GameObject. That one is how the engine sees Bilou, Bladors and all the other characters in the game.

Now the 'BlockArea'. This is a temporary object that captures information about where a GameObject interacts with a special block on the map. During that time, that part of the map must be able to trigger and get collisions.

The part that annoys me is how being a GameObject implies being an Animator. That implies being registered with the engine. There's no good reason for BlockArea to be an Animator: it won't exist for more than one frame. But because being a GameObject implies being an Animator, I have no choice.

Or do I ? I started trying to change the inheritance graph so that now CommonGob -- the thing I introduced to capture what was previously into SimpleGob (AppleAssault-like GOBs made of only one hardware sprite) but had to be shared with CompoundGob (SchoolRush-like GOBs made with AnimEDS). 

But that turned out to be a bad idea: many parts that used GameObject (including the script-parsing code) assumes that GameObjects are Animators that can be played, stopped, etc. 

So I'll have to roll back and return the things as they are. That would have been a nightmare in the CarzyBrix era, but hopefully, it's just one command in mercurial. 

c:> oubliette


Sunday, October 11, 2020

Direct Flags

Signing in for a 7-days trial of the Nintendo Online sure affected how I used my hobby time these last days. But nevertheless, I could do some homebrew coding, and it was for the level editor.

You may recall that I'd like to introduce 'direct flags tiles' in the engine. The idea is to enable any combination of some very basic properties like "can be swum through", "can be climbed on" or "can be fallen through" within the level by dedicating 64 tile types where the 'type identifier' part is used as a direct set of flags for those properties.

Une des idées avec la révision du monde de Bilou, c'est de pouvoir permettre à certains tiles de définir directement les propriétés physiques à appliquer. Dans Apple Assault et School Rush, chaque numéro de tile fait appel à un lookup dans une table de correspondance pour connaître les 'flags' à utiliser dans cando(): ça, c'est l'encodage indirect. (ça vous rappelle vos cours d'assembleur ? c'est normal). Un quart des types de tiles seront maintenant dédiés à ce fameux encodage direct, qui permet notamment d'exprimer n'importe quelle combinaison de 6 propriétés fondamentales comme "permet de tomber", "permet de nager", "peut être escaladé", etc.

Yet, that's only efficient if you don't have to come with 64 custom editor art for them. And that was only possible with a few changes to my MetaFlags widget and the surrounding code:

  • paint color for 'environment type' tiles 
  • on/off switches for those tiles in MetaFlags
  • auto-generate combined tiles for combined environment (e.g. CAN_SWIM + CAN_CLIMB)

"auto-generation" works by painting the the 'pure' tile with the highest bit, then painting over the lower-priority bits. So if you swap the order of  all-blue CAN_SWIM and some-green CAN_CLIMB, you won't see that you can do both anymore.

Jusque là, c'est bien beau sur papier, mais dans l'éditeur, comment représente-t-on que le bit 4 est utilisé pour l'eau et le bit 3 pour l'escalade ? Eh bien à travers le fichier .gam, bien-sûr. Celui qui contient déjà des commandes "block {}" pour tous les blocs spéciaux (bonus, clés, portes, etc.). Comme leur nombre a été réduit à 64, je peux utiliser une partie des numéros pour décrire 6 graphismes de base (un par propriété fondamentale). La chaine hexa sert toujours à définir l'image à afficher, le nombre qui est derrière la couleur à utiliser (le noir pouvant servir à 'effacer'). A partir de ces images de bases, l'éditeur générera les combinaisons possibles.

It's far from perfect, especially because I still have to override that for the tile that says "plain air here, sir". But I realised it was merely an optimization over the 'indirect' tiles, and premature optimization is the cause of so much bad things ...

*but* I can manage to get some clean output if I define 'flags' in the .gam file. Especially, knowing that meta-tiles are alpha-rendered, meaning that any black color turns transparent, whatever their palette indices. 

*edit* And the reason why so many levels I edited lately would have buggy 'empty' tiles rendering is that this "rush.gam" file I modified for the snapshots is only used in two levels so far.

Wednesday, October 07, 2020

Other perspectives

I should possibly call them 'projections', because a perspective is something where distances shorten coherently when things are further away, and typically will never have parallel segments to depict things that are parallel in the 3D world. 

And I don't have to make the height of the front face shorter than the width of the same cube. If I do, it will be a stylistic choice of mine. 

cyangmou: Really depends on the type of projection you use. You can use foreshortening, but you don't have to, as long as it is consistent between the objects you are using. I mean it's more about the consistency of the general ruleset which is applied. e.g.:
I'll have to keep that in mind before setting the pixel sizes into stone tiles.

 (There's more about isometric pixel art tutorials in Cyangmou's "Pixel Art Knowledge" collection, of course)


Thursday, October 01, 2020

Ori et le Langage Retrouvé

 J'ai finalement terminé Ori & the Will of the Wisps hier, soit 13 jours après son achat. Pourtant, je pense qu'il est dans l'absolu plus difficile que son prédécesseur, mais je suis nettement mieux rôdé à manipuler le p'tit bonhomme.

"Est-ce qu'il est dans la continuité" demande ma collègue 'Sparkling', fan de la série ? Eh ... difficile de répondre. On est dans un jeu qui débute son histoire après l'histoire du premier jeu, mais qui en rupture avec le jeu précédent puisqu'on commence en échouant sur une île inconnue.

D'une certaine façon, "The Will of the Wisps" est autant dans la continuité de "The Blind Forest" que "Link's Awakening" n'est dans la continuité de "A Link to the Past".

La grosse "nouveauté" dans le jeu, c'est cette société de personnages non-jouables qui tiennent la bavette ça et là, que ce soit pour nous renseigner sur le fonctionnement de l'île, nous envoyer dans des recoins pour des quê-quêtes à la Guilde Noob ... ou pour nous soutirer des crédits.

Eh oui, c'est l'autre "nouveauté": les orbes de lumière spirituelles sont sur cette île une monnaie d'échange pour payer le cartographe (qui arrive toujours sur les lieux avant nous, hmm), le guru des arts martiaux et le type louche qui deale des éclats d'esprit pour nous permettre d'être mieux défendu ou de faire un 3eme saut. 

Vous l'aurez compris, je ne suis pas convaincu. Et si j'ai systématiquement mis "nouveauté" entre guillemets, c'est parce qu'il ne s'agit ni plus ni moins que de réinjecter des mécaniques conventionnelles du jeu vidéo dans une oeuvre qui jusque là n'en avait pas besoin. 

Ori and the Blind Forest n'avait pas besoin d'armes, pas besoin de crédits. Le lien empathique entre Ori et le monde qui l'entoure suffisait à entrer en phase avec les souvenirs, permettant du coup de raconter l'histoire sans avoir besoin d'un vieux barbu qui nous explique que "ah... oui, mais tu ne connais pas toute l'histoire à propos de X". 

Ce lien permettait aussi de faire monter son personnage en puissance grâce aux orbes spirituelles. C'était à moitié direct (il fallait quand même retourner à un point de sauvegarde après avoir reçu assez de lumière). C'était suffisant. ça collait avec le personnage. Mais c'est fini.

ça ne ruine pas le jeu, évidemment, mais je ne peux m'empêcher de regretter ce manque d'ambition. Ca me rappelle un peu la difficulté à faire une suite à Another World après avoir fait un jeu-culte qui avait su casser les codes du genre en ne nécessitant ni score, ni barre de vie, ni 1-UPs.

Touche finale, les personnages proposent ici une sorte de chaîne de l'échange qui m'avait si bien plu dans Link's Awakening. Je vais avoir du mal à être objectif ici parce qu'un plantage à l'arrivée dans la clairière aux Mokis m'a empêché de recevoir le 2eme objet lors de mon premier essai, et que, craignant de provoquer à nouveau un plantage en reprenant la manette, j'ai évité comme la peste le Moki qui permet de commencer cette chaîne. Je n'avais donc jamais l'objet dont aurait eu envie les PNJs rencontrés au fil de l'aventure.

Pour l'amour du jeu, j'aurais bien fait la chaîne quand-même, avant de retourner affronter le boss final. Malheureusement, l'idée n'a pas été super-bien exécutée. Me voilà avec quelqu'un qui me file un sac. 

"Ah ouais, j'me souviens d'un Moki qui voulait un sac pour devenir aventurier". Seulement, lequel ? Eh oui, 80% des PNJs du jeu sont des mokis, à peu près aussi reconnaissables les uns des autres que ne le seraient des écureuils. Parfois ça n'est pas trop dur: "cherche quelqu'un qui a froid" ou "cherche quelqu'un qui a besoin de lumière" quand il y a un territoire des glaces et un territoire des ombres, c'est dans mes cordes. Mais quelqu'un qui a besoin d'un sac ? ou d'une longue vue ?

Certains sont amusants à retenir. le moki qui veut un chapeau est à côté du vendeur qui a un chapeau. Mais comment deviner qui va nous filer un chapeau ? Au moins, sur Koholint, l'alligator qui ne veut plus de ses bananes est entouré de bananes. Le type qui file du miel est à côté d'une ruche, etc. On peut essayer de remonter le fil depuis un personnage vers celui qui peut nous débloquer. Dans Ori, ça semble la plupart du temps impossible à deviner.

edit: Les mokis de la chaîne de l'échange ne sont pas les seuls PNJ avec lesquels on peut faire des mini-quêtes, mais à part quelques unes, je les ai trouvées très noires, et pas franchement satisfaisantes. Je m'explique: supposons qu'on vous demande de retouver doudou qui s'est perdu. Bon, c'est pas la quête la plus héroïque du monde, mais au moins vous aurez fait votre B.A. et un sprite sourira à l'écran. C'est un scénario plutôt rare dans Ori. une fois le lieu demandé découvert (mon ancienne maison dans les bois perdus), il y a de forte chance que la-dite maison soit complètement pétrifiée et que le doudou ne soit plus qu'une masse informe de graviers. "nouvelle quête: allez annoncer la triste nouvelle à Machin". Pas franchement chouette, hein ? On en regrette presque d'avoir accepté la quête.