Heh. Voilà les curieux. =P
En fait, la Custom Objects Subroutine porte bien son nom.
Subroutine: sous-fonction appelée par le programme principal, avec retour.
Object: un sprite invisible dans un niveau, effectuant une action précise.
Custom: personnalisé.
C'est difficile à décrire, vu que en fait, il n'y a aucune représentation visible de ça à l'écran. C'est un sprite qui déclenche certains événements, certaines actions. Jusque là, rien de plus normal, et pour coder un tel sprite, on aurait même pas besoin de la Subroutine à vrai dire.
Je me suis inspiré du modèle de Multimédia Fusion pour coder la Subroutine. Elle permet de créer ses propres objets personnalisés en un temps record, sans un mot d'assembleur. On entre une coordonnée où placer l'objet, et on lui spécifie les fonctions à exécuter, dès que Sonic entre en collision avec lui. Ces fonctions, il y en a de toutes sortes, que j'ai codé moi-même à la main, et surtout quasi génériquement. Celà va du simple changement de couleurs et changement de musique, jusqu'à cette fameuse gestion dynamique d'arrière-plan, très complexe et super impressionnante.
Toutes ces fonctions ont divers paramètres que l'on peut modifier à notre guise pour pouvoir faire l'effet désiré. Avec 21 fonctions ayant au moins 10 paramètres modifiables chacun, les possibilités sont énormes! Mais celà va encore bien plus loin...
Chaque objet a une gestion spaciale. On peut définir aussi bien un carré minuscule qu'un rectangle énorme, ou encore à l'échelle d'une zone entière. Encore mieux, on peut littéralement découper un objet en petits morceaux pour le dispatcher dans tout le niveau.
Chaque objet a aussi une gestion temporelle. On peut en effet spécifier que l'objet ne doit s'exécuter qu'une seule fois, mais on pourrait très bien dire une infinité de fois, ou encore mieux, pendant X minutes, Y secondes et Z millisecondes...
Mais la vraie force de la Subroutine réside dans ce qui suit. Un objet est une chose, mais la Subroutine peut supporter 16 de ces objets à la fois! Chaque objet, par le biais d'une tonne de flags et d'événements simples (comme if-then-else, ou des tests diverses), peut interagir avec un (ou des) autre. On peut dire que un objet ne doit s'exécuter qu'avant un autre, ou encore après celui-ci mais avant celui-là, pendant que l'autre est encours d'exécution...etc. Ainsi, en combinant ça avec les diverses fonctions, on peut vraiment créer des événements hyper complexes sans même se casser la tête: un paradis...
Et encore plus fort, chaque fonction dispose elles aussi d'une batterie de possibilités. On peut en effet sauter l'exécution de certaines fonctions selon un événement, créer des boucles d'exécution, changer carrément tout le statut de l'objet, ou même d'un autre objet, et changer les interactions avec les autres objets à la volée...
Mais ce n'est pas encore tout. 16 objets est relativement peu. En réalité, la Subroutine est composée de groupes. Chaque groupe contient 16 objets pouvant être exécutés en même temps. On peut évidemment changer de groupe d'objets sans aucune difficulté à la volée grâce à une fonction. Mais le mieux, c'est que l'on peut réellement définir 255 groupes de 16 objets chacun...
Et par dessus ces groupes, il y a l'act. Chaque act dispose ainsi de 255*16=4080 objets à sa disposition! Avec tous les événements, les fonctions et les interactions que l'on peut faire, les possibilités sont carrément monstrueuses!!!
Et tout celà ne prend que $80 octets de RAM, soit la taille en RAM d'
un seul et unique sprite... Avec 4080 objets pour chacun de la trentaine d'acts du jeu, j'ai litteralement fait explosé le moteur original du jeu en le tournant au ridicule, moteur qui ne prévoyait que 80 sprites par act, pour $80 octets de RAM chacun...
Et le pire, c'est que environ 100 lignes de code supplémentaire dans Sonic 2 le conduit à ralentir. Avec 2600 lignes, cette Subroutine est un véritable miracle en optimisation, le jeu ne ralentit pas! Elle est également complètement transparente pour le reste du jeu: c'est comme si elle n'existait pas... Bugs absolument impossibles!... Elle fonctionne d'ailleurs sur le vrai matériel...
Pour finir, la Subroutine a été codée pour être utilisable par tout le monde. Une fonction Custom a été prévue pour créer ses propres fonctions (comme des plugins) et intéragir avec les autres sprites du jeu. De plus, son installation dans n'importe quel Sonic 2 est désespérément simple et celà fonctionne comme un gant grâce aux pointeurs relatifs. Aucune difficulté donc, pour la version Knuckles de mon jeu, c'est du simple copier-collé...
C'est pour ça que ça fait 9 mois que visuellement, rien d'extraordinaire n'a changé dans Sonic 2 Long Version. Mais maintenant, le changement va être tout simplement radical, un vrai tournant à 180 degrés! Il ne reste plus qu'à faire parler l'artiste et le level designer sans trop se soucier des faisabilités en programmation...
MacIntoc> A voir, pour la vidéo...