Développement et info sur l'avancée des projets par les développeurs

Alpha-Arts » Blog

Holyspirit
4
Aujourd'hui, je vais vous apprendre comment je gère mes tilesets, du moins d'un point de vue ressources. Je pourrai vous expliquer ça d'un point de vue programmation dans un futur billet si ça vous intéresse.

Tout d'abord, une petite définition personnel : un tileset est un ensemble de tiles, qui se traduit par tuile en français. Holyspirit est composé de "tuiles",[...]
Aujourd'hui, je vais vous apprendre comment je gère mes tilesets, du moins d'un point de vue ressources. Je pourrai vous expliquer ça d'un point de vue programmation dans un futur billet si ça vous intéresse.

Tout d'abord, une petite définition personnel : un tileset est un ensemble de tiles, qui se traduit par tuile en français. Holyspirit est composé de "tuiles", correspondant en fait aux petites images qui composent la partie graphique du jeu.
Nous pouvons avoir toutes sortes de tiles : des tiles pour des décors (sols, murs, arbres, ...), pour des personnages, pour des effets de sorts (ou miracles dans Holyspirit), ...

Dans cet article, je vais principalement détailler le fonctionnement des tilesets de décors, puis je vous expliquerai rapidement comment ça marche pour les personnages et miracles.

Un tileset de décor est composé simplement d'un fichier *.ts.hs, ainsi que d'une ou plusieurs images de ce genre :

http://holyspirit.alpha-arts.net/Fichiers_jeu/Holyspirit/Data/Landscapes/Misc/smallCart.png

Exemple de fichier *.ts.hs, celui qui va avec l'image ci-dessus.

*Data/Landscapes/Misc/smallCart.png
$

$
*x0 y0 w192 h128 ex126 ey64 i0 c1 z1 vPetitChariotDetruit $
*x192 y0 w192 h128 ex126 ey64 i0 c1 z1 vPetitChariot $
$


Les plus malins d'entre vous l'auront tout de suite compris, le fichier est décomposé en 3 parties.
La première contenant la liste des chemins des images, la seconde, même si l'on ne le voit pas ici, la liste des chemins des sons et la dernière, la liste des tiles.

Je ne penses pas devoir donner des informations sur les deux premières parties, on a simplement "*Chemin". En programmation, je récupère le chemin et ajoute à mon objet tileset l'ID de l'image dans le moteur graphique, idem pour le son.

Pour la liste des tiles, vous pouvez retrouver le même genre de structure que dans les miracles, donc des blocs ouverts par '*' et fermés par '$', avec des lettres pour indiquer le type de l'information, chacun de ces blocs correspondant à un tile, à un décor.

'x' et 'y' pour la position en pixels dans l'image du tile et 'w' et 'h' pour la largeur et la hauteur du tile.

'ex' et 'ey' c'est la position du centre du tile. En gros, si le décor est placé à la position 32 en x et 48 en y, ce sera le pixel de l'image en 'ex' et 'ey' qui s'y trouvera. C'est donc l'origine du tile. C'est aussi utile pour placer le centre de rotation du tile, pour l'ombre.

'i' pour le numéro de l'image dans le tileset. Ici, nous avons qu'une seule image qui compose ce tileset, donc c'est l'image 0. (On commence à 0).

'c' pour dire qu'il y a collision sur l'élément. Le personnage ne peut donc pas le traverser. Pour ne pas mettre de collision, on aurait eut 'c0' ou rien du tout.

'z' ça n'a aucune utilité pour le jeu lui-même, mais c'est pour l'éditeur. Ça veut dire que si, dans l'éditeur, je sélectionne ce tile, il me le place en par défaut sur la couche n°1, donc celle à hauteur des personnages.
'v' n'a aussi aucune utilité pour le jeu, mais permet de mieux s'y retrouver dans l'éditeur. C'est le nom associé au tile.

C'est tout pour ce tileset-ci, mais il existe encore de nombreux autres types d'informations.

Passons à un autre exemple de tileset :

http://holyspirit.alpha-arts.net/Fichiers_jeu/Holyspirit/Data/Landscapes/Misc/Lantern.png

*Data/Landscapes/Misc/Lantern.png
$

