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

Alpha-Arts » Blog

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

Holyspirit
0

Une vieille loi obligeait depuis toujours le Bien et le Mal à respecter au moins une règle dans leur éternel conflit. Ils ne pouvaient intervenir directement dans les affaires des entités vivantes, n’agissant que par la suggestion et bataillant subtilement au sein de chaque âme…
Égoïsme, violence, pitié, amour s’affrontaient ainsi sous forme de pensées, de rêves, avec des destins[...]

Une vieille loi obligeait depuis toujours le Bien et le Mal à respecter au moins une règle dans leur éternel conflit. Ils ne pouvaient intervenir directement dans les affaires des entités vivantes, n’agissant que par la suggestion et bataillant subtilement au sein de chaque âme…
Égoïsme, violence, pitié, amour s’affrontaient ainsi sous forme de pensées, de rêves, avec des destins variés.

Pourtant un jour le Mal, qui ne supportait plus l’équilibre dont se contentait le Bien, décida de violer la règle respectée jusqu’alors et franchit le pas en s’incarnant directement dans les êtres vivants les plus vulnérables à ses pulsions, et, curieusement, dans certains objets.
Désormais le Mal pouvait régner exclusivement sur chaque être dont il prenait possession et sur certains objets anodins devenus démoniaques.

Ayant pressenti cette trahison, le Bien ne fut pas surpris. Renonçant à violer la loi comme le Mal l’avait fait et se refusant à sacrifier des âmes bonnes et généreuses, il utilisa quelques âmes damnées et tourmentées qui souhaitaient profondément se racheter auprès de lui… ou du moins, qui ne voulaient par brûler pour l'éternité en Enfer...
S’estimant déjà perdues, elles seules auraient l’inconscience de s’attaquer a l’immonde légion qui déferlait sur le Monde.

Incarnant le Croisé, le Pistolero, la Courtisane ou encore l'Inquisiteur, vous êtes l'une de ces âmes damnées !

Par Gregouar - 30/05/2010

Afin d'améliorer l'expérience de jeu, l'interface subit toute une série de petites modifications pour la démo.

J'ai mis en place une barre de chargement lors des changements de zones.

Les threads sont mes amis, doudi, douda... oulha, je m'emporte encore.




Mise en place d'un module de création de cadres dynamiques, pour le fond des[...]

Afin d'améliorer l'expérience de jeu, l'interface subit toute une série de petites modifications pour la démo.

J'ai mis en place une barre de chargement lors des changements de zones.

Les threads sont mes amis, doudi, douda... oulha, je m'emporte encore.


http://www.holyspirit.fr/Autres/blog_interface/screenshot0.png


Mise en place d'un module de création de cadres dynamiques, pour le fond des textes.

Ainsi, à partir cet image :
http://www.holyspirit.fr/Autres/blog_interface/Border.png


Je peux créer :
http://www.holyspirit.fr/Autres/blog_interface/screenshot3.png

Si ça vous intéresse de savoir comment ça marche, je peux éventuellement en faire un Tips. Quoique, cela me semble assez élémentaire.


J'ai donc profité de ce système pour améliorer la présentation de la description des objets :
http://www.holyspirit.fr/Autres/blog_interface/screenshot2.png


J'ai amélioré la gestion en générale des boutons, afin de leur donner un état normal, hover (curseur pointé dessus) et clicked. Tout ça est donc maintenant beaucoup plus pratique à utiliser (l'action ne se fait que quand on relache le bouton, si on reste cliqué puis qu'on passe le curseur dessus, l'action ne se fait pas, etc).

http://www.holyspirit.fr/Autres/blog_interface/screenshot8.png

Et tant que j'y étais, on peut maintenant dépenser ses points de miracle en appuyant simplement sur le petit plus en haut à gauche (avec gestion de l'opacité, afin qu'il ne détecte le clic que seulement sur le triangle !).

http://www.holyspirit.fr/Autres/blog_interface/screenshot5.png
http://www.holyspirit.fr/Autres/blog_interface/screenshot6.png

J'ai aussi laissé tomber les plus à gauche et à droite pour quand nous avons des points de miracles ou de caractéristiques à dépenser. Maintenant, c'est le bouton qui devient rouge. La technique est aussi utilisée pour quand on reçoit une nouvelle quête ou pour quand on a un nouveau document à lire.

http://www.holyspirit.fr/Autres/blog_interface/screenshot7.png

