Thursday, April 29, 2021

UsingSprites was a mistake. Wasn't it ?

 While refactoring the animation editor, I tasted a new design pattern as an alternative to the usual Singleton pattern: the Using* anti-pattern. The idea was simple: for every item that needs to be there one and only one time, there is a class who has the sole responsibility for holding the variables describing that item. Let's take for instance the hardware sprites of the Nintendo DS. We have an array of 'sprites', an array of 'rotations' and a z-order list.

The Using* anti-pattern said "these 3 should be static members of UsingSprites, and any code who needs to access them (read or write) will derive from UsingSprites". What it guarantees, is that if something messed up with * global, shared state, then that something is in one of the classes Using*.

The one nice thing, is that code in those sub-classes can access the array quite directly: the location of UsingSprites::sprites is stored next to the functions that need it and it just needs a ld r*, [pc, offset] to be ready to use it. No additional pointer dereferencing required. This is the very same as accessing e.g. the address of a constant string (ARM thumb code doesn't seem to have mov reg, imm32 instruction).

What I hadn't foreseen when I decided to generalise that to the whole game engine, is that a) there would be so many Using* for simple classes such as an animation and b) that they would all introduce a virtual table where the pointers to virtual methods for that class are stored.

The issue with that is that when you have multiple inheritance, you need one vptr (pointer to a virtual table) per super-class. That means every GobAnim instance must dedicate 5 full-sized pointers to virtual tables in addition to the 'real' data of the object.

Hopefully, it turns out to be a worst-case. GobState has 4 superclasses and most of the state-machine only one or two.

When looking at that inheritance graph again, I wonder if Using* is the right one to blame. iReport is there just to bring action/step/report/diagnose functions into the local namespace, but they are actually just static functions manipulating no particular state. Same goes for iAnimUser. iReport is so omnious that it could really be dropped and the functions just promoted to global namespace just like printf. iAnimUser could just be a namespace and not mess up with the inheritance, as it just provides constants and helper inline functions with, again, no dedicated state.


Wednesday, April 28, 2021

Le journal de Link: Remontant l'Endurance ...

Grimper à une tour, en repérer une autre, sauter en paravoile puis tracer son chemin à travers tout jusqu'à la-dite tour... escalader. Reconnaître les alentours. Recommencer. ça peut paraître répétitif, mais je n'ai rien ressenti d'aussi grisant depuis que je me suis réveillé.

Bon par contre, au niveau de l'escalade, j'avoue que je suis un peu rouillé. Je tiens bon à coup de potions, mais clairement, je manque d'endurance.

Dire qu'il y en a qui préfèrent les îles mystérieuses et leurs temples perdus. A moi les grands espaces, les chaînes de montagnes à la beauté sauvage où l'on peut tracer pendant des heures sans rencontrer âme qui vive. J'irai de sanctuaire en sanctuaire, triomphant d'épreuves sans nombres jusqu'à ce que la Déesse entende ma prière et me rende ma force d'antan.

Bon, la dernière m'a donné encore plus de fil à retordre. J'avais repéré un bel angle d'approche qui ne m'aurait demandé que quelques instants d'escalade. Malheureusement, dès que je m'en approchait assez, c'était la drache. 

En cherchant à trouver un autre moyen, je tombe sur un Prince Zora. J'ai dû me faufiler en terrain inconnu à travers des lézards cracheurs d'électricité pour trouver leur ville, puis me faufiler au sommet des montagnes ruisselantes jusqu'au repaire d'un Lynel géant pour lui voler ses flèches-éclairs, après quoi on affronte avec le prince une machine géante en folie dans laquelle se trouvait un démon ténébreux. Il a beau être tout sourire, je trouve que les catastrophe s'enchaîne un peu trop aisément pour être naturelles quand il est dans les parages, le Prince... et tout ça sans savoir où je mettais les pieds, évidemment. Je commence à croire que les tablettes nous ramollissent la cervelle et qu'on devient incapables de se débrouiller des qu'elles sont en panne. 

Hyrule et sa fille on peut-être eu raison de faire en sorte qu'il n'y en ait qu'une seule pour tout le royaume, après tout...

Monday, April 26, 2021

pyramt.map

Files transferred. Last week, I had just complete mess of tiles, some even not part of the file, but things remaining from the previous level. Hopefully, each of these level worked fine in the level editor on the NDS.

With a bit of tweaking, I could also get the shown in runMe. After I remembered I had a button to show the loading log in case of failure, I realised I had a few files missing (mostly .gam files) and I could get school title screen working with sprites as well.

But as far as pyramids and green zone maps are concerned, I'm still trying to get them working. Dreams.nds itself triggers a blue screen somewhere in GobAnim::translatecommands.

One thing, though. It's nice to have a memory crawler embedded into my exception handler, but I should make sure it doesn't trash the precious registers I had on-screen when I'm exploring invalid addresses (first, because it is impossible to hop from 0x0b00xxxx stack addresses to 0x020xxxxx heap/code without entering some invalid addresses, and second because moving down to higher addresses makes the DPAD to enter addresses confusing at best)


 


Tuesday, April 20, 2021

Le journal de Link : j'ai cassé ma hache T_T

C'était une belle hache, en plus. Le premier truc tranchant que j'ai pu utiliser pour me défendre contre tous les *oblins qui infestent ces régions. Sans elle, j'aurais dû étourdir un boko à coup de feuille de palmier jusqu'à ce qu'il perde son arme ? Et si je l'avais cassée à force d'abattre des arbres avant de penser à couper des feuilles ? Je n'ose même pas y penser ...

Tout ça, c'est la faute des rochers vivants qui trainent dans les monts géminés ! tu fais une approche furtive pour augmenter ton stock de viande de moufflon (revenu au beurre de Coccorico avec des champis sautés et des sauterelles enduro. Une tuerie! Passez un coup au village, je vous ferai goûter ça). Eh bin paf! avant que t'aies eu le temps de lancer ta première flèche, c'est le rocher derrière lequel tu restais planqué qui sort de terre et qui s'acharne sur toi! Et attention, hein, je ne vous parle pas d'un p'tit caillou du genre de ces cracheurs de noix qu'on peut voir dans les plaines en bas du Plateau du Prélude, hein! Ce truc fait bien deux fois la taille d'un centaure.

Qu'est-ce que vous auriez fait vous ? Bin j'ai décampé, évidemment. En jetant un oeil en arrière pour m'assurer que je le semais. C'est comme ça que je suis tombé sur un camp de goblins des montagnes que je n'ai pas pu approcher par surprise. 

Je me suis retrouvé à devoir me battre la tête dans les buissons et j'ai démoli mes épées. Une autre rencontre du genre un peu plus tard, et c'est la lance de soldat que j'avais troquée contre mon javelot au pied d'une tour sheika qui part en échardes. Elle était pourtant bien pratique quand les goblins arrivaient les uns après les autres sans pouvoir me lancer des trucs dessus.

J'avais espéré me refaire un stock au village Coccorico, mais ils n'ont que des légumes, ces gars-là! Il y avait bien un sabre antique dans le temple d'entrainement au combat, mais il n'a pas tenu le coup, le temps que je comprenne la théorie des esquives, vous pensez bien. J'avais aussi espéré tomber sur l'une ou l'autre cachette d'arme dans les ruines sur la route de l'Est, mais je suis surtout tombé d'embuscade en embuscade jusqu'au moment ou j'ai dû choisir d'affronter un Moblin géant soit avec ma hache, soit avec cet espèce de crochet que j'ai pris à l'assassin qui m'attendait à la sortie du village d'Impa.

J'ai pris ma hache. C'était elle ou moi.

Allez, tout n'est pas perdu. J'ai toujours cette lame lumineuse. Elle est réputée pas très solide. On verra bien.

Ah, du coup, je n'ai plus non plus l'épée rouillée suspecte que j'avais sorti d'un rocher au milieu d'un lac du Plateau. Tant pis pour l'Histoire.


Mais ?_? Mais ?__?


Sunday, April 18, 2021

Dreams/efsroot/*

Premiers pas vers mon objectif des trois "téléporteurs": j'ai une structure capable de produire un .nds qui comporte aussi bien les graphismes de la school zone que ceux de la green zone, avec un bilou.spr partagé entre les deux et la possibilité de passer de l'un à l'autre pendant un chargement de niveau.

Bon, j'ai eu droit à mon compte de p'tits bugs pendant que j'ajustais les pages de sprites à utiliser pour les monstres de la green zone, évidemment.

Et si une grande partie de ces défauts sont maintenant corrigés, il reste quelque-chose de travers avec la gestion des palettes. Pour la school zone, bilou.spr et school.spr contenaient exactement les même palettes, mais green.spr en a une autre. Et essayer d'afficher les applemen avec la palette des pendats donne des résultats pas tout à fait esthétiques.


Le journal de Link : de la venaison pour mon doublet

 

Quand la déesse du temple en ruine réclame la même chose que le vieux barbu bizarre en échange de son paravoile, on finit par se dire que c'est un signe du destin. Du coup, je me suis mis en chasse des sanctuaires sheika même si je préfèrerais perso essayer de comprendre pourquoi je continue à entendre la voix de mes rêves pendant que je suis éveillé.

L'ennui c'est que les autres temples sont du côté des sommets, et que ça caille sérieusement, par là. Avec ma chemise centenaire, je ne tiens pas 2 minutes. J'ai l'impression d'avoir déjà révé quelque-chose de ce genre, où je partais vaillamment, la torche à la main, allumer un feu de camp le long de la rivière pas-assez-gelée, puis un autre, puis lacher ma torche parce qu'un monstre apparaît, occire le monstre en caillant, retourner rallumer ma torche, reprendre des forces, repartir ... Sauf qu'ici, ça ne m'avancerait pas: je serais de toutes façons coincé du mauvais côté de la rivière.

J'ai croisé une cabane avec un vieux livre de recettes au piment, ce qui m'a rappelé un autre rêve, ou je me cuisinais des plats toujours plus épicés pour tenir face au froid, puis j'errais dans les montagnes à la recherche d'un sanctuaire, puis je n'avais plus rien d'épicé à manger pour rentrer et je mourrais de froid et de faim.

ça devait être un rêve prémoniteur: je crois avoir trouvé la cabane du vieux barbu bizarre (qui fait une fixette sur les recettes pik-pik) dans laquelle il y a des piments. J'essaierais bien de lui tirer les vers du nez, mais je ne comprends pas grand-chose à son charabiat. "doublet" ... "venaison" ... je ne me souviens pas qu'on parlait comme ça avant mon grand sommeil. Bon, j'avoue que je ne me souviens pas de grand-chose d'avant mon grand sommeil, non plus. Mais j'ai l'impression que si j'arrive à faire la recette qu'il a oubliée, il me donnera un truc utile.

Friday, April 16, 2021

vu sur dev-fr... il y a longtemps

dev-fr.org ... le site web que je regrette le plus (vu que Nectarine est re-là de nouveau ;). J'ai retrouvé pas mal de monde sur twitter, mais ce n'est pas vraiment la même chose. Il est rare de parvenir à avoir la même quantité et qualité d'interaction à propos d'un nouveau projet ou d'une mise à jour. Et j'ai toujours cette impression d'y être un marchand-ambulant plutôt qu'un villageois membre de la communauté.

Enfin, il y a heureusement la machine à voyager dans le temps: archive.org ... On ne retrouve pas tout loin de là, mais quand-même de quoi reconstruire certaines pages aux liens cassés ou aux images perdues.

 ça me permet de retrouver la présentation originale d'Apple Assault ou de la première démo de la School Zone. Ou à des fins plus pratiques, le tutoriel français de LEDS.