$
*x0 y0 w192 h192 i0 o1 c1 z1 ex83 ey168 lr255 lv200 lb81 li128 $
$


Vous avez comme nouvel élément : lr255 lv200 lb81 li128

Ça, c'est simplement pour indiquer que le tile émet une lumière. Les composantes RGB sont données par lr, lv et lb, ainsi que l'intensité, qui définit le rayon de la lumière, par li.

http://holyspirit.alpha-arts.net/Autres/screenshot0_blog_tilesets.png

Tile tiré d'un tileset d'arbres :

*Data/Landscapes/Trees/Trees.png
*Data/Menus/MinimapIcones.png
$
$
*x0 y0 w384 h384 i0 c1 o1 f1 ey342 z1 vBouleau m i1 x48 y32 w16 h16 $ $
$


Vous avez le 'f' qui signifie que le tile est réfléchi dans l'eau.

Le 'o' permet de dire que le tile possède une ombre.

Voyez le m i1 x48 y32 w16 h16 $, c'est pour dire que le tile possède aussi une image sur la minimap.
Niveau fonctionnement, c'est comme avoir un tile dans un tile, si ce n'est que le bloc est délimité par 'm' et '$'.
NB : Le 'i1', on est donc sur la seconde image du tileset, soit :

http://holyspirit.alpha-arts.net/Fichiers_jeu/Holyspirit/Data/Menus/MinimapIcones.png

En jeu, nous obtenons ceci :

http://holyspirit.alpha-arts.net/Autres/screenshot1_blog_tilesets.png


Maintenant, un tileset de feu de camp :


*Data/Landscapes/Campfire/Campfire.png
*Data/Landscapes/Fire/Campfire_distortion.png
$
* mData/Sounds/Feu.wav $
$
Feu de camp
*x0 y0 w128 h128 i0 c1 a1 s0 lr236 lv136 lb36 li255 lh0 j x0 y0 ey160 w128 h128 i1 $ $
*x128 y0 w128 h128 i0 c1 a2 s0 lr236 lv136 lb36 li245 lh0 j x128 y0 ey160 w128 h128 i1 $ $
*x256 y0 w128 h128 i0 c1 a3 s0 lr236 lv136 lb36 li235 lh0 j x256 y0 ey160 w128 h128 i1 $ $
*x384 y0 w128 h128 i0 c1 a4 s0 lr236 lv136 lb36 li245 lh0 j x384 y0 ey160 w128 h128 i1 $ $
*x512 y0 w128 h128 i0 c1 a5 s0 lr236 lv136 lb36 li255 lh0 j x512 y0 ey160 w128 h128 i1 $ $
*x640 y0 w128 h128 i0 c1 a6 s0 lr236 lv136 lb36 li245 lh0 j x640 y0 ey160 w128 h128 i1 $ $
*x768 y0 w128 h128 i0 c1 a7 s0 lr236 lv136 lb36 li255 lh0 j x768 y0 ey160 w128 h128 i1 $ $
*x896 y0 w128 h128 i0 c1 a0 s0 lr236 lv136 lb36 li255 lh0 j x896 y0 ey160 w128 h128 i1 $ $
$


Notez le 'a', c'est simplement le n° de la prochaine image dans l'animation du tile. Le tile devient donc un autre tile parmi la liste quand le temps est écoulé. Ce temps est par défaut de 0.075 secondes. Mais il peut être modifié par 'n'.
Vous pouvez aussi remarquer le 's' pour le n° du son joué.
Enfin, vous avez le j x768 y0 ey160 w128 h128 i1 $
En fait, c'est une image qui est utilisée pour donner un effet de distorsion sur l'écran via un shader, afin de donner une impression de chaleur. Je ne vais pas trop approfondir ce sujet, ce n'est pas le but de ce billet.
Il est définit de la même manière que pour la minimap, mais avec un 'j' au lieu d'un 'm'.

