Celà fait longtemps que je veux réaliser un jeu du royaume, c'est à dire un jeu où l'on gère un domaine quelconque (oui, c'est le nom originel de ce genre de jeux). Eh bon, après environ 25 ans, me voilà à l'ouvrage.

samedi 25 février 2012

Pas de moldus chez Harry Potter

Dernièrement, jetant un oeil aux statistiques du blog, je vois que certains visiteurs viennent d'un site français dédié à Harry Potter.

Curieux de savoir ce qu'on y dit de Ratsodie, je suis le lien et tombe sur un site pas très clair, où même la FAQ nécessite une inscription (un autre lien m'apprend qu'il s'agit d'une sorte de jeu en ligne).

La page d'où viennent les visiteurs étant cachée derrière l'inscription, je m'inscris. Jusqu'ici, rien que de très normal, je pense ?

Eh ben non. Je dois être un moldu : Non seulement la page est cachée à un "niveau d'administration supérieur", mais le temps de sortir faire une course et je m'aperçois que j'ai reçu un courriel m'indiquant d'un message très sec que mon compte a été annulé, et que si je veux savoir pourquoi, eh ben je n'ai qu'à voir ça avec un administrateur.

...

Heu, les mecs, faites gaffe quand-même : C'est exactement le genre d'attitude qui pousse nombre de webmasters à demander des filtres de liens entrants pour les scripts et services de blogs.
Ça serait dommage, mais quand on parle de quelqu'un sur un site internet, on évite de jeter la personne en question comme un malpropre lorsqu'elle vient voir.

jeudi 23 février 2012

Différenciation des forêts selon le terrain

L'intéret d'avoir des éléments qui sont des "terrains de base" et d'autres qui ne le sont pas (fleuves et forêts, pour le moment) se trouve dans la possibilité de s'en servir pour différencier les élements "non de base" selon le terrain.

Par exemple, celà permet de placer des forêts différentes sous les tropiques et dans l'arctique, sans avoir à le préciser dans la carte des forêts : On se contente d'indiquer la présence d'une forêt, et Ratsodie affiche la forêt correspondante au terrain.

Trois types de forêt différents

Pour se faire, j'ai créé deux autres lots d'images "morceaux de forêt" : Un pour les pays chauds, un autre pour les pays froids. Et on garde la forêt normale pour les climats tempérés.

Oui, je sais que les sapins ont une gueule pas possible... Ce sont des sapins russes, radioactifs (c'est vrai que j'en ai rarement vu d'aussi moches, mais bon, ça ira pour le moment).

Ensuite, j'ajoute dans le code, partie "mod", ce qui suit :

var ter_foret_image = new Array();
ter_foret_image[11]="";
ter_foret_image[12]="taiga";
ter_foret_image[13]="taiga";
ter_foret_image[14]="oceanique";
ter_foret_image[15]="oceanique";
ter_foret_image[16]="oceanique";
ter_foret_image[17]="tropical";
ter_foret_image[18]="tropical";
ter_foret_image[1]="";
ter_foret_image[2]="";
ter_foret_image[3]="";
ter_foret_image[4]="";
ter_foret_image[5]="";


On place ici, entre les guillemets, le nom de la forêt utilisée pour chaque type de terrain. Vous remarquerez que certains terrains n'ont pas de forêt : La mer ou la glace, par exemple.


Je nomme tous mes fichiers de forêt suivant ce principe :

foret_nomdelaforet_1.svg

"foret_" indique le type d'image, ici une forêt.

"nomdelaforet" est à remplacer par le... nom de la forêt. Ici, taiga, oceanique ou tropical.

"_1" est le numéro de chaque partie de forêt, et va donc de "_1" à "_9".

Encore une fois, pour le moment, l'image doit être une "svg" (vectorielle). J'arrangerais le code plus tard pour accepter n'importe quel type d'image.


Pour l'exemple, voici la liste des images de forêt :

** Bon, ben, impossible de télécharger l'image. Le bidule "flash" tourne en boucle et puis rien. Encore un truc au point, je vois **


Quoi qu'il en soit, dans la boucle d'affichage des forêts, la valeur "ncase", qui contient le nom de l'image, est modifiée afin de pouvoir contenir un nom d'image existant :

ncase = mod+"/terrain/"+"foret_"+ter_foret_image[table[i][j]]+"_"+k+".svg";

Le principe est simple : Quand le jeu voit qu'il doit afficher une foret, il prend le numéro du type de terrain de base de la case en question, cherche quel nom de forêt y correspond, et affiche les neuf images de forêt correspondant.

samedi 11 février 2012

Multiples terrains de base

Woah, allez...

Je sais bien que ce n'est pas primordial, et que j'avais dit vouloir me limiter, pour commencer, à ce qui est réellement nécessaire au jeu pour terminer, mais avouez qu'un jeu du royaume avec un seul terrain, c'est triste.
Alors voilà :



Les "nouveaux terrains

Comme vous pouvez le constater, il y a sur terre maintenant huit terrains différents. Les arbres de la forêt sont suffisamment espacés pour permettre au terrain d'être bien vu au travers.

Maintenant, le principal problème, c'est qu'avec le code actuel de Ratsodie il n'est pas possible pour un moddeur de mettre plus de terrains de base que prévu directement dans le code, parce que leur nombre est limité par la quantité de "if else" disponible.

J'ai réfléchi au problème, et en ai déduit que placer les terrains dans un tableau permettrait de résoudre le problème : Un tableau se remplit à volonté, et le code n'y prend que ce qui l'intéresse.

Première chose, lister les terrains dont j'ai (moddeur) besoin :

// Liste des terrains de base
var ter_image = new Array();
ter_image[11]="glace";
ter_image[12]="toundra";
ter_image[13]="taiga";
ter_image[14]="lande";
ter_image[15]="oceanique";
ter_image[16]="steppe";
ter_image[17]="desert";
ter_image[18]="tropical";
ter_image[1]="cote";
ter_image[2]="mer";
ter_image[3]="ocean";
ter_image[4]="lac";
ter_image[5]="lave";

Les valeurs entre crochets désignent le numéro d'identification que je veux donner à chaque terrain. Ce sont ces numéros que j'utilise dans le tableau de cartes :

// Carte du monde. Un terrain de base.
   table1 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table2 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table3 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table4 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table5 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table6 = new Array(11,11,11,12,04,04,04,14,14,15,15,16,16,17,17,18,18);
   table7 = new Array(11,11,11,04,04,13,13,14,14,15,15,16,16,17,17,18,18);
   table8 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
   table9 = new Array(11,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
table10 = new Array(11,01,01,12,12,13,13,14,14,15,15,16,16,17,17,18,18);
table11 = new Array(01,01,11,12,12,13,13,14,14,15,15,16,16,05,05,05,18);
table12 = new Array(11,11,11,12,12,13,01,14,14,15,15,16,16,17,05,05,18);
table13 = new Array(11,01,01,01,01,01,01,01,01,01,15,16,16,17,17,18,18);
table14 = new Array(01,01,02,02,02,02,02,02,02,02,01,01,16,17,17,18,18);
table15 = new Array(01,02,02,02,02,03,03,03,03,02,02,02,01,01,01,18,18);

Vous remarquerez que j'ai enlevé les guillemets qui entouraient les valeurs : Il m'est apparu que, puisque ce seront toujours des nombres, ils ne servaient à rien.

Puisque je place les terrains dans un tableau, je peux en faire autant de la variable "mer". En effet, elle était définie jusque là dans la série de "if" définissant également l'image de terrain à afficher.
Comme çà, plus besoin de ces "if" du tout.

Je vous rappelle que, pour le moment, une case ayant plus de 0 n'affiche ni les fleuves, ni les forêts sur cette case, même si leurs tables respectives disent le contraire.

// Liste des terrains étant considérés comme une "mer". 1 est de l'eau classique, 2 de la lave. D'autres valeurs peuvent indiquer des types "aquatiques" différents.
var ter_mer = new Array();
ter_mer[1]=1;
ter_mer[2]=1;
ter_mer[3]=1;
ter_mer[4]=1;
ter_mer[5]=2;

Pendant que j'y étais, j'ai également enlevé les guillemets autour des valeurs de la carte des forêts.  C'est toujours ça de gagné.

// Carte des forêts. 1=Oui, 0=Non. La variable "mer" a priorité sur ce tableau.
foret1 = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
foret2 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret3 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret4 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret5 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret6 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret7 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);
foret8 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret9 = new Array(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret10 = new Array(1,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret11 = new Array(0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0);
foret12 = new Array(0,0,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0);
foret13 = new Array(0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0);
foret14 = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
foret15 = new Array(0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0);
Voilà pour la partie "mod" du script.

Ensuite, pour la partie "code", ce sera plus simple.

D'abord,

        var mer=0;

disparait. Je n'en ai plus besoin, après tout.

Ensuite, les lignes

  if (table[i][j]=="18") { ncase = "nom_de_mon_terrain.svg"; }

disparaissent également, puisque le jeu sait déjà à quelle image correspond une valeur de case donnée.
Elles sont remplacées par la ligne suivante :

ncase = "terrain_"+ter_image[table[i][j]]+"_1.svg";    

Cette ligne reconstruit le nom du fichier d'image voulu et le place dans la variable "ncase".

Enfin, le "if" d'affichage des fleuves prend en compte maintenant "ter_mer" et non plus "mer", évidemment. Même chose pour la forêt :

        if (fleuve.indexOf(fleuve_element) != -1 && !ter_mer[table[i][j]])
        if (foret[i][j]==1 && !ter_mer[table[i][j]])


Le résultat :

- Je peux maintenant faire une carte avec autant de terrains de base que je le veux.
- Le jeu me semble plus rapide, probablement gràce à la suppression de tous ces "if else".


Ah oui : Pour que celà marche, il faut suivre une nomenclature précise pour les images. Exemple :

terrain_nomdemonterrain_1.svg

Pour un désert, on mettra "terrain_desert_1.svg"

"Terrain" pour signifier que c'est un terrain (de base). Pour le moment, il n'a pas d'autre intérêt que de mieux répérer les images de terrain dans le répertoire.

La valeur à la fin sera utilisée pour autoriser les graphismes multiples pour un terrain (je verrais ça plus tard).

Pour le "svg", je verrais également plus tard si l'extension de l'image doit être indiquée dans le mod ou directement cherchée par le script. Je ne sais pas encore.








dimanche 5 février 2012

Faire accepter les mods par le jeu

Vu le travail de cette semaine (un seul jour de congé : Aujourd'hui dimanche, et encore pas mal de boulot "à la maison" - et noté, qui plus est), j'ai fait très court.

Un de mes buts principaux est de rendre Ratsodie parfaitement modable. Vu que javascript n'a jamais été prévu pour lire ou écrire des fichiers (il y a bien les activeX, mais sous Linux, c'est un coup à invoquer un démon sous ma chaise).

Le principal problème que je rencontre est que je voudrais que le script en cours lise des données du genre "carte=oui" dans le fichier ciblé, et mette ça dans une variable pour que la suite du script l'utilise (un autre problème est d'obliger le script js à attendre que la lecture du fichier externe soit terminée, et là c'est comme demander la lune apparemment).

Je suis en train de jeter un oeil à AJAX/JSON. Après tout, si JS peut demander une action à un serveur, il me semble logique qu'il puisse se contenter de demander un fichier texte déjà créé, non ?

Grr.

Enfin, quoiqu'il en soit, La "modabilité" de Ratsodie commence par le plus simple : Il est désormais possible de charger des graphismes différents selon le mod.


D'abord, j'ai commencé par concentrer tout ce qui concerne précisément les données du mod au début du script, avant le moindre calcul : Cartes des terrains, des forêts, liste des fleuves, taille nord-sud et est-ouest de la carte, et taille désirée pour l'affichage de la carte.

Ce sont toutes ces données que je cherche à mettre dans un fichier à part, que Ratsodie chargerait au début du jeu.


Ensuite, une variable indiquant le nom du mod désiré :

var mod="nomdumod";

(tiens, Blogger ne met plus le code de mise en forme autour du texte, mais directement le résultat. C'est bien plus pratique, faut admettre).

nomdumod correspond au nom du répertoire où se trouve le mod. Le jeu "standard" livré avec Ratsodie s'appelant simplement "Ratsodie", le répertoire où il se trouve s'appelle également "ratsodie".


Ensuite, le code de Ratsodie proprement dit.

Pour forcer Ratsodie à aller chercher les images dans le bon répertoire, les lignes indiquant le src (source) ont été modifiées comme suit :

case1[i3+"*"+j3].src=mod+"/terrain/"+ncase;

En clair, devant "ncase" (qui contient le nom de l'image à afficher), je rajoute la variable "mod", qui contient le répertoire du mod en question, et le texte /terrain/, qui ajoute entre les deux le nom du sous-répertoire du même nom.

Je préfère, en effet, ranger les différents graphismes dans des sous-répertoires distincts, afin d'éviter d'avoir au final des milliers d'images différentes au même endroit.