L'interface de dialogue a elle aussi été revue, afin d'avoir une meilleure lisibilité et un peu plus de classe. En outre, celle-ci s'adapte maintenant à la taille du texte.
Ainsi, nous pouvons nous permettre de grands dialogues en ville, où le joueur ne risque pas d'être importuné et n'a pas besoin d'avoir une vue sur l'action.

http://www.holyspirit.fr/Autres/blog_interface/screenshot4.png

Enfin, j'ai mis en place un système de "dialogue rapide". Les PNJ peuvent maintenant dire des phrases sans démarrer l'interface de dialogue.

http://www.holyspirit.fr/Autres/blog_interface/screenshot9.png

Ce système sera d'une part utilisé pour les messages d'erreurs, comme par exemple, si l'inventaire est remplis, le héros dira : Mon sac est plein.
Il sera aussi utilisé pour donner un peu plus de vie à l'environnement. Par exemple, un PNJ pourrait appeler le héros : Hey mon gars ! Viens ici !
Ou bien encore pour faire des commentaires sur les lieux.

C'est tout pour le moment. Si vous avez d'autres idées pour rendre l'interface plus agréable, je vous écoute, le système de commentaires est là pour ça.

_____________________________

Si vous aimez Holyspirit et voulez nous soutenir, nous rappelons que nous sommes ouverts aux donations.

Par Gregouar - 11/01/2011

Salut à tous !

Ce weekend, nous avons travaillé à améliorer les catacombes. Celles-ci étaient un peu vide et on commençait vite à en avoir marre de les explorer.
Nous avons donc décidé d'ajouter quelques décors afin de casser la monotonie de lieux.
Ainsi, j'ai mis en place des décals de dalles anciennes afin de pouvoir faire comme s'il restait encore un peu de sol[...]

Salut à tous !

Ce weekend, nous avons travaillé à améliorer les catacombes. Celles-ci étaient un peu vide et on commençait vite à en avoir marre de les explorer.
Nous avons donc décidé d'ajouter quelques décors afin de casser la monotonie de lieux.
Ainsi, j'ai mis en place des décals de dalles anciennes afin de pouvoir faire comme s'il restait encore un peu de sol d'époque à certains endroits des catacombes.
J'ai aussi meublé certaines salles pour en faire des lieux de culte.

http://img641.imageshack.us/img641/1593/catacombsdecals.png
Les décals de dalles (merci CG-textures).


Ceci m'a permis en outre d'expérimenter un peu plus ma technique de décals dont je vous avais déjà parlé. Elle consiste à mettre une texture relativement grande de sol qui se répète et venir avec d'autres décors de sol en jouant avec la transparence. La superposition des décals entre elles, en plus de la possibilité de les retourner en x, me permet d'obtenir un sol où l'on ne remarque plus (ou presque) de répétition.

http://img651.imageshack.us/img651/9074/screenshot5hx.png

http://img829.imageshack.us/img829/1844/catacombsmiscs.png
Quelques décors en plus.


http://img6.imageshack.us/img6/7917/screenshot8h.png

J'en ait profité pour améliorer encore un peu l'Oculus.

http://img64.imageshack.us/img64/4072/screenshot10vu.png

Bravach a travaillé sur d'autres choses que nous gardons pour le moment secrètes.

Et je termine cet article avec une citation provenant de Histoire de l’abbaye de Saint Clodomir.

Frère Vlanker, moine honoraire de l’abbaye
Comme chacun le sait l’abbaye de Saint Clodomir est considérée comme l’un des phares de la foi impériale et des héritiers de l’Ancien peuple.
[...]
Bâtie sur une nécropole souterraine oubliée à l’époque de la domination barbare, l’abbaye fut présentée à leurs yeux ignares comme un vulgaire saloir à jambons. Le culte ne pouvant se dérouler dans le bâtiment lui-même sous peine d’éveiller la méfiance des envahisseurs, les fidèles courageux de l’Ancien peuple s’installèrent dans les catacombes et les agrandirent peu à peu.

Par Gregouar - 27/03/2011

Dans ce billet de pure teasing, je vais vous présenter l'abbaye de Saint Clodomir.
Ce billet peut vous révéler des dialogues et autres éléments du jeu.


Image in-game de l'abbaye

Rognorak, ex-maitre forgeron de l'armée impériale :
Tu n'es pas très observateur mon garçon ! On est dans un monastère voyons ! Ou une abbaye, j'ai jamais compris la[...]