Je ne vais plus donner d'exemple, mais vous pouvez encore avoir :
't' : le tile devient transparent si le héros passe derrière, utile pour des tiles qui prennent beaucoup de place à l'écran ou des murs dans des donjons.
'p' : permet de modifier l'opacité du tile. Surtout utilisé pour des effets de miracles qui disparaissent petit à petit.
'd' : cette information n'est utilisée que dans les personnages. Elle peut valoir -1, 0, 1 ou 2. En gros, elle permet de définir à quel moment dans l'animation le personnage inflige des dégâts, quand il a fini de frapper, etc.
'g' : cette information n'est utilisée que pour le héros. Je ne vais rien expliquer ici car ça fera l'objet d'un prochain billet qui expliquera comment je fais pour que, suivant les objets que le héros porte, ses graphismes changent.
'r' : il peut valoir x, y, g, d, b, h, ... En gros, tout ce que vous avez besoin de savoir c'est que ça définit l'orientation des murs pour bloquer la lumière. Si je fais un billet sur mon moteur de lumières, je vous expliquerai tout ça plus en détails.
'k' : dans le même genre que 'm' pour la minimap et 'j' pour les distortions, 'k' est l'image de la shadowmap du tile. En gros, c'est utilisé pour assombrir des morceaux du tile suivant l'orientation du soleil.
Pour ça, j'utilise une autre information, 'b' qui est l'angle. Je compare cet angle avec l'angle du soleil et en fonction de ça, je modifie l'opacité de la shadowmap que j'applique sur le décor. Je peux avoir plusieurs shadowmap pour un même tile.

Exemple :
http://holyspirit.alpha-arts.net/Fichiers_jeu/Holyspirit/Data/Landscapes/Stone_wall/Stone_wall.png
http://holyspirit.alpha-arts.net/Fichiers_jeu/Holyspirit/Data/Landscapes/Stone_wall/Stone_wall_shadow


Enfin, si vous vous souvenez, dans le billet sur les miracles, nous avions des séquences. Vous pourrez remarquer que ces séquences ne sont autre que des tilesets, possédant exactement la même structure.

Pour les personnages, c'est un petit peu différent. En effet, vous avez juste un fichier .rs.hs qui contient le .ts.hs et les images. C'est donc une forme de fichier *.dat.
Par ailleurs, le .ts.hs est un petit peu différent.
Vous avez toujours la liste des images, liste des sons et puis des tiles, mais avec quelques nuances.

Tout d'abord, la liste des sons est maintenant comme ceci :

Liste des chemins de tous les sons
* mData/Sounds/9906__Snoman__grass3.wav $
* mData/Sounds/14609__man__swosh.wav $
* mData/Sounds/punch.wav n0 $
$


En effet, vous pouvez avoir une information 'n', à 0, cela signifie que le son est joué quand le personnage est touché par une attaque.

Quant aux tiles, ils vont par blocs de 8 blocs. En gros, ça veut dire que vous avez une liste de tile par direction, donc 8 listes. Et ces 8 listes sont elles même séparées en différents blocs qui représentent les états du personnage, donc à l'arrêt, qui marche, qui frappe, qui meurt, qui lance un miracle, ...
Le code permet de mettre autant d'états qu'on le souhaite, si on veut faire plusieurs animations différentes suivant les miracles lancés.


C'est tout pour aujourd'hui. Si vous avez des questions ou remarques, n'hésitez pas.

Par Gregouar - 06/06/2010

Holyspirit
1
Les miracles ne sont autre que les compétences dans Holyspirit.
Ils peuvent varier fortement : coups puissants, projectiles en passant par invocations ou autres améliorations.

Il m'a donc fallu trouver un moyen pour pouvoir mettre en place toute cette diversité d'effets sans devoir coder directement chaque miracle en dur, afin d'avoir quelque chose de modulable.
Les miracles ne sont autre que les compétences dans Holyspirit.
Ils peuvent varier fortement : coups puissants, projectiles en passant par invocations ou autres améliorations.

Il m'a donc fallu trouver un moyen pour pouvoir mettre en place toute cette diversité d'effets sans devoir coder directement chaque miracle en dur, afin d'avoir quelque chose de modulable.


Chaque miracle est composé d'un fichier *.miracle.hs. Il se compose comme suit :

Exemple de miracle, celui-ci permet à la courtisane d'empoisonner sa lame pendant X secondes, infligeant des dégâts sur le temps à chaque coup porté à l'ennemi.


