SolarStriker TUTORIAL...
...ou comment faire ses propres niveaux.
( par Brian Tribondeau & Benoit Scherrer )
I ) Introduction
Ce tutorial a pour but de présenter brièvement le moyen de faire ses propres niveaux en attendant la version finale qui disposera des 6 niveaux du jeu original sur Game-Boy. Tout d'abord, il faut savoir que créer un niveay est une chose très facile et ne nécessite aucune connaissance de l'assembleur 68000. Ensuite, toutes les taches ennuyeuses comme la définition des trajectoires ou les sprites se font à partir de BMP qui peuvent être édités dans PaintBrush.
On suppose que la compilation n'est pas un problème, sinon allez à http://start.at/doors pour télécharger le Kit de développeur.
Il est conseillé de regarder attentivement l'exemple fourni avant de nous écrire, mais si vous le faites pensez à nous décrire tout ce qui ne va pas dans ce tutorial et mériterait un éclaircissement. Notez que l'exemple fourni avec (Phoenix.asm) devrait vous éclaircir sur la composition d'un niveau. De même le source du niveau 1 peut-être vitale pour la compréhension.
Une fois le niveau crée et compile, utilisez ASMTOEXT (par Patrick Pelissier) pour transformer le programme en string utilisable pour le jeu.
II ) L'entête d'un niveau (Header File)
Il est très souvent toujours le même à quelques différences près :
include "os.h"
xdef _nostub
xdef _ti89
Ce sont les directives de compilation, à mettre sans modifications.
dc.l "SS68"
Cette déclaration sert au chargement des niveaux pour leur reconnaissance. En effet vous pourrez remarquer que le programme cherche automatiquement dans toute la mémoire de la calculatrice les niveaux de SolarStriker, même si ils sont dans des répertoires différents ou archivés. Et bien c'est cette chaîne en début de programme qui permet la reconnaissance.
dc.l "Test"
Cette déclaration est au choix de l'utilisateur; et permet au programme de savoir quel est le niveau en cours, ainsi dans l'option CONTINUE, il saura si le niveau qui est en train d'être effectué est le même que celui qui a été chargé avant. Les niveaux de Solar utilisent de Lvl1 à Lvl6, mais vous pouvez mettre tout ce que vous voulez du moment que ça n'a pas déjà été utilisé, par exemple Ag6F ou JHD4 sont correctes, du moment qu'elles ne sont attribués qu'à un seul fichier.
dc.w 2
Ce nombre correspond au nombre de niveaux dans le jeu. Pour notre exemple nous allons donc utiliser 2 niveaux, même si le deuxième est très cours.
dc.l info_game
Ce label doit être le même que celui qui se
trouve à la fin du niveau, il permet de mettre un commentaire
long dans le chargement des niveaux plutôt que le nom du niveau
comme il apparaitrait dans le Var-Link.
dc.l niveau_1
dc.l niveau_2
Les labels doivent être les mêmes que ceux placés au début de la déclaration du niveau, mais une fois encore, leurs noms n'importe peu du moment qu'ils sont identiques à celui utilisé pour la description du niveau.
dc.w 7
dc.l enn0
dc.l enn1
dc.l enn2
dc.l enn3
dc.l enn4
dc.l enn5
dc.l enn6
Le premier indice correspond au nombre de sprites ennemis (ici on en compte 7), puis on place les labels de chaques sprites ennemis, même remarque que précedemment au niveau du nom des sprites ennemis.
dc.w 7
dc.l traj0
dc.l traj1
dc.l traj2
dc.l traj3
dc.l traj4
dc.l traj5
dc.l traj6
Le premier indice correspond au nombre de trajectoires
ennemis (ici on en compte 7), puis on place les labels de chaques
trajectoires ennemis, même remarque que
précedemment au niveau du nom des trajectoires ennemis.
dc.w 6
dc.l tir0
dc.l tir1
dc.l tir2
dc.l tir3
dc.l tir4
dc.l tir5
Le premier indice correspond au nombre de tirs ennemis (ici on en compte 6), puis on place les labels de chaques tirs ennemis, même remarque que précedemment au niveau du nom des tirs ennemis.
III ) La structure d'un niveau
niveau_1:
Utilise le label précemment défini, nous sommes donc dans le premier niveau !
dc.w 0
Choix du type de scrolling, si 0 alors le scrolling redémarre au début dès qu'il aura atteint la fin de sa définition. Si 1 alors le scrolling s'arrete dès que lon place une balise dans le niveau qui arrête le timer, le but est de pouvoir définir son scrolling du début jusqu'à la fin du niveau, et donc faire des niveaux structurés même si l'on place des boss intermédiaires.
dc.w 32*26*2
Définit le moment du reset scrolling (et donc définit la fin
du scrolling), comme il s'agit de l'arrière plan, il faut
multiplier par 2, la valeur 32 correspond à la taille d'un bloc,
et 26 est le nombre de blocs écoulés avant le reset du
scrolling. Cette valeur peut parfois prendre la valeur +1 ou -1
selon la taille du scrolling. Il est conseillé de créer tout de
même une zone d'une dizaine de blocs.
dc.w 32*26
Définit ce moment pour le premier plan (le plus rapide), notez l'absence du *2.
dc.l MosData
dc.l MosGFX
dc.l MosData2
dc.l MosGFX2
Ce sont les pointeurs respectivement sur la composition de l'arriere plan et ses gfx, et idem pour le premier plan. Notez que les noms peuvent être changés, et le doivent de toute façon si il y a plusieurs niveaux.
dc.w 31 ;background_offset
dc.w 31 ;foreground_offset
dc.w 1 ;foreground_itimer
dc.w 2 ;background_itimer
dc.w 1 ;foreground_timer
dc.w 2 ;background_timer
dc.w 1 ;foreground_enabled
Ces informations sont optimales, et il n'est pas conseillé de les modifier. Cependant vous pourrez obtenir des vitesses différentes en modifiant leurs valeurs.
dc.l ship
Définit le vaisseau à utilisé pour le niveau, conséquence ? Et bien on peut changer le design du vaisseau entre chaques niveaux et créer un scénario (par exemple un sous-marin sous l'eau, un avion de chasse dans le ciel, etc...)
dc.w 4710
Correspond à la taille du niveau, et a généralement a une valeur un tout petit peu plus grande que le timer du dernier ennemi. Il faut faire attention à ne pas mettre de valeurs trop faibles (<50) ou trop grandes (>65000), comme la synchro est à 27 i/s, il suffit de diviser la valeur de la taille du niveau par 27 pour obtenir la durée du niveau (environ). En admettant que l'on mette 30000, le niveau durera environ 18 minutes, ce qui peut-être largement suffisant déjà !
III ) La composition d'un niveau
dc.w 0
Moment du départ ( décalé ou simultané )
dc.b 0
Table de mouvement à utiliser ( 0...255 )
dc.b 0
Sprite à utiliser ( 0...255 )
dc.b 0
Table de tirs à utiliser ( 0...255 )
dc.b 0
Type de mouvement
0 = Normal
1 = Réaction aux coordonnées Y du vaisseau
2 = Départ aux coordonnées X du vaisseau
3 = Descente de y pixels, puis boucle jusqu'à destruction
Des que le systeme observe un mouvement en x, il considère cette
partie comme le début de la boucle
4 = Bloque le timer jusqu'à ce que tous les ennemis soient morts
5 = Idem que 3 mais déclaration de type BOSS
dc.b 0
Position X de départ
dc.b 0
Nombre d'animations du sprite ( 0...63 )
dc.b 0
Valeur de la protection ( 0 = transparent <...> 255
= quasi-invincible )
dc.b 0
Item ( 0 = aucun, 1 = arme )
Ex:
dc.w 625
dc.b 2,1,0,0,3,0,1,0
; Moment du départ = 625 soit (625/27) secondes après le
début du niveau environ.
; Type de trajectoire N°2 (Position dans l'entête du fichier)
; Type de sprite N°1 (Position dans l'entête du fichier)
; Type de tir utilisé N°0 (Généralement on s'en sert pour ne
pas définir de tirs, donc le tir0 ne devra comporté aucun
départ de tir)
; Type de mouvement = 0, donc un comportement normal
; Le départ est à 0 en abscisse, on assume donc que la
trajectoire possède une structure qui ne reste pas en x=0
; Le sprite n'a pas d'animations.
; La protection est à 1 donc il se détruit très facilement, si
0 alors on peut passer à travers !.
; Lorsqu'on le détruit il ne donnera pas d'armes.
dc.w 65535
Cette valeur indique la fin d'un niveau, et est OBLIGATOIRE si vous ne voulez pas de plantage en fin de jeu.
Le reste du niveau est composé d'include, et la déclaration des tirs et du scrolling ne devrait pas poser de problèmes.
Bon courage et surtout bonnes créations !