Dans ce billet de pure teasing, je vais vous présenter l'abbaye de Saint Clodomir.

Ce billet peut vous révéler des dialogues et autres éléments du jeu.


http://img51.imageshack.us/img51/1589/screenshot1bm.png
Image in-game de l'abbaye

Rognorak, ex-maitre forgeron de l'armée impériale
Tu n'es pas très observateur mon garçon ! On est dans un monastère voyons ! Ou une abbaye, j'ai jamais compris la différence... Question robes on a ce qui faut mais niveau femelles c'est un peu tristounet !


http://img217.imageshack.us/img217/8620/screenshot2cj.png
Image in-game de l'intérieur de l'abbaye

L'abbaye de Saint Clodomir est le lieux de départ des héros, juste après leur rapide passage par les Limbes.
C'est le dernier lieu saint de tout Ruhigland, permettant aux forces du Bien de lancer leurs chiens en ce bas-monde.
C'est aussi un lieu de refuge pour les derniers êtres censés qu'il reste dans ces contrées; ainsi les héros peuvent y rencontrer fermiers, soldats déserteurs du Saint Empire ou encore marchands itinérants.
C'est donc un endroit calme où le joueur peut faire ses achats, se reposer et discuter tranquillement avec les personnages du jeu.

Alcuin, Frère second de l'abbaye
L'abbaye de Saint Clodomir est un vénérable établissement célèbre dans tout Ruhigland. Comme tu peux le constater il sert aujourd'hui de refuge aux voisins réchappés de l'horreur qui nous est tombée dessus...


http://holyspirit.fr/img/Contenu/Rendus/HS_Rendu_14.jpg
Quelques rendus de la modélisation pour mieux en apprécier les détails

Ancien document relatant l'histoire de l'abbaye, par Frère Vlanker, moine honoraire de l'abbaye

Comme chacun le sait l'abbaye de Saint Clodomir est considérée comme l'un des phares de la foi impériale et des héritiers de l'Ancien peuple. Fondée trois siècles après la mort du saint dont elle porte le nom, non loin du lieu où Clodomir fut dévoré par des porcs, elle renferme bien des trésors ignorés du commun des mortels.

Bâtie sur une nécropole souterraine oubliée à l'époque de la domination barbare, l'abbaye fut présentée à leurs yeux ignares comme un vulgaire saloir à jambons. Le culte ne pouvant se dérouler dans le bâtiment lui-même sous peine d'éveiller la méfiance des envahisseurs, les fidèles courageux de l'Ancien peuple s'installèrent dans les catacombes et les agrandirent peu à peu.

Le réseau souterrain devint ainsi un immense labyrinthe sous l'action des fidèles qui se retrouvaient de plus en plus nombreux pour prier. Le fait de creuser devint un acte de foi, et la ferveur était telle sous l'oppression barbare que les catacombes s'étendirent dans des proportions colossales (au point qu'il est vivement déconseillé de s'y aventurer sans un plan).

Une fois la période de domination barbare achevée, les catacombes furent évacuées par les fidèles et recueillirent les restes des innombrables martyrs de l'occupant. Quatre d'entre eux furent canonisés du fait de l'exemplarité de leur sacrifice : l'aimable Frénégonde, Joachim le berger, la pure Galswinthe et bien sûr Clodomir.