*26
$
*27
$
* 50 + 50 * l $
* 15 + 15 * l $
* 1500 + 1500 * l $
* l * 6 $
$
*28
*29
$
* f%0 u1 d1 $
$
//Effets
* t-1 l1 l4 l5 $

* t14 ia1 ib%2 ic0 id2 $
* t2 l3 ia%3 ib%3 ic3 id2 $
* t3 s0 ia8 $

* t6 s1 ia1 ib-1 ic%1 $

* t-1 $
$
//Séquences
*
//Images
*Data/Items/PoisonEffect/PoisonEffect.png
$
//Sons
$
//Tiles de la séquence
* x0 y0 w128 h128 i0 a1 lr0 lv255 lb0 li0 s0 n0.04 $
* x128 y0 w128 h128 i0 a2 lr0 lv255 lb0 li64 n0.04 $
* x256 y0 w128 h128 i0 a3 lr0 lv255 lb0 li96 n0.04 $
* x384 y0 w128 h128 i0 a4 lr0 lv255 lb0 li128 n0.04 $
* x512 y0 w128 h128 i0 a5 lr0 lv255 lb0 li96 n0.04 $
* x640 y0 w128 h128 i0 a6 lr0 lv255 lb0 li64 n0.04 $
* x768 y0 w128 h128 i0 a7 lr0 lv255 lb0 li32 n0.04 $
* x896 y0 w128 h128 i0 a7 lr0 lv255 lb0 li0 n0.04 $
$
*
//Images
*Data/Entities/Heroes/Concubine/Miracles/Venom/Venom.png
$
//Sons
$
* x0 y0 w128 h64 ey0 i0 n1 a0 u-2 $
$
$


Argh, barbare hein ?
Ne vous inquiétez pas, je vais tout détailler et expliquer.

Tout d'abord, deux-trois informations par rapport à la syntaxe générale.
Les '*' servent pour montrer qu'on va donner des informations qui ne sont pas des commentaires. C'est un peu comme ouvrir une parenthèse.
Les '$' servent pour montrer qu'on a finit de donner nos informations ou pour fermer un bloc, montrer une limite. C'est un peu comme fermer une parenthèse.

Pour commencer le décorticage, nous avons :

*26
$


C'est simplement le nom du miracle.
Hein ? Comment ça le nom ? C'est juste qu'un nombre, gars !
Oui, oui, j'y viens. En fait, c'est le n° de ligne du nom dans le fichier rassemblant tous les textes de miracles.
J'utilise un nombre, comme ça, il suffit de changer de fichier de textes afin de traduire le jeu. Pratique, non ?
Ici, cette ligne correspond à : "Venin"

Ensuite :

*27
$

C'est la description du miracle. Soit : "La courtisane empoisonne son arme pendant un certain laps de temps."



* 50 + 50 * l $
* 15 + 15 * l $
* 1500 + 1500 * l $
* l * 6 $
$

Ça, c'est l'ensemble des équations dynamiques du miracle. En gros, c'est ce qui permet de calculer des valeurs en fonction du niveau du miracle, des dégâts de l'arme principale, ...
Ici, le 'l' représente le niveau du miracle.
Pour ces équations, j'ai du coder un petit parser d'équations moi-même. Si ça vous intéresse, je pourrai faire un deuxième billet pour l'expliquer.

PS : Le '*' entre le '50' et le 'l' n'est autre qu'une multiplication.



*28
*29
$


Ici, nous avons les descriptions des effets du miracle. Dans le fichier des textes des miracles, ça correspond à :
"Durée : %1 secondes"
"Dégâts de poison : %3 sur 2 secondes."

Remarquez les %X, ça représente des valeurs dynamiques. Ça correspond donc à nos équations de tantôt, la première étant %0, la seconde %1, etc.
Donc, le miracle est censé durer 15 plus 15 fois le niveau du miracle.

On continue :

* f%0 u1 d1 $
$


C'est un ensemble de paramètres supplémentaires. Ici, nous avons le coût en foi (mana), représenté par 'fX'. Et le %0 représente notre première équation, soit 50 plus 50 fois le niveau du miracle.
'u1' veut dire unique, c'est donc un miracle qu'on ne peut envoyer qu'une seule fois. On doit attendre qu'il soit fini avant de pouvoir le relancer, il n'est donc pas cumulable.

Et 'd1' signifie direct, le miracle ne peut être mis en raccourcis clic droit et si on l'active via la barre de raccourcis, il se lance directement. Par opposition à un miracle 'indirect' qui, quand on on l'active via la barre de raccourcis se met en clic droit, donc utilisé pour tout ce qui est attaques spéciales, projectiles, etc. Le miracle direct est plutôt utilisé pour tout ce qui est améliorations, invocations, etc.

Mais nous avons d'autres lettres, comme :
'FX', c'est une consommation de type réserve en foi. Tant que le sort est actif, la barre de foi est diminuée de X. En gros, si vous avez 100 de foi en maximum, vous lancez un miracle qui consomme 25 en réserve de foi, vous n'avez plus que 75 en foi maximale.

'vX', consommation en vie.
'VX', réserve en vie.

'eX', cela signifie que le miracle est réservé que pour une certaine catégorie d'arme. Par exemple, juste avec les arbalètes.

'cX', X représente le cooldown, c'est donc le temps de rechargement avant de pouvoir relancer le miracle.

Maintenant, le gros du miracle : les effets.


* t-1 l1 l4 l5 $

* t14 ia1 ib%2 ic0 id2 $
* t2 l3 ia%3 ib%3 ic3 id2 $
* t3 s0 ia8 $

* t6 s1 ia1 ib-1 ic%1 $

* t-1 $
$


Chaque ligne * -> $ représente un effet.
Les effets peuvent être très divers. Pour le moment, j'ai codé 17 effets différents. Vous avez par exemple : projectile, dégâts, effet graphique, zone, déclencheur, ...

Au niveau de leur structure, nous avons 'tX'. C'est le type du miracle. 't0' correspond à un projectile, 't1' une attaque au corps à corps, etc.

'sX' est la séquence graphique de l'effet, nous y reviendrons plus loin.

'lX' est un lien vers un autre effet. Quand l'effet en cours est terminé, le miracle passe à l'effet n°X. On peut avoir plusieurs effets en même temps. Tout le principe des miracles repose sur ces liens, ce sont eux qui permettent de faire un projectile qui explose à l'impact en sonnant et repoussant les ennemis tout en affichant plein d'effets graphiques.

'iaX', 'ibX', 'icX', ... sont les informations de l'effet. 'ia' est l'information une, 'ib' la seconde, etc.
Chaque effet a besoin d'un certain nombre d'informations pour fonctionner.

Prenons l'effet de type 14 : * t14 ia1 ib%2 ic0 id2 $
't14' signifie déclencheur. Il permet de déclencher un effet du miracle quand une certaine condition est vérifiée.
La première information, 'ia1' signifie que c'est un déclencheur de type 'Frappe', il se déclenche donc quand le personnage frappe un ennemi. On peut avoir des déclencheurs 'Permanent', qui agissent donc tout le temps, de type 'Touche', quand le personnage se fait toucher, etc.
Ensuite, 'ib%2' représente la durée du déclencheur. Quand le temps est écoulé, il se désactive simplement, et actives ses liens. Ici, il n'en a pas.
Si je mets un 'ib-100', c'est que le déclencheur ne se stop jamais. Cela peut être utile dans certains cas.
'ic' permet de définir si l'effet déclenché agit sur le lanceur du miracle ou celui qui est visé. 'ic0' signifie que c'est celui qui est visé.
Enfin, 'id' définit le n° de l'effet qui est lancé quand la condition du déclencheur est vérifiée. Ici, l'effet n°3. (Ça commence à 0)

Donc * t2 l3 ia%3 ib%3 ic3 id2 $

Je ne vais pas tout détailler, mais en gros, c'est ce qui indique que l'ennemi se ramasse des dégâts de poison sur 3 secondes.
Il est lié à * t3 s0 ia8 $ qui permet de mettre un petit effet graphique sur le monstre quand il est touché.

* t6 s1 ia1 ib-1 ic%1 $ permet simplement de mettre un joli effet graphique sur le lanceur du miracle.