On peut noter aussi la présence du tombeau de Teudéric, l'un des anciens rois de notre peuple. Interdit de sépulture dans la crypte des rois de la capitale, tant son règne fut jugé pathétique, il a été recueilli à Saint Clodomir par respect pour la lignée souveraine. Les plus au fait de notre histoire savent que Teudéric avait en effet régné sous l'influence de conseillers plus fantaisistes et malhonnêtes les uns que les autres (on se rappelle encore de Boris le magicien inverti, Gunther le maître d'armes paralytique et d'Ingmar le ministre lubrique qui obtient les faveurs successives de l'épouse de Teudéric puis de sa fille la princesse Theodora).


http://aurelienvlt.free.fr/galerie/images/Abbaye.png
Rendu général de l'abbaye

Ces catacombes, dont parle ce document historique, sont maintenant infestées de démons et autres monstruosités.
L'abbé Hademar, père spirituel de cette abbaye, confie la tâche à nos braves héros de purifier ces catacombes du Mal qui y règne et qui menace la sureté même de l'abbaye...

Abbé Hademar, père spirituel de l'abbaye
Tu es dans l'abbaye de Saint Clodomir. Par les temps qui courent c'est l'un des rares lieux de la contrée où on trouve un peu de calme. Et encore... Même ici il se trame des diableries !



Par Gregouar - 10/07/2011

Alpha Arts
1

Comme promis, voici la suite de mon article sur mon moteur d'éclairage 2.5D (si vous n'avez pas lu la partie une, c'est par ici).

On va voir aujourd'hui pour développer un zbuffer permettant de définir l'ordre d'affichage des pixels de nos sprites 3D afin de pouvoir les afficher dans l'ordre qu'on veut et de les faire s'intersecter en 3D.



On va[...]

Comme promis, voici la suite de mon article sur mon moteur d'éclairage 2.5D (si vous n'avez pas lu la partie une, c'est par ici).

On va voir aujourd'hui pour développer un zbuffer permettant de définir l'ordre d'affichage des pixels de nos sprites 3D afin de pouvoir les afficher dans l'ordre qu'on veut et de les faire s'intersecter en 3D.

http://www.holyspirit.fr/Autres/pixel_lighting/demo_zbuffer_2.png

On va utiliser la heightmap du sprite 3D pour connaitre la hauteur du pixel. Un pixel plus haut sera forcément plus proche de la caméra qu'un plus bas. Si vous ne me croyez pas, regardez ce shéma qui devrait vous en convaincre :

http://www.holyspirit.fr/Autres/pixel_lighting/shema2.jpg
P1 et P2 représentent le même pixel à l'écran, mais P2 est plus haut et donc plus proche de la caméra. Dès lors c'est P2 qui sera affiché et non P1.

Il nous suffira donc d'afficher le pixel uniquement si sa heightmap est plus clair que celui précédent. Pour ce faire, on travaillera avec deux écrans de rendus, l'un principal que l'utilisateur verra et l'autre permettant de stocker la hauteur des pixels dessinés à l'écran pour le moment, ainsi que leur niveau d'opacité (j'y reviendrai plus loin, c'est pour la gestion du blending et de l’anticrénelage).

Pour mettre tout ça en place, j'ai codé deux shaders, un qui est notre normal shader du précédent article auquel je rajoute une gestion de la profondeur. En gros je n'affiche le pixel que si sa heightmap est plus clair que l'actuel affiché à l'écran. L'autre shader permet de mettre à jour la heighmap, je dessine donc la heightmap de mon sprite avec ce shader sur l'écran virtuel contenant la heightmap actuelle de l'écran.

J'utilise uniquement la composante bleue des pixels pour stocker la hauteur de ceux-ci.


Voici le code de mon shader de heightmap :

uniform sampler2D diffuse;
uniform sampler2D heightmap;
uniform sampler2D heightmap_screen;
uniform vec2 screen_ratio;
uniform float height_factor;
uniform float z_pos;

void main()
{			
	gl_FragColor =  gl_Color * texture2D(heightmap, gl_TexCoord[0].xy);
	gl_FragColor[3] = 1.0;
	
	if( texture2D(heightmap, gl_TexCoord[0].xy)[3] > 0.2)
		gl_FragColor[2] /= texture2D(heightmap, gl_TexCoord[0].xy)[3];
	
	gl_FragColor[2] *=  height_factor/500.0;
	
	gl_FragColor[2] += z_pos/500.0;
	
	gl_FragColor[0] = texture2D(diffuse, gl_TexCoord[0].xy)[3];
	
	vec4 screen_color = texture2D(heightmap_screen, gl_FragCoord.xy*screen_ratio);
	
	if(gl_FragColor[2] <= screen_color[2])
	{
		gl_FragColor[2] = screen_color[2];
		gl_FragColor[0] = screen_color[0]
	}
}



Les trois textures passées en paramètre sont :
  • Diffuse : la color-map du sprite, permettant de récupérer le niveau d'opacité du pixel pour la gestion du blending.
  • Heightmap : la heightmap du sprite, permettant donc de récupérer la hauteur des pixels du sprite.
  • Heightmap-screen : la hauteur des pixels affichés à l'écran actuellement.


Je passe en outre comme paramètre screen_ratio, permettant d'inverser la normalisation de la position de mes pixels à l'écran afin de récupérer la couleur du pixel correspondant à l'écran via un : gl_FragCoord.xy*screen_ratio.

Enfin, les deux derniers paramètres me permettent de définir la position en z du sprite 3D (décalant vers le bleu plus clair la couleur des pixels de la heightmap) et son facteur de hauteur. Comme dans l'article précédent.

Au niveau du code, je mets à jour la composante bleu et rouge de l'écran uniquement si le nouveau pixel est plus bleu et donc plus haut. La composante rouge me permet de stocker l'opacité du pixel afin de gérer le blending par après dans le shader qui affiche le sprite à l'écran.

Remarquez le : "if( texture2D(heightmap, gl_TexCoord[0].xy)[3] > 0.2)
gl_FragColor[2] /= texture2D(heightmap, gl_TexCoord[0].xy)[3];"
C'est juste une petite correction du au fait que les logiciels 3D, quand ils font un rendu avec anticrénelage, affichent des pixels plus sombres en plus de plus transparents sur les côtés. Dès lors on divise par la transparence du pixel pour ré-obtenir la couleur d'origine et donc la hauteur d'origine. Mais on ne fait cela que pour des pixels avec un minimum de transparence (ici 1/5).


Attaquons nous justement à ce shader-ci maintenant !

Premier changement, pour définir la hauteur du pixel :
v.z += texture2D(heightmap, gl_TexCoord[0].xy)[2] * height_factor;

est devenu
if( texture2D(heightmap, gl_TexCoord[0].xy)[3] > 0.2)
	v.z += texture2D(heightmap, gl_TexCoord[0].xy)[2] * height_factor  / texture2D(heightmap, gl_TexCoord[0].xy)[3];
else
	v.z += texture2D(heightmap, gl_TexCoord[0].xy)[2] * height_factor;


C'est exactement comme on a fait juste au dessus.

Ensuite, si jamais le pixel du sprite est en dessous du pixel déjà affiché, on récupère l'opacité du pixel déjà affiché :
if(v.z/500.0 < texture2D(heightmap_screen, vec2(gl_FragCoord.xy*screen_ratio)).b)
	alpha_old = texture2D(heightmap_screen, vec2(gl_FragCoord.xy*screen_ratio)).r;


Avant de faire quoi que ce soit, on ajoute juste une petite condition : si l'opacité du pixel précédent est de 1, ça sert à rien d'afficher quoi que ce soit et des faire des calculs, donc on retourne un pixel transparent.

Ensuite on a tous nos calcul pour connaitre l'illumination et la couleur du pixel qu'on stocke dans un vec4 color.

Sauf que maintenant, avant de la retourner dans gl_FragColor, on ajoute une petite étape :
if(alpha_old != 0.0)
{
	color *= a * min(1.0,max(0.0,1.0 - alpha_old));
	color += texture2D(screen, vec2(gl_FragCoord*screen_ratio)) * alpha_old;
	color /= alpha_old + a * min(1.0,max(0.0,1.0 - alpha_old));
	color.a = alpha_old + a * min(1.0,max(0.0,1.0 - alpha_old));
}
else
	color.a = gl_Color.a * texture2D(diffuse, gl_TexCoord[0].xy).a;


Si l'opacité du pixel précédent est plus grande que 0 et s'il est au dessus (s'il était en dessous on aurait considéré qu'il avait une opacité de 0), alors on doit mixer les deux pixels, sinon on l'affiche avec sa transparence normale.
Pour mixer les pixels, on utilise la formule de mixage habituelle, celle de l'algorithme du peintre (plus d'infos ici) :
color_final = (color_a * alpha_a + color_b * alpha_b / (1 - alpha_a))/(alpha_a + alpha_b / (1 - alpha_a))

Où a est le pixel du dessus et b le pixel du dessous.

On sait que l'écran actuelle (écran des heightmap passé en paramètre sous le nom screen) contient déjà color_a et color contient color_b , on doit donc juste multiplié color par alpha_b * (1-alpha_a) et lui ajouter le pixel actuel de l'écran * alpha_old. On divise après le tout par l'alpha total afin d'obtenir le pixel final.

Et voilà ! On a notre z-buffer !

Revoici un aperçu de la bête (cliquez pour agrandir) :

http://www.holyspirit.fr/Autres/pixel_lighting/demo_zbuffer_2.png

Où on affiche d'abord l'arbre, puis une abbaye, puis l'herbe, puis l'autre abbaye. Chacune des abbaye est, bien évidemment, un seul sprite 3D.
Vous pouvez aussi remarquer les ombres qui feront l'objet d'un prochain billet.

C'est toujours la même adresse pour tester : ShadersTest_demo.rar

Par Gregouar - 08/04/2012