Maintenant, les "séquences". Ce sont des ensembles d'images, des tilesets permettant de définir les effets graphiques du miracle.

*
//Images
*Data/Entities/Heroes/Concubine/Miracles/Venom/Venom.png
$
//Sons
$
* x0 y0 w128 h64 ey0 i0 n1 a0 u-2 $
$


C'est pas très compliqué en soit, nous définissons les images, les sons et enfin les infos liées à l'image. Je ne vais pas tout détailler ici, ma gestion des tilesets fera l'objet d'un autre billet.
L'image est :
http://holyspirit.alpha-arts.net/Fichiers_jeu/Holyspirit/Data/Entities/Heroes/Concubine/Miracles/Venom/Venom.png

C'est donc l'effet graphique mis aux pieds du personnage pour montrer qu'il a activé le miracle.


En jeu, nous obtenons ceci :

http://holyspirit.alpha-arts.net/Autres/screenshot_mir1.png

http://holyspirit.alpha-arts.net/Autres/screenshot_mir0.png

Cool, non ?

Allez, il est temps de se quitter.
J'espère que vous avez passé un agréable moment à lire ce billet sur les miracles d'Holyspirit !


PS : Si vous avez des questions, n'hésitez pas. Je me ferai un plaisir de vous répondre.
Aussi, est-ce que ça vous intéresserait que je fasse une documentation complète des miracles ? Avec tous les types d'effets et les informations qu'ils ont besoin ?

Par Gregouar - 02/06/2010

Il existe cinq grand types d'ennemis dans Holyspirit, on peut les distinguer comme suit :

Les objets animés
Ce sont de simples objets contrôlés par des entités démoniaques mineures. La plupart des objets animés sont des errants. Mais certains démons particulièrement retords n'hésitent pas à prendre les formes les plus diverses.

Les animaux possédés
Ces[...]
Il existe cinq grand types d'ennemis dans Holyspirit, on peut les distinguer comme suit :

Les objets animés
Ce sont de simples objets contrôlés par des entités démoniaques mineures. La plupart des objets animés sont des errants. Mais certains démons particulièrement retords n'hésitent pas à prendre les formes les plus diverses.

Les animaux possédés
Ces animaux ne correspondent plus en rien à ce qu'ils étaient de leur vivant. La plupart ont subis d'importantes mutations physiques les rendant surpuissants. Il ne sert à rien d'essayer de les apprivoiser. S'ils sont seuls, ce ne sont que de piètres adversaires, mais en bande, ils deviennent des plus dangereux.

Les hommes corrompus
Ces hommes ont vendu leur âme de gré ou de force contre des pouvoirs surnaturels. Parmi ceux-ci, on retrouve aussi bien les milices corrompues, de simples civiles servant de chair à canon, que les terribles Prêcheurs de la folie, des moines démoniaques extrêmement puissants, capables de contrôler les pouvoirs infernaux.

Les mort-vivants
Classe particulière parmi les objets animés, on les en différencie tout de même car ils gardent leurs instincts primordiaux, c'est à dire la haine des vivants. Ils regroupent les squelettes, zombies, goules, ...
Heureusement, tous ne sont pas là pour nuire aux vivants. Certains, comme les fantômes, n'ont aucun pouvoir sur leur environnement et se trouvaient déjà là bien avant que les brèches n'apparaissent. Ils errent de par le monde afin d'expurger le mal qu'ils ont commis de leur vivant. Certains pourraient croiser la route de nos héros et leurs enseigner leur secret.

Les démons
Faune des enfers, il en existe de nombreuses espèces, allant des simples démons mineurs jusqu'aux Généraux Infernaux. Rarement rencontrés dans notre dimension du fait de l'instabilité des brèches inter dimensionnelles, ils constituent néanmoins des adversaires redoutables pour le héros.

Les anges
Ils sont sur un plan d'égalité avec les démons tout en étant leur total opposés. On ne les rencontre qu'au Paradis. Les plus puissants, les Archanges, ont pour rôle de garder le Purgatoire, le dernier rempart entre l'Enfer et le Paradis.

Par Gregouar - 30/05/2010